From 144843a2a3456d63e4ec888a706095975a1c3ab8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20JACQUES?= Date: Fri, 1 Mar 2019 15:18:51 +0100 Subject: [PATCH] Add read-only support to protoc-gen-swagger output (#882) Can be set via: * explicit swagger option on the field * Implicit comment "Output only." on the field --- protoc-gen-swagger/genswagger/template.go | 8 + .../genswagger/template_test.go | 135 +++++++++ protoc-gen-swagger/genswagger/types.go | 1 + protoc-gen-swagger/options/openapiv2.pb.go | 269 +++++++++--------- protoc-gen-swagger/options/openapiv2.proto | 3 +- 5 files changed, 284 insertions(+), 132 deletions(-) diff --git a/protoc-gen-swagger/genswagger/template.go b/protoc-gen-swagger/genswagger/template.go index 74f53394cae..484ca971643 100644 --- a/protoc-gen-swagger/genswagger/template.go +++ b/protoc-gen-swagger/genswagger/template.go @@ -275,6 +275,7 @@ func renderMessagesAsDefinition(messages messageMap, d swaggerDefinitionsObject, // Warning: Make sure not to overwrite any fields already set on the schema type. schema.ExternalDocs = protoSchema.ExternalDocs + schema.ReadOnly = protoSchema.ReadOnly schema.MultipleOf = protoSchema.MultipleOf schema.Maximum = protoSchema.Maximum schema.ExclusiveMaximum = protoSchema.ExclusiveMaximum @@ -1223,6 +1224,12 @@ func updateSwaggerDataFromComments(swaggerObject interface{}, comment string, is // Figure out which properties to update. summaryValue := infoObjectValue.FieldByName("Summary") descriptionValue := infoObjectValue.FieldByName("Description") + readOnlyValue := infoObjectValue.FieldByName("ReadOnly") + + if readOnlyValue.Kind() == reflect.Bool && readOnlyValue.CanSet() && strings.Contains(comment, "Output only.") { + readOnlyValue.Set(reflect.ValueOf(true)) + } + usingTitle := false if !summaryValue.CanSet() { summaryValue = infoObjectValue.FieldByName("Title") @@ -1539,6 +1546,7 @@ func protoJSONSchemaToSwaggerSchemaCore(j *swagger_options.JSONSchema, reg *desc func updateSwaggerObjectFromJSONSchema(s *swaggerSchemaObject, j *swagger_options.JSONSchema) { s.Title = j.GetTitle() s.Description = j.GetDescription() + s.ReadOnly = j.GetReadOnly() s.MultipleOf = j.GetMultipleOf() s.Maximum = j.GetMaximum() s.ExclusiveMaximum = j.GetExclusiveMaximum() diff --git a/protoc-gen-swagger/genswagger/template_test.go b/protoc-gen-swagger/genswagger/template_test.go index f11246bf1a0..603e2ed8feb 100644 --- a/protoc-gen-swagger/genswagger/template_test.go +++ b/protoc-gen-swagger/genswagger/template_test.go @@ -2,6 +2,7 @@ package genswagger import ( "encoding/json" + "errors" "fmt" "reflect" "testing" @@ -1274,6 +1275,7 @@ func TestRenderMessagesAsDefinition(t *testing.T) { MaxProperties: 33, MinProperties: 22, Required: []string{"req"}, + ReadOnly: true, }, }, }, @@ -1298,6 +1300,7 @@ func TestRenderMessagesAsDefinition(t *testing.T) { MaxProperties: 33, MinProperties: 22, Required: []string{"req"}, + ReadOnly: true, }, }, }, @@ -1498,3 +1501,135 @@ func TestProtoComments(t *testing.T) { } } } + +func TestUpdateSwaggerDataFromComments(t *testing.T) { + + tests := []struct { + descr string + swaggerObject interface{} + comments string + expectedError error + expectedSwaggerObject interface{} + }{ + { + descr: "empty comments", + swaggerObject: nil, + expectedSwaggerObject: nil, + comments: "", + expectedError: nil, + }, + { + descr: "set field to read only", + swaggerObject: &swaggerSchemaObject{}, + expectedSwaggerObject: &swaggerSchemaObject{ + ReadOnly: true, + Description: "... Output only. ...", + }, + comments: "... Output only. ...", + expectedError: nil, + }, + { + descr: "set title", + swaggerObject: &swaggerSchemaObject{}, + expectedSwaggerObject: &swaggerSchemaObject{ + Title: "Comment with no trailing dot", + }, + comments: "Comment with no trailing dot", + expectedError: nil, + }, + { + descr: "set description", + swaggerObject: &swaggerSchemaObject{}, + expectedSwaggerObject: &swaggerSchemaObject{ + Description: "Comment with trailing dot.", + }, + comments: "Comment with trailing dot.", + expectedError: nil, + }, + { + descr: "use info object", + swaggerObject: &swaggerObject{ + Info: swaggerInfoObject{ + }, + }, + expectedSwaggerObject: &swaggerObject{ + Info: swaggerInfoObject{ + Description: "Comment with trailing dot.", + }, + }, + comments: "Comment with trailing dot.", + expectedError: nil, + }, + { + descr: "multi line comment with title", + swaggerObject: &swaggerSchemaObject{}, + expectedSwaggerObject: &swaggerSchemaObject { + Title: "First line", + Description: "Second line", + }, + comments: "First line\n\nSecond line", + expectedError: nil, + }, + { + descr: "multi line comment no title", + swaggerObject: &swaggerSchemaObject{}, + expectedSwaggerObject: &swaggerSchemaObject { + Description: "First line.\n\nSecond line", + }, + comments: "First line.\n\nSecond line", + expectedError: nil, + }, + { + descr: "multi line comment with summary with dot", + swaggerObject: &swaggerOperationObject{}, + expectedSwaggerObject: &swaggerOperationObject { + Summary: "First line.", + Description: "Second line", + }, + comments: "First line.\n\nSecond line", + expectedError: nil, + }, + { + descr: "multi line comment with summary no dot", + swaggerObject: &swaggerOperationObject{}, + expectedSwaggerObject: &swaggerOperationObject { + Summary: "First line", + Description: "Second line", + }, + comments: "First line\n\nSecond line", + expectedError: nil, + }, + { + descr: "multi line comment with summary no dot", + swaggerObject: &schemaCore{}, + expectedSwaggerObject: &schemaCore{}, + comments: "Any comment", + expectedError: errors.New("no description nor summary property"), + }, + } + + for _, test := range tests { + t.Run(test.descr, func(t *testing.T) { + err := updateSwaggerDataFromComments(test.swaggerObject, test.comments, false) + + if test.expectedError == nil { + if err != nil { + t.Errorf("unexpected error '%v'", err) + } + if !reflect.DeepEqual(test.swaggerObject, test.expectedSwaggerObject) { + t.Errorf("swaggerObject was not updated corretly, expected '%+v', got '%+v'", test.expectedSwaggerObject, test.swaggerObject) + } + } else { + if err == nil { + t.Error("expected update error not returned") + } + if !reflect.DeepEqual(test.swaggerObject, test.expectedSwaggerObject) { + t.Errorf("swaggerObject was not updated corretly, expected '%+v', got '%+v'", test.expectedSwaggerObject, test.swaggerObject) + } + if err.Error() != test.expectedError.Error() { + t.Errorf("expected error malformed, expected %q, got %q", test.expectedError.Error(), err.Error()) + } + } + }) + } +} \ No newline at end of file diff --git a/protoc-gen-swagger/genswagger/types.go b/protoc-gen-swagger/genswagger/types.go index d2bed9aa92c..6599937dc69 100644 --- a/protoc-gen-swagger/genswagger/types.go +++ b/protoc-gen-swagger/genswagger/types.go @@ -209,6 +209,7 @@ type swaggerSchemaObject struct { ExternalDocs *swaggerExternalDocumentationObject `json:"externalDocs,omitempty"` + ReadOnly bool `json:"readOnly,omitempty"` MultipleOf float64 `json:"multipleOf,omitempty"` Maximum float64 `json:"maximum,omitempty"` ExclusiveMaximum bool `json:"exclusiveMaximum,omitempty"` diff --git a/protoc-gen-swagger/options/openapiv2.pb.go b/protoc-gen-swagger/options/openapiv2.pb.go index ccdb18fe08b..dd6cfd5d072 100644 --- a/protoc-gen-swagger/options/openapiv2.pb.go +++ b/protoc-gen-swagger/options/openapiv2.pb.go @@ -48,7 +48,7 @@ func (x Swagger_SwaggerScheme) String() string { return proto.EnumName(Swagger_SwaggerScheme_name, int32(x)) } func (Swagger_SwaggerScheme) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_openapiv2_ae281b352364822e, []int{0, 0} + return fileDescriptor_openapiv2_11f010f5fecc79bc, []int{0, 0} } type JSONSchema_JSONSchemaSimpleTypes int32 @@ -89,7 +89,7 @@ func (x JSONSchema_JSONSchemaSimpleTypes) String() string { return proto.EnumName(JSONSchema_JSONSchemaSimpleTypes_name, int32(x)) } func (JSONSchema_JSONSchemaSimpleTypes) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_openapiv2_ae281b352364822e, []int{8, 0} + return fileDescriptor_openapiv2_11f010f5fecc79bc, []int{8, 0} } // Required. The type of the security scheme. Valid values are "basic", @@ -120,7 +120,7 @@ func (x SecurityScheme_Type) String() string { return proto.EnumName(SecurityScheme_Type_name, int32(x)) } func (SecurityScheme_Type) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_openapiv2_ae281b352364822e, []int{11, 0} + return fileDescriptor_openapiv2_11f010f5fecc79bc, []int{11, 0} } // Required. The location of the API key. Valid values are "query" or "header". @@ -147,7 +147,7 @@ func (x SecurityScheme_In) String() string { return proto.EnumName(SecurityScheme_In_name, int32(x)) } func (SecurityScheme_In) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_openapiv2_ae281b352364822e, []int{11, 1} + return fileDescriptor_openapiv2_11f010f5fecc79bc, []int{11, 1} } // Required. The flow used by the OAuth2 security scheme. Valid values are @@ -181,7 +181,7 @@ func (x SecurityScheme_Flow) String() string { return proto.EnumName(SecurityScheme_Flow_name, int32(x)) } func (SecurityScheme_Flow) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_openapiv2_ae281b352364822e, []int{11, 2} + return fileDescriptor_openapiv2_11f010f5fecc79bc, []int{11, 2} } // `Swagger` is a representation of OpenAPI v2 specification's Swagger object. @@ -210,7 +210,7 @@ func (m *Swagger) Reset() { *m = Swagger{} } func (m *Swagger) String() string { return proto.CompactTextString(m) } func (*Swagger) ProtoMessage() {} func (*Swagger) Descriptor() ([]byte, []int) { - return fileDescriptor_openapiv2_ae281b352364822e, []int{0} + return fileDescriptor_openapiv2_11f010f5fecc79bc, []int{0} } func (m *Swagger) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Swagger.Unmarshal(m, b) @@ -333,7 +333,7 @@ func (m *Operation) Reset() { *m = Operation{} } func (m *Operation) String() string { return proto.CompactTextString(m) } func (*Operation) ProtoMessage() {} func (*Operation) Descriptor() ([]byte, []int) { - return fileDescriptor_openapiv2_ae281b352364822e, []int{1} + return fileDescriptor_openapiv2_11f010f5fecc79bc, []int{1} } func (m *Operation) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Operation.Unmarshal(m, b) @@ -450,7 +450,7 @@ func (m *Response) Reset() { *m = Response{} } func (m *Response) String() string { return proto.CompactTextString(m) } func (*Response) ProtoMessage() {} func (*Response) Descriptor() ([]byte, []int) { - return fileDescriptor_openapiv2_ae281b352364822e, []int{2} + return fileDescriptor_openapiv2_11f010f5fecc79bc, []int{2} } func (m *Response) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Response.Unmarshal(m, b) @@ -505,7 +505,7 @@ func (m *Info) Reset() { *m = Info{} } func (m *Info) String() string { return proto.CompactTextString(m) } func (*Info) ProtoMessage() {} func (*Info) Descriptor() ([]byte, []int) { - return fileDescriptor_openapiv2_ae281b352364822e, []int{3} + return fileDescriptor_openapiv2_11f010f5fecc79bc, []int{3} } func (m *Info) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Info.Unmarshal(m, b) @@ -585,7 +585,7 @@ func (m *Contact) Reset() { *m = Contact{} } func (m *Contact) String() string { return proto.CompactTextString(m) } func (*Contact) ProtoMessage() {} func (*Contact) Descriptor() ([]byte, []int) { - return fileDescriptor_openapiv2_ae281b352364822e, []int{4} + return fileDescriptor_openapiv2_11f010f5fecc79bc, []int{4} } func (m *Contact) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Contact.Unmarshal(m, b) @@ -644,7 +644,7 @@ func (m *License) Reset() { *m = License{} } func (m *License) String() string { return proto.CompactTextString(m) } func (*License) ProtoMessage() {} func (*License) Descriptor() ([]byte, []int) { - return fileDescriptor_openapiv2_ae281b352364822e, []int{5} + return fileDescriptor_openapiv2_11f010f5fecc79bc, []int{5} } func (m *License) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_License.Unmarshal(m, b) @@ -696,7 +696,7 @@ func (m *ExternalDocumentation) Reset() { *m = ExternalDocumentation{} } func (m *ExternalDocumentation) String() string { return proto.CompactTextString(m) } func (*ExternalDocumentation) ProtoMessage() {} func (*ExternalDocumentation) Descriptor() ([]byte, []int) { - return fileDescriptor_openapiv2_ae281b352364822e, []int{6} + return fileDescriptor_openapiv2_11f010f5fecc79bc, []int{6} } func (m *ExternalDocumentation) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ExternalDocumentation.Unmarshal(m, b) @@ -750,7 +750,7 @@ func (m *Schema) Reset() { *m = Schema{} } func (m *Schema) String() string { return proto.CompactTextString(m) } func (*Schema) ProtoMessage() {} func (*Schema) Descriptor() ([]byte, []int) { - return fileDescriptor_openapiv2_ae281b352364822e, []int{7} + return fileDescriptor_openapiv2_11f010f5fecc79bc, []int{7} } func (m *Schema) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Schema.Unmarshal(m, b) @@ -827,6 +827,7 @@ type JSONSchema struct { Title string `protobuf:"bytes,5,opt,name=title,proto3" json:"title,omitempty"` Description string `protobuf:"bytes,6,opt,name=description,proto3" json:"description,omitempty"` Default string `protobuf:"bytes,7,opt,name=default,proto3" json:"default,omitempty"` + ReadOnly bool `protobuf:"varint,8,opt,name=read_only,json=readOnly,proto3" json:"read_only,omitempty"` MultipleOf float64 `protobuf:"fixed64,10,opt,name=multiple_of,json=multipleOf,proto3" json:"multiple_of,omitempty"` Maximum float64 `protobuf:"fixed64,11,opt,name=maximum,proto3" json:"maximum,omitempty"` ExclusiveMaximum bool `protobuf:"varint,12,opt,name=exclusive_maximum,json=exclusiveMaximum,proto3" json:"exclusive_maximum,omitempty"` @@ -853,7 +854,7 @@ func (m *JSONSchema) Reset() { *m = JSONSchema{} } func (m *JSONSchema) String() string { return proto.CompactTextString(m) } func (*JSONSchema) ProtoMessage() {} func (*JSONSchema) Descriptor() ([]byte, []int) { - return fileDescriptor_openapiv2_ae281b352364822e, []int{8} + return fileDescriptor_openapiv2_11f010f5fecc79bc, []int{8} } func (m *JSONSchema) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_JSONSchema.Unmarshal(m, b) @@ -901,6 +902,13 @@ func (m *JSONSchema) GetDefault() string { return "" } +func (m *JSONSchema) GetReadOnly() bool { + if m != nil { + return m.ReadOnly + } + return false +} + func (m *JSONSchema) GetMultipleOf() float64 { if m != nil { return m.MultipleOf @@ -1032,7 +1040,7 @@ func (m *Tag) Reset() { *m = Tag{} } func (m *Tag) String() string { return proto.CompactTextString(m) } func (*Tag) ProtoMessage() {} func (*Tag) Descriptor() ([]byte, []int) { - return fileDescriptor_openapiv2_ae281b352364822e, []int{9} + return fileDescriptor_openapiv2_11f010f5fecc79bc, []int{9} } func (m *Tag) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Tag.Unmarshal(m, b) @@ -1086,7 +1094,7 @@ func (m *SecurityDefinitions) Reset() { *m = SecurityDefinitions{} } func (m *SecurityDefinitions) String() string { return proto.CompactTextString(m) } func (*SecurityDefinitions) ProtoMessage() {} func (*SecurityDefinitions) Descriptor() ([]byte, []int) { - return fileDescriptor_openapiv2_ae281b352364822e, []int{10} + return fileDescriptor_openapiv2_11f010f5fecc79bc, []int{10} } func (m *SecurityDefinitions) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SecurityDefinitions.Unmarshal(m, b) @@ -1164,7 +1172,7 @@ func (m *SecurityScheme) Reset() { *m = SecurityScheme{} } func (m *SecurityScheme) String() string { return proto.CompactTextString(m) } func (*SecurityScheme) ProtoMessage() {} func (*SecurityScheme) Descriptor() ([]byte, []int) { - return fileDescriptor_openapiv2_ae281b352364822e, []int{11} + return fileDescriptor_openapiv2_11f010f5fecc79bc, []int{11} } func (m *SecurityScheme) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SecurityScheme.Unmarshal(m, b) @@ -1266,7 +1274,7 @@ func (m *SecurityRequirement) Reset() { *m = SecurityRequirement{} } func (m *SecurityRequirement) String() string { return proto.CompactTextString(m) } func (*SecurityRequirement) ProtoMessage() {} func (*SecurityRequirement) Descriptor() ([]byte, []int) { - return fileDescriptor_openapiv2_ae281b352364822e, []int{12} + return fileDescriptor_openapiv2_11f010f5fecc79bc, []int{12} } func (m *SecurityRequirement) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SecurityRequirement.Unmarshal(m, b) @@ -1311,7 +1319,7 @@ func (m *SecurityRequirement_SecurityRequirementValue) String() string { } func (*SecurityRequirement_SecurityRequirementValue) ProtoMessage() {} func (*SecurityRequirement_SecurityRequirementValue) Descriptor() ([]byte, []int) { - return fileDescriptor_openapiv2_ae281b352364822e, []int{12, 0} + return fileDescriptor_openapiv2_11f010f5fecc79bc, []int{12, 0} } func (m *SecurityRequirement_SecurityRequirementValue) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SecurityRequirement_SecurityRequirementValue.Unmarshal(m, b) @@ -1356,7 +1364,7 @@ func (m *Scopes) Reset() { *m = Scopes{} } func (m *Scopes) String() string { return proto.CompactTextString(m) } func (*Scopes) ProtoMessage() {} func (*Scopes) Descriptor() ([]byte, []int) { - return fileDescriptor_openapiv2_ae281b352364822e, []int{13} + return fileDescriptor_openapiv2_11f010f5fecc79bc, []int{13} } func (m *Scopes) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Scopes.Unmarshal(m, b) @@ -1412,120 +1420,121 @@ func init() { } func init() { - proto.RegisterFile("protoc-gen-swagger/options/openapiv2.proto", fileDescriptor_openapiv2_ae281b352364822e) + proto.RegisterFile("protoc-gen-swagger/options/openapiv2.proto", fileDescriptor_openapiv2_11f010f5fecc79bc) } -var fileDescriptor_openapiv2_ae281b352364822e = []byte{ - // 1773 bytes of a gzipped FileDescriptorProto +var fileDescriptor_openapiv2_11f010f5fecc79bc = []byte{ + // 1777 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x58, 0xdd, 0x73, 0xdb, 0xc6, 0x11, 0x0f, 0x48, 0x90, 0x04, 0x97, 0x22, 0x73, 0x3e, 0xcb, 0x2d, 0xa2, 0xc4, 0xae, 0xc2, 0xa6, 0x53, 0x8d, 0x3d, 0xa6, 0x12, 0xe5, 0xa1, 0x99, 0x4c, 0xa7, 0x1d, 0x4a, 0x62, 0x6c, 0xc0, 0x32, 0xc9, 0x82, 0x54, 0x14, 0x77, 0x26, 0x83, 0x81, 0xc1, 0x23, 0x85, 0x18, 0x38, 0x20, 0xf8, 0x90, - 0xc4, 0xbe, 0xf5, 0xa5, 0xed, 0x73, 0xa7, 0x4f, 0x9d, 0xe9, 0x9f, 0xd1, 0xb7, 0xfe, 0x55, 0xed, - 0x1f, 0xd0, 0xce, 0x7d, 0x80, 0x04, 0x25, 0x26, 0x43, 0xf9, 0xa3, 0x4f, 0xbc, 0xfd, 0xfa, 0xdd, - 0xee, 0xde, 0xee, 0xdd, 0x82, 0xf0, 0x30, 0x8a, 0xc3, 0x34, 0x74, 0x1f, 0xcf, 0x08, 0x7d, 0x9c, - 0x5c, 0x3a, 0xb3, 0x19, 0x89, 0xf7, 0xc3, 0x28, 0xf5, 0x42, 0x9a, 0xec, 0x87, 0x11, 0xa1, 0x4e, - 0xe4, 0x5d, 0x1c, 0x74, 0xb8, 0x12, 0xfe, 0xe5, 0x2c, 0x8e, 0xdc, 0xce, 0xcc, 0x49, 0xc9, 0xa5, - 0x33, 0x17, 0x3c, 0xd7, 0x9e, 0x11, 0x6a, 0x4b, 0xc3, 0x8e, 0x34, 0xdc, 0xf9, 0x60, 0x16, 0x86, - 0x33, 0x9f, 0xec, 0x73, 0x95, 0x97, 0xd9, 0x74, 0xdf, 0xa1, 0x52, 0xbf, 0xfd, 0xdf, 0x2a, 0xd4, - 0x46, 0x42, 0x1d, 0xeb, 0x50, 0x93, 0x96, 0xba, 0xb2, 0xab, 0xec, 0xd5, 0xad, 0x9c, 0xc4, 0x5d, - 0x50, 0x3d, 0x3a, 0x0d, 0xf5, 0xd2, 0xae, 0xb2, 0xd7, 0x38, 0x78, 0xdc, 0xd9, 0x70, 0xe3, 0x8e, - 0x41, 0xa7, 0xa1, 0xc5, 0x4d, 0x31, 0x06, 0xf5, 0x3c, 0x4c, 0x52, 0xbd, 0xcc, 0x91, 0xf9, 0x1a, - 0x7f, 0x08, 0xf5, 0x97, 0x4e, 0x42, 0xec, 0xc8, 0x49, 0xcf, 0x75, 0x95, 0x0b, 0x34, 0xc6, 0x18, - 0x3a, 0xe9, 0x39, 0xfe, 0x06, 0x6a, 0x89, 0x7b, 0x4e, 0x02, 0x92, 0xe8, 0x95, 0xdd, 0xf2, 0x5e, - 0xeb, 0xe0, 0x37, 0x1b, 0x6f, 0x2b, 0x03, 0xca, 0x7f, 0x47, 0x1c, 0xc6, 0xca, 0xe1, 0xf0, 0x0e, - 0x68, 0x6e, 0x48, 0x93, 0x8c, 0x41, 0x57, 0x77, 0xcb, 0x6c, 0xd7, 0x9c, 0x66, 0xb2, 0x28, 0x0e, - 0x27, 0x99, 0x4b, 0x12, 0xbd, 0x26, 0x64, 0x39, 0x8d, 0xbf, 0x85, 0x7a, 0x4c, 0x92, 0x28, 0xa4, - 0x09, 0x49, 0x74, 0xd8, 0x2d, 0xef, 0x35, 0x0e, 0x7e, 0x7b, 0x6b, 0x9f, 0xac, 0x1c, 0xa1, 0x47, - 0xd3, 0x78, 0x6e, 0x2d, 0x11, 0x71, 0x08, 0xdb, 0x09, 0x71, 0xb3, 0xd8, 0x4b, 0xe7, 0xf6, 0x84, - 0x4c, 0x3d, 0xea, 0x71, 0x4b, 0xbd, 0xc1, 0x93, 0xfe, 0xeb, 0xcd, 0x77, 0x92, 0x20, 0xc7, 0x4b, - 0x0c, 0xeb, 0x6e, 0x72, 0x93, 0x89, 0xbf, 0x01, 0x2d, 0x67, 0xeb, 0x5b, 0x3c, 0x9c, 0xdb, 0x6f, - 0x62, 0x91, 0xef, 0x33, 0x2f, 0x26, 0x01, 0xa1, 0xa9, 0xb5, 0x40, 0xc3, 0x2e, 0x34, 0xc9, 0x55, - 0x4a, 0x62, 0xea, 0xf8, 0xf6, 0x24, 0x74, 0x13, 0xbd, 0xc5, 0x63, 0xd8, 0xfc, 0x04, 0x7b, 0xd2, - 0xfa, 0x38, 0x74, 0x33, 0x86, 0xed, 0x30, 0xb6, 0xb5, 0x45, 0x96, 0xec, 0x64, 0x27, 0x84, 0xd6, - 0x6a, 0x32, 0x31, 0x82, 0xf2, 0x2b, 0x32, 0x97, 0xc5, 0xcb, 0x96, 0xf8, 0x09, 0x54, 0x2e, 0x1c, - 0x3f, 0x23, 0xb2, 0x72, 0x3f, 0xdb, 0xd8, 0x81, 0x1c, 0xd9, 0x12, 0xf6, 0x5f, 0x96, 0xbe, 0x50, - 0xda, 0x87, 0xd0, 0x5c, 0xa9, 0x28, 0xdc, 0x80, 0xda, 0x69, 0xff, 0x59, 0x7f, 0x70, 0xd6, 0x47, - 0xef, 0x61, 0x0d, 0xd4, 0xa7, 0xe3, 0xf1, 0x10, 0x29, 0xb8, 0x0e, 0x15, 0xb6, 0x1a, 0xa1, 0x12, - 0xae, 0x42, 0xe9, 0x6c, 0x84, 0xca, 0xb8, 0x06, 0xe5, 0xb3, 0xd1, 0x08, 0xa9, 0xa6, 0xaa, 0x69, - 0xa8, 0x6e, 0xaa, 0x5a, 0x1d, 0x81, 0xa9, 0x6a, 0x4d, 0xd4, 0x6a, 0xff, 0xb9, 0x02, 0xf5, 0x41, - 0x44, 0x62, 0x1e, 0x22, 0x6b, 0x93, 0xd4, 0x99, 0x25, 0xba, 0xc2, 0x6b, 0x8f, 0xaf, 0x79, 0x5f, - 0x66, 0x41, 0xe0, 0xc4, 0x73, 0x1e, 0x06, 0xeb, 0x4b, 0x41, 0xe2, 0x5d, 0x68, 0x4c, 0x48, 0xe2, - 0xc6, 0x1e, 0xf7, 0x5a, 0xf6, 0x56, 0x91, 0x75, 0xf3, 0x24, 0xd4, 0xb7, 0x7f, 0x12, 0xf8, 0x63, - 0xd8, 0x0a, 0xf3, 0x08, 0x6c, 0x6f, 0xa2, 0x57, 0x84, 0x1f, 0x0b, 0x9e, 0x31, 0x79, 0xed, 0x9e, - 0xb3, 0x8b, 0x3d, 0x57, 0xe7, 0x45, 0xda, 0xdd, 0xd8, 0xf7, 0x45, 0x5a, 0x7f, 0xa4, 0xeb, 0xf4, - 0xe5, 0x35, 0x03, 0x7c, 0xef, 0xc5, 0x35, 0xf1, 0x00, 0x60, 0x42, 0xa2, 0x98, 0xb8, 0x4e, 0x4a, - 0x26, 0xbc, 0x0b, 0x35, 0xab, 0xc0, 0x79, 0x77, 0xed, 0xf3, 0x7f, 0xaf, 0x6c, 0x51, 0x95, 0xed, - 0x3f, 0x2a, 0xa0, 0xe5, 0xd2, 0xeb, 0xa5, 0xa5, 0xdc, 0x2c, 0xad, 0x27, 0x50, 0xe5, 0xa9, 0x72, - 0xa4, 0x0b, 0xfb, 0x9b, 0x47, 0xcf, 0xcd, 0x2c, 0x69, 0x6e, 0xaa, 0x5a, 0x99, 0x77, 0x86, 0x8a, - 0x2a, 0xed, 0xbf, 0x97, 0x40, 0x65, 0xaf, 0x06, 0xde, 0x86, 0x4a, 0xea, 0xa5, 0x3e, 0x91, 0x3b, - 0x0b, 0xe2, 0xba, 0x57, 0xa5, 0x9b, 0x5e, 0xed, 0x01, 0x4a, 0x49, 0x1c, 0x24, 0x76, 0x38, 0xb5, - 0x13, 0x12, 0x5f, 0x78, 0x2e, 0x91, 0x7d, 0xd1, 0xe2, 0xfc, 0xc1, 0x74, 0x24, 0xb8, 0xd8, 0x84, - 0x9a, 0x1b, 0xd2, 0xd4, 0x71, 0x53, 0xd9, 0x14, 0x9f, 0x6e, 0x1c, 0xc0, 0x91, 0xb0, 0xb3, 0x72, - 0x00, 0x86, 0xe5, 0x7b, 0x2e, 0xa1, 0x09, 0xe1, 0xc5, 0x7f, 0x1b, 0xac, 0x13, 0x61, 0x67, 0xe5, - 0x00, 0xac, 0x22, 0x2f, 0x48, 0x9c, 0xb0, 0xf8, 0xaa, 0xa2, 0xdd, 0x25, 0xd9, 0xee, 0x41, 0x4d, - 0xee, 0xcc, 0xee, 0x09, 0xea, 0x04, 0x79, 0x76, 0xf8, 0x9a, 0x15, 0x49, 0x16, 0xfb, 0x32, 0x29, - 0x6c, 0xc9, 0x92, 0x48, 0x02, 0xc7, 0xf3, 0x65, 0x06, 0x04, 0xd1, 0xde, 0x87, 0x9a, 0xdc, 0x74, - 0x33, 0x98, 0xf6, 0x33, 0xb8, 0xb7, 0xf6, 0x1a, 0xd8, 0xa0, 0x48, 0x6e, 0x82, 0xfd, 0xab, 0x04, - 0x55, 0x51, 0x00, 0x78, 0x0c, 0x8d, 0xef, 0x92, 0x90, 0xda, 0xb2, 0x8c, 0x14, 0x9e, 0xb9, 0xcf, - 0x37, 0xce, 0x9c, 0x39, 0x1a, 0xf4, 0x65, 0x29, 0x01, 0xc3, 0x91, 0xa8, 0x9f, 0x40, 0x73, 0xe2, - 0x31, 0x0f, 0x02, 0x8f, 0x3a, 0x69, 0x18, 0xcb, 0xcd, 0x57, 0x99, 0x6c, 0xf6, 0x88, 0x89, 0x33, - 0xb1, 0x43, 0xea, 0xcf, 0x79, 0x7a, 0x34, 0x4b, 0x63, 0x8c, 0x01, 0xf5, 0xd7, 0xbc, 0x5f, 0x95, - 0x77, 0x70, 0x6b, 0x76, 0xa0, 0x46, 0xae, 0x9c, 0x20, 0xf2, 0x09, 0x3f, 0xe7, 0xc6, 0xc1, 0x76, - 0x47, 0xcc, 0x69, 0x9d, 0x7c, 0x4e, 0xeb, 0x74, 0xe9, 0xdc, 0xca, 0x95, 0x64, 0x83, 0xfc, 0xa9, - 0x06, 0xb0, 0x0c, 0x9c, 0xe5, 0x37, 0x26, 0x53, 0x79, 0xbe, 0x6c, 0xb9, 0x6c, 0x9c, 0xca, 0x8f, - 0x34, 0x4e, 0xf5, 0xe6, 0x49, 0xe9, 0x50, 0x9b, 0x90, 0xa9, 0x93, 0xf9, 0xa9, 0x5e, 0x13, 0x65, - 0x27, 0x49, 0xfc, 0x33, 0x68, 0x04, 0x99, 0x9f, 0x7a, 0x91, 0x4f, 0xec, 0x70, 0xaa, 0xc3, 0xae, - 0xb2, 0xa7, 0x58, 0x90, 0xb3, 0x06, 0x53, 0x66, 0x1a, 0x38, 0x57, 0x5e, 0x90, 0x05, 0xfc, 0x9a, - 0x54, 0xac, 0x9c, 0xc4, 0x8f, 0xe0, 0x0e, 0xb9, 0x72, 0xfd, 0x2c, 0xf1, 0x2e, 0x88, 0x9d, 0xeb, - 0x6c, 0xf1, 0x6c, 0xa3, 0x85, 0xe0, 0xb9, 0x54, 0x66, 0x30, 0x1e, 0xe5, 0x2a, 0x4d, 0x09, 0x23, - 0xc8, 0x6b, 0x30, 0x52, 0xa7, 0x75, 0x1d, 0x46, 0x2a, 0xdf, 0x07, 0x08, 0x9c, 0x2b, 0xdb, 0x27, - 0x74, 0x96, 0x9e, 0xeb, 0xef, 0xef, 0x2a, 0x7b, 0xaa, 0x55, 0x0f, 0x9c, 0xab, 0x13, 0xce, 0xe0, - 0x62, 0x8f, 0xe6, 0x62, 0x24, 0xc5, 0x1e, 0x95, 0x62, 0x1d, 0x6a, 0x91, 0x93, 0xb2, 0x63, 0xd2, - 0xef, 0x88, 0x34, 0x48, 0x92, 0x55, 0x0c, 0xc3, 0xf5, 0x52, 0x12, 0x24, 0xfa, 0x36, 0xb7, 0xd3, - 0x02, 0xe7, 0xca, 0x60, 0x34, 0x17, 0x7a, 0x54, 0x0a, 0xef, 0x49, 0xa1, 0x47, 0x85, 0xf0, 0x63, - 0xd8, 0xca, 0xa8, 0xf7, 0x7d, 0x46, 0xa4, 0xfc, 0x27, 0xdc, 0xf3, 0x86, 0xe0, 0x09, 0x95, 0x5f, - 0x40, 0x8b, 0x81, 0x47, 0x31, 0x7b, 0x34, 0x53, 0x8f, 0x24, 0xba, 0xce, 0x41, 0x9a, 0x81, 0x73, - 0x35, 0x5c, 0x30, 0xb9, 0x9a, 0x47, 0x8b, 0x6a, 0x1f, 0x48, 0x35, 0x8f, 0x16, 0xd4, 0x76, 0x40, - 0x8b, 0xc5, 0xcb, 0x32, 0xd1, 0x77, 0xc4, 0x8b, 0x9a, 0xd3, 0xac, 0x3e, 0x9c, 0x38, 0x76, 0xe6, - 0x7a, 0x9b, 0x0b, 0x04, 0x81, 0xbf, 0x05, 0x35, 0x9d, 0x47, 0x44, 0xff, 0x39, 0x1f, 0xb5, 0x8d, - 0xd7, 0xe8, 0xc1, 0xc2, 0x72, 0xe4, 0xb1, 0x82, 0x1d, 0xcf, 0x23, 0x92, 0x58, 0x1c, 0xb6, 0x7d, - 0x09, 0xf7, 0xd6, 0x8a, 0x57, 0x47, 0xa8, 0x3a, 0x54, 0xba, 0x96, 0xd5, 0x7d, 0x81, 0x14, 0xc6, - 0x3f, 0x1c, 0x0c, 0x4e, 0x7a, 0xdd, 0x3e, 0x2a, 0x31, 0xc2, 0xe8, 0x8f, 0x7b, 0x4f, 0x7a, 0x16, - 0x2a, 0xb3, 0x39, 0xab, 0x7f, 0x7a, 0x72, 0x82, 0x54, 0x0c, 0x50, 0xed, 0x9f, 0x3e, 0x3f, 0xec, - 0x59, 0xa8, 0xc2, 0xd6, 0x83, 0x43, 0xb3, 0x77, 0x34, 0x46, 0x55, 0xb6, 0x1e, 0x8d, 0x2d, 0xa3, - 0xff, 0x04, 0xd5, 0x4c, 0x55, 0x53, 0x50, 0xc9, 0x54, 0xb5, 0x12, 0x2a, 0x8b, 0x06, 0xba, 0x36, - 0x81, 0x61, 0x74, 0xd7, 0x54, 0xb5, 0xbb, 0x68, 0xdb, 0x54, 0xb5, 0x9f, 0x22, 0xdd, 0x54, 0xb5, - 0x0f, 0xd1, 0x47, 0xa6, 0xaa, 0x7d, 0x84, 0xee, 0x9b, 0xaa, 0x76, 0x1f, 0x3d, 0x30, 0x55, 0xed, - 0x01, 0x6a, 0x9b, 0xaa, 0xf6, 0x09, 0x7a, 0x68, 0xaa, 0xda, 0x43, 0xf4, 0xc8, 0x54, 0xb5, 0x47, - 0xa8, 0xd3, 0xfe, 0xab, 0x02, 0xe5, 0xb1, 0x33, 0xdb, 0xe0, 0x49, 0xba, 0x71, 0x9b, 0x94, 0xdf, - 0xfe, 0x6d, 0x22, 0x02, 0x6d, 0xff, 0x47, 0x81, 0xbb, 0x6b, 0xe6, 0x7f, 0x3c, 0x2d, 0xcc, 0x2a, - 0x0a, 0x9f, 0x55, 0xcc, 0x37, 0xf9, 0x9e, 0x58, 0xf0, 0xc4, 0x38, 0xb5, 0x9c, 0x5c, 0x52, 0x68, - 0xae, 0x88, 0xd6, 0x0c, 0x2e, 0xcf, 0x57, 0x07, 0x97, 0x5f, 0xdd, 0xda, 0x0f, 0xf9, 0x39, 0x57, - 0x18, 0xcc, 0xff, 0x59, 0x81, 0xd6, 0xaa, 0x14, 0x0f, 0x65, 0x3d, 0xb3, 0x8d, 0x5b, 0xaf, 0x31, - 0x98, 0x09, 0x98, 0x0e, 0x2b, 0x52, 0x51, 0xc2, 0x1b, 0x9c, 0x73, 0xfe, 0x98, 0x96, 0x0b, 0x8f, - 0xa9, 0x09, 0x25, 0x8f, 0xf2, 0xf9, 0xa2, 0x75, 0xf0, 0xe5, 0xeb, 0x7a, 0x61, 0x50, 0xab, 0xe4, - 0x51, 0x16, 0xd3, 0xd4, 0x0f, 0x2f, 0xf9, 0xc5, 0xfe, 0x06, 0x31, 0x7d, 0xe5, 0x87, 0x97, 0x16, - 0x47, 0x62, 0xf7, 0xaa, 0x93, 0xa5, 0xe7, 0x61, 0xec, 0xfd, 0x41, 0x0c, 0xef, 0xec, 0xad, 0x16, - 0x6f, 0x03, 0x5a, 0x11, 0x9c, 0xc6, 0x3e, 0xbb, 0xe2, 0xd2, 0xf0, 0x15, 0x11, 0x4a, 0xe2, 0x89, - 0xd0, 0x38, 0x83, 0x09, 0xf9, 0x30, 0x18, 0x46, 0x24, 0xd1, 0xb5, 0x5b, 0x0f, 0x83, 0xcc, 0xcc, - 0x92, 0xe6, 0xed, 0x67, 0xa0, 0xb2, 0xa4, 0x63, 0x04, 0x5b, 0xe3, 0x17, 0xc3, 0x9e, 0x6d, 0xf4, - 0xbf, 0xee, 0x9e, 0x18, 0xc7, 0xe8, 0x3d, 0xdc, 0x02, 0xe0, 0x9c, 0xc3, 0xee, 0xc8, 0x38, 0x42, - 0xca, 0x42, 0xa3, 0x3b, 0x34, 0xec, 0x67, 0xbd, 0x17, 0xa8, 0x84, 0xdf, 0x87, 0x06, 0xe7, 0x0c, - 0xba, 0xa7, 0xe3, 0xa7, 0x07, 0xa8, 0xdc, 0xfe, 0x0c, 0x4a, 0x06, 0x65, 0x86, 0x46, 0xbf, 0x00, - 0xb4, 0x05, 0x9a, 0xd1, 0xb7, 0x7f, 0x77, 0xda, 0xb3, 0xd8, 0x4d, 0xd3, 0x84, 0xba, 0xd1, 0xb7, - 0x9f, 0xf6, 0xba, 0xc7, 0x3d, 0x0b, 0x95, 0xda, 0xdf, 0x81, 0xca, 0x12, 0xc4, 0xd0, 0xbf, 0x3a, - 0x19, 0x9c, 0x15, 0xcc, 0xee, 0x40, 0x53, 0x70, 0x9e, 0x0f, 0x4f, 0x8c, 0x23, 0x63, 0x8c, 0x94, - 0x05, 0x6b, 0xd8, 0x1d, 0x8d, 0xce, 0x06, 0xd6, 0x31, 0x2a, 0xe1, 0x6d, 0x40, 0x9c, 0xd5, 0x1d, - 0x32, 0xad, 0xee, 0xd8, 0x18, 0xf4, 0x51, 0x79, 0xc9, 0x3d, 0x3a, 0xea, 0x8d, 0x46, 0xf6, 0xd1, - 0xe0, 0xb8, 0x87, 0xd4, 0xf6, 0xbf, 0x4b, 0xcb, 0x6e, 0x2d, 0x7c, 0x09, 0xe0, 0xbf, 0x28, 0x85, - 0xbf, 0x02, 0xe2, 0xa5, 0x40, 0xb6, 0xee, 0xe9, 0x9b, 0x7c, 0x66, 0xac, 0xe3, 0x89, 0x2e, 0x5e, - 0xfc, 0x47, 0x50, 0x90, 0xec, 0x7c, 0x0a, 0xfa, 0x1a, 0x83, 0xaf, 0x59, 0xeb, 0xb1, 0x97, 0x84, - 0x1f, 0x9a, 0xfc, 0x58, 0x15, 0xc4, 0xce, 0x3f, 0x94, 0xb5, 0x26, 0x3f, 0x74, 0x1d, 0xbc, 0x5a, - 0xbd, 0x0e, 0xde, 0x7a, 0x6c, 0xdc, 0xd5, 0xe2, 0x65, 0xf1, 0x37, 0x85, 0xcd, 0x9f, 0xac, 0xd6, - 0xf0, 0xb0, 0x18, 0x40, 0xe3, 0x36, 0xfd, 0xc9, 0xed, 0xc5, 0x8f, 0x48, 0x9e, 0x0c, 0xfe, 0x0b, - 0x80, 0x25, 0x73, 0x4d, 0xb4, 0xdb, 0xc5, 0x68, 0xeb, 0x05, 0xb7, 0x0e, 0x8f, 0x7e, 0xdf, 0x9d, - 0x79, 0xe9, 0x79, 0xf6, 0xb2, 0xe3, 0x86, 0xc1, 0x3e, 0x73, 0xe4, 0x31, 0x71, 0xc3, 0x64, 0x9e, - 0xa4, 0x44, 0x92, 0xd2, 0xaf, 0xfd, 0x1f, 0xfe, 0x87, 0xf0, 0x65, 0x95, 0xcb, 0x3e, 0xff, 0x5f, - 0x00, 0x00, 0x00, 0xff, 0xff, 0xf7, 0xc4, 0x0e, 0x83, 0x46, 0x14, 0x00, 0x00, + 0xc4, 0xbe, 0xf5, 0xa9, 0x7d, 0xee, 0xf4, 0xa9, 0x33, 0xf9, 0x33, 0xfa, 0xd6, 0xbf, 0xaa, 0xfd, + 0x03, 0xda, 0xb9, 0x0f, 0x90, 0xa0, 0xc4, 0x64, 0x28, 0x7f, 0xf4, 0x89, 0xb7, 0x5f, 0xbf, 0xdb, + 0xdd, 0xdb, 0xbd, 0x5b, 0x10, 0x1e, 0x46, 0x71, 0x98, 0x86, 0xee, 0xe3, 0x19, 0xa1, 0x8f, 0x93, + 0x4b, 0x67, 0x36, 0x23, 0xf1, 0x7e, 0x18, 0xa5, 0x5e, 0x48, 0x93, 0xfd, 0x30, 0x22, 0xd4, 0x89, + 0xbc, 0x8b, 0x83, 0x0e, 0x57, 0xc2, 0xbf, 0x9e, 0xc5, 0x91, 0xdb, 0x99, 0x39, 0x29, 0xb9, 0x74, + 0xe6, 0x82, 0xe7, 0xda, 0x33, 0x42, 0x6d, 0x69, 0xd8, 0x91, 0x86, 0x3b, 0x1f, 0xcc, 0xc2, 0x70, + 0xe6, 0x93, 0x7d, 0xae, 0xf2, 0x32, 0x9b, 0xee, 0x3b, 0x54, 0xea, 0xb7, 0xff, 0x5b, 0x85, 0xda, + 0x48, 0xa8, 0x63, 0x1d, 0x6a, 0xd2, 0x52, 0x57, 0x76, 0x95, 0xbd, 0xba, 0x95, 0x93, 0xb8, 0x0b, + 0xaa, 0x47, 0xa7, 0xa1, 0x5e, 0xda, 0x55, 0xf6, 0x1a, 0x07, 0x8f, 0x3b, 0x1b, 0x6e, 0xdc, 0x31, + 0xe8, 0x34, 0xb4, 0xb8, 0x29, 0xc6, 0xa0, 0x9e, 0x87, 0x49, 0xaa, 0x97, 0x39, 0x32, 0x5f, 0xe3, + 0x0f, 0xa1, 0xfe, 0xd2, 0x49, 0x88, 0x1d, 0x39, 0xe9, 0xb9, 0xae, 0x72, 0x81, 0xc6, 0x18, 0x43, + 0x27, 0x3d, 0xc7, 0xdf, 0x40, 0x2d, 0x71, 0xcf, 0x49, 0x40, 0x12, 0xbd, 0xb2, 0x5b, 0xde, 0x6b, + 0x1d, 0xfc, 0x6e, 0xe3, 0x6d, 0x65, 0x40, 0xf9, 0xef, 0x88, 0xc3, 0x58, 0x39, 0x1c, 0xde, 0x01, + 0xcd, 0x0d, 0x69, 0x92, 0x31, 0xe8, 0xea, 0x6e, 0x99, 0xed, 0x9a, 0xd3, 0x4c, 0x16, 0xc5, 0xe1, + 0x24, 0x73, 0x49, 0xa2, 0xd7, 0x84, 0x2c, 0xa7, 0xf1, 0xb7, 0x50, 0x8f, 0x49, 0x12, 0x85, 0x34, + 0x21, 0x89, 0x0e, 0xbb, 0xe5, 0xbd, 0xc6, 0xc1, 0xef, 0x6f, 0xed, 0x93, 0x95, 0x23, 0xf4, 0x68, + 0x1a, 0xcf, 0xad, 0x25, 0x22, 0x0e, 0x61, 0x3b, 0x21, 0x6e, 0x16, 0x7b, 0xe9, 0xdc, 0x9e, 0x90, + 0xa9, 0x47, 0x3d, 0x6e, 0xa9, 0x37, 0x78, 0xd2, 0x7f, 0xbb, 0xf9, 0x4e, 0x12, 0xe4, 0x78, 0x89, + 0x61, 0xdd, 0x4d, 0x6e, 0x32, 0xf1, 0x37, 0xa0, 0xe5, 0x6c, 0x7d, 0x8b, 0x87, 0x73, 0xfb, 0x4d, + 0x2c, 0xf2, 0x7d, 0xe6, 0xc5, 0x24, 0x20, 0x34, 0xb5, 0x16, 0x68, 0xd8, 0x85, 0x26, 0xb9, 0x4a, + 0x49, 0x4c, 0x1d, 0xdf, 0x9e, 0x84, 0x6e, 0xa2, 0xb7, 0x78, 0x0c, 0x9b, 0x9f, 0x60, 0x4f, 0x5a, + 0x1f, 0x87, 0x6e, 0xc6, 0xb0, 0x1d, 0xc6, 0xb6, 0xb6, 0xc8, 0x92, 0x9d, 0xec, 0x84, 0xd0, 0x5a, + 0x4d, 0x26, 0x46, 0x50, 0x7e, 0x45, 0xe6, 0xb2, 0x78, 0xd9, 0x12, 0x3f, 0x81, 0xca, 0x85, 0xe3, + 0x67, 0x44, 0x56, 0xee, 0x67, 0x1b, 0x3b, 0x90, 0x23, 0x5b, 0xc2, 0xfe, 0xcb, 0xd2, 0x17, 0x4a, + 0xfb, 0x10, 0x9a, 0x2b, 0x15, 0x85, 0x1b, 0x50, 0x3b, 0xed, 0x3f, 0xeb, 0x0f, 0xce, 0xfa, 0xe8, + 0x3d, 0xac, 0x81, 0xfa, 0x74, 0x3c, 0x1e, 0x22, 0x05, 0xd7, 0xa1, 0xc2, 0x56, 0x23, 0x54, 0xc2, + 0x55, 0x28, 0x9d, 0x8d, 0x50, 0x19, 0xd7, 0xa0, 0x7c, 0x36, 0x1a, 0x21, 0xd5, 0x54, 0x35, 0x0d, + 0xd5, 0x4d, 0x55, 0xab, 0x23, 0x30, 0x55, 0xad, 0x89, 0x5a, 0xed, 0xbf, 0x54, 0xa0, 0x3e, 0x88, + 0x48, 0xcc, 0x43, 0x64, 0x6d, 0x92, 0x3a, 0xb3, 0x44, 0x57, 0x78, 0xed, 0xf1, 0x35, 0xef, 0xcb, + 0x2c, 0x08, 0x9c, 0x78, 0xce, 0xc3, 0x60, 0x7d, 0x29, 0x48, 0xbc, 0x0b, 0x8d, 0x09, 0x49, 0xdc, + 0xd8, 0xe3, 0x5e, 0xcb, 0xde, 0x2a, 0xb2, 0x6e, 0x9e, 0x84, 0xfa, 0xf6, 0x4f, 0x02, 0x7f, 0x0c, + 0x5b, 0x61, 0x1e, 0x81, 0xed, 0x4d, 0xf4, 0x8a, 0xf0, 0x63, 0xc1, 0x33, 0x26, 0xaf, 0xdd, 0x73, + 0x76, 0xb1, 0xe7, 0xea, 0xbc, 0x48, 0xbb, 0x1b, 0xfb, 0xbe, 0x48, 0xeb, 0x4f, 0x74, 0x9d, 0xbe, + 0xbc, 0x66, 0x80, 0xef, 0xbd, 0xb8, 0x26, 0x1e, 0x00, 0x4c, 0x48, 0x14, 0x13, 0xd7, 0x49, 0xc9, + 0x84, 0x77, 0xa1, 0x66, 0x15, 0x38, 0xef, 0xae, 0x7d, 0xfe, 0xef, 0x95, 0x2d, 0xaa, 0xb2, 0xfd, + 0x67, 0x05, 0xb4, 0x5c, 0x7a, 0xbd, 0xb4, 0x94, 0x9b, 0xa5, 0xf5, 0x04, 0xaa, 0x3c, 0x55, 0x8e, + 0x74, 0x61, 0x7f, 0xf3, 0xe8, 0xb9, 0x99, 0x25, 0xcd, 0x4d, 0x55, 0x2b, 0xf3, 0xce, 0x50, 0x51, + 0xa5, 0xfd, 0x8f, 0x12, 0xa8, 0xec, 0xd5, 0xc0, 0xdb, 0x50, 0x49, 0xbd, 0xd4, 0x27, 0x72, 0x67, + 0x41, 0x5c, 0xf7, 0xaa, 0x74, 0xd3, 0xab, 0x3d, 0x40, 0x29, 0x89, 0x83, 0xc4, 0x0e, 0xa7, 0x76, + 0x42, 0xe2, 0x0b, 0xcf, 0x25, 0xb2, 0x2f, 0x5a, 0x9c, 0x3f, 0x98, 0x8e, 0x04, 0x17, 0x9b, 0x50, + 0x73, 0x43, 0x9a, 0x3a, 0x6e, 0x2a, 0x9b, 0xe2, 0xd3, 0x8d, 0x03, 0x38, 0x12, 0x76, 0x56, 0x0e, + 0xc0, 0xb0, 0x7c, 0xcf, 0x25, 0x34, 0x21, 0xbc, 0xf8, 0x6f, 0x83, 0x75, 0x22, 0xec, 0xac, 0x1c, + 0x80, 0x55, 0xe4, 0x05, 0x89, 0x13, 0x16, 0x5f, 0x55, 0xb4, 0xbb, 0x24, 0xdb, 0x3d, 0xa8, 0xc9, + 0x9d, 0xd9, 0x3d, 0x41, 0x9d, 0x20, 0xcf, 0x0e, 0x5f, 0xb3, 0x22, 0xc9, 0x62, 0x5f, 0x26, 0x85, + 0x2d, 0x59, 0x12, 0x49, 0xe0, 0x78, 0xbe, 0xcc, 0x80, 0x20, 0xda, 0xfb, 0x50, 0x93, 0x9b, 0x6e, + 0x06, 0xd3, 0x7e, 0x06, 0xf7, 0xd6, 0x5e, 0x03, 0x1b, 0x14, 0xc9, 0x4d, 0xb0, 0x7f, 0x95, 0xa0, + 0x2a, 0x0a, 0x00, 0x8f, 0xa1, 0xf1, 0x5d, 0x12, 0x52, 0x5b, 0x96, 0x91, 0xc2, 0x33, 0xf7, 0xf9, + 0xc6, 0x99, 0x33, 0x47, 0x83, 0xbe, 0x2c, 0x25, 0x60, 0x38, 0x12, 0xf5, 0x13, 0x68, 0x4e, 0x3c, + 0xe6, 0x41, 0xe0, 0x51, 0x27, 0x0d, 0x63, 0xb9, 0xf9, 0x2a, 0x93, 0xcd, 0x1e, 0x31, 0x71, 0x26, + 0x76, 0x48, 0xfd, 0x39, 0x4f, 0x8f, 0x66, 0x69, 0x8c, 0x31, 0xa0, 0xfe, 0x9a, 0xf7, 0xab, 0xf2, + 0x0e, 0x6e, 0xcd, 0x0e, 0xd4, 0xc8, 0x95, 0x13, 0x44, 0x3e, 0xe1, 0xe7, 0xdc, 0x38, 0xd8, 0xee, + 0x88, 0x39, 0xad, 0x93, 0xcf, 0x69, 0x9d, 0x2e, 0x9d, 0x5b, 0xb9, 0x92, 0x6c, 0x90, 0x1f, 0x6a, + 0x00, 0xcb, 0xc0, 0x59, 0x7e, 0x63, 0x32, 0x95, 0xe7, 0xcb, 0x96, 0xcb, 0xc6, 0xa9, 0xfc, 0x44, + 0xe3, 0x54, 0x6f, 0x9e, 0x94, 0x0e, 0xb5, 0x09, 0x99, 0x3a, 0x99, 0x9f, 0xea, 0x35, 0x51, 0x76, + 0x92, 0x5c, 0x4d, 0x95, 0x76, 0x2d, 0x55, 0xbf, 0x80, 0x46, 0x90, 0xf9, 0xa9, 0x17, 0xf9, 0xc4, + 0x0e, 0xa7, 0x3a, 0xec, 0x2a, 0x7b, 0x8a, 0x05, 0x39, 0x6b, 0x30, 0x65, 0xb8, 0x81, 0x73, 0xe5, + 0x05, 0x59, 0xc0, 0xef, 0x50, 0xc5, 0xca, 0x49, 0xfc, 0x08, 0xee, 0x90, 0x2b, 0xd7, 0xcf, 0x12, + 0xef, 0x82, 0xd8, 0xb9, 0xce, 0x16, 0xc7, 0x47, 0x0b, 0xc1, 0x73, 0xa9, 0xcc, 0x60, 0x3c, 0xca, + 0x55, 0x9a, 0x12, 0x46, 0x90, 0xd7, 0x60, 0xa4, 0x4e, 0xeb, 0x3a, 0x8c, 0x54, 0xbe, 0x0f, 0x10, + 0x38, 0x57, 0xb6, 0x4f, 0xe8, 0x2c, 0x3d, 0xd7, 0xdf, 0xdf, 0x55, 0xf6, 0x54, 0xab, 0x1e, 0x38, + 0x57, 0x27, 0x9c, 0xc1, 0xc5, 0x1e, 0xcd, 0xc5, 0x48, 0x8a, 0x3d, 0x2a, 0xc5, 0x3a, 0xd4, 0x22, + 0x27, 0x65, 0x67, 0xa8, 0xdf, 0x11, 0x39, 0x92, 0x24, 0xcb, 0x11, 0xc3, 0xf5, 0x52, 0x12, 0x24, + 0xfa, 0x36, 0xb7, 0xd3, 0x02, 0xe7, 0xca, 0x60, 0x34, 0x17, 0x7a, 0x54, 0x0a, 0xef, 0x49, 0xa1, + 0x47, 0x85, 0xf0, 0x63, 0xd8, 0xca, 0xa8, 0xf7, 0x7d, 0x46, 0xa4, 0xfc, 0x67, 0xdc, 0xf3, 0x86, + 0xe0, 0x09, 0x95, 0x5f, 0x41, 0x8b, 0x81, 0x47, 0x31, 0x7b, 0x51, 0x53, 0x8f, 0x24, 0xba, 0xce, + 0x41, 0x9a, 0x81, 0x73, 0x35, 0x5c, 0x30, 0xb9, 0x9a, 0x47, 0x8b, 0x6a, 0x1f, 0x48, 0x35, 0x8f, + 0x16, 0xd4, 0x76, 0x40, 0x8b, 0xc5, 0xb3, 0x33, 0xd1, 0x77, 0xc4, 0x73, 0x9b, 0xd3, 0xac, 0x78, + 0x9c, 0x38, 0x76, 0xe6, 0x7a, 0x9b, 0x0b, 0x04, 0x81, 0xbf, 0x05, 0x35, 0x9d, 0x47, 0x44, 0xff, + 0x25, 0x9f, 0xc3, 0x8d, 0xd7, 0x68, 0xd0, 0xc2, 0x72, 0xe4, 0xb1, 0x6a, 0x1e, 0xcf, 0x23, 0x92, + 0x58, 0x1c, 0xb6, 0x7d, 0x09, 0xf7, 0xd6, 0x8a, 0x57, 0xe7, 0xab, 0x3a, 0x54, 0xba, 0x96, 0xd5, + 0x7d, 0x81, 0x14, 0xc6, 0x3f, 0x1c, 0x0c, 0x4e, 0x7a, 0xdd, 0x3e, 0x2a, 0x31, 0xc2, 0xe8, 0x8f, + 0x7b, 0x4f, 0x7a, 0x16, 0x2a, 0xb3, 0x21, 0xac, 0x7f, 0x7a, 0x72, 0x82, 0x54, 0x0c, 0x50, 0xed, + 0x9f, 0x3e, 0x3f, 0xec, 0x59, 0xa8, 0xc2, 0xd6, 0x83, 0x43, 0xb3, 0x77, 0x34, 0x46, 0x55, 0xb6, + 0x1e, 0x8d, 0x2d, 0xa3, 0xff, 0x04, 0xd5, 0x4c, 0x55, 0x53, 0x50, 0xc9, 0x54, 0xb5, 0x12, 0x2a, + 0x8b, 0xee, 0x5a, 0x0c, 0x66, 0x18, 0xdd, 0x35, 0x55, 0xed, 0x2e, 0xda, 0x36, 0x55, 0xed, 0xe7, + 0x48, 0x37, 0x55, 0xed, 0x43, 0xf4, 0x91, 0xa9, 0x6a, 0x1f, 0xa1, 0xfb, 0xa6, 0xaa, 0xdd, 0x47, + 0x0f, 0x4c, 0x55, 0x7b, 0x80, 0xda, 0xa6, 0xaa, 0x7d, 0x82, 0x1e, 0x9a, 0xaa, 0xf6, 0x10, 0x3d, + 0x32, 0x55, 0xed, 0x11, 0xea, 0xb4, 0xff, 0xa6, 0x40, 0x79, 0xec, 0xcc, 0x36, 0x78, 0xa9, 0x6e, + 0x5c, 0x32, 0xe5, 0xb7, 0x7f, 0xc9, 0x88, 0x10, 0xdb, 0xff, 0x51, 0xe0, 0xee, 0x9a, 0xcf, 0x02, + 0x3c, 0x2d, 0x8c, 0x30, 0x0a, 0x1f, 0x61, 0xcc, 0x37, 0xf9, 0xcc, 0x58, 0xf0, 0xc4, 0x94, 0xb5, + 0x1c, 0x68, 0x52, 0x68, 0xae, 0x88, 0xd6, 0xcc, 0x33, 0xcf, 0x57, 0xe7, 0x99, 0xdf, 0xdc, 0xda, + 0x0f, 0xf9, 0x95, 0x57, 0x98, 0xd7, 0xff, 0x59, 0x81, 0xd6, 0xaa, 0x14, 0x0f, 0x65, 0x25, 0xb3, + 0x8d, 0x5b, 0xaf, 0x31, 0xaf, 0x09, 0x98, 0x0e, 0x2b, 0x4f, 0x51, 0xbc, 0x1b, 0x9c, 0x73, 0xfe, + 0xc6, 0x96, 0x0b, 0x6f, 0xac, 0x09, 0x25, 0x8f, 0xf2, 0xb1, 0xa3, 0x75, 0xf0, 0xe5, 0xeb, 0x7a, + 0x61, 0x50, 0xab, 0xe4, 0x51, 0x16, 0xd3, 0xd4, 0x0f, 0x2f, 0xf9, 0x7d, 0xff, 0x06, 0x31, 0x7d, + 0xe5, 0x87, 0x97, 0x16, 0x47, 0x62, 0x37, 0xaa, 0x93, 0xa5, 0xe7, 0x61, 0xec, 0xfd, 0x49, 0xcc, + 0xf4, 0xec, 0x09, 0x17, 0x4f, 0x06, 0x5a, 0x11, 0x9c, 0xc6, 0x3e, 0xbb, 0xdc, 0xd2, 0xf0, 0x15, + 0x11, 0x4a, 0xe2, 0xe5, 0xd0, 0x38, 0x83, 0x09, 0xf9, 0x8c, 0x18, 0x46, 0x24, 0xe1, 0xef, 0xc6, + 0xed, 0x66, 0x44, 0x66, 0x66, 0x49, 0xf3, 0xf6, 0x33, 0x50, 0x59, 0xd2, 0x31, 0x82, 0xad, 0xf1, + 0x8b, 0x61, 0xcf, 0x36, 0xfa, 0x5f, 0x77, 0x4f, 0x8c, 0x63, 0xf4, 0x1e, 0x6e, 0x01, 0x70, 0xce, + 0x61, 0x77, 0x64, 0x1c, 0x21, 0x65, 0xa1, 0xd1, 0x1d, 0x1a, 0xf6, 0xb3, 0xde, 0x0b, 0x54, 0xc2, + 0xef, 0x43, 0x83, 0x73, 0x06, 0xdd, 0xd3, 0xf1, 0xd3, 0x03, 0x54, 0x6e, 0x7f, 0x06, 0x25, 0x83, + 0x32, 0x43, 0xa3, 0x5f, 0x00, 0xda, 0x02, 0xcd, 0xe8, 0xdb, 0x7f, 0x38, 0xed, 0x59, 0xec, 0x8e, + 0x69, 0x42, 0xdd, 0xe8, 0xdb, 0x4f, 0x7b, 0xdd, 0xe3, 0x9e, 0x85, 0x4a, 0xed, 0xef, 0x40, 0x65, + 0x09, 0x62, 0xe8, 0x5f, 0x9d, 0x0c, 0xce, 0x0a, 0x66, 0x77, 0xa0, 0x29, 0x38, 0xcf, 0x87, 0x27, + 0xc6, 0x91, 0x31, 0x46, 0xca, 0x82, 0x35, 0xec, 0x8e, 0x46, 0x67, 0x03, 0xeb, 0x18, 0x95, 0xf0, + 0x36, 0x20, 0xce, 0xea, 0x0e, 0x99, 0x56, 0x77, 0x6c, 0x0c, 0xfa, 0xa8, 0xbc, 0xe4, 0x1e, 0x1d, + 0xf5, 0x46, 0x23, 0xfb, 0x68, 0x70, 0xdc, 0x43, 0x6a, 0xfb, 0xdf, 0xa5, 0x65, 0xb7, 0x16, 0x3e, + 0x10, 0xf0, 0x5f, 0x95, 0xc2, 0x3f, 0x04, 0xf1, 0x52, 0x20, 0x5b, 0xf7, 0xf4, 0x4d, 0xbe, 0x3e, + 0xd6, 0xf1, 0x44, 0x17, 0x2f, 0xfe, 0x3a, 0x28, 0x48, 0x76, 0x3e, 0x05, 0x7d, 0x8d, 0xc1, 0xd7, + 0xac, 0xf5, 0xd8, 0x1b, 0xc2, 0x0f, 0x4d, 0x7e, 0xc3, 0x0a, 0x62, 0xe7, 0x07, 0x65, 0xad, 0xc9, + 0x8f, 0x5d, 0x07, 0xaf, 0x56, 0xaf, 0x83, 0xb7, 0x1e, 0x1b, 0x77, 0xb5, 0x78, 0x59, 0xfc, 0x5d, + 0x61, 0x63, 0x29, 0xab, 0x35, 0x3c, 0x2c, 0x06, 0xd0, 0xb8, 0x4d, 0x7f, 0x72, 0x7b, 0xf1, 0x23, + 0x92, 0x27, 0x83, 0xff, 0x02, 0x60, 0xc9, 0x5c, 0x13, 0xed, 0x76, 0x31, 0xda, 0x7a, 0xc1, 0xad, + 0xc3, 0xa3, 0x3f, 0x76, 0x67, 0x5e, 0x7a, 0x9e, 0xbd, 0xec, 0xb8, 0x61, 0xb0, 0xcf, 0x1c, 0x79, + 0x4c, 0xdc, 0x30, 0x99, 0x27, 0x29, 0x91, 0xa4, 0xf4, 0x6b, 0xff, 0xc7, 0xff, 0x38, 0x7c, 0x59, + 0xe5, 0xb2, 0xcf, 0xff, 0x17, 0x00, 0x00, 0xff, 0xff, 0xb3, 0xec, 0xbb, 0xdf, 0x5d, 0x14, 0x00, + 0x00, } diff --git a/protoc-gen-swagger/options/openapiv2.proto b/protoc-gen-swagger/options/openapiv2.proto index 18b6c89dae0..105f8feb41d 100644 --- a/protoc-gen-swagger/options/openapiv2.proto +++ b/protoc-gen-swagger/options/openapiv2.proto @@ -169,8 +169,7 @@ message JSONSchema { string title = 5; string description = 6; string default = 7; - // field 8 is reserved for 'readOnly', which has an OpenAPI v2-specific meaning and is defined there. - reserved 8; + bool read_only = 8; // field 9 is reserved for 'examples', which is omitted from OpenAPI v2 in favor of 'example' field. reserved 9; double multiple_of = 10;