From 2b8c0fd293ee52e2db42914d8334a3fc0721c88f Mon Sep 17 00:00:00 2001 From: Seth Hollyman Date: Thu, 23 Jun 2022 18:32:27 +0000 Subject: [PATCH 01/15] feat(bigquery/storage/managedwriter): expose preview annotation This PR adds the preview annotation within an internal package to enable early development without exposing the surface to end users. It doesn't include any modifications to the behavior --- .../internal/annotations/annotations.pb.go | 114 ++++++++++++++++++ .../internal/annotations/annotations.proto | 26 ++++ 2 files changed, 140 insertions(+) create mode 100644 bigquery/storage/managedwriter/internal/annotations/annotations.pb.go create mode 100644 bigquery/storage/managedwriter/internal/annotations/annotations.proto diff --git a/bigquery/storage/managedwriter/internal/annotations/annotations.pb.go b/bigquery/storage/managedwriter/internal/annotations/annotations.pb.go new file mode 100644 index 00000000000..26b6238f925 --- /dev/null +++ b/bigquery/storage/managedwriter/internal/annotations/annotations.pb.go @@ -0,0 +1,114 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.28.0 +// protoc v3.17.3 +// source: annotations.proto + +package annotations + +import ( + reflect "reflect" + + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + descriptorpb "google.golang.org/protobuf/types/descriptorpb" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +var file_annotations_proto_extTypes = []protoimpl.ExtensionInfo{ + { + ExtendedType: (*descriptorpb.FieldOptions)(nil), + ExtensionType: (*string)(nil), + Field: 454943157, + Name: "google.cloud.bigquery.storage.v1.column_name", + Tag: "bytes,454943157,opt,name=column_name", + Filename: "annotations.proto", + }, +} + +// Extension fields to descriptorpb.FieldOptions. +var ( + // Setting the column_name extension allows users to reference + // bigquery column independently of the field name in the protocol buffer + // message. + // + // The intended use of this annotation is to reference a destination column + // named using characters unavailable for protobuf field names (e.g. unicode + // characters). + // + // More details about BigQuery naming limitations can be found here: + // https://cloud.google.com/bigquery/docs/schemas#column_names + // + // This extension is currently experimental. + // + // optional string column_name = 454943157; + E_ColumnName = &file_annotations_proto_extTypes[0] +) + +var File_annotations_proto protoreflect.FileDescriptor + +var file_annotations_proto_rawDesc = []byte{ + 0x0a, 0x11, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x12, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, + 0x64, 0x2e, 0x62, 0x69, 0x67, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, + 0x67, 0x65, 0x2e, 0x76, 0x31, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, + 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x3a, 0x45, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x75, 0x6d, + 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xb5, 0xc3, 0xf7, 0xd8, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x42, 0x8f, + 0x01, 0x0a, 0x24, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, + 0x6f, 0x75, 0x64, 0x2e, 0x62, 0x69, 0x67, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x73, 0x74, 0x6f, + 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, 0x42, 0x10, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x53, 0x63, 0x6c, 0x6f, + 0x75, 0x64, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, + 0x2f, 0x62, 0x69, 0x67, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, + 0x65, 0x2f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x77, 0x72, 0x69, 0x74, 0x65, 0x72, 0x2f, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x3b, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var file_annotations_proto_goTypes = []interface{}{ + (*descriptorpb.FieldOptions)(nil), // 0: google.protobuf.FieldOptions +} +var file_annotations_proto_depIdxs = []int32{ + 0, // 0: google.cloud.bigquery.storage.v1.column_name:extendee -> google.protobuf.FieldOptions + 1, // [1:1] is the sub-list for method output_type + 1, // [1:1] is the sub-list for method input_type + 1, // [1:1] is the sub-list for extension type_name + 0, // [0:1] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_annotations_proto_init() } +func file_annotations_proto_init() { + if File_annotations_proto != nil { + return + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_annotations_proto_rawDesc, + NumEnums: 0, + NumMessages: 0, + NumExtensions: 1, + NumServices: 0, + }, + GoTypes: file_annotations_proto_goTypes, + DependencyIndexes: file_annotations_proto_depIdxs, + ExtensionInfos: file_annotations_proto_extTypes, + }.Build() + File_annotations_proto = out.File + file_annotations_proto_rawDesc = nil + file_annotations_proto_goTypes = nil + file_annotations_proto_depIdxs = nil +} diff --git a/bigquery/storage/managedwriter/internal/annotations/annotations.proto b/bigquery/storage/managedwriter/internal/annotations/annotations.proto new file mode 100644 index 00000000000..fb37603e88c --- /dev/null +++ b/bigquery/storage/managedwriter/internal/annotations/annotations.proto @@ -0,0 +1,26 @@ +syntax = "proto3"; + +package google.cloud.bigquery.storage.v1; + +import "google/protobuf/descriptor.proto"; + +option go_package = "cloud.google.com/go/bigquery/storage/managedwriter/internal/annotations;annotations"; +option java_package = "com.google.cloud.bigquery.storage.v1"; +option java_multiple_files = true; +option java_outer_classname = "AnnotationsProto"; + +extend google.protobuf.FieldOptions { + // Setting the column_name extension allows users to reference + // bigquery column independently of the field name in the protocol buffer + // message. + // + // The intended use of this annotation is to reference a destination column + // named using characters unavailable for protobuf field names (e.g. unicode + // characters). + // + // More details about BigQuery naming limitations can be found here: + // https://cloud.google.com/bigquery/docs/schemas#column_names + // + // This extension is currently experimental. + optional string column_name = 454943157; +} \ No newline at end of file From 5f771fb1c9c44ce4a057c77bd153843d0b1b320d Mon Sep 17 00:00:00 2001 From: Seth Hollyman Date: Thu, 14 Jul 2022 21:25:37 +0000 Subject: [PATCH 02/15] update schema normalization, add unit test --- .../managedwriter/adapt/protoconversion.go | 63 +++++++++++++------ .../adapt/protoconversion_test.go | 38 +++++++++++ 2 files changed, 83 insertions(+), 18 deletions(-) diff --git a/bigquery/storage/managedwriter/adapt/protoconversion.go b/bigquery/storage/managedwriter/adapt/protoconversion.go index c1c264dfc97..c7ff4ef39c0 100644 --- a/bigquery/storage/managedwriter/adapt/protoconversion.go +++ b/bigquery/storage/managedwriter/adapt/protoconversion.go @@ -18,7 +18,9 @@ import ( "encoding/base64" "fmt" "strings" + "unicode" + "cloud.google.com/go/bigquery/storage/managedwriter/internal/annotations" storagepb "google.golang.org/genproto/googleapis/cloud/bigquery/storage/v1" "google.golang.org/protobuf/proto" "google.golang.org/protobuf/reflect/protodesc" @@ -265,33 +267,58 @@ func storageSchemaToDescriptorInternal(inSchema *storagepb.TableSchema, scope st // // Messages are always nullable, and repeated fields are as well. func tableFieldSchemaToFieldDescriptorProto(field *storagepb.TableFieldSchema, idx int32, scope string, useProto3 bool) (*descriptorpb.FieldDescriptorProto, error) { + name := strings.ToLower(field.GetName()) + var fdp *descriptorpb.FieldDescriptorProto + if field.GetType() == storagepb.TableFieldSchema_STRUCT { - return &descriptorpb.FieldDescriptorProto{ + fdp = &descriptorpb.FieldDescriptorProto{ Name: proto.String(name), Number: proto.Int32(idx), TypeName: proto.String(scope), Label: convertModeToLabel(field.GetMode(), useProto3), - }, nil + } + } else { + // For (REQUIRED||REPEATED) fields for proto3, or all cases for proto2, we can use the expected scalar types. + if field.GetMode() != storagepb.TableFieldSchema_NULLABLE || !useProto3 { + fdp = &descriptorpb.FieldDescriptorProto{ + Name: proto.String(name), + Number: proto.Int32(idx), + Type: bqTypeToFieldTypeMap[field.GetType()].Enum(), + Label: convertModeToLabel(field.GetMode(), useProto3), + } + } else { + // For NULLABLE proto3 fields, use a wrapper type. + fdp = &descriptorpb.FieldDescriptorProto{ + Name: proto.String(name), + Number: proto.Int32(idx), + Type: descriptorpb.FieldDescriptorProto_TYPE_MESSAGE.Enum(), + TypeName: proto.String(bqTypeToWrapperMap[field.GetType()]), + Label: descriptorpb.FieldDescriptorProto_LABEL_OPTIONAL.Enum(), + } + } } + if nameRequiresAnnotation(name) { + // TODO: need agreement across implementations on how to normalize? + // Possibly use golang.org/x/text/unicode/norm for ascii-fying? + fdp.Name = proto.String(fmt.Sprintf("unicode_field_%d", fdp.GetNumber())) + opts := fdp.GetOptions() + if opts == nil { + fdp.Options = &descriptorpb.FieldOptions{} + } + proto.SetExtension(fdp.Options, annotations.E_ColumnName, name) + } + return fdp, nil +} - // For (REQUIRED||REPEATED) fields for proto3, or all cases for proto2, we can use the expected scalar types. - if field.GetMode() != storagepb.TableFieldSchema_NULLABLE || !useProto3 { - return &descriptorpb.FieldDescriptorProto{ - Name: proto.String(name), - Number: proto.Int32(idx), - Type: bqTypeToFieldTypeMap[field.GetType()].Enum(), - Label: convertModeToLabel(field.GetMode(), useProto3), - }, nil +// nameRequiresAnnotation determines whether a field name requires unicode-annotation. +func nameRequiresAnnotation(in string) bool { + for i := 0; i < len(in); i++ { + if in[i] > unicode.MaxASCII { + return true + } } - // For NULLABLE proto3 fields, use a wrapper type. - return &descriptorpb.FieldDescriptorProto{ - Name: proto.String(name), - Number: proto.Int32(idx), - Type: descriptorpb.FieldDescriptorProto_TYPE_MESSAGE.Enum(), - TypeName: proto.String(bqTypeToWrapperMap[field.GetType()]), - Label: descriptorpb.FieldDescriptorProto_LABEL_OPTIONAL.Enum(), - }, nil + return false } // NormalizeDescriptor builds a self-contained DescriptorProto suitable for communicating schema diff --git a/bigquery/storage/managedwriter/adapt/protoconversion_test.go b/bigquery/storage/managedwriter/adapt/protoconversion_test.go index aaf6b4cb663..686ea133502 100644 --- a/bigquery/storage/managedwriter/adapt/protoconversion_test.go +++ b/bigquery/storage/managedwriter/adapt/protoconversion_test.go @@ -19,6 +19,7 @@ import ( "reflect" "testing" + "cloud.google.com/go/bigquery/storage/managedwriter/internal/annotations" "cloud.google.com/go/bigquery/storage/managedwriter/testdata" "github.com/google/go-cmp/cmp" storagepb "google.golang.org/genproto/googleapis/cloud/bigquery/storage/v1" @@ -384,6 +385,43 @@ func TestSchemaToProtoConversion(t *testing.T) { }, }, }, + { + description: "unicode", + bq: &storagepb.TableSchema{ + Fields: []*storagepb.TableFieldSchema{ + {Name: "foo", Type: storagepb.TableFieldSchema_STRING, Mode: storagepb.TableFieldSchema_NULLABLE}, + {Name: "💩", Type: storagepb.TableFieldSchema_INT64, Mode: storagepb.TableFieldSchema_REQUIRED}, + {Name: "☕_addict", Type: storagepb.TableFieldSchema_BYTES, Mode: storagepb.TableFieldSchema_REPEATED}, + }}, + wantProto2: func() *descriptorpb.DescriptorProto { + dp := &descriptorpb.DescriptorProto{ + Name: proto.String("root"), + Field: []*descriptorpb.FieldDescriptorProto{ + { + Name: proto.String("foo"), + Number: proto.Int32(1), + Type: descriptorpb.FieldDescriptorProto_TYPE_STRING.Enum(), + Label: descriptorpb.FieldDescriptorProto_LABEL_OPTIONAL.Enum()}, + { + Name: proto.String("unicode_field_2"), + Number: proto.Int32(2), + Type: descriptorpb.FieldDescriptorProto_TYPE_INT64.Enum(), + Options: &descriptorpb.FieldOptions{}, + Label: descriptorpb.FieldDescriptorProto_LABEL_REQUIRED.Enum()}, + { + Name: proto.String("unicode_field_3"), + Number: proto.Int32(3), + Type: descriptorpb.FieldDescriptorProto_TYPE_BYTES.Enum(), + Options: &descriptorpb.FieldOptions{}, + Label: descriptorpb.FieldDescriptorProto_LABEL_REPEATED.Enum(), + }, + }, + } + proto.SetExtension(dp.Field[1].Options, annotations.E_ColumnName, "💩") + proto.SetExtension(dp.Field[2].Options, annotations.E_ColumnName, "☕_addict") + return dp + }(), + }, } for _, tc := range testCases { // Proto2 From eb7d1e4138944774eb17676335e7a0d76c10127a Mon Sep 17 00:00:00 2001 From: Seth Hollyman Date: Fri, 15 Jul 2022 15:59:41 +0000 Subject: [PATCH 03/15] add validation test for column_name annotation --- .../storage/managedwriter/testdata/schemas.go | 15 + .../testdata/validation_proto2.pb.go | 575 ++++++++++-------- .../testdata/validation_proto2.proto | 11 + .../storage/managedwriter/validation_test.go | 15 + 4 files changed, 374 insertions(+), 242 deletions(-) diff --git a/bigquery/storage/managedwriter/testdata/schemas.go b/bigquery/storage/managedwriter/testdata/schemas.go index dfbb7a980d8..111d92a3b87 100644 --- a/bigquery/storage/managedwriter/testdata/schemas.go +++ b/bigquery/storage/managedwriter/testdata/schemas.go @@ -257,4 +257,19 @@ var ( Repeated: true, }, } + + ValidationColumnAnnotations bigquery.Schema = bigquery.Schema{ + { + Name: "first", + Type: bigquery.StringFieldType, + }, + { + Name: "second", + Type: bigquery.StringFieldType, + }, + { + Name: "😎🔥", + Type: bigquery.StringFieldType, + }, + } ) diff --git a/bigquery/storage/managedwriter/testdata/validation_proto2.pb.go b/bigquery/storage/managedwriter/testdata/validation_proto2.pb.go index 5dd87e5403e..ef8866ee632 100644 --- a/bigquery/storage/managedwriter/testdata/validation_proto2.pb.go +++ b/bigquery/storage/managedwriter/testdata/validation_proto2.pb.go @@ -16,7 +16,7 @@ // versions: // protoc-gen-go v1.28.0 // protoc v3.17.3 -// source: validation_proto2.proto +// source: testdata/validation_proto2.proto package testdata @@ -24,6 +24,7 @@ import ( reflect "reflect" sync "sync" + _ "cloud.google.com/go/bigquery/storage/managedwriter/internal/annotations" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" ) @@ -71,11 +72,11 @@ func (x Proto2ExampleEnum) String() string { } func (Proto2ExampleEnum) Descriptor() protoreflect.EnumDescriptor { - return file_validation_proto2_proto_enumTypes[0].Descriptor() + return file_testdata_validation_proto2_proto_enumTypes[0].Descriptor() } func (Proto2ExampleEnum) Type() protoreflect.EnumType { - return &file_validation_proto2_proto_enumTypes[0] + return &file_testdata_validation_proto2_proto_enumTypes[0] } func (x Proto2ExampleEnum) Number() protoreflect.EnumNumber { @@ -94,7 +95,7 @@ func (x *Proto2ExampleEnum) UnmarshalJSON(b []byte) error { // Deprecated: Use Proto2ExampleEnum.Descriptor instead. func (Proto2ExampleEnum) EnumDescriptor() ([]byte, []int) { - return file_validation_proto2_proto_rawDescGZIP(), []int{0} + return file_testdata_validation_proto2_proto_rawDescGZIP(), []int{0} } // Validation message in proto2 syntax with all @@ -125,7 +126,7 @@ type ValidationP2Required struct { func (x *ValidationP2Required) Reset() { *x = ValidationP2Required{} if protoimpl.UnsafeEnabled { - mi := &file_validation_proto2_proto_msgTypes[0] + mi := &file_testdata_validation_proto2_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -138,7 +139,7 @@ func (x *ValidationP2Required) String() string { func (*ValidationP2Required) ProtoMessage() {} func (x *ValidationP2Required) ProtoReflect() protoreflect.Message { - mi := &file_validation_proto2_proto_msgTypes[0] + mi := &file_testdata_validation_proto2_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -151,7 +152,7 @@ func (x *ValidationP2Required) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidationP2Required.ProtoReflect.Descriptor instead. func (*ValidationP2Required) Descriptor() ([]byte, []int) { - return file_validation_proto2_proto_rawDescGZIP(), []int{0} + return file_testdata_validation_proto2_proto_rawDescGZIP(), []int{0} } func (x *ValidationP2Required) GetDoubleField() float64 { @@ -280,7 +281,7 @@ type ValidationP2Optional struct { func (x *ValidationP2Optional) Reset() { *x = ValidationP2Optional{} if protoimpl.UnsafeEnabled { - mi := &file_validation_proto2_proto_msgTypes[1] + mi := &file_testdata_validation_proto2_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -293,7 +294,7 @@ func (x *ValidationP2Optional) String() string { func (*ValidationP2Optional) ProtoMessage() {} func (x *ValidationP2Optional) ProtoReflect() protoreflect.Message { - mi := &file_validation_proto2_proto_msgTypes[1] + mi := &file_testdata_validation_proto2_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -306,7 +307,7 @@ func (x *ValidationP2Optional) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidationP2Optional.ProtoReflect.Descriptor instead. func (*ValidationP2Optional) Descriptor() ([]byte, []int) { - return file_validation_proto2_proto_rawDescGZIP(), []int{1} + return file_testdata_validation_proto2_proto_rawDescGZIP(), []int{1} } func (x *ValidationP2Optional) GetDoubleField() float64 { @@ -457,7 +458,7 @@ var ( func (x *ValidationP2OptionalWithDefaults) Reset() { *x = ValidationP2OptionalWithDefaults{} if protoimpl.UnsafeEnabled { - mi := &file_validation_proto2_proto_msgTypes[2] + mi := &file_testdata_validation_proto2_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -470,7 +471,7 @@ func (x *ValidationP2OptionalWithDefaults) String() string { func (*ValidationP2OptionalWithDefaults) ProtoMessage() {} func (x *ValidationP2OptionalWithDefaults) ProtoReflect() protoreflect.Message { - mi := &file_validation_proto2_proto_msgTypes[2] + mi := &file_testdata_validation_proto2_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -483,7 +484,7 @@ func (x *ValidationP2OptionalWithDefaults) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidationP2OptionalWithDefaults.ProtoReflect.Descriptor instead. func (*ValidationP2OptionalWithDefaults) Descriptor() ([]byte, []int) { - return file_validation_proto2_proto_rawDescGZIP(), []int{2} + return file_testdata_validation_proto2_proto_rawDescGZIP(), []int{2} } func (x *ValidationP2OptionalWithDefaults) GetDoubleField() float64 { @@ -608,7 +609,7 @@ type ValidationP2UnpackedRepeated struct { func (x *ValidationP2UnpackedRepeated) Reset() { *x = ValidationP2UnpackedRepeated{} if protoimpl.UnsafeEnabled { - mi := &file_validation_proto2_proto_msgTypes[3] + mi := &file_testdata_validation_proto2_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -621,7 +622,7 @@ func (x *ValidationP2UnpackedRepeated) String() string { func (*ValidationP2UnpackedRepeated) ProtoMessage() {} func (x *ValidationP2UnpackedRepeated) ProtoReflect() protoreflect.Message { - mi := &file_validation_proto2_proto_msgTypes[3] + mi := &file_testdata_validation_proto2_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -634,7 +635,7 @@ func (x *ValidationP2UnpackedRepeated) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidationP2UnpackedRepeated.ProtoReflect.Descriptor instead. func (*ValidationP2UnpackedRepeated) Descriptor() ([]byte, []int) { - return file_validation_proto2_proto_rawDescGZIP(), []int{3} + return file_testdata_validation_proto2_proto_rawDescGZIP(), []int{3} } func (x *ValidationP2UnpackedRepeated) GetId() int64 { @@ -752,7 +753,7 @@ type ValidationP2PackedRepeated struct { func (x *ValidationP2PackedRepeated) Reset() { *x = ValidationP2PackedRepeated{} if protoimpl.UnsafeEnabled { - mi := &file_validation_proto2_proto_msgTypes[4] + mi := &file_testdata_validation_proto2_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -765,7 +766,7 @@ func (x *ValidationP2PackedRepeated) String() string { func (*ValidationP2PackedRepeated) ProtoMessage() {} func (x *ValidationP2PackedRepeated) ProtoReflect() protoreflect.Message { - mi := &file_validation_proto2_proto_msgTypes[4] + mi := &file_testdata_validation_proto2_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -778,7 +779,7 @@ func (x *ValidationP2PackedRepeated) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidationP2PackedRepeated.ProtoReflect.Descriptor instead. func (*ValidationP2PackedRepeated) Descriptor() ([]byte, []int) { - return file_validation_proto2_proto_rawDescGZIP(), []int{4} + return file_testdata_validation_proto2_proto_rawDescGZIP(), []int{4} } func (x *ValidationP2PackedRepeated) GetId() int64 { @@ -872,227 +873,305 @@ func (x *ValidationP2PackedRepeated) GetEnumRepeated() []Proto2ExampleEnum { return nil } -var File_validation_proto2_proto protoreflect.FileDescriptor - -var file_validation_proto2_proto_rawDesc = []byte{ - 0x0a, 0x17, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x32, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x08, 0x74, 0x65, 0x73, 0x74, 0x64, - 0x61, 0x74, 0x61, 0x22, 0x97, 0x04, 0x0a, 0x14, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x50, 0x32, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x12, 0x21, 0x0a, 0x0c, - 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x02, - 0x28, 0x01, 0x52, 0x0b, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, - 0x1f, 0x0a, 0x0b, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x02, - 0x20, 0x02, 0x28, 0x02, 0x52, 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, - 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, - 0x03, 0x20, 0x02, 0x28, 0x05, 0x52, 0x0a, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, - 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, - 0x18, 0x04, 0x20, 0x02, 0x28, 0x03, 0x52, 0x0a, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x46, 0x69, 0x65, - 0x6c, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x66, 0x69, 0x65, - 0x6c, 0x64, 0x18, 0x05, 0x20, 0x02, 0x28, 0x0d, 0x52, 0x0b, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, - 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, - 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x07, 0x20, 0x02, 0x28, 0x11, 0x52, 0x0b, 0x73, 0x69, 0x6e, - 0x74, 0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x69, 0x6e, 0x74, - 0x36, 0x34, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x08, 0x20, 0x02, 0x28, 0x12, 0x52, 0x0b, - 0x73, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x66, - 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x09, 0x20, 0x02, - 0x28, 0x07, 0x52, 0x0c, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, 0x64, - 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x5f, 0x66, 0x69, 0x65, - 0x6c, 0x64, 0x18, 0x0b, 0x20, 0x02, 0x28, 0x0f, 0x52, 0x0d, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, - 0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x66, 0x69, 0x78, 0x65, - 0x64, 0x36, 0x34, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0c, 0x20, 0x02, 0x28, 0x10, 0x52, - 0x0d, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1d, - 0x0a, 0x0a, 0x62, 0x6f, 0x6f, 0x6c, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0d, 0x20, 0x02, - 0x28, 0x08, 0x52, 0x09, 0x62, 0x6f, 0x6f, 0x6c, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x21, 0x0a, - 0x0c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0e, 0x20, - 0x02, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x65, 0x6c, 0x64, - 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, - 0x0f, 0x20, 0x02, 0x28, 0x0c, 0x52, 0x0a, 0x62, 0x79, 0x74, 0x65, 0x73, 0x46, 0x69, 0x65, 0x6c, - 0x64, 0x12, 0x3a, 0x0a, 0x0a, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, - 0x10, 0x20, 0x02, 0x28, 0x0e, 0x32, 0x1b, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x64, 0x61, 0x74, 0x61, +// Validating the behavior of column annotations to remap from a given +// proto field name to a custom BigQuery column name. +type ValidationP2ColumnAnnotations struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + First *string `protobuf:"bytes,1,opt,name=first" json:"first,omitempty"` + Second *string `protobuf:"bytes,2,opt,name=second" json:"second,omitempty"` + Third *string `protobuf:"bytes,3,opt,name=third" json:"third,omitempty"` +} + +func (x *ValidationP2ColumnAnnotations) Reset() { + *x = ValidationP2ColumnAnnotations{} + if protoimpl.UnsafeEnabled { + mi := &file_testdata_validation_proto2_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ValidationP2ColumnAnnotations) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ValidationP2ColumnAnnotations) ProtoMessage() {} + +func (x *ValidationP2ColumnAnnotations) ProtoReflect() protoreflect.Message { + mi := &file_testdata_validation_proto2_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ValidationP2ColumnAnnotations.ProtoReflect.Descriptor instead. +func (*ValidationP2ColumnAnnotations) Descriptor() ([]byte, []int) { + return file_testdata_validation_proto2_proto_rawDescGZIP(), []int{5} +} + +func (x *ValidationP2ColumnAnnotations) GetFirst() string { + if x != nil && x.First != nil { + return *x.First + } + return "" +} + +func (x *ValidationP2ColumnAnnotations) GetSecond() string { + if x != nil && x.Second != nil { + return *x.Second + } + return "" +} + +func (x *ValidationP2ColumnAnnotations) GetThird() string { + if x != nil && x.Third != nil { + return *x.Third + } + return "" +} + +var File_testdata_validation_proto2_proto protoreflect.FileDescriptor + +var file_testdata_validation_proto2_proto_rawDesc = []byte{ + 0x0a, 0x20, 0x74, 0x65, 0x73, 0x74, 0x64, 0x61, 0x74, 0x61, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x32, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x12, 0x08, 0x74, 0x65, 0x73, 0x74, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x26, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x97, 0x04, 0x0a, 0x14, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x50, 0x32, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x12, 0x21, 0x0a, + 0x0c, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, + 0x02, 0x28, 0x01, 0x52, 0x0b, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, + 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, + 0x02, 0x20, 0x02, 0x28, 0x02, 0x52, 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x46, 0x69, 0x65, 0x6c, + 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, + 0x18, 0x03, 0x20, 0x02, 0x28, 0x05, 0x52, 0x0a, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x65, + 0x6c, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x66, 0x69, 0x65, 0x6c, + 0x64, 0x18, 0x04, 0x20, 0x02, 0x28, 0x03, 0x52, 0x0a, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x46, 0x69, + 0x65, 0x6c, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x66, 0x69, + 0x65, 0x6c, 0x64, 0x18, 0x05, 0x20, 0x02, 0x28, 0x0d, 0x52, 0x0b, 0x75, 0x69, 0x6e, 0x74, 0x33, + 0x32, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x69, 0x6e, 0x74, 0x33, 0x32, + 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x07, 0x20, 0x02, 0x28, 0x11, 0x52, 0x0b, 0x73, 0x69, + 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x69, 0x6e, + 0x74, 0x36, 0x34, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x08, 0x20, 0x02, 0x28, 0x12, 0x52, + 0x0b, 0x73, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x23, 0x0a, 0x0d, + 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x09, 0x20, + 0x02, 0x28, 0x07, 0x52, 0x0c, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, + 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x5f, 0x66, 0x69, + 0x65, 0x6c, 0x64, 0x18, 0x0b, 0x20, 0x02, 0x28, 0x0f, 0x52, 0x0d, 0x73, 0x66, 0x69, 0x78, 0x65, + 0x64, 0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x66, 0x69, 0x78, + 0x65, 0x64, 0x36, 0x34, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0c, 0x20, 0x02, 0x28, 0x10, + 0x52, 0x0d, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, + 0x1d, 0x0a, 0x0a, 0x62, 0x6f, 0x6f, 0x6c, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0d, 0x20, + 0x02, 0x28, 0x08, 0x52, 0x09, 0x62, 0x6f, 0x6f, 0x6c, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x21, + 0x0a, 0x0c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0e, + 0x20, 0x02, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x65, 0x6c, + 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, + 0x18, 0x0f, 0x20, 0x02, 0x28, 0x0c, 0x52, 0x0a, 0x62, 0x79, 0x74, 0x65, 0x73, 0x46, 0x69, 0x65, + 0x6c, 0x64, 0x12, 0x3a, 0x0a, 0x0a, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, + 0x18, 0x10, 0x20, 0x02, 0x28, 0x0e, 0x32, 0x1b, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x32, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x45, + 0x6e, 0x75, 0x6d, 0x52, 0x09, 0x65, 0x6e, 0x75, 0x6d, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x22, 0x97, + 0x04, 0x0a, 0x14, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x32, 0x4f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x6f, 0x75, 0x62, 0x6c, + 0x65, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0b, 0x64, + 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x6c, + 0x6f, 0x61, 0x74, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 0x52, + 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x69, + 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x0a, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1f, 0x0a, 0x0b, + 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x0a, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x21, 0x0a, + 0x0c, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, 0x64, + 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x11, 0x52, 0x0b, 0x73, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, + 0x65, 0x6c, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x66, 0x69, + 0x65, 0x6c, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x12, 0x52, 0x0b, 0x73, 0x69, 0x6e, 0x74, 0x36, + 0x34, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, + 0x32, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x07, 0x52, 0x0c, 0x66, + 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x73, + 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0b, 0x20, + 0x01, 0x28, 0x0f, 0x52, 0x0d, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x46, 0x69, 0x65, + 0x6c, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x5f, 0x66, + 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x10, 0x52, 0x0d, 0x73, 0x66, 0x69, 0x78, + 0x65, 0x64, 0x36, 0x34, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x6f, 0x6f, + 0x6c, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x62, + 0x6f, 0x6f, 0x6c, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x62, + 0x79, 0x74, 0x65, 0x73, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x0a, 0x62, 0x79, 0x74, 0x65, 0x73, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x3a, 0x0a, 0x0a, + 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x1b, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x50, 0x72, 0x6f, 0x74, + 0x6f, 0x32, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x09, 0x65, + 0x6e, 0x75, 0x6d, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x22, 0xff, 0x04, 0x0a, 0x20, 0x56, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x32, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, + 0x6c, 0x57, 0x69, 0x74, 0x68, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x27, 0x0a, + 0x0c, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x01, 0x3a, 0x04, 0x31, 0x2e, 0x31, 0x31, 0x52, 0x0b, 0x64, 0x6f, 0x75, 0x62, 0x6c, + 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x25, 0x0a, 0x0b, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x5f, + 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 0x3a, 0x04, 0x32, 0x2e, 0x32, + 0x32, 0x52, 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x22, 0x0a, + 0x0b, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x05, 0x3a, 0x01, 0x33, 0x52, 0x0a, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, + 0x64, 0x12, 0x22, 0x0a, 0x0b, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x3a, 0x01, 0x34, 0x52, 0x0a, 0x69, 0x6e, 0x74, 0x36, 0x34, + 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x24, 0x0a, 0x0c, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, + 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x3a, 0x01, 0x35, 0x52, 0x0b, + 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x24, 0x0a, 0x0c, 0x73, + 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x11, 0x3a, 0x01, 0x37, 0x52, 0x0b, 0x73, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, + 0x64, 0x12, 0x24, 0x0a, 0x0c, 0x73, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x66, 0x69, 0x65, 0x6c, + 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x12, 0x3a, 0x01, 0x38, 0x52, 0x0b, 0x73, 0x69, 0x6e, 0x74, + 0x36, 0x34, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x26, 0x0a, 0x0d, 0x66, 0x69, 0x78, 0x65, 0x64, + 0x33, 0x32, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x07, 0x3a, 0x01, + 0x39, 0x52, 0x0c, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, + 0x29, 0x0a, 0x0e, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x5f, 0x66, 0x69, 0x65, 0x6c, + 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0f, 0x3a, 0x02, 0x31, 0x31, 0x52, 0x0d, 0x73, 0x66, 0x69, + 0x78, 0x65, 0x64, 0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x29, 0x0a, 0x0e, 0x73, 0x66, + 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0c, 0x20, 0x01, + 0x28, 0x10, 0x3a, 0x02, 0x31, 0x32, 0x52, 0x0d, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, + 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x23, 0x0a, 0x0a, 0x62, 0x6f, 0x6f, 0x6c, 0x5f, 0x66, 0x69, + 0x65, 0x6c, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x04, 0x74, 0x72, 0x75, 0x65, 0x52, + 0x09, 0x62, 0x6f, 0x6f, 0x6c, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x31, 0x0a, 0x0c, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, + 0x3a, 0x0e, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x52, 0x0b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x2f, 0x0a, + 0x0b, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0f, 0x20, 0x01, + 0x28, 0x0c, 0x3a, 0x0e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x62, 0x79, 0x74, + 0x65, 0x73, 0x52, 0x0a, 0x62, 0x79, 0x74, 0x65, 0x73, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x4a, + 0x0a, 0x0a, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x10, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x1b, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x50, 0x72, + 0x6f, 0x74, 0x6f, 0x32, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x45, 0x6e, 0x75, 0x6d, 0x3a, + 0x0e, 0x50, 0x32, 0x5f, 0x4f, 0x54, 0x48, 0x45, 0x52, 0x5f, 0x54, 0x48, 0x49, 0x4e, 0x47, 0x52, + 0x09, 0x65, 0x6e, 0x75, 0x6d, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x22, 0xb3, 0x04, 0x0a, 0x1c, 0x56, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x32, 0x55, 0x6e, 0x70, 0x61, 0x63, + 0x6b, 0x65, 0x64, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x64, + 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x01, 0x52, 0x0e, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x70, 0x65, + 0x61, 0x74, 0x65, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x5f, 0x72, 0x65, + 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x03, 0x28, 0x02, 0x52, 0x0d, 0x66, 0x6c, + 0x6f, 0x61, 0x74, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x69, + 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, + 0x03, 0x28, 0x05, 0x52, 0x0d, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, + 0x65, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x72, 0x65, 0x70, 0x65, + 0x61, 0x74, 0x65, 0x64, 0x18, 0x05, 0x20, 0x03, 0x28, 0x03, 0x52, 0x0d, 0x69, 0x6e, 0x74, 0x36, + 0x34, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x75, 0x69, 0x6e, + 0x74, 0x33, 0x32, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x06, 0x20, 0x03, + 0x28, 0x0d, 0x52, 0x0e, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, + 0x65, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x72, 0x65, 0x70, + 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x07, 0x20, 0x03, 0x28, 0x11, 0x52, 0x0e, 0x73, 0x69, 0x6e, + 0x74, 0x33, 0x32, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x73, + 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x08, + 0x20, 0x03, 0x28, 0x12, 0x52, 0x0e, 0x73, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x52, 0x65, 0x70, 0x65, + 0x61, 0x74, 0x65, 0x64, 0x12, 0x29, 0x0a, 0x10, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x5f, + 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x09, 0x20, 0x03, 0x28, 0x07, 0x52, 0x0f, + 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, + 0x2b, 0x0a, 0x11, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x5f, 0x72, 0x65, 0x70, 0x65, + 0x61, 0x74, 0x65, 0x64, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0f, 0x52, 0x10, 0x73, 0x66, 0x69, 0x78, + 0x65, 0x64, 0x33, 0x32, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x2b, 0x0a, 0x11, + 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, + 0x64, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x10, 0x52, 0x10, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, + 0x34, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x62, 0x6f, 0x6f, + 0x6c, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x08, + 0x52, 0x0c, 0x62, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x40, + 0x0a, 0x0d, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, + 0x0d, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x1b, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x32, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x45, 0x6e, + 0x75, 0x6d, 0x52, 0x0c, 0x65, 0x6e, 0x75, 0x6d, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x22, 0xe1, 0x04, 0x0a, 0x1a, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, + 0x32, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, + 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, + 0x2b, 0x0a, 0x0f, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, + 0x65, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x01, 0x42, 0x02, 0x10, 0x01, 0x52, 0x0e, 0x64, 0x6f, + 0x75, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x29, 0x0a, 0x0e, + 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x02, 0x42, 0x02, 0x10, 0x01, 0x52, 0x0d, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x52, + 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x29, 0x0a, 0x0e, 0x69, 0x6e, 0x74, 0x33, 0x32, + 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, 0x03, 0x28, 0x05, 0x42, + 0x02, 0x10, 0x01, 0x52, 0x0d, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, + 0x65, 0x64, 0x12, 0x29, 0x0a, 0x0e, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x72, 0x65, 0x70, 0x65, + 0x61, 0x74, 0x65, 0x64, 0x18, 0x05, 0x20, 0x03, 0x28, 0x03, 0x42, 0x02, 0x10, 0x01, 0x52, 0x0d, + 0x69, 0x6e, 0x74, 0x36, 0x34, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x2b, 0x0a, + 0x0f, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x18, 0x06, 0x20, 0x03, 0x28, 0x0d, 0x42, 0x02, 0x10, 0x01, 0x52, 0x0e, 0x75, 0x69, 0x6e, 0x74, + 0x33, 0x32, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x2b, 0x0a, 0x0f, 0x73, 0x69, + 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x07, 0x20, + 0x03, 0x28, 0x11, 0x42, 0x02, 0x10, 0x01, 0x52, 0x0e, 0x73, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, + 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x2b, 0x0a, 0x0f, 0x73, 0x69, 0x6e, 0x74, 0x36, + 0x34, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x08, 0x20, 0x03, 0x28, 0x12, + 0x42, 0x02, 0x10, 0x01, 0x52, 0x0e, 0x73, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x52, 0x65, 0x70, 0x65, + 0x61, 0x74, 0x65, 0x64, 0x12, 0x2d, 0x0a, 0x10, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x5f, + 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x09, 0x20, 0x03, 0x28, 0x07, 0x42, 0x02, + 0x10, 0x01, 0x52, 0x0f, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x52, 0x65, 0x70, 0x65, 0x61, + 0x74, 0x65, 0x64, 0x12, 0x2f, 0x0a, 0x11, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x5f, + 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0f, 0x42, 0x02, + 0x10, 0x01, 0x52, 0x10, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x52, 0x65, 0x70, 0x65, + 0x61, 0x74, 0x65, 0x64, 0x12, 0x2f, 0x0a, 0x11, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, + 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x10, 0x42, + 0x02, 0x10, 0x01, 0x52, 0x10, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x52, 0x65, 0x70, + 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x27, 0x0a, 0x0d, 0x62, 0x6f, 0x6f, 0x6c, 0x5f, 0x72, 0x65, + 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x08, 0x42, 0x02, 0x10, 0x01, + 0x52, 0x0c, 0x62, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x44, + 0x0a, 0x0d, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, + 0x0d, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x1b, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x32, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x45, 0x6e, - 0x75, 0x6d, 0x52, 0x09, 0x65, 0x6e, 0x75, 0x6d, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x22, 0x97, 0x04, - 0x0a, 0x14, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x32, 0x4f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, - 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0b, 0x64, 0x6f, - 0x75, 0x62, 0x6c, 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x6c, 0x6f, - 0x61, 0x74, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0a, - 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, - 0x74, 0x33, 0x32, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x0a, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x69, - 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x0a, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x21, 0x0a, 0x0c, - 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x0b, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, - 0x21, 0x0a, 0x0c, 0x73, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x11, 0x52, 0x0b, 0x73, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x65, - 0x6c, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x66, 0x69, 0x65, - 0x6c, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x12, 0x52, 0x0b, 0x73, 0x69, 0x6e, 0x74, 0x36, 0x34, - 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, - 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x07, 0x52, 0x0c, 0x66, 0x69, - 0x78, 0x65, 0x64, 0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x66, - 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0b, 0x20, 0x01, - 0x28, 0x0f, 0x52, 0x0d, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, - 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x5f, 0x66, 0x69, - 0x65, 0x6c, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x10, 0x52, 0x0d, 0x73, 0x66, 0x69, 0x78, 0x65, - 0x64, 0x36, 0x34, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x6f, 0x6f, 0x6c, - 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x62, 0x6f, - 0x6f, 0x6c, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x79, - 0x74, 0x65, 0x73, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x0a, 0x62, 0x79, 0x74, 0x65, 0x73, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x3a, 0x0a, 0x0a, 0x65, - 0x6e, 0x75, 0x6d, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x1b, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x32, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x09, 0x65, 0x6e, - 0x75, 0x6d, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x22, 0xff, 0x04, 0x0a, 0x20, 0x56, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x32, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, - 0x57, 0x69, 0x74, 0x68, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x27, 0x0a, 0x0c, - 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x01, 0x3a, 0x04, 0x31, 0x2e, 0x31, 0x31, 0x52, 0x0b, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, - 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x25, 0x0a, 0x0b, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x5f, 0x66, - 0x69, 0x65, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 0x3a, 0x04, 0x32, 0x2e, 0x32, 0x32, - 0x52, 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x22, 0x0a, 0x0b, - 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x05, 0x3a, 0x01, 0x33, 0x52, 0x0a, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, 0x64, - 0x12, 0x22, 0x0a, 0x0b, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x03, 0x3a, 0x01, 0x34, 0x52, 0x0a, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x46, - 0x69, 0x65, 0x6c, 0x64, 0x12, 0x24, 0x0a, 0x0c, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x66, - 0x69, 0x65, 0x6c, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x3a, 0x01, 0x35, 0x52, 0x0b, 0x75, - 0x69, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x24, 0x0a, 0x0c, 0x73, 0x69, - 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x11, - 0x3a, 0x01, 0x37, 0x52, 0x0b, 0x73, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, 0x64, - 0x12, 0x24, 0x0a, 0x0c, 0x73, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x12, 0x3a, 0x01, 0x38, 0x52, 0x0b, 0x73, 0x69, 0x6e, 0x74, 0x36, - 0x34, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x26, 0x0a, 0x0d, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, - 0x32, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x07, 0x3a, 0x01, 0x39, - 0x52, 0x0c, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x29, - 0x0a, 0x0e, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, - 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0f, 0x3a, 0x02, 0x31, 0x31, 0x52, 0x0d, 0x73, 0x66, 0x69, 0x78, - 0x65, 0x64, 0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x29, 0x0a, 0x0e, 0x73, 0x66, 0x69, - 0x78, 0x65, 0x64, 0x36, 0x34, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, - 0x10, 0x3a, 0x02, 0x31, 0x32, 0x52, 0x0d, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x46, - 0x69, 0x65, 0x6c, 0x64, 0x12, 0x23, 0x0a, 0x0a, 0x62, 0x6f, 0x6f, 0x6c, 0x5f, 0x66, 0x69, 0x65, - 0x6c, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x04, 0x74, 0x72, 0x75, 0x65, 0x52, 0x09, - 0x62, 0x6f, 0x6f, 0x6c, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x31, 0x0a, 0x0c, 0x73, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x3a, - 0x0e, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, - 0x0b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x2f, 0x0a, 0x0b, - 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, - 0x0c, 0x3a, 0x0e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x62, 0x79, 0x74, 0x65, - 0x73, 0x52, 0x0a, 0x62, 0x79, 0x74, 0x65, 0x73, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x4a, 0x0a, - 0x0a, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x10, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x1b, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x50, 0x72, 0x6f, - 0x74, 0x6f, 0x32, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x45, 0x6e, 0x75, 0x6d, 0x3a, 0x0e, - 0x50, 0x32, 0x5f, 0x4f, 0x54, 0x48, 0x45, 0x52, 0x5f, 0x54, 0x48, 0x49, 0x4e, 0x47, 0x52, 0x09, - 0x65, 0x6e, 0x75, 0x6d, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x22, 0xb3, 0x04, 0x0a, 0x1c, 0x56, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x32, 0x55, 0x6e, 0x70, 0x61, 0x63, 0x6b, - 0x65, 0x64, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x64, 0x6f, - 0x75, 0x62, 0x6c, 0x65, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x01, 0x52, 0x0e, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x70, 0x65, 0x61, - 0x74, 0x65, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x5f, 0x72, 0x65, 0x70, - 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x03, 0x28, 0x02, 0x52, 0x0d, 0x66, 0x6c, 0x6f, - 0x61, 0x74, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x69, 0x6e, - 0x74, 0x33, 0x32, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, 0x03, - 0x28, 0x05, 0x52, 0x0d, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, - 0x74, 0x65, 0x64, 0x18, 0x05, 0x20, 0x03, 0x28, 0x03, 0x52, 0x0d, 0x69, 0x6e, 0x74, 0x36, 0x34, - 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x75, 0x69, 0x6e, 0x74, - 0x33, 0x32, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x06, 0x20, 0x03, 0x28, - 0x0d, 0x52, 0x0e, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x72, 0x65, 0x70, 0x65, - 0x61, 0x74, 0x65, 0x64, 0x18, 0x07, 0x20, 0x03, 0x28, 0x11, 0x52, 0x0e, 0x73, 0x69, 0x6e, 0x74, - 0x33, 0x32, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x69, - 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x08, 0x20, - 0x03, 0x28, 0x12, 0x52, 0x0e, 0x73, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x52, 0x65, 0x70, 0x65, 0x61, - 0x74, 0x65, 0x64, 0x12, 0x29, 0x0a, 0x10, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x5f, 0x72, - 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x09, 0x20, 0x03, 0x28, 0x07, 0x52, 0x0f, 0x66, - 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x2b, - 0x0a, 0x11, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, - 0x74, 0x65, 0x64, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0f, 0x52, 0x10, 0x73, 0x66, 0x69, 0x78, 0x65, - 0x64, 0x33, 0x32, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x2b, 0x0a, 0x11, 0x73, - 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, - 0x18, 0x0b, 0x20, 0x03, 0x28, 0x10, 0x52, 0x10, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, - 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x62, 0x6f, 0x6f, 0x6c, - 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x08, 0x52, - 0x0c, 0x62, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x40, 0x0a, - 0x0d, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x0d, - 0x20, 0x03, 0x28, 0x0e, 0x32, 0x1b, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x32, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x45, 0x6e, 0x75, - 0x6d, 0x52, 0x0c, 0x65, 0x6e, 0x75, 0x6d, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x22, - 0xe1, 0x04, 0x0a, 0x1a, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x32, - 0x50, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x0e, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2b, - 0x0a, 0x0f, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x01, 0x42, 0x02, 0x10, 0x01, 0x52, 0x0e, 0x64, 0x6f, 0x75, - 0x62, 0x6c, 0x65, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x29, 0x0a, 0x0e, 0x66, - 0x6c, 0x6f, 0x61, 0x74, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, - 0x03, 0x28, 0x02, 0x42, 0x02, 0x10, 0x01, 0x52, 0x0d, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x52, 0x65, - 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x29, 0x0a, 0x0e, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, - 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, 0x03, 0x28, 0x05, 0x42, 0x02, - 0x10, 0x01, 0x52, 0x0d, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x12, 0x29, 0x0a, 0x0e, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, - 0x74, 0x65, 0x64, 0x18, 0x05, 0x20, 0x03, 0x28, 0x03, 0x42, 0x02, 0x10, 0x01, 0x52, 0x0d, 0x69, - 0x6e, 0x74, 0x36, 0x34, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x2b, 0x0a, 0x0f, - 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, - 0x06, 0x20, 0x03, 0x28, 0x0d, 0x42, 0x02, 0x10, 0x01, 0x52, 0x0e, 0x75, 0x69, 0x6e, 0x74, 0x33, - 0x32, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x2b, 0x0a, 0x0f, 0x73, 0x69, 0x6e, - 0x74, 0x33, 0x32, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x07, 0x20, 0x03, - 0x28, 0x11, 0x42, 0x02, 0x10, 0x01, 0x52, 0x0e, 0x73, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x65, - 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x2b, 0x0a, 0x0f, 0x73, 0x69, 0x6e, 0x74, 0x36, 0x34, - 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x08, 0x20, 0x03, 0x28, 0x12, 0x42, - 0x02, 0x10, 0x01, 0x52, 0x0e, 0x73, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x52, 0x65, 0x70, 0x65, 0x61, - 0x74, 0x65, 0x64, 0x12, 0x2d, 0x0a, 0x10, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x5f, 0x72, - 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x09, 0x20, 0x03, 0x28, 0x07, 0x42, 0x02, 0x10, - 0x01, 0x52, 0x0f, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, - 0x65, 0x64, 0x12, 0x2f, 0x0a, 0x11, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x5f, 0x72, - 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0f, 0x42, 0x02, 0x10, - 0x01, 0x52, 0x10, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x52, 0x65, 0x70, 0x65, 0x61, - 0x74, 0x65, 0x64, 0x12, 0x2f, 0x0a, 0x11, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x5f, - 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x10, 0x42, 0x02, - 0x10, 0x01, 0x52, 0x10, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x52, 0x65, 0x70, 0x65, - 0x61, 0x74, 0x65, 0x64, 0x12, 0x27, 0x0a, 0x0d, 0x62, 0x6f, 0x6f, 0x6c, 0x5f, 0x72, 0x65, 0x70, - 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x08, 0x42, 0x02, 0x10, 0x01, 0x52, - 0x0c, 0x62, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x44, 0x0a, - 0x0d, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x0d, - 0x20, 0x03, 0x28, 0x0e, 0x32, 0x1b, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x32, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x45, 0x6e, 0x75, - 0x6d, 0x42, 0x02, 0x10, 0x01, 0x52, 0x0c, 0x65, 0x6e, 0x75, 0x6d, 0x52, 0x65, 0x70, 0x65, 0x61, - 0x74, 0x65, 0x64, 0x2a, 0x5b, 0x0a, 0x11, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x32, 0x45, 0x78, 0x61, - 0x6d, 0x70, 0x6c, 0x65, 0x45, 0x6e, 0x75, 0x6d, 0x12, 0x10, 0x0a, 0x0c, 0x50, 0x32, 0x5f, 0x55, - 0x4e, 0x44, 0x45, 0x46, 0x49, 0x4e, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x50, 0x32, - 0x5f, 0x54, 0x48, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x50, 0x32, 0x5f, 0x4f, - 0x54, 0x48, 0x45, 0x52, 0x5f, 0x54, 0x48, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x12, 0x0a, 0x0e, - 0x50, 0x32, 0x5f, 0x54, 0x48, 0x49, 0x52, 0x44, 0x5f, 0x54, 0x48, 0x49, 0x4e, 0x47, 0x10, 0x03, - 0x42, 0x3d, 0x5a, 0x3b, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x67, 0x71, 0x75, 0x65, 0x72, 0x79, - 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, - 0x77, 0x72, 0x69, 0x74, 0x65, 0x72, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x64, 0x61, 0x74, 0x61, + 0x75, 0x6d, 0x42, 0x02, 0x10, 0x01, 0x52, 0x0c, 0x65, 0x6e, 0x75, 0x6d, 0x52, 0x65, 0x70, 0x65, + 0x61, 0x74, 0x65, 0x64, 0x22, 0x81, 0x01, 0x0a, 0x1d, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x50, 0x32, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x41, 0x6e, 0x6e, 0x6f, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69, 0x72, 0x73, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, 0x72, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x06, + 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0e, 0xaa, 0x9b, + 0xbc, 0xc7, 0x0d, 0x08, 0xf0, 0x9f, 0x98, 0x8e, 0xf0, 0x9f, 0x94, 0xa5, 0x52, 0x06, 0x73, 0x65, + 0x63, 0x6f, 0x6e, 0x64, 0x12, 0x22, 0x0a, 0x05, 0x74, 0x68, 0x69, 0x72, 0x64, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x0c, 0xaa, 0x9b, 0xbc, 0xc7, 0x0d, 0x06, 0x73, 0x65, 0x63, 0x6f, 0x6e, + 0x64, 0x52, 0x05, 0x74, 0x68, 0x69, 0x72, 0x64, 0x2a, 0x5b, 0x0a, 0x11, 0x50, 0x72, 0x6f, 0x74, + 0x6f, 0x32, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x45, 0x6e, 0x75, 0x6d, 0x12, 0x10, 0x0a, + 0x0c, 0x50, 0x32, 0x5f, 0x55, 0x4e, 0x44, 0x45, 0x46, 0x49, 0x4e, 0x45, 0x44, 0x10, 0x00, 0x12, + 0x0c, 0x0a, 0x08, 0x50, 0x32, 0x5f, 0x54, 0x48, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x12, 0x0a, + 0x0e, 0x50, 0x32, 0x5f, 0x4f, 0x54, 0x48, 0x45, 0x52, 0x5f, 0x54, 0x48, 0x49, 0x4e, 0x47, 0x10, + 0x02, 0x12, 0x12, 0x0a, 0x0e, 0x50, 0x32, 0x5f, 0x54, 0x48, 0x49, 0x52, 0x44, 0x5f, 0x54, 0x48, + 0x49, 0x4e, 0x47, 0x10, 0x03, 0x42, 0x3d, 0x5a, 0x3b, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x67, + 0x71, 0x75, 0x65, 0x72, 0x79, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2f, 0x6d, 0x61, + 0x6e, 0x61, 0x67, 0x65, 0x64, 0x77, 0x72, 0x69, 0x74, 0x65, 0x72, 0x2f, 0x74, 0x65, 0x73, 0x74, + 0x64, 0x61, 0x74, 0x61, } var ( - file_validation_proto2_proto_rawDescOnce sync.Once - file_validation_proto2_proto_rawDescData = file_validation_proto2_proto_rawDesc + file_testdata_validation_proto2_proto_rawDescOnce sync.Once + file_testdata_validation_proto2_proto_rawDescData = file_testdata_validation_proto2_proto_rawDesc ) -func file_validation_proto2_proto_rawDescGZIP() []byte { - file_validation_proto2_proto_rawDescOnce.Do(func() { - file_validation_proto2_proto_rawDescData = protoimpl.X.CompressGZIP(file_validation_proto2_proto_rawDescData) +func file_testdata_validation_proto2_proto_rawDescGZIP() []byte { + file_testdata_validation_proto2_proto_rawDescOnce.Do(func() { + file_testdata_validation_proto2_proto_rawDescData = protoimpl.X.CompressGZIP(file_testdata_validation_proto2_proto_rawDescData) }) - return file_validation_proto2_proto_rawDescData + return file_testdata_validation_proto2_proto_rawDescData } -var file_validation_proto2_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_validation_proto2_proto_msgTypes = make([]protoimpl.MessageInfo, 5) -var file_validation_proto2_proto_goTypes = []interface{}{ +var file_testdata_validation_proto2_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_testdata_validation_proto2_proto_msgTypes = make([]protoimpl.MessageInfo, 6) +var file_testdata_validation_proto2_proto_goTypes = []interface{}{ (Proto2ExampleEnum)(0), // 0: testdata.Proto2ExampleEnum (*ValidationP2Required)(nil), // 1: testdata.ValidationP2Required (*ValidationP2Optional)(nil), // 2: testdata.ValidationP2Optional (*ValidationP2OptionalWithDefaults)(nil), // 3: testdata.ValidationP2OptionalWithDefaults (*ValidationP2UnpackedRepeated)(nil), // 4: testdata.ValidationP2UnpackedRepeated (*ValidationP2PackedRepeated)(nil), // 5: testdata.ValidationP2PackedRepeated + (*ValidationP2ColumnAnnotations)(nil), // 6: testdata.ValidationP2ColumnAnnotations } -var file_validation_proto2_proto_depIdxs = []int32{ +var file_testdata_validation_proto2_proto_depIdxs = []int32{ 0, // 0: testdata.ValidationP2Required.enum_field:type_name -> testdata.Proto2ExampleEnum 0, // 1: testdata.ValidationP2Optional.enum_field:type_name -> testdata.Proto2ExampleEnum 0, // 2: testdata.ValidationP2OptionalWithDefaults.enum_field:type_name -> testdata.Proto2ExampleEnum @@ -1105,13 +1184,13 @@ var file_validation_proto2_proto_depIdxs = []int32{ 0, // [0:5] is the sub-list for field type_name } -func init() { file_validation_proto2_proto_init() } -func file_validation_proto2_proto_init() { - if File_validation_proto2_proto != nil { +func init() { file_testdata_validation_proto2_proto_init() } +func file_testdata_validation_proto2_proto_init() { + if File_testdata_validation_proto2_proto != nil { return } if !protoimpl.UnsafeEnabled { - file_validation_proto2_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + file_testdata_validation_proto2_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ValidationP2Required); i { case 0: return &v.state @@ -1123,7 +1202,7 @@ func file_validation_proto2_proto_init() { return nil } } - file_validation_proto2_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + file_testdata_validation_proto2_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ValidationP2Optional); i { case 0: return &v.state @@ -1135,7 +1214,7 @@ func file_validation_proto2_proto_init() { return nil } } - file_validation_proto2_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + file_testdata_validation_proto2_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ValidationP2OptionalWithDefaults); i { case 0: return &v.state @@ -1147,7 +1226,7 @@ func file_validation_proto2_proto_init() { return nil } } - file_validation_proto2_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + file_testdata_validation_proto2_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ValidationP2UnpackedRepeated); i { case 0: return &v.state @@ -1159,7 +1238,7 @@ func file_validation_proto2_proto_init() { return nil } } - file_validation_proto2_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + file_testdata_validation_proto2_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ValidationP2PackedRepeated); i { case 0: return &v.state @@ -1171,24 +1250,36 @@ func file_validation_proto2_proto_init() { return nil } } + file_testdata_validation_proto2_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ValidationP2ColumnAnnotations); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_validation_proto2_proto_rawDesc, + RawDescriptor: file_testdata_validation_proto2_proto_rawDesc, NumEnums: 1, - NumMessages: 5, + NumMessages: 6, NumExtensions: 0, NumServices: 0, }, - GoTypes: file_validation_proto2_proto_goTypes, - DependencyIndexes: file_validation_proto2_proto_depIdxs, - EnumInfos: file_validation_proto2_proto_enumTypes, - MessageInfos: file_validation_proto2_proto_msgTypes, + GoTypes: file_testdata_validation_proto2_proto_goTypes, + DependencyIndexes: file_testdata_validation_proto2_proto_depIdxs, + EnumInfos: file_testdata_validation_proto2_proto_enumTypes, + MessageInfos: file_testdata_validation_proto2_proto_msgTypes, }.Build() - File_validation_proto2_proto = out.File - file_validation_proto2_proto_rawDesc = nil - file_validation_proto2_proto_goTypes = nil - file_validation_proto2_proto_depIdxs = nil + File_testdata_validation_proto2_proto = out.File + file_testdata_validation_proto2_proto_rawDesc = nil + file_testdata_validation_proto2_proto_goTypes = nil + file_testdata_validation_proto2_proto_depIdxs = nil } diff --git a/bigquery/storage/managedwriter/testdata/validation_proto2.proto b/bigquery/storage/managedwriter/testdata/validation_proto2.proto index 7cf932385a9..f63d5ce1fb2 100644 --- a/bigquery/storage/managedwriter/testdata/validation_proto2.proto +++ b/bigquery/storage/managedwriter/testdata/validation_proto2.proto @@ -15,6 +15,9 @@ syntax = "proto2"; package testdata; + +import "internal/annotations/annotations.proto"; + option go_package = "cloud.google.com/go/bigquery/storage/managedwriter/testdata"; @@ -120,4 +123,12 @@ message ValidationP2PackedRepeated { repeated sfixed64 sfixed64_repeated = 11 [packed = true]; repeated bool bool_repeated = 12 [packed = true]; repeated Proto2ExampleEnum enum_repeated = 13 [packed = true]; +} + +// Validating the behavior of column annotations to remap from a given +// proto field name to a custom BigQuery column name. +message ValidationP2ColumnAnnotations { + optional string first = 1; + optional string second = 2 [(google.cloud.bigquery.storage.v1.column_name) = "😎🔥"]; + optional string third = 3 [(google.cloud.bigquery.storage.v1.column_name) = "second"]; } \ No newline at end of file diff --git a/bigquery/storage/managedwriter/validation_test.go b/bigquery/storage/managedwriter/validation_test.go index 24b1ef69448..57815978e0d 100644 --- a/bigquery/storage/managedwriter/validation_test.go +++ b/bigquery/storage/managedwriter/validation_test.go @@ -388,6 +388,21 @@ func TestValidation_Values(t *testing.T) { withIntegerArraySum("enum_repeated", 7, 1), }, }, + { + description: "proto2 w/column annotations", + tableSchema: testdata.ValidationColumnAnnotations, + inputRow: &testdata.ValidationP2ColumnAnnotations{ + First: proto.String("first_val"), + Second: proto.String("second_val"), + Third: proto.String("third_val"), + }, + constraints: []constraintOption{ + withExactRowCount(1), + withStringValueCount("first", "first_val", 1), + withStringValueCount("second", "third_val", 1), + withStringValueCount("😎🔥", "second_val", 1), + }, + }, } // Common setup. From 70390f8569607ba68885ce94b77dd4be33500b94 Mon Sep 17 00:00:00 2001 From: Seth Hollyman Date: Tue, 23 Aug 2022 21:05:26 +0000 Subject: [PATCH 04/15] update expectations - no emojis, sadly --- .../internal/annotations/annotations.pb.go | 14 ++++++++ .../internal/annotations/annotations.proto | 14 ++++++++ .../storage/managedwriter/testdata/schemas.go | 2 +- .../testdata/validation_proto2.pb.go | 34 +++++++++---------- .../testdata/validation_proto2.proto | 2 +- .../storage/managedwriter/validation_test.go | 2 +- 6 files changed, 48 insertions(+), 20 deletions(-) diff --git a/bigquery/storage/managedwriter/internal/annotations/annotations.pb.go b/bigquery/storage/managedwriter/internal/annotations/annotations.pb.go index 26b6238f925..64aab99d364 100644 --- a/bigquery/storage/managedwriter/internal/annotations/annotations.pb.go +++ b/bigquery/storage/managedwriter/internal/annotations/annotations.pb.go @@ -1,3 +1,17 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.28.0 diff --git a/bigquery/storage/managedwriter/internal/annotations/annotations.proto b/bigquery/storage/managedwriter/internal/annotations/annotations.proto index fb37603e88c..0600329fcd3 100644 --- a/bigquery/storage/managedwriter/internal/annotations/annotations.proto +++ b/bigquery/storage/managedwriter/internal/annotations/annotations.proto @@ -1,3 +1,17 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + syntax = "proto3"; package google.cloud.bigquery.storage.v1; diff --git a/bigquery/storage/managedwriter/testdata/schemas.go b/bigquery/storage/managedwriter/testdata/schemas.go index 111d92a3b87..a31679d7d48 100644 --- a/bigquery/storage/managedwriter/testdata/schemas.go +++ b/bigquery/storage/managedwriter/testdata/schemas.go @@ -268,7 +268,7 @@ var ( Type: bigquery.StringFieldType, }, { - Name: "😎🔥", + Name: "特別コラム", Type: bigquery.StringFieldType, }, } diff --git a/bigquery/storage/managedwriter/testdata/validation_proto2.pb.go b/bigquery/storage/managedwriter/testdata/validation_proto2.pb.go index ef8866ee632..8648507e046 100644 --- a/bigquery/storage/managedwriter/testdata/validation_proto2.pb.go +++ b/bigquery/storage/managedwriter/testdata/validation_proto2.pb.go @@ -1127,25 +1127,25 @@ var file_testdata_validation_proto2_proto_rawDesc = []byte{ 0x0d, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x1b, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x32, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x45, 0x6e, 0x75, 0x6d, 0x42, 0x02, 0x10, 0x01, 0x52, 0x0c, 0x65, 0x6e, 0x75, 0x6d, 0x52, 0x65, 0x70, 0x65, - 0x61, 0x74, 0x65, 0x64, 0x22, 0x81, 0x01, 0x0a, 0x1d, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x61, 0x74, 0x65, 0x64, 0x22, 0x88, 0x01, 0x0a, 0x1d, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x32, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69, 0x72, 0x73, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, 0x72, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x06, - 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0e, 0xaa, 0x9b, - 0xbc, 0xc7, 0x0d, 0x08, 0xf0, 0x9f, 0x98, 0x8e, 0xf0, 0x9f, 0x94, 0xa5, 0x52, 0x06, 0x73, 0x65, - 0x63, 0x6f, 0x6e, 0x64, 0x12, 0x22, 0x0a, 0x05, 0x74, 0x68, 0x69, 0x72, 0x64, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x42, 0x0c, 0xaa, 0x9b, 0xbc, 0xc7, 0x0d, 0x06, 0x73, 0x65, 0x63, 0x6f, 0x6e, - 0x64, 0x52, 0x05, 0x74, 0x68, 0x69, 0x72, 0x64, 0x2a, 0x5b, 0x0a, 0x11, 0x50, 0x72, 0x6f, 0x74, - 0x6f, 0x32, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x45, 0x6e, 0x75, 0x6d, 0x12, 0x10, 0x0a, - 0x0c, 0x50, 0x32, 0x5f, 0x55, 0x4e, 0x44, 0x45, 0x46, 0x49, 0x4e, 0x45, 0x44, 0x10, 0x00, 0x12, - 0x0c, 0x0a, 0x08, 0x50, 0x32, 0x5f, 0x54, 0x48, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x12, 0x0a, - 0x0e, 0x50, 0x32, 0x5f, 0x4f, 0x54, 0x48, 0x45, 0x52, 0x5f, 0x54, 0x48, 0x49, 0x4e, 0x47, 0x10, - 0x02, 0x12, 0x12, 0x0a, 0x0e, 0x50, 0x32, 0x5f, 0x54, 0x48, 0x49, 0x52, 0x44, 0x5f, 0x54, 0x48, - 0x49, 0x4e, 0x47, 0x10, 0x03, 0x42, 0x3d, 0x5a, 0x3b, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x67, - 0x71, 0x75, 0x65, 0x72, 0x79, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2f, 0x6d, 0x61, - 0x6e, 0x61, 0x67, 0x65, 0x64, 0x77, 0x72, 0x69, 0x74, 0x65, 0x72, 0x2f, 0x74, 0x65, 0x73, 0x74, - 0x64, 0x61, 0x74, 0x61, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, 0x72, 0x73, 0x74, 0x12, 0x2d, 0x0a, 0x06, + 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x15, 0xaa, 0x9b, + 0xbc, 0xc7, 0x0d, 0x0f, 0xe7, 0x89, 0xb9, 0xe5, 0x88, 0xa5, 0xe3, 0x82, 0xb3, 0xe3, 0x83, 0xa9, + 0xe3, 0x83, 0xa0, 0x52, 0x06, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x12, 0x22, 0x0a, 0x05, 0x74, + 0x68, 0x69, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0c, 0xaa, 0x9b, 0xbc, 0xc7, + 0x0d, 0x06, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x52, 0x05, 0x74, 0x68, 0x69, 0x72, 0x64, 0x2a, + 0x5b, 0x0a, 0x11, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x32, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, + 0x45, 0x6e, 0x75, 0x6d, 0x12, 0x10, 0x0a, 0x0c, 0x50, 0x32, 0x5f, 0x55, 0x4e, 0x44, 0x45, 0x46, + 0x49, 0x4e, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x50, 0x32, 0x5f, 0x54, 0x48, 0x49, + 0x4e, 0x47, 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x50, 0x32, 0x5f, 0x4f, 0x54, 0x48, 0x45, 0x52, + 0x5f, 0x54, 0x48, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x12, 0x0a, 0x0e, 0x50, 0x32, 0x5f, 0x54, + 0x48, 0x49, 0x52, 0x44, 0x5f, 0x54, 0x48, 0x49, 0x4e, 0x47, 0x10, 0x03, 0x42, 0x3d, 0x5a, 0x3b, + 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x67, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2f, 0x73, 0x74, 0x6f, + 0x72, 0x61, 0x67, 0x65, 0x2f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x77, 0x72, 0x69, 0x74, + 0x65, 0x72, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x64, 0x61, 0x74, 0x61, } var ( diff --git a/bigquery/storage/managedwriter/testdata/validation_proto2.proto b/bigquery/storage/managedwriter/testdata/validation_proto2.proto index f63d5ce1fb2..8191f8fac3e 100644 --- a/bigquery/storage/managedwriter/testdata/validation_proto2.proto +++ b/bigquery/storage/managedwriter/testdata/validation_proto2.proto @@ -129,6 +129,6 @@ message ValidationP2PackedRepeated { // proto field name to a custom BigQuery column name. message ValidationP2ColumnAnnotations { optional string first = 1; - optional string second = 2 [(google.cloud.bigquery.storage.v1.column_name) = "😎🔥"]; + optional string second = 2 [(google.cloud.bigquery.storage.v1.column_name) = "特別コラム"]; optional string third = 3 [(google.cloud.bigquery.storage.v1.column_name) = "second"]; } \ No newline at end of file diff --git a/bigquery/storage/managedwriter/validation_test.go b/bigquery/storage/managedwriter/validation_test.go index 57815978e0d..f8c6e28264b 100644 --- a/bigquery/storage/managedwriter/validation_test.go +++ b/bigquery/storage/managedwriter/validation_test.go @@ -400,7 +400,7 @@ func TestValidation_Values(t *testing.T) { withExactRowCount(1), withStringValueCount("first", "first_val", 1), withStringValueCount("second", "third_val", 1), - withStringValueCount("😎🔥", "second_val", 1), + withStringValueCount("特別コラム", "second_val", 1), }, }, } From ffbae4e16c6ab880c6a80429623f6ad7733b5c1e Mon Sep 17 00:00:00 2001 From: Seth Hollyman Date: Wed, 31 Aug 2022 16:07:20 +0000 Subject: [PATCH 05/15] additional error checking --- bigquery/schema_test.go | 33 +++++++++++++++++++ .../storage/managedwriter/validation_test.go | 19 +++++++++++ 2 files changed, 52 insertions(+) diff --git a/bigquery/schema_test.go b/bigquery/schema_test.go index d3ca8f7fa70..74e4a045104 100644 --- a/bigquery/schema_test.go +++ b/bigquery/schema_test.go @@ -1326,3 +1326,36 @@ func TestSchemaToJSONFields(t *testing.T) { } } } + +func TestUnicodeSchemaConversion(t *testing.T) { + + tableMeta := &TableMetadata{ + Schema: Schema{ + { + Name: "first", + Type: StringFieldType, + }, + { + Name: "second", + Type: StringFieldType, + }, + { + Name: "\u7279\u5225\u30b3\u30e9\u30e0", + Type: StringFieldType, + }, + { + Name: "特別コラム", + Type: IntegerFieldType, + }, + }, + } + bqTable, err := tableMeta.toBQ() + if err != nil { + t.Fatalf("toBQ(): %v", err) + } + b, err := bqTable.MarshalJSON() + if err != nil { + t.Fatalf("MarshalJSON: %v", err) + } + t.Logf("JSON: %s", string(b)) +} diff --git a/bigquery/storage/managedwriter/validation_test.go b/bigquery/storage/managedwriter/validation_test.go index f8c6e28264b..fb1da744a35 100644 --- a/bigquery/storage/managedwriter/validation_test.go +++ b/bigquery/storage/managedwriter/validation_test.go @@ -22,6 +22,8 @@ import ( "cloud.google.com/go/bigquery" "cloud.google.com/go/bigquery/storage/managedwriter/adapt" "cloud.google.com/go/bigquery/storage/managedwriter/testdata" + "github.com/googleapis/gax-go/v2/apierror" + storagepb "google.golang.org/genproto/googleapis/cloud/bigquery/storage/v1" "google.golang.org/protobuf/proto" "google.golang.org/protobuf/reflect/protodesc" "google.golang.org/protobuf/reflect/protoreflect" @@ -427,6 +429,12 @@ func TestValidation_Values(t *testing.T) { continue } + if meta, err := testTable.Metadata(ctx); err == nil { + for n, field := range meta.Schema { + t.Logf("(%s) field %d: %s", tc.description, n, field.Name) + } + } + // normalize the proto schema based on the provided message. descriptor, err := adapt.NormalizeDescriptor(tc.inputRow.ProtoReflect().Descriptor()) if err != nil { @@ -458,6 +466,17 @@ func TestValidation_Values(t *testing.T) { } if _, err = result.GetResult(ctx); err != nil { t.Errorf("%s append response error: %v", tc.description, err) + if apiErr, ok := apierror.FromError(err); ok { + t.Errorf("dbg: %+v", apiErr.Details().DebugInfo) + // We now have an instance of APIError, which directly exposes more specific + // details about multiple failure conditions include transport-level errors. + storageErr := &storagepb.StorageError{} + if e := apiErr.Details().ExtractProtoMessage(storageErr); e == nil { + // storageErr now contains service-specific information about the error. + t.Errorf("Received service-specific error code %s", storageErr.GetCode().String()) + t.Errorf("Msg: %s", storageErr.GetErrorMessage()) + } + } continue } // Validate table. From 65a7f2a71f9c3fbb3da5e3b87bf399a0c164808b Mon Sep 17 00:00:00 2001 From: Seth Hollyman Date: Fri, 9 Sep 2022 19:44:00 +0000 Subject: [PATCH 06/15] use quoted literals in validation builder, cleanup extraneous logging --- .../storage/managedwriter/testutils_test.go | 38 +++++++++---------- .../storage/managedwriter/validation_test.go | 8 +--- 2 files changed, 20 insertions(+), 26 deletions(-) diff --git a/bigquery/storage/managedwriter/testutils_test.go b/bigquery/storage/managedwriter/testutils_test.go index 96784e5bad4..97f876776f2 100644 --- a/bigquery/storage/managedwriter/testutils_test.go +++ b/bigquery/storage/managedwriter/testutils_test.go @@ -44,7 +44,7 @@ func validateTableConstraints(ctx context.Context, t *testing.T, client *bigquer var i int for _, c := range vi.constraints { if i > 0 { - sql.WriteString(",") + sql.WriteString(",\n") } sql.WriteString(c.projection) i++ @@ -53,7 +53,7 @@ func validateTableConstraints(ctx context.Context, t *testing.T, client *bigquer q := client.Query(sql.String()) it, err := q.Read(ctx) if err != nil { - t.Errorf("%q: failed to issue validation query: %v", description, err) + t.Errorf("%q: failed to issue validation query: %v\nSQL: %s", description, err, sql.String()) return } var resultrow []bigquery.Value @@ -120,7 +120,7 @@ func withExactRowCount(totalRows int64) constraintOption { return func(vi *validationInfo) { resultCol := "total_rows" vi.constraints[resultCol] = &constraint{ - projection: fmt.Sprintf("COUNT(1) AS %s", resultCol), + projection: fmt.Sprintf("COUNT(1) AS `%s`", resultCol), expectedValue: totalRows, } } @@ -131,7 +131,7 @@ func withNullCount(colname string, nullCount int64) constraintOption { return func(vi *validationInfo) { resultCol := fmt.Sprintf("nullcol_count_%s", colname) vi.constraints[resultCol] = &constraint{ - projection: fmt.Sprintf("SUM(IF(%s IS NULL,1,0)) AS %s", colname, resultCol), + projection: fmt.Sprintf("SUM(IF(`%s` IS NULL,1,0)) AS `%s`", colname, resultCol), expectedValue: nullCount, } } @@ -142,7 +142,7 @@ func withNonNullCount(colname string, nonNullCount int64) constraintOption { return func(vi *validationInfo) { resultCol := fmt.Sprintf("nonnullcol_count_%s", colname) vi.constraints[resultCol] = &constraint{ - projection: fmt.Sprintf("SUM(IF(%s IS NOT NULL,1,0)) AS %s", colname, resultCol), + projection: fmt.Sprintf("SUM(IF(`%s` IS NOT NULL,1,0)) AS `%s`", colname, resultCol), expectedValue: nonNullCount, } } @@ -153,7 +153,7 @@ func withDistinctValues(colname string, distinctVals int64) constraintOption { return func(vi *validationInfo) { resultCol := fmt.Sprintf("distinct_count_%s", colname) vi.constraints[resultCol] = &constraint{ - projection: fmt.Sprintf("COUNT(DISTINCT %s) AS %s", colname, resultCol), + projection: fmt.Sprintf("COUNT(DISTINCT `%s`) AS `%s`", colname, resultCol), expectedValue: distinctVals, } } @@ -164,7 +164,7 @@ func withApproxDistinctValues(colname string, approxValues int64, errorBound int return func(vi *validationInfo) { resultCol := fmt.Sprintf("distinct_count_%s", colname) vi.constraints[resultCol] = &constraint{ - projection: fmt.Sprintf("APPROX_COUNT_DISTINCT(%s) AS %s", colname, resultCol), + projection: fmt.Sprintf("APPROX_COUNT_DISTINCT(`%s`) AS `%s`", colname, resultCol), expectedValue: approxValues, allowedError: errorBound, } @@ -176,7 +176,7 @@ func withIntegerValueCount(colname string, wantValue int64, valueCount int64) co return func(vi *validationInfo) { resultCol := fmt.Sprintf("integer_value_count_%s", colname) vi.constraints[resultCol] = &constraint{ - projection: fmt.Sprintf("COUNTIF(%s = %d) AS %s", colname, wantValue, resultCol), + projection: fmt.Sprintf("COUNTIF(`%s` = %d) AS `%s`", colname, wantValue, resultCol), expectedValue: valueCount, } } @@ -187,7 +187,7 @@ func withStringValueCount(colname string, wantValue string, valueCount int64) co return func(vi *validationInfo) { resultCol := fmt.Sprintf("string_value_count_%s", colname) vi.constraints[resultCol] = &constraint{ - projection: fmt.Sprintf("COUNTIF(%s = \"%s\") AS %s", colname, wantValue, resultCol), + projection: fmt.Sprintf("COUNTIF(`%s` = \"%s\") AS `%s`", colname, wantValue, resultCol), expectedValue: valueCount, } } @@ -198,7 +198,7 @@ func withBoolValueCount(colname string, wantValue bool, valueCount int64) constr return func(vi *validationInfo) { resultCol := fmt.Sprintf("bool_value_count_%s", colname) vi.constraints[resultCol] = &constraint{ - projection: fmt.Sprintf("COUNTIF(%s = %t) AS %s", colname, wantValue, resultCol), + projection: fmt.Sprintf("COUNTIF(`%s` = %t) AS `%s`", colname, wantValue, resultCol), expectedValue: valueCount, } } @@ -209,7 +209,7 @@ func withBytesValueCount(colname string, wantValue []byte, valueCount int64) con return func(vi *validationInfo) { resultCol := fmt.Sprintf("bytes_value_count_%s", colname) vi.constraints[resultCol] = &constraint{ - projection: fmt.Sprintf("COUNTIF(%s = B\"%s\") AS %s", colname, wantValue, resultCol), + projection: fmt.Sprintf("COUNTIF(`%s` = B\"%s\") AS `%s`", colname, wantValue, resultCol), expectedValue: valueCount, } } @@ -220,15 +220,15 @@ func withBytesValueCount(colname string, wantValue []byte, valueCount int64) con func withFloatValueCount(colname string, wantValue float64, valueCount int64) constraintOption { return func(vi *validationInfo) { resultCol := fmt.Sprintf("float_value_count_%s", colname) - projection := fmt.Sprintf("COUNTIF((ABS(%s) - ABS(%f))/ABS(%f) < 0.0001) AS %s", colname, wantValue, wantValue, resultCol) + projection := fmt.Sprintf("COUNTIF((ABS(`%s`) - ABS(%f))/ABS(%f) < 0.0001) AS `%s`", colname, wantValue, wantValue, resultCol) switch wantValue { case math.Inf(0): // special case for infinities. - projection = fmt.Sprintf("COUNTIF(IS_INF(%s)) as %s", colname, resultCol) + projection = fmt.Sprintf("COUNTIF(IS_INF(`%s`)) as `%s`", colname, resultCol) case math.NaN(): - projection = fmt.Sprintf("COUNTIF(IS_NAN(%s)) as %s", colname, resultCol) + projection = fmt.Sprintf("COUNTIF(IS_NAN(%s)) as `%s`", colname, resultCol) case 0: - projection = fmt.Sprintf("COUNTIF(SIGN(%s) = 0) as %s", colname, resultCol) + projection = fmt.Sprintf("COUNTIF(SIGN(`%s`) = 0) as `%s`", colname, resultCol) } vi.constraints[resultCol] = &constraint{ projection: projection, @@ -242,7 +242,7 @@ func withArrayLength(colname string, wantLen int64, wantCount int64) constraintO return func(vi *validationInfo) { resultCol := fmt.Sprintf("arraylength_value_count_%s", colname) vi.constraints[resultCol] = &constraint{ - projection: fmt.Sprintf("COUNTIF(ARRAY_LENGTH(%s) = %d) as %s", colname, wantLen, resultCol), + projection: fmt.Sprintf("COUNTIF(ARRAY_LENGTH(`%s`) = %d) as `%s`", colname, wantLen, resultCol), expectedValue: wantCount, } } @@ -253,7 +253,7 @@ func withDistinctArrayValues(colname string, distinctVals, wantCount int64) cons return func(vi *validationInfo) { resultCol := fmt.Sprintf("distinct_array_count_%s", colname) vi.constraints[resultCol] = &constraint{ - projection: fmt.Sprintf("COUNTIF(ARRAY_LENGTH(ARRAY(SELECT DISTINCT element FROM UNNEST(%s) as element)) = %d) AS %s", colname, distinctVals, resultCol), + projection: fmt.Sprintf("COUNTIF(ARRAY_LENGTH(ARRAY(SELECT DISTINCT element FROM UNNEST(`%s`) as element)) = %d) AS `%s`", colname, distinctVals, resultCol), expectedValue: wantCount, } } @@ -264,7 +264,7 @@ func withIntegerArraySum(colname string, arraySum int64, wantCount int64) constr return func(vi *validationInfo) { resultCol := fmt.Sprintf("arraysum_int64_value_count_%s", colname) vi.constraints[resultCol] = &constraint{ - projection: fmt.Sprintf("COUNTIF((SELECT SUM(elem) FROM UNNEST(%s) as elem) = %d) as %s", colname, arraySum, resultCol), + projection: fmt.Sprintf("COUNTIF((SELECT SUM(elem) FROM UNNEST(`%s`) as elem) = %d) as `%s`", colname, arraySum, resultCol), expectedValue: wantCount, } } @@ -275,7 +275,7 @@ func withFloatArraySum(colname string, floatSum float64, wantCount int64) constr return func(vi *validationInfo) { resultCol := fmt.Sprintf("arraysum_float_value_count_%s", colname) vi.constraints[resultCol] = &constraint{ - projection: fmt.Sprintf("COUNTIF(((SELECT ABS(SUM(elem)) FROM UNNEST(%s) as elem) - ABS(%f)) / ABS(%f) < 0.0001) as %s", colname, floatSum, floatSum, resultCol), + projection: fmt.Sprintf("COUNTIF(((SELECT ABS(SUM(elem)) FROM UNNEST(`%s`) as elem) - ABS(%f)) / ABS(%f) < 0.0001) as `%s`", colname, floatSum, floatSum, resultCol), expectedValue: wantCount, } } diff --git a/bigquery/storage/managedwriter/validation_test.go b/bigquery/storage/managedwriter/validation_test.go index fb1da744a35..7cea2814b58 100644 --- a/bigquery/storage/managedwriter/validation_test.go +++ b/bigquery/storage/managedwriter/validation_test.go @@ -412,7 +412,7 @@ func TestValidation_Values(t *testing.T) { defer mwClient.Close() defer bqClient.Close() - dataset, cleanup, err := setupTestDataset(context.Background(), t, bqClient, "us-east1") + dataset, cleanup, err := setupTestDataset(context.Background(), t, bqClient, "us-east4") if err != nil { t.Fatalf("failed to init test dataset: %v", err) } @@ -429,12 +429,6 @@ func TestValidation_Values(t *testing.T) { continue } - if meta, err := testTable.Metadata(ctx); err == nil { - for n, field := range meta.Schema { - t.Logf("(%s) field %d: %s", tc.description, n, field.Name) - } - } - // normalize the proto schema based on the provided message. descriptor, err := adapt.NormalizeDescriptor(tc.inputRow.ProtoReflect().Descriptor()) if err != nil { From 6a5d804eb89142735584347588729fb292cbb6b3 Mon Sep 17 00:00:00 2001 From: Seth Hollyman Date: Fri, 9 Sep 2022 19:52:32 +0000 Subject: [PATCH 07/15] switch emojis to valid characters in conversion tests --- .../storage/managedwriter/adapt/protoconversion_test.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/bigquery/storage/managedwriter/adapt/protoconversion_test.go b/bigquery/storage/managedwriter/adapt/protoconversion_test.go index 0a7e648a4e9..d2891d4d341 100644 --- a/bigquery/storage/managedwriter/adapt/protoconversion_test.go +++ b/bigquery/storage/managedwriter/adapt/protoconversion_test.go @@ -419,8 +419,8 @@ func TestSchemaToProtoConversion(t *testing.T) { bq: &storagepb.TableSchema{ Fields: []*storagepb.TableFieldSchema{ {Name: "foo", Type: storagepb.TableFieldSchema_STRING, Mode: storagepb.TableFieldSchema_NULLABLE}, - {Name: "💩", Type: storagepb.TableFieldSchema_INT64, Mode: storagepb.TableFieldSchema_REQUIRED}, - {Name: "☕_addict", Type: storagepb.TableFieldSchema_BYTES, Mode: storagepb.TableFieldSchema_REPEATED}, + {Name: "火", Type: storagepb.TableFieldSchema_INT64, Mode: storagepb.TableFieldSchema_REQUIRED}, + {Name: "水_addict", Type: storagepb.TableFieldSchema_BYTES, Mode: storagepb.TableFieldSchema_REPEATED}, }}, wantProto2: func() *descriptorpb.DescriptorProto { dp := &descriptorpb.DescriptorProto{ @@ -446,8 +446,8 @@ func TestSchemaToProtoConversion(t *testing.T) { }, }, } - proto.SetExtension(dp.Field[1].Options, annotations.E_ColumnName, "💩") - proto.SetExtension(dp.Field[2].Options, annotations.E_ColumnName, "☕_addict") + proto.SetExtension(dp.Field[1].Options, annotations.E_ColumnName, "火") + proto.SetExtension(dp.Field[2].Options, annotations.E_ColumnName, "水_addict") return dp }(), }, From a651315a2d55aaf91248bea4a4f398e6894a38ff Mon Sep 17 00:00:00 2001 From: Seth Hollyman Date: Wed, 14 Sep 2022 17:00:05 +0000 Subject: [PATCH 08/15] switch from preview to stable annotation --- bigquery/go.mod | 2 +- bigquery/go.sum | 4 +- .../managedwriter/adapt/protoconversion.go | 3 +- .../adapt/protoconversion_test.go | 5 +- .../internal/annotations/annotations.pb.go | 128 ------ .../internal/annotations/annotations.proto | 40 -- .../testdata/validation_proto2.pb.go | 399 +++++++++--------- .../testdata/validation_proto2.proto | 3 +- 8 files changed, 208 insertions(+), 376 deletions(-) delete mode 100644 bigquery/storage/managedwriter/internal/annotations/annotations.pb.go delete mode 100644 bigquery/storage/managedwriter/internal/annotations/annotations.proto diff --git a/bigquery/go.mod b/bigquery/go.mod index ff99a784d38..0a04e292d3b 100644 --- a/bigquery/go.mod +++ b/bigquery/go.mod @@ -13,7 +13,7 @@ require ( golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f google.golang.org/api v0.95.0 - google.golang.org/genproto v0.0.0-20220913154956-18f8339a66a5 + google.golang.org/genproto v0.0.0-20220914142337-ca0e39ece12f google.golang.org/grpc v1.48.0 google.golang.org/protobuf v1.28.1 ) diff --git a/bigquery/go.sum b/bigquery/go.sum index f6d7a0078be..6d9d9ab0488 100644 --- a/bigquery/go.sum +++ b/bigquery/go.sum @@ -613,8 +613,8 @@ google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljW google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= google.golang.org/genproto v0.0.0-20220722212130-b98a9ff5e252/go.mod h1:GkXuJDJ6aQ7lnJcRF+SJVgFdQhypqgl3LB1C9vabdRE= google.golang.org/genproto v0.0.0-20220815135757-37a418bb8959/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220913154956-18f8339a66a5 h1:ou3VRVAif8UJqz3l1r4Isoz7rrUWHWDHBonShMNYoQs= -google.golang.org/genproto v0.0.0-20220913154956-18f8339a66a5/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220914142337-ca0e39ece12f h1:wwbo0UziciPT4Dsca+bmplW53QNAl7tiUOw7FfAcsf8= +google.golang.org/genproto v0.0.0-20220914142337-ca0e39ece12f/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= diff --git a/bigquery/storage/managedwriter/adapt/protoconversion.go b/bigquery/storage/managedwriter/adapt/protoconversion.go index c7424d4ff78..90db4135af0 100644 --- a/bigquery/storage/managedwriter/adapt/protoconversion.go +++ b/bigquery/storage/managedwriter/adapt/protoconversion.go @@ -20,7 +20,6 @@ import ( "strings" "unicode" - "cloud.google.com/go/bigquery/storage/managedwriter/internal/annotations" storagepb "google.golang.org/genproto/googleapis/cloud/bigquery/storage/v1" "google.golang.org/protobuf/proto" "google.golang.org/protobuf/reflect/protodesc" @@ -340,7 +339,7 @@ func tableFieldSchemaToFieldDescriptorProto(field *storagepb.TableFieldSchema, i if opts == nil { fdp.Options = &descriptorpb.FieldOptions{} } - proto.SetExtension(fdp.Options, annotations.E_ColumnName, name) + proto.SetExtension(fdp.Options, storagepb.E_ColumnName, name) } return fdp, nil } diff --git a/bigquery/storage/managedwriter/adapt/protoconversion_test.go b/bigquery/storage/managedwriter/adapt/protoconversion_test.go index d2891d4d341..cf4257ac910 100644 --- a/bigquery/storage/managedwriter/adapt/protoconversion_test.go +++ b/bigquery/storage/managedwriter/adapt/protoconversion_test.go @@ -19,7 +19,6 @@ import ( "reflect" "testing" - "cloud.google.com/go/bigquery/storage/managedwriter/internal/annotations" "cloud.google.com/go/bigquery/storage/managedwriter/testdata" "github.com/google/go-cmp/cmp" storagepb "google.golang.org/genproto/googleapis/cloud/bigquery/storage/v1" @@ -446,8 +445,8 @@ func TestSchemaToProtoConversion(t *testing.T) { }, }, } - proto.SetExtension(dp.Field[1].Options, annotations.E_ColumnName, "火") - proto.SetExtension(dp.Field[2].Options, annotations.E_ColumnName, "水_addict") + proto.SetExtension(dp.Field[1].Options, storagepb.E_ColumnName, "火") + proto.SetExtension(dp.Field[2].Options, storagepb.E_ColumnName, "水_addict") return dp }(), }, diff --git a/bigquery/storage/managedwriter/internal/annotations/annotations.pb.go b/bigquery/storage/managedwriter/internal/annotations/annotations.pb.go deleted file mode 100644 index 64aab99d364..00000000000 --- a/bigquery/storage/managedwriter/internal/annotations/annotations.pb.go +++ /dev/null @@ -1,128 +0,0 @@ -// Copyright 2022 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.28.0 -// protoc v3.17.3 -// source: annotations.proto - -package annotations - -import ( - reflect "reflect" - - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - descriptorpb "google.golang.org/protobuf/types/descriptorpb" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -var file_annotations_proto_extTypes = []protoimpl.ExtensionInfo{ - { - ExtendedType: (*descriptorpb.FieldOptions)(nil), - ExtensionType: (*string)(nil), - Field: 454943157, - Name: "google.cloud.bigquery.storage.v1.column_name", - Tag: "bytes,454943157,opt,name=column_name", - Filename: "annotations.proto", - }, -} - -// Extension fields to descriptorpb.FieldOptions. -var ( - // Setting the column_name extension allows users to reference - // bigquery column independently of the field name in the protocol buffer - // message. - // - // The intended use of this annotation is to reference a destination column - // named using characters unavailable for protobuf field names (e.g. unicode - // characters). - // - // More details about BigQuery naming limitations can be found here: - // https://cloud.google.com/bigquery/docs/schemas#column_names - // - // This extension is currently experimental. - // - // optional string column_name = 454943157; - E_ColumnName = &file_annotations_proto_extTypes[0] -) - -var File_annotations_proto protoreflect.FileDescriptor - -var file_annotations_proto_rawDesc = []byte{ - 0x0a, 0x11, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x12, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, - 0x64, 0x2e, 0x62, 0x69, 0x67, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, - 0x67, 0x65, 0x2e, 0x76, 0x31, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, - 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x3a, 0x45, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x75, 0x6d, - 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xb5, 0xc3, 0xf7, 0xd8, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x42, 0x8f, - 0x01, 0x0a, 0x24, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, - 0x6f, 0x75, 0x64, 0x2e, 0x62, 0x69, 0x67, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x73, 0x74, 0x6f, - 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, 0x42, 0x10, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x53, 0x63, 0x6c, 0x6f, - 0x75, 0x64, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, - 0x2f, 0x62, 0x69, 0x67, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, - 0x65, 0x2f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x77, 0x72, 0x69, 0x74, 0x65, 0x72, 0x2f, - 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x3b, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} - -var file_annotations_proto_goTypes = []interface{}{ - (*descriptorpb.FieldOptions)(nil), // 0: google.protobuf.FieldOptions -} -var file_annotations_proto_depIdxs = []int32{ - 0, // 0: google.cloud.bigquery.storage.v1.column_name:extendee -> google.protobuf.FieldOptions - 1, // [1:1] is the sub-list for method output_type - 1, // [1:1] is the sub-list for method input_type - 1, // [1:1] is the sub-list for extension type_name - 0, // [0:1] is the sub-list for extension extendee - 0, // [0:0] is the sub-list for field type_name -} - -func init() { file_annotations_proto_init() } -func file_annotations_proto_init() { - if File_annotations_proto != nil { - return - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_annotations_proto_rawDesc, - NumEnums: 0, - NumMessages: 0, - NumExtensions: 1, - NumServices: 0, - }, - GoTypes: file_annotations_proto_goTypes, - DependencyIndexes: file_annotations_proto_depIdxs, - ExtensionInfos: file_annotations_proto_extTypes, - }.Build() - File_annotations_proto = out.File - file_annotations_proto_rawDesc = nil - file_annotations_proto_goTypes = nil - file_annotations_proto_depIdxs = nil -} diff --git a/bigquery/storage/managedwriter/internal/annotations/annotations.proto b/bigquery/storage/managedwriter/internal/annotations/annotations.proto deleted file mode 100644 index 0600329fcd3..00000000000 --- a/bigquery/storage/managedwriter/internal/annotations/annotations.proto +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright 2022 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -syntax = "proto3"; - -package google.cloud.bigquery.storage.v1; - -import "google/protobuf/descriptor.proto"; - -option go_package = "cloud.google.com/go/bigquery/storage/managedwriter/internal/annotations;annotations"; -option java_package = "com.google.cloud.bigquery.storage.v1"; -option java_multiple_files = true; -option java_outer_classname = "AnnotationsProto"; - -extend google.protobuf.FieldOptions { - // Setting the column_name extension allows users to reference - // bigquery column independently of the field name in the protocol buffer - // message. - // - // The intended use of this annotation is to reference a destination column - // named using characters unavailable for protobuf field names (e.g. unicode - // characters). - // - // More details about BigQuery naming limitations can be found here: - // https://cloud.google.com/bigquery/docs/schemas#column_names - // - // This extension is currently experimental. - optional string column_name = 454943157; -} \ No newline at end of file diff --git a/bigquery/storage/managedwriter/testdata/validation_proto2.pb.go b/bigquery/storage/managedwriter/testdata/validation_proto2.pb.go index 8648507e046..463d1e716a8 100644 --- a/bigquery/storage/managedwriter/testdata/validation_proto2.pb.go +++ b/bigquery/storage/managedwriter/testdata/validation_proto2.pb.go @@ -24,7 +24,7 @@ import ( reflect "reflect" sync "sync" - _ "cloud.google.com/go/bigquery/storage/managedwriter/internal/annotations" + _ "google.golang.org/genproto/googleapis/cloud/bigquery/storage/v1" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" ) @@ -943,209 +943,210 @@ var File_testdata_validation_proto2_proto protoreflect.FileDescriptor var file_testdata_validation_proto2_proto_rawDesc = []byte{ 0x0a, 0x20, 0x74, 0x65, 0x73, 0x74, 0x64, 0x61, 0x74, 0x61, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x32, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x12, 0x08, 0x74, 0x65, 0x73, 0x74, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x26, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x97, 0x04, 0x0a, 0x14, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x50, 0x32, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x12, 0x21, 0x0a, - 0x0c, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, - 0x02, 0x28, 0x01, 0x52, 0x0b, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, - 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, - 0x02, 0x20, 0x02, 0x28, 0x02, 0x52, 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x46, 0x69, 0x65, 0x6c, - 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, - 0x18, 0x03, 0x20, 0x02, 0x28, 0x05, 0x52, 0x0a, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x65, - 0x6c, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x66, 0x69, 0x65, 0x6c, - 0x64, 0x18, 0x04, 0x20, 0x02, 0x28, 0x03, 0x52, 0x0a, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x46, 0x69, - 0x65, 0x6c, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x66, 0x69, - 0x65, 0x6c, 0x64, 0x18, 0x05, 0x20, 0x02, 0x28, 0x0d, 0x52, 0x0b, 0x75, 0x69, 0x6e, 0x74, 0x33, - 0x32, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x69, 0x6e, 0x74, 0x33, 0x32, - 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x07, 0x20, 0x02, 0x28, 0x11, 0x52, 0x0b, 0x73, 0x69, - 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x69, 0x6e, - 0x74, 0x36, 0x34, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x08, 0x20, 0x02, 0x28, 0x12, 0x52, - 0x0b, 0x73, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x23, 0x0a, 0x0d, - 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x09, 0x20, - 0x02, 0x28, 0x07, 0x52, 0x0c, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, - 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x5f, 0x66, 0x69, - 0x65, 0x6c, 0x64, 0x18, 0x0b, 0x20, 0x02, 0x28, 0x0f, 0x52, 0x0d, 0x73, 0x66, 0x69, 0x78, 0x65, - 0x64, 0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x66, 0x69, 0x78, - 0x65, 0x64, 0x36, 0x34, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0c, 0x20, 0x02, 0x28, 0x10, - 0x52, 0x0d, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, - 0x1d, 0x0a, 0x0a, 0x62, 0x6f, 0x6f, 0x6c, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0d, 0x20, - 0x02, 0x28, 0x08, 0x52, 0x09, 0x62, 0x6f, 0x6f, 0x6c, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x21, - 0x0a, 0x0c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0e, - 0x20, 0x02, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x65, 0x6c, - 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, - 0x18, 0x0f, 0x20, 0x02, 0x28, 0x0c, 0x52, 0x0a, 0x62, 0x79, 0x74, 0x65, 0x73, 0x46, 0x69, 0x65, - 0x6c, 0x64, 0x12, 0x3a, 0x0a, 0x0a, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, - 0x18, 0x10, 0x20, 0x02, 0x28, 0x0e, 0x32, 0x1b, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x32, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x45, - 0x6e, 0x75, 0x6d, 0x52, 0x09, 0x65, 0x6e, 0x75, 0x6d, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x22, 0x97, - 0x04, 0x0a, 0x14, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x32, 0x4f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x6f, 0x75, 0x62, 0x6c, - 0x65, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0b, 0x64, - 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x6c, - 0x6f, 0x61, 0x74, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 0x52, - 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x69, - 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x0a, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1f, 0x0a, 0x0b, - 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x0a, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x21, 0x0a, - 0x0c, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, 0x64, - 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x11, 0x52, 0x0b, 0x73, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, - 0x65, 0x6c, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x66, 0x69, - 0x65, 0x6c, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x12, 0x52, 0x0b, 0x73, 0x69, 0x6e, 0x74, 0x36, - 0x34, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, - 0x32, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x07, 0x52, 0x0c, 0x66, - 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x73, - 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0b, 0x20, - 0x01, 0x28, 0x0f, 0x52, 0x0d, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x46, 0x69, 0x65, - 0x6c, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x5f, 0x66, - 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x10, 0x52, 0x0d, 0x73, 0x66, 0x69, 0x78, - 0x65, 0x64, 0x36, 0x34, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x6f, 0x6f, - 0x6c, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x62, - 0x6f, 0x6f, 0x6c, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x62, - 0x79, 0x74, 0x65, 0x73, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x0a, 0x62, 0x79, 0x74, 0x65, 0x73, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x3a, 0x0a, 0x0a, - 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x1b, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x50, 0x72, 0x6f, 0x74, - 0x6f, 0x32, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x09, 0x65, - 0x6e, 0x75, 0x6d, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x22, 0xff, 0x04, 0x0a, 0x20, 0x56, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x32, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, - 0x6c, 0x57, 0x69, 0x74, 0x68, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x27, 0x0a, - 0x0c, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x01, 0x3a, 0x04, 0x31, 0x2e, 0x31, 0x31, 0x52, 0x0b, 0x64, 0x6f, 0x75, 0x62, 0x6c, - 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x25, 0x0a, 0x0b, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x5f, - 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 0x3a, 0x04, 0x32, 0x2e, 0x32, - 0x32, 0x52, 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x22, 0x0a, - 0x0b, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x05, 0x3a, 0x01, 0x33, 0x52, 0x0a, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, - 0x64, 0x12, 0x22, 0x0a, 0x0b, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x3a, 0x01, 0x34, 0x52, 0x0a, 0x69, 0x6e, 0x74, 0x36, 0x34, - 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x24, 0x0a, 0x0c, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, - 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x3a, 0x01, 0x35, 0x52, 0x0b, - 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x24, 0x0a, 0x0c, 0x73, - 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x11, 0x3a, 0x01, 0x37, 0x52, 0x0b, 0x73, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, - 0x64, 0x12, 0x24, 0x0a, 0x0c, 0x73, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x66, 0x69, 0x65, 0x6c, - 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x12, 0x3a, 0x01, 0x38, 0x52, 0x0b, 0x73, 0x69, 0x6e, 0x74, - 0x36, 0x34, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x26, 0x0a, 0x0d, 0x66, 0x69, 0x78, 0x65, 0x64, - 0x33, 0x32, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x07, 0x3a, 0x01, - 0x39, 0x52, 0x0c, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, - 0x29, 0x0a, 0x0e, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x5f, 0x66, 0x69, 0x65, 0x6c, - 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0f, 0x3a, 0x02, 0x31, 0x31, 0x52, 0x0d, 0x73, 0x66, 0x69, - 0x78, 0x65, 0x64, 0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x29, 0x0a, 0x0e, 0x73, 0x66, - 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0c, 0x20, 0x01, - 0x28, 0x10, 0x3a, 0x02, 0x31, 0x32, 0x52, 0x0d, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, - 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x23, 0x0a, 0x0a, 0x62, 0x6f, 0x6f, 0x6c, 0x5f, 0x66, 0x69, - 0x65, 0x6c, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x04, 0x74, 0x72, 0x75, 0x65, 0x52, - 0x09, 0x62, 0x6f, 0x6f, 0x6c, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x31, 0x0a, 0x0c, 0x73, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, - 0x3a, 0x0e, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x52, 0x0b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x2f, 0x0a, - 0x0b, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0f, 0x20, 0x01, - 0x28, 0x0c, 0x3a, 0x0e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x62, 0x79, 0x74, - 0x65, 0x73, 0x52, 0x0a, 0x62, 0x79, 0x74, 0x65, 0x73, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x4a, - 0x0a, 0x0a, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x10, 0x20, 0x01, + 0x74, 0x6f, 0x12, 0x08, 0x74, 0x65, 0x73, 0x74, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x32, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2f, 0x62, 0x69, 0x67, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x61, + 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x22, 0x97, 0x04, 0x0a, 0x14, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, + 0x32, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x6f, 0x75, + 0x62, 0x6c, 0x65, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x02, 0x28, 0x01, 0x52, + 0x0b, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1f, 0x0a, 0x0b, + 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x02, 0x28, + 0x02, 0x52, 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1f, 0x0a, + 0x0b, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x03, 0x20, 0x02, + 0x28, 0x05, 0x52, 0x0a, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1f, + 0x0a, 0x0b, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x04, 0x20, + 0x02, 0x28, 0x03, 0x52, 0x0a, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, + 0x21, 0x0a, 0x0c, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, + 0x05, 0x20, 0x02, 0x28, 0x0d, 0x52, 0x0b, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x65, + 0x6c, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x66, 0x69, 0x65, + 0x6c, 0x64, 0x18, 0x07, 0x20, 0x02, 0x28, 0x11, 0x52, 0x0b, 0x73, 0x69, 0x6e, 0x74, 0x33, 0x32, + 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, + 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x08, 0x20, 0x02, 0x28, 0x12, 0x52, 0x0b, 0x73, 0x69, 0x6e, + 0x74, 0x36, 0x34, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x66, 0x69, 0x78, 0x65, + 0x64, 0x33, 0x32, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x09, 0x20, 0x02, 0x28, 0x07, 0x52, + 0x0c, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x25, 0x0a, + 0x0e, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, + 0x0b, 0x20, 0x02, 0x28, 0x0f, 0x52, 0x0d, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x46, + 0x69, 0x65, 0x6c, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, + 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0c, 0x20, 0x02, 0x28, 0x10, 0x52, 0x0d, 0x73, 0x66, + 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x62, + 0x6f, 0x6f, 0x6c, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0d, 0x20, 0x02, 0x28, 0x08, 0x52, + 0x09, 0x62, 0x6f, 0x6f, 0x6c, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0e, 0x20, 0x02, 0x28, 0x09, + 0x52, 0x0b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1f, 0x0a, + 0x0b, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0f, 0x20, 0x02, + 0x28, 0x0c, 0x52, 0x0a, 0x62, 0x79, 0x74, 0x65, 0x73, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x3a, + 0x0a, 0x0a, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x10, 0x20, 0x02, 0x28, 0x0e, 0x32, 0x1b, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x50, 0x72, - 0x6f, 0x74, 0x6f, 0x32, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x45, 0x6e, 0x75, 0x6d, 0x3a, - 0x0e, 0x50, 0x32, 0x5f, 0x4f, 0x54, 0x48, 0x45, 0x52, 0x5f, 0x54, 0x48, 0x49, 0x4e, 0x47, 0x52, - 0x09, 0x65, 0x6e, 0x75, 0x6d, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x22, 0xb3, 0x04, 0x0a, 0x1c, 0x56, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x32, 0x55, 0x6e, 0x70, 0x61, 0x63, + 0x6f, 0x74, 0x6f, 0x32, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x45, 0x6e, 0x75, 0x6d, 0x52, + 0x09, 0x65, 0x6e, 0x75, 0x6d, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x22, 0x97, 0x04, 0x0a, 0x14, 0x56, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x32, 0x4f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x61, 0x6c, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x5f, 0x66, 0x69, + 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0b, 0x64, 0x6f, 0x75, 0x62, 0x6c, + 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x5f, + 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0a, 0x66, 0x6c, 0x6f, + 0x61, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x74, 0x33, 0x32, + 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x69, 0x6e, + 0x74, 0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x74, 0x36, + 0x34, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x69, + 0x6e, 0x74, 0x36, 0x34, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x75, 0x69, 0x6e, + 0x74, 0x33, 0x32, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x0b, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x21, 0x0a, 0x0c, + 0x73, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x11, 0x52, 0x0b, 0x73, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, + 0x21, 0x0a, 0x0c, 0x73, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x12, 0x52, 0x0b, 0x73, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x46, 0x69, 0x65, + 0x6c, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x5f, 0x66, 0x69, + 0x65, 0x6c, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x07, 0x52, 0x0c, 0x66, 0x69, 0x78, 0x65, 0x64, + 0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x66, 0x69, 0x78, 0x65, + 0x64, 0x33, 0x32, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0f, 0x52, + 0x0d, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x25, + 0x0a, 0x0e, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, + 0x18, 0x0c, 0x20, 0x01, 0x28, 0x10, 0x52, 0x0d, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, + 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x6f, 0x6f, 0x6c, 0x5f, 0x66, 0x69, + 0x65, 0x6c, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x62, 0x6f, 0x6f, 0x6c, 0x46, + 0x69, 0x65, 0x6c, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x66, + 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x79, 0x74, 0x65, 0x73, + 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x62, 0x79, + 0x74, 0x65, 0x73, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x3a, 0x0a, 0x0a, 0x65, 0x6e, 0x75, 0x6d, + 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1b, 0x2e, 0x74, + 0x65, 0x73, 0x74, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x32, 0x45, 0x78, + 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x09, 0x65, 0x6e, 0x75, 0x6d, 0x46, + 0x69, 0x65, 0x6c, 0x64, 0x22, 0xff, 0x04, 0x0a, 0x20, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x50, 0x32, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x57, 0x69, 0x74, + 0x68, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x27, 0x0a, 0x0c, 0x64, 0x6f, 0x75, + 0x62, 0x6c, 0x65, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x3a, + 0x04, 0x31, 0x2e, 0x31, 0x31, 0x52, 0x0b, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x46, 0x69, 0x65, + 0x6c, 0x64, 0x12, 0x25, 0x0a, 0x0b, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x5f, 0x66, 0x69, 0x65, 0x6c, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 0x3a, 0x04, 0x32, 0x2e, 0x32, 0x32, 0x52, 0x0a, 0x66, + 0x6c, 0x6f, 0x61, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x22, 0x0a, 0x0b, 0x69, 0x6e, 0x74, + 0x33, 0x32, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x3a, 0x01, + 0x33, 0x52, 0x0a, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x22, 0x0a, + 0x0b, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x03, 0x3a, 0x01, 0x34, 0x52, 0x0a, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x46, 0x69, 0x65, 0x6c, + 0x64, 0x12, 0x24, 0x0a, 0x0c, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x66, 0x69, 0x65, 0x6c, + 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x3a, 0x01, 0x35, 0x52, 0x0b, 0x75, 0x69, 0x6e, 0x74, + 0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x24, 0x0a, 0x0c, 0x73, 0x69, 0x6e, 0x74, 0x33, + 0x32, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x11, 0x3a, 0x01, 0x37, + 0x52, 0x0b, 0x73, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x24, 0x0a, + 0x0c, 0x73, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x12, 0x3a, 0x01, 0x38, 0x52, 0x0b, 0x73, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x46, 0x69, + 0x65, 0x6c, 0x64, 0x12, 0x26, 0x0a, 0x0d, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x5f, 0x66, + 0x69, 0x65, 0x6c, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x07, 0x3a, 0x01, 0x39, 0x52, 0x0c, 0x66, + 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x29, 0x0a, 0x0e, 0x73, + 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0b, 0x20, + 0x01, 0x28, 0x0f, 0x3a, 0x02, 0x31, 0x31, 0x52, 0x0d, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, + 0x32, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x29, 0x0a, 0x0e, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, + 0x36, 0x34, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x10, 0x3a, 0x02, + 0x31, 0x32, 0x52, 0x0d, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x46, 0x69, 0x65, 0x6c, + 0x64, 0x12, 0x23, 0x0a, 0x0a, 0x62, 0x6f, 0x6f, 0x6c, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, + 0x0d, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x04, 0x74, 0x72, 0x75, 0x65, 0x52, 0x09, 0x62, 0x6f, 0x6f, + 0x6c, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x31, 0x0a, 0x0c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x3a, 0x0e, 0x63, 0x75, + 0x73, 0x74, 0x6f, 0x6d, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x0b, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x2f, 0x0a, 0x0b, 0x62, 0x79, 0x74, + 0x65, 0x73, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0c, 0x3a, 0x0e, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0x52, 0x0a, + 0x62, 0x79, 0x74, 0x65, 0x73, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x4a, 0x0a, 0x0a, 0x65, 0x6e, + 0x75, 0x6d, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1b, + 0x2e, 0x74, 0x65, 0x73, 0x74, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x32, + 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x45, 0x6e, 0x75, 0x6d, 0x3a, 0x0e, 0x50, 0x32, 0x5f, + 0x4f, 0x54, 0x48, 0x45, 0x52, 0x5f, 0x54, 0x48, 0x49, 0x4e, 0x47, 0x52, 0x09, 0x65, 0x6e, 0x75, + 0x6d, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x22, 0xb3, 0x04, 0x0a, 0x1c, 0x56, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x32, 0x55, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x52, + 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x64, 0x6f, 0x75, 0x62, 0x6c, + 0x65, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x01, + 0x52, 0x0e, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x12, 0x25, 0x0a, 0x0e, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, + 0x65, 0x64, 0x18, 0x03, 0x20, 0x03, 0x28, 0x02, 0x52, 0x0d, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x52, + 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x69, 0x6e, 0x74, 0x33, 0x32, + 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, 0x03, 0x28, 0x05, 0x52, + 0x0d, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x25, + 0x0a, 0x0e, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x18, 0x05, 0x20, 0x03, 0x28, 0x03, 0x52, 0x0d, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x52, 0x65, 0x70, + 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, + 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x0e, + 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x27, + 0x0a, 0x0f, 0x73, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, + 0x64, 0x18, 0x07, 0x20, 0x03, 0x28, 0x11, 0x52, 0x0e, 0x73, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, + 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x69, 0x6e, 0x74, 0x36, + 0x34, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x08, 0x20, 0x03, 0x28, 0x12, + 0x52, 0x0e, 0x73, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x12, 0x29, 0x0a, 0x10, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x5f, 0x72, 0x65, 0x70, 0x65, + 0x61, 0x74, 0x65, 0x64, 0x18, 0x09, 0x20, 0x03, 0x28, 0x07, 0x52, 0x0f, 0x66, 0x69, 0x78, 0x65, + 0x64, 0x33, 0x32, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x2b, 0x0a, 0x11, 0x73, + 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0f, 0x52, 0x10, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, + 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x66, 0x69, 0x78, + 0x65, 0x64, 0x36, 0x34, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x0b, 0x20, + 0x03, 0x28, 0x10, 0x52, 0x10, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x52, 0x65, 0x70, + 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x62, 0x6f, 0x6f, 0x6c, 0x5f, 0x72, 0x65, + 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x08, 0x52, 0x0c, 0x62, 0x6f, + 0x6f, 0x6c, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x40, 0x0a, 0x0d, 0x65, 0x6e, + 0x75, 0x6d, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x0d, 0x20, 0x03, 0x28, + 0x0e, 0x32, 0x1b, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x50, 0x72, 0x6f, + 0x74, 0x6f, 0x32, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x0c, + 0x65, 0x6e, 0x75, 0x6d, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x22, 0xe1, 0x04, 0x0a, + 0x1a, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x32, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x64, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2b, 0x0a, 0x0f, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x01, 0x52, 0x0e, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x70, 0x65, - 0x61, 0x74, 0x65, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x5f, 0x72, 0x65, - 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x03, 0x28, 0x02, 0x52, 0x0d, 0x66, 0x6c, - 0x6f, 0x61, 0x74, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x69, - 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, - 0x03, 0x28, 0x05, 0x52, 0x0d, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, - 0x65, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x72, 0x65, 0x70, 0x65, - 0x61, 0x74, 0x65, 0x64, 0x18, 0x05, 0x20, 0x03, 0x28, 0x03, 0x52, 0x0d, 0x69, 0x6e, 0x74, 0x36, - 0x34, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x75, 0x69, 0x6e, + 0x20, 0x03, 0x28, 0x01, 0x42, 0x02, 0x10, 0x01, 0x52, 0x0e, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, + 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x29, 0x0a, 0x0e, 0x66, 0x6c, 0x6f, 0x61, + 0x74, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x03, 0x28, 0x02, + 0x42, 0x02, 0x10, 0x01, 0x52, 0x0d, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x52, 0x65, 0x70, 0x65, 0x61, + 0x74, 0x65, 0x64, 0x12, 0x29, 0x0a, 0x0e, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x72, 0x65, 0x70, + 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, 0x03, 0x28, 0x05, 0x42, 0x02, 0x10, 0x01, 0x52, + 0x0d, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x29, + 0x0a, 0x0e, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x18, 0x05, 0x20, 0x03, 0x28, 0x03, 0x42, 0x02, 0x10, 0x01, 0x52, 0x0d, 0x69, 0x6e, 0x74, 0x36, + 0x34, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x2b, 0x0a, 0x0f, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x06, 0x20, 0x03, - 0x28, 0x0d, 0x52, 0x0e, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, - 0x65, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x72, 0x65, 0x70, - 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x07, 0x20, 0x03, 0x28, 0x11, 0x52, 0x0e, 0x73, 0x69, 0x6e, - 0x74, 0x33, 0x32, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x73, - 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x08, - 0x20, 0x03, 0x28, 0x12, 0x52, 0x0e, 0x73, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x52, 0x65, 0x70, 0x65, - 0x61, 0x74, 0x65, 0x64, 0x12, 0x29, 0x0a, 0x10, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x5f, - 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x09, 0x20, 0x03, 0x28, 0x07, 0x52, 0x0f, + 0x28, 0x0d, 0x42, 0x02, 0x10, 0x01, 0x52, 0x0e, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x65, + 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x2b, 0x0a, 0x0f, 0x73, 0x69, 0x6e, 0x74, 0x33, 0x32, + 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x07, 0x20, 0x03, 0x28, 0x11, 0x42, + 0x02, 0x10, 0x01, 0x52, 0x0e, 0x73, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x65, 0x70, 0x65, 0x61, + 0x74, 0x65, 0x64, 0x12, 0x2b, 0x0a, 0x0f, 0x73, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x72, 0x65, + 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x08, 0x20, 0x03, 0x28, 0x12, 0x42, 0x02, 0x10, 0x01, + 0x52, 0x0e, 0x73, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x12, 0x2d, 0x0a, 0x10, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x5f, 0x72, 0x65, 0x70, 0x65, + 0x61, 0x74, 0x65, 0x64, 0x18, 0x09, 0x20, 0x03, 0x28, 0x07, 0x42, 0x02, 0x10, 0x01, 0x52, 0x0f, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, - 0x2b, 0x0a, 0x11, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x5f, 0x72, 0x65, 0x70, 0x65, - 0x61, 0x74, 0x65, 0x64, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0f, 0x52, 0x10, 0x73, 0x66, 0x69, 0x78, - 0x65, 0x64, 0x33, 0x32, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x2b, 0x0a, 0x11, - 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x10, 0x52, 0x10, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, - 0x34, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x62, 0x6f, 0x6f, - 0x6c, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x08, - 0x52, 0x0c, 0x62, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x40, - 0x0a, 0x0d, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, - 0x0d, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x1b, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x32, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x45, 0x6e, - 0x75, 0x6d, 0x52, 0x0c, 0x65, 0x6e, 0x75, 0x6d, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, - 0x22, 0xe1, 0x04, 0x0a, 0x1a, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, - 0x32, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, - 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, - 0x2b, 0x0a, 0x0f, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, - 0x65, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x01, 0x42, 0x02, 0x10, 0x01, 0x52, 0x0e, 0x64, 0x6f, - 0x75, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x29, 0x0a, 0x0e, - 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x03, - 0x20, 0x03, 0x28, 0x02, 0x42, 0x02, 0x10, 0x01, 0x52, 0x0d, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x52, - 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x29, 0x0a, 0x0e, 0x69, 0x6e, 0x74, 0x33, 0x32, - 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, 0x03, 0x28, 0x05, 0x42, - 0x02, 0x10, 0x01, 0x52, 0x0d, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, - 0x65, 0x64, 0x12, 0x29, 0x0a, 0x0e, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x72, 0x65, 0x70, 0x65, - 0x61, 0x74, 0x65, 0x64, 0x18, 0x05, 0x20, 0x03, 0x28, 0x03, 0x42, 0x02, 0x10, 0x01, 0x52, 0x0d, - 0x69, 0x6e, 0x74, 0x36, 0x34, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x2b, 0x0a, - 0x0f, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, - 0x18, 0x06, 0x20, 0x03, 0x28, 0x0d, 0x42, 0x02, 0x10, 0x01, 0x52, 0x0e, 0x75, 0x69, 0x6e, 0x74, - 0x33, 0x32, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x2b, 0x0a, 0x0f, 0x73, 0x69, - 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x07, 0x20, - 0x03, 0x28, 0x11, 0x42, 0x02, 0x10, 0x01, 0x52, 0x0e, 0x73, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, - 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x2b, 0x0a, 0x0f, 0x73, 0x69, 0x6e, 0x74, 0x36, - 0x34, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x08, 0x20, 0x03, 0x28, 0x12, - 0x42, 0x02, 0x10, 0x01, 0x52, 0x0e, 0x73, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x52, 0x65, 0x70, 0x65, - 0x61, 0x74, 0x65, 0x64, 0x12, 0x2d, 0x0a, 0x10, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x5f, - 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x09, 0x20, 0x03, 0x28, 0x07, 0x42, 0x02, - 0x10, 0x01, 0x52, 0x0f, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x52, 0x65, 0x70, 0x65, 0x61, - 0x74, 0x65, 0x64, 0x12, 0x2f, 0x0a, 0x11, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x5f, - 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0f, 0x42, 0x02, - 0x10, 0x01, 0x52, 0x10, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x52, 0x65, 0x70, 0x65, - 0x61, 0x74, 0x65, 0x64, 0x12, 0x2f, 0x0a, 0x11, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, - 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x10, 0x42, - 0x02, 0x10, 0x01, 0x52, 0x10, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x52, 0x65, 0x70, - 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x27, 0x0a, 0x0d, 0x62, 0x6f, 0x6f, 0x6c, 0x5f, 0x72, 0x65, - 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x08, 0x42, 0x02, 0x10, 0x01, - 0x52, 0x0c, 0x62, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x44, - 0x0a, 0x0d, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, - 0x0d, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x1b, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x32, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x45, 0x6e, - 0x75, 0x6d, 0x42, 0x02, 0x10, 0x01, 0x52, 0x0c, 0x65, 0x6e, 0x75, 0x6d, 0x52, 0x65, 0x70, 0x65, - 0x61, 0x74, 0x65, 0x64, 0x22, 0x88, 0x01, 0x0a, 0x1d, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x50, 0x32, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x41, 0x6e, 0x6e, 0x6f, 0x74, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69, 0x72, 0x73, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, 0x72, 0x73, 0x74, 0x12, 0x2d, 0x0a, 0x06, - 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x15, 0xaa, 0x9b, - 0xbc, 0xc7, 0x0d, 0x0f, 0xe7, 0x89, 0xb9, 0xe5, 0x88, 0xa5, 0xe3, 0x82, 0xb3, 0xe3, 0x83, 0xa9, - 0xe3, 0x83, 0xa0, 0x52, 0x06, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x12, 0x22, 0x0a, 0x05, 0x74, - 0x68, 0x69, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0c, 0xaa, 0x9b, 0xbc, 0xc7, - 0x0d, 0x06, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x52, 0x05, 0x74, 0x68, 0x69, 0x72, 0x64, 0x2a, - 0x5b, 0x0a, 0x11, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x32, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, - 0x45, 0x6e, 0x75, 0x6d, 0x12, 0x10, 0x0a, 0x0c, 0x50, 0x32, 0x5f, 0x55, 0x4e, 0x44, 0x45, 0x46, - 0x49, 0x4e, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x50, 0x32, 0x5f, 0x54, 0x48, 0x49, - 0x4e, 0x47, 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x50, 0x32, 0x5f, 0x4f, 0x54, 0x48, 0x45, 0x52, - 0x5f, 0x54, 0x48, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x12, 0x0a, 0x0e, 0x50, 0x32, 0x5f, 0x54, - 0x48, 0x49, 0x52, 0x44, 0x5f, 0x54, 0x48, 0x49, 0x4e, 0x47, 0x10, 0x03, 0x42, 0x3d, 0x5a, 0x3b, - 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, - 0x2f, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x67, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2f, 0x73, 0x74, 0x6f, - 0x72, 0x61, 0x67, 0x65, 0x2f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x77, 0x72, 0x69, 0x74, - 0x65, 0x72, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x64, 0x61, 0x74, 0x61, + 0x2f, 0x0a, 0x11, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x5f, 0x72, 0x65, 0x70, 0x65, + 0x61, 0x74, 0x65, 0x64, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0f, 0x42, 0x02, 0x10, 0x01, 0x52, 0x10, + 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x12, 0x2f, 0x0a, 0x11, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x5f, 0x72, 0x65, 0x70, + 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x10, 0x42, 0x02, 0x10, 0x01, 0x52, + 0x10, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, + 0x64, 0x12, 0x27, 0x0a, 0x0d, 0x62, 0x6f, 0x6f, 0x6c, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, + 0x65, 0x64, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x08, 0x42, 0x02, 0x10, 0x01, 0x52, 0x0c, 0x62, 0x6f, + 0x6f, 0x6c, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x44, 0x0a, 0x0d, 0x65, 0x6e, + 0x75, 0x6d, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x0d, 0x20, 0x03, 0x28, + 0x0e, 0x32, 0x1b, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x50, 0x72, 0x6f, + 0x74, 0x6f, 0x32, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x45, 0x6e, 0x75, 0x6d, 0x42, 0x02, + 0x10, 0x01, 0x52, 0x0c, 0x65, 0x6e, 0x75, 0x6d, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x22, 0x88, 0x01, 0x0a, 0x1d, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, + 0x32, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69, 0x72, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x66, 0x69, 0x72, 0x73, 0x74, 0x12, 0x2d, 0x0a, 0x06, 0x73, 0x65, 0x63, 0x6f, + 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x15, 0xaa, 0x9b, 0xbc, 0xc7, 0x0d, 0x0f, + 0xe7, 0x89, 0xb9, 0xe5, 0x88, 0xa5, 0xe3, 0x82, 0xb3, 0xe3, 0x83, 0xa9, 0xe3, 0x83, 0xa0, 0x52, + 0x06, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x12, 0x22, 0x0a, 0x05, 0x74, 0x68, 0x69, 0x72, 0x64, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0c, 0xaa, 0x9b, 0xbc, 0xc7, 0x0d, 0x06, 0x73, 0x65, + 0x63, 0x6f, 0x6e, 0x64, 0x52, 0x05, 0x74, 0x68, 0x69, 0x72, 0x64, 0x2a, 0x5b, 0x0a, 0x11, 0x50, + 0x72, 0x6f, 0x74, 0x6f, 0x32, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x45, 0x6e, 0x75, 0x6d, + 0x12, 0x10, 0x0a, 0x0c, 0x50, 0x32, 0x5f, 0x55, 0x4e, 0x44, 0x45, 0x46, 0x49, 0x4e, 0x45, 0x44, + 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x50, 0x32, 0x5f, 0x54, 0x48, 0x49, 0x4e, 0x47, 0x10, 0x01, + 0x12, 0x12, 0x0a, 0x0e, 0x50, 0x32, 0x5f, 0x4f, 0x54, 0x48, 0x45, 0x52, 0x5f, 0x54, 0x48, 0x49, + 0x4e, 0x47, 0x10, 0x02, 0x12, 0x12, 0x0a, 0x0e, 0x50, 0x32, 0x5f, 0x54, 0x48, 0x49, 0x52, 0x44, + 0x5f, 0x54, 0x48, 0x49, 0x4e, 0x47, 0x10, 0x03, 0x42, 0x3d, 0x5a, 0x3b, 0x63, 0x6c, 0x6f, 0x75, + 0x64, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x2f, + 0x62, 0x69, 0x67, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, + 0x2f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x77, 0x72, 0x69, 0x74, 0x65, 0x72, 0x2f, 0x74, + 0x65, 0x73, 0x74, 0x64, 0x61, 0x74, 0x61, } var ( diff --git a/bigquery/storage/managedwriter/testdata/validation_proto2.proto b/bigquery/storage/managedwriter/testdata/validation_proto2.proto index 8191f8fac3e..160a7c5761a 100644 --- a/bigquery/storage/managedwriter/testdata/validation_proto2.proto +++ b/bigquery/storage/managedwriter/testdata/validation_proto2.proto @@ -16,7 +16,8 @@ syntax = "proto2"; package testdata; -import "internal/annotations/annotations.proto"; +// Source protos located in github.com/googleapis/googleapis +import "google/cloud/bigquery/storage/v1/annotations.proto"; option go_package = "cloud.google.com/go/bigquery/storage/managedwriter/testdata"; From 26590534c98ae9e87bbd3bb526248c5adb891fc2 Mon Sep 17 00:00:00 2001 From: Seth Hollyman Date: Thu, 15 Sep 2022 05:00:00 +0000 Subject: [PATCH 09/15] switch field name encoding for unicode conversion --- bigquery/storage/managedwriter/adapt/protoconversion.go | 7 ++++--- .../storage/managedwriter/adapt/protoconversion_test.go | 4 ++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/bigquery/storage/managedwriter/adapt/protoconversion.go b/bigquery/storage/managedwriter/adapt/protoconversion.go index 90db4135af0..8bba59cb221 100644 --- a/bigquery/storage/managedwriter/adapt/protoconversion.go +++ b/bigquery/storage/managedwriter/adapt/protoconversion.go @@ -332,9 +332,10 @@ func tableFieldSchemaToFieldDescriptorProto(field *storagepb.TableFieldSchema, i } } if nameRequiresAnnotation(name) { - // TODO: need agreement across implementations on how to normalize? - // Possibly use golang.org/x/text/unicode/norm for ascii-fying? - fdp.Name = proto.String(fmt.Sprintf("unicode_field_%d", fdp.GetNumber())) + // Use a prefix + base64 encoded name when annotations bear the actual name. + // We also redact trailing equals characters as they are not allowed for name identifiers. + encoded := strings.TrimRight(base64.StdEncoding.EncodeToString([]byte(name)), "=") + fdp.Name = proto.String(fmt.Sprintf("col_%s", encoded)) opts := fdp.GetOptions() if opts == nil { fdp.Options = &descriptorpb.FieldOptions{} diff --git a/bigquery/storage/managedwriter/adapt/protoconversion_test.go b/bigquery/storage/managedwriter/adapt/protoconversion_test.go index cf4257ac910..d51fef05038 100644 --- a/bigquery/storage/managedwriter/adapt/protoconversion_test.go +++ b/bigquery/storage/managedwriter/adapt/protoconversion_test.go @@ -431,13 +431,13 @@ func TestSchemaToProtoConversion(t *testing.T) { Type: descriptorpb.FieldDescriptorProto_TYPE_STRING.Enum(), Label: descriptorpb.FieldDescriptorProto_LABEL_OPTIONAL.Enum()}, { - Name: proto.String("unicode_field_2"), + Name: proto.String("col_54Gr"), Number: proto.Int32(2), Type: descriptorpb.FieldDescriptorProto_TYPE_INT64.Enum(), Options: &descriptorpb.FieldOptions{}, Label: descriptorpb.FieldDescriptorProto_LABEL_REQUIRED.Enum()}, { - Name: proto.String("unicode_field_3"), + Name: proto.String("col_5rC0X2FkZGljdA"), Number: proto.Int32(3), Type: descriptorpb.FieldDescriptorProto_TYPE_BYTES.Enum(), Options: &descriptorpb.FieldOptions{}, From 199d01a0eb4a31b6841314ae779f703e90683f75 Mon Sep 17 00:00:00 2001 From: Seth Hollyman Date: Fri, 16 Sep 2022 20:00:42 +0000 Subject: [PATCH 10/15] address reviewer feedback re: allowed characters --- bigquery/storage/managedwriter/adapt/protoconversion.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/bigquery/storage/managedwriter/adapt/protoconversion.go b/bigquery/storage/managedwriter/adapt/protoconversion.go index 8bba59cb221..faaf3e7a341 100644 --- a/bigquery/storage/managedwriter/adapt/protoconversion.go +++ b/bigquery/storage/managedwriter/adapt/protoconversion.go @@ -333,8 +333,9 @@ func tableFieldSchemaToFieldDescriptorProto(field *storagepb.TableFieldSchema, i } if nameRequiresAnnotation(name) { // Use a prefix + base64 encoded name when annotations bear the actual name. - // We also redact trailing equals characters as they are not allowed for name identifiers. - encoded := strings.TrimRight(base64.StdEncoding.EncodeToString([]byte(name)), "=") + // Base 64 standard encoding may also contain certain characters (+,/,=) which + // we remove from the generated name. + encoded := strings.Trim(base64.StdEncoding.EncodeToString([]byte(name)), "+/=") fdp.Name = proto.String(fmt.Sprintf("col_%s", encoded)) opts := fdp.GetOptions() if opts == nil { From b8a804440bb604968b1ae2386b624fccaeaf7720 Mon Sep 17 00:00:00 2001 From: Seth Hollyman Date: Wed, 21 Sep 2022 20:36:14 +0000 Subject: [PATCH 11/15] remove stale test --- bigquery/schema_test.go | 33 --------------------------------- 1 file changed, 33 deletions(-) diff --git a/bigquery/schema_test.go b/bigquery/schema_test.go index 74e4a045104..d3ca8f7fa70 100644 --- a/bigquery/schema_test.go +++ b/bigquery/schema_test.go @@ -1326,36 +1326,3 @@ func TestSchemaToJSONFields(t *testing.T) { } } } - -func TestUnicodeSchemaConversion(t *testing.T) { - - tableMeta := &TableMetadata{ - Schema: Schema{ - { - Name: "first", - Type: StringFieldType, - }, - { - Name: "second", - Type: StringFieldType, - }, - { - Name: "\u7279\u5225\u30b3\u30e9\u30e0", - Type: StringFieldType, - }, - { - Name: "特別コラム", - Type: IntegerFieldType, - }, - }, - } - bqTable, err := tableMeta.toBQ() - if err != nil { - t.Fatalf("toBQ(): %v", err) - } - b, err := bqTable.MarshalJSON() - if err != nil { - t.Fatalf("MarshalJSON: %v", err) - } - t.Logf("JSON: %s", string(b)) -} From d6428bcf7f0e571757a46b63533ec57ceffa4d96 Mon Sep 17 00:00:00 2001 From: Seth Hollyman Date: Wed, 21 Sep 2022 22:38:55 +0000 Subject: [PATCH 12/15] rely on name validation directly from protobuf --- bigquery/storage/managedwriter/adapt/protoconversion.go | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/bigquery/storage/managedwriter/adapt/protoconversion.go b/bigquery/storage/managedwriter/adapt/protoconversion.go index faaf3e7a341..37a89543e12 100644 --- a/bigquery/storage/managedwriter/adapt/protoconversion.go +++ b/bigquery/storage/managedwriter/adapt/protoconversion.go @@ -18,7 +18,6 @@ import ( "encoding/base64" "fmt" "strings" - "unicode" storagepb "google.golang.org/genproto/googleapis/cloud/bigquery/storage/v1" "google.golang.org/protobuf/proto" @@ -348,12 +347,7 @@ func tableFieldSchemaToFieldDescriptorProto(field *storagepb.TableFieldSchema, i // nameRequiresAnnotation determines whether a field name requires unicode-annotation. func nameRequiresAnnotation(in string) bool { - for i := 0; i < len(in); i++ { - if in[i] > unicode.MaxASCII { - return true - } - } - return false + return !protoreflect.Name(in).IsValid() } // NormalizeDescriptor builds a self-contained DescriptorProto suitable for communicating schema From 4a12d9c32817ae4baadc730df61527efe41db3a9 Mon Sep 17 00:00:00 2001 From: Seth Hollyman Date: Wed, 21 Sep 2022 22:52:30 +0000 Subject: [PATCH 13/15] more test cases --- .../adapt/protoconversion_test.go | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/bigquery/storage/managedwriter/adapt/protoconversion_test.go b/bigquery/storage/managedwriter/adapt/protoconversion_test.go index d51fef05038..21cef98e1bb 100644 --- a/bigquery/storage/managedwriter/adapt/protoconversion_test.go +++ b/bigquery/storage/managedwriter/adapt/protoconversion_test.go @@ -414,12 +414,14 @@ func TestSchemaToProtoConversion(t *testing.T) { }, }, { - description: "unicode", + description: "indirect names", bq: &storagepb.TableSchema{ Fields: []*storagepb.TableFieldSchema{ {Name: "foo", Type: storagepb.TableFieldSchema_STRING, Mode: storagepb.TableFieldSchema_NULLABLE}, {Name: "火", Type: storagepb.TableFieldSchema_INT64, Mode: storagepb.TableFieldSchema_REQUIRED}, {Name: "水_addict", Type: storagepb.TableFieldSchema_BYTES, Mode: storagepb.TableFieldSchema_REPEATED}, + {Name: "0col", Type: storagepb.TableFieldSchema_INT64, Mode: storagepb.TableFieldSchema_NULLABLE}, + {Name: "funny-name", Type: storagepb.TableFieldSchema_INT64, Mode: storagepb.TableFieldSchema_NULLABLE}, }}, wantProto2: func() *descriptorpb.DescriptorProto { dp := &descriptorpb.DescriptorProto{ @@ -443,10 +445,24 @@ func TestSchemaToProtoConversion(t *testing.T) { Options: &descriptorpb.FieldOptions{}, Label: descriptorpb.FieldDescriptorProto_LABEL_REPEATED.Enum(), }, + { + Name: proto.String("col_MGNvbA"), + Number: proto.Int32(4), + Type: descriptorpb.FieldDescriptorProto_TYPE_INT64.Enum(), + Options: &descriptorpb.FieldOptions{}, + Label: descriptorpb.FieldDescriptorProto_LABEL_OPTIONAL.Enum()}, + { + Name: proto.String("col_ZnVubnktbmFtZQ"), + Number: proto.Int32(5), + Type: descriptorpb.FieldDescriptorProto_TYPE_INT64.Enum(), + Options: &descriptorpb.FieldOptions{}, + Label: descriptorpb.FieldDescriptorProto_LABEL_OPTIONAL.Enum()}, }, } proto.SetExtension(dp.Field[1].Options, storagepb.E_ColumnName, "火") proto.SetExtension(dp.Field[2].Options, storagepb.E_ColumnName, "水_addict") + proto.SetExtension(dp.Field[3].Options, storagepb.E_ColumnName, "0col") + proto.SetExtension(dp.Field[4].Options, storagepb.E_ColumnName, "funny-name") return dp }(), }, From 65581369b19364fd626603e06b9fba12bbbc6fdc Mon Sep 17 00:00:00 2001 From: Seth Hollyman Date: Wed, 21 Sep 2022 23:11:46 +0000 Subject: [PATCH 14/15] disable indirection validation test until all test projects have access --- .../storage/managedwriter/validation_test.go | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/bigquery/storage/managedwriter/validation_test.go b/bigquery/storage/managedwriter/validation_test.go index 7cea2814b58..91c07b4929d 100644 --- a/bigquery/storage/managedwriter/validation_test.go +++ b/bigquery/storage/managedwriter/validation_test.go @@ -22,8 +22,6 @@ import ( "cloud.google.com/go/bigquery" "cloud.google.com/go/bigquery/storage/managedwriter/adapt" "cloud.google.com/go/bigquery/storage/managedwriter/testdata" - "github.com/googleapis/gax-go/v2/apierror" - storagepb "google.golang.org/genproto/googleapis/cloud/bigquery/storage/v1" "google.golang.org/protobuf/proto" "google.golang.org/protobuf/reflect/protodesc" "google.golang.org/protobuf/reflect/protoreflect" @@ -390,6 +388,8 @@ func TestValidation_Values(t *testing.T) { withIntegerArraySum("enum_repeated", 7, 1), }, }, + /* skipping this test case until all test projects have the feature enabled. + Tracked internally via b/248113818 { description: "proto2 w/column annotations", tableSchema: testdata.ValidationColumnAnnotations, @@ -405,6 +405,7 @@ func TestValidation_Values(t *testing.T) { withStringValueCount("特別コラム", "second_val", 1), }, }, + */ } // Common setup. @@ -460,17 +461,6 @@ func TestValidation_Values(t *testing.T) { } if _, err = result.GetResult(ctx); err != nil { t.Errorf("%s append response error: %v", tc.description, err) - if apiErr, ok := apierror.FromError(err); ok { - t.Errorf("dbg: %+v", apiErr.Details().DebugInfo) - // We now have an instance of APIError, which directly exposes more specific - // details about multiple failure conditions include transport-level errors. - storageErr := &storagepb.StorageError{} - if e := apiErr.Details().ExtractProtoMessage(storageErr); e == nil { - // storageErr now contains service-specific information about the error. - t.Errorf("Received service-specific error code %s", storageErr.GetCode().String()) - t.Errorf("Msg: %s", storageErr.GetErrorMessage()) - } - } continue } // Validate table. From a059390edf90bdf40e8aaf177fd49844cfc62698 Mon Sep 17 00:00:00 2001 From: Seth Hollyman Date: Tue, 4 Oct 2022 18:41:00 +0000 Subject: [PATCH 15/15] enable test --- bigquery/storage/managedwriter/validation_test.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/bigquery/storage/managedwriter/validation_test.go b/bigquery/storage/managedwriter/validation_test.go index 91c07b4929d..ab4ce69b8d8 100644 --- a/bigquery/storage/managedwriter/validation_test.go +++ b/bigquery/storage/managedwriter/validation_test.go @@ -388,8 +388,6 @@ func TestValidation_Values(t *testing.T) { withIntegerArraySum("enum_repeated", 7, 1), }, }, - /* skipping this test case until all test projects have the feature enabled. - Tracked internally via b/248113818 { description: "proto2 w/column annotations", tableSchema: testdata.ValidationColumnAnnotations, @@ -405,7 +403,6 @@ func TestValidation_Values(t *testing.T) { withStringValueCount("特別コラム", "second_val", 1), }, }, - */ } // Common setup.