diff --git a/Makefile b/Makefile index 221258f..5fced48 100644 --- a/Makefile +++ b/Makefile @@ -13,7 +13,7 @@ build: run: build cd ${cmd_dir} && \ - ./${binary} --log-level="*:TRACE" + ./${binary} --log-level="*:DEBUG" debug: build cd ${cmd_dir} && \ diff --git a/cmd/connector/config/config.toml b/cmd/connector/config/config.toml index df34d7c..7431256 100644 --- a/cmd/connector/config/config.toml +++ b/cmd/connector/config/config.toml @@ -38,10 +38,15 @@ # Defines the number of active persisters to keep open NumPersistersToKeep = 2 - # Defines the first commitable meta block round - # If it is set to 0, it will try to get last rounds info from storage, - # otherwise, it will try to sync from observers - FirstCommitableBlock = 0 + # Defines the first commitable blocks per shard. + # The nonces have to be setup based on metachain shard, they can be fetched by interogating + # this gateway endpoint `https://gateway.multiversx.com/block/4294967295/by-nonce/` + FirstCommitableBlocks = [ + { ShardID = "metachain", Nonce = 0 }, + { ShardID = "0", Nonce = 0 }, + { ShardID = "1", Nonce = 0 }, + { ShardID = "2", Nonce = 0 } + ] [Publisher] # RetryDurationInMiliseconds defines the retry duration for common publisher diff --git a/cmd/connector/flags.go b/cmd/connector/flags.go index 45c5e76..990506f 100644 --- a/cmd/connector/flags.go +++ b/cmd/connector/flags.go @@ -6,7 +6,7 @@ import ( ) const ( - defaultConfigPath = "./config/config.toml" + defaultConfigPath = "config/config.toml" ) var ( diff --git a/common/common.go b/common/common.go index fc6c71b..93e6376 100644 --- a/common/common.go +++ b/common/common.go @@ -1,5 +1,10 @@ package common +import ( + "github.com/multiversx/mx-chain-core-go/core" + "github.com/multiversx/mx-chain-ws-connector-firehose-go/config" +) + // DBMode defines db mode type type DBMode string @@ -15,3 +20,19 @@ const ( // cache, and they will be dumped to persister when necessary OptimizedPersisterDBMode DBMode = "optimized-persister" ) + +// ConvertFirstCommitableBlocks will convert first commitable blocks map +func ConvertFirstCommitableBlocks(blocks []config.FirstCommitableBlock) (map[uint32]uint64, error) { + newBlocks := make(map[uint32]uint64, len(blocks)) + + for _, firstCommitableBlock := range blocks { + shardID, err := core.ConvertShardIDToUint32(firstCommitableBlock.ShardID) + if err != nil { + return nil, err + } + + newBlocks[shardID] = firstCommitableBlock.Nonce + } + + return newBlocks, nil +} diff --git a/config/config.go b/config/config.go index 16815cd..04621db 100644 --- a/config/config.go +++ b/config/config.go @@ -22,12 +22,18 @@ type WebSocketConfig struct { Version uint32 } -// DataPoolConfig will map data poil configuration +// DataPoolConfig will map data pool configuration type DataPoolConfig struct { - MaxDelta uint64 - PruningWindow uint64 - NumPersistersToKeep int - FirstCommitableBlock uint64 + MaxDelta uint64 + PruningWindow uint64 + NumPersistersToKeep int + FirstCommitableBlocks []FirstCommitableBlock +} + +// FirstCommitableBlock will map first commitable block configuration +type FirstCommitableBlock struct { + ShardID string + Nonce uint64 } // PublisherConfig will map publisher configuration diff --git a/connector/connectorRunner.go b/connector/connectorRunner.go index 31c8209..a6b0be5 100644 --- a/connector/connectorRunner.go +++ b/connector/connectorRunner.go @@ -45,58 +45,62 @@ func (cr *connectorRunner) Run() error { gogoProtoMarshaller := &marshal.GogoProtoMarshalizer{} protoMarshaller := &process.ProtoMarshaller{} - outportBlockConverter := process.NewOutportBlockConverter(gogoProtoMarshaller, protoMarshaller) + firstCommitableBlocks, err := common.ConvertFirstCommitableBlocks(cr.config.DataPool.FirstCommitableBlocks) + if err != nil { + return err + } - blockContainer, err := factory.CreateBlockContainer() + outportBlockConverter, err := process.NewOutportBlockConverter(gogoProtoMarshaller, protoMarshaller) if err != nil { return err } - blocksStorer, err := factory.CreateStorer(*cr.config, cr.dbMode) + blockContainer, err := factory.CreateBlockContainer() if err != nil { return err } - baseBlocksPool, err := process.NewBlocksPool( - blocksStorer, - protoMarshaller, - cr.config.DataPool.MaxDelta, - cr.config.DataPool.PruningWindow, - cr.config.DataPool.FirstCommitableBlock, - ) + blocksStorer, err := factory.CreateStorer(*cr.config, cr.dbMode) if err != nil { return err } - outportBlocksPool, err := process.NewHyperOutportBlocksPool( - baseBlocksPool, - protoMarshaller, - ) + argsBlocksPool := process.DataPoolArgs{ + Storer: blocksStorer, + Marshaller: protoMarshaller, + MaxDelta: cr.config.DataPool.MaxDelta, + CleanupInterval: cr.config.DataPool.PruningWindow, + FirstCommitableBlocks: firstCommitableBlocks, + } + dataPool, err := process.NewDataPool(argsBlocksPool) if err != nil { return err } - dataAggregator, err := process.NewDataAggregator(outportBlocksPool) + blocksPool, err := process.NewBlocksPool( + dataPool, + protoMarshaller, + ) if err != nil { return err } - server, err := factory.CreateGRPCServer(cr.enableGrpcServer, cr.config.GRPC, outportBlocksPool, dataAggregator) + dataAggregator, err := process.NewDataAggregator(blocksPool) if err != nil { return err } - hyperBlockPublisher, err := factory.CreatePublisher(cr.enableGrpcServer, blockContainer) + hyperBlockPublisher, err := factory.CreatePublisher(cr.config, cr.enableGrpcServer, blockContainer, blocksPool, dataAggregator) if err != nil { return fmt.Errorf("cannot create publisher: %w", err) } publisherHandler, err := process.NewPublisherHandler( hyperBlockPublisher, - outportBlocksPool, + blocksPool, dataAggregator, cr.config.Publisher.RetryDurationInMiliseconds, - cr.config.DataPool.FirstCommitableBlock, + firstCommitableBlocks, ) if err != nil { return fmt.Errorf("cannot create common publisher: %w", err) @@ -105,7 +109,7 @@ func (cr *connectorRunner) Run() error { dataProcessor, err := process.NewDataProcessor( publisherHandler, gogoProtoMarshaller, - outportBlocksPool, + blocksPool, outportBlockConverter, ) if err != nil { @@ -126,7 +130,7 @@ func (cr *connectorRunner) Run() error { log.Info("application closing, calling Close on all subcomponents...") - err = outportBlocksPool.Close() + err = publisherHandler.Close() if err != nil { log.Error(err.Error()) } @@ -136,8 +140,9 @@ func (cr *connectorRunner) Run() error { log.Error(err.Error()) } - if server != nil { - server.Close() + err = blocksPool.Close() + if err != nil { + log.Error(err.Error()) } return err diff --git a/data/blockCheckpoint.pb.go b/data/blockCheckpoint.pb.go index 537dcf1..74db43e 100644 --- a/data/blockCheckpoint.pb.go +++ b/data/blockCheckpoint.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 +// protoc-gen-go v1.28.1 // protoc v3.6.1 // source: blockCheckpoint.proto @@ -25,7 +25,7 @@ type BlockCheckpoint struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - LastRounds map[uint32]uint64 `protobuf:"bytes,1,rep,name=LastRounds,proto3" json:"LastRounds,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"` + LastNonces map[uint32]uint64 `protobuf:"bytes,1,rep,name=LastNonces,proto3" json:"LastNonces,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"` } func (x *BlockCheckpoint) Reset() { @@ -60,9 +60,9 @@ func (*BlockCheckpoint) Descriptor() ([]byte, []int) { return file_blockCheckpoint_proto_rawDescGZIP(), []int{0} } -func (x *BlockCheckpoint) GetLastRounds() map[uint32]uint64 { +func (x *BlockCheckpoint) GetLastNonces() map[uint32]uint64 { if x != nil { - return x.LastRounds + return x.LastNonces } return nil } @@ -73,12 +73,12 @@ var file_blockCheckpoint_proto_rawDesc = []byte{ 0x0a, 0x15, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x05, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x98, 0x01, 0x0a, 0x0f, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, - 0x6e, 0x74, 0x12, 0x46, 0x0a, 0x0a, 0x4c, 0x61, 0x73, 0x74, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x73, + 0x6e, 0x74, 0x12, 0x46, 0x0a, 0x0a, 0x4c, 0x61, 0x73, 0x74, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x2e, 0x4c, - 0x61, 0x73, 0x74, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, - 0x4c, 0x61, 0x73, 0x74, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x4c, 0x61, - 0x73, 0x74, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x61, 0x73, 0x74, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, + 0x4c, 0x61, 0x73, 0x74, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x4c, 0x61, + 0x73, 0x74, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x43, 0x5a, 0x41, 0x67, 0x69, 0x74, @@ -104,10 +104,10 @@ func file_blockCheckpoint_proto_rawDescGZIP() []byte { var file_blockCheckpoint_proto_msgTypes = make([]protoimpl.MessageInfo, 2) var file_blockCheckpoint_proto_goTypes = []interface{}{ (*BlockCheckpoint)(nil), // 0: proto.BlockCheckpoint - nil, // 1: proto.BlockCheckpoint.LastRoundsEntry + nil, // 1: proto.BlockCheckpoint.LastNoncesEntry } var file_blockCheckpoint_proto_depIdxs = []int32{ - 1, // 0: proto.BlockCheckpoint.LastRounds:type_name -> proto.BlockCheckpoint.LastRoundsEntry + 1, // 0: proto.BlockCheckpoint.LastNonces:type_name -> proto.BlockCheckpoint.LastNoncesEntry 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 diff --git a/data/blockCheckpoint.proto b/data/blockCheckpoint.proto index b8cde6b..363559b 100644 --- a/data/blockCheckpoint.proto +++ b/data/blockCheckpoint.proto @@ -5,5 +5,5 @@ package proto; option go_package = "github.com/multiversx/mx-chain-ws-connector-template-go/data;data"; message BlockCheckpoint { - map LastRounds = 1; + map LastNonces = 1; } diff --git a/data/hyperOutportBlocks/hyperOutportBlock.pb.go b/data/hyperOutportBlocks/hyperOutportBlock.pb.go index f8d2c30..aae2a49 100644 --- a/data/hyperOutportBlocks/hyperOutportBlock.pb.go +++ b/data/hyperOutportBlocks/hyperOutportBlock.pb.go @@ -1,12 +1,13 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 -// protoc v3.6.1 -// source: hyperOutportBlock.proto +// protoc-gen-go v1.28.1 +// protoc v3.12.4 +// source: data/hyperOutportBlocks/hyperOutportBlock.proto package hyperOutportBlocks import ( + duration "github.com/golang/protobuf/ptypes/duration" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" @@ -69,11 +70,11 @@ func (x PeerAction) String() string { } func (PeerAction) Descriptor() protoreflect.EnumDescriptor { - return file_hyperOutportBlock_proto_enumTypes[0].Descriptor() + return file_data_hyperOutportBlocks_hyperOutportBlock_proto_enumTypes[0].Descriptor() } func (PeerAction) Type() protoreflect.EnumType { - return &file_hyperOutportBlock_proto_enumTypes[0] + return &file_data_hyperOutportBlocks_hyperOutportBlock_proto_enumTypes[0] } func (x PeerAction) Number() protoreflect.EnumNumber { @@ -82,7 +83,7 @@ func (x PeerAction) Number() protoreflect.EnumNumber { // Deprecated: Use PeerAction.Descriptor instead. func (PeerAction) EnumDescriptor() ([]byte, []int) { - return file_hyperOutportBlock_proto_rawDescGZIP(), []int{0} + return file_data_hyperOutportBlocks_hyperOutportBlock_proto_rawDescGZIP(), []int{0} } type Type int32 @@ -130,11 +131,11 @@ func (x Type) String() string { } func (Type) Descriptor() protoreflect.EnumDescriptor { - return file_hyperOutportBlock_proto_enumTypes[1].Descriptor() + return file_data_hyperOutportBlocks_hyperOutportBlock_proto_enumTypes[1].Descriptor() } func (Type) Type() protoreflect.EnumType { - return &file_hyperOutportBlock_proto_enumTypes[1] + return &file_data_hyperOutportBlocks_hyperOutportBlock_proto_enumTypes[1] } func (x Type) Number() protoreflect.EnumNumber { @@ -143,7 +144,7 @@ func (x Type) Number() protoreflect.EnumNumber { // Deprecated: Use Type.Descriptor instead. func (Type) EnumDescriptor() ([]byte, []int) { - return file_hyperOutportBlock_proto_rawDescGZIP(), []int{1} + return file_data_hyperOutportBlocks_hyperOutportBlock_proto_rawDescGZIP(), []int{1} } type HyperOutportBlock struct { @@ -158,7 +159,7 @@ type HyperOutportBlock struct { func (x *HyperOutportBlock) Reset() { *x = HyperOutportBlock{} if protoimpl.UnsafeEnabled { - mi := &file_hyperOutportBlock_proto_msgTypes[0] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -171,7 +172,7 @@ func (x *HyperOutportBlock) String() string { func (*HyperOutportBlock) ProtoMessage() {} func (x *HyperOutportBlock) ProtoReflect() protoreflect.Message { - mi := &file_hyperOutportBlock_proto_msgTypes[0] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -184,7 +185,7 @@ func (x *HyperOutportBlock) ProtoReflect() protoreflect.Message { // Deprecated: Use HyperOutportBlock.ProtoReflect.Descriptor instead. func (*HyperOutportBlock) Descriptor() ([]byte, []int) { - return file_hyperOutportBlock_proto_rawDescGZIP(), []int{0} + return file_data_hyperOutportBlocks_hyperOutportBlock_proto_rawDescGZIP(), []int{0} } func (x *HyperOutportBlock) GetMetaOutportBlock() *MetaOutportBlock { @@ -213,7 +214,7 @@ type NotarizedHeaderOutportData struct { func (x *NotarizedHeaderOutportData) Reset() { *x = NotarizedHeaderOutportData{} if protoimpl.UnsafeEnabled { - mi := &file_hyperOutportBlock_proto_msgTypes[1] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -226,7 +227,7 @@ func (x *NotarizedHeaderOutportData) String() string { func (*NotarizedHeaderOutportData) ProtoMessage() {} func (x *NotarizedHeaderOutportData) ProtoReflect() protoreflect.Message { - mi := &file_hyperOutportBlock_proto_msgTypes[1] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -239,7 +240,7 @@ func (x *NotarizedHeaderOutportData) ProtoReflect() protoreflect.Message { // Deprecated: Use NotarizedHeaderOutportData.ProtoReflect.Descriptor instead. func (*NotarizedHeaderOutportData) Descriptor() ([]byte, []int) { - return file_hyperOutportBlock_proto_rawDescGZIP(), []int{1} + return file_data_hyperOutportBlocks_hyperOutportBlock_proto_rawDescGZIP(), []int{1} } func (x *NotarizedHeaderOutportData) GetNotarizedHeaderHash() string { @@ -267,7 +268,7 @@ type BlockHashRequest struct { func (x *BlockHashRequest) Reset() { *x = BlockHashRequest{} if protoimpl.UnsafeEnabled { - mi := &file_hyperOutportBlock_proto_msgTypes[2] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -280,7 +281,7 @@ func (x *BlockHashRequest) String() string { func (*BlockHashRequest) ProtoMessage() {} func (x *BlockHashRequest) ProtoReflect() protoreflect.Message { - mi := &file_hyperOutportBlock_proto_msgTypes[2] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -293,7 +294,7 @@ func (x *BlockHashRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use BlockHashRequest.ProtoReflect.Descriptor instead. func (*BlockHashRequest) Descriptor() ([]byte, []int) { - return file_hyperOutportBlock_proto_rawDescGZIP(), []int{2} + return file_data_hyperOutportBlocks_hyperOutportBlock_proto_rawDescGZIP(), []int{2} } func (x *BlockHashRequest) GetHash() string { @@ -303,6 +304,61 @@ func (x *BlockHashRequest) GetHash() string { return "" } +type BlockHashStreamRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Hash string `protobuf:"bytes,1,opt,name=hash,proto3" json:"hash,omitempty"` + PollingInterval *duration.Duration `protobuf:"bytes,2,opt,name=pollingInterval,proto3" json:"pollingInterval,omitempty"` +} + +func (x *BlockHashStreamRequest) Reset() { + *x = BlockHashStreamRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BlockHashStreamRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BlockHashStreamRequest) ProtoMessage() {} + +func (x *BlockHashStreamRequest) ProtoReflect() protoreflect.Message { + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[3] + 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 BlockHashStreamRequest.ProtoReflect.Descriptor instead. +func (*BlockHashStreamRequest) Descriptor() ([]byte, []int) { + return file_data_hyperOutportBlocks_hyperOutportBlock_proto_rawDescGZIP(), []int{3} +} + +func (x *BlockHashStreamRequest) GetHash() string { + if x != nil { + return x.Hash + } + return "" +} + +func (x *BlockHashStreamRequest) GetPollingInterval() *duration.Duration { + if x != nil { + return x.PollingInterval + } + return nil +} + type BlockNonceRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -314,7 +370,7 @@ type BlockNonceRequest struct { func (x *BlockNonceRequest) Reset() { *x = BlockNonceRequest{} if protoimpl.UnsafeEnabled { - mi := &file_hyperOutportBlock_proto_msgTypes[3] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -327,7 +383,7 @@ func (x *BlockNonceRequest) String() string { func (*BlockNonceRequest) ProtoMessage() {} func (x *BlockNonceRequest) ProtoReflect() protoreflect.Message { - mi := &file_hyperOutportBlock_proto_msgTypes[3] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -340,7 +396,7 @@ func (x *BlockNonceRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use BlockNonceRequest.ProtoReflect.Descriptor instead. func (*BlockNonceRequest) Descriptor() ([]byte, []int) { - return file_hyperOutportBlock_proto_rawDescGZIP(), []int{3} + return file_data_hyperOutportBlocks_hyperOutportBlock_proto_rawDescGZIP(), []int{4} } func (x *BlockNonceRequest) GetNonce() uint64 { @@ -350,6 +406,61 @@ func (x *BlockNonceRequest) GetNonce() uint64 { return 0 } +type BlockNonceStreamRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Nonce uint64 `protobuf:"varint,1,opt,name=nonce,proto3" json:"nonce,omitempty"` + PollingInterval *duration.Duration `protobuf:"bytes,2,opt,name=pollingInterval,proto3" json:"pollingInterval,omitempty"` +} + +func (x *BlockNonceStreamRequest) Reset() { + *x = BlockNonceStreamRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BlockNonceStreamRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BlockNonceStreamRequest) ProtoMessage() {} + +func (x *BlockNonceStreamRequest) ProtoReflect() protoreflect.Message { + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_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 BlockNonceStreamRequest.ProtoReflect.Descriptor instead. +func (*BlockNonceStreamRequest) Descriptor() ([]byte, []int) { + return file_data_hyperOutportBlocks_hyperOutportBlock_proto_rawDescGZIP(), []int{5} +} + +func (x *BlockNonceStreamRequest) GetNonce() uint64 { + if x != nil { + return x.Nonce + } + return 0 +} + +func (x *BlockNonceStreamRequest) GetPollingInterval() *duration.Duration { + if x != nil { + return x.PollingInterval + } + return nil +} + type MetaOutportBlock struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -370,7 +481,7 @@ type MetaOutportBlock struct { func (x *MetaOutportBlock) Reset() { *x = MetaOutportBlock{} if protoimpl.UnsafeEnabled { - mi := &file_hyperOutportBlock_proto_msgTypes[4] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -383,7 +494,7 @@ func (x *MetaOutportBlock) String() string { func (*MetaOutportBlock) ProtoMessage() {} func (x *MetaOutportBlock) ProtoReflect() protoreflect.Message { - mi := &file_hyperOutportBlock_proto_msgTypes[4] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -396,7 +507,7 @@ func (x *MetaOutportBlock) ProtoReflect() protoreflect.Message { // Deprecated: Use MetaOutportBlock.ProtoReflect.Descriptor instead. func (*MetaOutportBlock) Descriptor() ([]byte, []int) { - return file_hyperOutportBlock_proto_rawDescGZIP(), []int{4} + return file_data_hyperOutportBlocks_hyperOutportBlock_proto_rawDescGZIP(), []int{6} } func (x *MetaOutportBlock) GetShardID() uint32 { @@ -489,7 +600,7 @@ type ShardOutportBlock struct { func (x *ShardOutportBlock) Reset() { *x = ShardOutportBlock{} if protoimpl.UnsafeEnabled { - mi := &file_hyperOutportBlock_proto_msgTypes[5] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -502,7 +613,7 @@ func (x *ShardOutportBlock) String() string { func (*ShardOutportBlock) ProtoMessage() {} func (x *ShardOutportBlock) ProtoReflect() protoreflect.Message { - mi := &file_hyperOutportBlock_proto_msgTypes[5] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -515,7 +626,7 @@ func (x *ShardOutportBlock) ProtoReflect() protoreflect.Message { // Deprecated: Use ShardOutportBlock.ProtoReflect.Descriptor instead. func (*ShardOutportBlock) Descriptor() ([]byte, []int) { - return file_hyperOutportBlock_proto_rawDescGZIP(), []int{5} + return file_data_hyperOutportBlocks_hyperOutportBlock_proto_rawDescGZIP(), []int{7} } func (x *ShardOutportBlock) GetShardID() uint32 { @@ -624,7 +735,7 @@ type Header struct { func (x *Header) Reset() { *x = Header{} if protoimpl.UnsafeEnabled { - mi := &file_hyperOutportBlock_proto_msgTypes[6] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -637,7 +748,7 @@ func (x *Header) String() string { func (*Header) ProtoMessage() {} func (x *Header) ProtoReflect() protoreflect.Message { - mi := &file_hyperOutportBlock_proto_msgTypes[6] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -650,7 +761,7 @@ func (x *Header) ProtoReflect() protoreflect.Message { // Deprecated: Use Header.ProtoReflect.Descriptor instead. func (*Header) Descriptor() ([]byte, []int) { - return file_hyperOutportBlock_proto_rawDescGZIP(), []int{6} + return file_data_hyperOutportBlocks_hyperOutportBlock_proto_rawDescGZIP(), []int{8} } func (x *Header) GetNonce() uint64 { @@ -856,7 +967,7 @@ type MetaHeader struct { func (x *MetaHeader) Reset() { *x = MetaHeader{} if protoimpl.UnsafeEnabled { - mi := &file_hyperOutportBlock_proto_msgTypes[7] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -869,7 +980,7 @@ func (x *MetaHeader) String() string { func (*MetaHeader) ProtoMessage() {} func (x *MetaHeader) ProtoReflect() protoreflect.Message { - mi := &file_hyperOutportBlock_proto_msgTypes[7] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -882,7 +993,7 @@ func (x *MetaHeader) ProtoReflect() protoreflect.Message { // Deprecated: Use MetaHeader.ProtoReflect.Descriptor instead. func (*MetaHeader) Descriptor() ([]byte, []int) { - return file_hyperOutportBlock_proto_rawDescGZIP(), []int{7} + return file_data_hyperOutportBlocks_hyperOutportBlock_proto_rawDescGZIP(), []int{9} } func (x *MetaHeader) GetNonce() uint64 { @@ -1076,7 +1187,7 @@ type MiniBlockHeader struct { func (x *MiniBlockHeader) Reset() { *x = MiniBlockHeader{} if protoimpl.UnsafeEnabled { - mi := &file_hyperOutportBlock_proto_msgTypes[8] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1089,7 +1200,7 @@ func (x *MiniBlockHeader) String() string { func (*MiniBlockHeader) ProtoMessage() {} func (x *MiniBlockHeader) ProtoReflect() protoreflect.Message { - mi := &file_hyperOutportBlock_proto_msgTypes[8] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1102,7 +1213,7 @@ func (x *MiniBlockHeader) ProtoReflect() protoreflect.Message { // Deprecated: Use MiniBlockHeader.ProtoReflect.Descriptor instead. func (*MiniBlockHeader) Descriptor() ([]byte, []int) { - return file_hyperOutportBlock_proto_rawDescGZIP(), []int{8} + return file_data_hyperOutportBlocks_hyperOutportBlock_proto_rawDescGZIP(), []int{10} } func (x *MiniBlockHeader) GetHash() []byte { @@ -1160,7 +1271,7 @@ type PeerChange struct { func (x *PeerChange) Reset() { *x = PeerChange{} if protoimpl.UnsafeEnabled { - mi := &file_hyperOutportBlock_proto_msgTypes[9] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1173,7 +1284,7 @@ func (x *PeerChange) String() string { func (*PeerChange) ProtoMessage() {} func (x *PeerChange) ProtoReflect() protoreflect.Message { - mi := &file_hyperOutportBlock_proto_msgTypes[9] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1186,7 +1297,7 @@ func (x *PeerChange) ProtoReflect() protoreflect.Message { // Deprecated: Use PeerChange.ProtoReflect.Descriptor instead. func (*PeerChange) Descriptor() ([]byte, []int) { - return file_hyperOutportBlock_proto_rawDescGZIP(), []int{9} + return file_data_hyperOutportBlocks_hyperOutportBlock_proto_rawDescGZIP(), []int{11} } func (x *PeerChange) GetPubKey() []byte { @@ -1225,7 +1336,7 @@ type BlockData struct { func (x *BlockData) Reset() { *x = BlockData{} if protoimpl.UnsafeEnabled { - mi := &file_hyperOutportBlock_proto_msgTypes[10] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1238,7 +1349,7 @@ func (x *BlockData) String() string { func (*BlockData) ProtoMessage() {} func (x *BlockData) ProtoReflect() protoreflect.Message { - mi := &file_hyperOutportBlock_proto_msgTypes[10] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1251,7 +1362,7 @@ func (x *BlockData) ProtoReflect() protoreflect.Message { // Deprecated: Use BlockData.ProtoReflect.Descriptor instead. func (*BlockData) Descriptor() ([]byte, []int) { - return file_hyperOutportBlock_proto_rawDescGZIP(), []int{10} + return file_data_hyperOutportBlocks_hyperOutportBlock_proto_rawDescGZIP(), []int{12} } func (x *BlockData) GetShardID() uint32 { @@ -1360,7 +1471,7 @@ type MetaBlockData struct { func (x *MetaBlockData) Reset() { *x = MetaBlockData{} if protoimpl.UnsafeEnabled { - mi := &file_hyperOutportBlock_proto_msgTypes[11] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1373,7 +1484,7 @@ func (x *MetaBlockData) String() string { func (*MetaBlockData) ProtoMessage() {} func (x *MetaBlockData) ProtoReflect() protoreflect.Message { - mi := &file_hyperOutportBlock_proto_msgTypes[11] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1386,7 +1497,7 @@ func (x *MetaBlockData) ProtoReflect() protoreflect.Message { // Deprecated: Use MetaBlockData.ProtoReflect.Descriptor instead. func (*MetaBlockData) Descriptor() ([]byte, []int) { - return file_hyperOutportBlock_proto_rawDescGZIP(), []int{11} + return file_data_hyperOutportBlocks_hyperOutportBlock_proto_rawDescGZIP(), []int{13} } func (x *MetaBlockData) GetShardID() uint32 { @@ -1497,7 +1608,7 @@ type ShardData struct { func (x *ShardData) Reset() { *x = ShardData{} if protoimpl.UnsafeEnabled { - mi := &file_hyperOutportBlock_proto_msgTypes[12] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1510,7 +1621,7 @@ func (x *ShardData) String() string { func (*ShardData) ProtoMessage() {} func (x *ShardData) ProtoReflect() protoreflect.Message { - mi := &file_hyperOutportBlock_proto_msgTypes[12] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1523,7 +1634,7 @@ func (x *ShardData) ProtoReflect() protoreflect.Message { // Deprecated: Use ShardData.ProtoReflect.Descriptor instead. func (*ShardData) Descriptor() ([]byte, []int) { - return file_hyperOutportBlock_proto_rawDescGZIP(), []int{12} + return file_data_hyperOutportBlocks_hyperOutportBlock_proto_rawDescGZIP(), []int{14} } func (x *ShardData) GetShardID() uint32 { @@ -1637,7 +1748,7 @@ type EpochStart struct { func (x *EpochStart) Reset() { *x = EpochStart{} if protoimpl.UnsafeEnabled { - mi := &file_hyperOutportBlock_proto_msgTypes[13] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1650,7 +1761,7 @@ func (x *EpochStart) String() string { func (*EpochStart) ProtoMessage() {} func (x *EpochStart) ProtoReflect() protoreflect.Message { - mi := &file_hyperOutportBlock_proto_msgTypes[13] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1663,7 +1774,7 @@ func (x *EpochStart) ProtoReflect() protoreflect.Message { // Deprecated: Use EpochStart.ProtoReflect.Descriptor instead. func (*EpochStart) Descriptor() ([]byte, []int) { - return file_hyperOutportBlock_proto_rawDescGZIP(), []int{13} + return file_data_hyperOutportBlocks_hyperOutportBlock_proto_rawDescGZIP(), []int{15} } func (x *EpochStart) GetLastFinalizedHeaders() []*EpochStartShardData { @@ -1700,7 +1811,7 @@ type EpochStartShardData struct { func (x *EpochStartShardData) Reset() { *x = EpochStartShardData{} if protoimpl.UnsafeEnabled { - mi := &file_hyperOutportBlock_proto_msgTypes[14] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1713,7 +1824,7 @@ func (x *EpochStartShardData) String() string { func (*EpochStartShardData) ProtoMessage() {} func (x *EpochStartShardData) ProtoReflect() protoreflect.Message { - mi := &file_hyperOutportBlock_proto_msgTypes[14] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1726,7 +1837,7 @@ func (x *EpochStartShardData) ProtoReflect() protoreflect.Message { // Deprecated: Use EpochStartShardData.ProtoReflect.Descriptor instead. func (*EpochStartShardData) Descriptor() ([]byte, []int) { - return file_hyperOutportBlock_proto_rawDescGZIP(), []int{14} + return file_data_hyperOutportBlocks_hyperOutportBlock_proto_rawDescGZIP(), []int{16} } func (x *EpochStartShardData) GetShardID() uint32 { @@ -1817,7 +1928,7 @@ type Economics struct { func (x *Economics) Reset() { *x = Economics{} if protoimpl.UnsafeEnabled { - mi := &file_hyperOutportBlock_proto_msgTypes[15] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1830,7 +1941,7 @@ func (x *Economics) String() string { func (*Economics) ProtoMessage() {} func (x *Economics) ProtoReflect() protoreflect.Message { - mi := &file_hyperOutportBlock_proto_msgTypes[15] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1843,7 +1954,7 @@ func (x *Economics) ProtoReflect() protoreflect.Message { // Deprecated: Use Economics.ProtoReflect.Descriptor instead. func (*Economics) Descriptor() ([]byte, []int) { - return file_hyperOutportBlock_proto_rawDescGZIP(), []int{15} + return file_data_hyperOutportBlocks_hyperOutportBlock_proto_rawDescGZIP(), []int{17} } func (x *Economics) GetTotalSupply() []byte { @@ -1920,7 +2031,7 @@ type PeerData struct { func (x *PeerData) Reset() { *x = PeerData{} if protoimpl.UnsafeEnabled { - mi := &file_hyperOutportBlock_proto_msgTypes[16] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1933,7 +2044,7 @@ func (x *PeerData) String() string { func (*PeerData) ProtoMessage() {} func (x *PeerData) ProtoReflect() protoreflect.Message { - mi := &file_hyperOutportBlock_proto_msgTypes[16] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1946,7 +2057,7 @@ func (x *PeerData) ProtoReflect() protoreflect.Message { // Deprecated: Use PeerData.ProtoReflect.Descriptor instead. func (*PeerData) Descriptor() ([]byte, []int) { - return file_hyperOutportBlock_proto_rawDescGZIP(), []int{16} + return file_data_hyperOutportBlocks_hyperOutportBlock_proto_rawDescGZIP(), []int{18} } func (x *PeerData) GetAddress() []byte { @@ -2002,7 +2113,7 @@ type TransactionPool struct { func (x *TransactionPool) Reset() { *x = TransactionPool{} if protoimpl.UnsafeEnabled { - mi := &file_hyperOutportBlock_proto_msgTypes[17] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2015,7 +2126,7 @@ func (x *TransactionPool) String() string { func (*TransactionPool) ProtoMessage() {} func (x *TransactionPool) ProtoReflect() protoreflect.Message { - mi := &file_hyperOutportBlock_proto_msgTypes[17] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2028,7 +2139,7 @@ func (x *TransactionPool) ProtoReflect() protoreflect.Message { // Deprecated: Use TransactionPool.ProtoReflect.Descriptor instead. func (*TransactionPool) Descriptor() ([]byte, []int) { - return file_hyperOutportBlock_proto_rawDescGZIP(), []int{17} + return file_data_hyperOutportBlocks_hyperOutportBlock_proto_rawDescGZIP(), []int{19} } func (x *TransactionPool) GetTransactions() map[string]*TxInfo { @@ -2100,7 +2211,7 @@ type FeeInfo struct { func (x *FeeInfo) Reset() { *x = FeeInfo{} if protoimpl.UnsafeEnabled { - mi := &file_hyperOutportBlock_proto_msgTypes[18] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2113,7 +2224,7 @@ func (x *FeeInfo) String() string { func (*FeeInfo) ProtoMessage() {} func (x *FeeInfo) ProtoReflect() protoreflect.Message { - mi := &file_hyperOutportBlock_proto_msgTypes[18] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2126,7 +2237,7 @@ func (x *FeeInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use FeeInfo.ProtoReflect.Descriptor instead. func (*FeeInfo) Descriptor() ([]byte, []int) { - return file_hyperOutportBlock_proto_rawDescGZIP(), []int{18} + return file_data_hyperOutportBlocks_hyperOutportBlock_proto_rawDescGZIP(), []int{20} } func (x *FeeInfo) GetGasUsed() uint64 { @@ -2163,7 +2274,7 @@ type TxInfo struct { func (x *TxInfo) Reset() { *x = TxInfo{} if protoimpl.UnsafeEnabled { - mi := &file_hyperOutportBlock_proto_msgTypes[19] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2176,7 +2287,7 @@ func (x *TxInfo) String() string { func (*TxInfo) ProtoMessage() {} func (x *TxInfo) ProtoReflect() protoreflect.Message { - mi := &file_hyperOutportBlock_proto_msgTypes[19] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2189,7 +2300,7 @@ func (x *TxInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use TxInfo.ProtoReflect.Descriptor instead. func (*TxInfo) Descriptor() ([]byte, []int) { - return file_hyperOutportBlock_proto_rawDescGZIP(), []int{19} + return file_data_hyperOutportBlocks_hyperOutportBlock_proto_rawDescGZIP(), []int{21} } func (x *TxInfo) GetTransaction() *Transaction { @@ -2226,7 +2337,7 @@ type SCRInfo struct { func (x *SCRInfo) Reset() { *x = SCRInfo{} if protoimpl.UnsafeEnabled { - mi := &file_hyperOutportBlock_proto_msgTypes[20] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2239,7 +2350,7 @@ func (x *SCRInfo) String() string { func (*SCRInfo) ProtoMessage() {} func (x *SCRInfo) ProtoReflect() protoreflect.Message { - mi := &file_hyperOutportBlock_proto_msgTypes[20] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2252,7 +2363,7 @@ func (x *SCRInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use SCRInfo.ProtoReflect.Descriptor instead. func (*SCRInfo) Descriptor() ([]byte, []int) { - return file_hyperOutportBlock_proto_rawDescGZIP(), []int{20} + return file_data_hyperOutportBlocks_hyperOutportBlock_proto_rawDescGZIP(), []int{22} } func (x *SCRInfo) GetSmartContractResult() *SmartContractResult { @@ -2288,7 +2399,7 @@ type LogData struct { func (x *LogData) Reset() { *x = LogData{} if protoimpl.UnsafeEnabled { - mi := &file_hyperOutportBlock_proto_msgTypes[21] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2301,7 +2412,7 @@ func (x *LogData) String() string { func (*LogData) ProtoMessage() {} func (x *LogData) ProtoReflect() protoreflect.Message { - mi := &file_hyperOutportBlock_proto_msgTypes[21] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2314,7 +2425,7 @@ func (x *LogData) ProtoReflect() protoreflect.Message { // Deprecated: Use LogData.ProtoReflect.Descriptor instead. func (*LogData) Descriptor() ([]byte, []int) { - return file_hyperOutportBlock_proto_rawDescGZIP(), []int{21} + return file_data_hyperOutportBlocks_hyperOutportBlock_proto_rawDescGZIP(), []int{23} } func (x *LogData) GetTxHash() string { @@ -2343,7 +2454,7 @@ type RewardInfo struct { func (x *RewardInfo) Reset() { *x = RewardInfo{} if protoimpl.UnsafeEnabled { - mi := &file_hyperOutportBlock_proto_msgTypes[22] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2356,7 +2467,7 @@ func (x *RewardInfo) String() string { func (*RewardInfo) ProtoMessage() {} func (x *RewardInfo) ProtoReflect() protoreflect.Message { - mi := &file_hyperOutportBlock_proto_msgTypes[22] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2369,7 +2480,7 @@ func (x *RewardInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use RewardInfo.ProtoReflect.Descriptor instead. func (*RewardInfo) Descriptor() ([]byte, []int) { - return file_hyperOutportBlock_proto_rawDescGZIP(), []int{22} + return file_data_hyperOutportBlocks_hyperOutportBlock_proto_rawDescGZIP(), []int{24} } func (x *RewardInfo) GetReward() *RewardTx { @@ -2400,7 +2511,7 @@ type HeaderGasConsumption struct { func (x *HeaderGasConsumption) Reset() { *x = HeaderGasConsumption{} if protoimpl.UnsafeEnabled { - mi := &file_hyperOutportBlock_proto_msgTypes[23] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2413,7 +2524,7 @@ func (x *HeaderGasConsumption) String() string { func (*HeaderGasConsumption) ProtoMessage() {} func (x *HeaderGasConsumption) ProtoReflect() protoreflect.Message { - mi := &file_hyperOutportBlock_proto_msgTypes[23] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2426,7 +2537,7 @@ func (x *HeaderGasConsumption) ProtoReflect() protoreflect.Message { // Deprecated: Use HeaderGasConsumption.ProtoReflect.Descriptor instead. func (*HeaderGasConsumption) Descriptor() ([]byte, []int) { - return file_hyperOutportBlock_proto_rawDescGZIP(), []int{23} + return file_data_hyperOutportBlocks_hyperOutportBlock_proto_rawDescGZIP(), []int{25} } func (x *HeaderGasConsumption) GetGasProvided() uint64 { @@ -2469,7 +2580,7 @@ type ValidatorRatingInfo struct { func (x *ValidatorRatingInfo) Reset() { *x = ValidatorRatingInfo{} if protoimpl.UnsafeEnabled { - mi := &file_hyperOutportBlock_proto_msgTypes[24] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2482,7 +2593,7 @@ func (x *ValidatorRatingInfo) String() string { func (*ValidatorRatingInfo) ProtoMessage() {} func (x *ValidatorRatingInfo) ProtoReflect() protoreflect.Message { - mi := &file_hyperOutportBlock_proto_msgTypes[24] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2495,7 +2606,7 @@ func (x *ValidatorRatingInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidatorRatingInfo.ProtoReflect.Descriptor instead. func (*ValidatorRatingInfo) Descriptor() ([]byte, []int) { - return file_hyperOutportBlock_proto_rawDescGZIP(), []int{24} + return file_data_hyperOutportBlocks_hyperOutportBlock_proto_rawDescGZIP(), []int{26} } func (x *ValidatorRatingInfo) GetPublicKey() string { @@ -2525,7 +2636,7 @@ type ValidatorsRating struct { func (x *ValidatorsRating) Reset() { *x = ValidatorsRating{} if protoimpl.UnsafeEnabled { - mi := &file_hyperOutportBlock_proto_msgTypes[25] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2538,7 +2649,7 @@ func (x *ValidatorsRating) String() string { func (*ValidatorsRating) ProtoMessage() {} func (x *ValidatorsRating) ProtoReflect() protoreflect.Message { - mi := &file_hyperOutportBlock_proto_msgTypes[25] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2551,7 +2662,7 @@ func (x *ValidatorsRating) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidatorsRating.ProtoReflect.Descriptor instead. func (*ValidatorsRating) Descriptor() ([]byte, []int) { - return file_hyperOutportBlock_proto_rawDescGZIP(), []int{25} + return file_data_hyperOutportBlocks_hyperOutportBlock_proto_rawDescGZIP(), []int{27} } func (x *ValidatorsRating) GetShardID() uint32 { @@ -2591,7 +2702,7 @@ type RoundInfo struct { func (x *RoundInfo) Reset() { *x = RoundInfo{} if protoimpl.UnsafeEnabled { - mi := &file_hyperOutportBlock_proto_msgTypes[26] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2604,7 +2715,7 @@ func (x *RoundInfo) String() string { func (*RoundInfo) ProtoMessage() {} func (x *RoundInfo) ProtoReflect() protoreflect.Message { - mi := &file_hyperOutportBlock_proto_msgTypes[26] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2617,7 +2728,7 @@ func (x *RoundInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use RoundInfo.ProtoReflect.Descriptor instead. func (*RoundInfo) Descriptor() ([]byte, []int) { - return file_hyperOutportBlock_proto_rawDescGZIP(), []int{26} + return file_data_hyperOutportBlocks_hyperOutportBlock_proto_rawDescGZIP(), []int{28} } func (x *RoundInfo) GetRound() uint64 { @@ -2674,7 +2785,7 @@ type RoundsInfo struct { func (x *RoundsInfo) Reset() { *x = RoundsInfo{} if protoimpl.UnsafeEnabled { - mi := &file_hyperOutportBlock_proto_msgTypes[27] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2687,7 +2798,7 @@ func (x *RoundsInfo) String() string { func (*RoundsInfo) ProtoMessage() {} func (x *RoundsInfo) ProtoReflect() protoreflect.Message { - mi := &file_hyperOutportBlock_proto_msgTypes[27] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2700,7 +2811,7 @@ func (x *RoundsInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use RoundsInfo.ProtoReflect.Descriptor instead. func (*RoundsInfo) Descriptor() ([]byte, []int) { - return file_hyperOutportBlock_proto_rawDescGZIP(), []int{27} + return file_data_hyperOutportBlocks_hyperOutportBlock_proto_rawDescGZIP(), []int{29} } func (x *RoundsInfo) GetShardID() uint32 { @@ -2728,7 +2839,7 @@ type PubKeys struct { func (x *PubKeys) Reset() { *x = PubKeys{} if protoimpl.UnsafeEnabled { - mi := &file_hyperOutportBlock_proto_msgTypes[28] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2741,7 +2852,7 @@ func (x *PubKeys) String() string { func (*PubKeys) ProtoMessage() {} func (x *PubKeys) ProtoReflect() protoreflect.Message { - mi := &file_hyperOutportBlock_proto_msgTypes[28] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2754,7 +2865,7 @@ func (x *PubKeys) ProtoReflect() protoreflect.Message { // Deprecated: Use PubKeys.ProtoReflect.Descriptor instead. func (*PubKeys) Descriptor() ([]byte, []int) { - return file_hyperOutportBlock_proto_rawDescGZIP(), []int{28} + return file_data_hyperOutportBlocks_hyperOutportBlock_proto_rawDescGZIP(), []int{30} } func (x *PubKeys) GetKeys() [][]byte { @@ -2777,7 +2888,7 @@ type ValidatorsPubKeys struct { func (x *ValidatorsPubKeys) Reset() { *x = ValidatorsPubKeys{} if protoimpl.UnsafeEnabled { - mi := &file_hyperOutportBlock_proto_msgTypes[29] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2790,7 +2901,7 @@ func (x *ValidatorsPubKeys) String() string { func (*ValidatorsPubKeys) ProtoMessage() {} func (x *ValidatorsPubKeys) ProtoReflect() protoreflect.Message { - mi := &file_hyperOutportBlock_proto_msgTypes[29] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2803,7 +2914,7 @@ func (x *ValidatorsPubKeys) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidatorsPubKeys.ProtoReflect.Descriptor instead. func (*ValidatorsPubKeys) Descriptor() ([]byte, []int) { - return file_hyperOutportBlock_proto_rawDescGZIP(), []int{29} + return file_data_hyperOutportBlocks_hyperOutportBlock_proto_rawDescGZIP(), []int{31} } func (x *ValidatorsPubKeys) GetShardID() uint32 { @@ -2840,7 +2951,7 @@ type Accounts struct { func (x *Accounts) Reset() { *x = Accounts{} if protoimpl.UnsafeEnabled { - mi := &file_hyperOutportBlock_proto_msgTypes[30] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2853,7 +2964,7 @@ func (x *Accounts) String() string { func (*Accounts) ProtoMessage() {} func (x *Accounts) ProtoReflect() protoreflect.Message { - mi := &file_hyperOutportBlock_proto_msgTypes[30] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2866,7 +2977,7 @@ func (x *Accounts) ProtoReflect() protoreflect.Message { // Deprecated: Use Accounts.ProtoReflect.Descriptor instead. func (*Accounts) Descriptor() ([]byte, []int) { - return file_hyperOutportBlock_proto_rawDescGZIP(), []int{30} + return file_data_hyperOutportBlocks_hyperOutportBlock_proto_rawDescGZIP(), []int{32} } func (x *Accounts) GetShardID() uint32 { @@ -2902,7 +3013,7 @@ type FinalizedBlock struct { func (x *FinalizedBlock) Reset() { *x = FinalizedBlock{} if protoimpl.UnsafeEnabled { - mi := &file_hyperOutportBlock_proto_msgTypes[31] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2915,7 +3026,7 @@ func (x *FinalizedBlock) String() string { func (*FinalizedBlock) ProtoMessage() {} func (x *FinalizedBlock) ProtoReflect() protoreflect.Message { - mi := &file_hyperOutportBlock_proto_msgTypes[31] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2928,7 +3039,7 @@ func (x *FinalizedBlock) ProtoReflect() protoreflect.Message { // Deprecated: Use FinalizedBlock.ProtoReflect.Descriptor instead. func (*FinalizedBlock) Descriptor() ([]byte, []int) { - return file_hyperOutportBlock_proto_rawDescGZIP(), []int{31} + return file_data_hyperOutportBlocks_hyperOutportBlock_proto_rawDescGZIP(), []int{33} } func (x *FinalizedBlock) GetShardID() uint32 { @@ -2956,7 +3067,7 @@ type Shard struct { func (x *Shard) Reset() { *x = Shard{} if protoimpl.UnsafeEnabled { - mi := &file_hyperOutportBlock_proto_msgTypes[32] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2969,7 +3080,7 @@ func (x *Shard) String() string { func (*Shard) ProtoMessage() {} func (x *Shard) ProtoReflect() protoreflect.Message { - mi := &file_hyperOutportBlock_proto_msgTypes[32] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2982,7 +3093,7 @@ func (x *Shard) ProtoReflect() protoreflect.Message { // Deprecated: Use Shard.ProtoReflect.Descriptor instead. func (*Shard) Descriptor() ([]byte, []int) { - return file_hyperOutportBlock_proto_rawDescGZIP(), []int{32} + return file_data_hyperOutportBlocks_hyperOutportBlock_proto_rawDescGZIP(), []int{34} } func (x *Shard) GetShardID() uint32 { @@ -3003,7 +3114,7 @@ type Body struct { func (x *Body) Reset() { *x = Body{} if protoimpl.UnsafeEnabled { - mi := &file_hyperOutportBlock_proto_msgTypes[33] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3016,7 +3127,7 @@ func (x *Body) String() string { func (*Body) ProtoMessage() {} func (x *Body) ProtoReflect() protoreflect.Message { - mi := &file_hyperOutportBlock_proto_msgTypes[33] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3029,7 +3140,7 @@ func (x *Body) ProtoReflect() protoreflect.Message { // Deprecated: Use Body.ProtoReflect.Descriptor instead. func (*Body) Descriptor() ([]byte, []int) { - return file_hyperOutportBlock_proto_rawDescGZIP(), []int{33} + return file_data_hyperOutportBlocks_hyperOutportBlock_proto_rawDescGZIP(), []int{35} } func (x *Body) GetMiniBlocks() []*MiniBlock { @@ -3054,7 +3165,7 @@ type MiniBlock struct { func (x *MiniBlock) Reset() { *x = MiniBlock{} if protoimpl.UnsafeEnabled { - mi := &file_hyperOutportBlock_proto_msgTypes[34] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3067,7 +3178,7 @@ func (x *MiniBlock) String() string { func (*MiniBlock) ProtoMessage() {} func (x *MiniBlock) ProtoReflect() protoreflect.Message { - mi := &file_hyperOutportBlock_proto_msgTypes[34] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[36] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3080,7 +3191,7 @@ func (x *MiniBlock) ProtoReflect() protoreflect.Message { // Deprecated: Use MiniBlock.ProtoReflect.Descriptor instead. func (*MiniBlock) Descriptor() ([]byte, []int) { - return file_hyperOutportBlock_proto_rawDescGZIP(), []int{34} + return file_data_hyperOutportBlocks_hyperOutportBlock_proto_rawDescGZIP(), []int{36} } func (x *MiniBlock) GetTxHashes() [][]byte { @@ -3144,7 +3255,7 @@ type Transaction struct { func (x *Transaction) Reset() { *x = Transaction{} if protoimpl.UnsafeEnabled { - mi := &file_hyperOutportBlock_proto_msgTypes[35] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3157,7 +3268,7 @@ func (x *Transaction) String() string { func (*Transaction) ProtoMessage() {} func (x *Transaction) ProtoReflect() protoreflect.Message { - mi := &file_hyperOutportBlock_proto_msgTypes[35] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[37] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3170,7 +3281,7 @@ func (x *Transaction) ProtoReflect() protoreflect.Message { // Deprecated: Use Transaction.ProtoReflect.Descriptor instead. func (*Transaction) Descriptor() ([]byte, []int) { - return file_hyperOutportBlock_proto_rawDescGZIP(), []int{35} + return file_data_hyperOutportBlocks_hyperOutportBlock_proto_rawDescGZIP(), []int{37} } func (x *Transaction) GetNonce() uint64 { @@ -3304,7 +3415,7 @@ type SmartContractResult struct { func (x *SmartContractResult) Reset() { *x = SmartContractResult{} if protoimpl.UnsafeEnabled { - mi := &file_hyperOutportBlock_proto_msgTypes[36] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3317,7 +3428,7 @@ func (x *SmartContractResult) String() string { func (*SmartContractResult) ProtoMessage() {} func (x *SmartContractResult) ProtoReflect() protoreflect.Message { - mi := &file_hyperOutportBlock_proto_msgTypes[36] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3330,7 +3441,7 @@ func (x *SmartContractResult) ProtoReflect() protoreflect.Message { // Deprecated: Use SmartContractResult.ProtoReflect.Descriptor instead. func (*SmartContractResult) Descriptor() ([]byte, []int) { - return file_hyperOutportBlock_proto_rawDescGZIP(), []int{36} + return file_data_hyperOutportBlocks_hyperOutportBlock_proto_rawDescGZIP(), []int{38} } func (x *SmartContractResult) GetNonce() uint64 { @@ -3457,7 +3568,7 @@ type Log struct { func (x *Log) Reset() { *x = Log{} if protoimpl.UnsafeEnabled { - mi := &file_hyperOutportBlock_proto_msgTypes[37] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3470,7 +3581,7 @@ func (x *Log) String() string { func (*Log) ProtoMessage() {} func (x *Log) ProtoReflect() protoreflect.Message { - mi := &file_hyperOutportBlock_proto_msgTypes[37] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3483,7 +3594,7 @@ func (x *Log) ProtoReflect() protoreflect.Message { // Deprecated: Use Log.ProtoReflect.Descriptor instead. func (*Log) Descriptor() ([]byte, []int) { - return file_hyperOutportBlock_proto_rawDescGZIP(), []int{37} + return file_data_hyperOutportBlocks_hyperOutportBlock_proto_rawDescGZIP(), []int{39} } func (x *Log) GetAddress() []byte { @@ -3515,7 +3626,7 @@ type Event struct { func (x *Event) Reset() { *x = Event{} if protoimpl.UnsafeEnabled { - mi := &file_hyperOutportBlock_proto_msgTypes[38] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3528,7 +3639,7 @@ func (x *Event) String() string { func (*Event) ProtoMessage() {} func (x *Event) ProtoReflect() protoreflect.Message { - mi := &file_hyperOutportBlock_proto_msgTypes[38] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[40] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3541,7 +3652,7 @@ func (x *Event) ProtoReflect() protoreflect.Message { // Deprecated: Use Event.ProtoReflect.Descriptor instead. func (*Event) Descriptor() ([]byte, []int) { - return file_hyperOutportBlock_proto_rawDescGZIP(), []int{38} + return file_data_hyperOutportBlocks_hyperOutportBlock_proto_rawDescGZIP(), []int{40} } func (x *Event) GetAddress() []byte { @@ -3593,7 +3704,7 @@ type RewardTx struct { func (x *RewardTx) Reset() { *x = RewardTx{} if protoimpl.UnsafeEnabled { - mi := &file_hyperOutportBlock_proto_msgTypes[39] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3606,7 +3717,7 @@ func (x *RewardTx) String() string { func (*RewardTx) ProtoMessage() {} func (x *RewardTx) ProtoReflect() protoreflect.Message { - mi := &file_hyperOutportBlock_proto_msgTypes[39] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3619,7 +3730,7 @@ func (x *RewardTx) ProtoReflect() protoreflect.Message { // Deprecated: Use RewardTx.ProtoReflect.Descriptor instead. func (*RewardTx) Descriptor() ([]byte, []int) { - return file_hyperOutportBlock_proto_rawDescGZIP(), []int{39} + return file_data_hyperOutportBlocks_hyperOutportBlock_proto_rawDescGZIP(), []int{41} } func (x *RewardTx) GetRound() uint64 { @@ -3665,7 +3776,7 @@ type AlteredAccount struct { func (x *AlteredAccount) Reset() { *x = AlteredAccount{} if protoimpl.UnsafeEnabled { - mi := &file_hyperOutportBlock_proto_msgTypes[40] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3678,7 +3789,7 @@ func (x *AlteredAccount) String() string { func (*AlteredAccount) ProtoMessage() {} func (x *AlteredAccount) ProtoReflect() protoreflect.Message { - mi := &file_hyperOutportBlock_proto_msgTypes[40] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3691,7 +3802,7 @@ func (x *AlteredAccount) ProtoReflect() protoreflect.Message { // Deprecated: Use AlteredAccount.ProtoReflect.Descriptor instead. func (*AlteredAccount) Descriptor() ([]byte, []int) { - return file_hyperOutportBlock_proto_rawDescGZIP(), []int{40} + return file_data_hyperOutportBlocks_hyperOutportBlock_proto_rawDescGZIP(), []int{42} } func (x *AlteredAccount) GetAddress() string { @@ -3745,7 +3856,7 @@ type AccountTokenData struct { func (x *AccountTokenData) Reset() { *x = AccountTokenData{} if protoimpl.UnsafeEnabled { - mi := &file_hyperOutportBlock_proto_msgTypes[41] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3758,7 +3869,7 @@ func (x *AccountTokenData) String() string { func (*AccountTokenData) ProtoMessage() {} func (x *AccountTokenData) ProtoReflect() protoreflect.Message { - mi := &file_hyperOutportBlock_proto_msgTypes[41] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3771,7 +3882,7 @@ func (x *AccountTokenData) ProtoReflect() protoreflect.Message { // Deprecated: Use AccountTokenData.ProtoReflect.Descriptor instead. func (*AccountTokenData) Descriptor() ([]byte, []int) { - return file_hyperOutportBlock_proto_rawDescGZIP(), []int{41} + return file_data_hyperOutportBlocks_hyperOutportBlock_proto_rawDescGZIP(), []int{43} } func (x *AccountTokenData) GetNonce() uint64 { @@ -3833,7 +3944,7 @@ type TokenMetaData struct { func (x *TokenMetaData) Reset() { *x = TokenMetaData{} if protoimpl.UnsafeEnabled { - mi := &file_hyperOutportBlock_proto_msgTypes[42] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3846,7 +3957,7 @@ func (x *TokenMetaData) String() string { func (*TokenMetaData) ProtoMessage() {} func (x *TokenMetaData) ProtoReflect() protoreflect.Message { - mi := &file_hyperOutportBlock_proto_msgTypes[42] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3859,7 +3970,7 @@ func (x *TokenMetaData) ProtoReflect() protoreflect.Message { // Deprecated: Use TokenMetaData.ProtoReflect.Descriptor instead. func (*TokenMetaData) Descriptor() ([]byte, []int) { - return file_hyperOutportBlock_proto_rawDescGZIP(), []int{42} + return file_data_hyperOutportBlocks_hyperOutportBlock_proto_rawDescGZIP(), []int{44} } func (x *TokenMetaData) GetNonce() uint64 { @@ -3922,7 +4033,7 @@ type AdditionalAccountTokenData struct { func (x *AdditionalAccountTokenData) Reset() { *x = AdditionalAccountTokenData{} if protoimpl.UnsafeEnabled { - mi := &file_hyperOutportBlock_proto_msgTypes[43] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3935,7 +4046,7 @@ func (x *AdditionalAccountTokenData) String() string { func (*AdditionalAccountTokenData) ProtoMessage() {} func (x *AdditionalAccountTokenData) ProtoReflect() protoreflect.Message { - mi := &file_hyperOutportBlock_proto_msgTypes[43] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3948,7 +4059,7 @@ func (x *AdditionalAccountTokenData) ProtoReflect() protoreflect.Message { // Deprecated: Use AdditionalAccountTokenData.ProtoReflect.Descriptor instead. func (*AdditionalAccountTokenData) Descriptor() ([]byte, []int) { - return file_hyperOutportBlock_proto_rawDescGZIP(), []int{43} + return file_data_hyperOutportBlocks_hyperOutportBlock_proto_rawDescGZIP(), []int{45} } func (x *AdditionalAccountTokenData) GetIsNFTCreate() bool { @@ -3976,7 +4087,7 @@ type AdditionalAccountData struct { func (x *AdditionalAccountData) Reset() { *x = AdditionalAccountData{} if protoimpl.UnsafeEnabled { - mi := &file_hyperOutportBlock_proto_msgTypes[44] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3989,7 +4100,7 @@ func (x *AdditionalAccountData) String() string { func (*AdditionalAccountData) ProtoMessage() {} func (x *AdditionalAccountData) ProtoReflect() protoreflect.Message { - mi := &file_hyperOutportBlock_proto_msgTypes[44] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4002,7 +4113,7 @@ func (x *AdditionalAccountData) ProtoReflect() protoreflect.Message { // Deprecated: Use AdditionalAccountData.ProtoReflect.Descriptor instead. func (*AdditionalAccountData) Descriptor() ([]byte, []int) { - return file_hyperOutportBlock_proto_rawDescGZIP(), []int{44} + return file_data_hyperOutportBlocks_hyperOutportBlock_proto_rawDescGZIP(), []int{46} } func (x *AdditionalAccountData) GetIsSender() bool { @@ -4075,7 +4186,7 @@ type Receipt struct { func (x *Receipt) Reset() { *x = Receipt{} if protoimpl.UnsafeEnabled { - mi := &file_hyperOutportBlock_proto_msgTypes[45] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4088,7 +4199,7 @@ func (x *Receipt) String() string { func (*Receipt) ProtoMessage() {} func (x *Receipt) ProtoReflect() protoreflect.Message { - mi := &file_hyperOutportBlock_proto_msgTypes[45] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4101,7 +4212,7 @@ func (x *Receipt) ProtoReflect() protoreflect.Message { // Deprecated: Use Receipt.ProtoReflect.Descriptor instead. func (*Receipt) Descriptor() ([]byte, []int) { - return file_hyperOutportBlock_proto_rawDescGZIP(), []int{45} + return file_data_hyperOutportBlocks_hyperOutportBlock_proto_rawDescGZIP(), []int{47} } func (x *Receipt) GetValue() []byte { @@ -4143,7 +4254,7 @@ type BigInt struct { func (x *BigInt) Reset() { *x = BigInt{} if protoimpl.UnsafeEnabled { - mi := &file_hyperOutportBlock_proto_msgTypes[46] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4156,7 +4267,7 @@ func (x *BigInt) String() string { func (*BigInt) ProtoMessage() {} func (x *BigInt) ProtoReflect() protoreflect.Message { - mi := &file_hyperOutportBlock_proto_msgTypes[46] + mi := &file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4169,7 +4280,7 @@ func (x *BigInt) ProtoReflect() protoreflect.Message { // Deprecated: Use BigInt.ProtoReflect.Descriptor instead. func (*BigInt) Descriptor() ([]byte, []int) { - return file_hyperOutportBlock_proto_rawDescGZIP(), []int{46} + return file_data_hyperOutportBlocks_hyperOutportBlock_proto_rawDescGZIP(), []int{48} } func (x *BigInt) GetBytes() []byte { @@ -4179,971 +4290,1010 @@ func (x *BigInt) GetBytes() []byte { return nil } -var File_hyperOutportBlock_proto protoreflect.FileDescriptor - -var file_hyperOutportBlock_proto_rawDesc = []byte{ - 0x0a, 0x17, 0x68, 0x79, 0x70, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x6c, - 0x6f, 0x63, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x05, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x22, 0xbd, 0x01, 0x0a, 0x11, 0x48, 0x79, 0x70, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x6f, 0x72, - 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x43, 0x0a, 0x10, 0x4d, 0x65, 0x74, 0x61, 0x4f, 0x75, - 0x74, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x4f, 0x75, 0x74, - 0x70, 0x6f, 0x72, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x10, 0x4d, 0x65, 0x74, 0x61, 0x4f, - 0x75, 0x74, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x63, 0x0a, 0x1b, 0x4e, - 0x6f, 0x74, 0x61, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x4f, - 0x75, 0x74, 0x70, 0x6f, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x21, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4e, 0x6f, 0x74, 0x61, 0x72, 0x69, 0x7a, - 0x65, 0x64, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x6f, 0x72, 0x74, 0x44, - 0x61, 0x74, 0x61, 0x52, 0x1b, 0x4e, 0x6f, 0x74, 0x61, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x48, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x6f, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, - 0x22, 0x8c, 0x01, 0x0a, 0x1a, 0x4e, 0x6f, 0x74, 0x61, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x48, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x6f, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x12, - 0x30, 0x0a, 0x13, 0x4e, 0x6f, 0x74, 0x61, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x48, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x48, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x4e, 0x6f, - 0x74, 0x61, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x48, 0x61, 0x73, - 0x68, 0x12, 0x3c, 0x0a, 0x0c, 0x4f, 0x75, 0x74, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x6c, 0x6f, 0x63, - 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, - 0x53, 0x68, 0x61, 0x72, 0x64, 0x4f, 0x75, 0x74, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x6c, 0x6f, 0x63, - 0x6b, 0x52, 0x0c, 0x4f, 0x75, 0x74, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x22, - 0x26, 0x0a, 0x10, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x22, 0x29, 0x0a, 0x11, 0x42, 0x6c, 0x6f, 0x63, 0x6b, - 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, - 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6e, 0x6f, 0x6e, - 0x63, 0x65, 0x22, 0x9c, 0x05, 0x0a, 0x10, 0x4d, 0x65, 0x74, 0x61, 0x4f, 0x75, 0x74, 0x70, 0x6f, - 0x72, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x68, 0x61, 0x72, 0x64, - 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, - 0x44, 0x12, 0x32, 0x0a, 0x09, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x44, 0x61, 0x74, 0x61, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4d, 0x65, 0x74, - 0x61, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x44, 0x61, 0x74, 0x61, 0x52, 0x09, 0x42, 0x6c, 0x6f, 0x63, - 0x6b, 0x44, 0x61, 0x74, 0x61, 0x12, 0x40, 0x0a, 0x0f, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6f, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x0f, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6f, 0x6c, 0x12, 0x4f, 0x0a, 0x14, 0x48, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x47, 0x61, 0x73, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x48, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x47, 0x61, 0x73, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x14, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x47, 0x61, 0x73, 0x43, 0x6f, 0x6e, - 0x73, 0x75, 0x6d, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x56, 0x0a, 0x0f, 0x41, 0x6c, 0x74, 0x65, - 0x72, 0x65, 0x64, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x2c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x4f, 0x75, - 0x74, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x41, 0x6c, 0x74, 0x65, 0x72, - 0x65, 0x64, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x0f, 0x41, 0x6c, 0x74, 0x65, 0x72, 0x65, 0x64, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, - 0x12, 0x36, 0x0a, 0x16, 0x4e, 0x6f, 0x74, 0x61, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x48, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x73, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x16, 0x4e, 0x6f, 0x74, 0x61, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x48, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x73, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x4e, 0x75, 0x6d, 0x62, - 0x65, 0x72, 0x4f, 0x66, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x0e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, - 0x12, 0x26, 0x0a, 0x0e, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x73, 0x49, 0x6e, 0x64, 0x65, 0x78, - 0x65, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x04, 0x52, 0x0e, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, - 0x73, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x12, 0x36, 0x0a, 0x16, 0x48, 0x69, 0x67, 0x68, - 0x65, 0x73, 0x74, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x6f, 0x6e, - 0x63, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, 0x16, 0x48, 0x69, 0x67, 0x68, 0x65, 0x73, +var File_data_hyperOutportBlocks_hyperOutportBlock_proto protoreflect.FileDescriptor + +var file_data_hyperOutportBlocks_hyperOutportBlock_proto_rawDesc = []byte{ + 0x0a, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x2f, 0x68, 0x79, 0x70, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, + 0x6f, 0x72, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x2f, 0x68, 0x79, 0x70, 0x65, 0x72, 0x4f, + 0x75, 0x74, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x12, 0x05, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xbd, 0x01, 0x0a, 0x11, 0x48, 0x79, 0x70, + 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x43, + 0x0a, 0x10, 0x4d, 0x65, 0x74, 0x61, 0x4f, 0x75, 0x74, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x6c, 0x6f, + 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x4f, 0x75, 0x74, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x6c, 0x6f, 0x63, + 0x6b, 0x52, 0x10, 0x4d, 0x65, 0x74, 0x61, 0x4f, 0x75, 0x74, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x6c, + 0x6f, 0x63, 0x6b, 0x12, 0x63, 0x0a, 0x1b, 0x4e, 0x6f, 0x74, 0x61, 0x72, 0x69, 0x7a, 0x65, 0x64, + 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x6f, 0x72, 0x74, 0x44, 0x61, + 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x4e, 0x6f, 0x74, 0x61, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x4f, 0x75, 0x74, 0x70, 0x6f, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x52, 0x1b, 0x4e, 0x6f, 0x74, + 0x61, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x4f, 0x75, 0x74, + 0x70, 0x6f, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x22, 0x8c, 0x01, 0x0a, 0x1a, 0x4e, 0x6f, 0x74, + 0x61, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, + 0x6f, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x12, 0x30, 0x0a, 0x13, 0x4e, 0x6f, 0x74, 0x61, 0x72, + 0x69, 0x7a, 0x65, 0x64, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x48, 0x61, 0x73, 0x68, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x4e, 0x6f, 0x74, 0x61, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x48, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x48, 0x61, 0x73, 0x68, 0x12, 0x3c, 0x0a, 0x0c, 0x4f, 0x75, 0x74, + 0x70, 0x6f, 0x72, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x4f, 0x75, 0x74, + 0x70, 0x6f, 0x72, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x0c, 0x4f, 0x75, 0x74, 0x70, 0x6f, + 0x72, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0x26, 0x0a, 0x10, 0x42, 0x6c, 0x6f, 0x63, 0x6b, + 0x48, 0x61, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x68, + 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x22, + 0x71, 0x0a, 0x16, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x53, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, + 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x43, 0x0a, + 0x0f, 0x70, 0x6f, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x0f, 0x70, 0x6f, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, + 0x61, 0x6c, 0x22, 0x29, 0x0a, 0x11, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x6f, 0x6e, 0x63, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x22, 0x74, 0x0a, + 0x17, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, + 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x6f, 0x6e, 0x63, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x12, 0x43, + 0x0a, 0x0f, 0x70, 0x6f, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, + 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x0f, 0x70, 0x6f, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x74, 0x65, 0x72, + 0x76, 0x61, 0x6c, 0x22, 0x9c, 0x05, 0x0a, 0x10, 0x4d, 0x65, 0x74, 0x61, 0x4f, 0x75, 0x74, 0x70, + 0x6f, 0x72, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x68, 0x61, 0x72, + 0x64, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x53, 0x68, 0x61, 0x72, 0x64, + 0x49, 0x44, 0x12, 0x32, 0x0a, 0x09, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x44, 0x61, 0x74, 0x61, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4d, 0x65, + 0x74, 0x61, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x44, 0x61, 0x74, 0x61, 0x52, 0x09, 0x42, 0x6c, 0x6f, + 0x63, 0x6b, 0x44, 0x61, 0x74, 0x61, 0x12, 0x40, 0x0a, 0x0f, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6f, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x16, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x0f, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6f, 0x6c, 0x12, 0x4f, 0x0a, 0x14, 0x48, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x47, 0x61, 0x73, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x48, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x47, 0x61, 0x73, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x14, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x47, 0x61, 0x73, 0x43, 0x6f, + 0x6e, 0x73, 0x75, 0x6d, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x56, 0x0a, 0x0f, 0x41, 0x6c, 0x74, + 0x65, 0x72, 0x65, 0x64, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x4f, + 0x75, 0x74, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x41, 0x6c, 0x74, 0x65, + 0x72, 0x65, 0x64, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x0f, 0x41, 0x6c, 0x74, 0x65, 0x72, 0x65, 0x64, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x73, 0x12, 0x36, 0x0a, 0x16, 0x4e, 0x6f, 0x74, 0x61, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x48, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x73, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x16, 0x4e, 0x6f, 0x74, 0x61, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x48, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x73, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x4f, 0x66, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x0e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x53, 0x68, 0x61, 0x72, 0x64, + 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x73, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x65, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x04, 0x52, 0x0e, 0x53, 0x69, 0x67, 0x6e, 0x65, + 0x72, 0x73, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x12, 0x36, 0x0a, 0x16, 0x48, 0x69, 0x67, + 0x68, 0x65, 0x73, 0x74, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x6f, + 0x6e, 0x63, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, 0x16, 0x48, 0x69, 0x67, 0x68, 0x65, + 0x73, 0x74, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x6f, 0x6e, 0x63, + 0x65, 0x12, 0x34, 0x0a, 0x15, 0x48, 0x69, 0x67, 0x68, 0x65, 0x73, 0x74, 0x46, 0x69, 0x6e, 0x61, + 0x6c, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x15, 0x48, 0x69, 0x67, 0x68, 0x65, 0x73, 0x74, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x42, 0x6c, + 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x1a, 0x59, 0x0a, 0x14, 0x41, 0x6c, 0x74, 0x65, 0x72, + 0x65, 0x64, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x2b, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x15, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x41, 0x6c, 0x74, 0x65, 0x72, 0x65, 0x64, + 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x22, 0x9a, 0x05, 0x0a, 0x11, 0x53, 0x68, 0x61, 0x72, 0x64, 0x4f, 0x75, 0x74, 0x70, + 0x6f, 0x72, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x68, 0x61, 0x72, + 0x64, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x53, 0x68, 0x61, 0x72, 0x64, + 0x49, 0x44, 0x12, 0x2e, 0x0a, 0x09, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x44, 0x61, 0x74, 0x61, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x42, 0x6c, + 0x6f, 0x63, 0x6b, 0x44, 0x61, 0x74, 0x61, 0x52, 0x09, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x44, 0x61, + 0x74, 0x61, 0x12, 0x40, 0x0a, 0x0f, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x50, 0x6f, 0x6f, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, + 0x6f, 0x6f, 0x6c, 0x52, 0x0f, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x50, 0x6f, 0x6f, 0x6c, 0x12, 0x4f, 0x0a, 0x14, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x47, 0x61, + 0x73, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x47, 0x61, 0x73, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x14, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x47, 0x61, 0x73, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6d, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x57, 0x0a, 0x0f, 0x41, 0x6c, 0x74, 0x65, 0x72, 0x65, 0x64, + 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x4f, 0x75, 0x74, 0x70, + 0x6f, 0x72, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x41, 0x6c, 0x74, 0x65, 0x72, 0x65, 0x64, + 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x41, + 0x6c, 0x74, 0x65, 0x72, 0x65, 0x64, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12, 0x36, + 0x0a, 0x16, 0x4e, 0x6f, 0x74, 0x61, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x48, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x73, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x16, + 0x4e, 0x6f, 0x74, 0x61, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, + 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x4f, 0x66, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, + 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x12, 0x26, + 0x0a, 0x0e, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x73, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, + 0x18, 0x08, 0x20, 0x03, 0x28, 0x04, 0x52, 0x0e, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x73, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x12, 0x36, 0x0a, 0x16, 0x48, 0x69, 0x67, 0x68, 0x65, 0x73, 0x74, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x6f, 0x6e, 0x63, 0x65, - 0x12, 0x34, 0x0a, 0x15, 0x48, 0x69, 0x67, 0x68, 0x65, 0x73, 0x74, 0x46, 0x69, 0x6e, 0x61, 0x6c, - 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x15, 0x48, 0x69, 0x67, 0x68, 0x65, 0x73, 0x74, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x42, 0x6c, 0x6f, - 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x1a, 0x59, 0x0a, 0x14, 0x41, 0x6c, 0x74, 0x65, 0x72, 0x65, - 0x64, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x2b, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x15, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x41, 0x6c, 0x74, 0x65, 0x72, 0x65, 0x64, 0x41, - 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0x9a, 0x05, 0x0a, 0x11, 0x53, 0x68, 0x61, 0x72, 0x64, 0x4f, 0x75, 0x74, 0x70, 0x6f, - 0x72, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x68, 0x61, 0x72, 0x64, - 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, - 0x44, 0x12, 0x2e, 0x0a, 0x09, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x44, 0x61, 0x74, 0x61, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x42, 0x6c, 0x6f, - 0x63, 0x6b, 0x44, 0x61, 0x74, 0x61, 0x52, 0x09, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x44, 0x61, 0x74, - 0x61, 0x12, 0x40, 0x0a, 0x0f, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x50, 0x6f, 0x6f, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, - 0x6f, 0x6c, 0x52, 0x0f, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, - 0x6f, 0x6f, 0x6c, 0x12, 0x4f, 0x0a, 0x14, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x47, 0x61, 0x73, - 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, - 0x47, 0x61, 0x73, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x14, - 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x47, 0x61, 0x73, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x57, 0x0a, 0x0f, 0x41, 0x6c, 0x74, 0x65, 0x72, 0x65, 0x64, 0x41, - 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x4f, 0x75, 0x74, 0x70, 0x6f, - 0x72, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x41, 0x6c, 0x74, 0x65, 0x72, 0x65, 0x64, 0x41, - 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x41, 0x6c, - 0x74, 0x65, 0x72, 0x65, 0x64, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12, 0x36, 0x0a, - 0x16, 0x4e, 0x6f, 0x74, 0x61, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, - 0x73, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x16, 0x4e, - 0x6f, 0x74, 0x61, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x48, - 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, - 0x66, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x4e, - 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x12, 0x26, 0x0a, - 0x0e, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x73, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x18, - 0x08, 0x20, 0x03, 0x28, 0x04, 0x52, 0x0e, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x73, 0x49, 0x6e, - 0x64, 0x65, 0x78, 0x65, 0x73, 0x12, 0x36, 0x0a, 0x16, 0x48, 0x69, 0x67, 0x68, 0x65, 0x73, 0x74, - 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, 0x16, 0x48, 0x69, 0x67, 0x68, 0x65, 0x73, 0x74, 0x46, 0x69, - 0x6e, 0x61, 0x6c, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x12, 0x34, 0x0a, - 0x15, 0x48, 0x69, 0x67, 0x68, 0x65, 0x73, 0x74, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x42, 0x6c, 0x6f, - 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x15, 0x48, 0x69, - 0x67, 0x68, 0x65, 0x73, 0x74, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, - 0x61, 0x73, 0x68, 0x1a, 0x59, 0x0a, 0x14, 0x41, 0x6c, 0x74, 0x65, 0x72, 0x65, 0x64, 0x41, 0x63, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2b, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x41, 0x6c, 0x74, 0x65, 0x72, 0x65, 0x64, 0x41, 0x63, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xdc, - 0x06, 0x0a, 0x06, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x4e, 0x6f, 0x6e, - 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x12, - 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x65, 0x76, 0x48, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x08, 0x50, 0x72, 0x65, 0x76, 0x48, 0x61, 0x73, 0x68, 0x12, 0x22, 0x0a, 0x0c, 0x50, - 0x72, 0x65, 0x76, 0x52, 0x61, 0x6e, 0x64, 0x53, 0x65, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x0c, 0x50, 0x72, 0x65, 0x76, 0x52, 0x61, 0x6e, 0x64, 0x53, 0x65, 0x65, 0x64, 0x12, - 0x1a, 0x0a, 0x08, 0x52, 0x61, 0x6e, 0x64, 0x53, 0x65, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x08, 0x52, 0x61, 0x6e, 0x64, 0x53, 0x65, 0x65, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x50, - 0x75, 0x62, 0x4b, 0x65, 0x79, 0x73, 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x0d, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x73, 0x42, 0x69, 0x74, 0x6d, 0x61, - 0x70, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, 0x44, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x07, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x54, - 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, - 0x54, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x52, 0x6f, 0x75, - 0x6e, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x12, - 0x14, 0x0a, 0x05, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, - 0x45, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x31, 0x0a, 0x0d, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x42, 0x6f, - 0x64, 0x79, 0x54, 0x79, 0x70, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0b, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0d, 0x42, 0x6c, 0x6f, 0x63, 0x6b, - 0x42, 0x6f, 0x64, 0x79, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x69, 0x67, 0x6e, - 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x53, 0x69, 0x67, - 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, - 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x0f, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, - 0x12, 0x42, 0x0a, 0x10, 0x4d, 0x69, 0x6e, 0x69, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x2e, 0x4d, 0x69, 0x6e, 0x69, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x52, 0x10, 0x4d, 0x69, 0x6e, 0x69, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x73, 0x12, 0x33, 0x0a, 0x0b, 0x50, 0x65, 0x65, 0x72, 0x43, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x73, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x0b, 0x50, 0x65, - 0x65, 0x72, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x52, 0x6f, 0x6f, - 0x74, 0x48, 0x61, 0x73, 0x68, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x52, 0x6f, 0x6f, - 0x74, 0x48, 0x61, 0x73, 0x68, 0x12, 0x28, 0x0a, 0x0f, 0x4d, 0x65, 0x74, 0x61, 0x42, 0x6c, 0x6f, - 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x0f, - 0x4d, 0x65, 0x74, 0x61, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, - 0x18, 0x0a, 0x07, 0x54, 0x78, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x07, 0x54, 0x78, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x12, 0x45, 0x70, 0x6f, - 0x63, 0x68, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x48, 0x61, 0x73, 0x68, 0x18, - 0x12, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x12, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x53, 0x74, 0x61, 0x72, - 0x74, 0x4d, 0x65, 0x74, 0x61, 0x48, 0x61, 0x73, 0x68, 0x12, 0x22, 0x0a, 0x0c, 0x52, 0x65, 0x63, - 0x65, 0x69, 0x70, 0x74, 0x73, 0x48, 0x61, 0x73, 0x68, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x0c, 0x52, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x73, 0x48, 0x61, 0x73, 0x68, 0x12, 0x18, 0x0a, - 0x07, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x44, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, - 0x43, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x44, 0x12, 0x28, 0x0a, 0x0f, 0x53, 0x6f, 0x66, 0x74, 0x77, - 0x61, 0x72, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x0f, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x41, 0x63, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x64, - 0x46, 0x65, 0x65, 0x73, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x41, 0x63, 0x63, 0x75, - 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x46, 0x65, 0x65, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x44, - 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x46, 0x65, 0x65, 0x73, 0x18, 0x17, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x0d, 0x44, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x46, 0x65, 0x65, - 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x18, 0x18, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x08, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x22, 0xac, 0x07, - 0x0a, 0x0a, 0x4d, 0x65, 0x74, 0x61, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, - 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x4e, 0x6f, 0x6e, - 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x05, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x52, 0x6f, 0x75, 0x6e, - 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x1c, - 0x0a, 0x09, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x09, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x2e, 0x0a, 0x09, - 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x44, 0x61, 0x74, - 0x61, 0x52, 0x09, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2b, 0x0a, 0x08, - 0x50, 0x65, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x52, - 0x08, 0x50, 0x65, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x69, 0x67, - 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x53, 0x69, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, 0x16, 0x48, 0x69, 0x67, 0x68, 0x65, 0x73, 0x74, 0x46, + 0x69, 0x6e, 0x61, 0x6c, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x12, 0x34, + 0x0a, 0x15, 0x48, 0x69, 0x67, 0x68, 0x65, 0x73, 0x74, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x42, 0x6c, + 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x15, 0x48, + 0x69, 0x67, 0x68, 0x65, 0x73, 0x74, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x42, 0x6c, 0x6f, 0x63, 0x6b, + 0x48, 0x61, 0x73, 0x68, 0x1a, 0x59, 0x0a, 0x14, 0x41, 0x6c, 0x74, 0x65, 0x72, 0x65, 0x64, 0x41, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2b, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x41, 0x6c, 0x74, 0x65, 0x72, 0x65, 0x64, 0x41, 0x63, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, + 0xdc, 0x06, 0x0a, 0x06, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x4e, 0x6f, + 0x6e, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x4e, 0x6f, 0x6e, 0x63, 0x65, + 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x65, 0x76, 0x48, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x08, 0x50, 0x72, 0x65, 0x76, 0x48, 0x61, 0x73, 0x68, 0x12, 0x22, 0x0a, 0x0c, + 0x50, 0x72, 0x65, 0x76, 0x52, 0x61, 0x6e, 0x64, 0x53, 0x65, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x0c, 0x50, 0x72, 0x65, 0x76, 0x52, 0x61, 0x6e, 0x64, 0x53, 0x65, 0x65, 0x64, + 0x12, 0x1a, 0x0a, 0x08, 0x52, 0x61, 0x6e, 0x64, 0x53, 0x65, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x08, 0x52, 0x61, 0x6e, 0x64, 0x53, 0x65, 0x65, 0x64, 0x12, 0x24, 0x0a, 0x0d, + 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x73, 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x73, 0x42, 0x69, 0x74, 0x6d, + 0x61, 0x70, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, 0x44, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x07, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, + 0x54, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x09, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x52, 0x6f, + 0x75, 0x6e, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x52, 0x6f, 0x75, 0x6e, 0x64, + 0x12, 0x14, 0x0a, 0x05, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x05, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x31, 0x0a, 0x0d, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x42, + 0x6f, 0x64, 0x79, 0x54, 0x79, 0x70, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0b, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0d, 0x42, 0x6c, 0x6f, 0x63, + 0x6b, 0x42, 0x6f, 0x64, 0x79, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x69, 0x67, + 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x4c, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, + 0x72, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, - 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x73, 0x42, 0x69, 0x74, 0x6d, - 0x61, 0x70, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, - 0x73, 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x65, 0x76, 0x48, - 0x61, 0x73, 0x68, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x50, 0x72, 0x65, 0x76, 0x48, - 0x61, 0x73, 0x68, 0x12, 0x22, 0x0a, 0x0c, 0x50, 0x72, 0x65, 0x76, 0x52, 0x61, 0x6e, 0x64, 0x53, - 0x65, 0x65, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x50, 0x72, 0x65, 0x76, 0x52, - 0x61, 0x6e, 0x64, 0x53, 0x65, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x52, 0x61, 0x6e, 0x64, 0x53, - 0x65, 0x65, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x52, 0x61, 0x6e, 0x64, 0x53, - 0x65, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x52, 0x6f, 0x6f, 0x74, 0x48, 0x61, 0x73, 0x68, 0x18, - 0x0d, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x52, 0x6f, 0x6f, 0x74, 0x48, 0x61, 0x73, 0x68, 0x12, - 0x36, 0x0a, 0x16, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, - 0x73, 0x52, 0x6f, 0x6f, 0x74, 0x48, 0x61, 0x73, 0x68, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x16, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, - 0x6f, 0x6f, 0x74, 0x48, 0x61, 0x73, 0x68, 0x12, 0x42, 0x0a, 0x10, 0x4d, 0x69, 0x6e, 0x69, 0x42, - 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x16, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4d, 0x69, 0x6e, 0x69, 0x42, 0x6c, - 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x10, 0x4d, 0x69, 0x6e, 0x69, 0x42, - 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x52, - 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x73, 0x48, 0x61, 0x73, 0x68, 0x18, 0x11, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x0c, 0x52, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x73, 0x48, 0x61, 0x73, 0x68, 0x12, - 0x31, 0x0a, 0x0a, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x53, 0x74, 0x61, 0x72, 0x74, 0x18, 0x12, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x45, 0x70, 0x6f, 0x63, - 0x68, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x0a, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x53, 0x74, 0x61, - 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x44, 0x18, 0x13, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x07, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x44, 0x12, 0x28, 0x0a, 0x0f, - 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x14, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x41, 0x63, 0x63, 0x75, 0x6d, 0x75, - 0x6c, 0x61, 0x74, 0x65, 0x64, 0x46, 0x65, 0x65, 0x73, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x0f, 0x41, 0x63, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x46, 0x65, 0x65, 0x73, - 0x12, 0x36, 0x0a, 0x16, 0x41, 0x63, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x46, - 0x65, 0x65, 0x73, 0x49, 0x6e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x16, 0x41, 0x63, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x46, 0x65, 0x65, - 0x73, 0x49, 0x6e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x24, 0x0a, 0x0d, 0x44, 0x65, 0x76, 0x65, - 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x46, 0x65, 0x65, 0x73, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x0d, 0x44, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x46, 0x65, 0x65, 0x73, 0x12, 0x26, - 0x0a, 0x0e, 0x44, 0x65, 0x76, 0x46, 0x65, 0x65, 0x73, 0x49, 0x6e, 0x45, 0x70, 0x6f, 0x63, 0x68, - 0x18, 0x18, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x44, 0x65, 0x76, 0x46, 0x65, 0x65, 0x73, 0x49, - 0x6e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x54, 0x78, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x18, 0x19, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x54, 0x78, 0x43, 0x6f, 0x75, 0x6e, 0x74, - 0x12, 0x1a, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x18, 0x1a, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x08, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x22, 0xcc, 0x01, 0x0a, - 0x0f, 0x4d, 0x69, 0x6e, 0x69, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, - 0x12, 0x12, 0x0a, 0x04, 0x48, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, - 0x48, 0x61, 0x73, 0x68, 0x12, 0x24, 0x0a, 0x0d, 0x53, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x53, 0x68, - 0x61, 0x72, 0x64, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x53, 0x65, 0x6e, - 0x64, 0x65, 0x72, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, 0x44, 0x12, 0x28, 0x0a, 0x0f, 0x52, 0x65, - 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, 0x44, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x53, 0x68, 0x61, - 0x72, 0x64, 0x49, 0x44, 0x12, 0x18, 0x0a, 0x07, 0x54, 0x78, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x54, 0x78, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1f, - 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0b, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, - 0x1a, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x08, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x22, 0x46, 0x0a, 0x0a, 0x50, - 0x65, 0x65, 0x72, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x50, 0x75, 0x62, - 0x4b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x50, 0x75, 0x62, 0x4b, 0x65, - 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, 0x64, 0x44, 0x65, 0x73, 0x74, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, 0x64, 0x44, - 0x65, 0x73, 0x74, 0x22, 0xb3, 0x04, 0x0a, 0x09, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x44, 0x61, 0x74, - 0x61, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x07, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, 0x44, 0x12, 0x25, 0x0a, 0x06, 0x48, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x06, 0x48, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x54, 0x79, - 0x70, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x48, 0x61, 0x73, 0x68, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x48, 0x61, - 0x73, 0x68, 0x12, 0x1f, 0x0a, 0x04, 0x42, 0x6f, 0x64, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x0b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x42, 0x6f, 0x64, 0x79, 0x52, 0x04, 0x42, - 0x6f, 0x64, 0x79, 0x12, 0x44, 0x0a, 0x14, 0x49, 0x6e, 0x74, 0x72, 0x61, 0x53, 0x68, 0x61, 0x72, - 0x64, 0x4d, 0x69, 0x6e, 0x69, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4d, 0x69, 0x6e, 0x69, 0x42, 0x6c, - 0x6f, 0x63, 0x6b, 0x52, 0x14, 0x49, 0x6e, 0x74, 0x72, 0x61, 0x53, 0x68, 0x61, 0x72, 0x64, 0x4d, - 0x69, 0x6e, 0x69, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x53, 0x63, 0x68, - 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x52, 0x6f, 0x6f, 0x74, 0x48, 0x61, 0x73, 0x68, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x11, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x52, - 0x6f, 0x6f, 0x74, 0x48, 0x61, 0x73, 0x68, 0x12, 0x3a, 0x0a, 0x18, 0x53, 0x63, 0x68, 0x65, 0x64, - 0x75, 0x6c, 0x65, 0x64, 0x41, 0x63, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x46, - 0x65, 0x65, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x18, 0x53, 0x63, 0x68, 0x65, 0x64, - 0x75, 0x6c, 0x65, 0x64, 0x41, 0x63, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x46, - 0x65, 0x65, 0x73, 0x12, 0x36, 0x0a, 0x16, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, - 0x44, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x46, 0x65, 0x65, 0x73, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x16, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x44, 0x65, - 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x46, 0x65, 0x65, 0x73, 0x12, 0x32, 0x0a, 0x14, 0x53, - 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x47, 0x61, 0x73, 0x50, 0x72, 0x6f, 0x76, 0x69, - 0x64, 0x65, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x04, 0x52, 0x14, 0x53, 0x63, 0x68, 0x65, 0x64, - 0x75, 0x6c, 0x65, 0x64, 0x47, 0x61, 0x73, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x12, - 0x34, 0x0a, 0x15, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x47, 0x61, 0x73, 0x50, - 0x65, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x04, 0x52, 0x15, - 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x47, 0x61, 0x73, 0x50, 0x65, 0x6e, 0x61, - 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x12, 0x32, 0x0a, 0x14, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, - 0x65, 0x64, 0x47, 0x61, 0x73, 0x52, 0x65, 0x66, 0x75, 0x6e, 0x64, 0x65, 0x64, 0x18, 0x0c, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x14, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x47, 0x61, - 0x73, 0x52, 0x65, 0x66, 0x75, 0x6e, 0x64, 0x65, 0x64, 0x22, 0xbb, 0x04, 0x0a, 0x0d, 0x4d, 0x65, - 0x74, 0x61, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x44, 0x61, 0x74, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x53, - 0x68, 0x61, 0x72, 0x64, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x53, 0x68, - 0x61, 0x72, 0x64, 0x49, 0x44, 0x12, 0x29, 0x0a, 0x06, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4d, 0x65, - 0x74, 0x61, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x06, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, - 0x12, 0x1e, 0x0a, 0x0a, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x1e, 0x0a, 0x0a, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x48, 0x61, 0x73, 0x68, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x48, 0x61, 0x73, 0x68, - 0x12, 0x1f, 0x0a, 0x04, 0x42, 0x6f, 0x64, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x42, 0x6f, 0x64, 0x79, 0x52, 0x04, 0x42, 0x6f, 0x64, - 0x79, 0x12, 0x44, 0x0a, 0x14, 0x49, 0x6e, 0x74, 0x72, 0x61, 0x53, 0x68, 0x61, 0x72, 0x64, 0x4d, - 0x69, 0x6e, 0x69, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4d, 0x69, 0x6e, 0x69, 0x42, 0x6c, 0x6f, 0x63, - 0x6b, 0x52, 0x14, 0x49, 0x6e, 0x74, 0x72, 0x61, 0x53, 0x68, 0x61, 0x72, 0x64, 0x4d, 0x69, 0x6e, - 0x69, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x53, 0x63, 0x68, 0x65, 0x64, - 0x75, 0x6c, 0x65, 0x64, 0x52, 0x6f, 0x6f, 0x74, 0x48, 0x61, 0x73, 0x68, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x11, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x52, 0x6f, 0x6f, - 0x74, 0x48, 0x61, 0x73, 0x68, 0x12, 0x3a, 0x0a, 0x18, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, - 0x65, 0x64, 0x41, 0x63, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x46, 0x65, 0x65, - 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x18, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, - 0x65, 0x64, 0x41, 0x63, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x46, 0x65, 0x65, - 0x73, 0x12, 0x36, 0x0a, 0x16, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x44, 0x65, - 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x46, 0x65, 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x16, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x44, 0x65, 0x76, 0x65, - 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x46, 0x65, 0x65, 0x73, 0x12, 0x32, 0x0a, 0x14, 0x53, 0x63, 0x68, - 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x47, 0x61, 0x73, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, - 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x04, 0x52, 0x14, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, - 0x65, 0x64, 0x47, 0x61, 0x73, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x12, 0x34, 0x0a, - 0x15, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x47, 0x61, 0x73, 0x50, 0x65, 0x6e, - 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x04, 0x52, 0x15, 0x53, 0x63, - 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x47, 0x61, 0x73, 0x50, 0x65, 0x6e, 0x61, 0x6c, 0x69, - 0x7a, 0x65, 0x64, 0x12, 0x32, 0x0a, 0x14, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, - 0x47, 0x61, 0x73, 0x52, 0x65, 0x66, 0x75, 0x6e, 0x64, 0x65, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x14, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x47, 0x61, 0x73, 0x52, - 0x65, 0x66, 0x75, 0x6e, 0x64, 0x65, 0x64, 0x22, 0x97, 0x04, 0x0a, 0x09, 0x53, 0x68, 0x61, 0x72, - 0x64, 0x44, 0x61, 0x74, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, 0x44, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, 0x44, 0x12, - 0x1e, 0x0a, 0x0a, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x48, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x48, 0x61, 0x73, 0x68, 0x12, - 0x4c, 0x0a, 0x15, 0x53, 0x68, 0x61, 0x72, 0x64, 0x4d, 0x69, 0x6e, 0x69, 0x42, 0x6c, 0x6f, 0x63, - 0x6b, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4d, 0x69, 0x6e, 0x69, 0x42, 0x6c, 0x6f, 0x63, 0x6b, - 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x15, 0x53, 0x68, 0x61, 0x72, 0x64, 0x4d, 0x69, 0x6e, - 0x69, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x22, 0x0a, - 0x0c, 0x50, 0x72, 0x65, 0x76, 0x52, 0x61, 0x6e, 0x64, 0x53, 0x65, 0x65, 0x64, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x50, 0x72, 0x65, 0x76, 0x52, 0x61, 0x6e, 0x64, 0x53, 0x65, 0x65, - 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x73, 0x42, 0x69, 0x74, 0x6d, - 0x61, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, - 0x73, 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x69, 0x67, 0x6e, 0x61, - 0x74, 0x75, 0x72, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x53, 0x69, 0x67, 0x6e, - 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x54, 0x78, 0x43, 0x6f, 0x75, 0x6e, 0x74, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x54, 0x78, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, - 0x14, 0x0a, 0x05, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, - 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x65, 0x76, 0x48, 0x61, 0x73, - 0x68, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x50, 0x72, 0x65, 0x76, 0x48, 0x61, 0x73, - 0x68, 0x12, 0x14, 0x0a, 0x05, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x05, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x12, 0x32, 0x0a, 0x14, 0x4e, 0x75, 0x6d, 0x50, 0x65, - 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x4d, 0x69, 0x6e, 0x69, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x18, - 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x14, 0x4e, 0x75, 0x6d, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, - 0x67, 0x4d, 0x69, 0x6e, 0x69, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x28, 0x0a, 0x0f, 0x41, - 0x63, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x46, 0x65, 0x65, 0x73, 0x18, 0x0c, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x41, 0x63, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x65, - 0x64, 0x46, 0x65, 0x65, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x44, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, - 0x65, 0x72, 0x46, 0x65, 0x65, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x44, 0x65, - 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x46, 0x65, 0x65, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x4c, - 0x61, 0x73, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x61, 0x4e, - 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x04, 0x52, 0x15, 0x4c, 0x61, 0x73, 0x74, - 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x61, 0x4e, 0x6f, 0x6e, 0x63, - 0x65, 0x22, 0x8c, 0x01, 0x0a, 0x0a, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x53, 0x74, 0x61, 0x72, 0x74, - 0x12, 0x4e, 0x0a, 0x14, 0x4c, 0x61, 0x73, 0x74, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, - 0x64, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x53, 0x74, 0x61, 0x72, - 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x44, 0x61, 0x74, 0x61, 0x52, 0x14, 0x4c, 0x61, 0x73, 0x74, - 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, - 0x12, 0x2e, 0x0a, 0x09, 0x45, 0x63, 0x6f, 0x6e, 0x6f, 0x6d, 0x69, 0x63, 0x73, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x45, 0x63, 0x6f, 0x6e, - 0x6f, 0x6d, 0x69, 0x63, 0x73, 0x52, 0x09, 0x45, 0x63, 0x6f, 0x6e, 0x6f, 0x6d, 0x69, 0x63, 0x73, - 0x22, 0x99, 0x03, 0x0a, 0x13, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x53, 0x74, 0x61, 0x72, 0x74, 0x53, - 0x68, 0x61, 0x72, 0x64, 0x44, 0x61, 0x74, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x68, 0x61, 0x72, - 0x64, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x53, 0x68, 0x61, 0x72, 0x64, - 0x49, 0x44, 0x12, 0x1e, 0x0a, 0x0a, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x48, 0x61, 0x73, 0x68, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x48, 0x61, - 0x73, 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x52, 0x6f, 0x6f, 0x74, 0x48, 0x61, 0x73, 0x68, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x52, 0x6f, 0x6f, 0x74, 0x48, 0x61, 0x73, 0x68, 0x12, 0x34, - 0x0a, 0x15, 0x46, 0x69, 0x72, 0x73, 0x74, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x4d, 0x65, - 0x74, 0x61, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x15, 0x46, - 0x69, 0x72, 0x73, 0x74, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x4d, 0x65, 0x74, 0x61, 0x42, - 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x34, 0x0a, 0x15, 0x4c, 0x61, 0x73, 0x74, 0x46, 0x69, 0x6e, 0x69, - 0x73, 0x68, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x61, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x15, 0x4c, 0x61, 0x73, 0x74, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, - 0x64, 0x4d, 0x65, 0x74, 0x61, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x50, 0x0a, 0x17, 0x50, 0x65, - 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x4d, 0x69, 0x6e, 0x69, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x70, 0x72, + 0x65, 0x12, 0x42, 0x0a, 0x10, 0x4d, 0x69, 0x6e, 0x69, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4d, 0x69, 0x6e, 0x69, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x52, 0x17, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x4d, 0x69, 0x6e, 0x69, - 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, - 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x52, 0x6f, 0x75, - 0x6e, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x05, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x45, 0x70, 0x6f, 0x63, - 0x68, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x2c, - 0x0a, 0x11, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x52, 0x6f, 0x6f, 0x74, 0x48, - 0x61, 0x73, 0x68, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x11, 0x53, 0x63, 0x68, 0x65, 0x64, - 0x75, 0x6c, 0x65, 0x64, 0x52, 0x6f, 0x6f, 0x74, 0x48, 0x61, 0x73, 0x68, 0x22, 0xfd, 0x02, 0x0a, - 0x09, 0x45, 0x63, 0x6f, 0x6e, 0x6f, 0x6d, 0x69, 0x63, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x54, 0x6f, - 0x74, 0x61, 0x6c, 0x53, 0x75, 0x70, 0x70, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x0b, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x75, 0x70, 0x70, 0x6c, 0x79, 0x12, 0x2c, 0x0a, 0x11, - 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x54, 0x6f, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x11, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x54, 0x6f, - 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x54, 0x6f, - 0x74, 0x61, 0x6c, 0x4e, 0x65, 0x77, 0x6c, 0x79, 0x4d, 0x69, 0x6e, 0x74, 0x65, 0x64, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x10, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x4e, 0x65, 0x77, 0x6c, 0x79, - 0x4d, 0x69, 0x6e, 0x74, 0x65, 0x64, 0x12, 0x28, 0x0a, 0x0f, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, - 0x73, 0x50, 0x65, 0x72, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x0f, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x50, 0x65, 0x72, 0x42, 0x6c, 0x6f, 0x63, 0x6b, - 0x12, 0x4a, 0x0a, 0x20, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x46, 0x6f, 0x72, 0x50, 0x72, - 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x53, 0x75, 0x73, 0x74, 0x61, 0x69, 0x6e, 0x61, 0x62, 0x69, - 0x6c, 0x69, 0x74, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x20, 0x52, 0x65, 0x77, 0x61, - 0x72, 0x64, 0x73, 0x46, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x53, 0x75, - 0x73, 0x74, 0x61, 0x69, 0x6e, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x1c, 0x0a, 0x09, - 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x72, 0x69, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x09, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x30, 0x0a, 0x13, 0x50, 0x72, - 0x65, 0x76, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x6f, 0x75, 0x6e, - 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x13, 0x50, 0x72, 0x65, 0x76, 0x45, 0x70, 0x6f, - 0x63, 0x68, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x2e, 0x0a, 0x12, - 0x50, 0x72, 0x65, 0x76, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x53, 0x74, 0x61, 0x72, 0x74, 0x48, 0x61, - 0x73, 0x68, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x12, 0x50, 0x72, 0x65, 0x76, 0x45, 0x70, - 0x6f, 0x63, 0x68, 0x53, 0x74, 0x61, 0x72, 0x74, 0x48, 0x61, 0x73, 0x68, 0x22, 0xad, 0x01, 0x0a, - 0x08, 0x50, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x41, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x41, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, - 0x79, 0x12, 0x29, 0x0a, 0x06, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x11, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x41, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, - 0x54, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x09, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x20, 0x0a, 0x0b, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x0b, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x22, 0xf9, 0x07, 0x0a, - 0x0f, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6f, 0x6c, - 0x12, 0x4c, 0x0a, 0x0c, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x54, - 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6f, 0x6c, 0x2e, 0x54, - 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x0c, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x64, - 0x0a, 0x14, 0x53, 0x6d, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x52, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x50, 0x6f, 0x6f, 0x6c, 0x2e, 0x53, 0x6d, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, - 0x63, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x14, - 0x53, 0x6d, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x52, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x73, 0x12, 0x3d, 0x0a, 0x07, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x18, - 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6f, 0x6c, 0x2e, 0x52, 0x65, - 0x77, 0x61, 0x72, 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x52, 0x65, 0x77, 0x61, - 0x72, 0x64, 0x73, 0x12, 0x40, 0x0a, 0x08, 0x52, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x73, 0x18, - 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6f, 0x6c, 0x2e, 0x52, 0x65, - 0x63, 0x65, 0x69, 0x70, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x52, 0x65, 0x63, - 0x65, 0x69, 0x70, 0x74, 0x73, 0x12, 0x46, 0x0a, 0x0a, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, - 0x54, 0x78, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6f, - 0x6c, 0x2e, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x54, 0x78, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x0a, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x54, 0x78, 0x73, 0x12, 0x22, 0x0a, - 0x04, 0x4c, 0x6f, 0x67, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x2e, 0x4c, 0x6f, 0x67, 0x44, 0x61, 0x74, 0x61, 0x52, 0x04, 0x4c, 0x6f, 0x67, - 0x73, 0x12, 0x52, 0x0a, 0x24, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x45, 0x78, - 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x53, 0x43, 0x52, 0x53, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, - 0x50, 0x72, 0x65, 0x76, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x24, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, - 0x65, 0x64, 0x53, 0x43, 0x52, 0x53, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x50, 0x72, 0x65, 0x76, - 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x5e, 0x0a, 0x2a, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, - 0x65, 0x64, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, - 0x64, 0x54, 0x78, 0x73, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x50, 0x72, 0x65, 0x76, 0x42, 0x6c, - 0x6f, 0x63, 0x6b, 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, 0x52, 0x2a, 0x53, 0x63, 0x68, 0x65, 0x64, - 0x75, 0x6c, 0x65, 0x64, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x49, 0x6e, 0x76, 0x61, - 0x6c, 0x69, 0x64, 0x54, 0x78, 0x73, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x50, 0x72, 0x65, 0x76, - 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x1a, 0x4e, 0x0a, 0x11, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x23, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x2e, 0x54, 0x78, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x57, 0x0a, 0x19, 0x53, 0x6d, 0x61, 0x72, 0x74, 0x43, 0x6f, - 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x24, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x53, 0x43, 0x52, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x4d, - 0x0a, 0x0c, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x27, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x11, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x4b, 0x0a, - 0x0d, 0x52, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x24, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x0e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x52, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x4c, 0x0a, 0x0f, 0x49, 0x6e, - 0x76, 0x61, 0x6c, 0x69, 0x64, 0x54, 0x78, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x23, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x54, 0x78, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x5d, 0x0a, 0x07, 0x46, 0x65, 0x65, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x18, 0x0a, 0x07, 0x47, 0x61, 0x73, 0x55, 0x73, 0x65, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x47, 0x61, 0x73, 0x55, 0x73, 0x65, 0x64, 0x12, 0x10, 0x0a, - 0x03, 0x46, 0x65, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x46, 0x65, 0x65, 0x12, - 0x26, 0x0a, 0x0e, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x69, 0x64, 0x46, 0x65, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, - 0x50, 0x61, 0x69, 0x64, 0x46, 0x65, 0x65, 0x22, 0x90, 0x01, 0x0a, 0x06, 0x54, 0x78, 0x49, 0x6e, - 0x66, 0x6f, 0x12, 0x34, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x54, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x07, 0x46, 0x65, 0x65, 0x49, - 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x2e, 0x46, 0x65, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x46, 0x65, 0x65, 0x49, 0x6e, - 0x66, 0x6f, 0x12, 0x26, 0x0a, 0x0e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x4f, - 0x72, 0x64, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x45, 0x78, 0x65, 0x63, - 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x22, 0xa9, 0x01, 0x0a, 0x07, 0x53, - 0x43, 0x52, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x4c, 0x0a, 0x13, 0x53, 0x6d, 0x61, 0x72, 0x74, 0x43, - 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x53, 0x6d, 0x61, 0x72, - 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, - 0x13, 0x53, 0x6d, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x52, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x07, 0x46, 0x65, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x46, 0x65, - 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x46, 0x65, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x26, - 0x0a, 0x0e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x72, 0x64, 0x65, 0x72, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, - 0x6e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x22, 0x3f, 0x0a, 0x07, 0x4c, 0x6f, 0x67, 0x44, 0x61, 0x74, - 0x61, 0x12, 0x16, 0x0a, 0x06, 0x54, 0x78, 0x48, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x54, 0x78, 0x48, 0x61, 0x73, 0x68, 0x12, 0x1c, 0x0a, 0x03, 0x4c, 0x6f, 0x67, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4c, - 0x6f, 0x67, 0x52, 0x03, 0x4c, 0x6f, 0x67, 0x22, 0x5d, 0x0a, 0x0a, 0x52, 0x65, 0x77, 0x61, 0x72, - 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x27, 0x0a, 0x06, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x52, 0x65, - 0x77, 0x61, 0x72, 0x64, 0x54, 0x78, 0x52, 0x06, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x12, 0x26, - 0x0a, 0x0e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x72, 0x64, 0x65, 0x72, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, - 0x6e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x22, 0xa6, 0x01, 0x0a, 0x14, 0x48, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x47, 0x61, 0x73, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x20, 0x0a, 0x0b, 0x47, 0x61, 0x73, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x47, 0x61, 0x73, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, - 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x47, 0x61, 0x73, 0x52, 0x65, 0x66, 0x75, 0x6e, 0x64, 0x65, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x47, 0x61, 0x73, 0x52, 0x65, 0x66, 0x75, 0x6e, - 0x64, 0x65, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x47, 0x61, 0x73, 0x50, 0x65, 0x6e, 0x61, 0x6c, 0x69, - 0x7a, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x47, 0x61, 0x73, 0x50, 0x65, - 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x4d, 0x61, 0x78, 0x47, 0x61, - 0x73, 0x50, 0x65, 0x72, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x0e, 0x4d, 0x61, 0x78, 0x47, 0x61, 0x73, 0x50, 0x65, 0x72, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x22, - 0x4b, 0x0a, 0x13, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x61, 0x74, 0x69, - 0x6e, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, - 0x4b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x75, 0x62, 0x6c, 0x69, - 0x63, 0x4b, 0x65, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x02, 0x52, 0x06, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x22, 0x92, 0x01, 0x0a, - 0x10, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x61, 0x74, 0x69, 0x6e, - 0x67, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x07, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, 0x44, 0x12, 0x14, 0x0a, 0x05, 0x45, - 0x70, 0x6f, 0x63, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x45, 0x70, 0x6f, 0x63, - 0x68, 0x12, 0x4e, 0x0a, 0x14, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x52, - 0x61, 0x74, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, - 0x72, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x14, 0x56, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x66, - 0x6f, 0x22, 0xc3, 0x01, 0x0a, 0x09, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x14, 0x0a, 0x05, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, - 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x73, - 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x04, 0x52, 0x0e, 0x53, - 0x69, 0x67, 0x6e, 0x65, 0x72, 0x73, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x12, 0x2a, 0x0a, - 0x10, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x57, 0x61, 0x73, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, - 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x57, 0x61, - 0x73, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x68, 0x61, - 0x72, 0x64, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x53, 0x68, 0x61, 0x72, - 0x64, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x05, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x1c, 0x0a, 0x09, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x58, 0x0a, 0x0a, 0x52, 0x6f, 0x75, 0x6e, 0x64, - 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, 0x44, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, 0x44, 0x12, - 0x30, 0x0a, 0x0a, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x52, 0x6f, 0x75, 0x6e, - 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x49, 0x6e, 0x66, - 0x6f, 0x22, 0x1d, 0x0a, 0x07, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x12, 0x0a, 0x04, - 0x4b, 0x65, 0x79, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x04, 0x4b, 0x65, 0x79, 0x73, - 0x22, 0x8c, 0x02, 0x0a, 0x11, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x50, - 0x75, 0x62, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, + 0x64, 0x65, 0x72, 0x52, 0x10, 0x4d, 0x69, 0x6e, 0x69, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x33, 0x0a, 0x0b, 0x50, 0x65, 0x65, 0x72, 0x43, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x73, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x0b, 0x50, + 0x65, 0x65, 0x72, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x52, 0x6f, + 0x6f, 0x74, 0x48, 0x61, 0x73, 0x68, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x52, 0x6f, + 0x6f, 0x74, 0x48, 0x61, 0x73, 0x68, 0x12, 0x28, 0x0a, 0x0f, 0x4d, 0x65, 0x74, 0x61, 0x42, 0x6c, + 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x0c, 0x52, + 0x0f, 0x4d, 0x65, 0x74, 0x61, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, + 0x12, 0x18, 0x0a, 0x07, 0x54, 0x78, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x11, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x07, 0x54, 0x78, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x12, 0x45, 0x70, + 0x6f, 0x63, 0x68, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x48, 0x61, 0x73, 0x68, + 0x18, 0x12, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x12, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x48, 0x61, 0x73, 0x68, 0x12, 0x22, 0x0a, 0x0c, 0x52, 0x65, + 0x63, 0x65, 0x69, 0x70, 0x74, 0x73, 0x48, 0x61, 0x73, 0x68, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x0c, 0x52, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x73, 0x48, 0x61, 0x73, 0x68, 0x12, 0x18, + 0x0a, 0x07, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x44, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x07, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x44, 0x12, 0x28, 0x0a, 0x0f, 0x53, 0x6f, 0x66, 0x74, + 0x77, 0x61, 0x72, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x15, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x0f, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x41, 0x63, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x65, + 0x64, 0x46, 0x65, 0x65, 0x73, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x41, 0x63, 0x63, + 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x46, 0x65, 0x65, 0x73, 0x12, 0x24, 0x0a, 0x0d, + 0x44, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x46, 0x65, 0x65, 0x73, 0x18, 0x17, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x44, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x46, 0x65, + 0x65, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x18, 0x18, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x22, 0xac, + 0x07, 0x0a, 0x0a, 0x4d, 0x65, 0x74, 0x61, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x14, 0x0a, + 0x05, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x4e, 0x6f, + 0x6e, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x05, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x52, 0x6f, 0x75, + 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x12, + 0x1c, 0x0a, 0x09, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x09, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x2e, 0x0a, + 0x09, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x44, 0x61, + 0x74, 0x61, 0x52, 0x09, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2b, 0x0a, + 0x08, 0x50, 0x65, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x0f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, + 0x52, 0x08, 0x50, 0x65, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x69, + 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x53, + 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x4c, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x0f, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, + 0x72, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x73, 0x42, 0x69, 0x74, + 0x6d, 0x61, 0x70, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x50, 0x75, 0x62, 0x4b, 0x65, + 0x79, 0x73, 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x65, 0x76, + 0x48, 0x61, 0x73, 0x68, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x50, 0x72, 0x65, 0x76, + 0x48, 0x61, 0x73, 0x68, 0x12, 0x22, 0x0a, 0x0c, 0x50, 0x72, 0x65, 0x76, 0x52, 0x61, 0x6e, 0x64, + 0x53, 0x65, 0x65, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x50, 0x72, 0x65, 0x76, + 0x52, 0x61, 0x6e, 0x64, 0x53, 0x65, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x52, 0x61, 0x6e, 0x64, + 0x53, 0x65, 0x65, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x52, 0x61, 0x6e, 0x64, + 0x53, 0x65, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x52, 0x6f, 0x6f, 0x74, 0x48, 0x61, 0x73, 0x68, + 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x52, 0x6f, 0x6f, 0x74, 0x48, 0x61, 0x73, 0x68, + 0x12, 0x36, 0x0a, 0x16, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, + 0x74, 0x73, 0x52, 0x6f, 0x6f, 0x74, 0x48, 0x61, 0x73, 0x68, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x16, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x73, + 0x52, 0x6f, 0x6f, 0x74, 0x48, 0x61, 0x73, 0x68, 0x12, 0x42, 0x0a, 0x10, 0x4d, 0x69, 0x6e, 0x69, + 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x10, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4d, 0x69, 0x6e, 0x69, 0x42, + 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x10, 0x4d, 0x69, 0x6e, 0x69, + 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x22, 0x0a, 0x0c, + 0x52, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x73, 0x48, 0x61, 0x73, 0x68, 0x18, 0x11, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x0c, 0x52, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x73, 0x48, 0x61, 0x73, 0x68, + 0x12, 0x31, 0x0a, 0x0a, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x53, 0x74, 0x61, 0x72, 0x74, 0x18, 0x12, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x45, 0x70, 0x6f, + 0x63, 0x68, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x0a, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x53, 0x74, + 0x61, 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x44, 0x18, 0x13, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x44, 0x12, 0x28, 0x0a, + 0x0f, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x14, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x41, 0x63, 0x63, 0x75, 0x6d, + 0x75, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x46, 0x65, 0x65, 0x73, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x0f, 0x41, 0x63, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x46, 0x65, 0x65, + 0x73, 0x12, 0x36, 0x0a, 0x16, 0x41, 0x63, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x64, + 0x46, 0x65, 0x65, 0x73, 0x49, 0x6e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x16, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x16, 0x41, 0x63, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x46, 0x65, + 0x65, 0x73, 0x49, 0x6e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x24, 0x0a, 0x0d, 0x44, 0x65, 0x76, + 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x46, 0x65, 0x65, 0x73, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x0d, 0x44, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x46, 0x65, 0x65, 0x73, 0x12, + 0x26, 0x0a, 0x0e, 0x44, 0x65, 0x76, 0x46, 0x65, 0x65, 0x73, 0x49, 0x6e, 0x45, 0x70, 0x6f, 0x63, + 0x68, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x44, 0x65, 0x76, 0x46, 0x65, 0x65, 0x73, + 0x49, 0x6e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x54, 0x78, 0x43, 0x6f, 0x75, + 0x6e, 0x74, 0x18, 0x19, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x54, 0x78, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x18, 0x1a, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x08, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x22, 0xcc, 0x01, + 0x0a, 0x0f, 0x4d, 0x69, 0x6e, 0x69, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x04, 0x48, 0x61, 0x73, 0x68, 0x12, 0x24, 0x0a, 0x0d, 0x53, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x53, + 0x68, 0x61, 0x72, 0x64, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x53, 0x65, + 0x6e, 0x64, 0x65, 0x72, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, 0x44, 0x12, 0x28, 0x0a, 0x0f, 0x52, + 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, 0x44, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x53, 0x68, + 0x61, 0x72, 0x64, 0x49, 0x44, 0x12, 0x18, 0x0a, 0x07, 0x54, 0x78, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x54, 0x78, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, + 0x1f, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0b, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x1a, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x08, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x22, 0x46, 0x0a, 0x0a, + 0x50, 0x65, 0x65, 0x72, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x50, 0x75, + 0x62, 0x4b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x50, 0x75, 0x62, 0x4b, + 0x65, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, 0x64, 0x44, 0x65, 0x73, + 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, 0x64, + 0x44, 0x65, 0x73, 0x74, 0x22, 0xb3, 0x04, 0x0a, 0x09, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x44, 0x61, + 0x74, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, 0x44, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x07, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, 0x44, 0x12, 0x25, 0x0a, 0x06, + 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x06, 0x48, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x54, 0x79, 0x70, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x48, 0x61, 0x73, + 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x48, + 0x61, 0x73, 0x68, 0x12, 0x1f, 0x0a, 0x04, 0x42, 0x6f, 0x64, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x0b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x42, 0x6f, 0x64, 0x79, 0x52, 0x04, + 0x42, 0x6f, 0x64, 0x79, 0x12, 0x44, 0x0a, 0x14, 0x49, 0x6e, 0x74, 0x72, 0x61, 0x53, 0x68, 0x61, + 0x72, 0x64, 0x4d, 0x69, 0x6e, 0x69, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x18, 0x06, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4d, 0x69, 0x6e, 0x69, 0x42, + 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x14, 0x49, 0x6e, 0x74, 0x72, 0x61, 0x53, 0x68, 0x61, 0x72, 0x64, + 0x4d, 0x69, 0x6e, 0x69, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x53, 0x63, + 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x52, 0x6f, 0x6f, 0x74, 0x48, 0x61, 0x73, 0x68, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x11, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, + 0x52, 0x6f, 0x6f, 0x74, 0x48, 0x61, 0x73, 0x68, 0x12, 0x3a, 0x0a, 0x18, 0x53, 0x63, 0x68, 0x65, + 0x64, 0x75, 0x6c, 0x65, 0x64, 0x41, 0x63, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x64, + 0x46, 0x65, 0x65, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x18, 0x53, 0x63, 0x68, 0x65, + 0x64, 0x75, 0x6c, 0x65, 0x64, 0x41, 0x63, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x64, + 0x46, 0x65, 0x65, 0x73, 0x12, 0x36, 0x0a, 0x16, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, + 0x64, 0x44, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x46, 0x65, 0x65, 0x73, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x16, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x44, + 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x46, 0x65, 0x65, 0x73, 0x12, 0x32, 0x0a, 0x14, + 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x47, 0x61, 0x73, 0x50, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x04, 0x52, 0x14, 0x53, 0x63, 0x68, 0x65, + 0x64, 0x75, 0x6c, 0x65, 0x64, 0x47, 0x61, 0x73, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, + 0x12, 0x34, 0x0a, 0x15, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x47, 0x61, 0x73, + 0x50, 0x65, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x15, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x47, 0x61, 0x73, 0x50, 0x65, 0x6e, + 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x12, 0x32, 0x0a, 0x14, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, + 0x6c, 0x65, 0x64, 0x47, 0x61, 0x73, 0x52, 0x65, 0x66, 0x75, 0x6e, 0x64, 0x65, 0x64, 0x18, 0x0c, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x14, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x47, + 0x61, 0x73, 0x52, 0x65, 0x66, 0x75, 0x6e, 0x64, 0x65, 0x64, 0x22, 0xbb, 0x04, 0x0a, 0x0d, 0x4d, + 0x65, 0x74, 0x61, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x44, 0x61, 0x74, 0x61, 0x12, 0x18, 0x0a, 0x07, + 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x53, + 0x68, 0x61, 0x72, 0x64, 0x49, 0x44, 0x12, 0x29, 0x0a, 0x06, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4d, + 0x65, 0x74, 0x61, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x06, 0x48, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x48, 0x61, 0x73, 0x68, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x48, 0x61, 0x73, + 0x68, 0x12, 0x1f, 0x0a, 0x04, 0x42, 0x6f, 0x64, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x0b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x42, 0x6f, 0x64, 0x79, 0x52, 0x04, 0x42, 0x6f, + 0x64, 0x79, 0x12, 0x44, 0x0a, 0x14, 0x49, 0x6e, 0x74, 0x72, 0x61, 0x53, 0x68, 0x61, 0x72, 0x64, + 0x4d, 0x69, 0x6e, 0x69, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4d, 0x69, 0x6e, 0x69, 0x42, 0x6c, 0x6f, + 0x63, 0x6b, 0x52, 0x14, 0x49, 0x6e, 0x74, 0x72, 0x61, 0x53, 0x68, 0x61, 0x72, 0x64, 0x4d, 0x69, + 0x6e, 0x69, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x53, 0x63, 0x68, 0x65, + 0x64, 0x75, 0x6c, 0x65, 0x64, 0x52, 0x6f, 0x6f, 0x74, 0x48, 0x61, 0x73, 0x68, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x11, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x52, 0x6f, + 0x6f, 0x74, 0x48, 0x61, 0x73, 0x68, 0x12, 0x3a, 0x0a, 0x18, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, + 0x6c, 0x65, 0x64, 0x41, 0x63, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x46, 0x65, + 0x65, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x18, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, + 0x6c, 0x65, 0x64, 0x41, 0x63, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x46, 0x65, + 0x65, 0x73, 0x12, 0x36, 0x0a, 0x16, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x44, + 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x46, 0x65, 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x16, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x44, 0x65, 0x76, + 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x46, 0x65, 0x65, 0x73, 0x12, 0x32, 0x0a, 0x14, 0x53, 0x63, + 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x47, 0x61, 0x73, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x04, 0x52, 0x14, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, + 0x6c, 0x65, 0x64, 0x47, 0x61, 0x73, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x12, 0x34, + 0x0a, 0x15, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x47, 0x61, 0x73, 0x50, 0x65, + 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x04, 0x52, 0x15, 0x53, + 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x47, 0x61, 0x73, 0x50, 0x65, 0x6e, 0x61, 0x6c, + 0x69, 0x7a, 0x65, 0x64, 0x12, 0x32, 0x0a, 0x14, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, + 0x64, 0x47, 0x61, 0x73, 0x52, 0x65, 0x66, 0x75, 0x6e, 0x64, 0x65, 0x64, 0x18, 0x0c, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x14, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x47, 0x61, 0x73, + 0x52, 0x65, 0x66, 0x75, 0x6e, 0x64, 0x65, 0x64, 0x22, 0x97, 0x04, 0x0a, 0x09, 0x53, 0x68, 0x61, + 0x72, 0x64, 0x44, 0x61, 0x74, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, 0x44, - 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x68, 0x61, 0x72, 0x64, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x6f, 0x72, 0x73, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x34, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x6f, 0x72, 0x73, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x73, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, - 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x16, 0x53, 0x68, 0x61, 0x72, 0x64, 0x56, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x14, - 0x0a, 0x05, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x45, - 0x70, 0x6f, 0x63, 0x68, 0x1a, 0x59, 0x0a, 0x1b, 0x53, 0x68, 0x61, 0x72, 0x64, 0x56, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, + 0x12, 0x1e, 0x0a, 0x0a, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x48, 0x61, 0x73, 0x68, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x48, 0x61, 0x73, 0x68, + 0x12, 0x4c, 0x0a, 0x15, 0x53, 0x68, 0x61, 0x72, 0x64, 0x4d, 0x69, 0x6e, 0x69, 0x42, 0x6c, 0x6f, + 0x63, 0x6b, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x16, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4d, 0x69, 0x6e, 0x69, 0x42, 0x6c, 0x6f, 0x63, + 0x6b, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x15, 0x53, 0x68, 0x61, 0x72, 0x64, 0x4d, 0x69, + 0x6e, 0x69, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x22, + 0x0a, 0x0c, 0x50, 0x72, 0x65, 0x76, 0x52, 0x61, 0x6e, 0x64, 0x53, 0x65, 0x65, 0x64, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x50, 0x72, 0x65, 0x76, 0x52, 0x61, 0x6e, 0x64, 0x53, 0x65, + 0x65, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x73, 0x42, 0x69, 0x74, + 0x6d, 0x61, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x50, 0x75, 0x62, 0x4b, 0x65, + 0x79, 0x73, 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x69, 0x67, 0x6e, + 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x53, 0x69, 0x67, + 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x54, 0x78, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x54, 0x78, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x12, 0x14, 0x0a, 0x05, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x05, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x65, 0x76, 0x48, 0x61, + 0x73, 0x68, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x50, 0x72, 0x65, 0x76, 0x48, 0x61, + 0x73, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x05, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x12, 0x32, 0x0a, 0x14, 0x4e, 0x75, 0x6d, 0x50, + 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x4d, 0x69, 0x6e, 0x69, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, + 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x14, 0x4e, 0x75, 0x6d, 0x50, 0x65, 0x6e, 0x64, 0x69, + 0x6e, 0x67, 0x4d, 0x69, 0x6e, 0x69, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x28, 0x0a, 0x0f, + 0x41, 0x63, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x46, 0x65, 0x65, 0x73, 0x18, + 0x0c, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x41, 0x63, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, + 0x65, 0x64, 0x46, 0x65, 0x65, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x44, 0x65, 0x76, 0x65, 0x6c, 0x6f, + 0x70, 0x65, 0x72, 0x46, 0x65, 0x65, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x44, + 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x46, 0x65, 0x65, 0x73, 0x12, 0x34, 0x0a, 0x15, + 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x61, + 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x04, 0x52, 0x15, 0x4c, 0x61, 0x73, + 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x61, 0x4e, 0x6f, 0x6e, + 0x63, 0x65, 0x22, 0x8c, 0x01, 0x0a, 0x0a, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x12, 0x4e, 0x0a, 0x14, 0x4c, 0x61, 0x73, 0x74, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x7a, + 0x65, 0x64, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x44, 0x61, 0x74, 0x61, 0x52, 0x14, 0x4c, 0x61, 0x73, + 0x74, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x73, 0x12, 0x2e, 0x0a, 0x09, 0x45, 0x63, 0x6f, 0x6e, 0x6f, 0x6d, 0x69, 0x63, 0x73, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x45, 0x63, 0x6f, + 0x6e, 0x6f, 0x6d, 0x69, 0x63, 0x73, 0x52, 0x09, 0x45, 0x63, 0x6f, 0x6e, 0x6f, 0x6d, 0x69, 0x63, + 0x73, 0x22, 0x99, 0x03, 0x0a, 0x13, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x53, 0x74, 0x61, 0x72, 0x74, + 0x53, 0x68, 0x61, 0x72, 0x64, 0x44, 0x61, 0x74, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x68, 0x61, + 0x72, 0x64, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x53, 0x68, 0x61, 0x72, + 0x64, 0x49, 0x44, 0x12, 0x1e, 0x0a, 0x0a, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x48, 0x61, 0x73, + 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x48, + 0x61, 0x73, 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x52, 0x6f, 0x6f, 0x74, 0x48, 0x61, 0x73, 0x68, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x52, 0x6f, 0x6f, 0x74, 0x48, 0x61, 0x73, 0x68, 0x12, + 0x34, 0x0a, 0x15, 0x46, 0x69, 0x72, 0x73, 0x74, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x4d, + 0x65, 0x74, 0x61, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x15, + 0x46, 0x69, 0x72, 0x73, 0x74, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x4d, 0x65, 0x74, 0x61, + 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x34, 0x0a, 0x15, 0x4c, 0x61, 0x73, 0x74, 0x46, 0x69, 0x6e, + 0x69, 0x73, 0x68, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x61, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x15, 0x4c, 0x61, 0x73, 0x74, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, + 0x65, 0x64, 0x4d, 0x65, 0x74, 0x61, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x50, 0x0a, 0x17, 0x50, + 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x4d, 0x69, 0x6e, 0x69, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4d, 0x69, 0x6e, 0x69, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x52, 0x17, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x4d, 0x69, 0x6e, + 0x69, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x14, 0x0a, + 0x05, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x52, 0x6f, + 0x75, 0x6e, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x05, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x45, 0x70, 0x6f, + 0x63, 0x68, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x12, + 0x2c, 0x0a, 0x11, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x52, 0x6f, 0x6f, 0x74, + 0x48, 0x61, 0x73, 0x68, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x11, 0x53, 0x63, 0x68, 0x65, + 0x64, 0x75, 0x6c, 0x65, 0x64, 0x52, 0x6f, 0x6f, 0x74, 0x48, 0x61, 0x73, 0x68, 0x22, 0xfd, 0x02, + 0x0a, 0x09, 0x45, 0x63, 0x6f, 0x6e, 0x6f, 0x6d, 0x69, 0x63, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x54, + 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x75, 0x70, 0x70, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x0b, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x75, 0x70, 0x70, 0x6c, 0x79, 0x12, 0x2c, 0x0a, + 0x11, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x54, 0x6f, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, + 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x11, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x54, + 0x6f, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x54, + 0x6f, 0x74, 0x61, 0x6c, 0x4e, 0x65, 0x77, 0x6c, 0x79, 0x4d, 0x69, 0x6e, 0x74, 0x65, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x10, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x4e, 0x65, 0x77, 0x6c, + 0x79, 0x4d, 0x69, 0x6e, 0x74, 0x65, 0x64, 0x12, 0x28, 0x0a, 0x0f, 0x52, 0x65, 0x77, 0x61, 0x72, + 0x64, 0x73, 0x50, 0x65, 0x72, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x0f, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x50, 0x65, 0x72, 0x42, 0x6c, 0x6f, 0x63, + 0x6b, 0x12, 0x4a, 0x0a, 0x20, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x46, 0x6f, 0x72, 0x50, + 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x53, 0x75, 0x73, 0x74, 0x61, 0x69, 0x6e, 0x61, 0x62, + 0x69, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x20, 0x52, 0x65, 0x77, + 0x61, 0x72, 0x64, 0x73, 0x46, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x53, + 0x75, 0x73, 0x74, 0x61, 0x69, 0x6e, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x1c, 0x0a, + 0x09, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x72, 0x69, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x09, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x30, 0x0a, 0x13, 0x50, + 0x72, 0x65, 0x76, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x6f, 0x75, + 0x6e, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x13, 0x50, 0x72, 0x65, 0x76, 0x45, 0x70, + 0x6f, 0x63, 0x68, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x2e, 0x0a, + 0x12, 0x50, 0x72, 0x65, 0x76, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x53, 0x74, 0x61, 0x72, 0x74, 0x48, + 0x61, 0x73, 0x68, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x12, 0x50, 0x72, 0x65, 0x76, 0x45, + 0x70, 0x6f, 0x63, 0x68, 0x53, 0x74, 0x61, 0x72, 0x74, 0x48, 0x61, 0x73, 0x68, 0x22, 0xad, 0x01, + 0x0a, 0x08, 0x50, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x41, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x41, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, + 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, + 0x65, 0x79, 0x12, 0x29, 0x0a, 0x06, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x41, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, + 0x09, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x09, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x20, 0x0a, 0x0b, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x0b, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x22, 0xf9, 0x07, + 0x0a, 0x0f, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6f, + 0x6c, 0x12, 0x4c, 0x0a, 0x0c, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6f, 0x6c, 0x2e, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x0c, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, + 0x64, 0x0a, 0x14, 0x53, 0x6d, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, + 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x50, 0x6f, 0x6f, 0x6c, 0x2e, 0x53, 0x6d, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x72, + 0x61, 0x63, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x14, 0x53, 0x6d, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x52, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x3d, 0x0a, 0x07, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, + 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6f, 0x6c, 0x2e, 0x52, + 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x52, 0x65, 0x77, + 0x61, 0x72, 0x64, 0x73, 0x12, 0x40, 0x0a, 0x08, 0x52, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x73, + 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6f, 0x6c, 0x2e, 0x52, + 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x52, 0x65, + 0x63, 0x65, 0x69, 0x70, 0x74, 0x73, 0x12, 0x46, 0x0a, 0x0a, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x54, 0x78, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, + 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x54, 0x78, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x0a, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x54, 0x78, 0x73, 0x12, 0x22, + 0x0a, 0x04, 0x4c, 0x6f, 0x67, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4c, 0x6f, 0x67, 0x44, 0x61, 0x74, 0x61, 0x52, 0x04, 0x4c, 0x6f, + 0x67, 0x73, 0x12, 0x52, 0x0a, 0x24, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x45, + 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x53, 0x43, 0x52, 0x53, 0x48, 0x61, 0x73, 0x68, 0x65, + 0x73, 0x50, 0x72, 0x65, 0x76, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x24, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x45, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x65, 0x64, 0x53, 0x43, 0x52, 0x53, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x50, 0x72, 0x65, + 0x76, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x5e, 0x0a, 0x2a, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, + 0x6c, 0x65, 0x64, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x49, 0x6e, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x54, 0x78, 0x73, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x50, 0x72, 0x65, 0x76, 0x42, + 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, 0x52, 0x2a, 0x53, 0x63, 0x68, 0x65, + 0x64, 0x75, 0x6c, 0x65, 0x64, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x49, 0x6e, 0x76, + 0x61, 0x6c, 0x69, 0x64, 0x54, 0x78, 0x73, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x50, 0x72, 0x65, + 0x76, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x1a, 0x4e, 0x0a, 0x11, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x23, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x54, 0x78, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x57, 0x0a, 0x19, 0x53, 0x6d, 0x61, 0x72, 0x74, 0x43, + 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x24, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x75, 0x62, - 0x4b, 0x65, 0x79, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0xf7, 0x01, 0x0a, 0x08, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12, 0x18, 0x0a, 0x07, - 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x53, - 0x68, 0x61, 0x72, 0x64, 0x49, 0x44, 0x12, 0x26, 0x0a, 0x0e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x54, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, - 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x4e, - 0x0a, 0x0f, 0x41, 0x6c, 0x74, 0x65, 0x72, 0x65, 0x64, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, - 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2e, 0x41, 0x6c, 0x74, 0x65, 0x72, 0x65, 0x64, - 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x41, - 0x6c, 0x74, 0x65, 0x72, 0x65, 0x64, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x1a, 0x59, - 0x0a, 0x14, 0x41, 0x6c, 0x74, 0x65, 0x72, 0x65, 0x64, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2b, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, - 0x41, 0x6c, 0x74, 0x65, 0x72, 0x65, 0x64, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x4a, 0x0a, 0x0e, 0x46, 0x69, 0x6e, - 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x53, - 0x68, 0x61, 0x72, 0x64, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x53, 0x68, - 0x61, 0x72, 0x64, 0x49, 0x44, 0x12, 0x1e, 0x0a, 0x0a, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x48, - 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x48, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x48, 0x61, 0x73, 0x68, 0x22, 0x21, 0x0a, 0x05, 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x18, - 0x0a, 0x07, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x07, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, 0x44, 0x22, 0x38, 0x0a, 0x04, 0x42, 0x6f, 0x64, 0x79, - 0x12, 0x30, 0x0a, 0x0a, 0x4d, 0x69, 0x6e, 0x69, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4d, 0x69, 0x6e, - 0x69, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x0a, 0x4d, 0x69, 0x6e, 0x69, 0x42, 0x6c, 0x6f, 0x63, - 0x6b, 0x73, 0x22, 0xb4, 0x01, 0x0a, 0x09, 0x4d, 0x69, 0x6e, 0x69, 0x42, 0x6c, 0x6f, 0x63, 0x6b, - 0x12, 0x1a, 0x0a, 0x08, 0x54, 0x78, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0c, 0x52, 0x08, 0x54, 0x78, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x28, 0x0a, 0x0f, - 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, 0x44, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x53, - 0x68, 0x61, 0x72, 0x64, 0x49, 0x44, 0x12, 0x24, 0x0a, 0x0d, 0x53, 0x65, 0x6e, 0x64, 0x65, 0x72, - 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, 0x44, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x53, - 0x65, 0x6e, 0x64, 0x65, 0x72, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, 0x44, 0x12, 0x1f, 0x0a, 0x04, - 0x54, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0b, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, - 0x08, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x08, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x22, 0xbb, 0x03, 0x0a, 0x0b, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x4e, 0x6f, 0x6e, - 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x12, - 0x14, 0x0a, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x52, 0x63, 0x76, 0x41, 0x64, 0x64, 0x72, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x52, 0x63, 0x76, 0x41, 0x64, 0x64, 0x72, 0x12, - 0x20, 0x0a, 0x0b, 0x52, 0x63, 0x76, 0x55, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x52, 0x63, 0x76, 0x55, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x6e, 0x64, 0x41, 0x64, 0x64, 0x72, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x07, 0x53, 0x6e, 0x64, 0x41, 0x64, 0x64, 0x72, 0x12, 0x20, 0x0a, 0x0b, 0x53, - 0x6e, 0x64, 0x55, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x0b, 0x53, 0x6e, 0x64, 0x55, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, - 0x08, 0x47, 0x61, 0x73, 0x50, 0x72, 0x69, 0x63, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x08, 0x47, 0x61, 0x73, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x47, 0x61, 0x73, - 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x47, 0x61, 0x73, - 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x43, 0x68, 0x61, - 0x69, 0x6e, 0x49, 0x44, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x43, 0x68, 0x61, 0x69, - 0x6e, 0x49, 0x44, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0b, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, - 0x09, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x09, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x4f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x4f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x47, 0x75, 0x61, 0x72, 0x64, 0x69, 0x61, - 0x6e, 0x41, 0x64, 0x64, 0x72, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x47, 0x75, 0x61, - 0x72, 0x64, 0x69, 0x61, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x12, 0x2c, 0x0a, 0x11, 0x47, 0x75, 0x61, - 0x72, 0x64, 0x69, 0x61, 0x6e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x0f, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x11, 0x47, 0x75, 0x61, 0x72, 0x64, 0x69, 0x61, 0x6e, 0x53, 0x69, - 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0xf1, 0x03, 0x0a, 0x13, 0x53, 0x6d, 0x61, 0x72, - 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, - 0x14, 0x0a, 0x05, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, - 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x52, - 0x63, 0x76, 0x41, 0x64, 0x64, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x52, 0x63, - 0x76, 0x41, 0x64, 0x64, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x6e, 0x64, 0x41, 0x64, 0x64, 0x72, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x53, 0x6e, 0x64, 0x41, 0x64, 0x64, 0x72, 0x12, - 0x20, 0x0a, 0x0b, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x41, 0x64, 0x64, - 0x72, 0x12, 0x22, 0x0a, 0x0c, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x65, 0x64, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x04, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, - 0x61, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x1e, 0x0a, - 0x0a, 0x50, 0x72, 0x65, 0x76, 0x54, 0x78, 0x48, 0x61, 0x73, 0x68, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x0a, 0x50, 0x72, 0x65, 0x76, 0x54, 0x78, 0x48, 0x61, 0x73, 0x68, 0x12, 0x26, 0x0a, - 0x0e, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x54, 0x78, 0x48, 0x61, 0x73, 0x68, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x54, - 0x78, 0x48, 0x61, 0x73, 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x47, 0x61, 0x73, 0x4c, 0x69, 0x6d, 0x69, - 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x47, 0x61, 0x73, 0x4c, 0x69, 0x6d, 0x69, - 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x47, 0x61, 0x73, 0x50, 0x72, 0x69, 0x63, 0x65, 0x18, 0x0c, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x08, 0x47, 0x61, 0x73, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x1a, 0x0a, - 0x08, 0x43, 0x61, 0x6c, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x08, 0x43, 0x61, 0x6c, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x43, 0x6f, 0x64, - 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x0c, 0x43, 0x6f, 0x64, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x24, 0x0a, - 0x0d, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0f, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x4d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x53, - 0x65, 0x6e, 0x64, 0x65, 0x72, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x4f, 0x72, 0x69, - 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x53, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x22, 0x45, 0x0a, 0x03, 0x4c, - 0x6f, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x07, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x24, 0x0a, 0x06, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x73, 0x22, 0x95, 0x01, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, - 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x41, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, - 0x66, 0x69, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x49, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x73, - 0x18, 0x03, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x06, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x73, 0x12, 0x12, - 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, - 0x74, 0x61, 0x12, 0x26, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, - 0x44, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x0e, 0x41, 0x64, 0x64, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x22, 0x66, 0x0a, 0x08, 0x52, 0x65, - 0x77, 0x61, 0x72, 0x64, 0x54, 0x78, 0x12, 0x14, 0x0a, 0x05, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x14, 0x0a, 0x05, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x52, 0x63, 0x76, 0x41, 0x64, 0x64, 0x72, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x07, 0x52, 0x63, 0x76, 0x41, 0x64, 0x64, 0x72, 0x12, 0x14, 0x0a, 0x05, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x53, 0x43, 0x52, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, + 0x4d, 0x0a, 0x0c, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x27, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x11, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x4b, + 0x0a, 0x0d, 0x52, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x24, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x0e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x52, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x4c, 0x0a, 0x0f, 0x49, + 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x54, 0x78, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x23, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x0d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x54, 0x78, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x5d, 0x0a, 0x07, 0x46, 0x65, 0x65, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x18, 0x0a, 0x07, 0x47, 0x61, 0x73, 0x55, 0x73, 0x65, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x47, 0x61, 0x73, 0x55, 0x73, 0x65, 0x64, 0x12, 0x10, + 0x0a, 0x03, 0x46, 0x65, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x46, 0x65, 0x65, + 0x12, 0x26, 0x0a, 0x0e, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x69, 0x64, 0x46, + 0x65, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, + 0x6c, 0x50, 0x61, 0x69, 0x64, 0x46, 0x65, 0x65, 0x22, 0x90, 0x01, 0x0a, 0x06, 0x54, 0x78, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x34, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x07, 0x46, 0x65, 0x65, + 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2e, 0x46, 0x65, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x46, 0x65, 0x65, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x26, 0x0a, 0x0e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, + 0x4f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x45, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x22, 0xa9, 0x01, 0x0a, 0x07, + 0x53, 0x43, 0x52, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x4c, 0x0a, 0x13, 0x53, 0x6d, 0x61, 0x72, 0x74, + 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x53, 0x6d, 0x61, + 0x72, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x52, 0x13, 0x53, 0x6d, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x52, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x07, 0x46, 0x65, 0x65, 0x49, 0x6e, 0x66, 0x6f, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x46, + 0x65, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x46, 0x65, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x26, 0x0a, 0x0e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x72, 0x64, 0x65, + 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, + 0x6f, 0x6e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x22, 0x3f, 0x0a, 0x07, 0x4c, 0x6f, 0x67, 0x44, 0x61, + 0x74, 0x61, 0x12, 0x16, 0x0a, 0x06, 0x54, 0x78, 0x48, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x54, 0x78, 0x48, 0x61, 0x73, 0x68, 0x12, 0x1c, 0x0a, 0x03, 0x4c, 0x6f, + 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x4c, 0x6f, 0x67, 0x52, 0x03, 0x4c, 0x6f, 0x67, 0x22, 0x5d, 0x0a, 0x0a, 0x52, 0x65, 0x77, 0x61, + 0x72, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x27, 0x0a, 0x06, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x52, + 0x65, 0x77, 0x61, 0x72, 0x64, 0x54, 0x78, 0x52, 0x06, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x12, + 0x26, 0x0a, 0x0e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x72, 0x64, 0x65, + 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, + 0x6f, 0x6e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x22, 0xa6, 0x01, 0x0a, 0x14, 0x48, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x47, 0x61, 0x73, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x20, 0x0a, 0x0b, 0x47, 0x61, 0x73, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x47, 0x61, 0x73, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x47, 0x61, 0x73, 0x52, 0x65, 0x66, 0x75, 0x6e, 0x64, 0x65, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x47, 0x61, 0x73, 0x52, 0x65, 0x66, 0x75, + 0x6e, 0x64, 0x65, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x47, 0x61, 0x73, 0x50, 0x65, 0x6e, 0x61, 0x6c, + 0x69, 0x7a, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x47, 0x61, 0x73, 0x50, + 0x65, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x4d, 0x61, 0x78, 0x47, + 0x61, 0x73, 0x50, 0x65, 0x72, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x0e, 0x4d, 0x61, 0x78, 0x47, 0x61, 0x73, 0x50, 0x65, 0x72, 0x42, 0x6c, 0x6f, 0x63, 0x6b, + 0x22, 0x4b, 0x0a, 0x13, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x61, 0x74, + 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x75, 0x62, 0x6c, 0x69, + 0x63, 0x4b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x75, 0x62, 0x6c, + 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x02, 0x52, 0x06, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x22, 0x92, 0x01, + 0x0a, 0x10, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x61, 0x74, 0x69, + 0x6e, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, 0x44, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x07, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, 0x44, 0x12, 0x14, 0x0a, 0x05, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x45, 0x70, 0x6f, - 0x63, 0x68, 0x22, 0xd1, 0x01, 0x0a, 0x0e, 0x41, 0x6c, 0x74, 0x65, 0x72, 0x65, 0x64, 0x41, 0x63, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, - 0x14, 0x0a, 0x05, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, - 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, - 0x2f, 0x0a, 0x06, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x54, - 0x6f, 0x6b, 0x65, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x06, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, - 0x12, 0x44, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x44, 0x61, - 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2e, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x41, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x44, 0x61, 0x74, 0x61, 0x52, 0x0e, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x61, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x22, 0xff, 0x01, 0x0a, 0x10, 0x41, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, 0x14, 0x0a, 0x05, 0x4e, - 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x4e, 0x6f, 0x6e, 0x63, - 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, - 0x72, 0x12, 0x18, 0x0a, 0x07, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x50, - 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, 0x30, 0x0a, 0x08, 0x4d, - 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x44, - 0x61, 0x74, 0x61, 0x52, 0x08, 0x4d, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x12, 0x49, 0x0a, - 0x0e, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x41, 0x64, - 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x54, - 0x6f, 0x6b, 0x65, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x0e, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x61, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x22, 0xb9, 0x01, 0x0a, 0x0d, 0x54, 0x6f, 0x6b, - 0x65, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x12, 0x14, 0x0a, 0x05, 0x4e, 0x6f, + 0x63, 0x68, 0x12, 0x4e, 0x0a, 0x14, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x73, + 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x6f, 0x72, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x14, 0x56, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x49, 0x6e, + 0x66, 0x6f, 0x22, 0xc3, 0x01, 0x0a, 0x09, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x14, 0x0a, 0x05, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x05, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, + 0x73, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x04, 0x52, 0x0e, + 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x73, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x12, 0x2a, + 0x0a, 0x10, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x57, 0x61, 0x73, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, + 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x57, + 0x61, 0x73, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x68, + 0x61, 0x72, 0x64, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x53, 0x68, 0x61, + 0x72, 0x64, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x05, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x1c, 0x0a, 0x09, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x58, 0x0a, 0x0a, 0x52, 0x6f, 0x75, 0x6e, + 0x64, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, + 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, 0x44, + 0x12, 0x30, 0x0a, 0x0a, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x52, 0x6f, 0x75, + 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x49, 0x6e, + 0x66, 0x6f, 0x22, 0x1d, 0x0a, 0x07, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x12, 0x0a, + 0x04, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x04, 0x4b, 0x65, 0x79, + 0x73, 0x22, 0x8c, 0x02, 0x0a, 0x11, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x73, + 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x68, 0x61, 0x72, 0x64, + 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, + 0x44, 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x68, 0x61, 0x72, 0x64, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x6f, 0x72, 0x73, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x34, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x6f, 0x72, 0x73, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x73, 0x2e, 0x53, 0x68, 0x61, 0x72, + 0x64, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x50, 0x75, 0x62, 0x4b, 0x65, + 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x16, 0x53, 0x68, 0x61, 0x72, 0x64, 0x56, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x73, 0x12, + 0x14, 0x0a, 0x05, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, + 0x45, 0x70, 0x6f, 0x63, 0x68, 0x1a, 0x59, 0x0a, 0x1b, 0x53, 0x68, 0x61, 0x72, 0x64, 0x56, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x24, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x75, + 0x62, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x22, 0xf7, 0x01, 0x0a, 0x08, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12, 0x18, 0x0a, + 0x07, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, + 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, 0x44, 0x12, 0x26, 0x0a, 0x0e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x0e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, + 0x4e, 0x0a, 0x0f, 0x41, 0x6c, 0x74, 0x65, 0x72, 0x65, 0x64, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2e, 0x41, 0x6c, 0x74, 0x65, 0x72, 0x65, + 0x64, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, + 0x41, 0x6c, 0x74, 0x65, 0x72, 0x65, 0x64, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x1a, + 0x59, 0x0a, 0x14, 0x41, 0x6c, 0x74, 0x65, 0x72, 0x65, 0x64, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2b, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x41, 0x6c, 0x74, 0x65, 0x72, 0x65, 0x64, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x4a, 0x0a, 0x0e, 0x46, 0x69, + 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x18, 0x0a, 0x07, + 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x53, + 0x68, 0x61, 0x72, 0x64, 0x49, 0x44, 0x12, 0x1e, 0x0a, 0x0a, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x48, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x48, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x48, 0x61, 0x73, 0x68, 0x22, 0x21, 0x0a, 0x05, 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, + 0x18, 0x0a, 0x07, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x07, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, 0x44, 0x22, 0x38, 0x0a, 0x04, 0x42, 0x6f, 0x64, + 0x79, 0x12, 0x30, 0x0a, 0x0a, 0x4d, 0x69, 0x6e, 0x69, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4d, 0x69, + 0x6e, 0x69, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x0a, 0x4d, 0x69, 0x6e, 0x69, 0x42, 0x6c, 0x6f, + 0x63, 0x6b, 0x73, 0x22, 0xb4, 0x01, 0x0a, 0x09, 0x4d, 0x69, 0x6e, 0x69, 0x42, 0x6c, 0x6f, 0x63, + 0x6b, 0x12, 0x1a, 0x0a, 0x08, 0x54, 0x78, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0c, 0x52, 0x08, 0x54, 0x78, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x28, 0x0a, + 0x0f, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, 0x44, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, + 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, 0x44, 0x12, 0x24, 0x0a, 0x0d, 0x53, 0x65, 0x6e, 0x64, 0x65, + 0x72, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, 0x44, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, + 0x53, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, 0x44, 0x12, 0x1f, 0x0a, + 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0b, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x08, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x22, 0xbb, 0x03, 0x0a, 0x0b, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x4e, 0x6f, 0x6e, 0x63, 0x65, - 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x1c, - 0x0a, 0x09, 0x52, 0x6f, 0x79, 0x61, 0x6c, 0x74, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x09, 0x52, 0x6f, 0x79, 0x61, 0x6c, 0x74, 0x69, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, - 0x48, 0x61, 0x73, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x48, 0x61, 0x73, 0x68, - 0x12, 0x12, 0x0a, 0x04, 0x55, 0x52, 0x49, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x04, - 0x55, 0x52, 0x49, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, - 0x65, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, - 0x75, 0x74, 0x65, 0x73, 0x22, 0x3e, 0x0a, 0x1a, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x61, 0x6c, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x44, 0x61, - 0x74, 0x61, 0x12, 0x20, 0x0a, 0x0b, 0x49, 0x73, 0x4e, 0x46, 0x54, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x49, 0x73, 0x4e, 0x46, 0x54, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x22, 0xa3, 0x02, 0x0a, 0x15, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x61, 0x6c, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x44, 0x61, 0x74, 0x61, 0x12, 0x1a, - 0x0a, 0x08, 0x49, 0x73, 0x53, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x08, 0x49, 0x73, 0x53, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x12, 0x26, 0x0a, 0x0e, 0x42, 0x61, - 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0e, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4f, 0x77, 0x6e, - 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, - 0x74, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x4e, 0x61, - 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x55, 0x73, 0x65, 0x72, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x44, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x52, - 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x44, 0x65, - 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x12, 0x1a, - 0x0a, 0x08, 0x43, 0x6f, 0x64, 0x65, 0x48, 0x61, 0x73, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x08, 0x43, 0x6f, 0x64, 0x65, 0x48, 0x61, 0x73, 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x52, 0x6f, - 0x6f, 0x74, 0x48, 0x61, 0x73, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x52, 0x6f, - 0x6f, 0x74, 0x48, 0x61, 0x73, 0x68, 0x12, 0x22, 0x0a, 0x0c, 0x43, 0x6f, 0x64, 0x65, 0x4d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x43, 0x6f, - 0x64, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x65, 0x0a, 0x07, 0x52, 0x65, - 0x63, 0x65, 0x69, 0x70, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x53, - 0x6e, 0x64, 0x41, 0x64, 0x64, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x53, 0x6e, - 0x64, 0x41, 0x64, 0x64, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x16, 0x0a, 0x06, 0x54, 0x78, 0x48, - 0x61, 0x73, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x54, 0x78, 0x48, 0x61, 0x73, - 0x68, 0x22, 0x1e, 0x0a, 0x06, 0x42, 0x69, 0x67, 0x49, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x62, - 0x79, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x62, 0x79, 0x74, 0x65, - 0x73, 0x2a, 0xa4, 0x01, 0x0a, 0x0a, 0x50, 0x65, 0x65, 0x72, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x11, 0x0a, 0x0d, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x41, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x50, 0x65, 0x65, 0x72, 0x52, 0x65, 0x67, 0x69, 0x73, - 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x50, 0x65, 0x65, - 0x72, 0x55, 0x6e, 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x10, 0x02, 0x12, 0x16, 0x0a, 0x12, - 0x50, 0x65, 0x65, 0x72, 0x44, 0x65, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x10, 0x03, 0x12, 0x0e, 0x0a, 0x0a, 0x50, 0x65, 0x65, 0x72, 0x4a, 0x61, 0x69, 0x6c, - 0x65, 0x64, 0x10, 0x04, 0x12, 0x10, 0x0a, 0x0c, 0x50, 0x65, 0x65, 0x72, 0x55, 0x6e, 0x4a, 0x61, - 0x69, 0x6c, 0x65, 0x64, 0x10, 0x05, 0x12, 0x0f, 0x0a, 0x0b, 0x50, 0x65, 0x65, 0x72, 0x53, 0x6c, - 0x61, 0x73, 0x68, 0x65, 0x64, 0x10, 0x06, 0x12, 0x0f, 0x0a, 0x0b, 0x50, 0x65, 0x65, 0x72, 0x52, - 0x65, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x10, 0x07, 0x2a, 0x88, 0x01, 0x0a, 0x04, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x54, 0x78, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x10, 0x00, 0x12, 0x0e, - 0x0a, 0x0a, 0x53, 0x74, 0x61, 0x74, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x10, 0x1e, 0x12, 0x0d, - 0x0a, 0x09, 0x50, 0x65, 0x65, 0x72, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x10, 0x3c, 0x12, 0x1c, 0x0a, - 0x18, 0x53, 0x6d, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x52, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x10, 0x5a, 0x12, 0x10, 0x0a, 0x0c, 0x49, - 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x10, 0x78, 0x12, 0x11, 0x0a, - 0x0c, 0x52, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x10, 0x96, 0x01, - 0x12, 0x11, 0x0a, 0x0c, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x42, 0x6c, 0x6f, 0x63, 0x6b, - 0x10, 0xff, 0x01, 0x32, 0xc2, 0x01, 0x0a, 0x18, 0x48, 0x79, 0x70, 0x65, 0x72, 0x4f, 0x75, 0x74, - 0x70, 0x6f, 0x72, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x12, 0x51, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x48, 0x79, 0x70, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, - 0x6f, 0x72, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x42, 0x79, 0x48, 0x61, 0x73, 0x68, 0x12, 0x17, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, - 0x48, 0x79, 0x70, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x6c, 0x6f, 0x63, - 0x6b, 0x22, 0x00, 0x12, 0x53, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x48, 0x79, 0x70, 0x65, 0x72, 0x4f, - 0x75, 0x74, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x42, 0x79, 0x4e, 0x6f, 0x6e, - 0x63, 0x65, 0x12, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, - 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x48, 0x79, 0x70, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x6f, 0x72, - 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0x00, 0x42, 0x51, 0x5a, 0x4f, 0x67, 0x69, 0x74, 0x68, - 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x76, 0x65, 0x72, 0x73, - 0x78, 0x2f, 0x6d, 0x78, 0x2d, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2d, 0x77, 0x73, 0x2d, 0x63, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2d, 0x66, 0x69, 0x72, 0x65, 0x68, 0x6f, 0x73, 0x65, - 0x2d, 0x67, 0x6f, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x2f, 0x68, 0x79, 0x70, 0x65, 0x72, 0x4f, 0x75, - 0x74, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x33, + 0x12, 0x14, 0x0a, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x52, 0x63, 0x76, 0x41, 0x64, 0x64, + 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x52, 0x63, 0x76, 0x41, 0x64, 0x64, 0x72, + 0x12, 0x20, 0x0a, 0x0b, 0x52, 0x63, 0x76, 0x55, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x52, 0x63, 0x76, 0x55, 0x73, 0x65, 0x72, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x6e, 0x64, 0x41, 0x64, 0x64, 0x72, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x07, 0x53, 0x6e, 0x64, 0x41, 0x64, 0x64, 0x72, 0x12, 0x20, 0x0a, 0x0b, + 0x53, 0x6e, 0x64, 0x55, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x0b, 0x53, 0x6e, 0x64, 0x55, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x47, 0x61, 0x73, 0x50, 0x72, 0x69, 0x63, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x08, 0x47, 0x61, 0x73, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x47, 0x61, + 0x73, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x47, 0x61, + 0x73, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x43, 0x68, + 0x61, 0x69, 0x6e, 0x49, 0x44, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x43, 0x68, 0x61, + 0x69, 0x6e, 0x49, 0x44, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, + 0x0a, 0x09, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x09, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x18, 0x0a, 0x07, + 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x4f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x47, 0x75, 0x61, 0x72, 0x64, 0x69, + 0x61, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x47, 0x75, + 0x61, 0x72, 0x64, 0x69, 0x61, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x12, 0x2c, 0x0a, 0x11, 0x47, 0x75, + 0x61, 0x72, 0x64, 0x69, 0x61, 0x6e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, + 0x0f, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x11, 0x47, 0x75, 0x61, 0x72, 0x64, 0x69, 0x61, 0x6e, 0x53, + 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0xf1, 0x03, 0x0a, 0x13, 0x53, 0x6d, 0x61, + 0x72, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x12, 0x14, 0x0a, 0x05, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x05, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x18, 0x0a, 0x07, + 0x52, 0x63, 0x76, 0x41, 0x64, 0x64, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x52, + 0x63, 0x76, 0x41, 0x64, 0x64, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x6e, 0x64, 0x41, 0x64, 0x64, + 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x53, 0x6e, 0x64, 0x41, 0x64, 0x64, 0x72, + 0x12, 0x20, 0x0a, 0x0b, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x41, 0x64, + 0x64, 0x72, 0x12, 0x22, 0x0a, 0x0c, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x65, 0x64, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x65, + 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, + 0x74, 0x61, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x1e, + 0x0a, 0x0a, 0x50, 0x72, 0x65, 0x76, 0x54, 0x78, 0x48, 0x61, 0x73, 0x68, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x0a, 0x50, 0x72, 0x65, 0x76, 0x54, 0x78, 0x48, 0x61, 0x73, 0x68, 0x12, 0x26, + 0x0a, 0x0e, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x54, 0x78, 0x48, 0x61, 0x73, 0x68, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, + 0x54, 0x78, 0x48, 0x61, 0x73, 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x47, 0x61, 0x73, 0x4c, 0x69, 0x6d, + 0x69, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x47, 0x61, 0x73, 0x4c, 0x69, 0x6d, + 0x69, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x47, 0x61, 0x73, 0x50, 0x72, 0x69, 0x63, 0x65, 0x18, 0x0c, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x47, 0x61, 0x73, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x43, 0x61, 0x6c, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x08, 0x43, 0x61, 0x6c, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x43, 0x6f, + 0x64, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x0c, 0x43, 0x6f, 0x64, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x24, + 0x0a, 0x0d, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, + 0x0f, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x4d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, + 0x53, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x4f, 0x72, + 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x53, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x22, 0x45, 0x0a, 0x03, + 0x4c, 0x6f, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x24, 0x0a, + 0x06, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x73, 0x22, 0x95, 0x01, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x18, 0x0a, + 0x07, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, + 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x49, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x49, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x54, 0x6f, 0x70, 0x69, 0x63, + 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x06, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x73, 0x12, + 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, + 0x61, 0x74, 0x61, 0x12, 0x26, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, + 0x6c, 0x44, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x0e, 0x41, 0x64, 0x64, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x22, 0x66, 0x0a, 0x08, 0x52, + 0x65, 0x77, 0x61, 0x72, 0x64, 0x54, 0x78, 0x12, 0x14, 0x0a, 0x05, 0x52, 0x6f, 0x75, 0x6e, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x14, 0x0a, + 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x52, 0x63, 0x76, 0x41, 0x64, 0x64, 0x72, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x52, 0x63, 0x76, 0x41, 0x64, 0x64, 0x72, 0x12, 0x14, 0x0a, + 0x05, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x45, 0x70, + 0x6f, 0x63, 0x68, 0x22, 0xd1, 0x01, 0x0a, 0x0e, 0x41, 0x6c, 0x74, 0x65, 0x72, 0x65, 0x64, 0x41, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x12, 0x14, 0x0a, 0x05, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x05, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, + 0x12, 0x2f, 0x0a, 0x06, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x06, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x73, 0x12, 0x44, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x44, + 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x41, 0x63, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x44, 0x61, 0x74, 0x61, 0x52, 0x0e, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x61, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x22, 0xff, 0x01, 0x0a, 0x10, 0x41, 0x63, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, 0x14, 0x0a, 0x05, + 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x4e, 0x6f, 0x6e, + 0x63, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, + 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x1e, 0x0a, 0x0a, + 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, 0x30, 0x0a, 0x08, + 0x4d, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x4d, 0x65, 0x74, 0x61, + 0x44, 0x61, 0x74, 0x61, 0x52, 0x08, 0x4d, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x12, 0x49, + 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x44, 0x61, 0x74, 0x61, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x41, + 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x0e, 0x41, 0x64, 0x64, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x22, 0xb9, 0x01, 0x0a, 0x0d, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x12, 0x14, 0x0a, 0x05, 0x4e, + 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x4e, 0x6f, 0x6e, 0x63, + 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x12, + 0x1c, 0x0a, 0x09, 0x52, 0x6f, 0x79, 0x61, 0x6c, 0x74, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x09, 0x52, 0x6f, 0x79, 0x61, 0x6c, 0x74, 0x69, 0x65, 0x73, 0x12, 0x12, 0x0a, + 0x04, 0x48, 0x61, 0x73, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x48, 0x61, 0x73, + 0x68, 0x12, 0x12, 0x0a, 0x04, 0x55, 0x52, 0x49, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0c, 0x52, + 0x04, 0x55, 0x52, 0x49, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, + 0x74, 0x65, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x41, 0x74, 0x74, 0x72, 0x69, + 0x62, 0x75, 0x74, 0x65, 0x73, 0x22, 0x3e, 0x0a, 0x1a, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x61, 0x6c, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x44, + 0x61, 0x74, 0x61, 0x12, 0x20, 0x0a, 0x0b, 0x49, 0x73, 0x4e, 0x46, 0x54, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x49, 0x73, 0x4e, 0x46, 0x54, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x22, 0xa3, 0x02, 0x0a, 0x15, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x61, 0x6c, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x44, 0x61, 0x74, 0x61, 0x12, + 0x1a, 0x0a, 0x08, 0x49, 0x73, 0x53, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x08, 0x49, 0x73, 0x53, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x12, 0x26, 0x0a, 0x0e, 0x42, + 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0e, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4f, 0x77, + 0x6e, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x43, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x74, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x4e, + 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x55, 0x73, 0x65, 0x72, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x44, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, + 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x44, + 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x12, + 0x1a, 0x0a, 0x08, 0x43, 0x6f, 0x64, 0x65, 0x48, 0x61, 0x73, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x08, 0x43, 0x6f, 0x64, 0x65, 0x48, 0x61, 0x73, 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x52, + 0x6f, 0x6f, 0x74, 0x48, 0x61, 0x73, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x52, + 0x6f, 0x6f, 0x74, 0x48, 0x61, 0x73, 0x68, 0x12, 0x22, 0x0a, 0x0c, 0x43, 0x6f, 0x64, 0x65, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x43, + 0x6f, 0x64, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x65, 0x0a, 0x07, 0x52, + 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x18, 0x0a, 0x07, + 0x53, 0x6e, 0x64, 0x41, 0x64, 0x64, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x53, + 0x6e, 0x64, 0x41, 0x64, 0x64, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x16, 0x0a, 0x06, 0x54, 0x78, + 0x48, 0x61, 0x73, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x54, 0x78, 0x48, 0x61, + 0x73, 0x68, 0x22, 0x1e, 0x0a, 0x06, 0x42, 0x69, 0x67, 0x49, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, + 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x62, 0x79, 0x74, + 0x65, 0x73, 0x2a, 0xa4, 0x01, 0x0a, 0x0a, 0x50, 0x65, 0x65, 0x72, 0x41, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x11, 0x0a, 0x0d, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x41, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x50, 0x65, 0x65, 0x72, 0x52, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x50, 0x65, + 0x65, 0x72, 0x55, 0x6e, 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x10, 0x02, 0x12, 0x16, 0x0a, + 0x12, 0x50, 0x65, 0x65, 0x72, 0x44, 0x65, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x10, 0x03, 0x12, 0x0e, 0x0a, 0x0a, 0x50, 0x65, 0x65, 0x72, 0x4a, 0x61, 0x69, + 0x6c, 0x65, 0x64, 0x10, 0x04, 0x12, 0x10, 0x0a, 0x0c, 0x50, 0x65, 0x65, 0x72, 0x55, 0x6e, 0x4a, + 0x61, 0x69, 0x6c, 0x65, 0x64, 0x10, 0x05, 0x12, 0x0f, 0x0a, 0x0b, 0x50, 0x65, 0x65, 0x72, 0x53, + 0x6c, 0x61, 0x73, 0x68, 0x65, 0x64, 0x10, 0x06, 0x12, 0x0f, 0x0a, 0x0b, 0x50, 0x65, 0x65, 0x72, + 0x52, 0x65, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x10, 0x07, 0x2a, 0x88, 0x01, 0x0a, 0x04, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x54, 0x78, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x10, 0x00, 0x12, + 0x0e, 0x0a, 0x0a, 0x53, 0x74, 0x61, 0x74, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x10, 0x1e, 0x12, + 0x0d, 0x0a, 0x09, 0x50, 0x65, 0x65, 0x72, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x10, 0x3c, 0x12, 0x1c, + 0x0a, 0x18, 0x53, 0x6d, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x52, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x10, 0x5a, 0x12, 0x10, 0x0a, 0x0c, + 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x10, 0x78, 0x12, 0x11, + 0x0a, 0x0c, 0x52, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x10, 0x96, + 0x01, 0x12, 0x11, 0x0a, 0x0c, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x42, 0x6c, 0x6f, 0x63, + 0x6b, 0x10, 0xff, 0x01, 0x32, 0x80, 0x03, 0x0a, 0x18, 0x48, 0x79, 0x70, 0x65, 0x72, 0x4f, 0x75, + 0x74, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x12, 0x5c, 0x0a, 0x1d, 0x48, 0x79, 0x70, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x6f, 0x72, + 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x42, 0x79, 0x48, 0x61, + 0x73, 0x68, 0x12, 0x1d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, + 0x48, 0x61, 0x73, 0x68, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x48, 0x79, 0x70, 0x65, 0x72, 0x4f, + 0x75, 0x74, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, + 0x5e, 0x0a, 0x1e, 0x48, 0x79, 0x70, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x6f, 0x72, 0x74, 0x42, + 0x6c, 0x6f, 0x63, 0x6b, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x42, 0x79, 0x4e, 0x6f, 0x6e, 0x63, + 0x65, 0x12, 0x1e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, + 0x6f, 0x6e, 0x63, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x48, 0x79, 0x70, 0x65, 0x72, 0x4f, + 0x75, 0x74, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, + 0x51, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x48, 0x79, 0x70, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x6f, + 0x72, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x42, 0x79, 0x48, 0x61, 0x73, 0x68, 0x12, 0x17, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x48, + 0x79, 0x70, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, + 0x22, 0x00, 0x12, 0x53, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x48, 0x79, 0x70, 0x65, 0x72, 0x4f, 0x75, + 0x74, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x42, 0x79, 0x4e, 0x6f, 0x6e, 0x63, + 0x65, 0x12, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, + 0x6f, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x48, 0x79, 0x70, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x6f, 0x72, 0x74, + 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0x00, 0x42, 0x50, 0x5a, 0x4e, 0x67, 0x69, 0x74, 0x68, 0x75, + 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x76, 0x65, 0x72, 0x73, 0x78, + 0x2f, 0x6d, 0x78, 0x2d, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2d, 0x77, 0x73, 0x2d, 0x63, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2d, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x2d, + 0x67, 0x6f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x68, 0x79, 0x70, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, + 0x6f, 0x72, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, } var ( - file_hyperOutportBlock_proto_rawDescOnce sync.Once - file_hyperOutportBlock_proto_rawDescData = file_hyperOutportBlock_proto_rawDesc + file_data_hyperOutportBlocks_hyperOutportBlock_proto_rawDescOnce sync.Once + file_data_hyperOutportBlocks_hyperOutportBlock_proto_rawDescData = file_data_hyperOutportBlocks_hyperOutportBlock_proto_rawDesc ) -func file_hyperOutportBlock_proto_rawDescGZIP() []byte { - file_hyperOutportBlock_proto_rawDescOnce.Do(func() { - file_hyperOutportBlock_proto_rawDescData = protoimpl.X.CompressGZIP(file_hyperOutportBlock_proto_rawDescData) +func file_data_hyperOutportBlocks_hyperOutportBlock_proto_rawDescGZIP() []byte { + file_data_hyperOutportBlocks_hyperOutportBlock_proto_rawDescOnce.Do(func() { + file_data_hyperOutportBlocks_hyperOutportBlock_proto_rawDescData = protoimpl.X.CompressGZIP(file_data_hyperOutportBlocks_hyperOutportBlock_proto_rawDescData) }) - return file_hyperOutportBlock_proto_rawDescData + return file_data_hyperOutportBlocks_hyperOutportBlock_proto_rawDescData } -var file_hyperOutportBlock_proto_enumTypes = make([]protoimpl.EnumInfo, 2) -var file_hyperOutportBlock_proto_msgTypes = make([]protoimpl.MessageInfo, 56) -var file_hyperOutportBlock_proto_goTypes = []interface{}{ +var file_data_hyperOutportBlocks_hyperOutportBlock_proto_enumTypes = make([]protoimpl.EnumInfo, 2) +var file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes = make([]protoimpl.MessageInfo, 58) +var file_data_hyperOutportBlocks_hyperOutportBlock_proto_goTypes = []interface{}{ (PeerAction)(0), // 0: proto.PeerAction (Type)(0), // 1: proto.Type (*HyperOutportBlock)(nil), // 2: proto.HyperOutportBlock (*NotarizedHeaderOutportData)(nil), // 3: proto.NotarizedHeaderOutportData (*BlockHashRequest)(nil), // 4: proto.BlockHashRequest - (*BlockNonceRequest)(nil), // 5: proto.BlockNonceRequest - (*MetaOutportBlock)(nil), // 6: proto.MetaOutportBlock - (*ShardOutportBlock)(nil), // 7: proto.ShardOutportBlock - (*Header)(nil), // 8: proto.Header - (*MetaHeader)(nil), // 9: proto.MetaHeader - (*MiniBlockHeader)(nil), // 10: proto.MiniBlockHeader - (*PeerChange)(nil), // 11: proto.PeerChange - (*BlockData)(nil), // 12: proto.BlockData - (*MetaBlockData)(nil), // 13: proto.MetaBlockData - (*ShardData)(nil), // 14: proto.ShardData - (*EpochStart)(nil), // 15: proto.EpochStart - (*EpochStartShardData)(nil), // 16: proto.EpochStartShardData - (*Economics)(nil), // 17: proto.Economics - (*PeerData)(nil), // 18: proto.PeerData - (*TransactionPool)(nil), // 19: proto.TransactionPool - (*FeeInfo)(nil), // 20: proto.FeeInfo - (*TxInfo)(nil), // 21: proto.TxInfo - (*SCRInfo)(nil), // 22: proto.SCRInfo - (*LogData)(nil), // 23: proto.LogData - (*RewardInfo)(nil), // 24: proto.RewardInfo - (*HeaderGasConsumption)(nil), // 25: proto.HeaderGasConsumption - (*ValidatorRatingInfo)(nil), // 26: proto.ValidatorRatingInfo - (*ValidatorsRating)(nil), // 27: proto.ValidatorsRating - (*RoundInfo)(nil), // 28: proto.RoundInfo - (*RoundsInfo)(nil), // 29: proto.RoundsInfo - (*PubKeys)(nil), // 30: proto.PubKeys - (*ValidatorsPubKeys)(nil), // 31: proto.ValidatorsPubKeys - (*Accounts)(nil), // 32: proto.Accounts - (*FinalizedBlock)(nil), // 33: proto.FinalizedBlock - (*Shard)(nil), // 34: proto.Shard - (*Body)(nil), // 35: proto.Body - (*MiniBlock)(nil), // 36: proto.MiniBlock - (*Transaction)(nil), // 37: proto.Transaction - (*SmartContractResult)(nil), // 38: proto.SmartContractResult - (*Log)(nil), // 39: proto.Log - (*Event)(nil), // 40: proto.Event - (*RewardTx)(nil), // 41: proto.RewardTx - (*AlteredAccount)(nil), // 42: proto.AlteredAccount - (*AccountTokenData)(nil), // 43: proto.AccountTokenData - (*TokenMetaData)(nil), // 44: proto.TokenMetaData - (*AdditionalAccountTokenData)(nil), // 45: proto.AdditionalAccountTokenData - (*AdditionalAccountData)(nil), // 46: proto.AdditionalAccountData - (*Receipt)(nil), // 47: proto.Receipt - (*BigInt)(nil), // 48: proto.BigInt - nil, // 49: proto.MetaOutportBlock.AlteredAccountsEntry - nil, // 50: proto.ShardOutportBlock.AlteredAccountsEntry - nil, // 51: proto.TransactionPool.TransactionsEntry - nil, // 52: proto.TransactionPool.SmartContractResultsEntry - nil, // 53: proto.TransactionPool.RewardsEntry - nil, // 54: proto.TransactionPool.ReceiptsEntry - nil, // 55: proto.TransactionPool.InvalidTxsEntry - nil, // 56: proto.ValidatorsPubKeys.ShardValidatorsPubKeysEntry - nil, // 57: proto.Accounts.AlteredAccountsEntry -} -var file_hyperOutportBlock_proto_depIdxs = []int32{ - 6, // 0: proto.HyperOutportBlock.MetaOutportBlock:type_name -> proto.MetaOutportBlock + (*BlockHashStreamRequest)(nil), // 5: proto.BlockHashStreamRequest + (*BlockNonceRequest)(nil), // 6: proto.BlockNonceRequest + (*BlockNonceStreamRequest)(nil), // 7: proto.BlockNonceStreamRequest + (*MetaOutportBlock)(nil), // 8: proto.MetaOutportBlock + (*ShardOutportBlock)(nil), // 9: proto.ShardOutportBlock + (*Header)(nil), // 10: proto.Header + (*MetaHeader)(nil), // 11: proto.MetaHeader + (*MiniBlockHeader)(nil), // 12: proto.MiniBlockHeader + (*PeerChange)(nil), // 13: proto.PeerChange + (*BlockData)(nil), // 14: proto.BlockData + (*MetaBlockData)(nil), // 15: proto.MetaBlockData + (*ShardData)(nil), // 16: proto.ShardData + (*EpochStart)(nil), // 17: proto.EpochStart + (*EpochStartShardData)(nil), // 18: proto.EpochStartShardData + (*Economics)(nil), // 19: proto.Economics + (*PeerData)(nil), // 20: proto.PeerData + (*TransactionPool)(nil), // 21: proto.TransactionPool + (*FeeInfo)(nil), // 22: proto.FeeInfo + (*TxInfo)(nil), // 23: proto.TxInfo + (*SCRInfo)(nil), // 24: proto.SCRInfo + (*LogData)(nil), // 25: proto.LogData + (*RewardInfo)(nil), // 26: proto.RewardInfo + (*HeaderGasConsumption)(nil), // 27: proto.HeaderGasConsumption + (*ValidatorRatingInfo)(nil), // 28: proto.ValidatorRatingInfo + (*ValidatorsRating)(nil), // 29: proto.ValidatorsRating + (*RoundInfo)(nil), // 30: proto.RoundInfo + (*RoundsInfo)(nil), // 31: proto.RoundsInfo + (*PubKeys)(nil), // 32: proto.PubKeys + (*ValidatorsPubKeys)(nil), // 33: proto.ValidatorsPubKeys + (*Accounts)(nil), // 34: proto.Accounts + (*FinalizedBlock)(nil), // 35: proto.FinalizedBlock + (*Shard)(nil), // 36: proto.Shard + (*Body)(nil), // 37: proto.Body + (*MiniBlock)(nil), // 38: proto.MiniBlock + (*Transaction)(nil), // 39: proto.Transaction + (*SmartContractResult)(nil), // 40: proto.SmartContractResult + (*Log)(nil), // 41: proto.Log + (*Event)(nil), // 42: proto.Event + (*RewardTx)(nil), // 43: proto.RewardTx + (*AlteredAccount)(nil), // 44: proto.AlteredAccount + (*AccountTokenData)(nil), // 45: proto.AccountTokenData + (*TokenMetaData)(nil), // 46: proto.TokenMetaData + (*AdditionalAccountTokenData)(nil), // 47: proto.AdditionalAccountTokenData + (*AdditionalAccountData)(nil), // 48: proto.AdditionalAccountData + (*Receipt)(nil), // 49: proto.Receipt + (*BigInt)(nil), // 50: proto.BigInt + nil, // 51: proto.MetaOutportBlock.AlteredAccountsEntry + nil, // 52: proto.ShardOutportBlock.AlteredAccountsEntry + nil, // 53: proto.TransactionPool.TransactionsEntry + nil, // 54: proto.TransactionPool.SmartContractResultsEntry + nil, // 55: proto.TransactionPool.RewardsEntry + nil, // 56: proto.TransactionPool.ReceiptsEntry + nil, // 57: proto.TransactionPool.InvalidTxsEntry + nil, // 58: proto.ValidatorsPubKeys.ShardValidatorsPubKeysEntry + nil, // 59: proto.Accounts.AlteredAccountsEntry + (*duration.Duration)(nil), // 60: google.protobuf.Duration +} +var file_data_hyperOutportBlocks_hyperOutportBlock_proto_depIdxs = []int32{ + 8, // 0: proto.HyperOutportBlock.MetaOutportBlock:type_name -> proto.MetaOutportBlock 3, // 1: proto.HyperOutportBlock.NotarizedHeadersOutportData:type_name -> proto.NotarizedHeaderOutportData - 7, // 2: proto.NotarizedHeaderOutportData.OutportBlock:type_name -> proto.ShardOutportBlock - 13, // 3: proto.MetaOutportBlock.BlockData:type_name -> proto.MetaBlockData - 19, // 4: proto.MetaOutportBlock.TransactionPool:type_name -> proto.TransactionPool - 25, // 5: proto.MetaOutportBlock.HeaderGasConsumption:type_name -> proto.HeaderGasConsumption - 49, // 6: proto.MetaOutportBlock.AlteredAccounts:type_name -> proto.MetaOutportBlock.AlteredAccountsEntry - 12, // 7: proto.ShardOutportBlock.BlockData:type_name -> proto.BlockData - 19, // 8: proto.ShardOutportBlock.TransactionPool:type_name -> proto.TransactionPool - 25, // 9: proto.ShardOutportBlock.HeaderGasConsumption:type_name -> proto.HeaderGasConsumption - 50, // 10: proto.ShardOutportBlock.AlteredAccounts:type_name -> proto.ShardOutportBlock.AlteredAccountsEntry - 1, // 11: proto.Header.BlockBodyType:type_name -> proto.Type - 10, // 12: proto.Header.MiniBlockHeaders:type_name -> proto.MiniBlockHeader - 11, // 13: proto.Header.PeerChanges:type_name -> proto.PeerChange - 14, // 14: proto.MetaHeader.ShardInfo:type_name -> proto.ShardData - 18, // 15: proto.MetaHeader.PeerInfo:type_name -> proto.PeerData - 10, // 16: proto.MetaHeader.MiniBlockHeaders:type_name -> proto.MiniBlockHeader - 15, // 17: proto.MetaHeader.EpochStart:type_name -> proto.EpochStart - 1, // 18: proto.MiniBlockHeader.Type:type_name -> proto.Type - 8, // 19: proto.BlockData.Header:type_name -> proto.Header - 35, // 20: proto.BlockData.Body:type_name -> proto.Body - 36, // 21: proto.BlockData.IntraShardMiniBlocks:type_name -> proto.MiniBlock - 9, // 22: proto.MetaBlockData.Header:type_name -> proto.MetaHeader - 35, // 23: proto.MetaBlockData.Body:type_name -> proto.Body - 36, // 24: proto.MetaBlockData.IntraShardMiniBlocks:type_name -> proto.MiniBlock - 10, // 25: proto.ShardData.ShardMiniBlockHeaders:type_name -> proto.MiniBlockHeader - 16, // 26: proto.EpochStart.LastFinalizedHeaders:type_name -> proto.EpochStartShardData - 17, // 27: proto.EpochStart.Economics:type_name -> proto.Economics - 10, // 28: proto.EpochStartShardData.PendingMiniBlockHeaders:type_name -> proto.MiniBlockHeader - 0, // 29: proto.PeerData.Action:type_name -> proto.PeerAction - 51, // 30: proto.TransactionPool.Transactions:type_name -> proto.TransactionPool.TransactionsEntry - 52, // 31: proto.TransactionPool.SmartContractResults:type_name -> proto.TransactionPool.SmartContractResultsEntry - 53, // 32: proto.TransactionPool.Rewards:type_name -> proto.TransactionPool.RewardsEntry - 54, // 33: proto.TransactionPool.Receipts:type_name -> proto.TransactionPool.ReceiptsEntry - 55, // 34: proto.TransactionPool.InvalidTxs:type_name -> proto.TransactionPool.InvalidTxsEntry - 23, // 35: proto.TransactionPool.Logs:type_name -> proto.LogData - 37, // 36: proto.TxInfo.Transaction:type_name -> proto.Transaction - 20, // 37: proto.TxInfo.FeeInfo:type_name -> proto.FeeInfo - 38, // 38: proto.SCRInfo.SmartContractResult:type_name -> proto.SmartContractResult - 20, // 39: proto.SCRInfo.FeeInfo:type_name -> proto.FeeInfo - 39, // 40: proto.LogData.Log:type_name -> proto.Log - 41, // 41: proto.RewardInfo.Reward:type_name -> proto.RewardTx - 26, // 42: proto.ValidatorsRating.ValidatorsRatingInfo:type_name -> proto.ValidatorRatingInfo - 28, // 43: proto.RoundsInfo.RoundsInfo:type_name -> proto.RoundInfo - 56, // 44: proto.ValidatorsPubKeys.ShardValidatorsPubKeys:type_name -> proto.ValidatorsPubKeys.ShardValidatorsPubKeysEntry - 57, // 45: proto.Accounts.AlteredAccounts:type_name -> proto.Accounts.AlteredAccountsEntry - 36, // 46: proto.Body.MiniBlocks:type_name -> proto.MiniBlock - 1, // 47: proto.MiniBlock.Type:type_name -> proto.Type - 40, // 48: proto.Log.Events:type_name -> proto.Event - 43, // 49: proto.AlteredAccount.Tokens:type_name -> proto.AccountTokenData - 46, // 50: proto.AlteredAccount.AdditionalData:type_name -> proto.AdditionalAccountData - 44, // 51: proto.AccountTokenData.MetaData:type_name -> proto.TokenMetaData - 45, // 52: proto.AccountTokenData.AdditionalData:type_name -> proto.AdditionalAccountTokenData - 42, // 53: proto.MetaOutportBlock.AlteredAccountsEntry.value:type_name -> proto.AlteredAccount - 42, // 54: proto.ShardOutportBlock.AlteredAccountsEntry.value:type_name -> proto.AlteredAccount - 21, // 55: proto.TransactionPool.TransactionsEntry.value:type_name -> proto.TxInfo - 22, // 56: proto.TransactionPool.SmartContractResultsEntry.value:type_name -> proto.SCRInfo - 24, // 57: proto.TransactionPool.RewardsEntry.value:type_name -> proto.RewardInfo - 47, // 58: proto.TransactionPool.ReceiptsEntry.value:type_name -> proto.Receipt - 21, // 59: proto.TransactionPool.InvalidTxsEntry.value:type_name -> proto.TxInfo - 30, // 60: proto.ValidatorsPubKeys.ShardValidatorsPubKeysEntry.value:type_name -> proto.PubKeys - 42, // 61: proto.Accounts.AlteredAccountsEntry.value:type_name -> proto.AlteredAccount - 4, // 62: proto.HyperOutportBlockService.GetHyperOutportBlockByHash:input_type -> proto.BlockHashRequest - 5, // 63: proto.HyperOutportBlockService.GetHyperOutportBlockByNonce:input_type -> proto.BlockNonceRequest - 2, // 64: proto.HyperOutportBlockService.GetHyperOutportBlockByHash:output_type -> proto.HyperOutportBlock - 2, // 65: proto.HyperOutportBlockService.GetHyperOutportBlockByNonce:output_type -> proto.HyperOutportBlock - 64, // [64:66] is the sub-list for method output_type - 62, // [62:64] is the sub-list for method input_type - 62, // [62:62] is the sub-list for extension type_name - 62, // [62:62] is the sub-list for extension extendee - 0, // [0:62] is the sub-list for field type_name -} - -func init() { file_hyperOutportBlock_proto_init() } -func file_hyperOutportBlock_proto_init() { - if File_hyperOutportBlock_proto != nil { + 9, // 2: proto.NotarizedHeaderOutportData.OutportBlock:type_name -> proto.ShardOutportBlock + 60, // 3: proto.BlockHashStreamRequest.pollingInterval:type_name -> google.protobuf.Duration + 60, // 4: proto.BlockNonceStreamRequest.pollingInterval:type_name -> google.protobuf.Duration + 15, // 5: proto.MetaOutportBlock.BlockData:type_name -> proto.MetaBlockData + 21, // 6: proto.MetaOutportBlock.TransactionPool:type_name -> proto.TransactionPool + 27, // 7: proto.MetaOutportBlock.HeaderGasConsumption:type_name -> proto.HeaderGasConsumption + 51, // 8: proto.MetaOutportBlock.AlteredAccounts:type_name -> proto.MetaOutportBlock.AlteredAccountsEntry + 14, // 9: proto.ShardOutportBlock.BlockData:type_name -> proto.BlockData + 21, // 10: proto.ShardOutportBlock.TransactionPool:type_name -> proto.TransactionPool + 27, // 11: proto.ShardOutportBlock.HeaderGasConsumption:type_name -> proto.HeaderGasConsumption + 52, // 12: proto.ShardOutportBlock.AlteredAccounts:type_name -> proto.ShardOutportBlock.AlteredAccountsEntry + 1, // 13: proto.Header.BlockBodyType:type_name -> proto.Type + 12, // 14: proto.Header.MiniBlockHeaders:type_name -> proto.MiniBlockHeader + 13, // 15: proto.Header.PeerChanges:type_name -> proto.PeerChange + 16, // 16: proto.MetaHeader.ShardInfo:type_name -> proto.ShardData + 20, // 17: proto.MetaHeader.PeerInfo:type_name -> proto.PeerData + 12, // 18: proto.MetaHeader.MiniBlockHeaders:type_name -> proto.MiniBlockHeader + 17, // 19: proto.MetaHeader.EpochStart:type_name -> proto.EpochStart + 1, // 20: proto.MiniBlockHeader.Type:type_name -> proto.Type + 10, // 21: proto.BlockData.Header:type_name -> proto.Header + 37, // 22: proto.BlockData.Body:type_name -> proto.Body + 38, // 23: proto.BlockData.IntraShardMiniBlocks:type_name -> proto.MiniBlock + 11, // 24: proto.MetaBlockData.Header:type_name -> proto.MetaHeader + 37, // 25: proto.MetaBlockData.Body:type_name -> proto.Body + 38, // 26: proto.MetaBlockData.IntraShardMiniBlocks:type_name -> proto.MiniBlock + 12, // 27: proto.ShardData.ShardMiniBlockHeaders:type_name -> proto.MiniBlockHeader + 18, // 28: proto.EpochStart.LastFinalizedHeaders:type_name -> proto.EpochStartShardData + 19, // 29: proto.EpochStart.Economics:type_name -> proto.Economics + 12, // 30: proto.EpochStartShardData.PendingMiniBlockHeaders:type_name -> proto.MiniBlockHeader + 0, // 31: proto.PeerData.Action:type_name -> proto.PeerAction + 53, // 32: proto.TransactionPool.Transactions:type_name -> proto.TransactionPool.TransactionsEntry + 54, // 33: proto.TransactionPool.SmartContractResults:type_name -> proto.TransactionPool.SmartContractResultsEntry + 55, // 34: proto.TransactionPool.Rewards:type_name -> proto.TransactionPool.RewardsEntry + 56, // 35: proto.TransactionPool.Receipts:type_name -> proto.TransactionPool.ReceiptsEntry + 57, // 36: proto.TransactionPool.InvalidTxs:type_name -> proto.TransactionPool.InvalidTxsEntry + 25, // 37: proto.TransactionPool.Logs:type_name -> proto.LogData + 39, // 38: proto.TxInfo.Transaction:type_name -> proto.Transaction + 22, // 39: proto.TxInfo.FeeInfo:type_name -> proto.FeeInfo + 40, // 40: proto.SCRInfo.SmartContractResult:type_name -> proto.SmartContractResult + 22, // 41: proto.SCRInfo.FeeInfo:type_name -> proto.FeeInfo + 41, // 42: proto.LogData.Log:type_name -> proto.Log + 43, // 43: proto.RewardInfo.Reward:type_name -> proto.RewardTx + 28, // 44: proto.ValidatorsRating.ValidatorsRatingInfo:type_name -> proto.ValidatorRatingInfo + 30, // 45: proto.RoundsInfo.RoundsInfo:type_name -> proto.RoundInfo + 58, // 46: proto.ValidatorsPubKeys.ShardValidatorsPubKeys:type_name -> proto.ValidatorsPubKeys.ShardValidatorsPubKeysEntry + 59, // 47: proto.Accounts.AlteredAccounts:type_name -> proto.Accounts.AlteredAccountsEntry + 38, // 48: proto.Body.MiniBlocks:type_name -> proto.MiniBlock + 1, // 49: proto.MiniBlock.Type:type_name -> proto.Type + 42, // 50: proto.Log.Events:type_name -> proto.Event + 45, // 51: proto.AlteredAccount.Tokens:type_name -> proto.AccountTokenData + 48, // 52: proto.AlteredAccount.AdditionalData:type_name -> proto.AdditionalAccountData + 46, // 53: proto.AccountTokenData.MetaData:type_name -> proto.TokenMetaData + 47, // 54: proto.AccountTokenData.AdditionalData:type_name -> proto.AdditionalAccountTokenData + 44, // 55: proto.MetaOutportBlock.AlteredAccountsEntry.value:type_name -> proto.AlteredAccount + 44, // 56: proto.ShardOutportBlock.AlteredAccountsEntry.value:type_name -> proto.AlteredAccount + 23, // 57: proto.TransactionPool.TransactionsEntry.value:type_name -> proto.TxInfo + 24, // 58: proto.TransactionPool.SmartContractResultsEntry.value:type_name -> proto.SCRInfo + 26, // 59: proto.TransactionPool.RewardsEntry.value:type_name -> proto.RewardInfo + 49, // 60: proto.TransactionPool.ReceiptsEntry.value:type_name -> proto.Receipt + 23, // 61: proto.TransactionPool.InvalidTxsEntry.value:type_name -> proto.TxInfo + 32, // 62: proto.ValidatorsPubKeys.ShardValidatorsPubKeysEntry.value:type_name -> proto.PubKeys + 44, // 63: proto.Accounts.AlteredAccountsEntry.value:type_name -> proto.AlteredAccount + 5, // 64: proto.HyperOutportBlockService.HyperOutportBlockStreamByHash:input_type -> proto.BlockHashStreamRequest + 7, // 65: proto.HyperOutportBlockService.HyperOutportBlockStreamByNonce:input_type -> proto.BlockNonceStreamRequest + 4, // 66: proto.HyperOutportBlockService.GetHyperOutportBlockByHash:input_type -> proto.BlockHashRequest + 6, // 67: proto.HyperOutportBlockService.GetHyperOutportBlockByNonce:input_type -> proto.BlockNonceRequest + 2, // 68: proto.HyperOutportBlockService.HyperOutportBlockStreamByHash:output_type -> proto.HyperOutportBlock + 2, // 69: proto.HyperOutportBlockService.HyperOutportBlockStreamByNonce:output_type -> proto.HyperOutportBlock + 2, // 70: proto.HyperOutportBlockService.GetHyperOutportBlockByHash:output_type -> proto.HyperOutportBlock + 2, // 71: proto.HyperOutportBlockService.GetHyperOutportBlockByNonce:output_type -> proto.HyperOutportBlock + 68, // [68:72] is the sub-list for method output_type + 64, // [64:68] is the sub-list for method input_type + 64, // [64:64] is the sub-list for extension type_name + 64, // [64:64] is the sub-list for extension extendee + 0, // [0:64] is the sub-list for field type_name +} + +func init() { file_data_hyperOutportBlocks_hyperOutportBlock_proto_init() } +func file_data_hyperOutportBlocks_hyperOutportBlock_proto_init() { + if File_data_hyperOutportBlocks_hyperOutportBlock_proto != nil { return } if !protoimpl.UnsafeEnabled { - file_hyperOutportBlock_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HyperOutportBlock); i { case 0: return &v.state @@ -5155,7 +5305,7 @@ func file_hyperOutportBlock_proto_init() { return nil } } - file_hyperOutportBlock_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NotarizedHeaderOutportData); i { case 0: return &v.state @@ -5167,7 +5317,7 @@ func file_hyperOutportBlock_proto_init() { return nil } } - file_hyperOutportBlock_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*BlockHashRequest); i { case 0: return &v.state @@ -5179,7 +5329,19 @@ func file_hyperOutportBlock_proto_init() { return nil } } - file_hyperOutportBlock_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BlockHashStreamRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*BlockNonceRequest); i { case 0: return &v.state @@ -5191,7 +5353,19 @@ func file_hyperOutportBlock_proto_init() { return nil } } - file_hyperOutportBlock_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BlockNonceStreamRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MetaOutportBlock); i { case 0: return &v.state @@ -5203,7 +5377,7 @@ func file_hyperOutportBlock_proto_init() { return nil } } - file_hyperOutportBlock_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ShardOutportBlock); i { case 0: return &v.state @@ -5215,7 +5389,7 @@ func file_hyperOutportBlock_proto_init() { return nil } } - file_hyperOutportBlock_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Header); i { case 0: return &v.state @@ -5227,7 +5401,7 @@ func file_hyperOutportBlock_proto_init() { return nil } } - file_hyperOutportBlock_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MetaHeader); i { case 0: return &v.state @@ -5239,7 +5413,7 @@ func file_hyperOutportBlock_proto_init() { return nil } } - file_hyperOutportBlock_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MiniBlockHeader); i { case 0: return &v.state @@ -5251,7 +5425,7 @@ func file_hyperOutportBlock_proto_init() { return nil } } - file_hyperOutportBlock_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PeerChange); i { case 0: return &v.state @@ -5263,7 +5437,7 @@ func file_hyperOutportBlock_proto_init() { return nil } } - file_hyperOutportBlock_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*BlockData); i { case 0: return &v.state @@ -5275,7 +5449,7 @@ func file_hyperOutportBlock_proto_init() { return nil } } - file_hyperOutportBlock_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MetaBlockData); i { case 0: return &v.state @@ -5287,7 +5461,7 @@ func file_hyperOutportBlock_proto_init() { return nil } } - file_hyperOutportBlock_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ShardData); i { case 0: return &v.state @@ -5299,7 +5473,7 @@ func file_hyperOutportBlock_proto_init() { return nil } } - file_hyperOutportBlock_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*EpochStart); i { case 0: return &v.state @@ -5311,7 +5485,7 @@ func file_hyperOutportBlock_proto_init() { return nil } } - file_hyperOutportBlock_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*EpochStartShardData); i { case 0: return &v.state @@ -5323,7 +5497,7 @@ func file_hyperOutportBlock_proto_init() { return nil } } - file_hyperOutportBlock_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Economics); i { case 0: return &v.state @@ -5335,7 +5509,7 @@ func file_hyperOutportBlock_proto_init() { return nil } } - file_hyperOutportBlock_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PeerData); i { case 0: return &v.state @@ -5347,7 +5521,7 @@ func file_hyperOutportBlock_proto_init() { return nil } } - file_hyperOutportBlock_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TransactionPool); i { case 0: return &v.state @@ -5359,7 +5533,7 @@ func file_hyperOutportBlock_proto_init() { return nil } } - file_hyperOutportBlock_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*FeeInfo); i { case 0: return &v.state @@ -5371,7 +5545,7 @@ func file_hyperOutportBlock_proto_init() { return nil } } - file_hyperOutportBlock_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TxInfo); i { case 0: return &v.state @@ -5383,7 +5557,7 @@ func file_hyperOutportBlock_proto_init() { return nil } } - file_hyperOutportBlock_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SCRInfo); i { case 0: return &v.state @@ -5395,7 +5569,7 @@ func file_hyperOutportBlock_proto_init() { return nil } } - file_hyperOutportBlock_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*LogData); i { case 0: return &v.state @@ -5407,7 +5581,7 @@ func file_hyperOutportBlock_proto_init() { return nil } } - file_hyperOutportBlock_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RewardInfo); i { case 0: return &v.state @@ -5419,7 +5593,7 @@ func file_hyperOutportBlock_proto_init() { return nil } } - file_hyperOutportBlock_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { + file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HeaderGasConsumption); i { case 0: return &v.state @@ -5431,7 +5605,7 @@ func file_hyperOutportBlock_proto_init() { return nil } } - file_hyperOutportBlock_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { + file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ValidatorRatingInfo); i { case 0: return &v.state @@ -5443,7 +5617,7 @@ func file_hyperOutportBlock_proto_init() { return nil } } - file_hyperOutportBlock_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { + file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ValidatorsRating); i { case 0: return &v.state @@ -5455,7 +5629,7 @@ func file_hyperOutportBlock_proto_init() { return nil } } - file_hyperOutportBlock_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { + file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RoundInfo); i { case 0: return &v.state @@ -5467,7 +5641,7 @@ func file_hyperOutportBlock_proto_init() { return nil } } - file_hyperOutportBlock_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { + file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RoundsInfo); i { case 0: return &v.state @@ -5479,7 +5653,7 @@ func file_hyperOutportBlock_proto_init() { return nil } } - file_hyperOutportBlock_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { + file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PubKeys); i { case 0: return &v.state @@ -5491,7 +5665,7 @@ func file_hyperOutportBlock_proto_init() { return nil } } - file_hyperOutportBlock_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { + file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ValidatorsPubKeys); i { case 0: return &v.state @@ -5503,7 +5677,7 @@ func file_hyperOutportBlock_proto_init() { return nil } } - file_hyperOutportBlock_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { + file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Accounts); i { case 0: return &v.state @@ -5515,7 +5689,7 @@ func file_hyperOutportBlock_proto_init() { return nil } } - file_hyperOutportBlock_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { + file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*FinalizedBlock); i { case 0: return &v.state @@ -5527,7 +5701,7 @@ func file_hyperOutportBlock_proto_init() { return nil } } - file_hyperOutportBlock_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { + file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Shard); i { case 0: return &v.state @@ -5539,7 +5713,7 @@ func file_hyperOutportBlock_proto_init() { return nil } } - file_hyperOutportBlock_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { + file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Body); i { case 0: return &v.state @@ -5551,7 +5725,7 @@ func file_hyperOutportBlock_proto_init() { return nil } } - file_hyperOutportBlock_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { + file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MiniBlock); i { case 0: return &v.state @@ -5563,7 +5737,7 @@ func file_hyperOutportBlock_proto_init() { return nil } } - file_hyperOutportBlock_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { + file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Transaction); i { case 0: return &v.state @@ -5575,7 +5749,7 @@ func file_hyperOutportBlock_proto_init() { return nil } } - file_hyperOutportBlock_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { + file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SmartContractResult); i { case 0: return &v.state @@ -5587,7 +5761,7 @@ func file_hyperOutportBlock_proto_init() { return nil } } - file_hyperOutportBlock_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { + file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Log); i { case 0: return &v.state @@ -5599,7 +5773,7 @@ func file_hyperOutportBlock_proto_init() { return nil } } - file_hyperOutportBlock_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { + file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Event); i { case 0: return &v.state @@ -5611,7 +5785,7 @@ func file_hyperOutportBlock_proto_init() { return nil } } - file_hyperOutportBlock_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { + file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RewardTx); i { case 0: return &v.state @@ -5623,7 +5797,7 @@ func file_hyperOutportBlock_proto_init() { return nil } } - file_hyperOutportBlock_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { + file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AlteredAccount); i { case 0: return &v.state @@ -5635,7 +5809,7 @@ func file_hyperOutportBlock_proto_init() { return nil } } - file_hyperOutportBlock_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { + file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AccountTokenData); i { case 0: return &v.state @@ -5647,7 +5821,7 @@ func file_hyperOutportBlock_proto_init() { return nil } } - file_hyperOutportBlock_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { + file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TokenMetaData); i { case 0: return &v.state @@ -5659,7 +5833,7 @@ func file_hyperOutportBlock_proto_init() { return nil } } - file_hyperOutportBlock_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { + file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AdditionalAccountTokenData); i { case 0: return &v.state @@ -5671,7 +5845,7 @@ func file_hyperOutportBlock_proto_init() { return nil } } - file_hyperOutportBlock_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { + file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AdditionalAccountData); i { case 0: return &v.state @@ -5683,7 +5857,7 @@ func file_hyperOutportBlock_proto_init() { return nil } } - file_hyperOutportBlock_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { + file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Receipt); i { case 0: return &v.state @@ -5695,7 +5869,7 @@ func file_hyperOutportBlock_proto_init() { return nil } } - file_hyperOutportBlock_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { + file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*BigInt); i { case 0: return &v.state @@ -5712,19 +5886,19 @@ func file_hyperOutportBlock_proto_init() { out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_hyperOutportBlock_proto_rawDesc, + RawDescriptor: file_data_hyperOutportBlocks_hyperOutportBlock_proto_rawDesc, NumEnums: 2, - NumMessages: 56, + NumMessages: 58, NumExtensions: 0, NumServices: 1, }, - GoTypes: file_hyperOutportBlock_proto_goTypes, - DependencyIndexes: file_hyperOutportBlock_proto_depIdxs, - EnumInfos: file_hyperOutportBlock_proto_enumTypes, - MessageInfos: file_hyperOutportBlock_proto_msgTypes, + GoTypes: file_data_hyperOutportBlocks_hyperOutportBlock_proto_goTypes, + DependencyIndexes: file_data_hyperOutportBlocks_hyperOutportBlock_proto_depIdxs, + EnumInfos: file_data_hyperOutportBlocks_hyperOutportBlock_proto_enumTypes, + MessageInfos: file_data_hyperOutportBlocks_hyperOutportBlock_proto_msgTypes, }.Build() - File_hyperOutportBlock_proto = out.File - file_hyperOutportBlock_proto_rawDesc = nil - file_hyperOutportBlock_proto_goTypes = nil - file_hyperOutportBlock_proto_depIdxs = nil + File_data_hyperOutportBlocks_hyperOutportBlock_proto = out.File + file_data_hyperOutportBlocks_hyperOutportBlock_proto_rawDesc = nil + file_data_hyperOutportBlocks_hyperOutportBlock_proto_goTypes = nil + file_data_hyperOutportBlocks_hyperOutportBlock_proto_depIdxs = nil } diff --git a/data/hyperOutportBlocks/hyperOutportBlock.proto b/data/hyperOutportBlocks/hyperOutportBlock.proto index 2a425b3..4acbb88 100644 --- a/data/hyperOutportBlocks/hyperOutportBlock.proto +++ b/data/hyperOutportBlocks/hyperOutportBlock.proto @@ -2,7 +2,11 @@ syntax = "proto3"; package proto; -option go_package = "github.com/multiversx/mx-chain-ws-connector-firehose-go/data/hyperOutportBlocks"; +import "google/protobuf/duration.proto"; + +option go_package = "github.com/multiversx/mx-chain-ws-connector-template-go/api/hyperOutportBlocks"; + +// TODO: move proto definition file in a shared space. message HyperOutportBlock { MetaOutportBlock MetaOutportBlock = 1; @@ -18,11 +22,23 @@ message BlockHashRequest { string hash = 1; } +message BlockHashStreamRequest { + string hash = 1; + google.protobuf.Duration pollingInterval = 2; +} + message BlockNonceRequest { uint64 nonce = 1; } +message BlockNonceStreamRequest { + uint64 nonce = 1; + google.protobuf.Duration pollingInterval = 2; +} + service HyperOutportBlockService { + rpc HyperOutportBlockStreamByHash(BlockHashStreamRequest) returns (stream HyperOutportBlock) {} + rpc HyperOutportBlockStreamByNonce(BlockNonceStreamRequest) returns (stream HyperOutportBlock) {} rpc GetHyperOutportBlockByHash(BlockHashRequest) returns (HyperOutportBlock) {} rpc GetHyperOutportBlockByNonce(BlockNonceRequest) returns (HyperOutportBlock) {} } @@ -453,4 +469,4 @@ message Receipt { message BigInt { bytes bytes = 1; -} +} \ No newline at end of file diff --git a/data/hyperOutportBlocks/hyperOutportBlock_grpc.pb.go b/data/hyperOutportBlocks/hyperOutportBlock_grpc.pb.go index b864382..22fcbbc 100644 --- a/data/hyperOutportBlocks/hyperOutportBlock_grpc.pb.go +++ b/data/hyperOutportBlocks/hyperOutportBlock_grpc.pb.go @@ -22,6 +22,8 @@ const _ = grpc.SupportPackageIsVersion7 // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. type HyperOutportBlockServiceClient interface { + HyperOutportBlockStreamByHash(ctx context.Context, in *BlockHashStreamRequest, opts ...grpc.CallOption) (HyperOutportBlockService_HyperOutportBlockStreamByHashClient, error) + HyperOutportBlockStreamByNonce(ctx context.Context, in *BlockNonceStreamRequest, opts ...grpc.CallOption) (HyperOutportBlockService_HyperOutportBlockStreamByNonceClient, error) GetHyperOutportBlockByHash(ctx context.Context, in *BlockHashRequest, opts ...grpc.CallOption) (*HyperOutportBlock, error) GetHyperOutportBlockByNonce(ctx context.Context, in *BlockNonceRequest, opts ...grpc.CallOption) (*HyperOutportBlock, error) } @@ -34,6 +36,70 @@ func NewHyperOutportBlockServiceClient(cc grpc.ClientConnInterface) HyperOutport return &hyperOutportBlockServiceClient{cc} } +func (c *hyperOutportBlockServiceClient) HyperOutportBlockStreamByHash(ctx context.Context, in *BlockHashStreamRequest, opts ...grpc.CallOption) (HyperOutportBlockService_HyperOutportBlockStreamByHashClient, error) { + stream, err := c.cc.NewStream(ctx, &HyperOutportBlockService_ServiceDesc.Streams[0], "/proto.HyperOutportBlockService/HyperOutportBlockStreamByHash", opts...) + if err != nil { + return nil, err + } + x := &hyperOutportBlockServiceHyperOutportBlockStreamByHashClient{stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err + } + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + return x, nil +} + +type HyperOutportBlockService_HyperOutportBlockStreamByHashClient interface { + Recv() (*HyperOutportBlock, error) + grpc.ClientStream +} + +type hyperOutportBlockServiceHyperOutportBlockStreamByHashClient struct { + grpc.ClientStream +} + +func (x *hyperOutportBlockServiceHyperOutportBlockStreamByHashClient) Recv() (*HyperOutportBlock, error) { + m := new(HyperOutportBlock) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +func (c *hyperOutportBlockServiceClient) HyperOutportBlockStreamByNonce(ctx context.Context, in *BlockNonceStreamRequest, opts ...grpc.CallOption) (HyperOutportBlockService_HyperOutportBlockStreamByNonceClient, error) { + stream, err := c.cc.NewStream(ctx, &HyperOutportBlockService_ServiceDesc.Streams[1], "/proto.HyperOutportBlockService/HyperOutportBlockStreamByNonce", opts...) + if err != nil { + return nil, err + } + x := &hyperOutportBlockServiceHyperOutportBlockStreamByNonceClient{stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err + } + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + return x, nil +} + +type HyperOutportBlockService_HyperOutportBlockStreamByNonceClient interface { + Recv() (*HyperOutportBlock, error) + grpc.ClientStream +} + +type hyperOutportBlockServiceHyperOutportBlockStreamByNonceClient struct { + grpc.ClientStream +} + +func (x *hyperOutportBlockServiceHyperOutportBlockStreamByNonceClient) Recv() (*HyperOutportBlock, error) { + m := new(HyperOutportBlock) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + func (c *hyperOutportBlockServiceClient) GetHyperOutportBlockByHash(ctx context.Context, in *BlockHashRequest, opts ...grpc.CallOption) (*HyperOutportBlock, error) { out := new(HyperOutportBlock) err := c.cc.Invoke(ctx, "/proto.HyperOutportBlockService/GetHyperOutportBlockByHash", in, out, opts...) @@ -56,6 +122,8 @@ func (c *hyperOutportBlockServiceClient) GetHyperOutportBlockByNonce(ctx context // All implementations must embed UnimplementedHyperOutportBlockServiceServer // for forward compatibility type HyperOutportBlockServiceServer interface { + HyperOutportBlockStreamByHash(*BlockHashStreamRequest, HyperOutportBlockService_HyperOutportBlockStreamByHashServer) error + HyperOutportBlockStreamByNonce(*BlockNonceStreamRequest, HyperOutportBlockService_HyperOutportBlockStreamByNonceServer) error GetHyperOutportBlockByHash(context.Context, *BlockHashRequest) (*HyperOutportBlock, error) GetHyperOutportBlockByNonce(context.Context, *BlockNonceRequest) (*HyperOutportBlock, error) mustEmbedUnimplementedHyperOutportBlockServiceServer() @@ -65,6 +133,12 @@ type HyperOutportBlockServiceServer interface { type UnimplementedHyperOutportBlockServiceServer struct { } +func (UnimplementedHyperOutportBlockServiceServer) HyperOutportBlockStreamByHash(*BlockHashStreamRequest, HyperOutportBlockService_HyperOutportBlockStreamByHashServer) error { + return status.Errorf(codes.Unimplemented, "method HyperOutportBlockStreamByHash not implemented") +} +func (UnimplementedHyperOutportBlockServiceServer) HyperOutportBlockStreamByNonce(*BlockNonceStreamRequest, HyperOutportBlockService_HyperOutportBlockStreamByNonceServer) error { + return status.Errorf(codes.Unimplemented, "method HyperOutportBlockStreamByNonce not implemented") +} func (UnimplementedHyperOutportBlockServiceServer) GetHyperOutportBlockByHash(context.Context, *BlockHashRequest) (*HyperOutportBlock, error) { return nil, status.Errorf(codes.Unimplemented, "method GetHyperOutportBlockByHash not implemented") } @@ -85,6 +159,48 @@ func RegisterHyperOutportBlockServiceServer(s grpc.ServiceRegistrar, srv HyperOu s.RegisterService(&HyperOutportBlockService_ServiceDesc, srv) } +func _HyperOutportBlockService_HyperOutportBlockStreamByHash_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(BlockHashStreamRequest) + if err := stream.RecvMsg(m); err != nil { + return err + } + return srv.(HyperOutportBlockServiceServer).HyperOutportBlockStreamByHash(m, &hyperOutportBlockServiceHyperOutportBlockStreamByHashServer{stream}) +} + +type HyperOutportBlockService_HyperOutportBlockStreamByHashServer interface { + Send(*HyperOutportBlock) error + grpc.ServerStream +} + +type hyperOutportBlockServiceHyperOutportBlockStreamByHashServer struct { + grpc.ServerStream +} + +func (x *hyperOutportBlockServiceHyperOutportBlockStreamByHashServer) Send(m *HyperOutportBlock) error { + return x.ServerStream.SendMsg(m) +} + +func _HyperOutportBlockService_HyperOutportBlockStreamByNonce_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(BlockNonceStreamRequest) + if err := stream.RecvMsg(m); err != nil { + return err + } + return srv.(HyperOutportBlockServiceServer).HyperOutportBlockStreamByNonce(m, &hyperOutportBlockServiceHyperOutportBlockStreamByNonceServer{stream}) +} + +type HyperOutportBlockService_HyperOutportBlockStreamByNonceServer interface { + Send(*HyperOutportBlock) error + grpc.ServerStream +} + +type hyperOutportBlockServiceHyperOutportBlockStreamByNonceServer struct { + grpc.ServerStream +} + +func (x *hyperOutportBlockServiceHyperOutportBlockStreamByNonceServer) Send(m *HyperOutportBlock) error { + return x.ServerStream.SendMsg(m) +} + func _HyperOutportBlockService_GetHyperOutportBlockByHash_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(BlockHashRequest) if err := dec(in); err != nil { @@ -137,6 +253,17 @@ var HyperOutportBlockService_ServiceDesc = grpc.ServiceDesc{ Handler: _HyperOutportBlockService_GetHyperOutportBlockByNonce_Handler, }, }, - Streams: []grpc.StreamDesc{}, + Streams: []grpc.StreamDesc{ + { + StreamName: "HyperOutportBlockStreamByHash", + Handler: _HyperOutportBlockService_HyperOutportBlockStreamByHash_Handler, + ServerStreams: true, + }, + { + StreamName: "HyperOutportBlockStreamByNonce", + Handler: _HyperOutportBlockService_HyperOutportBlockStreamByNonce_Handler, + ServerStreams: true, + }, + }, Metadata: "data/hyperOutportBlocks/hyperOutportBlock.proto", } diff --git a/data/hyperOutportBlocks/metaOutportBlock.go b/data/hyperOutportBlocks/metaOutportBlock.go new file mode 100644 index 0000000..e887c5b --- /dev/null +++ b/data/hyperOutportBlocks/metaOutportBlock.go @@ -0,0 +1,15 @@ +package hyperOutportBlocks + +import "fmt" + +// GetHeaderNonce will return header nonce +func (x *MetaOutportBlock) GetHeaderNonce() (uint64, error) { + if x.BlockData == nil { + return 0, fmt.Errorf("meta outport block: nil block data") + } + if x.BlockData.Header == nil { + return 0, fmt.Errorf("meta outport block: nil header") + } + + return x.BlockData.Header.Nonce, nil +} diff --git a/data/hyperOutportBlocks/shardOutportBlock.go b/data/hyperOutportBlocks/shardOutportBlock.go new file mode 100644 index 0000000..9b64787 --- /dev/null +++ b/data/hyperOutportBlocks/shardOutportBlock.go @@ -0,0 +1,15 @@ +package hyperOutportBlocks + +import "fmt" + +// GetHeaderNonce will return header nonce +func (x *ShardOutportBlock) GetHeaderNonce() (uint64, error) { + if x.BlockData == nil { + return 0, fmt.Errorf("shard outport block: nil block data") + } + if x.BlockData.Header == nil { + return 0, fmt.Errorf("shard outport block: nil header") + } + + return x.BlockData.Header.Nonce, nil +} diff --git a/examples/clients/streamByHash/streamByHash.go b/examples/clients/streamByHash/streamByHash.go new file mode 100644 index 0000000..11079bf --- /dev/null +++ b/examples/clients/streamByHash/streamByHash.go @@ -0,0 +1,61 @@ +package main + +import ( + "context" + "fmt" + "os" + "os/signal" + "syscall" + "time" + + "google.golang.org/grpc" + "google.golang.org/protobuf/types/known/durationpb" + + data "github.com/multiversx/mx-chain-ws-connector-firehose-go/data/hyperOutportBlocks" +) + +func main() { + opts := []grpc.DialOption{ + grpc.WithInsecure(), + grpc.WithBlock(), + grpc.WithDefaultCallOptions(grpc.MaxCallRecvMsgSize(16045218)), + } + + // set up the client connection. Must have the connector running on the specified port. + cc, err := grpc.Dial(":8000", opts...) + if err != nil { + panic(err) + } + defer cc.Close() + + // create the client + client := data.NewHyperOutportBlockServiceClient(cc) + + // initiate streaming. + stream, err := client.HyperOutportBlockStreamByHash(context.Background(), &data.BlockHashStreamRequest{ + Hash: "97227073a4f6702eefe6d4925a49bc6786947d084fb60250b39edabcba9ef6de", + PollingInterval: durationpb.New(time.Second), + }) + if err != nil { + panic(err) + } + + // listen on the interrupt and terminate signals. + interrupt := make(chan os.Signal, 1) + signal.Notify(interrupt, syscall.SIGINT, syscall.SIGTERM) + + // try receiving blocks on the provided stream. + go func() { + for { + recv, err := stream.Recv() + if err != nil { + panic(err) + } + + fmt.Println(recv.MetaOutportBlock.BlockData.Header.Nonce) + } + }() + + <-interrupt + stream.CloseSend() +} diff --git a/examples/clients/streamByNonce/streamByNonce.go b/examples/clients/streamByNonce/streamByNonce.go new file mode 100644 index 0000000..9325d7a --- /dev/null +++ b/examples/clients/streamByNonce/streamByNonce.go @@ -0,0 +1,61 @@ +package main + +import ( + "context" + "fmt" + "os" + "os/signal" + "syscall" + "time" + + "google.golang.org/grpc" + "google.golang.org/protobuf/types/known/durationpb" + + data "github.com/multiversx/mx-chain-ws-connector-firehose-go/data/hyperOutportBlocks" +) + +func main() { + opts := []grpc.DialOption{ + grpc.WithInsecure(), + grpc.WithBlock(), + grpc.WithDefaultCallOptions(grpc.MaxCallRecvMsgSize(16045218)), + } + + // set up the client connection. Must have the connector running on the specified port. + cc, err := grpc.Dial(":8000", opts...) + if err != nil { + panic(err) + } + defer cc.Close() + + // create the client + client := data.NewHyperOutportBlockServiceClient(cc) + + // initiate streaming. + stream, err := client.HyperOutportBlockStreamByNonce(context.Background(), &data.BlockNonceStreamRequest{ + Nonce: 0, + PollingInterval: durationpb.New(time.Second), + }) + if err != nil { + panic(err) + } + + // listen on the interrupt and terminate signals. + interrupt := make(chan os.Signal, 1) + signal.Notify(interrupt, syscall.SIGINT, syscall.SIGTERM) + + // try receiving blocks on the provided stream. + go func() { + for { + recv, err := stream.Recv() + if err != nil { + panic(err) + } + + fmt.Println(recv.MetaOutportBlock.BlockData.Header.Nonce) + } + }() + + <-interrupt + stream.CloseSend() +} diff --git a/factory/grpcServerFactory.go b/factory/grpcServerFactory.go deleted file mode 100644 index 752125f..0000000 --- a/factory/grpcServerFactory.go +++ /dev/null @@ -1,33 +0,0 @@ -package factory - -import ( - "fmt" - - "github.com/multiversx/mx-chain-ws-connector-firehose-go/config" - "github.com/multiversx/mx-chain-ws-connector-firehose-go/process" - "github.com/multiversx/mx-chain-ws-connector-firehose-go/server" -) - -// CreateGRPCServer will create the gRPC server along with the required handlers. -func CreateGRPCServer( - enableGrpcServer bool, - cfg config.GRPCConfig, - outportBlocksPool process.HyperBlocksPool, - dataAggregator process.DataAggregator) (process.GRPCServer, error) { - if !enableGrpcServer { - return nil, nil - } - - handler, err := process.NewGRPCBlocksHandler(outportBlocksPool, dataAggregator) - if err != nil { - return nil, fmt.Errorf("failed to create grpc blocks handler: %w", err) - } - s, err := server.New(cfg, handler) - if err != nil { - return nil, fmt.Errorf("failed to create grpc server: %w", err) - } - s.Start() - - return s, nil - -} diff --git a/factory/publisherFactory.go b/factory/publisherFactory.go index 2f333ce..a21b5a3 100644 --- a/factory/publisherFactory.go +++ b/factory/publisherFactory.go @@ -4,14 +4,32 @@ import ( "fmt" "os" + "github.com/multiversx/mx-chain-ws-connector-firehose-go/config" "github.com/multiversx/mx-chain-ws-connector-firehose-go/process" + "github.com/multiversx/mx-chain-ws-connector-firehose-go/server" ) // CreatePublisher will return the required Publisher implementation based on whether the hyperOutportBlock are // served via gRPC or stdout. -func CreatePublisher(enableGRPCServer bool, blockContainer process.BlockContainerHandler) (process.HyperBlockPublisher, error) { +func CreatePublisher( + cfg *config.Config, + enableGRPCServer bool, + blockContainer process.BlockContainerHandler, + outportBlocksPool process.BlocksPool, + dataAggregator process.DataAggregator, +) (process.HyperBlockPublisher, error) { if enableGRPCServer { - return process.NewGRPCBlockPublisher(), nil + handler, err := process.NewGRPCBlocksHandler(outportBlocksPool, dataAggregator) + if err != nil { + return nil, fmt.Errorf("failed to create grpc blocks handler: %w", err) + } + + s, err := server.New(cfg.GRPC, handler) + if err != nil { + return nil, fmt.Errorf("failed to create grpc server: %w", err) + } + + return process.NewGRPCBlockPublisher(s) } publisher, err := process.NewFirehosePublisher( diff --git a/integrationTests/blocksPool_test.go b/integrationTests/blocksPool_test.go index d554f3f..cd6b66f 100644 --- a/integrationTests/blocksPool_test.go +++ b/integrationTests/blocksPool_test.go @@ -20,10 +20,27 @@ func getDefaultConfig() config.Config { cfg := config.Config{ DataPool: config.DataPoolConfig{ - MaxDelta: maxDelta, - PruningWindow: pruningWindow, - NumPersistersToKeep: 2, - FirstCommitableBlock: 0, + MaxDelta: maxDelta, + PruningWindow: pruningWindow, + NumPersistersToKeep: 2, + FirstCommitableBlocks: []config.FirstCommitableBlock{ + { + ShardID: "metachain", + Nonce: 0, + }, + { + ShardID: "0", + Nonce: 0, + }, + { + ShardID: "1", + Nonce: 0, + }, + { + ShardID: "2", + Nonce: 0, + }, + }, }, OutportBlocksStorage: config.StorageConfig{ Cache: config.CacheConfig{ @@ -59,7 +76,17 @@ func TestBlocksPool_FullPersisterMode(t *testing.T) { }() require.Nil(t, err) - blocksPool, err := process.NewBlocksPool(blocksStorer, marshaller, cfg.DataPool.MaxDelta, cfg.DataPool.PruningWindow, cfg.DataPool.FirstCommitableBlock) + firstCommitableBlocks, err := common.ConvertFirstCommitableBlocks(cfg.DataPool.FirstCommitableBlocks) + require.Nil(t, err) + + argsBlocksPool := process.DataPoolArgs{ + Storer: blocksStorer, + Marshaller: marshaller, + MaxDelta: cfg.DataPool.MaxDelta, + CleanupInterval: cfg.DataPool.PruningWindow, + FirstCommitableBlocks: firstCommitableBlocks, + } + blocksPool, err := process.NewDataPool(argsBlocksPool) require.Nil(t, err) shardID := uint32(2) @@ -68,12 +95,22 @@ func TestBlocksPool_FullPersisterMode(t *testing.T) { // should fail after maxDelta attempts for i := uint64(0); i < maxDelta; i++ { + hash := []byte("hash_" + fmt.Sprintf("%d", i)) err = blocksPool.PutBlock(hash, []byte("data1"), i, shardID) require.Nil(t, err) } + checkpoint := &data.BlockCheckpoint{ + LastNonces: map[uint32]uint64{ + core.MetachainShardId: 1, + shardID: 1, + }, + } + err = blocksPool.UpdateMetaState(checkpoint) + require.Nil(t, err) + oldHash := []byte("hash_" + fmt.Sprintf("%d", maxDelta-1)) hash := []byte("hash_" + fmt.Sprintf("%d", maxDelta)) @@ -89,26 +126,10 @@ func TestBlocksPool_FullPersisterMode(t *testing.T) { err = blocksPool.PutBlock(hash, []byte("data1"), maxDelta+1, shardID) require.True(t, errors.Is(err, process.ErrFailedToPutBlockDataToPool)) - if pruningWindow <= maxDelta { - require.Fail(t, "prunning window should be bigger than delta") - } + require.True(t, pruningWindow > maxDelta, "prunning window should be bigger than delta") for i := maxDelta + 1; i < pruningWindow; i++ { - checkpoint := &data.BlockCheckpoint{ - LastRounds: map[uint32]uint64{ - core.MetachainShardId: i, - }, - } - err = blocksPool.UpdateMetaState(checkpoint) - require.Nil(t, err) - - hash := []byte("hash_" + fmt.Sprintf("%d", i)) - - err = blocksPool.PutBlock(hash, []byte("data1"), i, core.MetachainShardId) - require.Nil(t, err) - - err = blocksPool.PutBlock(hash, []byte("data1"), i, shardID) - require.Nil(t, err) + setBlocksPoolData(t, blocksPool, i, shardID) } // should still find in storer @@ -117,21 +138,7 @@ func TestBlocksPool_FullPersisterMode(t *testing.T) { require.NotNil(t, retData) for i := pruningWindow; i < pruningWindow*2; i++ { - checkpoint := &data.BlockCheckpoint{ - LastRounds: map[uint32]uint64{ - core.MetachainShardId: i, - }, - } - err = blocksPool.UpdateMetaState(checkpoint) - require.Nil(t, err) - - hash := []byte("hash_" + fmt.Sprintf("%d", i)) - - err = blocksPool.PutBlock(hash, []byte("data1"), i, core.MetachainShardId) - require.Nil(t, err) - - err = blocksPool.PutBlock(hash, []byte("data1"), i, shardID) - require.Nil(t, err) + setBlocksPoolData(t, blocksPool, i, shardID) } // should still find in storer @@ -140,25 +147,11 @@ func TestBlocksPool_FullPersisterMode(t *testing.T) { require.NotNil(t, retData) for i := pruningWindow * 2; i < pruningWindow*3; i++ { - checkpoint := &data.BlockCheckpoint{ - LastRounds: map[uint32]uint64{ - core.MetachainShardId: i, - }, - } - err = blocksPool.UpdateMetaState(checkpoint) - require.Nil(t, err) - - hash := []byte("hash_" + fmt.Sprintf("%d", i)) - - err = blocksPool.PutBlock(hash, []byte("data1"), i, core.MetachainShardId) - require.Nil(t, err) - - err = blocksPool.PutBlock(hash, []byte("data1"), i, shardID) - require.Nil(t, err) + setBlocksPoolData(t, blocksPool, i, shardID) } - checkpoint := &data.BlockCheckpoint{ - LastRounds: map[uint32]uint64{ + checkpoint = &data.BlockCheckpoint{ + LastNonces: map[uint32]uint64{ core.MetachainShardId: pruningWindow * 3, }, } @@ -171,6 +164,25 @@ func TestBlocksPool_FullPersisterMode(t *testing.T) { require.Error(t, err) } +func setBlocksPoolData(t *testing.T, blocksPool process.DataPool, i uint64, shardID uint32) { + checkpoint := &data.BlockCheckpoint{ + LastNonces: map[uint32]uint64{ + core.MetachainShardId: i, + shardID: i, + }, + } + err := blocksPool.UpdateMetaState(checkpoint) + require.Nil(t, err) + + hash := []byte("hash_" + fmt.Sprintf("%d", i)) + + err = blocksPool.PutBlock(hash, []byte("data1"), i, core.MetachainShardId) + require.Nil(t, err) + + err = blocksPool.PutBlock(hash, []byte("data1"), i, shardID) + require.Nil(t, err) +} + func TestBlocksPool_OptimizedPersisterMode(t *testing.T) { dbMode := common.OptimizedPersisterDBMode @@ -187,7 +199,17 @@ func TestBlocksPool_OptimizedPersisterMode(t *testing.T) { }() require.Nil(t, err) - blocksPool, err := process.NewBlocksPool(blocksStorer, marshaller, cfg.DataPool.MaxDelta, cfg.DataPool.PruningWindow, cfg.DataPool.FirstCommitableBlock) + firstCommitableBlocks, err := common.ConvertFirstCommitableBlocks(cfg.DataPool.FirstCommitableBlocks) + require.Nil(t, err) + + argsDataPool := process.DataPoolArgs{ + Storer: blocksStorer, + Marshaller: marshaller, + MaxDelta: cfg.DataPool.MaxDelta, + CleanupInterval: cfg.DataPool.PruningWindow, + FirstCommitableBlocks: firstCommitableBlocks, + } + blocksPool, err := process.NewDataPool(argsDataPool) require.Nil(t, err) shardID := uint32(2) @@ -202,6 +224,15 @@ func TestBlocksPool_OptimizedPersisterMode(t *testing.T) { require.Nil(t, err) } + checkpoint := &data.BlockCheckpoint{ + LastNonces: map[uint32]uint64{ + core.MetachainShardId: 1, + shardID: 1, + }, + } + err = blocksPool.UpdateMetaState(checkpoint) + require.Nil(t, err) + hash := []byte("hash_" + fmt.Sprintf("%d", maxDelta)) err = blocksPool.PutBlock(hash, []byte("data1"), maxDelta, shardID) @@ -216,49 +247,16 @@ func TestBlocksPool_OptimizedPersisterMode(t *testing.T) { err = blocksPool.PutBlock(hash, []byte("data1"), maxDelta+1, shardID) require.True(t, errors.Is(err, process.ErrFailedToPutBlockDataToPool)) - if pruningWindow <= maxDelta { - require.Fail(t, "prunning window should be bigger than delta") - } - - for i := maxDelta + 1; i < pruningWindow; i++ { - checkpoint := &data.BlockCheckpoint{ - LastRounds: map[uint32]uint64{ - core.MetachainShardId: i, - }, - } - err = blocksPool.UpdateMetaState(checkpoint) - require.Nil(t, err) - - hash := []byte("hash_" + fmt.Sprintf("%d", i)) - - err = blocksPool.PutBlock(hash, []byte("data1"), i, core.MetachainShardId) - require.Nil(t, err) + require.True(t, pruningWindow > maxDelta, "prunning window should be bigger than delta") - err = blocksPool.PutBlock(hash, []byte("data1"), i, shardID) - require.Nil(t, err) + for i := maxDelta + 1; i < pruningWindow*2; i++ { + setBlocksPoolData(t, blocksPool, i, shardID) } - for i := pruningWindow; i < pruningWindow*2; i++ { - checkpoint := &data.BlockCheckpoint{ - LastRounds: map[uint32]uint64{ - core.MetachainShardId: i, - }, - } - err = blocksPool.UpdateMetaState(checkpoint) - require.Nil(t, err) - - hash := []byte("hash_" + fmt.Sprintf("%d", i)) - - err = blocksPool.PutBlock(hash, []byte("data1"), i, core.MetachainShardId) - require.Nil(t, err) - - err = blocksPool.PutBlock(hash, []byte("data1"), i, shardID) - require.Nil(t, err) - } - - checkpoint := &data.BlockCheckpoint{ - LastRounds: map[uint32]uint64{ + checkpoint = &data.BlockCheckpoint{ + LastNonces: map[uint32]uint64{ core.MetachainShardId: pruningWindow * 2, + shardID: pruningWindow + 2, }, } err = blocksPool.UpdateMetaState(checkpoint) diff --git a/process/blocksPool.go b/process/blocksPool.go index 2c862a1..cdac73b 100644 --- a/process/blocksPool.go +++ b/process/blocksPool.go @@ -2,194 +2,116 @@ package process import ( "fmt" - "math" - "sync" - "github.com/multiversx/mx-chain-core-go/core" "github.com/multiversx/mx-chain-core-go/core/check" "github.com/multiversx/mx-chain-core-go/marshal" "github.com/multiversx/mx-chain-ws-connector-firehose-go/data" + "github.com/multiversx/mx-chain-ws-connector-firehose-go/data/hyperOutportBlocks" ) -const initIndex = 0 -const metaCheckpointKey = "lastMetaRound" - type blocksPool struct { - storer PruningStorer - marshaller marshal.Marshalizer - maxDelta uint64 - cleanupInterval uint64 - firstCommitableBlock uint64 - - previousIndexesMap map[uint32]uint64 - mutMap sync.RWMutex + marshaller marshal.Marshalizer + dataPool DataPool } -// NewBlocksPool will create a new blocks pool instance +// NewBlocksPool will create a new instance of hyper outport blocks pool func NewBlocksPool( - storer PruningStorer, + dataPool DataPool, marshaller marshal.Marshalizer, - maxDelta uint64, - cleanupInterval uint64, - firstCommitableBlock uint64, ) (*blocksPool, error) { - if check.IfNil(storer) { - return nil, ErrNilPruningStorer + if check.IfNil(dataPool) { + return nil, ErrNilDataPool } if check.IfNil(marshaller) { return nil, ErrNilMarshaller } - bp := &blocksPool{ - storer: storer, - marshaller: marshaller, - maxDelta: maxDelta, - cleanupInterval: cleanupInterval, - firstCommitableBlock: firstCommitableBlock, - } - - bp.initIndexesMap() - - return bp, nil + return &blocksPool{ + dataPool: dataPool, + marshaller: marshaller, + }, nil } -func (bp *blocksPool) initIndexesMap() { - lastCheckpoint, err := bp.getLastCheckpoint() - if err != nil || lastCheckpoint == nil || lastCheckpoint.LastRounds == nil { - indexesMap := make(map[uint32]uint64) - bp.previousIndexesMap = indexesMap - return - } - - log.Info("initIndexesMap", "lastCheckpoint", lastCheckpoint) - - indexesMap := make(map[uint32]uint64) - for shardID, round := range lastCheckpoint.LastRounds { - indexesMap[shardID] = round - } - bp.previousIndexesMap = indexesMap +// UpdateMetaState will triger meta state update from base data pool +func (bp *blocksPool) UpdateMetaState(checkpoint *data.BlockCheckpoint) error { + return bp.dataPool.UpdateMetaState(checkpoint) } -// Put will put value into storer -func (bp *blocksPool) Put(key []byte, value []byte) error { - return bp.storer.Put(key, value) +// GetLastCheckpoint returns last checkpoint data +func (bp *blocksPool) GetLastCheckpoint() (*data.BlockCheckpoint, error) { + return bp.dataPool.GetLastCheckpoint() } -// Get will get value from storer +// Get will trigger data pool get operation func (bp *blocksPool) Get(key []byte) ([]byte, error) { - return bp.storer.Get(key) -} - -// UpdateMetaState will update internal meta state -func (bp *blocksPool) UpdateMetaState(checkpoint *data.BlockCheckpoint) error { - index, ok := checkpoint.LastRounds[core.MetachainShardId] - if !ok { - index = initIndex - } - - if index >= bp.firstCommitableBlock { - err := bp.setCheckpoint(checkpoint) - if err != nil { - return fmt.Errorf("%w, failed to set checkpoint", err) - } - } - - err := bp.pruneStorer(index) + data, err := bp.dataPool.Get(key) if err != nil { - return fmt.Errorf("%w, failed to prune storer", err) - } - - return nil -} - -func (bp *blocksPool) pruneStorer(index uint64) error { - if index%bp.cleanupInterval != 0 { - return nil + return nil, fmt.Errorf("failed to get from data pool: %w", err) } - return bp.storer.Prune(index) + return data, nil } // PutBlock will put the provided outport block data to the pool -func (bp *blocksPool) PutBlock(hash []byte, value []byte, newIndex uint64, shardID uint32) error { - bp.mutMap.Lock() - defer bp.mutMap.Unlock() - - previousIndex, ok := bp.previousIndexesMap[shardID] - if !ok { - bp.previousIndexesMap[shardID] = initIndex - previousIndex = initIndex - } - - if previousIndex == initIndex { - err := bp.storer.Put(hash, value) - if err != nil { - return err - } - - bp.previousIndexesMap[shardID] = newIndex - - return nil +func (bp *blocksPool) PutBlock(hash []byte, outportBlock OutportBlockHandler) error { + shardID := outportBlock.GetShardID() + currentIndex, err := outportBlock.GetHeaderNonce() + if err != nil { + return err } - if !bp.shouldPutBlockData(previousIndex) { - return fmt.Errorf("%w: not within required delta, previous index %d, new index %d", - ErrFailedToPutBlockDataToPool, previousIndex, newIndex) + previousIndex := outportBlock.GetHighestFinalBlockNonce() + isHigherIndex := currentIndex >= previousIndex + if !isHigherIndex { + return fmt.Errorf("%w: new meta index should be higher than previous, previous index %d, new index %d", + ErrFailedToPutBlockDataToPool, previousIndex, currentIndex) } - err := bp.storer.Put(hash, value) + // TODO: marshall data only when/if saving to storage + // we do not necessarily need to marshall outport block if it is saved only to cache + outportBlockBytes, err := bp.marshaller.Marshal(outportBlock) if err != nil { - return fmt.Errorf("failed to put into storer: %w", err) + return err } - bp.previousIndexesMap[shardID] = newIndex - - return nil + return bp.dataPool.PutBlock(hash, outportBlockBytes, currentIndex, shardID) } -func (bp *blocksPool) shouldPutBlockData(index uint64) bool { - baseIndex := bp.previousIndexesMap[core.MetachainShardId] - - diff := float64(int64(index) - int64(baseIndex)) - delta := math.Abs(diff) - - return math.Abs(delta) < float64(bp.maxDelta) -} - -func (bp *blocksPool) setCheckpoint(checkpoint *data.BlockCheckpoint) error { - checkpointBytes, err := bp.marshaller.Marshal(checkpoint) +// GetMetaBlock will return the meta outport block data from the pool +func (bp *blocksPool) GetMetaBlock(hash []byte) (*hyperOutportBlocks.MetaOutportBlock, error) { + marshalledData, err := bp.dataPool.Get(hash) if err != nil { - return fmt.Errorf("failed to marshall checkpoint data: %w", err) + return nil, fmt.Errorf("failed to get meta block from pool: %w", err) } - log.Debug("setCheckpoint", "checkpoint", checkpoint) + metaOutportBlock := &hyperOutportBlocks.MetaOutportBlock{} + err = bp.marshaller.Unmarshal(metaOutportBlock, marshalledData) + if err != nil { + return nil, err + } - return bp.storer.Put([]byte(metaCheckpointKey), checkpointBytes) + return metaOutportBlock, nil } -func (bp *blocksPool) getLastCheckpoint() (*data.BlockCheckpoint, error) { - checkpointBytes, err := bp.storer.Get([]byte(metaCheckpointKey)) +// GetShardBlock will return the shard outport block data from the pool +func (bp *blocksPool) GetShardBlock(hash []byte) (*hyperOutportBlocks.ShardOutportBlock, error) { + marshalledData, err := bp.dataPool.Get(hash) if err != nil { - return nil, fmt.Errorf("failed to get checkpoint data from storer: %w", err) + return nil, fmt.Errorf("failed to get shard block from pool: %w", err) } - checkpoint := &data.BlockCheckpoint{} - err = bp.marshaller.Unmarshal(checkpoint, checkpointBytes) + shardOutportBlock := &hyperOutportBlocks.ShardOutportBlock{} + err = bp.marshaller.Unmarshal(shardOutportBlock, marshalledData) if err != nil { - return nil, fmt.Errorf("failed to unmarshall checkpoint data: %w", err) + return nil, err } - return checkpoint, nil + return shardOutportBlock, nil } -// Close will trigger close on blocks pool component +// Close will trigger close on data pool component func (bp *blocksPool) Close() error { - err := bp.storer.Close() - if err != nil { - return err - } - - return nil + return bp.dataPool.Close() } // IsInterfaceNil returns nil if there is no value under the interface diff --git a/process/blocksPool_test.go b/process/blocksPool_test.go index 7b23597..1c7b4ba 100644 --- a/process/blocksPool_test.go +++ b/process/blocksPool_test.go @@ -2,425 +2,192 @@ package process_test import ( "errors" - "fmt" "testing" - "github.com/multiversx/mx-chain-core-go/core" - "github.com/multiversx/mx-chain-core-go/data/outport" - "github.com/multiversx/mx-chain-ws-connector-firehose-go/data" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - + "github.com/multiversx/mx-chain-ws-connector-firehose-go/data/hyperOutportBlocks" "github.com/multiversx/mx-chain-ws-connector-firehose-go/process" "github.com/multiversx/mx-chain-ws-connector-firehose-go/testscommon" + "github.com/stretchr/testify/require" ) -func TestNewBlocksPool(t *testing.T) { +func TestBlocksPool(t *testing.T) { t.Parallel() - t.Run("nil pruning storer", func(t *testing.T) { + t.Run("nil data pool", func(t *testing.T) { t.Parallel() - bp, err := process.NewBlocksPool( + hbp, err := process.NewBlocksPool( nil, &testscommon.MarshallerMock{}, - 10, - 100, - 0, ) - require.Nil(t, bp) - require.Equal(t, process.ErrNilPruningStorer, err) + require.Nil(t, hbp) + require.Equal(t, process.ErrNilDataPool, err) }) t.Run("nil marshaller", func(t *testing.T) { t.Parallel() - bp, err := process.NewBlocksPool( - &testscommon.PruningStorerStub{}, + hbp, err := process.NewBlocksPool( + &testscommon.BlocksPoolMock{}, nil, - 10, - 100, - 0, ) - require.Nil(t, bp) + require.Nil(t, hbp) require.Equal(t, process.ErrNilMarshaller, err) }) t.Run("should work", func(t *testing.T) { t.Parallel() - bp, err := process.NewBlocksPool( - &testscommon.PruningStorerStub{}, + hbp, err := process.NewBlocksPool( + &testscommon.BlocksPoolMock{}, &testscommon.MarshallerMock{}, - 10, - 100, - 0, ) require.Nil(t, err) - require.False(t, bp.IsInterfaceNil()) + require.False(t, hbp.IsInterfaceNil()) }) } -func TestBlocksPool_GetBlock(t *testing.T) { +func TestBlocksPool_PutBlock(t *testing.T) { t.Parallel() - t.Run("failed to get data from storer", func(t *testing.T) { - t.Parallel() - - expectedErr := errors.New("expected error") - bp, _ := process.NewBlocksPool( - &testscommon.PruningStorerStub{ - GetCalled: func(key []byte) ([]byte, error) { - return nil, expectedErr - }, - }, - protoMarshaller, - 10, - 100, - 0, - ) - - ret, err := bp.Get([]byte("hash1")) - require.Nil(t, ret) - require.Equal(t, expectedErr, err) - }) - - t.Run("should work", func(t *testing.T) { + t.Run("should fail if no succesive index", func(t *testing.T) { t.Parallel() - outportBlock := &outport.OutportBlock{ - ShardID: 1, - NotarizedHeadersHashes: []string{"hash1", "hash2"}, - NumberOfShards: 3, - } - outportBlockBytes, _ := gogoProtoMarshaller.Marshal(outportBlock) - - bp, _ := process.NewBlocksPool( - &testscommon.PruningStorerStub{ - GetCalled: func(key []byte) ([]byte, error) { - return outportBlockBytes, nil - }, - }, - gogoProtoMarshaller, - 10, - 100, - 0, + hbp, err := process.NewBlocksPool( + &testscommon.BlocksPoolMock{}, + &testscommon.MarshallerMock{}, ) - - ret, err := bp.Get([]byte("hash1")) require.Nil(t, err) - require.Equal(t, outportBlockBytes, ret) - }) -} - -func TestBlocksPool_UpdateMetaState(t *testing.T) { - t.Parallel() - - cleanupInterval := uint64(100) - t.Run("should not set checkpoint if index is not commitable", func(t *testing.T) { - t.Parallel() - - firstCommitableBlock := uint64(10) - - bp, _ := process.NewBlocksPool( - &testscommon.PruningStorerStub{ - PutCalled: func(key, data []byte) error { - assert.Fail(t, "should have not been called") - - return nil - }, - PruneCalled: func(index uint64) error { - assert.Fail(t, "should have not been called") + currentIndex := uint64(10) - return nil + outportBlock := &hyperOutportBlocks.MetaOutportBlock{ + ShardID: 1, + BlockData: &hyperOutportBlocks.MetaBlockData{ + Header: &hyperOutportBlocks.MetaHeader{ + Round: currentIndex, }, }, - protoMarshaller, - 100, - cleanupInterval, - firstCommitableBlock, - ) - - checkpoint := &data.BlockCheckpoint{ - LastRounds: map[uint32]uint64{ - core.MetachainShardId: firstCommitableBlock - 1, - }, + HighestFinalBlockNonce: currentIndex + 1, } - err := bp.UpdateMetaState(checkpoint) - require.Nil(t, err) + err = hbp.PutBlock([]byte("hash1"), outportBlock) + require.True(t, errors.Is(err, process.ErrFailedToPutBlockDataToPool)) }) - t.Run("should set checkpoint if index if commitable", func(t *testing.T) { + t.Run("should work for meta block", func(t *testing.T) { t.Parallel() - firstCommitableBlock := uint64(10) - - putCalled := false - bp, _ := process.NewBlocksPool( - &testscommon.PruningStorerStub{ - PutCalled: func(key, data []byte) error { - putCalled = true + hbp, err := process.NewBlocksPool( + &testscommon.BlocksPoolMock{}, + &testscommon.MarshallerMock{}, + ) + require.Nil(t, err) - return nil - }, - PruneCalled: func(index uint64) error { - assert.Fail(t, "should have not been called") + currentIndex := uint64(10) - return nil + outportBlock := &hyperOutportBlocks.MetaOutportBlock{ + ShardID: 1, + BlockData: &hyperOutportBlocks.MetaBlockData{ + Header: &hyperOutportBlocks.MetaHeader{ + Nonce: currentIndex, }, }, - protoMarshaller, - 100, - cleanupInterval, - firstCommitableBlock, - ) - - checkpoint := &data.BlockCheckpoint{ - LastRounds: map[uint32]uint64{ - core.MetachainShardId: firstCommitableBlock, - }, + HighestFinalBlockNonce: currentIndex - 1, } - err := bp.UpdateMetaState(checkpoint) + err = hbp.PutBlock([]byte("hash1"), outportBlock) require.Nil(t, err) - - require.True(t, putCalled) }) - t.Run("should not trigger prune if not cleanup interval", func(t *testing.T) { + t.Run("should work for shard block", func(t *testing.T) { t.Parallel() - bp, _ := process.NewBlocksPool( - &testscommon.PruningStorerStub{ - PruneCalled: func(index uint64) error { - assert.Fail(t, "should have not been called") - - return nil - }, - }, - protoMarshaller, - 100, - cleanupInterval, - 0, + hbp, err := process.NewBlocksPool( + &testscommon.BlocksPoolMock{}, + &testscommon.MarshallerMock{}, ) - - checkpoint := &data.BlockCheckpoint{ - LastRounds: map[uint32]uint64{ - core.MetachainShardId: 2, - }, - } - - err := bp.UpdateMetaState(checkpoint) require.Nil(t, err) - }) - - t.Run("should trigger prune if cleanup interval", func(t *testing.T) { - t.Parallel() - wasCalled := false - bp, _ := process.NewBlocksPool( - &testscommon.PruningStorerStub{ - PruneCalled: func(index uint64) error { - wasCalled = true + currentIndex := uint64(10) - return nil + outportBlock := &hyperOutportBlocks.ShardOutportBlock{ + ShardID: 1, + BlockData: &hyperOutportBlocks.BlockData{ + Header: &hyperOutportBlocks.Header{ + Nonce: currentIndex, }, }, - protoMarshaller, - 100, - cleanupInterval, - 0, - ) - - checkpoint := &data.BlockCheckpoint{ - LastRounds: map[uint32]uint64{ - core.MetachainShardId: 100, - }, + HighestFinalBlockNonce: currentIndex - 1, } - err := bp.UpdateMetaState(checkpoint) + err = hbp.PutBlock([]byte("hash1"), outportBlock) require.Nil(t, err) - - require.True(t, wasCalled) }) } -func TestBlocksPool_PutBlock(t *testing.T) { +func TestBlocksPool_GetMetaBlock(t *testing.T) { t.Parallel() - shardID := uint32(2) - - t.Run("should work on init, index 0", func(t *testing.T) { - t.Parallel() + marshaller := &testscommon.MarshallerMock{} - maxDelta := uint64(10) + currentIndex := uint64(10) - wasCalled := false - bp, _ := process.NewBlocksPool( - &testscommon.PruningStorerStub{ - PutCalled: func(key, data []byte) error { - wasCalled = true - - return nil - }, + outportBlock := &hyperOutportBlocks.MetaOutportBlock{ + ShardID: 1, + BlockData: &hyperOutportBlocks.MetaBlockData{ + Header: &hyperOutportBlocks.MetaHeader{ + Round: currentIndex, }, - gogoProtoMarshaller, - maxDelta, - 100, - 0, - ) - - startIndex := uint64(0) - err := bp.PutBlock([]byte("hash1"), []byte("data1"), startIndex, shardID) - require.Nil(t, err) - - require.True(t, wasCalled) - }) - - t.Run("should work on init with any index if not previous checkpoint", func(t *testing.T) { - t.Parallel() - - maxDelta := uint64(10) - - wasCalled := false - bp, _ := process.NewBlocksPool( - &testscommon.PruningStorerStub{ - GetCalled: func(key []byte) ([]byte, error) { - if string(key) == process.MetaCheckpointKey { - wasCalled = true - return nil, fmt.Errorf("no checkpoint key found") - } - - return []byte{}, nil - }, - }, - gogoProtoMarshaller, - maxDelta, - 100, - 0, - ) - - startIndex := uint64(123) - err := bp.PutBlock([]byte("hash1"), []byte("data1"), startIndex, shardID) - require.Nil(t, err) - - require.True(t, wasCalled) - }) - - t.Run("should work succesively from init if there is previous checkpoint", func(t *testing.T) { - t.Parallel() - - maxDelta := uint64(10) - - shardID := uint32(1) - startIndex := uint64(123) - - lastCheckpointData, err := protoMarshaller.Marshal(&data.BlockCheckpoint{ - LastRounds: map[uint32]uint64{ - shardID: startIndex, - core.MetachainShardId: startIndex - 2, - }, - }) - require.Nil(t, err) - - putCalled := false - bp, _ := process.NewBlocksPool( - &testscommon.PruningStorerStub{ - GetCalled: func(key []byte) ([]byte, error) { - if string(key) == process.MetaCheckpointKey { - return lastCheckpointData, nil - } - - return []byte{}, nil - }, - PutCalled: func(key, data []byte) error { - putCalled = true + }, + HighestFinalBlockNonce: currentIndex - 1, + } + outportBlockBytes, _ := marshaller.Marshal(outportBlock) - return nil - }, + hbp, err := process.NewBlocksPool( + &testscommon.BlocksPoolMock{ + GetCalled: func(hash []byte) ([]byte, error) { + return outportBlockBytes, nil }, - gogoProtoMarshaller, - maxDelta, - 100, - 0, - ) - - err = bp.PutBlock([]byte("hash1"), []byte("data1"), startIndex+1, shardID) - require.Nil(t, err) - - require.True(t, putCalled) - }) - - t.Run("should fail if max delta is reached", func(t *testing.T) { - t.Parallel() - - maxDelta := uint64(10) + }, + marshaller, + ) + require.Nil(t, err) - wasCalled := false - bp, _ := process.NewBlocksPool( - &testscommon.PruningStorerStub{ - PutCalled: func(key, data []byte) error { - wasCalled = true + ret, err := hbp.GetMetaBlock([]byte("hash1")) + require.Nil(t, err) + require.Equal(t, outportBlock, ret) +} - return nil - }, - }, - protoMarshaller, - maxDelta, - 100, - 0, - ) +func TestBlocksPool_GetShardBlock(t *testing.T) { + t.Parallel() - startIndex := uint64(2) - err := bp.PutBlock([]byte("hash1"), []byte("data1"), startIndex, shardID) - require.Nil(t, err) + marshaller := &testscommon.MarshallerMock{} - require.True(t, wasCalled) + currentIndex := uint64(10) - checkpoint := &data.BlockCheckpoint{ - LastRounds: map[uint32]uint64{ - core.MetachainShardId: 2, + outportBlock := &hyperOutportBlocks.ShardOutportBlock{ + ShardID: 1, + BlockData: &hyperOutportBlocks.BlockData{ + Header: &hyperOutportBlocks.Header{ + Round: currentIndex, }, - } - - err = bp.UpdateMetaState(checkpoint) - require.Nil(t, err) - - err = bp.PutBlock([]byte("hash2"), []byte("data1"), startIndex, core.MetachainShardId) - require.Nil(t, err) - - for i := uint64(1); i <= maxDelta; i++ { - err = bp.PutBlock([]byte("hash2"), []byte("data1"), startIndex+i, shardID) - require.Nil(t, err) - } - - err = bp.PutBlock([]byte("hash3"), []byte("data1"), startIndex+maxDelta+1, shardID) - require.Error(t, err) - }) -} - -func TestBlocksPool_Close(t *testing.T) { - t.Parallel() - - wasCalled := false - bp, _ := process.NewBlocksPool( - &testscommon.PruningStorerStub{ - CloseCalled: func() error { - wasCalled = true + }, + HighestFinalBlockNonce: currentIndex - 1, + } + outportBlockBytes, _ := marshaller.Marshal(outportBlock) - return nil + hbp, err := process.NewBlocksPool( + &testscommon.BlocksPoolMock{ + GetCalled: func(hash []byte) ([]byte, error) { + return outportBlockBytes, nil }, }, - protoMarshaller, - 10, - 100, - 0, + marshaller, ) - - err := bp.Close() require.Nil(t, err) - require.True(t, wasCalled) + ret, err := hbp.GetShardBlock([]byte("hash1")) + require.Nil(t, err) + require.Equal(t, outportBlock, ret) } diff --git a/process/dataAggregator.go b/process/dataAggregator.go index f3beec2..0f5fb2d 100644 --- a/process/dataAggregator.go +++ b/process/dataAggregator.go @@ -12,15 +12,15 @@ import ( ) type dataAggregator struct { - blocksPool HyperBlocksPool + blocksPool BlocksPool } // NewDataAggregator will create a new data aggregator instance func NewDataAggregator( - blocksPool HyperBlocksPool, + blocksPool BlocksPool, ) (*dataAggregator, error) { if check.IfNil(blocksPool) { - return nil, ErrNilHyperBlocksPool + return nil, ErrNilBlocksPool } return &dataAggregator{ diff --git a/process/dataAggregator_test.go b/process/dataAggregator_test.go index 3c1ac4d..5ac6a36 100644 --- a/process/dataAggregator_test.go +++ b/process/dataAggregator_test.go @@ -19,13 +19,13 @@ func TestNewDataAggregator(t *testing.T) { da, err := process.NewDataAggregator(nil) require.Nil(t, da) - require.Equal(t, process.ErrNilHyperBlocksPool, err) + require.Equal(t, process.ErrNilBlocksPool, err) }) t.Run("should work", func(t *testing.T) { t.Parallel() - da, err := process.NewDataAggregator(&testscommon.HyperBlocksPoolStub{}) + da, err := process.NewDataAggregator(&testscommon.HyperBlocksPoolMock{}) require.Nil(t, err) require.False(t, da.IsInterfaceNil()) }) @@ -37,7 +37,7 @@ func TestDataAggregator_ProcessHyperBlock(t *testing.T) { t.Run("invalid outport block provided", func(t *testing.T) { t.Parallel() - da, err := process.NewDataAggregator(&testscommon.HyperBlocksPoolStub{}) + da, err := process.NewDataAggregator(&testscommon.HyperBlocksPoolMock{}) require.Nil(t, err) invalidOutportBlock := createMetaOutportBlock() @@ -56,7 +56,7 @@ func TestDataAggregator_ProcessHyperBlock(t *testing.T) { shardOutportBlock := createShardOutportBlock() shardOutportBlock.BlockData.HeaderHash = headerHash - blocksPoolStub := &testscommon.HyperBlocksPoolStub{ + blocksPoolStub := &testscommon.HyperBlocksPoolMock{ GetShardBlockCalled: func(hash []byte) (*hyperOutportBlocks.ShardOutportBlock, error) { return shardOutportBlock, nil }, diff --git a/process/dataPool.go b/process/dataPool.go new file mode 100644 index 0000000..5ac2cc9 --- /dev/null +++ b/process/dataPool.go @@ -0,0 +1,232 @@ +package process + +import ( + "fmt" + "math" + "sync" + + "github.com/multiversx/mx-chain-core-go/core" + "github.com/multiversx/mx-chain-core-go/core/check" + "github.com/multiversx/mx-chain-core-go/marshal" + "github.com/multiversx/mx-chain-ws-connector-firehose-go/data" +) + +const ( + // MetaCheckpointKey defines the meta checkpoint key + MetaCheckpointKey = "lastMetaIndex" + + initIndex = 0 + minDelta = 3 +) + +type dataPool struct { + storer PruningStorer + marshaller marshal.Marshalizer + maxDelta uint64 + cleanupInterval uint64 + firstCommitableBlocks map[uint32]uint64 + + previousIndexesMap map[uint32]uint64 + mutMap sync.RWMutex +} + +// DataPoolArgs defines the arguments needed to create the blocks pool component +type DataPoolArgs struct { + Storer PruningStorer + Marshaller marshal.Marshalizer + MaxDelta uint64 + CleanupInterval uint64 + FirstCommitableBlocks map[uint32]uint64 +} + +// NewDataPool will create a new data pool instance +func NewDataPool(args DataPoolArgs) (*dataPool, error) { + if check.IfNil(args.Storer) { + return nil, ErrNilPruningStorer + } + if check.IfNil(args.Marshaller) { + return nil, ErrNilMarshaller + } + if args.MaxDelta < minDelta { + return nil, fmt.Errorf("%w for max delta, provided %d, min required %d", ErrInvalidValue, args.MaxDelta, minDelta) + } + if args.CleanupInterval <= args.MaxDelta { + return nil, fmt.Errorf("%w for cleanup interval, provided %d, min required %d", ErrInvalidValue, args.MaxDelta, args.MaxDelta) + } + + bp := &dataPool{ + storer: args.Storer, + marshaller: args.Marshaller, + maxDelta: args.MaxDelta, + cleanupInterval: args.CleanupInterval, + firstCommitableBlocks: args.FirstCommitableBlocks, + } + + bp.initIndexesMap() + + return bp, nil +} + +func (bp *dataPool) initIndexesMap() { + lastCheckpoint, err := bp.GetLastCheckpoint() + if err != nil || lastCheckpoint == nil || lastCheckpoint.LastNonces == nil { + log.Warn("failed to get last checkpoint, will set empty indexes map", "error", err) + + indexesMap := make(map[uint32]uint64) + bp.previousIndexesMap = indexesMap + return + } + + log.Info("initIndexesMap", "lastCheckpoint", lastCheckpoint) + + indexesMap := make(map[uint32]uint64, len(lastCheckpoint.LastNonces)) + for shardID, nonce := range lastCheckpoint.LastNonces { + indexesMap[shardID] = nonce + } + bp.previousIndexesMap = indexesMap +} + +// Put will put value into storer +func (bp *dataPool) Put(key []byte, value []byte) error { + return bp.storer.Put(key, value) +} + +// Get will get value from storer +func (bp *dataPool) Get(key []byte) ([]byte, error) { + return bp.storer.Get(key) +} + +// UpdateMetaState will update internal meta state +func (bp *dataPool) UpdateMetaState(checkpoint *data.BlockCheckpoint) error { + index, ok := checkpoint.LastNonces[core.MetachainShardId] + if !ok { + index = initIndex + } + + if index >= bp.firstCommitableBlocks[core.MetachainShardId] { + err := bp.setCheckpoint(checkpoint) + if err != nil { + return fmt.Errorf("%w, failed to set checkpoint", err) + } + } + + // TODO: prune storer based on epoch change + err := bp.pruneStorer(index) + if err != nil { + return fmt.Errorf("%w, failed to prune storer", err) + } + + return nil +} + +func (bp *dataPool) pruneStorer(index uint64) error { + if index%bp.cleanupInterval != 0 { + return nil + } + + return bp.storer.Prune(index) +} + +func (bp *dataPool) getLastIndex(shardID uint32) uint64 { + lastCheckpoint, err := bp.GetLastCheckpoint() + if err == nil { + baseIndex, ok := lastCheckpoint.LastNonces[shardID] + if ok { + return baseIndex + } + } + + lastIndex, ok := bp.previousIndexesMap[shardID] + if !ok { + return initIndex + } + + return lastIndex +} + +// PutBlock will put the provided outport block data to the pool +func (bp *dataPool) PutBlock(hash []byte, value []byte, newIndex uint64, shardID uint32) error { + bp.mutMap.Lock() + defer bp.mutMap.Unlock() + + firstCommitableBlock, ok := bp.firstCommitableBlocks[shardID] + if !ok { + return fmt.Errorf("failed to get first commitable block for shard %d", shardID) + } + + if newIndex < firstCommitableBlock { + log.Trace("do not commit block", "newIndex", newIndex, "firstCommitableBlock", firstCommitableBlock) + return nil + } + + lastIndex := bp.getLastIndex(shardID) + if lastIndex == initIndex { + bp.previousIndexesMap[shardID] = newIndex + return bp.storer.Put(hash, value) + } + + if !bp.shouldPutBlockData(newIndex, lastIndex) { + return fmt.Errorf("%w: not within required delta, last index %d, new index %d", + ErrFailedToPutBlockDataToPool, lastIndex, newIndex) + } + + err := bp.storer.Put(hash, value) + if err != nil { + return fmt.Errorf("failed to put into storer: %w", err) + } + + return nil +} + +func (bp *dataPool) shouldPutBlockData(index, baseIndex uint64) bool { + diff := float64(int64(index) - int64(baseIndex)) + delta := math.Abs(diff) + + return math.Abs(delta) < float64(bp.maxDelta) +} + +func (bp *dataPool) setCheckpoint(checkpoint *data.BlockCheckpoint) error { + checkpointBytes, err := bp.marshaller.Marshal(checkpoint) + if err != nil { + return fmt.Errorf("failed to marshall checkpoint data: %w", err) + } + + log.Debug("setCheckpoint", "checkpoint", checkpoint) + + return bp.storer.Put([]byte(MetaCheckpointKey), checkpointBytes) +} + +// GetLastCheckpoint returns last checkpoint data +func (bp *dataPool) GetLastCheckpoint() (*data.BlockCheckpoint, error) { + checkpointBytes, err := bp.storer.Get([]byte(MetaCheckpointKey)) + if err != nil { + return nil, fmt.Errorf("failed to get checkpoint data from storer: %w", err) + } + + checkpoint := &data.BlockCheckpoint{} + err = bp.marshaller.Unmarshal(checkpoint, checkpointBytes) + if err != nil { + return nil, fmt.Errorf("failed to unmarshall checkpoint data: %w", err) + } + + if checkpoint == nil || checkpoint.LastNonces == nil { + return nil, fmt.Errorf("nil checkpoint data has been provided") + } + + return checkpoint, nil +} + +// Close will trigger close on blocks pool component +func (bp *dataPool) Close() error { + err := bp.storer.Close() + if err != nil { + return err + } + + return nil +} + +// IsInterfaceNil returns nil if there is no value under the interface +func (bp *dataPool) IsInterfaceNil() bool { + return bp == nil +} diff --git a/process/dataPool_test.go b/process/dataPool_test.go new file mode 100644 index 0000000..b24689d --- /dev/null +++ b/process/dataPool_test.go @@ -0,0 +1,414 @@ +package process_test + +import ( + "errors" + "fmt" + "testing" + + "github.com/multiversx/mx-chain-core-go/core" + "github.com/multiversx/mx-chain-core-go/data/outport" + "github.com/multiversx/mx-chain-ws-connector-firehose-go/data" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/multiversx/mx-chain-ws-connector-firehose-go/process" + "github.com/multiversx/mx-chain-ws-connector-firehose-go/testscommon" +) + +func createDefaultBlocksPoolArgs() process.DataPoolArgs { + return process.DataPoolArgs{ + Storer: &testscommon.PruningStorerMock{}, + Marshaller: gogoProtoMarshaller, + MaxDelta: 10, + CleanupInterval: 100, + FirstCommitableBlocks: map[uint32]uint64{ + core.MetachainShardId: 0, + 0: 0, + 1: 0, + 2: 0, + }, + } +} + +func TestNewDataPool(t *testing.T) { + t.Parallel() + + t.Run("nil pruning storer", func(t *testing.T) { + t.Parallel() + + args := createDefaultBlocksPoolArgs() + args.Storer = nil + bp, err := process.NewDataPool(args) + require.Nil(t, bp) + require.Equal(t, process.ErrNilPruningStorer, err) + }) + + t.Run("nil marshaller", func(t *testing.T) { + t.Parallel() + + args := createDefaultBlocksPoolArgs() + args.Marshaller = nil + bp, err := process.NewDataPool(args) + require.Nil(t, bp) + require.Equal(t, process.ErrNilMarshaller, err) + }) + + t.Run("should work", func(t *testing.T) { + t.Parallel() + + args := createDefaultBlocksPoolArgs() + bp, err := process.NewDataPool(args) + require.Nil(t, err) + require.False(t, bp.IsInterfaceNil()) + }) +} + +func TestDataPool_GetBlock(t *testing.T) { + t.Parallel() + + t.Run("failed to get data from storer", func(t *testing.T) { + t.Parallel() + + expectedErr := errors.New("expected error") + + args := createDefaultBlocksPoolArgs() + args.Storer = &testscommon.PruningStorerMock{ + GetCalled: func(key []byte) ([]byte, error) { + return nil, expectedErr + }, + } + bp, _ := process.NewDataPool(args) + + ret, err := bp.Get([]byte("hash1")) + require.Nil(t, ret) + require.Equal(t, expectedErr, err) + }) + + t.Run("should work", func(t *testing.T) { + t.Parallel() + + outportBlock := &outport.OutportBlock{ + ShardID: 1, + NotarizedHeadersHashes: []string{"hash1", "hash2"}, + NumberOfShards: 3, + } + outportBlockBytes, _ := gogoProtoMarshaller.Marshal(outportBlock) + + args := createDefaultBlocksPoolArgs() + args.Storer = &testscommon.PruningStorerMock{ + GetCalled: func(key []byte) ([]byte, error) { + return outportBlockBytes, nil + }, + } + bp, _ := process.NewDataPool(args) + + ret, err := bp.Get([]byte("hash1")) + require.Nil(t, err) + require.Equal(t, outportBlockBytes, ret) + }) +} + +func TestDataPool_UpdateMetaState(t *testing.T) { + t.Parallel() + + cleanupInterval := uint64(100) + + t.Run("should not set checkpoint if index is not commitable", func(t *testing.T) { + t.Parallel() + + firstCommitableBlock := uint64(10) + firstCommitableBlocks := map[uint32]uint64{ + core.MetachainShardId: firstCommitableBlock, + } + + args := createDefaultBlocksPoolArgs() + args.CleanupInterval = cleanupInterval + args.FirstCommitableBlocks = firstCommitableBlocks + args.Marshaller = protoMarshaller + args.Storer = &testscommon.PruningStorerMock{ + PutCalled: func(key, data []byte) error { + assert.Fail(t, "should have not been called") + + return nil + }, + PruneCalled: func(index uint64) error { + assert.Fail(t, "should have not been called") + + return nil + }, + } + bp, _ := process.NewDataPool(args) + + checkpoint := &data.BlockCheckpoint{ + LastNonces: map[uint32]uint64{ + core.MetachainShardId: firstCommitableBlock - 1, + }, + } + + err := bp.UpdateMetaState(checkpoint) + require.Nil(t, err) + }) + + t.Run("should set checkpoint if index if commitable", func(t *testing.T) { + t.Parallel() + + firstCommitableBlock := uint64(10) + firstCommitableBlocks := map[uint32]uint64{ + core.MetachainShardId: firstCommitableBlock, + } + + putCalled := false + args := createDefaultBlocksPoolArgs() + args.CleanupInterval = cleanupInterval + args.FirstCommitableBlocks = firstCommitableBlocks + args.Marshaller = protoMarshaller + args.Storer = &testscommon.PruningStorerMock{ + PutCalled: func(key, data []byte) error { + putCalled = true + + return nil + }, + PruneCalled: func(index uint64) error { + assert.Fail(t, "should have not been called") + + return nil + }, + } + bp, _ := process.NewDataPool(args) + + checkpoint := &data.BlockCheckpoint{ + LastNonces: map[uint32]uint64{ + core.MetachainShardId: firstCommitableBlock, + }, + } + + err := bp.UpdateMetaState(checkpoint) + require.Nil(t, err) + + require.True(t, putCalled) + }) + + t.Run("should not trigger prune if not cleanup interval", func(t *testing.T) { + t.Parallel() + + args := createDefaultBlocksPoolArgs() + args.Marshaller = protoMarshaller + args.Storer = &testscommon.PruningStorerMock{ + PruneCalled: func(index uint64) error { + assert.Fail(t, "should have not been called") + + return nil + }, + } + bp, _ := process.NewDataPool(args) + + checkpoint := &data.BlockCheckpoint{ + LastNonces: map[uint32]uint64{ + core.MetachainShardId: 2, + }, + } + + err := bp.UpdateMetaState(checkpoint) + require.Nil(t, err) + }) + + t.Run("should trigger prune if cleanup interval", func(t *testing.T) { + t.Parallel() + + wasCalled := false + args := createDefaultBlocksPoolArgs() + args.CleanupInterval = cleanupInterval + args.Marshaller = protoMarshaller + args.Storer = &testscommon.PruningStorerMock{ + PruneCalled: func(index uint64) error { + wasCalled = true + + return nil + }, + } + bp, _ := process.NewDataPool(args) + + checkpoint := &data.BlockCheckpoint{ + LastNonces: map[uint32]uint64{ + core.MetachainShardId: 100, + }, + } + + err := bp.UpdateMetaState(checkpoint) + require.Nil(t, err) + + require.True(t, wasCalled) + }) +} + +func TestDataPool_PutBlock(t *testing.T) { + t.Parallel() + + shardID := uint32(2) + + t.Run("should work on init, index 0", func(t *testing.T) { + t.Parallel() + + maxDelta := uint64(10) + + wasCalled := false + args := createDefaultBlocksPoolArgs() + args.MaxDelta = maxDelta + args.Storer = &testscommon.PruningStorerMock{ + PutCalled: func(key, data []byte) error { + wasCalled = true + + return nil + }, + } + bp, _ := process.NewDataPool(args) + + startIndex := uint64(0) + err := bp.PutBlock([]byte("hash1"), []byte("data1"), startIndex, shardID) + require.Nil(t, err) + + require.True(t, wasCalled) + }) + + t.Run("should work on init with any index if not previous checkpoint", func(t *testing.T) { + t.Parallel() + + maxDelta := uint64(10) + + wasCalled := false + + args := createDefaultBlocksPoolArgs() + args.MaxDelta = maxDelta + args.Marshaller = protoMarshaller + args.Storer = &testscommon.PruningStorerMock{ + GetCalled: func(key []byte) ([]byte, error) { + if string(key) == process.MetaCheckpointKey { + wasCalled = true + return nil, fmt.Errorf("no checkpoint key found") + } + + return []byte{}, nil + }, + } + bp, _ := process.NewDataPool(args) + + startIndex := uint64(123) + err := bp.PutBlock([]byte("hash1"), []byte("data1"), startIndex, shardID) + require.Nil(t, err) + + require.True(t, wasCalled) + }) + + t.Run("should work succesively from init if there is previous checkpoint", func(t *testing.T) { + t.Parallel() + + maxDelta := uint64(10) + + shardID := uint32(1) + startIndex := uint64(123) + + lastCheckpointData, err := protoMarshaller.Marshal(&data.BlockCheckpoint{ + LastNonces: map[uint32]uint64{ + shardID: startIndex, + core.MetachainShardId: startIndex - 2, + }, + }) + require.Nil(t, err) + + putCalled := false + + args := createDefaultBlocksPoolArgs() + args.MaxDelta = maxDelta + args.Storer = &testscommon.PruningStorerMock{ + GetCalled: func(key []byte) ([]byte, error) { + if string(key) == process.MetaCheckpointKey { + return lastCheckpointData, nil + } + + return []byte{}, nil + }, + PutCalled: func(key, data []byte) error { + putCalled = true + + return nil + }, + } + bp, _ := process.NewDataPool(args) + + err = bp.PutBlock([]byte("hash1"), []byte("data1"), startIndex+1, shardID) + require.Nil(t, err) + + require.True(t, putCalled) + }) + + t.Run("should fail if max delta is reached", func(t *testing.T) { + t.Parallel() + + maxDelta := uint64(10) + + wasCalled := false + + checkpoint := &data.BlockCheckpoint{ + LastNonces: map[uint32]uint64{ + core.MetachainShardId: 2, + shardID: 2, + }, + } + checkpointBytes, _ := protoMarshaller.Marshal(checkpoint) + + args := createDefaultBlocksPoolArgs() + args.MaxDelta = maxDelta + args.Marshaller = protoMarshaller + args.Storer = &testscommon.PruningStorerMock{ + PutCalled: func(key, data []byte) error { + wasCalled = true + + return nil + }, + GetCalled: func(key []byte) ([]byte, error) { + return checkpointBytes, nil + }, + } + bp, _ := process.NewDataPool(args) + + startIndex := uint64(2) + err := bp.PutBlock([]byte("hash1"), []byte("data1"), startIndex, shardID) + require.Nil(t, err) + + require.True(t, wasCalled) + + err = bp.UpdateMetaState(checkpoint) + require.Nil(t, err) + + err = bp.PutBlock([]byte("hash2"), []byte("data1"), startIndex, shardID) + require.Nil(t, err) + + for i := uint64(1); i < maxDelta; i++ { + err = bp.PutBlock([]byte("hash2"), []byte("data1"), startIndex+i, shardID) + require.Nil(t, err) + } + + err = bp.PutBlock([]byte("hash3"), []byte("data1"), startIndex+maxDelta, shardID) + require.Error(t, err) + }) +} + +func TestDataPool_Close(t *testing.T) { + t.Parallel() + + wasCalled := false + args := createDefaultBlocksPoolArgs() + args.Storer = &testscommon.PruningStorerMock{ + CloseCalled: func() error { + wasCalled = true + + return nil + }, + } + bp, _ := process.NewDataPool(args) + + err := bp.Close() + require.Nil(t, err) + + require.True(t, wasCalled) +} diff --git a/process/dataProcessor.go b/process/dataProcessor.go index a38b53b..b0e3aca 100644 --- a/process/dataProcessor.go +++ b/process/dataProcessor.go @@ -13,7 +13,7 @@ type dataProcessor struct { marshaller marshal.Marshalizer operationHandlers map[string]func(marshalledData []byte) error publisher Publisher - outportBlocksPool HyperBlocksPool + outportBlocksPool BlocksPool outportBlockConverter OutportBlockConverter } @@ -21,14 +21,14 @@ type dataProcessor struct { func NewDataProcessor( publisher Publisher, marshaller marshal.Marshalizer, - outportBlocksPool HyperBlocksPool, + blocksPool BlocksPool, outportBlockConverter OutportBlockConverter, ) (DataProcessor, error) { if check.IfNil(publisher) { return nil, ErrNilPublisher } - if check.IfNil(outportBlocksPool) { - return nil, ErrNilHyperBlocksPool + if check.IfNil(blocksPool) { + return nil, ErrNilBlocksPool } if check.IfNil(marshaller) { return nil, ErrNilMarshaller @@ -40,7 +40,7 @@ func NewDataProcessor( dp := &dataProcessor{ marshaller: marshaller, publisher: publisher, - outportBlocksPool: outportBlocksPool, + outportBlocksPool: blocksPool, outportBlockConverter: outportBlockConverter, } @@ -83,7 +83,7 @@ func (dp *dataProcessor) saveBlock(marshalledData []byte) error { func (dp *dataProcessor) handleMetaOutportBlock(outportBlock *outport.OutportBlock) error { metaOutportBlock, err := dp.outportBlockConverter.HandleMetaOutportBlock(outportBlock) if err != nil { - return fmt.Errorf("failed to convert outportBlock to metaOutportBlock: %w", err) + return fmt.Errorf("failed to handle metaOutportBlock: %w", err) } if metaOutportBlock == nil { return ErrInvalidOutportBlock @@ -94,15 +94,15 @@ func (dp *dataProcessor) handleMetaOutportBlock(outportBlock *outport.OutportBlo if metaOutportBlock.BlockData.Header == nil { return fmt.Errorf("%w for blockData header", ErrInvalidOutportBlock) } - metaRound := metaOutportBlock.BlockData.Header.GetRound() + metaNonce := metaOutportBlock.BlockData.Header.GetNonce() log.Info("saving meta outport block", "hash", metaOutportBlock.BlockData.GetHeaderHash(), - "round", metaRound, + "nonce", metaNonce, "shardID", metaOutportBlock.ShardID) headerHash := metaOutportBlock.BlockData.HeaderHash - err = dp.outportBlocksPool.PutMetaBlock(headerHash, metaOutportBlock) + err = dp.outportBlocksPool.PutBlock(headerHash, metaOutportBlock) if err != nil { return fmt.Errorf("failed to put metablock: %w", err) } @@ -118,7 +118,7 @@ func (dp *dataProcessor) handleMetaOutportBlock(outportBlock *outport.OutportBlo func (dp *dataProcessor) handleShardOutportBlock(outportBlock *outport.OutportBlock) error { shardOutportBlock, err := dp.outportBlockConverter.HandleShardOutportBlock(outportBlock) if err != nil { - return fmt.Errorf("failed to convert outportBlock to shardOutportBlock: %w", err) + return fmt.Errorf("failed to handle shardOutportBlock: %w", err) } if shardOutportBlock.BlockData == nil { return fmt.Errorf("%w for blockData", ErrInvalidOutportBlock) @@ -126,16 +126,16 @@ func (dp *dataProcessor) handleShardOutportBlock(outportBlock *outport.OutportBl if shardOutportBlock.BlockData.Header == nil { return fmt.Errorf("%w for blockData header", ErrInvalidOutportBlock) } - round := shardOutportBlock.BlockData.Header.GetRound() + nonce := shardOutportBlock.BlockData.Header.GetNonce() log.Info("saving shard outport block", "hash", shardOutportBlock.BlockData.GetHeaderHash(), - "round", round, + "nonce", nonce, "shardID", shardOutportBlock.ShardID) headerHash := outportBlock.BlockData.HeaderHash - return dp.outportBlocksPool.PutShardBlock(headerHash, shardOutportBlock) + return dp.outportBlocksPool.PutBlock(headerHash, shardOutportBlock) } func (dp *dataProcessor) revertBlock(marshalledData []byte) error { diff --git a/process/dataProcessor_test.go b/process/dataProcessor_test.go index 2552d6a..be61606 100644 --- a/process/dataProcessor_test.go +++ b/process/dataProcessor_test.go @@ -87,8 +87,8 @@ func TestNewDataProcessor(t *testing.T) { dp, err := process.NewDataProcessor( nil, &testscommon.MarshallerStub{}, - &testscommon.HyperBlocksPoolStub{}, - &testscommon.OutportBlockConverterStub{}, + &testscommon.HyperBlocksPoolMock{}, + &testscommon.OutportBlockConverterMock{}, ) require.Nil(t, dp) require.Equal(t, process.ErrNilPublisher, err) @@ -98,10 +98,10 @@ func TestNewDataProcessor(t *testing.T) { t.Parallel() dp, err := process.NewDataProcessor( - &testscommon.PublisherStub{}, + &testscommon.PublisherMock{}, nil, - &testscommon.HyperBlocksPoolStub{}, - &testscommon.OutportBlockConverterStub{}, + &testscommon.HyperBlocksPoolMock{}, + &testscommon.OutportBlockConverterMock{}, ) require.Nil(t, dp) require.Equal(t, process.ErrNilMarshaller, err) @@ -111,22 +111,22 @@ func TestNewDataProcessor(t *testing.T) { t.Parallel() dp, err := process.NewDataProcessor( - &testscommon.PublisherStub{}, - &testscommon.MarshallerStub{}, + &testscommon.PublisherMock{}, + &testscommon.MarshallerMock{}, nil, - &testscommon.OutportBlockConverterStub{}, + &testscommon.OutportBlockConverterMock{}, ) require.Nil(t, dp) - require.Equal(t, process.ErrNilHyperBlocksPool, err) + require.Equal(t, process.ErrNilBlocksPool, err) }) t.Run("nil block converter", func(t *testing.T) { t.Parallel() dp, err := process.NewDataProcessor( - &testscommon.PublisherStub{}, + &testscommon.PublisherMock{}, &testscommon.MarshallerStub{}, - &testscommon.HyperBlocksPoolStub{}, + &testscommon.HyperBlocksPoolMock{}, nil, ) require.Nil(t, dp) @@ -137,10 +137,10 @@ func TestNewDataProcessor(t *testing.T) { t.Parallel() dp, err := process.NewDataProcessor( - &testscommon.PublisherStub{}, + &testscommon.PublisherMock{}, &testscommon.MarshallerStub{}, - &testscommon.HyperBlocksPoolStub{}, - &testscommon.OutportBlockConverterStub{}, + &testscommon.HyperBlocksPoolMock{}, + &testscommon.OutportBlockConverterMock{}, ) require.Nil(t, err) require.False(t, dp.IsInterfaceNil()) @@ -151,10 +151,10 @@ func TestDataProcessor_ProcessPayload_NotImplementedTopics(t *testing.T) { t.Parallel() dp, _ := process.NewDataProcessor( - &testscommon.PublisherStub{}, + &testscommon.PublisherMock{}, &testscommon.MarshallerStub{}, - &testscommon.HyperBlocksPoolStub{}, - &testscommon.OutportBlockConverterStub{}, + &testscommon.HyperBlocksPoolMock{}, + &testscommon.OutportBlockConverterMock{}, ) require.Nil(t, dp.ProcessPayload([]byte("payload"), "random topic", 1)) @@ -168,16 +168,17 @@ func TestDataProcessor_ProcessPayload_NotImplementedTopics(t *testing.T) { func TestDataProcessor_ProcessPayload(t *testing.T) { t.Parallel() - outportBlockConverter := process.NewOutportBlockConverter(gogoProtoMarshaller, protoMarshaller) + outportBlockConverter, err := process.NewOutportBlockConverter(gogoProtoMarshaller, protoMarshaller) + require.Nil(t, err) t.Run("nil outport block data, should return error", func(t *testing.T) { t.Parallel() dp, _ := process.NewDataProcessor( - &testscommon.PublisherStub{}, + &testscommon.PublisherMock{}, gogoProtoMarshaller, - &testscommon.HyperBlocksPoolStub{}, - &testscommon.OutportBlockConverterStub{}, + &testscommon.HyperBlocksPoolMock{}, + &testscommon.OutportBlockConverterMock{}, ) err := dp.ProcessPayload(nil, outportcore.TopicSaveBlock, 1) @@ -195,10 +196,10 @@ func TestDataProcessor_ProcessPayload(t *testing.T) { t.Parallel() dp, _ := process.NewDataProcessor( - &testscommon.PublisherStub{}, + &testscommon.PublisherMock{}, protoMarshaller, - &testscommon.HyperBlocksPoolStub{}, - &testscommon.OutportBlockConverterStub{}, + &testscommon.HyperBlocksPoolMock{}, + &testscommon.OutportBlockConverterMock{}, ) err := dp.ProcessPayload([]byte("invalid payload"), outportcore.TopicSaveBlock, 1) @@ -213,10 +214,10 @@ func TestDataProcessor_ProcessPayload(t *testing.T) { putBlockWasCalled := false dp, _ := process.NewDataProcessor( - &testscommon.PublisherStub{}, + &testscommon.PublisherMock{}, gogoProtoMarshaller, - &testscommon.HyperBlocksPoolStub{ - PutShardBlockCalled: func(hash []byte, outportBlock *data.ShardOutportBlock) error { + &testscommon.HyperBlocksPoolMock{ + PutBlockCalled: func(hash []byte, outportBlock process.OutportBlockHandler) error { putBlockWasCalled = true return nil }, @@ -242,15 +243,15 @@ func TestDataProcessor_ProcessPayload(t *testing.T) { publishWasCalled := false dp, _ := process.NewDataProcessor( - &testscommon.PublisherStub{ + &testscommon.PublisherMock{ PublishBlockCalled: func(headerHash []byte) error { publishWasCalled = true return nil }, }, gogoProtoMarshaller, - &testscommon.HyperBlocksPoolStub{ - PutMetaBlockCalled: func(hash []byte, outportBlock *data.MetaOutportBlock) error { + &testscommon.HyperBlocksPoolMock{ + PutBlockCalled: func(hash []byte, outportBlock process.OutportBlockHandler) error { require.Equal(t, metaOutportBlock, outportBlock) return nil @@ -272,14 +273,14 @@ func TestDataProcessor_Close(t *testing.T) { expectedErr := errors.New("expected error") dp, err := process.NewDataProcessor( - &testscommon.PublisherStub{ + &testscommon.PublisherMock{ CloseCalled: func() error { return expectedErr }, }, &testscommon.MarshallerStub{}, - &testscommon.HyperBlocksPoolStub{}, - &testscommon.OutportBlockConverterStub{}, + &testscommon.HyperBlocksPoolMock{}, + &testscommon.OutportBlockConverterMock{}, ) require.Nil(t, err) diff --git a/process/errors.go b/process/errors.go index 4b4fe88..1cf08d9 100644 --- a/process/errors.go +++ b/process/errors.go @@ -12,16 +12,16 @@ var ErrNilOutportBlockData = errors.New("nil outport block data") var ErrNilWriter = errors.New("nil writer provided") // ErrNilBlockCreator signals that a nil block creator was provided -var ErrNilBlockCreator = errors.New("nil block creator provided") +var ErrNilBlockCreator = errors.New("nil block creator") // ErrNilPublisher signals that a nil publisher was provided -var ErrNilPublisher = errors.New("nil publisher provided") +var ErrNilPublisher = errors.New("nil publisher") -// ErrNilHyperBlocksPool signals that a nil hyper blocks pool was provided -var ErrNilHyperBlocksPool = errors.New("nil hyper blocks pool provided") +// ErrNilBlocksPool signals that a nil blocks pool was provided +var ErrNilBlocksPool = errors.New("nil blocks pool") // ErrNilOutportBlocksConverter signals that a nil blocks pool was provided -var ErrNilOutportBlocksConverter = errors.New("nil outport blocks converter provided") +var ErrNilOutportBlocksConverter = errors.New("nil outport blocks converter") // ErrNilDataAggregator signals that a nil data aggregator was provided var ErrNilDataAggregator = errors.New("nil data aggregator provided") @@ -54,7 +54,13 @@ var ErrInvalidOutportBlock = errors.New("invalid outport block provided") var ErrFailedToPutBlockDataToPool = errors.New("failed to put block data") // ErrNilDataPool signals that a nil data pool was provided -var ErrNilDataPool = errors.New("nil data pool provided") +var ErrNilDataPool = errors.New("nil data pool") -// ErrNilHyperOutportBlock signals that a nil hyper outport block was provided -var ErrNilHyperOutportBlock = errors.New("nil hyper outport block provided") +// ErrNilHyperOutportBlock signals that a nil hyper outport block was provided +var ErrNilHyperOutportBlock = errors.New("nil hyper outport block") + +// ErrNilBlockServiceContext signal that the context provided for the block service is nil. +var ErrNilBlockServiceContext = errors.New("nil block service context") + +// ErrInvalidValue signals that an invalid value was provded +var ErrInvalidValue = errors.New("invalid value provided") diff --git a/process/export_test.go b/process/export_test.go index 28d4120..7d545ce 100644 --- a/process/export_test.go +++ b/process/export_test.go @@ -7,9 +7,11 @@ import ( ) const ( - FirehosePrefix = firehosePrefix - BlockPrefix = blockPrefix - MetaCheckpointKey = metaCheckpointKey + // FirehosePrefix - + FirehosePrefix = firehosePrefix + + // BlockPrefix - + BlockPrefix = blockPrefix ) // GetActivePersisters - diff --git a/process/firehosePublisher.go b/process/firehosePublisher.go index 0ed827e..048fe27 100644 --- a/process/firehosePublisher.go +++ b/process/firehosePublisher.go @@ -20,7 +20,7 @@ const ( initPrefix = "INIT" protocolReaderVersion = "1.0" - protoMessageType = "type.googleapis.com/proto.OutportBlock" + protoMessageType = "type.googleapis.com/sf.multiversx.type.v1.HyperOutportBlock" ) type firehosePublisher struct { diff --git a/process/grpcBlockPublisher.go b/process/grpcBlockPublisher.go index 67f6951..421a18d 100644 --- a/process/grpcBlockPublisher.go +++ b/process/grpcBlockPublisher.go @@ -4,11 +4,17 @@ import ( data "github.com/multiversx/mx-chain-ws-connector-firehose-go/data/hyperOutportBlocks" ) -type grpcBlockPublisher struct{} +type grpcBlockPublisher struct { + server GRPCServer +} // NewGRPCBlockPublisher is the publisher set up when serving hyperOutportBlocks via gRPC. -func NewGRPCBlockPublisher() *grpcBlockPublisher { - return &grpcBlockPublisher{} +func NewGRPCBlockPublisher(server GRPCServer) (*grpcBlockPublisher, error) { + server.Start() + + return &grpcBlockPublisher{ + server: server, + }, nil } // PublishHyperBlock will do nothing for now, as they are available via gRPC endpoints. @@ -16,8 +22,9 @@ func (g *grpcBlockPublisher) PublishHyperBlock(_ *data.HyperOutportBlock) error return nil } -// Close - +// Close will terminate the underlying gRPC server. func (g *grpcBlockPublisher) Close() error { + g.server.Close() return nil } diff --git a/process/grpcBlocksHandler.go b/process/grpcBlocksHandler.go index 1325bd2..b9eefab 100644 --- a/process/grpcBlocksHandler.go +++ b/process/grpcBlocksHandler.go @@ -10,25 +10,25 @@ import ( ) type grpcBlocksHandler struct { - outportBlocksPool HyperBlocksPool + outportBlocksPool BlocksPool dataAggregator DataAggregator } // NewGRPCBlocksHandler will create a new grpc blocks handler component able to fetch hyper outport blocks data to blocks pool // which will then be consumed by the grpc server func NewGRPCBlocksHandler( - outportBlocksPool HyperBlocksPool, + blocksPool BlocksPool, dataAggregator DataAggregator, ) (*grpcBlocksHandler, error) { - if check.IfNil(outportBlocksPool) { - return nil, ErrNilHyperBlocksPool + if check.IfNil(blocksPool) { + return nil, ErrNilBlocksPool } if check.IfNil(dataAggregator) { return nil, ErrNilDataAggregator } return &grpcBlocksHandler{ - outportBlocksPool: outportBlocksPool, + outportBlocksPool: blocksPool, dataAggregator: dataAggregator, }, nil } diff --git a/process/hyperBlocksPool.go b/process/hyperBlocksPool.go deleted file mode 100644 index cee5a7a..0000000 --- a/process/hyperBlocksPool.go +++ /dev/null @@ -1,125 +0,0 @@ -package process - -import ( - "fmt" - - "github.com/multiversx/mx-chain-core-go/core/check" - "github.com/multiversx/mx-chain-core-go/marshal" - "github.com/multiversx/mx-chain-ws-connector-firehose-go/data" - "github.com/multiversx/mx-chain-ws-connector-firehose-go/data/hyperOutportBlocks" -) - -type hyperOutportBlocksPool struct { - marshaller marshal.Marshalizer - dataPool DataPool -} - -// NewHyperOutportBlocksPool will create a new instance of hyper outport blocks pool -func NewHyperOutportBlocksPool( - dataPool DataPool, - marshaller marshal.Marshalizer, -) (*hyperOutportBlocksPool, error) { - if check.IfNil(dataPool) { - return nil, ErrNilDataPool - } - if check.IfNil(marshaller) { - return nil, ErrNilMarshaller - } - - return &hyperOutportBlocksPool{ - dataPool: dataPool, - marshaller: marshaller, - }, nil -} - -// UpdateMetaState will triiger meta state update from base data pool -func (bp *hyperOutportBlocksPool) UpdateMetaState(checkpoint *data.BlockCheckpoint) error { - return bp.dataPool.UpdateMetaState(checkpoint) -} - -// Get will trigger data pool get operation -func (bp *hyperOutportBlocksPool) Get(key []byte) ([]byte, error) { - return bp.dataPool.Get(key) -} - -// PutMetaBlock will put the provided meta outport block data to the pool -func (bp *hyperOutportBlocksPool) PutMetaBlock(hash []byte, outportBlock *hyperOutportBlocks.MetaOutportBlock) error { - shardID := outportBlock.ShardID - currentIndex := outportBlock.BlockData.Header.GetRound() - - previousIndex := outportBlock.HighestFinalBlockNonce - isSuccesiveIndex := currentIndex >= previousIndex - if !isSuccesiveIndex { - return fmt.Errorf("%w: new meta index should succesive, previous index %d, new index %d", - ErrFailedToPutBlockDataToPool, previousIndex, currentIndex) - } - - outportBlockBytes, err := bp.marshaller.Marshal(outportBlock) - if err != nil { - return err - } - - return bp.dataPool.PutBlock(hash, outportBlockBytes, currentIndex, shardID) -} - -// PutShardBlock will put the provided shard outport block data to the pool -func (bp *hyperOutportBlocksPool) PutShardBlock(hash []byte, outportBlock *hyperOutportBlocks.ShardOutportBlock) error { - shardID := outportBlock.ShardID - currentIndex := outportBlock.BlockData.Header.GetRound() - - previousIndex := outportBlock.HighestFinalBlockNonce - isSuccesiveIndex := currentIndex >= previousIndex - if !isSuccesiveIndex { - return fmt.Errorf("%w: new shard index should succesive, previous index %d, new index %d", - ErrFailedToPutBlockDataToPool, previousIndex, currentIndex) - } - - outportBlockBytes, err := bp.marshaller.Marshal(outportBlock) - if err != nil { - return err - } - - return bp.dataPool.PutBlock(hash, outportBlockBytes, currentIndex, shardID) -} - -// GetMetaBlock will return the meta outport block data from the pool -func (bp *hyperOutportBlocksPool) GetMetaBlock(hash []byte) (*hyperOutportBlocks.MetaOutportBlock, error) { - marshalledData, err := bp.dataPool.Get(hash) - if err != nil { - return nil, err - } - - metaOutportBlock := &hyperOutportBlocks.MetaOutportBlock{} - err = bp.marshaller.Unmarshal(metaOutportBlock, marshalledData) - if err != nil { - return nil, err - } - - return metaOutportBlock, nil -} - -// GetShardBlock will return the shard outport block data from the pool -func (bp *hyperOutportBlocksPool) GetShardBlock(hash []byte) (*hyperOutportBlocks.ShardOutportBlock, error) { - marshalledData, err := bp.dataPool.Get(hash) - if err != nil { - return nil, err - } - - shardOutportBlock := &hyperOutportBlocks.ShardOutportBlock{} - err = bp.marshaller.Unmarshal(shardOutportBlock, marshalledData) - if err != nil { - return nil, err - } - - return shardOutportBlock, nil -} - -// Close will trigger close on data pool component -func (bp *hyperOutportBlocksPool) Close() error { - return bp.dataPool.Close() -} - -// IsInterfaceNil returns nil if there is no value under the interface -func (bp *hyperOutportBlocksPool) IsInterfaceNil() bool { - return bp == nil -} diff --git a/process/hyperBlocksPool_test.go b/process/hyperBlocksPool_test.go deleted file mode 100644 index 352999e..0000000 --- a/process/hyperBlocksPool_test.go +++ /dev/null @@ -1,156 +0,0 @@ -package process_test - -import ( - "errors" - "testing" - - "github.com/multiversx/mx-chain-ws-connector-firehose-go/data/hyperOutportBlocks" - "github.com/multiversx/mx-chain-ws-connector-firehose-go/process" - "github.com/multiversx/mx-chain-ws-connector-firehose-go/testscommon" - "github.com/stretchr/testify/require" -) - -func TestNewHyperBlocksPool(t *testing.T) { - t.Parallel() - - t.Run("nil data pool", func(t *testing.T) { - t.Parallel() - - hbp, err := process.NewHyperOutportBlocksPool( - nil, - &testscommon.MarshallerMock{}, - ) - require.Nil(t, hbp) - require.Equal(t, process.ErrNilDataPool, err) - }) - - t.Run("should work", func(t *testing.T) { - t.Parallel() - - hbp, err := process.NewHyperOutportBlocksPool( - &testscommon.BlocksPoolStub{}, - nil, - ) - require.Nil(t, hbp) - require.Equal(t, process.ErrNilMarshaller, err) - }) - - t.Run("should work", func(t *testing.T) { - t.Parallel() - - hbp, err := process.NewHyperOutportBlocksPool( - &testscommon.BlocksPoolStub{}, - &testscommon.MarshallerMock{}, - ) - require.Nil(t, err) - require.False(t, hbp.IsInterfaceNil()) - }) -} - -func TestHyperOutportBlocksPool_PutMetaBlock(t *testing.T) { - t.Parallel() - - t.Run("should fail if no succesive index", func(t *testing.T) { - t.Parallel() - - hbp, err := process.NewHyperOutportBlocksPool( - &testscommon.BlocksPoolStub{}, - &testscommon.MarshallerMock{}, - ) - require.Nil(t, err) - - currentIndex := uint64(10) - - outportBlock := &hyperOutportBlocks.MetaOutportBlock{ - ShardID: 1, - BlockData: &hyperOutportBlocks.MetaBlockData{ - Header: &hyperOutportBlocks.MetaHeader{ - Round: currentIndex, - }, - }, - HighestFinalBlockNonce: currentIndex + 1, - } - - err = hbp.PutMetaBlock([]byte("hash1"), outportBlock) - require.True(t, errors.Is(err, process.ErrFailedToPutBlockDataToPool)) - }) - - t.Run("should work", func(t *testing.T) { - t.Parallel() - - hbp, err := process.NewHyperOutportBlocksPool( - &testscommon.BlocksPoolStub{}, - &testscommon.MarshallerMock{}, - ) - require.Nil(t, err) - - currentIndex := uint64(10) - - outportBlock := &hyperOutportBlocks.MetaOutportBlock{ - ShardID: 1, - BlockData: &hyperOutportBlocks.MetaBlockData{ - Header: &hyperOutportBlocks.MetaHeader{ - Round: currentIndex, - }, - }, - HighestFinalBlockNonce: currentIndex - 1, - } - - err = hbp.PutMetaBlock([]byte("hash1"), outportBlock) - require.Nil(t, err) - }) -} - -func TestHyperOutportBlocksPool_PutShardBlock(t *testing.T) { - t.Parallel() - - t.Run("should fail if no succesive index", func(t *testing.T) { - t.Parallel() - - hbp, err := process.NewHyperOutportBlocksPool( - &testscommon.BlocksPoolStub{}, - &testscommon.MarshallerMock{}, - ) - require.Nil(t, err) - - currentIndex := uint64(10) - - outportBlock := &hyperOutportBlocks.ShardOutportBlock{ - ShardID: 1, - BlockData: &hyperOutportBlocks.BlockData{ - Header: &hyperOutportBlocks.Header{ - Round: currentIndex, - }, - }, - HighestFinalBlockNonce: currentIndex + 1, - } - - err = hbp.PutShardBlock([]byte("hash1"), outportBlock) - require.True(t, errors.Is(err, process.ErrFailedToPutBlockDataToPool)) - }) - - t.Run("should work", func(t *testing.T) { - t.Parallel() - - hbp, err := process.NewHyperOutportBlocksPool( - &testscommon.BlocksPoolStub{}, - &testscommon.MarshallerMock{}, - ) - require.Nil(t, err) - - currentIndex := uint64(10) - - outportBlock := &hyperOutportBlocks.ShardOutportBlock{ - ShardID: 1, - BlockData: &hyperOutportBlocks.BlockData{ - Header: &hyperOutportBlocks.Header{ - Round: currentIndex, - }, - }, - HighestFinalBlockNonce: currentIndex - 1, - } - - err = hbp.PutShardBlock([]byte("hash1"), outportBlock) - require.Nil(t, err) - }) -} diff --git a/process/interface.go b/process/interface.go index ec6d13d..a608721 100644 --- a/process/interface.go +++ b/process/interface.go @@ -66,21 +66,22 @@ type DataAggregator interface { type DataPool interface { Put(key []byte, value []byte) error Get(key []byte) ([]byte, error) - PutBlock(hash []byte, value []byte, round uint64, shardID uint32) error + PutBlock(hash []byte, value []byte, index uint64, shardID uint32) error UpdateMetaState(checkpoint *data.BlockCheckpoint) error + GetLastCheckpoint() (*data.BlockCheckpoint, error) Close() error IsInterfaceNil() bool } -// HyperBlocksPool defines the behaviour of a blocks pool handler component that is +// BlocksPool defines the behaviour of a blocks pool handler component that is // able to handle meta and shard outport blocks data -type HyperBlocksPool interface { +type BlocksPool interface { Get(key []byte) ([]byte, error) - PutMetaBlock(hash []byte, outportBlock *hyperOutportBlocks.MetaOutportBlock) error - PutShardBlock(hash []byte, outportBlock *hyperOutportBlocks.ShardOutportBlock) error + PutBlock(hash []byte, outportBlock OutportBlockHandler) error GetMetaBlock(hash []byte) (*hyperOutportBlocks.MetaOutportBlock, error) GetShardBlock(hash []byte) (*hyperOutportBlocks.ShardOutportBlock, error) UpdateMetaState(checkpoint *data.BlockCheckpoint) error + GetLastCheckpoint() (*data.BlockCheckpoint, error) Close() error IsInterfaceNil() bool } @@ -114,4 +115,12 @@ type GRPCBlocksHandler interface { type GRPCServer interface { Start() Close() + IsInterfaceNil() bool +} + +// OutportBlockHandler defines the behaviour of an outport block component used in blocks pool +type OutportBlockHandler interface { + GetHeaderNonce() (uint64, error) + GetHighestFinalBlockNonce() uint64 + GetShardID() uint32 } diff --git a/process/outportBlockConverter.go b/process/outportBlockConverter.go index 3092906..91c8851 100644 --- a/process/outportBlockConverter.go +++ b/process/outportBlockConverter.go @@ -5,6 +5,7 @@ import ( "math/big" "github.com/multiversx/mx-chain-core-go/core" + "github.com/multiversx/mx-chain-core-go/core/check" coreData "github.com/multiversx/mx-chain-core-go/data" "github.com/multiversx/mx-chain-core-go/data/block" "github.com/multiversx/mx-chain-core-go/data/outport" @@ -24,12 +25,19 @@ type outportBlockConverter struct { func NewOutportBlockConverter( gogoMarshaller marshal.Marshalizer, protoMarshaller marshal.Marshalizer, -) *outportBlockConverter { +) (*outportBlockConverter, error) { + if check.IfNil(gogoMarshaller) { + return nil, fmt.Errorf("%w: for gogo proto marshaller", ErrNilMarshaller) + } + if check.IfNil(protoMarshaller) { + return nil, fmt.Errorf("%w: for proto marshaller", ErrNilMarshaller) + } + return &outportBlockConverter{ gogoProtoMarshaller: gogoMarshaller, protoMarshaller: protoMarshaller, bigIntCaster: coreData.BigIntCaster{}, - } + }, nil } // HandleShardOutportBlock will convert an outport.OutportBlock to data.ShardOutportBlock. @@ -44,14 +52,14 @@ func (o *outportBlockConverter) HandleShardOutportBlock(outportBlock *outport.Ou // marshal with gogo, since the outportBlock is gogo protobuf (coming from the node). bytes, err := o.gogoProtoMarshaller.Marshal(outportBlock) if err != nil { - return nil, fmt.Errorf("marshal shard outport block error: %s", err) + return nil, fmt.Errorf("marshal shard outport block error: %w", err) } shardOutportBlock := &hyperOutportBlocks.ShardOutportBlock{} // unmarshall into google protobuf. This is the proto that will be later consumed. err = o.protoMarshaller.Unmarshal(shardOutportBlock, bytes) if err != nil { - return nil, fmt.Errorf("unmarshal shard outport block error: %s", err) + return nil, fmt.Errorf("unmarshal shard outport block error: %w", err) } // ShardHeaderV1 marshals 1 to 1 into *data.ShardOutportBlock. diff --git a/process/outportBlockConverter_test.go b/process/outportBlockConverter_test.go index b5502d9..21d30c2 100644 --- a/process/outportBlockConverter_test.go +++ b/process/outportBlockConverter_test.go @@ -8,7 +8,6 @@ import ( "github.com/multiversx/mx-chain-core-go/data/block" "github.com/multiversx/mx-chain-core-go/data/outport" - "github.com/multiversx/mx-chain-core-go/marshal" "github.com/stretchr/testify/require" data "github.com/multiversx/mx-chain-ws-connector-firehose-go/data/hyperOutportBlocks" @@ -50,27 +49,24 @@ const ( func TestHeaderConverter(t *testing.T) { t.Parallel() - var protoMarshaller = &marshal.GogoProtoMarshalizer{} jsonBytes, err := os.ReadFile(outportBlockHeaderV1JSONPath) require.NoError(t, err, "failed to read test data") - ob := outport.OutportBlock{} - err = json.Unmarshal(jsonBytes, &ob) + ob := &outport.OutportBlock{} + err = json.Unmarshal(jsonBytes, ob) require.NoError(t, err, "failed to unmarshal test block") - converter := process.NewOutportBlockConverter(gogoProtoMarshaller, protoMarshaller) - shardOutportBlock, err := converter.HandleShardOutportBlock(&ob) - if err != nil { - return - } + converter, err := process.NewOutportBlockConverter(gogoProtoMarshaller, protoMarshaller) + require.Nil(t, err) + shardOutportBlock, err := converter.HandleShardOutportBlock(ob) require.NoError(t, err, "failed to marshal to standard outport") - header := block.Header{} - err = protoMarshaller.Unmarshal(&header, ob.BlockData.HeaderBytes) + header := &block.Header{} + err = gogoProtoMarshaller.Unmarshal(header, ob.BlockData.HeaderBytes) require.NoError(t, err, "failed to unmarshall outport block header bytes") - checkHeaderV1(t, &header, shardOutportBlock) - checkFields(t, &ob, shardOutportBlock) + checkHeaderV1(t, header, shardOutportBlock) + checkFields(t, ob, shardOutportBlock) checkBlockData(t, ob.BlockData, shardOutportBlock.BlockData) } @@ -84,11 +80,10 @@ func TestHeaderV2Converter(t *testing.T) { err = json.Unmarshal(jsonBytes, &ob) require.NoError(t, err, "failed to unmarshal test block") - converter := process.NewOutportBlockConverter(gogoProtoMarshaller, protoMarshaller) + converter, err := process.NewOutportBlockConverter(gogoProtoMarshaller, protoMarshaller) + require.Nil(t, err) shardOutportBlock, err := converter.HandleShardOutportBlock(&ob) - if err != nil { - return - } + require.Nil(t, err) require.NoError(t, err, "failed to marshal to standard outport") header := block.HeaderV2{} @@ -110,11 +105,8 @@ func TestMetaBlockConverter(t *testing.T) { err = json.Unmarshal(jsonBytes, &ob) require.NoError(t, err, "failed to unmarshal test block") - converter := process.NewOutportBlockConverter(gogoProtoMarshaller, protoMarshaller) + converter, _ := process.NewOutportBlockConverter(gogoProtoMarshaller, protoMarshaller) metaOutportBlock, err := converter.HandleMetaOutportBlock(&ob) - if err != nil { - return - } require.NoError(t, err, "failed to marshal to standard outport") header := block.MetaBlock{} @@ -534,7 +526,7 @@ func checkBlockData(t *testing.T, blockData *outport.BlockData, getter blockData func mustCastBigInt(t *testing.T, i *big.Int) []byte { t.Helper() - converter := process.NewOutportBlockConverter(gogoProtoMarshaller, protoMarshaller) + converter, _ := process.NewOutportBlockConverter(gogoProtoMarshaller, protoMarshaller) buf, err := converter.CastBigInt(i) require.NoError(t, err, "failed to cast from big.Int") diff --git a/process/pruningStorer.go b/process/pruningStorer.go index 26325aa..51fe246 100644 --- a/process/pruningStorer.go +++ b/process/pruningStorer.go @@ -203,7 +203,7 @@ func (ps *pruningStorer) getFromPersister(key []byte) ([]byte, error) { for idx := 0; idx < len(ps.activePersisters); idx++ { val, err := ps.activePersisters[idx].persister.Get(key) if err != nil { - log.Error(err.Error()) + log.Trace("failed to get key from persister", "key", hex.EncodeToString(key), "error", err) continue } diff --git a/process/pruningStorer_test.go b/process/pruningStorer_test.go index 4d01ed0..25c7a9f 100644 --- a/process/pruningStorer_test.go +++ b/process/pruningStorer_test.go @@ -469,16 +469,16 @@ func TestPruningStorer_Dump(t *testing.T) { _ = ps.Put([]byte("key3"), []byte("value3")) _ = ps.Put([]byte("key4"), []byte("value4")) - persister4 := ps.GetActivePersister(0) - key4Val, err := persister4.Get([]byte("key4")) + persister := ps.GetActivePersister(0) + key4Val, err := persister.Get([]byte("key4")) require.Nil(t, key4Val) require.Error(t, err) err = ps.Dump() require.Nil(t, err) - persister4 = ps.GetActivePersister(0) - key4Val, err = persister4.Get([]byte("key4")) + persister = ps.GetActivePersister(0) + key4Val, err = persister.Get([]byte("key4")) require.NotNil(t, key4Val) require.Nil(t, err) } diff --git a/process/publisherHandler.go b/process/publisherHandler.go index b14f16a..181ee80 100644 --- a/process/publisherHandler.go +++ b/process/publisherHandler.go @@ -12,11 +12,11 @@ import ( ) type publisherHandler struct { - handler HyperBlockPublisher - outportBlocksPool HyperBlocksPool - dataAggregator DataAggregator - retryDuration time.Duration - firstCommitableBlock uint64 + handler HyperBlockPublisher + outportBlocksPool BlocksPool + dataAggregator DataAggregator + retryDuration time.Duration + firstCommitableBlocks map[uint32]uint64 blocksChan chan []byte cancelFunc func() @@ -26,29 +26,29 @@ type publisherHandler struct { // NewPublisherHandler creates a new publisher handler component func NewPublisherHandler( handler HyperBlockPublisher, - outportBlocksPool HyperBlocksPool, + outportBlocksPool BlocksPool, dataAggregator DataAggregator, retryDurationInMiliseconds uint64, - firstCommitableBlock uint64, + firstCommitableBlocks map[uint32]uint64, ) (*publisherHandler, error) { if check.IfNil(handler) { return nil, ErrNilPublisher } if check.IfNil(outportBlocksPool) { - return nil, ErrNilHyperBlocksPool + return nil, ErrNilBlocksPool } if check.IfNil(dataAggregator) { return nil, ErrNilDataAggregator } ph := &publisherHandler{ - handler: handler, - outportBlocksPool: outportBlocksPool, - dataAggregator: dataAggregator, - retryDuration: time.Duration(retryDurationInMiliseconds) * time.Millisecond, - firstCommitableBlock: firstCommitableBlock, - blocksChan: make(chan []byte), - closeChan: make(chan struct{}), + handler: handler, + outportBlocksPool: outportBlocksPool, + dataAggregator: dataAggregator, + retryDuration: time.Duration(retryDurationInMiliseconds) * time.Millisecond, + firstCommitableBlocks: firstCommitableBlocks, + blocksChan: make(chan []byte), + closeChan: make(chan struct{}), } var ctx context.Context @@ -104,23 +104,13 @@ func (ph *publisherHandler) handlerHyperOutportBlock(headerHash []byte) error { return err } - metaRound := metaOutportBlock.BlockData.Header.GetRound() + metaNonce := metaOutportBlock.BlockData.Header.GetNonce() + shardID := metaOutportBlock.GetShardID() - if metaRound < ph.firstCommitableBlock { + if metaNonce < ph.firstCommitableBlocks[shardID] { // do not try to aggregate or publish hyper outport block - // update only blocks pool state - log.Trace("do not commit block", "currentRound", metaRound, "firstCommitableRound", ph.firstCommitableBlock) - - lastCheckpoint := &data.BlockCheckpoint{ - LastRounds: map[uint32]uint64{ - core.MetachainShardId: metaRound, - }, - } - err := ph.outportBlocksPool.UpdateMetaState(lastCheckpoint) - if err != nil { - return err - } + log.Trace("do not commit block", "currentRound", metaNonce, "firstCommitableRound", ph.firstCommitableBlocks) return nil } @@ -153,15 +143,15 @@ func (ph *publisherHandler) getLastRoundsData(hyperOutportBlock *hyperOutportBlo } checkpoint := &data.BlockCheckpoint{ - LastRounds: make(map[uint32]uint64), + LastNonces: make(map[uint32]uint64), } metaBlock := hyperOutportBlock.MetaOutportBlock.BlockData.Header - checkpoint.LastRounds[core.MetachainShardId] = metaBlock.GetRound() + checkpoint.LastNonces[core.MetachainShardId] = metaBlock.GetNonce() for _, outportBlockData := range hyperOutportBlock.NotarizedHeadersOutportData { header := outportBlockData.OutportBlock.BlockData.Header - checkpoint.LastRounds[outportBlockData.OutportBlock.ShardID] = header.GetNonce() + checkpoint.LastNonces[outportBlockData.OutportBlock.ShardID] = header.GetNonce() } return checkpoint, nil @@ -169,13 +159,13 @@ func (ph *publisherHandler) getLastRoundsData(hyperOutportBlock *hyperOutportBlo func checkMetaOutportBlockHeader(metaOutportBlock *hyperOutportBlocks.MetaOutportBlock) error { if metaOutportBlock == nil { - return fmt.Errorf("%w for metaOutportBlock", ErrNilHyperOutportBlock) + return fmt.Errorf("%w for metaOutportBlock", ErrNilOutportBlockData) } if metaOutportBlock.BlockData == nil { - return fmt.Errorf("%w for blockData", ErrNilHyperOutportBlock) + return fmt.Errorf("%w for blockData", ErrNilOutportBlockData) } if metaOutportBlock.BlockData.Header == nil { - return fmt.Errorf("%w for blockData header", ErrNilHyperOutportBlock) + return fmt.Errorf("%w for blockData header", ErrNilOutportBlockData) } return nil diff --git a/process/publisherHandler_test.go b/process/publisherHandler_test.go index 2f3b633..f910a32 100644 --- a/process/publisherHandler_test.go +++ b/process/publisherHandler_test.go @@ -4,6 +4,7 @@ import ( "sync/atomic" "testing" + "github.com/multiversx/mx-chain-core-go/core" "github.com/multiversx/mx-chain-ws-connector-firehose-go/data" "github.com/multiversx/mx-chain-ws-connector-firehose-go/data/hyperOutportBlocks" "github.com/multiversx/mx-chain-ws-connector-firehose-go/process" @@ -12,10 +13,16 @@ import ( ) const ( - defaultRetryDuration = 100 - defaultFirstCommitableBlock = 0 + defaultRetryDuration = 100 ) +var defaultFirstCommitableBlocks = map[uint32]uint64{ + core.MetachainShardId: 0, + 0: 0, + 1: 0, + 2: 0, +} + func TestNewPublisherHandler(t *testing.T) { t.Parallel() @@ -24,10 +31,10 @@ func TestNewPublisherHandler(t *testing.T) { ph, err := process.NewPublisherHandler( nil, - &testscommon.HyperBlocksPoolStub{}, - &testscommon.DataAggregatorStub{}, + &testscommon.HyperBlocksPoolMock{}, + &testscommon.DataAggregatorMock{}, defaultRetryDuration, - defaultFirstCommitableBlock, + defaultFirstCommitableBlocks, ) require.Nil(t, ph) require.Equal(t, process.ErrNilPublisher, err) @@ -39,12 +46,12 @@ func TestNewPublisherHandler(t *testing.T) { ph, err := process.NewPublisherHandler( &testscommon.HyperBlockPublisherStub{}, nil, - &testscommon.DataAggregatorStub{}, + &testscommon.DataAggregatorMock{}, defaultRetryDuration, - defaultFirstCommitableBlock, + defaultFirstCommitableBlocks, ) require.Nil(t, ph) - require.Equal(t, process.ErrNilHyperBlocksPool, err) + require.Equal(t, process.ErrNilBlocksPool, err) }) t.Run("nil data aggregator", func(t *testing.T) { @@ -52,10 +59,10 @@ func TestNewPublisherHandler(t *testing.T) { ph, err := process.NewPublisherHandler( &testscommon.HyperBlockPublisherStub{}, - &testscommon.HyperBlocksPoolStub{}, + &testscommon.HyperBlocksPoolMock{}, nil, defaultRetryDuration, - defaultFirstCommitableBlock, + defaultFirstCommitableBlocks, ) require.Nil(t, ph) require.Equal(t, process.ErrNilDataAggregator, err) @@ -66,10 +73,10 @@ func TestNewPublisherHandler(t *testing.T) { ph, err := process.NewPublisherHandler( &testscommon.HyperBlockPublisherStub{}, - &testscommon.HyperBlocksPoolStub{}, - &testscommon.DataAggregatorStub{}, + &testscommon.HyperBlocksPoolMock{}, + &testscommon.DataAggregatorMock{}, defaultRetryDuration, - defaultFirstCommitableBlock, + defaultFirstCommitableBlocks, ) require.Nil(t, err) require.False(t, ph.IsInterfaceNil()) @@ -84,6 +91,10 @@ func TestPublisherHandler_PublishBlock(t *testing.T) { round := uint64(10) + firstCommitableBlocks := map[uint32]uint64{ + core.MetachainShardId: round + 1, + } + metaOutportBlock := createMetaOutportBlock() metaOutportBlock.BlockData.Header.Round = round hyperOutportBlock := createHyperOutportBlock() @@ -92,7 +103,7 @@ func TestPublisherHandler_PublishBlock(t *testing.T) { updateMetaStateCalled := uint32(0) ph, err := process.NewPublisherHandler( &testscommon.HyperBlockPublisherStub{}, - &testscommon.HyperBlocksPoolStub{ + &testscommon.HyperBlocksPoolMock{ GetMetaBlockCalled: func(hash []byte) (*hyperOutportBlocks.MetaOutportBlock, error) { return metaOutportBlock, nil }, @@ -101,21 +112,21 @@ func TestPublisherHandler_PublishBlock(t *testing.T) { return nil }, }, - &testscommon.DataAggregatorStub{ + &testscommon.DataAggregatorMock{ ProcessHyperBlockCalled: func(outportBlock *hyperOutportBlocks.MetaOutportBlock) (*hyperOutportBlocks.HyperOutportBlock, error) { require.Fail(t, "should not have been called") return nil, nil }, }, defaultRetryDuration, - round+1, + firstCommitableBlocks, ) require.Nil(t, err) err = ph.PublishBlock([]byte("headerHash")) require.Nil(t, err) - require.GreaterOrEqual(t, atomic.LoadUint32(&updateMetaStateCalled), uint32(1)) + require.Equal(t, uint32(0), atomic.LoadUint32(&updateMetaStateCalled)) }) t.Run("should work", func(t *testing.T) { @@ -123,6 +134,10 @@ func TestPublisherHandler_PublishBlock(t *testing.T) { round := uint64(10) + firstCommitableBlocks := map[uint32]uint64{ + core.MetachainShardId: round - 1, + } + metaOutportBlock := createMetaOutportBlock() metaOutportBlock.BlockData.Header.Round = round hyperOutportBlock := createHyperOutportBlock() @@ -131,7 +146,7 @@ func TestPublisherHandler_PublishBlock(t *testing.T) { updateMetaStateCalled := uint32(0) ph, err := process.NewPublisherHandler( &testscommon.HyperBlockPublisherStub{}, - &testscommon.HyperBlocksPoolStub{ + &testscommon.HyperBlocksPoolMock{ GetMetaBlockCalled: func(hash []byte) (*hyperOutportBlocks.MetaOutportBlock, error) { return metaOutportBlock, nil }, @@ -140,13 +155,13 @@ func TestPublisherHandler_PublishBlock(t *testing.T) { return nil }, }, - &testscommon.DataAggregatorStub{ + &testscommon.DataAggregatorMock{ ProcessHyperBlockCalled: func(outportBlock *hyperOutportBlocks.MetaOutportBlock) (*hyperOutportBlocks.HyperOutportBlock, error) { return hyperOutportBlock, nil }, }, defaultRetryDuration, - round-1, + firstCommitableBlocks, ) require.Nil(t, err) @@ -168,10 +183,10 @@ func TestPublisherHandler_Close(t *testing.T) { return nil }, }, - &testscommon.HyperBlocksPoolStub{}, - &testscommon.DataAggregatorStub{}, + &testscommon.HyperBlocksPoolMock{}, + &testscommon.DataAggregatorMock{}, defaultRetryDuration, - defaultFirstCommitableBlock, + defaultFirstCommitableBlocks, ) require.Nil(t, err) diff --git a/server/grpcServer.go b/server/grpcServer.go index cfa87aa..4a16020 100644 --- a/server/grpcServer.go +++ b/server/grpcServer.go @@ -1,6 +1,7 @@ package server import ( + "context" "fmt" "net" @@ -21,22 +22,27 @@ var ( type grpcServer struct { server *grpc.Server config config.GRPCConfig + + cancelFunc context.CancelFunc } // New instantiates the underlying grpc server handling rpc requests. func New(config config.GRPCConfig, blocksHandler process.GRPCBlocksHandler) (*grpcServer, error) { s := grpc.NewServer() - service, err := hyperOutportBlock.NewService(blocksHandler) + ctx, cancelFunc := context.WithCancel(context.Background()) + service, err := hyperOutportBlock.NewService(ctx, blocksHandler) if err != nil { + cancelFunc() return nil, fmt.Errorf("failed to create service: %w", err) } data.RegisterHyperOutportBlockServiceServer(s, service) reflection.Register(s) return &grpcServer{ - server: s, - config: config, + server: s, + config: config, + cancelFunc: cancelFunc, }, nil } @@ -65,5 +71,13 @@ func (s *grpcServer) run() error { // Close will gracefully stop the grpc server. func (s *grpcServer) Close() { + if s.cancelFunc != nil { + s.cancelFunc() + } s.server.GracefulStop() } + +// IsInterfaceNil checks if the underlying server is nil. +func (s *grpcServer) IsInterfaceNil() bool { + return s == nil +} diff --git a/service/hyperOutportBlock/blockService.go b/service/hyperOutportBlock/blockService.go index 0fcd944..17093d6 100644 --- a/service/hyperOutportBlock/blockService.go +++ b/service/hyperOutportBlock/blockService.go @@ -4,48 +4,166 @@ import ( "context" "encoding/hex" "fmt" + "strconv" + "time" + "github.com/golang/protobuf/ptypes/duration" "github.com/multiversx/mx-chain-core-go/core/check" + logger "github.com/multiversx/mx-chain-logger-go" + "google.golang.org/grpc" data "github.com/multiversx/mx-chain-ws-connector-firehose-go/data/hyperOutportBlocks" "github.com/multiversx/mx-chain-ws-connector-firehose-go/process" ) +var ( + log = logger.GetOrCreate("service") +) + +type serverStream interface { + grpc.ServerStream + Send(*data.HyperOutportBlock) error +} + // Service returns blocks based on nonce or hash from cache. type Service struct { + ctx context.Context blocksHandler process.GRPCBlocksHandler + data.UnimplementedHyperOutportBlockServiceServer } // NewService returns a new instance of the hyperOutportBlock service. -func NewService(blocksHandler process.GRPCBlocksHandler) (*Service, error) { +func NewService(ctx context.Context, blocksHandler process.GRPCBlocksHandler) (*Service, error) { if check.IfNil(blocksHandler) { return nil, process.ErrNilOutportBlockData } - return &Service{blocksHandler: blocksHandler}, nil + if ctx == nil { + return nil, process.ErrNilBlockServiceContext + } + + return &Service{ctx: ctx, blocksHandler: blocksHandler}, nil } // GetHyperOutportBlockByHash retrieves the hyperBlock stored in block pool and converts it to standard proto. func (bs *Service) GetHyperOutportBlockByHash(ctx context.Context, req *data.BlockHashRequest) (*data.HyperOutportBlock, error) { - decodeString, err := hex.DecodeString(req.Hash) + return bs.fetchBlockByHash(req.Hash) +} + +// GetHyperOutportBlockByNonce retrieve a block from the nonce. +func (bs *Service) GetHyperOutportBlockByNonce(ctx context.Context, req *data.BlockNonceRequest) (*data.HyperOutportBlock, error) { + return bs.fetchBlockByNonce(req.Nonce) +} + +// HyperOutportBlockStreamByHash will return a stream on which the incoming hyperBlocks are being sent. +func (bs *Service) HyperOutportBlockStreamByHash(req *data.BlockHashStreamRequest, stream data.HyperOutportBlockService_HyperOutportBlockStreamByHashServer) error { + hyperOutportBlock, err := bs.fetchBlockByHash(req.Hash) if err != nil { - return nil, err + return err } - hyperOutportBlock, err := bs.blocksHandler.FetchHyperBlockByHash(decodeString) + + // send the initial hyper outport block + err = stream.Send(hyperOutportBlock) + if err != nil { + return fmt.Errorf("failed to send stream to hyperOutportBlock: %w", err) + } + + // start polling and retrieve the starting nonce + nonce := hyperOutportBlock.MetaOutportBlock.BlockData.Header.Nonce + 1 + err = bs.poll(nonce, stream, req.PollingInterval) + if err != nil { + return fmt.Errorf("failure encountered while polling for hyper blocks: %w", err) + } + + return nil +} + +// HyperOutportBlockStreamByNonce will return a stream on which the incoming hyperBlocks are being sent. +func (bs *Service) HyperOutportBlockStreamByNonce(req *data.BlockNonceStreamRequest, stream data.HyperOutportBlockService_HyperOutportBlockStreamByNonceServer) error { + hyperOutportBlock, err := bs.fetchBlockByNonce(req.Nonce) + if err != nil { + return err + } + + // send the initial hyper outport block + err = stream.Send(hyperOutportBlock) if err != nil { - return nil, fmt.Errorf("failed to retrieve hyperOutportBlock: %v", err) + return fmt.Errorf("failed to send stream to hyperOutportBlock: %w", err) + } + + // start polling and retrieve the starting nonce + nonce := hyperOutportBlock.MetaOutportBlock.BlockData.Header.Nonce + 1 + err = bs.poll(nonce, stream, req.PollingInterval) + if err != nil { + return fmt.Errorf("failure encountered while polling for hyper blocks: %w", err) + } + + return nil +} + +func (bs *Service) fetchBlockByNonce(nonce uint64) (*data.HyperOutportBlock, error) { + hyperOutportBlock, err := bs.blocksHandler.FetchHyperBlockByNonce(nonce) + if err != nil { + return nil, fmt.Errorf("failed to retrieve hyperOutportBlock with nonce '%d': %w", nonce, err) } return hyperOutportBlock, nil } -// GetHyperOutportBlockByNonce retrieve a block from the nonce. -func (bs *Service) GetHyperOutportBlockByNonce(ctx context.Context, req *data.BlockNonceRequest) (*data.HyperOutportBlock, error) { - hyperOutportBlock, err := bs.blocksHandler.FetchHyperBlockByNonce(req.Nonce) +func (bs *Service) fetchBlockByHash(hash string) (*data.HyperOutportBlock, error) { + decodeString, err := hex.DecodeString(hash) + if err != nil { + return nil, fmt.Errorf("failed to decode hex string: %w", err) + } + hyperOutportBlock, err := bs.blocksHandler.FetchHyperBlockByHash(decodeString) if err != nil { - return nil, fmt.Errorf("failed to retrieve hyperOutportBlock: %v", err) + return nil, fmt.Errorf("failed to retrieve hyperOutportBlock with hash %q: %w", hash, err) } return hyperOutportBlock, nil } + +// TODO: add more unit tests. +func (bs *Service) poll(nonce uint64, stream serverStream, pollingInterval *duration.Duration) error { + // parse the provided pollingInterval + timeDuration, err := protoToTimeDuration(pollingInterval) + if err != nil { + return fmt.Errorf("invalid polling interval: %w", err) + } + ticker := time.NewTicker(timeDuration) + + for { + select { + case <-bs.ctx.Done(): + ticker.Stop() + return bs.ctx.Err() + + case <-stream.Context().Done(): + ticker.Stop() + return stream.Context().Err() + + case <-ticker.C: + // fetch the next hyperBlock. + hb, fetchErr := bs.blocksHandler.FetchHyperBlockByNonce(nonce) + if fetchErr != nil { + // if the hyperBlock was not found. try again in the next iteration. + log.Error(fmt.Errorf("failed to retrieve hyper block with nonce '%d': %w", nonce, fetchErr).Error()) + continue + } + + // if found, send it on the stream. + if sendErr := stream.Send(hb); sendErr != nil { + return fmt.Errorf("failed to send hyperOutportBlock: %w", sendErr) + } + + nonce++ + } + } +} + +func protoToTimeDuration(protoDur *duration.Duration) (time.Duration, error) { + seconds := strconv.FormatInt(protoDur.GetSeconds(), 10) // Convert int64 to string + nanos := strconv.FormatInt(int64(protoDur.GetNanos()), 10) // Convert int32 to string + return time.ParseDuration(seconds + "s" + nanos + "ns") +} diff --git a/service/hyperOutportBlock/blockService_test.go b/service/hyperOutportBlock/blockService_test.go index 7d5c334..51aebf8 100644 --- a/service/hyperOutportBlock/blockService_test.go +++ b/service/hyperOutportBlock/blockService_test.go @@ -13,7 +13,7 @@ import ( func TestService_GetHyperOutportBlockByHash(t *testing.T) { t.Parallel() - handler := testscommon.GRPCBlocksHandlerStub{ + handler := testscommon.GRPCBlocksHandlerMock{ FetchHyperBlockByHashCalled: func(hash []byte) (*data.HyperOutportBlock, error) { return &data.HyperOutportBlock{ MetaOutportBlock: &data.MetaOutportBlock{ @@ -24,7 +24,7 @@ func TestService_GetHyperOutportBlockByHash(t *testing.T) { }, nil }, } - bs, err := NewService(&handler) + bs, err := NewService(context.TODO(), &handler) require.NoError(t, err) hash := "437a88d24178dea0060afd74f1282c23b34947cf96adcf71cdfa0f3f7bdcdc73" expectedHash, _ := hex.DecodeString(hash) @@ -35,7 +35,7 @@ func TestService_GetHyperOutportBlockByHash(t *testing.T) { func TestService_GetHyperOutportBlockByNonce(t *testing.T) { t.Parallel() - handler := testscommon.GRPCBlocksHandlerStub{ + handler := testscommon.GRPCBlocksHandlerMock{ FetchHyperBlockByNonceCalled: func(nonce uint64) (*data.HyperOutportBlock, error) { return &data.HyperOutportBlock{ MetaOutportBlock: &data.MetaOutportBlock{ @@ -46,7 +46,7 @@ func TestService_GetHyperOutportBlockByNonce(t *testing.T) { }, nil }, } - bs, err := NewService(&handler) + bs, err := NewService(context.TODO(), &handler) require.NoError(t, err) nonce := uint64(1) outportBlock, err := bs.GetHyperOutportBlockByNonce(context.Background(), &data.BlockNonceRequest{Nonce: nonce}) diff --git a/testscommon/blocksPoolMock.go b/testscommon/blocksPoolMock.go new file mode 100644 index 0000000..7b70ee1 --- /dev/null +++ b/testscommon/blocksPoolMock.go @@ -0,0 +1,76 @@ +package testscommon + +import ( + "github.com/multiversx/mx-chain-ws-connector-firehose-go/data" +) + +// BlocksPoolMock - +type BlocksPoolMock struct { + PutCalled func(hash []byte, data []byte) error + GetCalled func(hash []byte) ([]byte, error) + PutBlockCalled func(hash []byte, value []byte, round uint64, shardID uint32) error + UpdateMetaStateCalled func(checkpoint *data.BlockCheckpoint) error + GetLastCheckpointCalled func() (*data.BlockCheckpoint, error) + CloseCalled func() error +} + +// Put - +func (b *BlocksPoolMock) Put(hash []byte, data []byte) error { + if b.PutCalled != nil { + return b.PutCalled(hash, data) + } + + return nil +} + +// Get - +func (b *BlocksPoolMock) Get(hash []byte) ([]byte, error) { + if b.GetCalled != nil { + return b.GetCalled(hash) + } + + return []byte{}, nil +} + +// PutBlock - +func (b *BlocksPoolMock) PutBlock(hash []byte, value []byte, round uint64, shardID uint32) error { + if b.PutBlockCalled != nil { + return b.PutBlockCalled(hash, value, round, shardID) + } + + return nil +} + +// UpdateMetaState - +func (b *BlocksPoolMock) UpdateMetaState(checkpoint *data.BlockCheckpoint) error { + if b.UpdateMetaStateCalled != nil { + return b.UpdateMetaStateCalled(checkpoint) + } + + return nil +} + +// GetLastCheckpoint - +func (b *BlocksPoolMock) GetLastCheckpoint() (*data.BlockCheckpoint, error) { + if b.GetLastCheckpointCalled != nil { + return b.GetLastCheckpointCalled() + } + + return &data.BlockCheckpoint{ + LastNonces: make(map[uint32]uint64), + }, nil +} + +// Close - +func (b *BlocksPoolMock) Close() error { + if b.CloseCalled != nil { + return b.CloseCalled() + } + + return nil +} + +// IsInterfaceNil - +func (b *BlocksPoolMock) IsInterfaceNil() bool { + return b == nil +} diff --git a/testscommon/blocksPoolStub.go b/testscommon/blocksPoolStub.go deleted file mode 100644 index 59ab0ca..0000000 --- a/testscommon/blocksPoolStub.go +++ /dev/null @@ -1,64 +0,0 @@ -package testscommon - -import ( - "github.com/multiversx/mx-chain-ws-connector-firehose-go/data" -) - -// BlocksPoolStub - -type BlocksPoolStub struct { - PutCalled func(hash []byte, data []byte) error - GetCalled func(hash []byte) ([]byte, error) - PutBlockCalled func(hash []byte, value []byte, round uint64, shardID uint32) error - UpdateMetaStateCalled func(checkpoint *data.BlockCheckpoint) error - CloseCalled func() error -} - -// Put - -func (b *BlocksPoolStub) Put(hash []byte, data []byte) error { - if b.PutCalled != nil { - return b.PutCalled(hash, data) - } - - return nil -} - -// Get - -func (b *BlocksPoolStub) Get(hash []byte) ([]byte, error) { - if b.GetCalled != nil { - return b.GetCalled(hash) - } - - return []byte{}, nil -} - -// PutBlock - -func (b *BlocksPoolStub) PutBlock(hash []byte, value []byte, round uint64, shardID uint32) error { - if b.PutBlockCalled != nil { - return b.PutBlockCalled(hash, value, round, shardID) - } - - return nil -} - -// UpdateMetaState - -func (b *BlocksPoolStub) UpdateMetaState(checkpoint *data.BlockCheckpoint) error { - if b.UpdateMetaStateCalled != nil { - return b.UpdateMetaStateCalled(checkpoint) - } - - return nil -} - -// Close - -func (b *BlocksPoolStub) Close() error { - if b.CloseCalled != nil { - return b.CloseCalled() - } - - return nil -} - -// IsInterfaceNil - -func (b *BlocksPoolStub) IsInterfaceNil() bool { - return b == nil -} diff --git a/testscommon/dataAggregatorStub.go b/testscommon/dataAggregatorMock.go similarity index 73% rename from testscommon/dataAggregatorStub.go rename to testscommon/dataAggregatorMock.go index 3f6d10e..ba962fa 100644 --- a/testscommon/dataAggregatorStub.go +++ b/testscommon/dataAggregatorMock.go @@ -4,13 +4,13 @@ import ( data "github.com/multiversx/mx-chain-ws-connector-firehose-go/data/hyperOutportBlocks" ) -// DataAggregatorStub - -type DataAggregatorStub struct { +// DataAggregatorMock - +type DataAggregatorMock struct { ProcessHyperBlockCalled func(outportBlock *data.MetaOutportBlock) (*data.HyperOutportBlock, error) } // ProcessHyperBlock - -func (d *DataAggregatorStub) ProcessHyperBlock(outportBlock *data.MetaOutportBlock) (*data.HyperOutportBlock, error) { +func (d *DataAggregatorMock) ProcessHyperBlock(outportBlock *data.MetaOutportBlock) (*data.HyperOutportBlock, error) { if d.ProcessHyperBlockCalled != nil { return d.ProcessHyperBlockCalled(outportBlock) } @@ -19,6 +19,6 @@ func (d *DataAggregatorStub) ProcessHyperBlock(outportBlock *data.MetaOutportBlo } // IsInterfaceNil - -func (d *DataAggregatorStub) IsInterfaceNil() bool { +func (d *DataAggregatorMock) IsInterfaceNil() bool { return d == nil } diff --git a/testscommon/grpcBlocksHandlerStub.go b/testscommon/grpcBlocksHandlerMock.go similarity index 74% rename from testscommon/grpcBlocksHandlerStub.go rename to testscommon/grpcBlocksHandlerMock.go index 60bccb7..0d8e6bd 100644 --- a/testscommon/grpcBlocksHandlerStub.go +++ b/testscommon/grpcBlocksHandlerMock.go @@ -4,14 +4,14 @@ import ( data "github.com/multiversx/mx-chain-ws-connector-firehose-go/data/hyperOutportBlocks" ) -// GRPCBlocksHandlerStub - -type GRPCBlocksHandlerStub struct { +// GRPCBlocksHandlerMock - +type GRPCBlocksHandlerMock struct { FetchHyperBlockByHashCalled func(hash []byte) (*data.HyperOutportBlock, error) FetchHyperBlockByNonceCalled func(nonce uint64) (*data.HyperOutportBlock, error) } // FetchHyperBlockByHash - -func (g *GRPCBlocksHandlerStub) FetchHyperBlockByHash(hash []byte) (*data.HyperOutportBlock, error) { +func (g *GRPCBlocksHandlerMock) FetchHyperBlockByHash(hash []byte) (*data.HyperOutportBlock, error) { if g.FetchHyperBlockByHashCalled != nil { return g.FetchHyperBlockByHashCalled(hash) } @@ -19,7 +19,7 @@ func (g *GRPCBlocksHandlerStub) FetchHyperBlockByHash(hash []byte) (*data.HyperO } // FetchHyperBlockByNonce - -func (g *GRPCBlocksHandlerStub) FetchHyperBlockByNonce(nonce uint64) (*data.HyperOutportBlock, error) { +func (g *GRPCBlocksHandlerMock) FetchHyperBlockByNonce(nonce uint64) (*data.HyperOutportBlock, error) { if g.FetchHyperBlockByNonceCalled != nil { return g.FetchHyperBlockByNonceCalled(nonce) } @@ -27,6 +27,6 @@ func (g *GRPCBlocksHandlerStub) FetchHyperBlockByNonce(nonce uint64) (*data.Hype } // IsInterfaceNil - -func (g *GRPCBlocksHandlerStub) IsInterfaceNil() bool { +func (g *GRPCBlocksHandlerMock) IsInterfaceNil() bool { return g == nil } diff --git a/testscommon/hyperBlocksPoolMock.go b/testscommon/hyperBlocksPoolMock.go new file mode 100644 index 0000000..ebef85c --- /dev/null +++ b/testscommon/hyperBlocksPoolMock.go @@ -0,0 +1,88 @@ +package testscommon + +import ( + "github.com/multiversx/mx-chain-ws-connector-firehose-go/data" + "github.com/multiversx/mx-chain-ws-connector-firehose-go/data/hyperOutportBlocks" + "github.com/multiversx/mx-chain-ws-connector-firehose-go/process" +) + +// HyperBlocksPoolMock - +type HyperBlocksPoolMock struct { + GetCalled func(hash []byte) ([]byte, error) + PutBlockCalled func(hash []byte, outportBlock process.OutportBlockHandler) error + GetMetaBlockCalled func(hash []byte) (*hyperOutportBlocks.MetaOutportBlock, error) + GetShardBlockCalled func(hash []byte) (*hyperOutportBlocks.ShardOutportBlock, error) + UpdateMetaStateCalled func(checkpoint *data.BlockCheckpoint) error + GetLastCheckpointCalled func() (*data.BlockCheckpoint, error) + CloseCalled func() error +} + +// Get - +func (b *HyperBlocksPoolMock) Get(hash []byte) ([]byte, error) { + if b.GetCalled != nil { + return b.GetCalled(hash) + } + + return []byte{}, nil +} + +// PutBlock - +func (b *HyperBlocksPoolMock) PutBlock(hash []byte, outportBlock process.OutportBlockHandler) error { + if b.PutBlockCalled != nil { + return b.PutBlockCalled(hash, outportBlock) + } + + return nil +} + +// GetMetaBlock - +func (b *HyperBlocksPoolMock) GetMetaBlock(hash []byte) (*hyperOutportBlocks.MetaOutportBlock, error) { + if b.GetMetaBlockCalled != nil { + return b.GetMetaBlockCalled(hash) + } + + return &hyperOutportBlocks.MetaOutportBlock{}, nil +} + +// GetShardBlock - +func (b *HyperBlocksPoolMock) GetShardBlock(hash []byte) (*hyperOutportBlocks.ShardOutportBlock, error) { + if b.GetShardBlockCalled != nil { + return b.GetShardBlockCalled(hash) + } + + return &hyperOutportBlocks.ShardOutportBlock{}, nil +} + +// UpdateMetaState - +func (b *HyperBlocksPoolMock) UpdateMetaState(checkpoint *data.BlockCheckpoint) error { + if b.UpdateMetaStateCalled != nil { + return b.UpdateMetaStateCalled(checkpoint) + } + + return nil +} + +// GetLastCheckpoint - +func (b *HyperBlocksPoolMock) GetLastCheckpoint() (*data.BlockCheckpoint, error) { + if b.GetLastCheckpointCalled != nil { + return b.GetLastCheckpointCalled() + } + + return &data.BlockCheckpoint{ + LastNonces: make(map[uint32]uint64), + }, nil +} + +// Close - +func (b *HyperBlocksPoolMock) Close() error { + if b.CloseCalled != nil { + return b.CloseCalled() + } + + return nil +} + +// IsInterfaceNil - +func (b *HyperBlocksPoolMock) IsInterfaceNil() bool { + return b == nil +} diff --git a/testscommon/hyperBlocksPoolStub.go b/testscommon/hyperBlocksPoolStub.go deleted file mode 100644 index 52004c4..0000000 --- a/testscommon/hyperBlocksPoolStub.go +++ /dev/null @@ -1,85 +0,0 @@ -package testscommon - -import ( - "github.com/multiversx/mx-chain-ws-connector-firehose-go/data" - "github.com/multiversx/mx-chain-ws-connector-firehose-go/data/hyperOutportBlocks" -) - -// HyperBlocksPoolStub - -type HyperBlocksPoolStub struct { - GetCalled func(hash []byte) ([]byte, error) - PutMetaBlockCalled func(hash []byte, outportBlock *hyperOutportBlocks.MetaOutportBlock) error - PutShardBlockCalled func(hash []byte, outportBlock *hyperOutportBlocks.ShardOutportBlock) error - GetMetaBlockCalled func(hash []byte) (*hyperOutportBlocks.MetaOutportBlock, error) - GetShardBlockCalled func(hash []byte) (*hyperOutportBlocks.ShardOutportBlock, error) - UpdateMetaStateCalled func(checkpoint *data.BlockCheckpoint) error - CloseCalled func() error -} - -// Get - -func (b *HyperBlocksPoolStub) Get(hash []byte) ([]byte, error) { - if b.GetCalled != nil { - return b.GetCalled(hash) - } - - return []byte{}, nil -} - -// PutMetaBlock - -func (b *HyperBlocksPoolStub) PutMetaBlock(hash []byte, outportBlock *hyperOutportBlocks.MetaOutportBlock) error { - if b.PutMetaBlockCalled != nil { - return b.PutMetaBlockCalled(hash, outportBlock) - } - - return nil -} - -// PutShardBlock - -func (b *HyperBlocksPoolStub) PutShardBlock(hash []byte, outportBlock *hyperOutportBlocks.ShardOutportBlock) error { - if b.PutShardBlockCalled != nil { - return b.PutShardBlockCalled(hash, outportBlock) - } - - return nil -} - -// GetMetaBlock - -func (b *HyperBlocksPoolStub) GetMetaBlock(hash []byte) (*hyperOutportBlocks.MetaOutportBlock, error) { - if b.GetMetaBlockCalled != nil { - return b.GetMetaBlockCalled(hash) - } - - return &hyperOutportBlocks.MetaOutportBlock{}, nil -} - -// GetShardBlock - -func (b *HyperBlocksPoolStub) GetShardBlock(hash []byte) (*hyperOutportBlocks.ShardOutportBlock, error) { - if b.GetShardBlockCalled != nil { - return b.GetShardBlockCalled(hash) - } - - return &hyperOutportBlocks.ShardOutportBlock{}, nil -} - -// UpdateMetaState - -func (b *HyperBlocksPoolStub) UpdateMetaState(checkpoint *data.BlockCheckpoint) error { - if b.UpdateMetaStateCalled != nil { - return b.UpdateMetaStateCalled(checkpoint) - } - - return nil -} - -// Close - -func (b *HyperBlocksPoolStub) Close() error { - if b.CloseCalled != nil { - return b.CloseCalled() - } - - return nil -} - -// IsInterfaceNil - -func (b *HyperBlocksPoolStub) IsInterfaceNil() bool { - return b == nil -} diff --git a/testscommon/outportBlockConverterStub.go b/testscommon/outportBlockConverterMock.go similarity index 79% rename from testscommon/outportBlockConverterStub.go rename to testscommon/outportBlockConverterMock.go index 927daee..788c83c 100644 --- a/testscommon/outportBlockConverterStub.go +++ b/testscommon/outportBlockConverterMock.go @@ -5,14 +5,14 @@ import ( "github.com/multiversx/mx-chain-ws-connector-firehose-go/data/hyperOutportBlocks" ) -// OutportBlockConverterStub - -type OutportBlockConverterStub struct { +// OutportBlockConverterMock - +type OutportBlockConverterMock struct { HandleShardOutportBlockCalled func(outportBlock *outport.OutportBlock) (*hyperOutportBlocks.ShardOutportBlock, error) HandleMetaOutportBlockCalled func(outportBlock *outport.OutportBlock) (*hyperOutportBlocks.MetaOutportBlock, error) } // HandleShardOutportBlock - -func (o *OutportBlockConverterStub) HandleShardOutportBlock(outportBlock *outport.OutportBlock) (*hyperOutportBlocks.ShardOutportBlock, error) { +func (o *OutportBlockConverterMock) HandleShardOutportBlock(outportBlock *outport.OutportBlock) (*hyperOutportBlocks.ShardOutportBlock, error) { if o.HandleShardOutportBlockCalled != nil { return o.HandleShardOutportBlockCalled(outportBlock) } @@ -21,7 +21,7 @@ func (o *OutportBlockConverterStub) HandleShardOutportBlock(outportBlock *outpor } // HandleMetaOutportBlock - -func (o *OutportBlockConverterStub) HandleMetaOutportBlock(outportBlock *outport.OutportBlock) (*hyperOutportBlocks.MetaOutportBlock, error) { +func (o *OutportBlockConverterMock) HandleMetaOutportBlock(outportBlock *outport.OutportBlock) (*hyperOutportBlocks.MetaOutportBlock, error) { if o.HandleMetaOutportBlockCalled != nil { return o.HandleMetaOutportBlockCalled(outportBlock) } @@ -30,6 +30,6 @@ func (o *OutportBlockConverterStub) HandleMetaOutportBlock(outportBlock *outport } // IsInterfaceNil - -func (o *OutportBlockConverterStub) IsInterfaceNil() bool { +func (o *OutportBlockConverterMock) IsInterfaceNil() bool { return o == nil } diff --git a/testscommon/pruningStorerStub.go b/testscommon/pruningStorerMock.go similarity index 62% rename from testscommon/pruningStorerStub.go rename to testscommon/pruningStorerMock.go index c874318..a752691 100644 --- a/testscommon/pruningStorerStub.go +++ b/testscommon/pruningStorerMock.go @@ -1,7 +1,7 @@ package testscommon -// PruningStorerStub - -type PruningStorerStub struct { +// PruningStorerMock - +type PruningStorerMock struct { GetCalled func(key []byte) ([]byte, error) PutCalled func(key []byte, data []byte) error PruneCalled func(index uint64) error @@ -10,7 +10,7 @@ type PruningStorerStub struct { } // Get - -func (p *PruningStorerStub) Get(key []byte) ([]byte, error) { +func (p *PruningStorerMock) Get(key []byte) ([]byte, error) { if p.GetCalled != nil { return p.GetCalled(key) } @@ -19,7 +19,7 @@ func (p *PruningStorerStub) Get(key []byte) ([]byte, error) { } // Put - -func (p *PruningStorerStub) Put(key []byte, data []byte) error { +func (p *PruningStorerMock) Put(key []byte, data []byte) error { if p.PutCalled != nil { return p.PutCalled(key, data) } @@ -28,7 +28,7 @@ func (p *PruningStorerStub) Put(key []byte, data []byte) error { } // Prune - -func (p *PruningStorerStub) Prune(index uint64) error { +func (p *PruningStorerMock) Prune(index uint64) error { if p.PruneCalled != nil { return p.PruneCalled(index) } @@ -37,7 +37,7 @@ func (p *PruningStorerStub) Prune(index uint64) error { } // Dump - -func (p *PruningStorerStub) Dump() error { +func (p *PruningStorerMock) Dump() error { if p.DumpCalled != nil { return p.DumpCalled() } @@ -46,7 +46,7 @@ func (p *PruningStorerStub) Dump() error { } // Close - -func (p *PruningStorerStub) Close() error { +func (p *PruningStorerMock) Close() error { if p.CloseCalled != nil { return p.CloseCalled() } @@ -55,11 +55,11 @@ func (p *PruningStorerStub) Close() error { } // Destroy - -func (p *PruningStorerStub) Destroy() error { +func (p *PruningStorerMock) Destroy() error { return nil } // IsInterfaceNil - -func (p *PruningStorerStub) IsInterfaceNil() bool { +func (p *PruningStorerMock) IsInterfaceNil() bool { return p == nil } diff --git a/testscommon/publisherStub.go b/testscommon/publisherMock.go similarity index 63% rename from testscommon/publisherStub.go rename to testscommon/publisherMock.go index 62a6d79..baf2ae6 100644 --- a/testscommon/publisherStub.go +++ b/testscommon/publisherMock.go @@ -1,13 +1,13 @@ package testscommon -// PublisherStub - -type PublisherStub struct { +// PublisherMock - +type PublisherMock struct { PublishBlockCalled func(headerHash []byte) error CloseCalled func() error } // PublishBlock - -func (p *PublisherStub) PublishBlock(headerHash []byte) error { +func (p *PublisherMock) PublishBlock(headerHash []byte) error { if p.PublishBlockCalled != nil { return p.PublishBlockCalled(headerHash) } @@ -16,7 +16,7 @@ func (p *PublisherStub) PublishBlock(headerHash []byte) error { } // Close - -func (p *PublisherStub) Close() error { +func (p *PublisherMock) Close() error { if p.CloseCalled != nil { return p.CloseCalled() } @@ -25,6 +25,6 @@ func (p *PublisherStub) Close() error { } // IsInterfaceNil - -func (p *PublisherStub) IsInterfaceNil() bool { +func (p *PublisherMock) IsInterfaceNil() bool { return p == nil }