diff --git a/client/ud.go b/client/ud.go index 9a40f327cec22289da8a107dfdfca8a47ef454da..3fb308f88d588cdda4e9756f4f3a4539af6d92c6 100644 --- a/client/ud.go +++ b/client/ud.go @@ -10,6 +10,7 @@ package client import ( "github.com/golang/protobuf/ptypes" "github.com/golang/protobuf/ptypes/any" + "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" pb "gitlab.com/elixxir/comms/mixmessages" "gitlab.com/xx_network/comms/connect" @@ -229,3 +230,35 @@ func (c *Comms) SendChannelLeaseRequest(host *connect.Host, message *pb.ChannelL return result, ptypes.UnmarshalAny(resultMsg, result) } + +// SendUsernameValidation is a client to User Discovery send function. This will send a +// mixmessages.UsernameValidationRequest to UD, which UD will validate and send back a +// mixmessages.UsernameValidation. +func (c *Comms) SendUsernameValidation(host *connect.Host, + message *pb.UsernameValidationRequest) (*pb.UsernameValidation, error) { + // Create the Send Function + f := func(conn connect.Connection) (*any.Any, error) { + // Set up the context + ctx, cancel := host.GetMessagingContext() + defer cancel() + + // Send the message + resultMsg, err := pb.NewUDBClient(conn.GetGrpcConn()).ValidateUsername(ctx, message) + if err != nil { + err = errors.New(err.Error()) + return nil, errors.New(err.Error()) + + } + return ptypes.MarshalAny(resultMsg) + } + + // Execute the Send function + jww.TRACE.Printf("Sending Username Validation Message: %+v", message) + responseMessage, err := c.Send(host, f) + if err != nil { + return nil, err + } + + response := &pb.UsernameValidation{} + return response, ptypes.UnmarshalAny(responseMessage, response) +} diff --git a/mixmessages/generateProto.sh b/mixmessages/generateProto.sh new file mode 100644 index 0000000000000000000000000000000000000000..7c27f11458ba6332fc89283998729d0805a45b0b --- /dev/null +++ b/mixmessages/generateProto.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +#/////////////////////////////////////////////////////////////////////////////// +#/ Copyright © 2020 xx network SEZC // +#/ // +#/ Use of this source code is governed by a license that can be found in the // +#/ LICENSE file // +#/////////////////////////////////////////////////////////////////////////////// + +protoc -I. -I../vendor --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative *.proto \ No newline at end of file diff --git a/mixmessages/mixmessages.pb.go b/mixmessages/mixmessages.pb.go index 71874aded2f5c09365662bfaaefa7197d766e367..b2fbc95ecc59d0b01ebf22d3cf892449e8c6faf9 100644 --- a/mixmessages/mixmessages.pb.go +++ b/mixmessages/mixmessages.pb.go @@ -3778,7 +3778,9 @@ type RegisterTrackedIdRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Request *TrackedIntermediaryIdRequest `protobuf:"bytes,1,opt,name=Request,proto3" json:"Request,omitempty"` + Request *TrackedIntermediaryIdRequest `protobuf:"bytes,1,opt,name=Request,proto3" json:"Request,omitempty"` + RegistrationTimestamp int64 `protobuf:"varint,2,opt,name=RegistrationTimestamp,proto3" json:"RegistrationTimestamp,omitempty"` + TransmissionRsaRegistrarSig []byte `protobuf:"bytes,3,opt,name=TransmissionRsaRegistrarSig,proto3" json:"TransmissionRsaRegistrarSig,omitempty"` } func (x *RegisterTrackedIdRequest) Reset() { @@ -3820,6 +3822,20 @@ func (x *RegisterTrackedIdRequest) GetRequest() *TrackedIntermediaryIdRequest { return nil } +func (x *RegisterTrackedIdRequest) GetRegistrationTimestamp() int64 { + if x != nil { + return x.RegistrationTimestamp + } + return 0 +} + +func (x *RegisterTrackedIdRequest) GetTransmissionRsaRegistrarSig() []byte { + if x != nil { + return x.TransmissionRsaRegistrarSig + } + return nil +} + type TrackedIntermediaryIdRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -4347,6 +4363,120 @@ func (x *ChannelLeaseResponse) GetUDLeaseEd25519Signature() []byte { return nil } +// UsernameValidationRequest is the message a user sends to UD to +// for validation that they own their username +type UsernameValidationRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + UserId []byte `protobuf:"bytes,3,opt,name=UserId,proto3" json:"UserId,omitempty"` +} + +func (x *UsernameValidationRequest) Reset() { + *x = UsernameValidationRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_mixmessages_proto_msgTypes[64] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UsernameValidationRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UsernameValidationRequest) ProtoMessage() {} + +func (x *UsernameValidationRequest) ProtoReflect() protoreflect.Message { + mi := &file_mixmessages_proto_msgTypes[64] + 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 UsernameValidationRequest.ProtoReflect.Descriptor instead. +func (*UsernameValidationRequest) Descriptor() ([]byte, []int) { + return file_mixmessages_proto_rawDescGZIP(), []int{64} +} + +func (x *UsernameValidationRequest) GetUserId() []byte { + if x != nil { + return x.UserId + } + return nil +} + +// UsernameValidation is the response to a UsernameValidationRequest. +// This contains a signature from a UD server on the data within the request message. +type UsernameValidation struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Signature []byte `protobuf:"bytes,1,opt,name=Signature,proto3" json:"Signature,omitempty"` + Username string `protobuf:"bytes,2,opt,name=Username,proto3" json:"Username,omitempty"` + ReceptionPublicKeyPem []byte `protobuf:"bytes,3,opt,name=ReceptionPublicKeyPem,proto3" json:"ReceptionPublicKeyPem,omitempty"` +} + +func (x *UsernameValidation) Reset() { + *x = UsernameValidation{} + if protoimpl.UnsafeEnabled { + mi := &file_mixmessages_proto_msgTypes[65] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UsernameValidation) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UsernameValidation) ProtoMessage() {} + +func (x *UsernameValidation) ProtoReflect() protoreflect.Message { + mi := &file_mixmessages_proto_msgTypes[65] + 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 UsernameValidation.ProtoReflect.Descriptor instead. +func (*UsernameValidation) Descriptor() ([]byte, []int) { + return file_mixmessages_proto_rawDescGZIP(), []int{65} +} + +func (x *UsernameValidation) GetSignature() []byte { + if x != nil { + return x.Signature + } + return nil +} + +func (x *UsernameValidation) GetUsername() string { + if x != nil { + return x.Username + } + return "" +} + +func (x *UsernameValidation) GetReceptionPublicKeyPem() []byte { + if x != nil { + return x.ReceptionPublicKeyPem + } + return nil +} + // Holds information for a UDB user registration request type UDBUserRegistration struct { state protoimpl.MessageState @@ -4365,7 +4495,7 @@ type UDBUserRegistration struct { func (x *UDBUserRegistration) Reset() { *x = UDBUserRegistration{} if protoimpl.UnsafeEnabled { - mi := &file_mixmessages_proto_msgTypes[64] + mi := &file_mixmessages_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4378,7 +4508,7 @@ func (x *UDBUserRegistration) String() string { func (*UDBUserRegistration) ProtoMessage() {} func (x *UDBUserRegistration) ProtoReflect() protoreflect.Message { - mi := &file_mixmessages_proto_msgTypes[64] + mi := &file_mixmessages_proto_msgTypes[66] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4391,7 +4521,7 @@ func (x *UDBUserRegistration) ProtoReflect() protoreflect.Message { // Deprecated: Use UDBUserRegistration.ProtoReflect.Descriptor instead. func (*UDBUserRegistration) Descriptor() ([]byte, []int) { - return file_mixmessages_proto_rawDescGZIP(), []int{64} + return file_mixmessages_proto_rawDescGZIP(), []int{66} } func (x *UDBUserRegistration) GetPermissioningSignature() []byte { @@ -4457,7 +4587,7 @@ type Identity struct { func (x *Identity) Reset() { *x = Identity{} if protoimpl.UnsafeEnabled { - mi := &file_mixmessages_proto_msgTypes[65] + mi := &file_mixmessages_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4470,7 +4600,7 @@ func (x *Identity) String() string { func (*Identity) ProtoMessage() {} func (x *Identity) ProtoReflect() protoreflect.Message { - mi := &file_mixmessages_proto_msgTypes[65] + mi := &file_mixmessages_proto_msgTypes[67] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4483,7 +4613,7 @@ func (x *Identity) ProtoReflect() protoreflect.Message { // Deprecated: Use Identity.ProtoReflect.Descriptor instead. func (*Identity) Descriptor() ([]byte, []int) { - return file_mixmessages_proto_rawDescGZIP(), []int{65} + return file_mixmessages_proto_rawDescGZIP(), []int{67} } func (x *Identity) GetUsername() string { @@ -4521,7 +4651,7 @@ type FactRegisterRequest struct { func (x *FactRegisterRequest) Reset() { *x = FactRegisterRequest{} if protoimpl.UnsafeEnabled { - mi := &file_mixmessages_proto_msgTypes[66] + mi := &file_mixmessages_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4534,7 +4664,7 @@ func (x *FactRegisterRequest) String() string { func (*FactRegisterRequest) ProtoMessage() {} func (x *FactRegisterRequest) ProtoReflect() protoreflect.Message { - mi := &file_mixmessages_proto_msgTypes[66] + mi := &file_mixmessages_proto_msgTypes[68] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4547,7 +4677,7 @@ func (x *FactRegisterRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use FactRegisterRequest.ProtoReflect.Descriptor instead. func (*FactRegisterRequest) Descriptor() ([]byte, []int) { - return file_mixmessages_proto_rawDescGZIP(), []int{66} + return file_mixmessages_proto_rawDescGZIP(), []int{68} } func (x *FactRegisterRequest) GetUID() []byte { @@ -4584,7 +4714,7 @@ type Fact struct { func (x *Fact) Reset() { *x = Fact{} if protoimpl.UnsafeEnabled { - mi := &file_mixmessages_proto_msgTypes[67] + mi := &file_mixmessages_proto_msgTypes[69] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4597,7 +4727,7 @@ func (x *Fact) String() string { func (*Fact) ProtoMessage() {} func (x *Fact) ProtoReflect() protoreflect.Message { - mi := &file_mixmessages_proto_msgTypes[67] + mi := &file_mixmessages_proto_msgTypes[69] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4610,7 +4740,7 @@ func (x *Fact) ProtoReflect() protoreflect.Message { // Deprecated: Use Fact.ProtoReflect.Descriptor instead. func (*Fact) Descriptor() ([]byte, []int) { - return file_mixmessages_proto_rawDescGZIP(), []int{67} + return file_mixmessages_proto_rawDescGZIP(), []int{69} } func (x *Fact) GetFact() string { @@ -4639,7 +4769,7 @@ type FactRegisterResponse struct { func (x *FactRegisterResponse) Reset() { *x = FactRegisterResponse{} if protoimpl.UnsafeEnabled { - mi := &file_mixmessages_proto_msgTypes[68] + mi := &file_mixmessages_proto_msgTypes[70] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4652,7 +4782,7 @@ func (x *FactRegisterResponse) String() string { func (*FactRegisterResponse) ProtoMessage() {} func (x *FactRegisterResponse) ProtoReflect() protoreflect.Message { - mi := &file_mixmessages_proto_msgTypes[68] + mi := &file_mixmessages_proto_msgTypes[70] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4665,7 +4795,7 @@ func (x *FactRegisterResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use FactRegisterResponse.ProtoReflect.Descriptor instead. func (*FactRegisterResponse) Descriptor() ([]byte, []int) { - return file_mixmessages_proto_rawDescGZIP(), []int{68} + return file_mixmessages_proto_rawDescGZIP(), []int{70} } func (x *FactRegisterResponse) GetConfirmationID() string { @@ -4688,7 +4818,7 @@ type FactConfirmRequest struct { func (x *FactConfirmRequest) Reset() { *x = FactConfirmRequest{} if protoimpl.UnsafeEnabled { - mi := &file_mixmessages_proto_msgTypes[69] + mi := &file_mixmessages_proto_msgTypes[71] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4701,7 +4831,7 @@ func (x *FactConfirmRequest) String() string { func (*FactConfirmRequest) ProtoMessage() {} func (x *FactConfirmRequest) ProtoReflect() protoreflect.Message { - mi := &file_mixmessages_proto_msgTypes[69] + mi := &file_mixmessages_proto_msgTypes[71] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4714,7 +4844,7 @@ func (x *FactConfirmRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use FactConfirmRequest.ProtoReflect.Descriptor instead. func (*FactConfirmRequest) Descriptor() ([]byte, []int) { - return file_mixmessages_proto_rawDescGZIP(), []int{69} + return file_mixmessages_proto_rawDescGZIP(), []int{71} } func (x *FactConfirmRequest) GetConfirmationID() string { @@ -4745,7 +4875,7 @@ type FactRemovalRequest struct { func (x *FactRemovalRequest) Reset() { *x = FactRemovalRequest{} if protoimpl.UnsafeEnabled { - mi := &file_mixmessages_proto_msgTypes[70] + mi := &file_mixmessages_proto_msgTypes[72] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4758,7 +4888,7 @@ func (x *FactRemovalRequest) String() string { func (*FactRemovalRequest) ProtoMessage() {} func (x *FactRemovalRequest) ProtoReflect() protoreflect.Message { - mi := &file_mixmessages_proto_msgTypes[70] + mi := &file_mixmessages_proto_msgTypes[72] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4771,7 +4901,7 @@ func (x *FactRemovalRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use FactRemovalRequest.ProtoReflect.Descriptor instead. func (*FactRemovalRequest) Descriptor() ([]byte, []int) { - return file_mixmessages_proto_rawDescGZIP(), []int{70} + return file_mixmessages_proto_rawDescGZIP(), []int{72} } func (x *FactRemovalRequest) GetUID() []byte { @@ -4807,7 +4937,7 @@ type StrAddress struct { func (x *StrAddress) Reset() { *x = StrAddress{} if protoimpl.UnsafeEnabled { - mi := &file_mixmessages_proto_msgTypes[71] + mi := &file_mixmessages_proto_msgTypes[73] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4820,7 +4950,7 @@ func (x *StrAddress) String() string { func (*StrAddress) ProtoMessage() {} func (x *StrAddress) ProtoReflect() protoreflect.Message { - mi := &file_mixmessages_proto_msgTypes[71] + mi := &file_mixmessages_proto_msgTypes[73] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4833,7 +4963,7 @@ func (x *StrAddress) ProtoReflect() protoreflect.Message { // Deprecated: Use StrAddress.ProtoReflect.Descriptor instead. func (*StrAddress) Descriptor() ([]byte, []int) { - return file_mixmessages_proto_rawDescGZIP(), []int{71} + return file_mixmessages_proto_rawDescGZIP(), []int{73} } func (x *StrAddress) GetAddress() string { @@ -4866,7 +4996,7 @@ type RoundInfo struct { func (x *RoundInfo) Reset() { *x = RoundInfo{} if protoimpl.UnsafeEnabled { - mi := &file_mixmessages_proto_msgTypes[72] + mi := &file_mixmessages_proto_msgTypes[74] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4879,7 +5009,7 @@ func (x *RoundInfo) String() string { func (*RoundInfo) ProtoMessage() {} func (x *RoundInfo) ProtoReflect() protoreflect.Message { - mi := &file_mixmessages_proto_msgTypes[72] + mi := &file_mixmessages_proto_msgTypes[74] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4892,7 +5022,7 @@ func (x *RoundInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use RoundInfo.ProtoReflect.Descriptor instead. func (*RoundInfo) Descriptor() ([]byte, []int) { - return file_mixmessages_proto_rawDescGZIP(), []int{72} + return file_mixmessages_proto_rawDescGZIP(), []int{74} } func (x *RoundInfo) GetID() uint64 { @@ -4995,7 +5125,7 @@ type RoundError struct { func (x *RoundError) Reset() { *x = RoundError{} if protoimpl.UnsafeEnabled { - mi := &file_mixmessages_proto_msgTypes[73] + mi := &file_mixmessages_proto_msgTypes[75] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5008,7 +5138,7 @@ func (x *RoundError) String() string { func (*RoundError) ProtoMessage() {} func (x *RoundError) ProtoReflect() protoreflect.Message { - mi := &file_mixmessages_proto_msgTypes[73] + mi := &file_mixmessages_proto_msgTypes[75] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5021,7 +5151,7 @@ func (x *RoundError) ProtoReflect() protoreflect.Message { // Deprecated: Use RoundError.ProtoReflect.Descriptor instead. func (*RoundError) Descriptor() ([]byte, []int) { - return file_mixmessages_proto_rawDescGZIP(), []int{73} + return file_mixmessages_proto_rawDescGZIP(), []int{75} } func (x *RoundError) GetId() uint64 { @@ -5061,7 +5191,7 @@ type EABCredentialRequest struct { func (x *EABCredentialRequest) Reset() { *x = EABCredentialRequest{} if protoimpl.UnsafeEnabled { - mi := &file_mixmessages_proto_msgTypes[74] + mi := &file_mixmessages_proto_msgTypes[76] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5074,7 +5204,7 @@ func (x *EABCredentialRequest) String() string { func (*EABCredentialRequest) ProtoMessage() {} func (x *EABCredentialRequest) ProtoReflect() protoreflect.Message { - mi := &file_mixmessages_proto_msgTypes[74] + mi := &file_mixmessages_proto_msgTypes[76] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5087,7 +5217,7 @@ func (x *EABCredentialRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use EABCredentialRequest.ProtoReflect.Descriptor instead. func (*EABCredentialRequest) Descriptor() ([]byte, []int) { - return file_mixmessages_proto_rawDescGZIP(), []int{74} + return file_mixmessages_proto_rawDescGZIP(), []int{76} } type EABCredentialResponse struct { @@ -5102,7 +5232,7 @@ type EABCredentialResponse struct { func (x *EABCredentialResponse) Reset() { *x = EABCredentialResponse{} if protoimpl.UnsafeEnabled { - mi := &file_mixmessages_proto_msgTypes[75] + mi := &file_mixmessages_proto_msgTypes[77] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5115,7 +5245,7 @@ func (x *EABCredentialResponse) String() string { func (*EABCredentialResponse) ProtoMessage() {} func (x *EABCredentialResponse) ProtoReflect() protoreflect.Message { - mi := &file_mixmessages_proto_msgTypes[75] + mi := &file_mixmessages_proto_msgTypes[77] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5128,7 +5258,7 @@ func (x *EABCredentialResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use EABCredentialResponse.ProtoReflect.Descriptor instead. func (*EABCredentialResponse) Descriptor() ([]byte, []int) { - return file_mixmessages_proto_rawDescGZIP(), []int{75} + return file_mixmessages_proto_rawDescGZIP(), []int{77} } func (x *EABCredentialResponse) GetKeyId() string { @@ -5156,23 +5286,439 @@ type AuthorizerCertRequest struct { Signature []byte `protobuf:"bytes,4,opt,name=Signature,proto3" json:"Signature,omitempty"` } -func (x *AuthorizerCertRequest) Reset() { - *x = AuthorizerCertRequest{} +func (x *AuthorizerCertRequest) Reset() { + *x = AuthorizerCertRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_mixmessages_proto_msgTypes[78] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AuthorizerCertRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AuthorizerCertRequest) ProtoMessage() {} + +func (x *AuthorizerCertRequest) ProtoReflect() protoreflect.Message { + mi := &file_mixmessages_proto_msgTypes[78] + 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 AuthorizerCertRequest.ProtoReflect.Descriptor instead. +func (*AuthorizerCertRequest) Descriptor() ([]byte, []int) { + return file_mixmessages_proto_rawDescGZIP(), []int{78} +} + +func (x *AuthorizerCertRequest) GetGwID() []byte { + if x != nil { + return x.GwID + } + return nil +} + +func (x *AuthorizerCertRequest) GetTimestamp() int64 { + if x != nil { + return x.Timestamp + } + return 0 +} + +func (x *AuthorizerCertRequest) GetACMEToken() string { + if x != nil { + return x.ACMEToken + } + return "" +} + +func (x *AuthorizerCertRequest) GetSignature() []byte { + if x != nil { + return x.Signature + } + return nil +} + +type AuthorizerAuth struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + NodeID []byte `protobuf:"bytes,1,opt,name=NodeID,proto3" json:"NodeID,omitempty"` + Salt []byte `protobuf:"bytes,2,opt,name=Salt,proto3" json:"Salt,omitempty"` + PubkeyPem []byte `protobuf:"bytes,3,opt,name=PubkeyPem,proto3" json:"PubkeyPem,omitempty"` + TimeStamp int64 `protobuf:"varint,4,opt,name=TimeStamp,proto3" json:"TimeStamp,omitempty"` + Signature []byte `protobuf:"bytes,5,opt,name=signature,proto3" json:"signature,omitempty"` +} + +func (x *AuthorizerAuth) Reset() { + *x = AuthorizerAuth{} + if protoimpl.UnsafeEnabled { + mi := &file_mixmessages_proto_msgTypes[79] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AuthorizerAuth) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AuthorizerAuth) ProtoMessage() {} + +func (x *AuthorizerAuth) ProtoReflect() protoreflect.Message { + mi := &file_mixmessages_proto_msgTypes[79] + 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 AuthorizerAuth.ProtoReflect.Descriptor instead. +func (*AuthorizerAuth) Descriptor() ([]byte, []int) { + return file_mixmessages_proto_rawDescGZIP(), []int{79} +} + +func (x *AuthorizerAuth) GetNodeID() []byte { + if x != nil { + return x.NodeID + } + return nil +} + +func (x *AuthorizerAuth) GetSalt() []byte { + if x != nil { + return x.Salt + } + return nil +} + +func (x *AuthorizerAuth) GetPubkeyPem() []byte { + if x != nil { + return x.PubkeyPem + } + return nil +} + +func (x *AuthorizerAuth) GetTimeStamp() int64 { + if x != nil { + return x.TimeStamp + } + return 0 +} + +func (x *AuthorizerAuth) GetSignature() []byte { + if x != nil { + return x.Signature + } + return nil +} + +type RsAuthenticationRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Username string `protobuf:"bytes,1,opt,name=Username,proto3" json:"Username,omitempty"` + PasswordHash []byte `protobuf:"bytes,2,opt,name=PasswordHash,proto3" json:"PasswordHash,omitempty"` + Salt []byte `protobuf:"bytes,3,opt,name=Salt,proto3" json:"Salt,omitempty"` +} + +func (x *RsAuthenticationRequest) Reset() { + *x = RsAuthenticationRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_mixmessages_proto_msgTypes[80] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RsAuthenticationRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RsAuthenticationRequest) ProtoMessage() {} + +func (x *RsAuthenticationRequest) ProtoReflect() protoreflect.Message { + mi := &file_mixmessages_proto_msgTypes[80] + 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 RsAuthenticationRequest.ProtoReflect.Descriptor instead. +func (*RsAuthenticationRequest) Descriptor() ([]byte, []int) { + return file_mixmessages_proto_rawDescGZIP(), []int{80} +} + +func (x *RsAuthenticationRequest) GetUsername() string { + if x != nil { + return x.Username + } + return "" +} + +func (x *RsAuthenticationRequest) GetPasswordHash() []byte { + if x != nil { + return x.PasswordHash + } + return nil +} + +func (x *RsAuthenticationRequest) GetSalt() []byte { + if x != nil { + return x.Salt + } + return nil +} + +type RsAuthenticationResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Token []byte `protobuf:"bytes,1,opt,name=Token,proto3" json:"Token,omitempty"` + ExpiresAt int64 `protobuf:"varint,2,opt,name=ExpiresAt,proto3" json:"ExpiresAt,omitempty"` +} + +func (x *RsAuthenticationResponse) Reset() { + *x = RsAuthenticationResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_mixmessages_proto_msgTypes[81] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RsAuthenticationResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RsAuthenticationResponse) ProtoMessage() {} + +func (x *RsAuthenticationResponse) ProtoReflect() protoreflect.Message { + mi := &file_mixmessages_proto_msgTypes[81] + 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 RsAuthenticationResponse.ProtoReflect.Descriptor instead. +func (*RsAuthenticationResponse) Descriptor() ([]byte, []int) { + return file_mixmessages_proto_rawDescGZIP(), []int{81} +} + +func (x *RsAuthenticationResponse) GetToken() []byte { + if x != nil { + return x.Token + } + return nil +} + +func (x *RsAuthenticationResponse) GetExpiresAt() int64 { + if x != nil { + return x.ExpiresAt + } + return 0 +} + +type RsReadRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Path string `protobuf:"bytes,1,opt,name=Path,proto3" json:"Path,omitempty"` + Token []byte `protobuf:"bytes,2,opt,name=Token,proto3" json:"Token,omitempty"` +} + +func (x *RsReadRequest) Reset() { + *x = RsReadRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_mixmessages_proto_msgTypes[82] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RsReadRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RsReadRequest) ProtoMessage() {} + +func (x *RsReadRequest) ProtoReflect() protoreflect.Message { + mi := &file_mixmessages_proto_msgTypes[82] + 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 RsReadRequest.ProtoReflect.Descriptor instead. +func (*RsReadRequest) Descriptor() ([]byte, []int) { + return file_mixmessages_proto_rawDescGZIP(), []int{82} +} + +func (x *RsReadRequest) GetPath() string { + if x != nil { + return x.Path + } + return "" +} + +func (x *RsReadRequest) GetToken() []byte { + if x != nil { + return x.Token + } + return nil +} + +type RsLastWriteRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Token []byte `protobuf:"bytes,1,opt,name=Token,proto3" json:"Token,omitempty"` +} + +func (x *RsLastWriteRequest) Reset() { + *x = RsLastWriteRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_mixmessages_proto_msgTypes[83] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RsLastWriteRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RsLastWriteRequest) ProtoMessage() {} + +func (x *RsLastWriteRequest) ProtoReflect() protoreflect.Message { + mi := &file_mixmessages_proto_msgTypes[83] + 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 RsLastWriteRequest.ProtoReflect.Descriptor instead. +func (*RsLastWriteRequest) Descriptor() ([]byte, []int) { + return file_mixmessages_proto_rawDescGZIP(), []int{83} +} + +func (x *RsLastWriteRequest) GetToken() []byte { + if x != nil { + return x.Token + } + return nil +} + +type RsReadResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Data []byte `protobuf:"bytes,1,opt,name=Data,proto3" json:"Data,omitempty"` +} + +func (x *RsReadResponse) Reset() { + *x = RsReadResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_mixmessages_proto_msgTypes[84] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RsReadResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RsReadResponse) ProtoMessage() {} + +func (x *RsReadResponse) ProtoReflect() protoreflect.Message { + mi := &file_mixmessages_proto_msgTypes[84] + 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 RsReadResponse.ProtoReflect.Descriptor instead. +func (*RsReadResponse) Descriptor() ([]byte, []int) { + return file_mixmessages_proto_rawDescGZIP(), []int{84} +} + +func (x *RsReadResponse) GetData() []byte { + if x != nil { + return x.Data + } + return nil +} + +type RsWriteRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Path string `protobuf:"bytes,1,opt,name=Path,proto3" json:"Path,omitempty"` + Data []byte `protobuf:"bytes,2,opt,name=Data,proto3" json:"Data,omitempty"` + Token []byte `protobuf:"bytes,3,opt,name=Token,proto3" json:"Token,omitempty"` +} + +func (x *RsWriteRequest) Reset() { + *x = RsWriteRequest{} if protoimpl.UnsafeEnabled { - mi := &file_mixmessages_proto_msgTypes[76] + mi := &file_mixmessages_proto_msgTypes[85] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *AuthorizerCertRequest) String() string { +func (x *RsWriteRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*AuthorizerCertRequest) ProtoMessage() {} +func (*RsWriteRequest) ProtoMessage() {} -func (x *AuthorizerCertRequest) ProtoReflect() protoreflect.Message { - mi := &file_mixmessages_proto_msgTypes[76] +func (x *RsWriteRequest) ProtoReflect() protoreflect.Message { + mi := &file_mixmessages_proto_msgTypes[85] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5183,68 +5729,57 @@ func (x *AuthorizerCertRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use AuthorizerCertRequest.ProtoReflect.Descriptor instead. -func (*AuthorizerCertRequest) Descriptor() ([]byte, []int) { - return file_mixmessages_proto_rawDescGZIP(), []int{76} -} - -func (x *AuthorizerCertRequest) GetGwID() []byte { - if x != nil { - return x.GwID - } - return nil +// Deprecated: Use RsWriteRequest.ProtoReflect.Descriptor instead. +func (*RsWriteRequest) Descriptor() ([]byte, []int) { + return file_mixmessages_proto_rawDescGZIP(), []int{85} } -func (x *AuthorizerCertRequest) GetTimestamp() int64 { +func (x *RsWriteRequest) GetPath() string { if x != nil { - return x.Timestamp + return x.Path } - return 0 + return "" } -func (x *AuthorizerCertRequest) GetACMEToken() string { +func (x *RsWriteRequest) GetData() []byte { if x != nil { - return x.ACMEToken + return x.Data } - return "" + return nil } -func (x *AuthorizerCertRequest) GetSignature() []byte { +func (x *RsWriteRequest) GetToken() []byte { if x != nil { - return x.Signature + return x.Token } return nil } -type AuthorizerAuth struct { +type RsReadDirResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - NodeID []byte `protobuf:"bytes,1,opt,name=NodeID,proto3" json:"NodeID,omitempty"` - Salt []byte `protobuf:"bytes,2,opt,name=Salt,proto3" json:"Salt,omitempty"` - PubkeyPem []byte `protobuf:"bytes,3,opt,name=PubkeyPem,proto3" json:"PubkeyPem,omitempty"` - TimeStamp int64 `protobuf:"varint,4,opt,name=TimeStamp,proto3" json:"TimeStamp,omitempty"` - Signature []byte `protobuf:"bytes,5,opt,name=signature,proto3" json:"signature,omitempty"` + Data []string `protobuf:"bytes,1,rep,name=Data,proto3" json:"Data,omitempty"` } -func (x *AuthorizerAuth) Reset() { - *x = AuthorizerAuth{} +func (x *RsReadDirResponse) Reset() { + *x = RsReadDirResponse{} if protoimpl.UnsafeEnabled { - mi := &file_mixmessages_proto_msgTypes[77] + mi := &file_mixmessages_proto_msgTypes[86] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *AuthorizerAuth) String() string { +func (x *RsReadDirResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*AuthorizerAuth) ProtoMessage() {} +func (*RsReadDirResponse) ProtoMessage() {} -func (x *AuthorizerAuth) ProtoReflect() protoreflect.Message { - mi := &file_mixmessages_proto_msgTypes[77] +func (x *RsReadDirResponse) ProtoReflect() protoreflect.Message { + mi := &file_mixmessages_proto_msgTypes[86] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5255,44 +5790,63 @@ func (x *AuthorizerAuth) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use AuthorizerAuth.ProtoReflect.Descriptor instead. -func (*AuthorizerAuth) Descriptor() ([]byte, []int) { - return file_mixmessages_proto_rawDescGZIP(), []int{77} +// Deprecated: Use RsReadDirResponse.ProtoReflect.Descriptor instead. +func (*RsReadDirResponse) Descriptor() ([]byte, []int) { + return file_mixmessages_proto_rawDescGZIP(), []int{86} } -func (x *AuthorizerAuth) GetNodeID() []byte { +func (x *RsReadDirResponse) GetData() []string { if x != nil { - return x.NodeID + return x.Data } return nil } -func (x *AuthorizerAuth) GetSalt() []byte { - if x != nil { - return x.Salt - } - return nil +type RsTimestampResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Timestamp int64 `protobuf:"varint,1,opt,name=Timestamp,proto3" json:"Timestamp,omitempty"` } -func (x *AuthorizerAuth) GetPubkeyPem() []byte { - if x != nil { - return x.PubkeyPem +func (x *RsTimestampResponse) Reset() { + *x = RsTimestampResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_mixmessages_proto_msgTypes[87] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return nil } -func (x *AuthorizerAuth) GetTimeStamp() int64 { - if x != nil { - return x.TimeStamp +func (x *RsTimestampResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RsTimestampResponse) ProtoMessage() {} + +func (x *RsTimestampResponse) ProtoReflect() protoreflect.Message { + mi := &file_mixmessages_proto_msgTypes[87] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return 0 + return mi.MessageOf(x) } -func (x *AuthorizerAuth) GetSignature() []byte { +// Deprecated: Use RsTimestampResponse.ProtoReflect.Descriptor instead. +func (*RsTimestampResponse) Descriptor() ([]byte, []int) { + return file_mixmessages_proto_rawDescGZIP(), []int{87} +} + +func (x *RsTimestampResponse) GetTimestamp() int64 { if x != nil { - return x.Signature + return x.Timestamp } - return nil + return 0 } var File_mixmessages_proto protoreflect.FileDescriptor @@ -5843,463 +6397,548 @@ var file_mixmessages_proto_rawDesc = []byte{ 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x72, 0x79, 0x49, 0x64, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x5f, 0x0a, 0x18, - 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x49, - 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x43, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x6d, 0x69, 0x78, 0x6d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x49, - 0x6e, 0x74, 0x65, 0x72, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x72, 0x79, 0x49, 0x64, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xce, 0x01, - 0x0a, 0x1c, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6d, 0x65, - 0x64, 0x69, 0x61, 0x72, 0x79, 0x49, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x34, - 0x0a, 0x15, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6d, 0x65, - 0x64, 0x69, 0x61, 0x72, 0x79, 0x49, 0x44, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x15, 0x54, - 0x72, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6d, 0x65, 0x64, 0x69, 0x61, - 0x72, 0x79, 0x49, 0x44, 0x12, 0x2e, 0x0a, 0x12, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x73, 0x61, 0x50, 0x65, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x12, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x73, - 0x61, 0x50, 0x65, 0x6d, 0x12, 0x2a, 0x0a, 0x10, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x09, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0xcd, - 0x02, 0x0a, 0x1b, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, - 0x0a, 0x05, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x54, - 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x26, 0x0a, 0x0e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6d, 0x65, 0x64, - 0x69, 0x61, 0x72, 0x79, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x49, 0x6e, - 0x74, 0x65, 0x72, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x72, 0x79, 0x49, 0x64, 0x12, 0x28, 0x0a, 0x0f, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x73, 0x61, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x52, 0x73, 0x61, 0x12, 0x2a, 0x0a, 0x10, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x6d, - 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x61, 0x6c, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x10, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x61, - 0x6c, 0x74, 0x12, 0x2e, 0x0a, 0x12, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x52, 0x73, 0x61, 0x53, 0x69, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x12, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x73, 0x61, 0x53, - 0x69, 0x67, 0x12, 0x34, 0x0a, 0x15, 0x49, 0x49, 0x44, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x73, 0x61, 0x53, 0x69, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x15, 0x49, 0x49, 0x44, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x52, 0x73, 0x61, 0x53, 0x69, 0x67, 0x12, 0x34, 0x0a, 0x15, 0x52, 0x65, 0x67, 0x69, - 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x15, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x7d, - 0x0a, 0x1d, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x6e, - 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x26, 0x0a, 0x0e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x72, 0x79, 0x49, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6d, 0x65, - 0x64, 0x69, 0x61, 0x72, 0x79, 0x49, 0x64, 0x12, 0x34, 0x0a, 0x15, 0x49, 0x49, 0x44, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x73, 0x61, 0x53, 0x69, 0x67, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x15, 0x49, 0x49, 0x44, 0x54, 0x72, 0x61, 0x6e, 0x73, - 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x73, 0x61, 0x53, 0x69, 0x67, 0x22, 0x1e, 0x0a, - 0x0a, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x49, - 0x44, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x03, 0x49, 0x44, 0x73, 0x22, 0x72, 0x0a, - 0x11, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x61, 0x74, - 0x63, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x49, 0x44, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x07, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x49, 0x44, 0x12, 0x43, 0x0a, 0x0d, - 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x73, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, - 0x74, 0x61, 0x52, 0x0d, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x22, 0x76, 0x0a, 0x10, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, - 0x61, 0x6c, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x65, 0x70, 0x68, 0x65, - 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x49, 0x44, 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, - 0x69, 0x74, 0x79, 0x46, 0x50, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x69, 0x64, 0x65, - 0x6e, 0x74, 0x69, 0x74, 0x79, 0x46, 0x50, 0x12, 0x20, 0x0a, 0x0b, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x48, 0x61, 0x73, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x6d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x61, 0x73, 0x68, 0x22, 0xb1, 0x01, 0x0a, 0x13, 0x43, 0x68, - 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x16, 0x0a, 0x06, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x06, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x12, 0x2c, 0x0a, 0x11, 0x55, 0x73, 0x65, - 0x72, 0x45, 0x64, 0x32, 0x35, 0x35, 0x31, 0x39, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x11, 0x55, 0x73, 0x65, 0x72, 0x45, 0x64, 0x32, 0x35, 0x35, 0x31, - 0x39, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x36, 0x0a, 0x16, 0x55, 0x73, 0x65, 0x72, 0x50, 0x75, 0x62, - 0x4b, 0x65, 0x79, 0x52, 0x53, 0x41, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x16, 0x55, 0x73, 0x65, 0x72, 0x50, 0x75, 0x62, 0x4b, 0x65, - 0x79, 0x52, 0x53, 0x41, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0x94, 0x01, - 0x0a, 0x14, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x11, - 0x55, 0x73, 0x65, 0x72, 0x45, 0x64, 0x32, 0x35, 0x35, 0x31, 0x39, 0x50, 0x75, 0x62, 0x4b, 0x65, - 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x11, 0x55, 0x73, 0x65, 0x72, 0x45, 0x64, 0x32, - 0x35, 0x35, 0x31, 0x39, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x38, 0x0a, 0x17, 0x55, 0x44, - 0x4c, 0x65, 0x61, 0x73, 0x65, 0x45, 0x64, 0x32, 0x35, 0x35, 0x31, 0x39, 0x53, 0x69, 0x67, 0x6e, - 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x17, 0x55, 0x44, 0x4c, - 0x65, 0x61, 0x73, 0x65, 0x45, 0x64, 0x32, 0x35, 0x35, 0x31, 0x39, 0x53, 0x69, 0x67, 0x6e, 0x61, - 0x74, 0x75, 0x72, 0x65, 0x22, 0xce, 0x02, 0x0a, 0x13, 0x55, 0x44, 0x42, 0x55, 0x73, 0x65, 0x72, - 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x36, 0x0a, 0x16, - 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x67, - 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x16, 0x50, 0x65, - 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x67, 0x6e, 0x61, - 0x74, 0x75, 0x72, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x52, 0x53, 0x41, 0x50, 0x75, 0x62, 0x6c, 0x69, - 0x63, 0x50, 0x65, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x52, 0x53, 0x41, 0x50, - 0x75, 0x62, 0x6c, 0x69, 0x63, 0x50, 0x65, 0x6d, 0x12, 0x1c, 0x0a, 0x09, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x49, 0x0a, 0x14, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, - 0x74, 0x79, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x73, 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x14, 0x49, 0x64, 0x65, - 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x2c, 0x0a, 0x11, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x53, 0x69, 0x67, - 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x11, 0x49, 0x64, - 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, - 0x32, 0x0a, 0x03, 0x66, 0x72, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6d, - 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x46, 0x61, 0x63, 0x74, 0x52, - 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x03, - 0x66, 0x72, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x55, 0x49, 0x44, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x03, 0x55, 0x49, 0x44, 0x22, 0x56, 0x0a, 0x08, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, - 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, - 0x08, 0x64, 0x68, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x08, 0x64, 0x68, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x53, 0x61, 0x6c, - 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x53, 0x61, 0x6c, 0x74, 0x22, 0x68, 0x0a, - 0x13, 0x46, 0x61, 0x63, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x55, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x03, 0x55, 0x49, 0x44, 0x12, 0x25, 0x0a, 0x04, 0x46, 0x61, 0x63, 0x74, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x73, 0x2e, 0x46, 0x61, 0x63, 0x74, 0x52, 0x04, 0x46, 0x61, 0x63, 0x74, 0x12, 0x18, 0x0a, - 0x07, 0x46, 0x61, 0x63, 0x74, 0x53, 0x69, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, - 0x46, 0x61, 0x63, 0x74, 0x53, 0x69, 0x67, 0x22, 0x36, 0x0a, 0x04, 0x46, 0x61, 0x63, 0x74, 0x12, - 0x12, 0x0a, 0x04, 0x46, 0x61, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x46, - 0x61, 0x63, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x46, 0x61, 0x63, 0x74, 0x54, 0x79, 0x70, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x46, 0x61, 0x63, 0x74, 0x54, 0x79, 0x70, 0x65, 0x22, - 0x3e, 0x0a, 0x14, 0x46, 0x61, 0x63, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x22, - 0x50, 0x0a, 0x12, 0x46, 0x61, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x12, 0x0a, - 0x04, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x43, 0x6f, 0x64, - 0x65, 0x22, 0x75, 0x0a, 0x12, 0x46, 0x61, 0x63, 0x74, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x61, 0x6c, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x55, 0x49, 0x44, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x55, 0x49, 0x44, 0x12, 0x33, 0x0a, 0x0b, 0x52, 0x65, 0x6d, - 0x6f, 0x76, 0x61, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, - 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x46, 0x61, 0x63, - 0x74, 0x52, 0x0b, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x61, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x12, 0x18, - 0x0a, 0x07, 0x46, 0x61, 0x63, 0x74, 0x53, 0x69, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x07, 0x46, 0x61, 0x63, 0x74, 0x53, 0x69, 0x67, 0x22, 0x26, 0x0a, 0x0a, 0x53, 0x74, 0x72, 0x41, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x22, 0xf4, 0x03, 0x0a, 0x09, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0e, - 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1a, - 0x0a, 0x08, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x08, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x44, 0x12, 0x14, 0x0a, 0x05, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x61, 0x74, 0x63, 0x68, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x09, 0x42, 0x61, 0x74, 0x63, 0x68, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1a, - 0x0a, 0x08, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0c, - 0x52, 0x08, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x12, 0x1e, 0x0a, 0x0a, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x04, 0x52, 0x0a, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x73, 0x12, 0x2f, 0x0a, 0x06, 0x45, 0x72, - 0x72, 0x6f, 0x72, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6d, 0x69, 0x78, - 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x45, 0x72, - 0x72, 0x6f, 0x72, 0x52, 0x06, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x43, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x18, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, - 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x0c, 0x43, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x12, 0x3e, 0x0a, 0x1a, 0x52, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x51, 0x75, 0x65, 0x75, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, - 0x74, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x1a, 0x52, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x51, 0x75, 0x65, 0x75, 0x65, 0x54, 0x69, 0x6d, 0x65, - 0x6f, 0x75, 0x74, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x12, 0x34, 0x0a, 0x09, 0x53, 0x69, 0x67, - 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6d, + 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xd7, 0x01, 0x0a, + 0x18, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x64, + 0x49, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x43, 0x0a, 0x07, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x6d, 0x69, 0x78, + 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x64, + 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x72, 0x79, 0x49, 0x64, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x34, + 0x0a, 0x15, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x15, 0x52, + 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x12, 0x40, 0x0a, 0x1b, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x73, 0x61, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x72, + 0x53, 0x69, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x1b, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x73, 0x61, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x72, 0x61, 0x72, 0x53, 0x69, 0x67, 0x22, 0xce, 0x01, 0x0a, 0x1c, 0x54, 0x72, 0x61, 0x63, 0x6b, + 0x65, 0x64, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x72, 0x79, 0x49, 0x64, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x34, 0x0a, 0x15, 0x54, 0x72, 0x61, 0x63, 0x6b, + 0x65, 0x64, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x72, 0x79, 0x49, 0x44, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x15, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x49, + 0x6e, 0x74, 0x65, 0x72, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x72, 0x79, 0x49, 0x44, 0x12, 0x2e, 0x0a, + 0x12, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x73, 0x61, + 0x50, 0x65, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x12, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x73, 0x61, 0x50, 0x65, 0x6d, 0x12, 0x2a, 0x0a, + 0x10, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x69, 0x67, + 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x53, 0x69, + 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0xcd, 0x02, 0x0a, 0x1b, 0x4e, 0x6f, 0x74, 0x69, + 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x26, 0x0a, + 0x0e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x72, 0x79, 0x49, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6d, 0x65, 0x64, 0x69, + 0x61, 0x72, 0x79, 0x49, 0x64, 0x12, 0x28, 0x0a, 0x0f, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x73, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x73, 0x61, 0x12, + 0x2a, 0x0a, 0x10, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x53, + 0x61, 0x6c, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x10, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x61, 0x6c, 0x74, 0x12, 0x2e, 0x0a, 0x12, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x73, 0x61, 0x53, 0x69, + 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x12, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x73, 0x61, 0x53, 0x69, 0x67, 0x12, 0x34, 0x0a, 0x15, 0x49, + 0x49, 0x44, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x73, + 0x61, 0x53, 0x69, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x15, 0x49, 0x49, 0x44, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x73, 0x61, 0x53, 0x69, + 0x67, 0x12, 0x34, 0x0a, 0x15, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x15, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x7d, 0x0a, 0x1d, 0x4e, 0x6f, 0x74, 0x69, 0x66, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, + 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x49, 0x6e, 0x74, 0x65, + 0x72, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x72, 0x79, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x0e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x72, 0x79, 0x49, 0x64, + 0x12, 0x34, 0x0a, 0x15, 0x49, 0x49, 0x44, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x52, 0x73, 0x61, 0x53, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x15, 0x49, 0x49, 0x44, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x52, 0x73, 0x61, 0x53, 0x69, 0x67, 0x22, 0x1e, 0x0a, 0x0a, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, + 0x4c, 0x69, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x49, 0x44, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0c, 0x52, 0x03, 0x49, 0x44, 0x73, 0x22, 0x72, 0x0a, 0x11, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x72, + 0x6f, 0x75, 0x6e, 0x64, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x72, 0x6f, + 0x75, 0x6e, 0x64, 0x49, 0x44, 0x12, 0x43, 0x0a, 0x0d, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6d, + 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x0d, 0x6e, 0x6f, 0x74, + 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x76, 0x0a, 0x10, 0x4e, 0x6f, + 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, 0x20, + 0x0a, 0x0b, 0x65, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x49, 0x44, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x0b, 0x65, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x49, 0x44, + 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x46, 0x50, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x46, 0x50, + 0x12, 0x20, 0x0a, 0x0b, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x61, 0x73, 0x68, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x61, + 0x73, 0x68, 0x22, 0xb1, 0x01, 0x0a, 0x13, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4c, 0x65, + 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x55, 0x73, + 0x65, 0x72, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x55, 0x73, 0x65, 0x72, + 0x49, 0x44, 0x12, 0x2c, 0x0a, 0x11, 0x55, 0x73, 0x65, 0x72, 0x45, 0x64, 0x32, 0x35, 0x35, 0x31, + 0x39, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x11, 0x55, + 0x73, 0x65, 0x72, 0x45, 0x64, 0x32, 0x35, 0x35, 0x31, 0x39, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, + 0x12, 0x1c, 0x0a, 0x09, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x09, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x36, + 0x0a, 0x16, 0x55, 0x73, 0x65, 0x72, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x52, 0x53, 0x41, 0x53, + 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x16, + 0x55, 0x73, 0x65, 0x72, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x52, 0x53, 0x41, 0x53, 0x69, 0x67, + 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0x94, 0x01, 0x0a, 0x14, 0x43, 0x68, 0x61, 0x6e, 0x6e, + 0x65, 0x6c, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x14, 0x0a, 0x05, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, + 0x4c, 0x65, 0x61, 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x55, 0x73, 0x65, 0x72, 0x45, 0x64, 0x32, + 0x35, 0x35, 0x31, 0x39, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x11, 0x55, 0x73, 0x65, 0x72, 0x45, 0x64, 0x32, 0x35, 0x35, 0x31, 0x39, 0x50, 0x75, 0x62, + 0x4b, 0x65, 0x79, 0x12, 0x38, 0x0a, 0x17, 0x55, 0x44, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x45, 0x64, + 0x32, 0x35, 0x35, 0x31, 0x39, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x17, 0x55, 0x44, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x45, 0x64, 0x32, + 0x35, 0x35, 0x31, 0x39, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0x33, 0x0a, + 0x19, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x55, 0x73, + 0x65, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x55, 0x73, 0x65, 0x72, + 0x49, 0x64, 0x22, 0x84, 0x01, 0x0a, 0x12, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x56, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x69, 0x67, + 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x53, 0x69, + 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x34, 0x0a, 0x15, 0x52, 0x65, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x50, 0x65, 0x6d, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x15, 0x52, 0x65, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x75, 0x62, + 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x50, 0x65, 0x6d, 0x22, 0xce, 0x02, 0x0a, 0x13, 0x55, 0x44, + 0x42, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x36, 0x0a, 0x16, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, + 0x6e, 0x67, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x16, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, + 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x52, 0x53, 0x41, + 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x50, 0x65, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0c, 0x52, 0x53, 0x41, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x50, 0x65, 0x6d, 0x12, 0x1c, 0x0a, + 0x09, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x09, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x49, 0x0a, 0x14, 0x49, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6d, 0x69, 0x78, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, + 0x52, 0x14, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x0a, 0x11, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x74, 0x79, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x11, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x53, 0x69, 0x67, 0x6e, 0x61, + 0x74, 0x75, 0x72, 0x65, 0x12, 0x32, 0x0a, 0x03, 0x66, 0x72, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x20, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, + 0x46, 0x61, 0x63, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x52, 0x03, 0x66, 0x72, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x55, 0x49, 0x44, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x55, 0x49, 0x44, 0x22, 0x56, 0x0a, 0x08, 0x49, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x68, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x64, 0x68, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x12, + 0x0a, 0x04, 0x53, 0x61, 0x6c, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x53, 0x61, + 0x6c, 0x74, 0x22, 0x68, 0x0a, 0x13, 0x46, 0x61, 0x63, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x55, 0x49, 0x44, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x55, 0x49, 0x44, 0x12, 0x25, 0x0a, 0x04, 0x46, + 0x61, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6d, 0x69, 0x78, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x46, 0x61, 0x63, 0x74, 0x52, 0x04, 0x46, 0x61, + 0x63, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x46, 0x61, 0x63, 0x74, 0x53, 0x69, 0x67, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x07, 0x46, 0x61, 0x63, 0x74, 0x53, 0x69, 0x67, 0x22, 0x36, 0x0a, 0x04, + 0x46, 0x61, 0x63, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x46, 0x61, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x46, 0x61, 0x63, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x46, 0x61, 0x63, 0x74, + 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x46, 0x61, 0x63, 0x74, + 0x54, 0x79, 0x70, 0x65, 0x22, 0x3e, 0x0a, 0x14, 0x46, 0x61, 0x63, 0x74, 0x52, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x0e, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x49, 0x44, 0x22, 0x50, 0x0a, 0x12, 0x46, 0x61, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x72, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x43, 0x6f, 0x64, 0x65, 0x22, 0x75, 0x0a, 0x12, 0x46, 0x61, 0x63, 0x74, 0x52, 0x65, + 0x6d, 0x6f, 0x76, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, + 0x55, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x55, 0x49, 0x44, 0x12, 0x33, + 0x0a, 0x0b, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x61, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x73, 0x2e, 0x46, 0x61, 0x63, 0x74, 0x52, 0x0b, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x61, 0x6c, 0x44, + 0x61, 0x74, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x46, 0x61, 0x63, 0x74, 0x53, 0x69, 0x67, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x46, 0x61, 0x63, 0x74, 0x53, 0x69, 0x67, 0x22, 0x26, 0x0a, + 0x0a, 0x53, 0x74, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0xf4, 0x03, 0x0a, 0x09, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x02, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x44, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x44, 0x12, + 0x14, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x61, 0x74, 0x63, 0x68, 0x53, 0x69, + 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x42, 0x61, 0x74, 0x63, 0x68, 0x53, + 0x69, 0x7a, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x18, + 0x05, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x08, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x12, + 0x1e, 0x0a, 0x0a, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x73, 0x18, 0x06, 0x20, + 0x03, 0x28, 0x04, 0x52, 0x0a, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x73, 0x12, + 0x2f, 0x0a, 0x06, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x17, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x52, 0x6f, + 0x75, 0x6e, 0x64, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x06, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, + 0x12, 0x3c, 0x0a, 0x0c, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, + 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x73, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x52, 0x0c, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x12, 0x3e, + 0x0a, 0x1a, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x51, 0x75, 0x65, 0x75, 0x65, 0x54, + 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x1a, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x51, 0x75, 0x65, 0x75, + 0x65, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x12, 0x34, + 0x0a, 0x09, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x16, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x52, 0x53, 0x41, + 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x09, 0x53, 0x69, 0x67, 0x6e, 0x61, + 0x74, 0x75, 0x72, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x53, + 0x70, 0x61, 0x63, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, + 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x53, 0x70, 0x61, 0x63, 0x65, 0x53, 0x69, 0x7a, 0x65, + 0x12, 0x3a, 0x0a, 0x0c, 0x45, 0x63, 0x63, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, + 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x73, 0x2e, 0x45, 0x43, 0x43, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x0c, + 0x45, 0x63, 0x63, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0x80, 0x01, 0x0a, + 0x0a, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x49, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x4e, + 0x6f, 0x64, 0x65, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x4e, 0x6f, 0x64, + 0x65, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x34, 0x0a, 0x09, 0x53, 0x69, 0x67, + 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x52, 0x53, 0x41, 0x53, 0x69, 0x67, 0x6e, 0x61, - 0x74, 0x75, 0x72, 0x65, 0x52, 0x09, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, - 0x2a, 0x0a, 0x10, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x53, 0x70, 0x61, 0x63, 0x65, 0x53, - 0x69, 0x7a, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x41, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x53, 0x70, 0x61, 0x63, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x3a, 0x0a, 0x0c, 0x45, - 0x63, 0x63, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x16, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x45, 0x43, 0x43, - 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x0c, 0x45, 0x63, 0x63, 0x53, 0x69, - 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0x80, 0x01, 0x0a, 0x0a, 0x52, 0x6f, 0x75, 0x6e, - 0x64, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x02, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x14, - 0x0a, 0x05, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x45, - 0x72, 0x72, 0x6f, 0x72, 0x12, 0x34, 0x0a, 0x09, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x73, 0x2e, 0x52, 0x53, 0x41, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, - 0x09, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0x16, 0x0a, 0x14, 0x45, 0x41, - 0x42, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x15, 0x45, 0x41, 0x42, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, - 0x69, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x4b, - 0x65, 0x79, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x4b, 0x65, 0x79, 0x49, - 0x64, 0x12, 0x10, 0x0a, 0x03, 0x4b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x4b, 0x65, 0x79, 0x22, 0x85, 0x01, 0x0a, 0x15, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, - 0x65, 0x72, 0x43, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, - 0x04, 0x47, 0x77, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x47, 0x77, 0x49, - 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, - 0x1c, 0x0a, 0x09, 0x41, 0x43, 0x4d, 0x45, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x41, 0x43, 0x4d, 0x45, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1c, 0x0a, - 0x09, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x09, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0x96, 0x01, 0x0a, 0x0e, - 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x72, 0x41, 0x75, 0x74, 0x68, 0x12, 0x16, - 0x0a, 0x06, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, - 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x53, 0x61, 0x6c, 0x74, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x53, 0x61, 0x6c, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x75, - 0x62, 0x6b, 0x65, 0x79, 0x50, 0x65, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x50, - 0x75, 0x62, 0x6b, 0x65, 0x79, 0x50, 0x65, 0x6d, 0x12, 0x1c, 0x0a, 0x09, 0x54, 0x69, 0x6d, 0x65, - 0x53, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x54, 0x69, 0x6d, - 0x65, 0x53, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, - 0x75, 0x72, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, - 0x74, 0x75, 0x72, 0x65, 0x32, 0x96, 0x0a, 0x0a, 0x04, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x3c, 0x0a, - 0x09, 0x41, 0x73, 0x6b, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x1e, 0x2e, 0x6d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, - 0x74, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x0d, 0x2e, 0x6d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x41, 0x63, 0x6b, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x0e, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x65, 0x77, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x1e, 0x2e, - 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, - 0x69, 0x63, 0x61, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x0d, 0x2e, - 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x41, 0x63, 0x6b, 0x22, 0x00, 0x12, 0x3a, - 0x0a, 0x12, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x6e, 0x6d, 0x69, 0x78, 0x65, 0x64, 0x42, - 0x61, 0x74, 0x63, 0x68, 0x12, 0x11, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x73, 0x2e, 0x53, 0x6c, 0x6f, 0x74, 0x1a, 0x0d, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x73, 0x2e, 0x41, 0x63, 0x6b, 0x22, 0x00, 0x28, 0x01, 0x12, 0x36, 0x0a, 0x0e, 0x46, 0x69, - 0x6e, 0x69, 0x73, 0x68, 0x52, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x11, 0x2e, 0x6d, - 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x53, 0x6c, 0x6f, 0x74, 0x1a, - 0x0d, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x41, 0x63, 0x6b, 0x22, 0x00, - 0x28, 0x01, 0x12, 0x38, 0x0a, 0x10, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x70, 0x54, 0x65, 0x73, - 0x74, 0x42, 0x61, 0x74, 0x63, 0x68, 0x12, 0x11, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x73, 0x2e, 0x53, 0x6c, 0x6f, 0x74, 0x1a, 0x0d, 0x2e, 0x6d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x73, 0x2e, 0x41, 0x63, 0x6b, 0x22, 0x00, 0x28, 0x01, 0x12, 0x3c, 0x0a, 0x09, - 0x50, 0x6f, 0x73, 0x74, 0x50, 0x68, 0x61, 0x73, 0x65, 0x12, 0x1e, 0x2e, 0x6d, 0x65, 0x73, 0x73, + 0x74, 0x75, 0x72, 0x65, 0x52, 0x09, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, + 0x16, 0x0a, 0x14, 0x45, 0x41, 0x42, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x15, 0x45, 0x41, 0x42, 0x43, 0x72, + 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x14, 0x0a, 0x05, 0x4b, 0x65, 0x79, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x4b, 0x65, 0x79, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x4b, 0x65, 0x79, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x4b, 0x65, 0x79, 0x22, 0x85, 0x01, 0x0a, 0x15, 0x41, 0x75, 0x74, + 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x72, 0x43, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x47, 0x77, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x04, 0x47, 0x77, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x54, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1c, 0x0a, 0x09, 0x41, 0x43, 0x4d, 0x45, 0x54, 0x6f, 0x6b, 0x65, + 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x41, 0x43, 0x4d, 0x45, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, + 0x22, 0x96, 0x01, 0x0a, 0x0e, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x72, 0x41, + 0x75, 0x74, 0x68, 0x12, 0x16, 0x0a, 0x06, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x44, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x06, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x53, + 0x61, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x53, 0x61, 0x6c, 0x74, 0x12, + 0x1c, 0x0a, 0x09, 0x50, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x50, 0x65, 0x6d, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x09, 0x50, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x50, 0x65, 0x6d, 0x12, 0x1c, 0x0a, + 0x09, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x09, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1c, 0x0a, 0x09, 0x73, + 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, + 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0x6d, 0x0a, 0x17, 0x52, 0x73, 0x41, + 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x22, 0x0a, 0x0c, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x48, 0x61, 0x73, 0x68, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, + 0x48, 0x61, 0x73, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x53, 0x61, 0x6c, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x04, 0x53, 0x61, 0x6c, 0x74, 0x22, 0x4e, 0x0a, 0x18, 0x52, 0x73, 0x41, 0x75, + 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x05, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x45, 0x78, + 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x45, + 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x22, 0x39, 0x0a, 0x0d, 0x52, 0x73, 0x52, 0x65, + 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x61, 0x74, + 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x50, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, + 0x05, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x22, 0x2a, 0x0a, 0x12, 0x52, 0x73, 0x4c, 0x61, 0x73, 0x74, 0x57, 0x72, 0x69, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, + 0x24, 0x0a, 0x0e, 0x52, 0x73, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x04, 0x44, 0x61, 0x74, 0x61, 0x22, 0x4e, 0x0a, 0x0e, 0x52, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x61, 0x74, 0x68, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x50, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x44, + 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, + 0x14, 0x0a, 0x05, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x27, 0x0a, 0x11, 0x52, 0x73, 0x52, 0x65, 0x61, 0x64, 0x44, + 0x69, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, + 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x22, 0x33, + 0x0a, 0x13, 0x52, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x32, 0x96, 0x0a, 0x0a, 0x04, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x3c, 0x0a, 0x09, + 0x41, 0x73, 0x6b, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x1e, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x0d, 0x2e, 0x6d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x73, 0x2e, 0x41, 0x63, 0x6b, 0x22, 0x00, 0x12, 0x37, 0x0a, 0x0f, 0x53, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x50, 0x6f, 0x73, 0x74, 0x50, 0x68, 0x61, 0x73, 0x65, 0x12, 0x11, 0x2e, - 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x53, 0x6c, 0x6f, 0x74, - 0x1a, 0x0d, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x41, 0x63, 0x6b, 0x22, - 0x00, 0x28, 0x01, 0x12, 0x54, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x42, - 0x75, 0x66, 0x66, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1e, 0x2e, 0x6d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x73, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, - 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x1c, 0x2e, 0x6d, 0x69, 0x78, 0x6d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x42, 0x75, 0x66, - 0x66, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x10, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x1e, 0x2e, - 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, - 0x69, 0x63, 0x61, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x1e, 0x2e, - 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x53, 0x69, 0x67, 0x6e, - 0x65, 0x64, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x44, 0x0a, 0x11, 0x50, 0x6f, 0x73, 0x74, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x70, 0x52, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x12, 0x1e, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, - 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x1a, 0x0d, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, - 0x41, 0x63, 0x6b, 0x22, 0x00, 0x12, 0x49, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x61, 0x73, - 0x75, 0x72, 0x65, 0x12, 0x1e, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x41, - 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x1a, 0x19, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x73, 0x2e, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0x00, - 0x12, 0x49, 0x0a, 0x04, 0x50, 0x6f, 0x6c, 0x6c, 0x12, 0x1e, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x73, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, - 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x1f, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x6f, 0x6c, - 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x12, 0x44, - 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x69, 0x78, 0x65, 0x64, 0x42, 0x61, 0x74, 0x63, - 0x68, 0x12, 0x1e, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x41, 0x75, 0x74, - 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x1a, 0x11, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, - 0x53, 0x6c, 0x6f, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x44, 0x0a, 0x11, 0x53, 0x65, 0x6e, 0x64, - 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x72, 0x69, 0x70, 0x50, 0x69, 0x6e, 0x67, 0x12, 0x1e, 0x2e, - 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, - 0x69, 0x63, 0x61, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x0d, 0x2e, - 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x41, 0x63, 0x6b, 0x22, 0x00, 0x12, 0x3d, - 0x0a, 0x0a, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x1e, 0x2e, 0x6d, + 0x61, 0x67, 0x65, 0x73, 0x2e, 0x41, 0x63, 0x6b, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x0e, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x4e, 0x65, 0x77, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x1e, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x0d, 0x2e, 0x6d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x41, 0x63, 0x6b, 0x22, 0x00, 0x12, 0x44, 0x0a, - 0x17, 0x47, 0x65, 0x74, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, - 0x67, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x0e, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x73, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x1a, 0x17, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x53, 0x74, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0f, 0x53, 0x74, 0x61, 0x72, 0x74, 0x53, 0x68, 0x61, 0x72, - 0x65, 0x50, 0x68, 0x61, 0x73, 0x65, 0x12, 0x1e, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x73, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x64, 0x4d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x0d, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x73, 0x2e, 0x41, 0x63, 0x6b, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0f, 0x53, 0x68, 0x61, 0x72, 0x65, - 0x50, 0x68, 0x61, 0x73, 0x65, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x1e, 0x2e, 0x6d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, - 0x74, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x0d, 0x2e, 0x6d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x41, 0x63, 0x6b, 0x22, 0x00, 0x12, 0x40, 0x0a, 0x0d, 0x53, - 0x68, 0x61, 0x72, 0x65, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x4b, 0x65, 0x79, 0x12, 0x1e, 0x2e, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x41, 0x63, 0x6b, 0x22, 0x00, 0x12, 0x3a, 0x0a, + 0x12, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x6e, 0x6d, 0x69, 0x78, 0x65, 0x64, 0x42, 0x61, + 0x74, 0x63, 0x68, 0x12, 0x11, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x73, 0x2e, 0x53, 0x6c, 0x6f, 0x74, 0x1a, 0x0d, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x73, 0x2e, 0x41, 0x63, 0x6b, 0x22, 0x00, 0x28, 0x01, 0x12, 0x36, 0x0a, 0x0e, 0x46, 0x69, 0x6e, + 0x69, 0x73, 0x68, 0x52, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x11, 0x2e, 0x6d, 0x69, + 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x53, 0x6c, 0x6f, 0x74, 0x1a, 0x0d, + 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x41, 0x63, 0x6b, 0x22, 0x00, 0x28, + 0x01, 0x12, 0x38, 0x0a, 0x10, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x70, 0x54, 0x65, 0x73, 0x74, + 0x42, 0x61, 0x74, 0x63, 0x68, 0x12, 0x11, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x73, 0x2e, 0x53, 0x6c, 0x6f, 0x74, 0x1a, 0x0d, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x73, 0x2e, 0x41, 0x63, 0x6b, 0x22, 0x00, 0x28, 0x01, 0x12, 0x3c, 0x0a, 0x09, 0x50, + 0x6f, 0x73, 0x74, 0x50, 0x68, 0x61, 0x73, 0x65, 0x12, 0x1e, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x73, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, + 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x0d, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x73, 0x2e, 0x41, 0x63, 0x6b, 0x22, 0x00, 0x12, 0x37, 0x0a, 0x0f, 0x53, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x50, 0x6f, 0x73, 0x74, 0x50, 0x68, 0x61, 0x73, 0x65, 0x12, 0x11, 0x2e, 0x6d, + 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x53, 0x6c, 0x6f, 0x74, 0x1a, + 0x0d, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x41, 0x63, 0x6b, 0x22, 0x00, + 0x28, 0x01, 0x12, 0x54, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x42, 0x75, + 0x66, 0x66, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1e, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x73, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, + 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x1c, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x42, 0x75, 0x66, 0x66, + 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x10, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x1e, 0x2e, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, + 0x63, 0x61, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x1e, 0x2e, 0x6d, + 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, + 0x64, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x44, + 0x0a, 0x11, 0x50, 0x6f, 0x73, 0x74, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x70, 0x52, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x12, 0x1e, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x41, + 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x1a, 0x0d, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x41, + 0x63, 0x6b, 0x22, 0x00, 0x12, 0x49, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x61, 0x73, 0x75, + 0x72, 0x65, 0x12, 0x1e, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x41, 0x75, + 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x1a, 0x19, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, + 0x2e, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0x00, 0x12, + 0x49, 0x0a, 0x04, 0x50, 0x6f, 0x6c, 0x6c, 0x12, 0x1e, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x73, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x64, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x1f, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x6c, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x12, 0x44, 0x6f, + 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x69, 0x78, 0x65, 0x64, 0x42, 0x61, 0x74, 0x63, 0x68, + 0x12, 0x1e, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x41, 0x75, 0x74, 0x68, + 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x1a, 0x11, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x53, + 0x6c, 0x6f, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x44, 0x0a, 0x11, 0x53, 0x65, 0x6e, 0x64, 0x52, + 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x72, 0x69, 0x70, 0x50, 0x69, 0x6e, 0x67, 0x12, 0x1e, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x0d, 0x2e, 0x6d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x41, 0x63, 0x6b, 0x22, 0x00, 0x32, 0xc9, 0x07, - 0x0a, 0x07, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x12, 0x59, 0x0a, 0x10, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x23, 0x2e, - 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x53, 0x69, 0x67, 0x6e, - 0x65, 0x64, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, - 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x68, 0x0a, 0x15, 0x42, 0x61, 0x74, 0x63, 0x68, 0x4e, 0x6f, 0x64, - 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, - 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x53, 0x69, 0x67, 0x6e, - 0x65, 0x64, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x42, 0x61, 0x74, 0x63, 0x68, 0x4b, 0x65, 0x79, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x42, 0x61, 0x74, 0x63, - 0x68, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4a, - 0x0a, 0x0a, 0x50, 0x75, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x18, 0x2e, 0x6d, - 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x53, 0x6c, 0x6f, 0x74, 0x1a, 0x20, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x73, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x53, 0x6c, 0x6f, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x50, 0x0a, 0x0f, 0x50, 0x75, - 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x12, 0x19, 0x2e, - 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x47, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x53, 0x6c, 0x6f, 0x74, 0x73, 0x1a, 0x20, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x53, 0x6c, - 0x6f, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x55, 0x0a, 0x0f, - 0x50, 0x75, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x12, - 0x1e, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x65, - 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, - 0x20, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x47, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x53, 0x6c, 0x6f, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x14, 0x50, 0x75, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x4d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x12, 0x1e, 0x2e, 0x6d, 0x65, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x41, 0x63, 0x6b, 0x22, 0x00, 0x12, 0x3d, 0x0a, + 0x0a, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x1e, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, - 0x61, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x20, 0x2e, 0x6d, 0x69, + 0x61, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x0d, 0x2e, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x41, 0x63, 0x6b, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x17, + 0x47, 0x65, 0x74, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, + 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x0e, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x73, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x1a, 0x17, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x53, 0x74, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0f, 0x53, 0x74, 0x61, 0x72, 0x74, 0x53, 0x68, 0x61, 0x72, 0x65, + 0x50, 0x68, 0x61, 0x73, 0x65, 0x12, 0x1e, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, + 0x2e, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x64, 0x4d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x0d, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, + 0x2e, 0x41, 0x63, 0x6b, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0f, 0x53, 0x68, 0x61, 0x72, 0x65, 0x50, + 0x68, 0x61, 0x73, 0x65, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x1e, 0x2e, 0x6d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x73, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, + 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x0d, 0x2e, 0x6d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x73, 0x2e, 0x41, 0x63, 0x6b, 0x22, 0x00, 0x12, 0x40, 0x0a, 0x0d, 0x53, 0x68, + 0x61, 0x72, 0x65, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x4b, 0x65, 0x79, 0x12, 0x1e, 0x2e, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, + 0x61, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x0d, 0x2e, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x41, 0x63, 0x6b, 0x22, 0x00, 0x32, 0xc9, 0x07, 0x0a, + 0x07, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x12, 0x59, 0x0a, 0x10, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x23, 0x2e, 0x6d, + 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, + 0x64, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1e, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, + 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x68, 0x0a, 0x15, 0x42, 0x61, 0x74, 0x63, 0x68, 0x4e, 0x6f, 0x64, 0x65, + 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6d, + 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, + 0x64, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x42, 0x61, 0x74, 0x63, 0x68, 0x4b, 0x65, 0x79, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x73, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x42, 0x61, 0x74, 0x63, 0x68, + 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4a, 0x0a, + 0x0a, 0x50, 0x75, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x18, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x53, 0x6c, 0x6f, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x3e, 0x0a, 0x04, 0x50, 0x6f, 0x6c, 0x6c, 0x12, 0x18, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x50, 0x6f, 0x6c, - 0x6c, 0x1a, 0x18, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, - 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, - 0x61, 0x0a, 0x17, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, - 0x69, 0x63, 0x61, 0x6c, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x12, 0x1d, 0x2e, 0x6d, 0x69, 0x78, - 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x69, - 0x63, 0x61, 0x6c, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x1a, 0x25, 0x2e, 0x6d, 0x69, 0x78, 0x6d, + 0x79, 0x53, 0x6c, 0x6f, 0x74, 0x1a, 0x20, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x73, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x53, 0x6c, 0x6f, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x50, 0x0a, 0x0f, 0x50, 0x75, 0x74, + 0x4d, 0x61, 0x6e, 0x79, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x12, 0x19, 0x2e, 0x6d, + 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x53, 0x6c, 0x6f, 0x74, 0x73, 0x1a, 0x20, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x53, 0x6c, 0x6f, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x55, 0x0a, 0x0f, 0x50, + 0x75, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x12, 0x1e, + 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, + 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x20, + 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x47, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x53, 0x6c, 0x6f, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x14, 0x50, 0x75, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x4d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x73, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x12, 0x1e, 0x2e, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, + 0x74, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x20, 0x2e, 0x6d, 0x69, 0x78, + 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x53, 0x6c, 0x6f, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3e, + 0x0a, 0x04, 0x50, 0x6f, 0x6c, 0x6c, 0x12, 0x18, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x73, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x50, 0x6f, 0x6c, 0x6c, + 0x1a, 0x18, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x53, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x61, + 0x0a, 0x17, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x69, + 0x63, 0x61, 0x6c, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x12, 0x1d, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x63, - 0x61, 0x6c, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x4f, 0x0a, 0x0f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x73, 0x12, 0x18, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x1a, - 0x20, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x47, 0x65, - 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x5e, 0x0a, 0x14, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x61, - 0x74, 0x63, 0x68, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x12, 0x1d, 0x2e, 0x6d, 0x69, - 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x73, 0x42, 0x61, 0x74, 0x63, 0x68, 0x1a, 0x25, 0x2e, 0x6d, 0x69, 0x78, + 0x61, 0x6c, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x1a, 0x25, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x63, 0x61, + 0x6c, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x4f, 0x0a, 0x0f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x73, 0x12, 0x18, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x1a, 0x20, + 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x47, 0x65, 0x74, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x5e, 0x0a, 0x14, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x61, 0x74, + 0x63, 0x68, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x12, 0x1d, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x61, 0x74, 0x63, - 0x68, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x6c, - 0x73, 0x43, 0x65, 0x72, 0x74, 0x12, 0x1f, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x47, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x43, 0x65, 0x72, 0x74, 0x1a, 0x1f, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x73, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, 0x65, 0x72, 0x74, - 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x22, 0x00, 0x32, 0x78, 0x0a, 0x0f, 0x43, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x72, 0x12, 0x65, 0x0a, 0x0c, - 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x12, 0x1f, 0x2e, 0x6d, - 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x32, 0x2e, - 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x53, 0x69, 0x67, 0x6e, - 0x65, 0x64, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x22, 0x00, 0x32, 0xb4, 0x02, 0x0a, 0x0c, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3e, 0x0a, 0x0c, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, - 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x1d, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x73, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x1a, 0x0d, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x41, - 0x63, 0x6b, 0x22, 0x00, 0x12, 0x33, 0x0a, 0x07, 0x50, 0x6f, 0x6c, 0x6c, 0x4e, 0x64, 0x66, 0x12, - 0x14, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x4e, 0x44, - 0x46, 0x48, 0x61, 0x73, 0x68, 0x1a, 0x10, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x73, 0x2e, 0x4e, 0x44, 0x46, 0x22, 0x00, 0x12, 0x4d, 0x0a, 0x04, 0x50, 0x6f, 0x6c, - 0x6c, 0x12, 0x1e, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x41, 0x75, 0x74, - 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x1a, 0x23, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, - 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x6c, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x11, 0x43, 0x68, 0x65, 0x63, - 0x6b, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x20, 0x2e, - 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x67, 0x69, - 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x1a, - 0x27, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x52, 0x65, - 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x00, 0x32, 0xbc, 0x04, 0x0a, 0x0f, 0x4e, - 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x6f, 0x74, 0x12, 0x59, - 0x0a, 0x1a, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x46, 0x6f, 0x72, 0x4e, - 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2a, 0x2e, 0x6d, - 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, - 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x73, 0x2e, 0x41, 0x63, 0x6b, 0x22, 0x00, 0x12, 0x55, 0x0a, 0x18, 0x52, 0x65, 0x67, - 0x69, 0x73, 0x74, 0x65, 0x72, 0x46, 0x6f, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x28, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x73, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x0d, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x41, 0x63, 0x6b, 0x22, 0x00, - 0x12, 0x4b, 0x0a, 0x18, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x4e, 0x6f, 0x74, 0x69, 0x66, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x12, 0x1e, 0x2e, 0x6d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, - 0x63, 0x61, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x0d, 0x2e, 0x6d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x41, 0x63, 0x6b, 0x22, 0x00, 0x12, 0x43, 0x0a, - 0x0d, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x21, + 0x61, 0x67, 0x65, 0x73, 0x42, 0x61, 0x74, 0x63, 0x68, 0x1a, 0x25, 0x2e, 0x6d, 0x69, 0x78, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x61, 0x74, 0x63, 0x68, + 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x6c, 0x73, + 0x43, 0x65, 0x72, 0x74, 0x12, 0x1f, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x73, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x43, 0x65, 0x72, 0x74, 0x1a, 0x1f, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x73, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, 0x65, 0x72, 0x74, 0x69, + 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x22, 0x00, 0x32, 0x78, 0x0a, 0x0f, 0x43, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x72, 0x12, 0x65, 0x0a, 0x0c, 0x52, + 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x12, 0x1f, 0x2e, 0x6d, 0x69, + 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x32, 0x2e, 0x6d, + 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, + 0x64, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x22, 0x00, 0x32, 0xb4, 0x02, 0x0a, 0x0c, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x3e, 0x0a, 0x0c, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x4e, + 0x6f, 0x64, 0x65, 0x12, 0x1d, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x73, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x1a, 0x0d, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x41, 0x63, + 0x6b, 0x22, 0x00, 0x12, 0x33, 0x0a, 0x07, 0x50, 0x6f, 0x6c, 0x6c, 0x4e, 0x64, 0x66, 0x12, 0x14, + 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x4e, 0x44, 0x46, + 0x48, 0x61, 0x73, 0x68, 0x1a, 0x10, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x73, 0x2e, 0x4e, 0x44, 0x46, 0x22, 0x00, 0x12, 0x4d, 0x0a, 0x04, 0x50, 0x6f, 0x6c, 0x6c, + 0x12, 0x1e, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x41, 0x75, 0x74, 0x68, + 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x1a, 0x23, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x50, + 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x6c, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x11, 0x43, 0x68, 0x65, 0x63, 0x6b, + 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x20, 0x2e, 0x6d, + 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x65, 0x72, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x1a, 0x27, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x67, - 0x69, 0x73, 0x74, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x0d, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x41, 0x63, 0x6b, - 0x22, 0x00, 0x12, 0x47, 0x0a, 0x0f, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, - 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x23, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x73, 0x2e, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x54, 0x6f, - 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x6d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x41, 0x63, 0x6b, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x11, 0x52, - 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x49, 0x44, - 0x12, 0x25, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x52, - 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x49, 0x64, + 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x00, 0x32, 0xbc, 0x04, 0x0a, 0x0f, 0x4e, 0x6f, + 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x6f, 0x74, 0x12, 0x59, 0x0a, + 0x1a, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x46, 0x6f, 0x72, 0x4e, 0x6f, + 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2a, 0x2e, 0x6d, 0x69, + 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x73, 0x2e, 0x41, 0x63, 0x6b, 0x22, 0x00, 0x12, 0x4f, 0x0a, 0x13, 0x55, 0x6e, 0x72, 0x65, + 0x65, 0x73, 0x2e, 0x41, 0x63, 0x6b, 0x22, 0x00, 0x12, 0x55, 0x0a, 0x18, 0x52, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x65, 0x72, 0x46, 0x6f, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x28, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x73, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, + 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x41, 0x63, 0x6b, 0x22, 0x00, 0x12, + 0x4b, 0x0a, 0x18, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x12, 0x1e, 0x2e, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, + 0x61, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x0d, 0x2e, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x41, 0x63, 0x6b, 0x22, 0x00, 0x12, 0x43, 0x0a, 0x0d, + 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x21, 0x2e, + 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x0d, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x41, 0x63, 0x6b, 0x22, + 0x00, 0x12, 0x47, 0x0a, 0x0f, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x23, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x73, 0x2e, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x6d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x73, 0x2e, 0x41, 0x63, 0x6b, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x11, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x49, 0x44, 0x12, - 0x27, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x55, 0x6e, - 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x49, - 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x73, 0x2e, 0x41, 0x63, 0x6b, 0x22, 0x00, 0x32, 0xbe, 0x03, 0x0a, 0x03, 0x55, 0x44, - 0x42, 0x12, 0x41, 0x0a, 0x0c, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x55, 0x73, 0x65, - 0x72, 0x12, 0x20, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, - 0x55, 0x44, 0x42, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x1a, 0x0d, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x41, - 0x63, 0x6b, 0x22, 0x00, 0x12, 0x3e, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x55, 0x73, - 0x65, 0x72, 0x12, 0x1f, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, - 0x2e, 0x46, 0x61, 0x63, 0x74, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x41, - 0x63, 0x6b, 0x22, 0x00, 0x12, 0x55, 0x0a, 0x0c, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, - 0x46, 0x61, 0x63, 0x74, 0x12, 0x20, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x73, 0x2e, 0x46, 0x61, 0x63, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x73, 0x2e, 0x46, 0x61, 0x63, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, - 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x0b, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x46, 0x61, 0x63, 0x74, 0x12, 0x1f, 0x2e, 0x6d, 0x69, 0x78, - 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x46, 0x61, 0x63, 0x74, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x72, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x6d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x41, 0x63, 0x6b, 0x22, 0x00, 0x12, 0x3e, 0x0a, 0x0a, - 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x46, 0x61, 0x63, 0x74, 0x12, 0x1f, 0x2e, 0x6d, 0x69, 0x78, - 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x46, 0x61, 0x63, 0x74, 0x52, 0x65, 0x6d, - 0x6f, 0x76, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x6d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x41, 0x63, 0x6b, 0x22, 0x00, 0x12, 0x5c, 0x0a, 0x13, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4c, 0x65, - 0x61, 0x73, 0x65, 0x12, 0x20, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x73, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x73, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4c, 0x65, 0x61, 0x73, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x32, 0xed, 0x01, 0x0a, 0x0a, 0x41, - 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x72, 0x12, 0x39, 0x0a, 0x09, 0x41, 0x75, 0x74, - 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x12, 0x1b, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x73, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x72, 0x41, - 0x75, 0x74, 0x68, 0x1a, 0x0d, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x41, - 0x63, 0x6b, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x43, - 0x65, 0x72, 0x74, 0x12, 0x22, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x73, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x72, 0x43, 0x65, 0x72, 0x74, + 0x25, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x52, 0x65, + 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x49, 0x64, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x73, 0x2e, 0x41, 0x63, 0x6b, 0x22, 0x00, 0x12, 0x4f, 0x0a, 0x13, 0x55, 0x6e, 0x72, 0x65, 0x67, + 0x69, 0x73, 0x74, 0x65, 0x72, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x49, 0x44, 0x12, 0x27, + 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x55, 0x6e, 0x72, + 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x49, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x73, 0x2e, 0x41, 0x63, 0x6b, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x15, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x45, 0x41, 0x42, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, - 0x73, 0x12, 0x21, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, - 0x45, 0x41, 0x42, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x73, 0x2e, 0x45, 0x41, 0x42, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x26, 0x5a, 0x24, 0x67, 0x69, - 0x74, 0x6c, 0x61, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x6c, 0x69, 0x78, 0x78, 0x69, 0x72, - 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x2f, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x65, 0x73, 0x2e, 0x41, 0x63, 0x6b, 0x22, 0x00, 0x32, 0x9d, 0x04, 0x0a, 0x03, 0x55, 0x44, 0x42, + 0x12, 0x41, 0x0a, 0x0c, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, + 0x12, 0x20, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x55, + 0x44, 0x42, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x1a, 0x0d, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x41, 0x63, + 0x6b, 0x22, 0x00, 0x12, 0x3e, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x55, 0x73, 0x65, + 0x72, 0x12, 0x1f, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, + 0x46, 0x61, 0x63, 0x74, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x41, 0x63, + 0x6b, 0x22, 0x00, 0x12, 0x55, 0x0a, 0x0c, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x46, + 0x61, 0x63, 0x74, 0x12, 0x20, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x73, 0x2e, 0x46, 0x61, 0x63, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x73, 0x2e, 0x46, 0x61, 0x63, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x0b, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x46, 0x61, 0x63, 0x74, 0x12, 0x1f, 0x2e, 0x6d, 0x69, 0x78, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x46, 0x61, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x72, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x41, 0x63, 0x6b, 0x22, 0x00, 0x12, 0x3e, 0x0a, 0x0a, 0x52, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x46, 0x61, 0x63, 0x74, 0x12, 0x1f, 0x2e, 0x6d, 0x69, 0x78, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x46, 0x61, 0x63, 0x74, 0x52, 0x65, 0x6d, 0x6f, + 0x76, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x41, 0x63, 0x6b, 0x22, 0x00, 0x12, 0x5c, 0x0a, 0x13, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4c, 0x65, 0x61, + 0x73, 0x65, 0x12, 0x20, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, + 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x73, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x10, 0x56, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x26, 0x2e, + 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x55, 0x73, 0x65, 0x72, + 0x6e, 0x61, 0x6d, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x73, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x56, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x00, 0x32, 0xed, 0x01, 0x0a, 0x0a, 0x41, 0x75, 0x74, + 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x72, 0x12, 0x39, 0x0a, 0x09, 0x41, 0x75, 0x74, 0x68, 0x6f, + 0x72, 0x69, 0x7a, 0x65, 0x12, 0x1b, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x73, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x72, 0x41, 0x75, 0x74, + 0x68, 0x1a, 0x0d, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x41, 0x63, 0x6b, + 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x43, 0x65, 0x72, + 0x74, 0x12, 0x22, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, + 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x72, 0x43, 0x65, 0x72, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, + 0x2e, 0x41, 0x63, 0x6b, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x15, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x45, 0x41, 0x42, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x12, + 0x21, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x45, 0x41, + 0x42, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, + 0x2e, 0x45, 0x41, 0x42, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x32, 0xc3, 0x03, 0x0a, 0x0a, 0x52, 0x65, 0x6d, + 0x6f, 0x74, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x12, 0x54, 0x0a, 0x05, 0x4c, 0x6f, 0x67, 0x69, 0x6e, + 0x12, 0x24, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x52, + 0x73, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x73, 0x2e, 0x52, 0x73, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a, + 0x04, 0x52, 0x65, 0x61, 0x64, 0x12, 0x1a, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x73, 0x2e, 0x52, 0x73, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1b, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, + 0x52, 0x73, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, + 0x0a, 0x05, 0x57, 0x72, 0x69, 0x74, 0x65, 0x12, 0x1b, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x52, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, + 0x41, 0x63, 0x6b, 0x12, 0x4f, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x73, 0x74, 0x4d, 0x6f, + 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x12, 0x1a, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x73, 0x2e, 0x52, 0x73, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, + 0x2e, 0x52, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x51, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x73, 0x74, 0x57, + 0x72, 0x69, 0x74, 0x65, 0x12, 0x1f, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x73, 0x2e, 0x52, 0x73, 0x4c, 0x61, 0x73, 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x73, 0x2e, 0x52, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x45, 0x0a, 0x07, 0x52, 0x65, 0x61, 0x64, 0x44, + 0x69, 0x72, 0x12, 0x1a, 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, + 0x2e, 0x52, 0x73, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, + 0x2e, 0x6d, 0x69, 0x78, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x52, 0x73, 0x52, + 0x65, 0x61, 0x64, 0x44, 0x69, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x26, + 0x5a, 0x24, 0x67, 0x69, 0x74, 0x6c, 0x61, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x6c, 0x69, + 0x78, 0x78, 0x69, 0x72, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x2f, 0x6d, 0x69, 0x78, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -6314,7 +6953,7 @@ func file_mixmessages_proto_rawDescGZIP() []byte { return file_mixmessages_proto_rawDescData } -var file_mixmessages_proto_msgTypes = make([]protoimpl.MessageInfo, 78) +var file_mixmessages_proto_msgTypes = make([]protoimpl.MessageInfo, 88) var file_mixmessages_proto_goTypes = []interface{}{ (*ClientKeyRequest)(nil), // 0: mixmessages.ClientKeyRequest (*SignedClientBatchKeyRequest)(nil), // 1: mixmessages.SignedClientBatchKeyRequest @@ -6380,108 +7019,118 @@ var file_mixmessages_proto_goTypes = []interface{}{ (*NotificationData)(nil), // 61: mixmessages.NotificationData (*ChannelLeaseRequest)(nil), // 62: mixmessages.ChannelLeaseRequest (*ChannelLeaseResponse)(nil), // 63: mixmessages.ChannelLeaseResponse - (*UDBUserRegistration)(nil), // 64: mixmessages.UDBUserRegistration - (*Identity)(nil), // 65: mixmessages.Identity - (*FactRegisterRequest)(nil), // 66: mixmessages.FactRegisterRequest - (*Fact)(nil), // 67: mixmessages.Fact - (*FactRegisterResponse)(nil), // 68: mixmessages.FactRegisterResponse - (*FactConfirmRequest)(nil), // 69: mixmessages.FactConfirmRequest - (*FactRemovalRequest)(nil), // 70: mixmessages.FactRemovalRequest - (*StrAddress)(nil), // 71: mixmessages.StrAddress - (*RoundInfo)(nil), // 72: mixmessages.RoundInfo - (*RoundError)(nil), // 73: mixmessages.RoundError - (*EABCredentialRequest)(nil), // 74: mixmessages.EABCredentialRequest - (*EABCredentialResponse)(nil), // 75: mixmessages.EABCredentialResponse - (*AuthorizerCertRequest)(nil), // 76: mixmessages.AuthorizerCertRequest - (*AuthorizerAuth)(nil), // 77: mixmessages.AuthorizerAuth - (*messages.RSASignature)(nil), // 78: messages.RSASignature - (*anypb.Any)(nil), // 79: google.protobuf.Any - (*messages.ECCSignature)(nil), // 80: messages.ECCSignature - (*messages.AuthenticatedMessage)(nil), // 81: messages.AuthenticatedMessage - (*messages.Ping)(nil), // 82: messages.Ping - (*messages.Ack)(nil), // 83: messages.Ack + (*UsernameValidationRequest)(nil), // 64: mixmessages.UsernameValidationRequest + (*UsernameValidation)(nil), // 65: mixmessages.UsernameValidation + (*UDBUserRegistration)(nil), // 66: mixmessages.UDBUserRegistration + (*Identity)(nil), // 67: mixmessages.Identity + (*FactRegisterRequest)(nil), // 68: mixmessages.FactRegisterRequest + (*Fact)(nil), // 69: mixmessages.Fact + (*FactRegisterResponse)(nil), // 70: mixmessages.FactRegisterResponse + (*FactConfirmRequest)(nil), // 71: mixmessages.FactConfirmRequest + (*FactRemovalRequest)(nil), // 72: mixmessages.FactRemovalRequest + (*StrAddress)(nil), // 73: mixmessages.StrAddress + (*RoundInfo)(nil), // 74: mixmessages.RoundInfo + (*RoundError)(nil), // 75: mixmessages.RoundError + (*EABCredentialRequest)(nil), // 76: mixmessages.EABCredentialRequest + (*EABCredentialResponse)(nil), // 77: mixmessages.EABCredentialResponse + (*AuthorizerCertRequest)(nil), // 78: mixmessages.AuthorizerCertRequest + (*AuthorizerAuth)(nil), // 79: mixmessages.AuthorizerAuth + (*RsAuthenticationRequest)(nil), // 80: mixmessages.RsAuthenticationRequest + (*RsAuthenticationResponse)(nil), // 81: mixmessages.RsAuthenticationResponse + (*RsReadRequest)(nil), // 82: mixmessages.RsReadRequest + (*RsLastWriteRequest)(nil), // 83: mixmessages.RsLastWriteRequest + (*RsReadResponse)(nil), // 84: mixmessages.RsReadResponse + (*RsWriteRequest)(nil), // 85: mixmessages.RsWriteRequest + (*RsReadDirResponse)(nil), // 86: mixmessages.RsReadDirResponse + (*RsTimestampResponse)(nil), // 87: mixmessages.RsTimestampResponse + (*messages.RSASignature)(nil), // 88: messages.RSASignature + (*anypb.Any)(nil), // 89: google.protobuf.Any + (*messages.ECCSignature)(nil), // 90: messages.ECCSignature + (*messages.AuthenticatedMessage)(nil), // 91: messages.AuthenticatedMessage + (*messages.Ping)(nil), // 92: messages.Ping + (*messages.Ack)(nil), // 93: messages.Ack } var file_mixmessages_proto_depIdxs = []int32{ 46, // 0: mixmessages.ClientKeyRequest.ClientTransmissionConfirmation:type_name -> mixmessages.SignedRegistrationConfirmation - 78, // 1: mixmessages.SignedClientBatchKeyRequest.ClientKeyRequestSignature:type_name -> messages.RSASignature - 78, // 2: mixmessages.SignedClientKeyRequest.ClientKeyRequestSignature:type_name -> messages.RSASignature + 88, // 1: mixmessages.SignedClientBatchKeyRequest.ClientKeyRequestSignature:type_name -> messages.RSASignature + 88, // 2: mixmessages.SignedClientKeyRequest.ClientKeyRequestSignature:type_name -> messages.RSASignature 5, // 3: mixmessages.SignedBatchKeyResponse.SignedKeys:type_name -> mixmessages.SignedKeyResponse - 78, // 4: mixmessages.SignedKeyResponse.KeyResponseSignedByGateway:type_name -> messages.RSASignature - 72, // 5: mixmessages.RoundPublicKey.Round:type_name -> mixmessages.RoundInfo - 72, // 6: mixmessages.Batch.Round:type_name -> mixmessages.RoundInfo + 88, // 4: mixmessages.SignedKeyResponse.KeyResponseSignedByGateway:type_name -> messages.RSASignature + 74, // 5: mixmessages.RoundPublicKey.Round:type_name -> mixmessages.RoundInfo + 74, // 6: mixmessages.Batch.Round:type_name -> mixmessages.RoundInfo 29, // 7: mixmessages.Batch.slots:type_name -> mixmessages.Slot 29, // 8: mixmessages.CompletedBatch.slots:type_name -> mixmessages.Slot - 72, // 9: mixmessages.BatchInfo.Round:type_name -> mixmessages.RoundInfo - 79, // 10: mixmessages.RoundTripPing.Payload:type_name -> google.protobuf.Any - 72, // 11: mixmessages.RoundTripPing.Round:type_name -> mixmessages.RoundInfo + 74, // 9: mixmessages.BatchInfo.Round:type_name -> mixmessages.RoundInfo + 89, // 10: mixmessages.RoundTripPing.Payload:type_name -> google.protobuf.Any + 74, // 11: mixmessages.RoundTripPing.Round:type_name -> mixmessages.RoundInfo 41, // 12: mixmessages.ServerPoll.Full:type_name -> mixmessages.NDFHash 41, // 13: mixmessages.ServerPoll.Partial:type_name -> mixmessages.NDFHash 42, // 14: mixmessages.ServerPollResponse.FullNDF:type_name -> mixmessages.NDF 42, // 15: mixmessages.ServerPollResponse.PartialNDF:type_name -> mixmessages.NDF - 72, // 16: mixmessages.ServerPollResponse.Updates:type_name -> mixmessages.RoundInfo - 72, // 17: mixmessages.ServerPollResponse.BatchRequest:type_name -> mixmessages.RoundInfo + 74, // 16: mixmessages.ServerPollResponse.Updates:type_name -> mixmessages.RoundInfo + 74, // 17: mixmessages.ServerPollResponse.BatchRequest:type_name -> mixmessages.RoundInfo 16, // 18: mixmessages.ServerPollResponse.Batch:type_name -> mixmessages.BatchReady - 78, // 19: mixmessages.SharePiece.Signature:type_name -> messages.RSASignature - 72, // 20: mixmessages.HistoricalRoundsResponse.Rounds:type_name -> mixmessages.RoundInfo + 88, // 19: mixmessages.SharePiece.Signature:type_name -> messages.RSASignature + 74, // 20: mixmessages.HistoricalRoundsResponse.Rounds:type_name -> mixmessages.RoundInfo 25, // 21: mixmessages.GetMessagesBatch.Requests:type_name -> mixmessages.GetMessages 26, // 22: mixmessages.GetMessagesResponseBatch.Results:type_name -> mixmessages.GetMessagesResponse 29, // 23: mixmessages.GetMessagesResponse.Messages:type_name -> mixmessages.Slot 29, // 24: mixmessages.RoundMessages.Messages:type_name -> mixmessages.Slot 41, // 25: mixmessages.GatewayPoll.Partial:type_name -> mixmessages.NDFHash 42, // 26: mixmessages.GatewayPollResponse.PartialNDF:type_name -> mixmessages.NDF - 72, // 27: mixmessages.GatewayPollResponse.Updates:type_name -> mixmessages.RoundInfo + 74, // 27: mixmessages.GatewayPollResponse.Updates:type_name -> mixmessages.RoundInfo 32, // 28: mixmessages.GatewayPollResponse.Filters:type_name -> mixmessages.ClientBlooms 33, // 29: mixmessages.ClientBlooms.Filters:type_name -> mixmessages.ClientBloom 35, // 30: mixmessages.GatewaySlots.Messages:type_name -> mixmessages.GatewaySlot 29, // 31: mixmessages.GatewaySlot.Message:type_name -> mixmessages.Slot - 78, // 32: mixmessages.NDF.Signature:type_name -> messages.RSASignature - 78, // 33: mixmessages.SignedRegistrationConfirmation.RegistrarSignature:type_name -> messages.RSASignature + 88, // 32: mixmessages.NDF.Signature:type_name -> messages.RSASignature + 88, // 33: mixmessages.SignedRegistrationConfirmation.RegistrarSignature:type_name -> messages.RSASignature 46, // 34: mixmessages.SignedClientRegistrationConfirmations.ClientTransmissionConfirmation:type_name -> mixmessages.SignedRegistrationConfirmation 46, // 35: mixmessages.SignedClientRegistrationConfirmations.ClientReceptionConfirmation:type_name -> mixmessages.SignedRegistrationConfirmation 41, // 36: mixmessages.PermissioningPoll.Full:type_name -> mixmessages.NDFHash 41, // 37: mixmessages.PermissioningPoll.Partial:type_name -> mixmessages.NDFHash - 73, // 38: mixmessages.PermissioningPoll.Error:type_name -> mixmessages.RoundError + 75, // 38: mixmessages.PermissioningPoll.Error:type_name -> mixmessages.RoundError 50, // 39: mixmessages.PermissioningPoll.ClientErrors:type_name -> mixmessages.ClientError 42, // 40: mixmessages.PermissionPollResponse.FullNDF:type_name -> mixmessages.NDF 42, // 41: mixmessages.PermissionPollResponse.PartialNDF:type_name -> mixmessages.NDF - 72, // 42: mixmessages.PermissionPollResponse.Updates:type_name -> mixmessages.RoundInfo + 74, // 42: mixmessages.PermissionPollResponse.Updates:type_name -> mixmessages.RoundInfo 56, // 43: mixmessages.UnregisterTrackedIdRequest.Request:type_name -> mixmessages.TrackedIntermediaryIdRequest 56, // 44: mixmessages.RegisterTrackedIdRequest.Request:type_name -> mixmessages.TrackedIntermediaryIdRequest 61, // 45: mixmessages.NotificationBatch.notifications:type_name -> mixmessages.NotificationData - 65, // 46: mixmessages.UDBUserRegistration.IdentityRegistration:type_name -> mixmessages.Identity - 66, // 47: mixmessages.UDBUserRegistration.frs:type_name -> mixmessages.FactRegisterRequest - 67, // 48: mixmessages.FactRegisterRequest.Fact:type_name -> mixmessages.Fact - 67, // 49: mixmessages.FactRemovalRequest.RemovalData:type_name -> mixmessages.Fact - 73, // 50: mixmessages.RoundInfo.Errors:type_name -> mixmessages.RoundError + 67, // 46: mixmessages.UDBUserRegistration.IdentityRegistration:type_name -> mixmessages.Identity + 68, // 47: mixmessages.UDBUserRegistration.frs:type_name -> mixmessages.FactRegisterRequest + 69, // 48: mixmessages.FactRegisterRequest.Fact:type_name -> mixmessages.Fact + 69, // 49: mixmessages.FactRemovalRequest.RemovalData:type_name -> mixmessages.Fact + 75, // 50: mixmessages.RoundInfo.Errors:type_name -> mixmessages.RoundError 50, // 51: mixmessages.RoundInfo.ClientErrors:type_name -> mixmessages.ClientError - 78, // 52: mixmessages.RoundInfo.Signature:type_name -> messages.RSASignature - 80, // 53: mixmessages.RoundInfo.EccSignature:type_name -> messages.ECCSignature - 78, // 54: mixmessages.RoundError.Signature:type_name -> messages.RSASignature - 81, // 55: mixmessages.Node.AskOnline:input_type -> messages.AuthenticatedMessage - 81, // 56: mixmessages.Node.CreateNewRound:input_type -> messages.AuthenticatedMessage + 88, // 52: mixmessages.RoundInfo.Signature:type_name -> messages.RSASignature + 90, // 53: mixmessages.RoundInfo.EccSignature:type_name -> messages.ECCSignature + 88, // 54: mixmessages.RoundError.Signature:type_name -> messages.RSASignature + 91, // 55: mixmessages.Node.AskOnline:input_type -> messages.AuthenticatedMessage + 91, // 56: mixmessages.Node.CreateNewRound:input_type -> messages.AuthenticatedMessage 29, // 57: mixmessages.Node.UploadUnmixedBatch:input_type -> mixmessages.Slot 29, // 58: mixmessages.Node.FinishRealtime:input_type -> mixmessages.Slot 29, // 59: mixmessages.Node.PrecompTestBatch:input_type -> mixmessages.Slot - 81, // 60: mixmessages.Node.PostPhase:input_type -> messages.AuthenticatedMessage + 91, // 60: mixmessages.Node.PostPhase:input_type -> messages.AuthenticatedMessage 29, // 61: mixmessages.Node.StreamPostPhase:input_type -> mixmessages.Slot - 81, // 62: mixmessages.Node.GetRoundBufferInfo:input_type -> messages.AuthenticatedMessage - 81, // 63: mixmessages.Node.RequestClientKey:input_type -> messages.AuthenticatedMessage - 81, // 64: mixmessages.Node.PostPrecompResult:input_type -> messages.AuthenticatedMessage - 81, // 65: mixmessages.Node.GetMeasure:input_type -> messages.AuthenticatedMessage - 81, // 66: mixmessages.Node.Poll:input_type -> messages.AuthenticatedMessage - 81, // 67: mixmessages.Node.DownloadMixedBatch:input_type -> messages.AuthenticatedMessage - 81, // 68: mixmessages.Node.SendRoundTripPing:input_type -> messages.AuthenticatedMessage - 81, // 69: mixmessages.Node.RoundError:input_type -> messages.AuthenticatedMessage - 82, // 70: mixmessages.Node.GetPermissioningAddress:input_type -> messages.Ping - 81, // 71: mixmessages.Node.StartSharePhase:input_type -> messages.AuthenticatedMessage - 81, // 72: mixmessages.Node.SharePhaseRound:input_type -> messages.AuthenticatedMessage - 81, // 73: mixmessages.Node.ShareFinalKey:input_type -> messages.AuthenticatedMessage + 91, // 62: mixmessages.Node.GetRoundBufferInfo:input_type -> messages.AuthenticatedMessage + 91, // 63: mixmessages.Node.RequestClientKey:input_type -> messages.AuthenticatedMessage + 91, // 64: mixmessages.Node.PostPrecompResult:input_type -> messages.AuthenticatedMessage + 91, // 65: mixmessages.Node.GetMeasure:input_type -> messages.AuthenticatedMessage + 91, // 66: mixmessages.Node.Poll:input_type -> messages.AuthenticatedMessage + 91, // 67: mixmessages.Node.DownloadMixedBatch:input_type -> messages.AuthenticatedMessage + 91, // 68: mixmessages.Node.SendRoundTripPing:input_type -> messages.AuthenticatedMessage + 91, // 69: mixmessages.Node.RoundError:input_type -> messages.AuthenticatedMessage + 92, // 70: mixmessages.Node.GetPermissioningAddress:input_type -> messages.Ping + 91, // 71: mixmessages.Node.StartSharePhase:input_type -> messages.AuthenticatedMessage + 91, // 72: mixmessages.Node.SharePhaseRound:input_type -> messages.AuthenticatedMessage + 91, // 73: mixmessages.Node.ShareFinalKey:input_type -> messages.AuthenticatedMessage 2, // 74: mixmessages.Gateway.RequestClientKey:input_type -> mixmessages.SignedClientKeyRequest 1, // 75: mixmessages.Gateway.BatchNodeRegistration:input_type -> mixmessages.SignedClientBatchKeyRequest 35, // 76: mixmessages.Gateway.PutMessage:input_type -> mixmessages.GatewaySlot 34, // 77: mixmessages.Gateway.PutManyMessages:input_type -> mixmessages.GatewaySlots - 81, // 78: mixmessages.Gateway.PutMessageProxy:input_type -> messages.AuthenticatedMessage - 81, // 79: mixmessages.Gateway.PutManyMessagesProxy:input_type -> messages.AuthenticatedMessage + 91, // 78: mixmessages.Gateway.PutMessageProxy:input_type -> messages.AuthenticatedMessage + 91, // 79: mixmessages.Gateway.PutManyMessagesProxy:input_type -> messages.AuthenticatedMessage 30, // 80: mixmessages.Gateway.Poll:input_type -> mixmessages.GatewayPoll 21, // 81: mixmessages.Gateway.RequestHistoricalRounds:input_type -> mixmessages.HistoricalRounds 25, // 82: mixmessages.Gateway.RequestMessages:input_type -> mixmessages.GetMessages @@ -6490,77 +7139,91 @@ var file_mixmessages_proto_depIdxs = []int32{ 44, // 85: mixmessages.ClientRegistrar.RegisterUser:input_type -> mixmessages.ClientRegistration 43, // 86: mixmessages.Registration.RegisterNode:input_type -> mixmessages.NodeRegistration 41, // 87: mixmessages.Registration.PollNdf:input_type -> mixmessages.NDFHash - 81, // 88: mixmessages.Registration.Poll:input_type -> messages.AuthenticatedMessage + 91, // 88: mixmessages.Registration.Poll:input_type -> messages.AuthenticatedMessage 40, // 89: mixmessages.Registration.CheckRegistration:input_type -> mixmessages.RegisteredNodeCheck 58, // 90: mixmessages.NotificationBot.UnregisterForNotifications:input_type -> mixmessages.NotificationUnregisterRequest 57, // 91: mixmessages.NotificationBot.RegisterForNotifications:input_type -> mixmessages.NotificationRegisterRequest - 81, // 92: mixmessages.NotificationBot.ReceiveNotificationBatch:input_type -> messages.AuthenticatedMessage + 91, // 92: mixmessages.NotificationBot.ReceiveNotificationBatch:input_type -> messages.AuthenticatedMessage 52, // 93: mixmessages.NotificationBot.RegisterToken:input_type -> mixmessages.RegisterTokenRequest 53, // 94: mixmessages.NotificationBot.UnregisterToken:input_type -> mixmessages.UnregisterTokenRequest 55, // 95: mixmessages.NotificationBot.RegisterTrackedID:input_type -> mixmessages.RegisterTrackedIdRequest 54, // 96: mixmessages.NotificationBot.UnregisterTrackedID:input_type -> mixmessages.UnregisterTrackedIdRequest - 64, // 97: mixmessages.UDB.RegisterUser:input_type -> mixmessages.UDBUserRegistration - 70, // 98: mixmessages.UDB.RemoveUser:input_type -> mixmessages.FactRemovalRequest - 66, // 99: mixmessages.UDB.RegisterFact:input_type -> mixmessages.FactRegisterRequest - 69, // 100: mixmessages.UDB.ConfirmFact:input_type -> mixmessages.FactConfirmRequest - 70, // 101: mixmessages.UDB.RemoveFact:input_type -> mixmessages.FactRemovalRequest + 66, // 97: mixmessages.UDB.RegisterUser:input_type -> mixmessages.UDBUserRegistration + 72, // 98: mixmessages.UDB.RemoveUser:input_type -> mixmessages.FactRemovalRequest + 68, // 99: mixmessages.UDB.RegisterFact:input_type -> mixmessages.FactRegisterRequest + 71, // 100: mixmessages.UDB.ConfirmFact:input_type -> mixmessages.FactConfirmRequest + 72, // 101: mixmessages.UDB.RemoveFact:input_type -> mixmessages.FactRemovalRequest 62, // 102: mixmessages.UDB.RequestChannelLease:input_type -> mixmessages.ChannelLeaseRequest - 77, // 103: mixmessages.Authorizer.Authorize:input_type -> mixmessages.AuthorizerAuth - 76, // 104: mixmessages.Authorizer.RequestCert:input_type -> mixmessages.AuthorizerCertRequest - 74, // 105: mixmessages.Authorizer.RequestEABCredentials:input_type -> mixmessages.EABCredentialRequest - 83, // 106: mixmessages.Node.AskOnline:output_type -> messages.Ack - 83, // 107: mixmessages.Node.CreateNewRound:output_type -> messages.Ack - 83, // 108: mixmessages.Node.UploadUnmixedBatch:output_type -> messages.Ack - 83, // 109: mixmessages.Node.FinishRealtime:output_type -> messages.Ack - 83, // 110: mixmessages.Node.PrecompTestBatch:output_type -> messages.Ack - 83, // 111: mixmessages.Node.PostPhase:output_type -> messages.Ack - 83, // 112: mixmessages.Node.StreamPostPhase:output_type -> messages.Ack - 7, // 113: mixmessages.Node.GetRoundBufferInfo:output_type -> mixmessages.RoundBufferInfo - 5, // 114: mixmessages.Node.RequestClientKey:output_type -> mixmessages.SignedKeyResponse - 83, // 115: mixmessages.Node.PostPrecompResult:output_type -> messages.Ack - 9, // 116: mixmessages.Node.GetMeasure:output_type -> mixmessages.RoundMetrics - 15, // 117: mixmessages.Node.Poll:output_type -> mixmessages.ServerPollResponse - 29, // 118: mixmessages.Node.DownloadMixedBatch:output_type -> mixmessages.Slot - 83, // 119: mixmessages.Node.SendRoundTripPing:output_type -> messages.Ack - 83, // 120: mixmessages.Node.RoundError:output_type -> messages.Ack - 71, // 121: mixmessages.Node.GetPermissioningAddress:output_type -> mixmessages.StrAddress - 83, // 122: mixmessages.Node.StartSharePhase:output_type -> messages.Ack - 83, // 123: mixmessages.Node.SharePhaseRound:output_type -> messages.Ack - 83, // 124: mixmessages.Node.ShareFinalKey:output_type -> messages.Ack - 5, // 125: mixmessages.Gateway.RequestClientKey:output_type -> mixmessages.SignedKeyResponse - 4, // 126: mixmessages.Gateway.BatchNodeRegistration:output_type -> mixmessages.SignedBatchKeyResponse - 36, // 127: mixmessages.Gateway.PutMessage:output_type -> mixmessages.GatewaySlotResponse - 36, // 128: mixmessages.Gateway.PutManyMessages:output_type -> mixmessages.GatewaySlotResponse - 36, // 129: mixmessages.Gateway.PutMessageProxy:output_type -> mixmessages.GatewaySlotResponse - 36, // 130: mixmessages.Gateway.PutManyMessagesProxy:output_type -> mixmessages.GatewaySlotResponse - 20, // 131: mixmessages.Gateway.Poll:output_type -> mixmessages.StreamChunk - 22, // 132: mixmessages.Gateway.RequestHistoricalRounds:output_type -> mixmessages.HistoricalRoundsResponse - 26, // 133: mixmessages.Gateway.RequestMessages:output_type -> mixmessages.GetMessagesResponse - 24, // 134: mixmessages.Gateway.RequestBatchMessages:output_type -> mixmessages.GetMessagesResponseBatch - 19, // 135: mixmessages.Gateway.RequestTlsCert:output_type -> mixmessages.GatewayCertificate - 47, // 136: mixmessages.ClientRegistrar.RegisterUser:output_type -> mixmessages.SignedClientRegistrationConfirmations - 83, // 137: mixmessages.Registration.RegisterNode:output_type -> messages.Ack - 42, // 138: mixmessages.Registration.PollNdf:output_type -> mixmessages.NDF - 51, // 139: mixmessages.Registration.Poll:output_type -> mixmessages.PermissionPollResponse - 39, // 140: mixmessages.Registration.CheckRegistration:output_type -> mixmessages.RegisteredNodeConfirmation - 83, // 141: mixmessages.NotificationBot.UnregisterForNotifications:output_type -> messages.Ack - 83, // 142: mixmessages.NotificationBot.RegisterForNotifications:output_type -> messages.Ack - 83, // 143: mixmessages.NotificationBot.ReceiveNotificationBatch:output_type -> messages.Ack - 83, // 144: mixmessages.NotificationBot.RegisterToken:output_type -> messages.Ack - 83, // 145: mixmessages.NotificationBot.UnregisterToken:output_type -> messages.Ack - 83, // 146: mixmessages.NotificationBot.RegisterTrackedID:output_type -> messages.Ack - 83, // 147: mixmessages.NotificationBot.UnregisterTrackedID:output_type -> messages.Ack - 83, // 148: mixmessages.UDB.RegisterUser:output_type -> messages.Ack - 83, // 149: mixmessages.UDB.RemoveUser:output_type -> messages.Ack - 68, // 150: mixmessages.UDB.RegisterFact:output_type -> mixmessages.FactRegisterResponse - 83, // 151: mixmessages.UDB.ConfirmFact:output_type -> messages.Ack - 83, // 152: mixmessages.UDB.RemoveFact:output_type -> messages.Ack - 63, // 153: mixmessages.UDB.RequestChannelLease:output_type -> mixmessages.ChannelLeaseResponse - 83, // 154: mixmessages.Authorizer.Authorize:output_type -> messages.Ack - 83, // 155: mixmessages.Authorizer.RequestCert:output_type -> messages.Ack - 75, // 156: mixmessages.Authorizer.RequestEABCredentials:output_type -> mixmessages.EABCredentialResponse - 106, // [106:157] is the sub-list for method output_type - 55, // [55:106] is the sub-list for method input_type + 64, // 103: mixmessages.UDB.ValidateUsername:input_type -> mixmessages.UsernameValidationRequest + 79, // 104: mixmessages.Authorizer.Authorize:input_type -> mixmessages.AuthorizerAuth + 78, // 105: mixmessages.Authorizer.RequestCert:input_type -> mixmessages.AuthorizerCertRequest + 76, // 106: mixmessages.Authorizer.RequestEABCredentials:input_type -> mixmessages.EABCredentialRequest + 80, // 107: mixmessages.RemoteSync.Login:input_type -> mixmessages.RsAuthenticationRequest + 82, // 108: mixmessages.RemoteSync.Read:input_type -> mixmessages.RsReadRequest + 85, // 109: mixmessages.RemoteSync.Write:input_type -> mixmessages.RsWriteRequest + 82, // 110: mixmessages.RemoteSync.GetLastModified:input_type -> mixmessages.RsReadRequest + 83, // 111: mixmessages.RemoteSync.GetLastWrite:input_type -> mixmessages.RsLastWriteRequest + 82, // 112: mixmessages.RemoteSync.ReadDir:input_type -> mixmessages.RsReadRequest + 93, // 113: mixmessages.Node.AskOnline:output_type -> messages.Ack + 93, // 114: mixmessages.Node.CreateNewRound:output_type -> messages.Ack + 93, // 115: mixmessages.Node.UploadUnmixedBatch:output_type -> messages.Ack + 93, // 116: mixmessages.Node.FinishRealtime:output_type -> messages.Ack + 93, // 117: mixmessages.Node.PrecompTestBatch:output_type -> messages.Ack + 93, // 118: mixmessages.Node.PostPhase:output_type -> messages.Ack + 93, // 119: mixmessages.Node.StreamPostPhase:output_type -> messages.Ack + 7, // 120: mixmessages.Node.GetRoundBufferInfo:output_type -> mixmessages.RoundBufferInfo + 5, // 121: mixmessages.Node.RequestClientKey:output_type -> mixmessages.SignedKeyResponse + 93, // 122: mixmessages.Node.PostPrecompResult:output_type -> messages.Ack + 9, // 123: mixmessages.Node.GetMeasure:output_type -> mixmessages.RoundMetrics + 15, // 124: mixmessages.Node.Poll:output_type -> mixmessages.ServerPollResponse + 29, // 125: mixmessages.Node.DownloadMixedBatch:output_type -> mixmessages.Slot + 93, // 126: mixmessages.Node.SendRoundTripPing:output_type -> messages.Ack + 93, // 127: mixmessages.Node.RoundError:output_type -> messages.Ack + 73, // 128: mixmessages.Node.GetPermissioningAddress:output_type -> mixmessages.StrAddress + 93, // 129: mixmessages.Node.StartSharePhase:output_type -> messages.Ack + 93, // 130: mixmessages.Node.SharePhaseRound:output_type -> messages.Ack + 93, // 131: mixmessages.Node.ShareFinalKey:output_type -> messages.Ack + 5, // 132: mixmessages.Gateway.RequestClientKey:output_type -> mixmessages.SignedKeyResponse + 4, // 133: mixmessages.Gateway.BatchNodeRegistration:output_type -> mixmessages.SignedBatchKeyResponse + 36, // 134: mixmessages.Gateway.PutMessage:output_type -> mixmessages.GatewaySlotResponse + 36, // 135: mixmessages.Gateway.PutManyMessages:output_type -> mixmessages.GatewaySlotResponse + 36, // 136: mixmessages.Gateway.PutMessageProxy:output_type -> mixmessages.GatewaySlotResponse + 36, // 137: mixmessages.Gateway.PutManyMessagesProxy:output_type -> mixmessages.GatewaySlotResponse + 20, // 138: mixmessages.Gateway.Poll:output_type -> mixmessages.StreamChunk + 22, // 139: mixmessages.Gateway.RequestHistoricalRounds:output_type -> mixmessages.HistoricalRoundsResponse + 26, // 140: mixmessages.Gateway.RequestMessages:output_type -> mixmessages.GetMessagesResponse + 24, // 141: mixmessages.Gateway.RequestBatchMessages:output_type -> mixmessages.GetMessagesResponseBatch + 19, // 142: mixmessages.Gateway.RequestTlsCert:output_type -> mixmessages.GatewayCertificate + 47, // 143: mixmessages.ClientRegistrar.RegisterUser:output_type -> mixmessages.SignedClientRegistrationConfirmations + 93, // 144: mixmessages.Registration.RegisterNode:output_type -> messages.Ack + 42, // 145: mixmessages.Registration.PollNdf:output_type -> mixmessages.NDF + 51, // 146: mixmessages.Registration.Poll:output_type -> mixmessages.PermissionPollResponse + 39, // 147: mixmessages.Registration.CheckRegistration:output_type -> mixmessages.RegisteredNodeConfirmation + 93, // 148: mixmessages.NotificationBot.UnregisterForNotifications:output_type -> messages.Ack + 93, // 149: mixmessages.NotificationBot.RegisterForNotifications:output_type -> messages.Ack + 93, // 150: mixmessages.NotificationBot.ReceiveNotificationBatch:output_type -> messages.Ack + 93, // 151: mixmessages.NotificationBot.RegisterToken:output_type -> messages.Ack + 93, // 152: mixmessages.NotificationBot.UnregisterToken:output_type -> messages.Ack + 93, // 153: mixmessages.NotificationBot.RegisterTrackedID:output_type -> messages.Ack + 93, // 154: mixmessages.NotificationBot.UnregisterTrackedID:output_type -> messages.Ack + 93, // 155: mixmessages.UDB.RegisterUser:output_type -> messages.Ack + 93, // 156: mixmessages.UDB.RemoveUser:output_type -> messages.Ack + 70, // 157: mixmessages.UDB.RegisterFact:output_type -> mixmessages.FactRegisterResponse + 93, // 158: mixmessages.UDB.ConfirmFact:output_type -> messages.Ack + 93, // 159: mixmessages.UDB.RemoveFact:output_type -> messages.Ack + 63, // 160: mixmessages.UDB.RequestChannelLease:output_type -> mixmessages.ChannelLeaseResponse + 65, // 161: mixmessages.UDB.ValidateUsername:output_type -> mixmessages.UsernameValidation + 93, // 162: mixmessages.Authorizer.Authorize:output_type -> messages.Ack + 93, // 163: mixmessages.Authorizer.RequestCert:output_type -> messages.Ack + 77, // 164: mixmessages.Authorizer.RequestEABCredentials:output_type -> mixmessages.EABCredentialResponse + 81, // 165: mixmessages.RemoteSync.Login:output_type -> mixmessages.RsAuthenticationResponse + 84, // 166: mixmessages.RemoteSync.Read:output_type -> mixmessages.RsReadResponse + 93, // 167: mixmessages.RemoteSync.Write:output_type -> messages.Ack + 87, // 168: mixmessages.RemoteSync.GetLastModified:output_type -> mixmessages.RsTimestampResponse + 87, // 169: mixmessages.RemoteSync.GetLastWrite:output_type -> mixmessages.RsTimestampResponse + 86, // 170: mixmessages.RemoteSync.ReadDir:output_type -> mixmessages.RsReadDirResponse + 113, // [113:171] is the sub-list for method output_type + 55, // [55:113] is the sub-list for method input_type 55, // [55:55] is the sub-list for extension type_name 55, // [55:55] is the sub-list for extension extendee 0, // [0:55] is the sub-list for field type_name @@ -7341,7 +8004,7 @@ func file_mixmessages_proto_init() { } } file_mixmessages_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UDBUserRegistration); i { + switch v := v.(*UsernameValidationRequest); i { case 0: return &v.state case 1: @@ -7353,7 +8016,7 @@ func file_mixmessages_proto_init() { } } file_mixmessages_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Identity); i { + switch v := v.(*UsernameValidation); i { case 0: return &v.state case 1: @@ -7365,7 +8028,7 @@ func file_mixmessages_proto_init() { } } file_mixmessages_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FactRegisterRequest); i { + switch v := v.(*UDBUserRegistration); i { case 0: return &v.state case 1: @@ -7377,7 +8040,7 @@ func file_mixmessages_proto_init() { } } file_mixmessages_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Fact); i { + switch v := v.(*Identity); i { case 0: return &v.state case 1: @@ -7389,7 +8052,7 @@ func file_mixmessages_proto_init() { } } file_mixmessages_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FactRegisterResponse); i { + switch v := v.(*FactRegisterRequest); i { case 0: return &v.state case 1: @@ -7401,7 +8064,7 @@ func file_mixmessages_proto_init() { } } file_mixmessages_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FactConfirmRequest); i { + switch v := v.(*Fact); i { case 0: return &v.state case 1: @@ -7413,7 +8076,7 @@ func file_mixmessages_proto_init() { } } file_mixmessages_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FactRemovalRequest); i { + switch v := v.(*FactRegisterResponse); i { case 0: return &v.state case 1: @@ -7425,7 +8088,7 @@ func file_mixmessages_proto_init() { } } file_mixmessages_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StrAddress); i { + switch v := v.(*FactConfirmRequest); i { case 0: return &v.state case 1: @@ -7437,7 +8100,7 @@ func file_mixmessages_proto_init() { } } file_mixmessages_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RoundInfo); i { + switch v := v.(*FactRemovalRequest); i { case 0: return &v.state case 1: @@ -7449,7 +8112,7 @@ func file_mixmessages_proto_init() { } } file_mixmessages_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RoundError); i { + switch v := v.(*StrAddress); i { case 0: return &v.state case 1: @@ -7461,7 +8124,7 @@ func file_mixmessages_proto_init() { } } file_mixmessages_proto_msgTypes[74].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EABCredentialRequest); i { + switch v := v.(*RoundInfo); i { case 0: return &v.state case 1: @@ -7473,7 +8136,7 @@ func file_mixmessages_proto_init() { } } file_mixmessages_proto_msgTypes[75].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EABCredentialResponse); i { + switch v := v.(*RoundError); i { case 0: return &v.state case 1: @@ -7485,7 +8148,7 @@ func file_mixmessages_proto_init() { } } file_mixmessages_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AuthorizerCertRequest); i { + switch v := v.(*EABCredentialRequest); i { case 0: return &v.state case 1: @@ -7497,6 +8160,30 @@ func file_mixmessages_proto_init() { } } file_mixmessages_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EABCredentialResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_mixmessages_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AuthorizerCertRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_mixmessages_proto_msgTypes[79].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AuthorizerAuth); i { case 0: return &v.state @@ -7508,6 +8195,102 @@ func file_mixmessages_proto_init() { return nil } } + file_mixmessages_proto_msgTypes[80].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RsAuthenticationRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_mixmessages_proto_msgTypes[81].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RsAuthenticationResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_mixmessages_proto_msgTypes[82].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RsReadRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_mixmessages_proto_msgTypes[83].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RsLastWriteRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_mixmessages_proto_msgTypes[84].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RsReadResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_mixmessages_proto_msgTypes[85].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RsWriteRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_mixmessages_proto_msgTypes[86].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RsReadDirResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_mixmessages_proto_msgTypes[87].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RsTimestampResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } type x struct{} out := protoimpl.TypeBuilder{ @@ -7515,9 +8298,9 @@ func file_mixmessages_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_mixmessages_proto_rawDesc, NumEnums: 0, - NumMessages: 78, + NumMessages: 88, NumExtensions: 0, - NumServices: 7, + NumServices: 8, }, GoTypes: file_mixmessages_proto_goTypes, DependencyIndexes: file_mixmessages_proto_depIdxs, diff --git a/mixmessages/mixmessages.proto b/mixmessages/mixmessages.proto index 3c71ad21f3bfe5e29ee1950b21c882061963997d..a5c75866821aeeec2ccb41b418205b1db8f8c9c9 100644 --- a/mixmessages/mixmessages.proto +++ b/mixmessages/mixmessages.proto @@ -659,6 +659,8 @@ message UnregisterTrackedIdRequest { message RegisterTrackedIdRequest { TrackedIntermediaryIdRequest Request = 1; + int64 RegistrationTimestamp = 2; + bytes TransmissionRsaRegistrarSig = 3; } message TrackedIntermediaryIdRequest { @@ -734,8 +736,11 @@ service UDB { // RequestChannelAuthentication requests a signature from UD on a user's ed25519 public key // Returning a lease and a signature from UD rpc RequestChannelLease (ChannelLeaseRequest) returns (ChannelLeaseResponse) { - } + + // ValidateUsername sends a UsernameValidationRequest. This is a user side + // initiated comm, where UD signs the username. + rpc ValidateUsername(UsernameValidationRequest) returns (UsernameValidation) {} } // Holds information for a user requesting a channel lease from UD @@ -754,6 +759,21 @@ message ChannelLeaseResponse { } +// UsernameValidationRequest is the message a user sends to UD to +// for validation that they own their username +message UsernameValidationRequest { + bytes UserId = 3; +} + +// UsernameValidation is the response to a UsernameValidationRequest. +// This contains a signature from a UD server on the data within the request message. +message UsernameValidation { + bytes Signature = 1; + string Username = 2; + bytes ReceptionPublicKeyPem = 3; + +} + // Holds information for a UDB user registration request message UDBUserRegistration { bytes PermissioningSignature = 1; @@ -870,3 +890,51 @@ message AuthorizerAuth{ int64 TimeStamp = 4; bytes signature = 5; } + + +service RemoteSync{ + rpc Login(RsAuthenticationRequest) returns (RsAuthenticationResponse); + rpc Read(RsReadRequest) returns (RsReadResponse); + rpc Write(RsWriteRequest) returns (messages.Ack); + rpc GetLastModified(RsReadRequest) returns (RsTimestampResponse); + rpc GetLastWrite(RsLastWriteRequest) returns (RsTimestampResponse); + rpc ReadDir(RsReadRequest) returns (RsReadDirResponse); +} + +message RsAuthenticationRequest{ + string Username = 1; + bytes PasswordHash = 2; + bytes Salt = 3; +} + +message RsAuthenticationResponse{ + bytes Token = 1; + int64 ExpiresAt = 2; +} + +message RsReadRequest{ + string Path = 1; + bytes Token = 2; +} + +message RsLastWriteRequest{ + bytes Token = 1; +} + +message RsReadResponse{ + bytes Data = 1; +} + +message RsWriteRequest{ + string Path = 1; + bytes Data = 2; + bytes Token = 3; +} + +message RsReadDirResponse { + repeated string Data = 1; +} + +message RsTimestampResponse{ + int64 Timestamp = 1; +} diff --git a/mixmessages/mixmessages_grpc.pb.go b/mixmessages/mixmessages_grpc.pb.go index a2f83a9f125fbe61f24d3d00abed38e3fda072a9..92881136d1ed74ded851830842d68965d6a57671 100644 --- a/mixmessages/mixmessages_grpc.pb.go +++ b/mixmessages/mixmessages_grpc.pb.go @@ -2085,6 +2085,9 @@ type UDBClient interface { // RequestChannelAuthentication requests a signature from UD on a user's ed25519 public key // Returning a lease and a signature from UD RequestChannelLease(ctx context.Context, in *ChannelLeaseRequest, opts ...grpc.CallOption) (*ChannelLeaseResponse, error) + // ValidateUsername sends a UsernameValidationRequest. This is a user side + // initiated comm, where UD signs the username. + ValidateUsername(ctx context.Context, in *UsernameValidationRequest, opts ...grpc.CallOption) (*UsernameValidation, error) } type uDBClient struct { @@ -2149,6 +2152,15 @@ func (c *uDBClient) RequestChannelLease(ctx context.Context, in *ChannelLeaseReq return out, nil } +func (c *uDBClient) ValidateUsername(ctx context.Context, in *UsernameValidationRequest, opts ...grpc.CallOption) (*UsernameValidation, error) { + out := new(UsernameValidation) + err := c.cc.Invoke(ctx, "/mixmessages.UDB/ValidateUsername", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // UDBServer is the server API for UDB service. // All implementations must embed UnimplementedUDBServer // for forward compatibility @@ -2171,6 +2183,9 @@ type UDBServer interface { // RequestChannelAuthentication requests a signature from UD on a user's ed25519 public key // Returning a lease and a signature from UD RequestChannelLease(context.Context, *ChannelLeaseRequest) (*ChannelLeaseResponse, error) + // ValidateUsername sends a UsernameValidationRequest. This is a user side + // initiated comm, where UD signs the username. + ValidateUsername(context.Context, *UsernameValidationRequest) (*UsernameValidation, error) mustEmbedUnimplementedUDBServer() } @@ -2196,6 +2211,9 @@ func (UnimplementedUDBServer) RemoveFact(context.Context, *FactRemovalRequest) ( func (UnimplementedUDBServer) RequestChannelLease(context.Context, *ChannelLeaseRequest) (*ChannelLeaseResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method RequestChannelLease not implemented") } +func (UnimplementedUDBServer) ValidateUsername(context.Context, *UsernameValidationRequest) (*UsernameValidation, error) { + return nil, status.Errorf(codes.Unimplemented, "method ValidateUsername not implemented") +} func (UnimplementedUDBServer) mustEmbedUnimplementedUDBServer() {} // UnsafeUDBServer may be embedded to opt out of forward compatibility for this service. @@ -2317,6 +2335,24 @@ func _UDB_RequestChannelLease_Handler(srv interface{}, ctx context.Context, dec return interceptor(ctx, in, info, handler) } +func _UDB_ValidateUsername_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UsernameValidationRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(UDBServer).ValidateUsername(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/mixmessages.UDB/ValidateUsername", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(UDBServer).ValidateUsername(ctx, req.(*UsernameValidationRequest)) + } + return interceptor(ctx, in, info, handler) +} + // UDB_ServiceDesc is the grpc.ServiceDesc for UDB service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -2348,6 +2384,10 @@ var UDB_ServiceDesc = grpc.ServiceDesc{ MethodName: "RequestChannelLease", Handler: _UDB_RequestChannelLease_Handler, }, + { + MethodName: "ValidateUsername", + Handler: _UDB_ValidateUsername_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "mixmessages.proto", @@ -2510,3 +2550,269 @@ var Authorizer_ServiceDesc = grpc.ServiceDesc{ Streams: []grpc.StreamDesc{}, Metadata: "mixmessages.proto", } + +// RemoteSyncClient is the client API for RemoteSync service. +// +// 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 RemoteSyncClient interface { + Login(ctx context.Context, in *RsAuthenticationRequest, opts ...grpc.CallOption) (*RsAuthenticationResponse, error) + Read(ctx context.Context, in *RsReadRequest, opts ...grpc.CallOption) (*RsReadResponse, error) + Write(ctx context.Context, in *RsWriteRequest, opts ...grpc.CallOption) (*messages.Ack, error) + GetLastModified(ctx context.Context, in *RsReadRequest, opts ...grpc.CallOption) (*RsTimestampResponse, error) + GetLastWrite(ctx context.Context, in *RsLastWriteRequest, opts ...grpc.CallOption) (*RsTimestampResponse, error) + ReadDir(ctx context.Context, in *RsReadRequest, opts ...grpc.CallOption) (*RsReadDirResponse, error) +} + +type remoteSyncClient struct { + cc grpc.ClientConnInterface +} + +func NewRemoteSyncClient(cc grpc.ClientConnInterface) RemoteSyncClient { + return &remoteSyncClient{cc} +} + +func (c *remoteSyncClient) Login(ctx context.Context, in *RsAuthenticationRequest, opts ...grpc.CallOption) (*RsAuthenticationResponse, error) { + out := new(RsAuthenticationResponse) + err := c.cc.Invoke(ctx, "/mixmessages.RemoteSync/Login", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *remoteSyncClient) Read(ctx context.Context, in *RsReadRequest, opts ...grpc.CallOption) (*RsReadResponse, error) { + out := new(RsReadResponse) + err := c.cc.Invoke(ctx, "/mixmessages.RemoteSync/Read", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *remoteSyncClient) Write(ctx context.Context, in *RsWriteRequest, opts ...grpc.CallOption) (*messages.Ack, error) { + out := new(messages.Ack) + err := c.cc.Invoke(ctx, "/mixmessages.RemoteSync/Write", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *remoteSyncClient) GetLastModified(ctx context.Context, in *RsReadRequest, opts ...grpc.CallOption) (*RsTimestampResponse, error) { + out := new(RsTimestampResponse) + err := c.cc.Invoke(ctx, "/mixmessages.RemoteSync/GetLastModified", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *remoteSyncClient) GetLastWrite(ctx context.Context, in *RsLastWriteRequest, opts ...grpc.CallOption) (*RsTimestampResponse, error) { + out := new(RsTimestampResponse) + err := c.cc.Invoke(ctx, "/mixmessages.RemoteSync/GetLastWrite", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *remoteSyncClient) ReadDir(ctx context.Context, in *RsReadRequest, opts ...grpc.CallOption) (*RsReadDirResponse, error) { + out := new(RsReadDirResponse) + err := c.cc.Invoke(ctx, "/mixmessages.RemoteSync/ReadDir", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// RemoteSyncServer is the server API for RemoteSync service. +// All implementations must embed UnimplementedRemoteSyncServer +// for forward compatibility +type RemoteSyncServer interface { + Login(context.Context, *RsAuthenticationRequest) (*RsAuthenticationResponse, error) + Read(context.Context, *RsReadRequest) (*RsReadResponse, error) + Write(context.Context, *RsWriteRequest) (*messages.Ack, error) + GetLastModified(context.Context, *RsReadRequest) (*RsTimestampResponse, error) + GetLastWrite(context.Context, *RsLastWriteRequest) (*RsTimestampResponse, error) + ReadDir(context.Context, *RsReadRequest) (*RsReadDirResponse, error) + mustEmbedUnimplementedRemoteSyncServer() +} + +// UnimplementedRemoteSyncServer must be embedded to have forward compatible implementations. +type UnimplementedRemoteSyncServer struct { +} + +func (UnimplementedRemoteSyncServer) Login(context.Context, *RsAuthenticationRequest) (*RsAuthenticationResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Login not implemented") +} +func (UnimplementedRemoteSyncServer) Read(context.Context, *RsReadRequest) (*RsReadResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Read not implemented") +} +func (UnimplementedRemoteSyncServer) Write(context.Context, *RsWriteRequest) (*messages.Ack, error) { + return nil, status.Errorf(codes.Unimplemented, "method Write not implemented") +} +func (UnimplementedRemoteSyncServer) GetLastModified(context.Context, *RsReadRequest) (*RsTimestampResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetLastModified not implemented") +} +func (UnimplementedRemoteSyncServer) GetLastWrite(context.Context, *RsLastWriteRequest) (*RsTimestampResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetLastWrite not implemented") +} +func (UnimplementedRemoteSyncServer) ReadDir(context.Context, *RsReadRequest) (*RsReadDirResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ReadDir not implemented") +} +func (UnimplementedRemoteSyncServer) mustEmbedUnimplementedRemoteSyncServer() {} + +// UnsafeRemoteSyncServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to RemoteSyncServer will +// result in compilation errors. +type UnsafeRemoteSyncServer interface { + mustEmbedUnimplementedRemoteSyncServer() +} + +func RegisterRemoteSyncServer(s grpc.ServiceRegistrar, srv RemoteSyncServer) { + s.RegisterService(&RemoteSync_ServiceDesc, srv) +} + +func _RemoteSync_Login_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RsAuthenticationRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(RemoteSyncServer).Login(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/mixmessages.RemoteSync/Login", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(RemoteSyncServer).Login(ctx, req.(*RsAuthenticationRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _RemoteSync_Read_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RsReadRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(RemoteSyncServer).Read(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/mixmessages.RemoteSync/Read", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(RemoteSyncServer).Read(ctx, req.(*RsReadRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _RemoteSync_Write_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RsWriteRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(RemoteSyncServer).Write(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/mixmessages.RemoteSync/Write", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(RemoteSyncServer).Write(ctx, req.(*RsWriteRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _RemoteSync_GetLastModified_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RsReadRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(RemoteSyncServer).GetLastModified(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/mixmessages.RemoteSync/GetLastModified", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(RemoteSyncServer).GetLastModified(ctx, req.(*RsReadRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _RemoteSync_GetLastWrite_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RsLastWriteRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(RemoteSyncServer).GetLastWrite(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/mixmessages.RemoteSync/GetLastWrite", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(RemoteSyncServer).GetLastWrite(ctx, req.(*RsLastWriteRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _RemoteSync_ReadDir_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RsReadRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(RemoteSyncServer).ReadDir(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/mixmessages.RemoteSync/ReadDir", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(RemoteSyncServer).ReadDir(ctx, req.(*RsReadRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// RemoteSync_ServiceDesc is the grpc.ServiceDesc for RemoteSync service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var RemoteSync_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "mixmessages.RemoteSync", + HandlerType: (*RemoteSyncServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "Login", + Handler: _RemoteSync_Login_Handler, + }, + { + MethodName: "Read", + Handler: _RemoteSync_Read_Handler, + }, + { + MethodName: "Write", + Handler: _RemoteSync_Write_Handler, + }, + { + MethodName: "GetLastModified", + Handler: _RemoteSync_GetLastModified_Handler, + }, + { + MethodName: "GetLastWrite", + Handler: _RemoteSync_GetLastWrite_Handler, + }, + { + MethodName: "ReadDir", + Handler: _RemoteSync_ReadDir_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "mixmessages.proto", +} diff --git a/remoteSync/client/broadcast.go b/remoteSync/client/broadcast.go new file mode 100644 index 0000000000000000000000000000000000000000..53b64bfb3150d541ce4565c34ea5c6c3aa1dd6cb --- /dev/null +++ b/remoteSync/client/broadcast.go @@ -0,0 +1,172 @@ +package client + +import ( + "github.com/golang/protobuf/ptypes" + "github.com/golang/protobuf/ptypes/any" + "github.com/pkg/errors" + pb "gitlab.com/elixxir/comms/mixmessages" + "gitlab.com/xx_network/comms/connect" + "gitlab.com/xx_network/comms/messages" +) + +// Login to the server, receiving an authentication token +func (rc *Comms) Login(host *connect.Host, msg *pb.RsAuthenticationRequest) (*pb.RsAuthenticationResponse, error) { + // Create the Send Function + f := func(conn connect.Connection) (*any.Any, error) { + // Set up the context + ctx, cancel := host.GetMessagingContext() + defer cancel() + // Send the message + resultMsg, err := pb.NewRemoteSyncClient(conn.GetGrpcConn()). + Login(ctx, msg) + if err != nil { + return nil, errors.New(err.Error()) + } + return ptypes.MarshalAny(resultMsg) + } + + // Execute the Send function + resultMsg, err := rc.Send(host, f) + if err != nil { + return nil, err + } + + // Marshall the result + result := &pb.RsAuthenticationResponse{} + return result, ptypes.UnmarshalAny(resultMsg, result) +} + +// Read a resource from a RemoteSync server. +func (rc *Comms) Read(host *connect.Host, msg *pb.RsReadRequest) (*pb.RsReadResponse, error) { + // Create the Send Function + f := func(conn connect.Connection) (*any.Any, error) { + // Set up the context + ctx, cancel := host.GetMessagingContext() + defer cancel() + // Send the message + resultMsg, err := pb.NewRemoteSyncClient(conn.GetGrpcConn()). + Read(ctx, msg) + if err != nil { + return nil, errors.New(err.Error()) + } + return ptypes.MarshalAny(resultMsg) + } + + // Execute the Send function + resultMsg, err := rc.Send(host, f) + if err != nil { + return nil, err + } + + // Marshall the result + result := &pb.RsReadResponse{} + return result, ptypes.UnmarshalAny(resultMsg, result) +} + +// Write data to a path at a RemoteSync server +func (rc *Comms) Write(host *connect.Host, msg *pb.RsWriteRequest) (*messages.Ack, error) { + // Create the Send Function + f := func(conn connect.Connection) (*any.Any, error) { + // Set up the context + ctx, cancel := host.GetMessagingContext() + defer cancel() + // Send the message + resultMsg, err := pb.NewRemoteSyncClient(conn.GetGrpcConn()). + Write(ctx, msg) + if err != nil { + return nil, errors.New(err.Error()) + } + return ptypes.MarshalAny(resultMsg) + } + + // Execute the Send function + resultMsg, err := rc.Send(host, f) + if err != nil { + return nil, err + } + + // Marshall the result + result := &messages.Ack{} + return result, ptypes.UnmarshalAny(resultMsg, result) +} + +// GetLastModified returns the last time a path was modified. +func (rc *Comms) GetLastModified(host *connect.Host, msg *pb.RsReadRequest) (*pb.RsTimestampResponse, error) { + // Create the Send Function + f := func(conn connect.Connection) (*any.Any, error) { + // Set up the context + ctx, cancel := host.GetMessagingContext() + defer cancel() + // Send the message + resultMsg, err := pb.NewRemoteSyncClient(conn.GetGrpcConn()). + GetLastModified(ctx, msg) + if err != nil { + return nil, errors.New(err.Error()) + } + return ptypes.MarshalAny(resultMsg) + } + + // Execute the Send function + resultMsg, err := rc.Send(host, f) + if err != nil { + return nil, err + } + + // Marshall the result + result := &pb.RsTimestampResponse{} + return result, ptypes.UnmarshalAny(resultMsg, result) +} + +// GetLastWrite returns the last time a remote sync server was modified. +func (rc *Comms) GetLastWrite(host *connect.Host, msg *pb.RsLastWriteRequest) (*pb.RsTimestampResponse, error) { + // Create the Send Function + f := func(conn connect.Connection) (*any.Any, error) { + // Set up the context + ctx, cancel := host.GetMessagingContext() + defer cancel() + // Send the message + resultMsg, err := pb.NewRemoteSyncClient(conn.GetGrpcConn()). + GetLastWrite(ctx, msg) + if err != nil { + return nil, errors.New(err.Error()) + } + return ptypes.MarshalAny(resultMsg) + } + + // Execute the Send function + resultMsg, err := rc.Send(host, f) + if err != nil { + return nil, err + } + + // Marshall the result + result := &pb.RsTimestampResponse{} + return result, ptypes.UnmarshalAny(resultMsg, result) +} + +// ReadDir returns all entries in a given path. +func (rc *Comms) ReadDir(host *connect.Host, msg *pb.RsReadRequest) (*pb.RsReadDirResponse, error) { + // Create the Send Function + f := func(conn connect.Connection) (*any.Any, error) { + // Set up the context + ctx, cancel := host.GetMessagingContext() + defer cancel() + // Send the message + resultMsg, err := pb.NewRemoteSyncClient(conn.GetGrpcConn()). + ReadDir(ctx, msg) + if err != nil { + return nil, errors.New(err.Error()) + } + return ptypes.MarshalAny(resultMsg) + } + + // Execute the Send function + resultMsg, err := rc.Send(host, f) + if err != nil { + return nil, err + } + + // Marshall the result + result := &pb.RsReadDirResponse{} + return result, ptypes.UnmarshalAny(resultMsg, result) +} diff --git a/remoteSync/client/client.go b/remoteSync/client/client.go new file mode 100644 index 0000000000000000000000000000000000000000..daedfe46f6f21a9dc25fe4c9105debfd51e22648 --- /dev/null +++ b/remoteSync/client/client.go @@ -0,0 +1,21 @@ +package client + +import ( + "github.com/pkg/errors" + "gitlab.com/xx_network/comms/connect" + "gitlab.com/xx_network/primitives/id" +) + +// Comms is an object used for top-level remote sync client calls. +type Comms struct { + *connect.ProtoComms +} + +// NewClientComms returns a Comms object with given attributes. +func NewClientComms(id *id.ID, pubKeyPem, privKeyPem, salt []byte) (*Comms, error) { + pc, err := connect.CreateCommClient(id, pubKeyPem, privKeyPem, salt) + if err != nil { + return nil, errors.Errorf("Unable to create Client comms: %+v", err) + } + return &Comms{pc}, nil +} diff --git a/remoteSync/server/endpoint.go b/remoteSync/server/endpoint.go new file mode 100644 index 0000000000000000000000000000000000000000..1c126b130335029852d3a9c28afcc6df35448d34 --- /dev/null +++ b/remoteSync/server/endpoint.go @@ -0,0 +1,46 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2022 xx foundation // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file. // +//////////////////////////////////////////////////////////////////////////////// + +// Contains remote sync gRPC endpoints + +package server + +import ( + pb "gitlab.com/elixxir/comms/mixmessages" + "gitlab.com/xx_network/comms/messages" + "golang.org/x/net/context" +) + +// Login to the server, receiving a token +func (rc *Comms) Login(ctx context.Context, message *pb.RsAuthenticationRequest) (*pb.RsAuthenticationResponse, error) { + return rc.handler.Login(message) +} + +// Read data from the server +func (rc *Comms) Read(ctx context.Context, message *pb.RsReadRequest) (*pb.RsReadResponse, error) { + return rc.handler.Read(message) +} + +// Write data to the server +func (rc *Comms) Write(ctx context.Context, message *pb.RsWriteRequest) (*messages.Ack, error) { + return rc.handler.Write(message) +} + +// GetLastModified returns the last time a resource was modified +func (rc *Comms) GetLastModified(ctx context.Context, message *pb.RsReadRequest) (*pb.RsTimestampResponse, error) { + return rc.handler.GetLastModified(message) +} + +// GetLastWrite returns the last time this remote sync server was modified +func (rc *Comms) GetLastWrite(ctx context.Context, message *pb.RsLastWriteRequest) (*pb.RsTimestampResponse, error) { + return rc.handler.GetLastWrite(message) +} + +// ReadDir reads a directory from the server +func (rc *Comms) ReadDir(ctx context.Context, message *pb.RsReadRequest) (*pb.RsReadDirResponse, error) { + return rc.handler.ReadDir(message) +} diff --git a/remoteSync/server/handler.go b/remoteSync/server/handler.go new file mode 100644 index 0000000000000000000000000000000000000000..4c6ee69ee91f6352b4d52f446a42281a606da426 --- /dev/null +++ b/remoteSync/server/handler.go @@ -0,0 +1,137 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2022 xx foundation // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file. // +//////////////////////////////////////////////////////////////////////////////// + +// Server implementation, interface & starter function + +package server + +import ( + jww "github.com/spf13/jwalterweatherman" + pb "gitlab.com/elixxir/comms/mixmessages" + "gitlab.com/xx_network/comms/connect" + "gitlab.com/xx_network/comms/messages" + "gitlab.com/xx_network/primitives/id" + "runtime/debug" +) + +// Comms object bundles low-level connect.ProtoComms, +// and the endpoint Handler interface. +type Comms struct { + *connect.ProtoComms + handler Handler + *pb.UnimplementedRemoteSyncServer + *messages.UnimplementedGenericServer +} + +// Handler describes the endpoint callbacks for remote sync. +type Handler interface { + Login(*pb.RsAuthenticationRequest) (*pb.RsAuthenticationResponse, error) + Read(*pb.RsReadRequest) (*pb.RsReadResponse, error) + Write(*pb.RsWriteRequest) (*messages.Ack, error) + GetLastModified(*pb.RsReadRequest) (*pb.RsTimestampResponse, error) + GetLastWrite(*pb.RsLastWriteRequest) (*pb.RsTimestampResponse, error) + ReadDir(*pb.RsReadRequest) (*pb.RsReadDirResponse, error) +} + +// StartRemoteSync starts a new RemoteSync server on the address:port specified by localServer +// and a callback interface for remote sync operations +// with given path to public and private key for TLS connection. +func StartRemoteSync(id *id.ID, localServer string, handler Handler, + certPem, keyPem []byte) *Comms { + + // Initialize the low-level comms listeners + pc, err := connect.StartCommServer(id, localServer, + certPem, keyPem, nil) + if err != nil { + jww.FATAL.Panicf("Unable to StartCommServer: %+v", err) + } + rsServer := Comms{ + handler: handler, + ProtoComms: pc, + } + + // Register the high-level comms endpoint functionality + grpcServer := rsServer.GetServer() + pb.RegisterRemoteSyncServer(grpcServer, &rsServer) + messages.RegisterGenericServer(grpcServer, &rsServer) + + pc.ServeWithWeb() + return &rsServer +} + +// implementationFunctions for the Handler interface. +type implementationFunctions struct { + Login func(req *pb.RsAuthenticationRequest) (*pb.RsAuthenticationResponse, error) + Read func(*pb.RsReadRequest) (*pb.RsReadResponse, error) + Write func(*pb.RsWriteRequest) (*messages.Ack, error) + GetLastModified func(*pb.RsReadRequest) (*pb.RsTimestampResponse, error) + GetLastWrite func(*messages.Ack) (*pb.RsTimestampResponse, error) + ReadDir func(*pb.RsReadRequest) (*pb.RsReadDirResponse, error) +} + +// Implementation allows users of the client library to set the +// functions that implement the node functions. +type Implementation struct { + Functions implementationFunctions +} + +// NewImplementation creates and returns a new Handler interface for implementing endpoint callbacks. +func NewImplementation() *Implementation { + um := "UNIMPLEMENTED FUNCTION!" + warn := func(msg string) { + jww.WARN.Printf(msg) + jww.WARN.Printf("%s", debug.Stack()) + } + return &Implementation{ + Functions: implementationFunctions{ + Login: func(*pb.RsAuthenticationRequest) (*pb.RsAuthenticationResponse, error) { + warn(um) + return new(pb.RsAuthenticationResponse), nil + }, + Read: func(*pb.RsReadRequest) (*pb.RsReadResponse, error) { + warn(um) + return new(pb.RsReadResponse), nil + }, + Write: func(*pb.RsWriteRequest) (*messages.Ack, error) { + warn(um) + return new(messages.Ack), nil + }, + GetLastModified: func(*pb.RsReadRequest) (*pb.RsTimestampResponse, error) { + warn(um) + return new(pb.RsTimestampResponse), nil + }, + GetLastWrite: func(*messages.Ack) (*pb.RsTimestampResponse, error) { + warn(um) + return new(pb.RsTimestampResponse), nil + }, + ReadDir: func(*pb.RsReadRequest) (*pb.RsReadDirResponse, error) { + warn(um) + return new(pb.RsReadDirResponse), nil + }, + }, + } +} + +func (s *Implementation) Login(message *pb.RsAuthenticationRequest) (*pb.RsAuthenticationResponse, error) { + return s.Functions.Login(message) +} + +func (s *Implementation) Read(message *pb.RsReadRequest) (*pb.RsReadResponse, error) { + return s.Functions.Read(message) +} +func (s *Implementation) Write(message *pb.RsWriteRequest) (*messages.Ack, error) { + return s.Functions.Write(message) +} +func (s *Implementation) GetLastModified(message *pb.RsReadRequest) (*pb.RsTimestampResponse, error) { + return s.Functions.GetLastModified(message) +} +func (s *Implementation) GetLastWrite(message *messages.Ack) (*pb.RsTimestampResponse, error) { + return s.Functions.GetLastWrite(message) +} +func (s *Implementation) ReadDir(message *pb.RsReadRequest) (*pb.RsReadDirResponse, error) { + return s.Functions.ReadDir(message) +} diff --git a/udb/endpoint.go b/udb/endpoint.go index a53ba4851152dc362ca373a960437cefd643d711..182d50dbe8c656f828152a4c18984aac920355c3 100644 --- a/udb/endpoint.go +++ b/udb/endpoint.go @@ -60,3 +60,10 @@ func (u *Comms) RemoveFact(ctx context.Context, msg *pb.FactRemovalRequest) (*me func (u *Comms) RequestChannelLease(ctx context.Context, msg *pb.ChannelLeaseRequest) (*pb.ChannelLeaseResponse, error) { return u.handler.RequestChannelLease(msg) } + +// ValidateUsername validates that a user owns a username by signing the contents of the +// mixmessages.UsernameValidationRequest. +func (u *Comms) ValidateUsername( + ctx context.Context, request *pb.UsernameValidationRequest) (*pb.UsernameValidation, error) { + return u.handler.ValidateUsername(request) +} diff --git a/udb/handler.go b/udb/handler.go index 37c70380da76e25d939f84b08f506462550dc585..3458efe3f6e83abfc50aa2dd695885b349670434 100644 --- a/udb/handler.go +++ b/udb/handler.go @@ -71,6 +71,9 @@ type Handler interface { RemoveFact(request *pb.FactRemovalRequest) (*messages.Ack, error) // RequestChannelLease requests a signature & lease on a user's ed25519 public key from user discovery for use in channels RequestChannelLease(request *pb.ChannelLeaseRequest) (*pb.ChannelLeaseResponse, error) + // ValidateUsername validates that a user owns a username by signing the contents of the + // mixmessages.UsernameValidationRequest. + ValidateUsername(request *pb.UsernameValidationRequest) (*pb.UsernameValidation, error) } // implementationFunctions are the actual implementations of @@ -95,6 +98,9 @@ type implementationFunctions struct { RemoveFact func(request *pb.FactRemovalRequest) (*messages.Ack, error) // RequestChannelLease requests a signature & lease on a user's ed25519 public key from user discovery for use in channels RequestChannelLease func(request *pb.ChannelLeaseRequest) (*pb.ChannelLeaseResponse, error) + // ValidateUsername validates that a user owns a username by signing the contents of the + // mixmessages.UsernameValidationRequest. + ValidateUsername func(request *pb.UsernameValidationRequest) (*pb.UsernameValidation, error) } // Implementation allows users of the client library to set the @@ -144,6 +150,10 @@ func NewImplementation() *Implementation { warn(um) return &pb.ChannelLeaseResponse{}, nil }, + ValidateUsername: func(request *pb.UsernameValidationRequest) (*pb.UsernameValidation, error) { + warn(um) + return &pb.UsernameValidation{}, nil + }, }, } } @@ -177,3 +187,9 @@ func (s *Implementation) RemoveFact(request *pb.FactRemovalRequest) (*messages.A func (s *Implementation) RequestChannelLease(request *pb.ChannelLeaseRequest) (*pb.ChannelLeaseResponse, error) { return s.Functions.RequestChannelLease(request) } + +// ValidateUsername validates that a user owns a username by signing the contents of the +// mixmessages.UsernameValidationRequest. +func (s *Implementation) ValidateUsername(request *pb.UsernameValidationRequest) (*pb.UsernameValidation, error) { + return s.Functions.ValidateUsername(request) +}