diff --git a/docs/grpc/index.html b/docs/grpc/index.html index a6514cb0e9..7cf587e835 100644 --- a/docs/grpc/index.html +++ b/docs/grpc/index.html @@ -1239,6 +1239,18 @@

Table of Contents

MGetRegisteredResourceValueResponse +
  • + MGetRegisteredResourceValuesByFQNsRequest +
  • + +
  • + MGetRegisteredResourceValuesByFQNsResponse +
  • + +
  • + MGetRegisteredResourceValuesByFQNsResponse.FqnValueMapEntry +
  • +
  • MListRegisteredResourceValuesRequest
  • @@ -10518,14 +10530,14 @@

    GetRegisteredRe - resource_id + id string

    - fqn + name string

    @@ -10573,7 +10585,7 @@

    GetRegiste - value_id + id string

    @@ -10617,6 +10629,85 @@

    GetRegist +

    GetRegisteredResourceValuesByFQNsRequest

    +

    + + + + + + + + + + + + + + + + +
    FieldTypeLabelDescription
    fqnsstringrepeated

    Required

    + + + + + +

    GetRegisteredResourceValuesByFQNsResponse

    +

    + + + + + + + + + + + + + + + + +
    FieldTypeLabelDescription
    fqn_value_mapGetRegisteredResourceValuesByFQNsResponse.FqnValueMapEntryrepeated

    + + + + + +

    GetRegisteredResourceValuesByFQNsResponse.FqnValueMapEntry

    +

    + + + + + + + + + + + + + + + + + + + + + + + +
    FieldTypeLabelDescription
    keystring

    valuepolicy.RegisteredResourceValue

    + + + + +

    ListRegisteredResourceValuesRequest

    @@ -10937,6 +11028,13 @@

    RegisteredResourc

    + + GetRegisteredResourceValuesByFQNs + GetRegisteredResourceValuesByFQNsRequest + GetRegisteredResourceValuesByFQNsResponse +

    + + ListRegisteredResourceValues ListRegisteredResourceValuesRequest diff --git a/docs/openapi/policy/registeredresources/registered_resources.swagger.json b/docs/openapi/policy/registeredresources/registered_resources.swagger.json index 6dfae600c1..fdb8d90bd9 100644 --- a/docs/openapi/policy/registeredresources/registered_resources.swagger.json +++ b/docs/openapi/policy/registeredresources/registered_resources.swagger.json @@ -196,6 +196,17 @@ } } }, + "registeredresourcesGetRegisteredResourceValuesByFQNsResponse": { + "type": "object", + "properties": { + "fqnValueMap": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/policyRegisteredResourceValue" + } + } + } + }, "registeredresourcesListRegisteredResourceValuesResponse": { "type": "object", "properties": { diff --git a/protocol/go/policy/registeredresources/registered_resources.pb.go b/protocol/go/policy/registeredresources/registered_resources.pb.go index f6d6b9e609..199d3bd418 100644 --- a/protocol/go/policy/registeredresources/registered_resources.pb.go +++ b/protocol/go/policy/registeredresources/registered_resources.pb.go @@ -146,8 +146,8 @@ type GetRegisteredResourceRequest struct { // Types that are assignable to Identifier: // - // *GetRegisteredResourceRequest_ResourceId - // *GetRegisteredResourceRequest_Fqn + // *GetRegisteredResourceRequest_Id + // *GetRegisteredResourceRequest_Name Identifier isGetRegisteredResourceRequest_Identifier `protobuf_oneof:"identifier"` } @@ -190,16 +190,16 @@ func (m *GetRegisteredResourceRequest) GetIdentifier() isGetRegisteredResourceRe return nil } -func (x *GetRegisteredResourceRequest) GetResourceId() string { - if x, ok := x.GetIdentifier().(*GetRegisteredResourceRequest_ResourceId); ok { - return x.ResourceId +func (x *GetRegisteredResourceRequest) GetId() string { + if x, ok := x.GetIdentifier().(*GetRegisteredResourceRequest_Id); ok { + return x.Id } return "" } -func (x *GetRegisteredResourceRequest) GetFqn() string { - if x, ok := x.GetIdentifier().(*GetRegisteredResourceRequest_Fqn); ok { - return x.Fqn +func (x *GetRegisteredResourceRequest) GetName() string { + if x, ok := x.GetIdentifier().(*GetRegisteredResourceRequest_Name); ok { + return x.Name } return "" } @@ -208,17 +208,17 @@ type isGetRegisteredResourceRequest_Identifier interface { isGetRegisteredResourceRequest_Identifier() } -type GetRegisteredResourceRequest_ResourceId struct { - ResourceId string `protobuf:"bytes,1,opt,name=resource_id,json=resourceId,proto3,oneof"` +type GetRegisteredResourceRequest_Id struct { + Id string `protobuf:"bytes,1,opt,name=id,proto3,oneof"` } -type GetRegisteredResourceRequest_Fqn struct { - Fqn string `protobuf:"bytes,2,opt,name=fqn,proto3,oneof"` +type GetRegisteredResourceRequest_Name struct { + Name string `protobuf:"bytes,2,opt,name=name,proto3,oneof"` } -func (*GetRegisteredResourceRequest_ResourceId) isGetRegisteredResourceRequest_Identifier() {} +func (*GetRegisteredResourceRequest_Id) isGetRegisteredResourceRequest_Identifier() {} -func (*GetRegisteredResourceRequest_Fqn) isGetRegisteredResourceRequest_Identifier() {} +func (*GetRegisteredResourceRequest_Name) isGetRegisteredResourceRequest_Identifier() {} type GetRegisteredResourceResponse struct { state protoimpl.MessageState @@ -708,7 +708,7 @@ type GetRegisteredResourceValueRequest struct { // Types that are assignable to Identifier: // - // *GetRegisteredResourceValueRequest_ValueId + // *GetRegisteredResourceValueRequest_Id // *GetRegisteredResourceValueRequest_Fqn Identifier isGetRegisteredResourceValueRequest_Identifier `protobuf_oneof:"identifier"` } @@ -752,9 +752,9 @@ func (m *GetRegisteredResourceValueRequest) GetIdentifier() isGetRegisteredResou return nil } -func (x *GetRegisteredResourceValueRequest) GetValueId() string { - if x, ok := x.GetIdentifier().(*GetRegisteredResourceValueRequest_ValueId); ok { - return x.ValueId +func (x *GetRegisteredResourceValueRequest) GetId() string { + if x, ok := x.GetIdentifier().(*GetRegisteredResourceValueRequest_Id); ok { + return x.Id } return "" } @@ -770,15 +770,15 @@ type isGetRegisteredResourceValueRequest_Identifier interface { isGetRegisteredResourceValueRequest_Identifier() } -type GetRegisteredResourceValueRequest_ValueId struct { - ValueId string `protobuf:"bytes,1,opt,name=value_id,json=valueId,proto3,oneof"` +type GetRegisteredResourceValueRequest_Id struct { + Id string `protobuf:"bytes,1,opt,name=id,proto3,oneof"` } type GetRegisteredResourceValueRequest_Fqn struct { Fqn string `protobuf:"bytes,2,opt,name=fqn,proto3,oneof"` } -func (*GetRegisteredResourceValueRequest_ValueId) isGetRegisteredResourceValueRequest_Identifier() {} +func (*GetRegisteredResourceValueRequest_Id) isGetRegisteredResourceValueRequest_Identifier() {} func (*GetRegisteredResourceValueRequest_Fqn) isGetRegisteredResourceValueRequest_Identifier() {} @@ -829,6 +829,101 @@ func (x *GetRegisteredResourceValueResponse) GetValue() *policy.RegisteredResour return nil } +type GetRegisteredResourceValuesByFQNsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Required + Fqns []string `protobuf:"bytes,1,rep,name=fqns,proto3" json:"fqns,omitempty"` +} + +func (x *GetRegisteredResourceValuesByFQNsRequest) Reset() { + *x = GetRegisteredResourceValuesByFQNsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetRegisteredResourceValuesByFQNsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetRegisteredResourceValuesByFQNsRequest) ProtoMessage() {} + +func (x *GetRegisteredResourceValuesByFQNsRequest) ProtoReflect() protoreflect.Message { + mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[14] + 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 GetRegisteredResourceValuesByFQNsRequest.ProtoReflect.Descriptor instead. +func (*GetRegisteredResourceValuesByFQNsRequest) Descriptor() ([]byte, []int) { + return file_policy_registeredresources_registered_resources_proto_rawDescGZIP(), []int{14} +} + +func (x *GetRegisteredResourceValuesByFQNsRequest) GetFqns() []string { + if x != nil { + return x.Fqns + } + return nil +} + +type GetRegisteredResourceValuesByFQNsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + FqnValueMap map[string]*policy.RegisteredResourceValue `protobuf:"bytes,1,rep,name=fqn_value_map,json=fqnValueMap,proto3" json:"fqn_value_map,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *GetRegisteredResourceValuesByFQNsResponse) Reset() { + *x = GetRegisteredResourceValuesByFQNsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetRegisteredResourceValuesByFQNsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetRegisteredResourceValuesByFQNsResponse) ProtoMessage() {} + +func (x *GetRegisteredResourceValuesByFQNsResponse) ProtoReflect() protoreflect.Message { + mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[15] + 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 GetRegisteredResourceValuesByFQNsResponse.ProtoReflect.Descriptor instead. +func (*GetRegisteredResourceValuesByFQNsResponse) Descriptor() ([]byte, []int) { + return file_policy_registeredresources_registered_resources_proto_rawDescGZIP(), []int{15} +} + +func (x *GetRegisteredResourceValuesByFQNsResponse) GetFqnValueMap() map[string]*policy.RegisteredResourceValue { + if x != nil { + return x.FqnValueMap + } + return nil +} + type ListRegisteredResourceValuesRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -843,7 +938,7 @@ type ListRegisteredResourceValuesRequest struct { func (x *ListRegisteredResourceValuesRequest) Reset() { *x = ListRegisteredResourceValuesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[14] + mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -856,7 +951,7 @@ func (x *ListRegisteredResourceValuesRequest) String() string { func (*ListRegisteredResourceValuesRequest) ProtoMessage() {} func (x *ListRegisteredResourceValuesRequest) ProtoReflect() protoreflect.Message { - mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[14] + mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -869,7 +964,7 @@ func (x *ListRegisteredResourceValuesRequest) ProtoReflect() protoreflect.Messag // Deprecated: Use ListRegisteredResourceValuesRequest.ProtoReflect.Descriptor instead. func (*ListRegisteredResourceValuesRequest) Descriptor() ([]byte, []int) { - return file_policy_registeredresources_registered_resources_proto_rawDescGZIP(), []int{14} + return file_policy_registeredresources_registered_resources_proto_rawDescGZIP(), []int{16} } func (x *ListRegisteredResourceValuesRequest) GetResourceId() string { @@ -898,7 +993,7 @@ type ListRegisteredResourceValuesResponse struct { func (x *ListRegisteredResourceValuesResponse) Reset() { *x = ListRegisteredResourceValuesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[15] + mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -911,7 +1006,7 @@ func (x *ListRegisteredResourceValuesResponse) String() string { func (*ListRegisteredResourceValuesResponse) ProtoMessage() {} func (x *ListRegisteredResourceValuesResponse) ProtoReflect() protoreflect.Message { - mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[15] + mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -924,7 +1019,7 @@ func (x *ListRegisteredResourceValuesResponse) ProtoReflect() protoreflect.Messa // Deprecated: Use ListRegisteredResourceValuesResponse.ProtoReflect.Descriptor instead. func (*ListRegisteredResourceValuesResponse) Descriptor() ([]byte, []int) { - return file_policy_registeredresources_registered_resources_proto_rawDescGZIP(), []int{15} + return file_policy_registeredresources_registered_resources_proto_rawDescGZIP(), []int{17} } func (x *ListRegisteredResourceValuesResponse) GetValues() []*policy.RegisteredResourceValue { @@ -959,7 +1054,7 @@ type UpdateRegisteredResourceValueRequest struct { func (x *UpdateRegisteredResourceValueRequest) Reset() { *x = UpdateRegisteredResourceValueRequest{} if protoimpl.UnsafeEnabled { - mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[16] + mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -972,7 +1067,7 @@ func (x *UpdateRegisteredResourceValueRequest) String() string { func (*UpdateRegisteredResourceValueRequest) ProtoMessage() {} func (x *UpdateRegisteredResourceValueRequest) ProtoReflect() protoreflect.Message { - mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[16] + mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -985,7 +1080,7 @@ func (x *UpdateRegisteredResourceValueRequest) ProtoReflect() protoreflect.Messa // Deprecated: Use UpdateRegisteredResourceValueRequest.ProtoReflect.Descriptor instead. func (*UpdateRegisteredResourceValueRequest) Descriptor() ([]byte, []int) { - return file_policy_registeredresources_registered_resources_proto_rawDescGZIP(), []int{16} + return file_policy_registeredresources_registered_resources_proto_rawDescGZIP(), []int{18} } func (x *UpdateRegisteredResourceValueRequest) GetId() string { @@ -1027,7 +1122,7 @@ type UpdateRegisteredResourceValueResponse struct { func (x *UpdateRegisteredResourceValueResponse) Reset() { *x = UpdateRegisteredResourceValueResponse{} if protoimpl.UnsafeEnabled { - mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[17] + mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1040,7 +1135,7 @@ func (x *UpdateRegisteredResourceValueResponse) String() string { func (*UpdateRegisteredResourceValueResponse) ProtoMessage() {} func (x *UpdateRegisteredResourceValueResponse) ProtoReflect() protoreflect.Message { - mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[17] + mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1053,7 +1148,7 @@ func (x *UpdateRegisteredResourceValueResponse) ProtoReflect() protoreflect.Mess // Deprecated: Use UpdateRegisteredResourceValueResponse.ProtoReflect.Descriptor instead. func (*UpdateRegisteredResourceValueResponse) Descriptor() ([]byte, []int) { - return file_policy_registeredresources_registered_resources_proto_rawDescGZIP(), []int{17} + return file_policy_registeredresources_registered_resources_proto_rawDescGZIP(), []int{19} } func (x *UpdateRegisteredResourceValueResponse) GetValue() *policy.RegisteredResourceValue { @@ -1075,7 +1170,7 @@ type DeleteRegisteredResourceValueRequest struct { func (x *DeleteRegisteredResourceValueRequest) Reset() { *x = DeleteRegisteredResourceValueRequest{} if protoimpl.UnsafeEnabled { - mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[18] + mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1088,7 +1183,7 @@ func (x *DeleteRegisteredResourceValueRequest) String() string { func (*DeleteRegisteredResourceValueRequest) ProtoMessage() {} func (x *DeleteRegisteredResourceValueRequest) ProtoReflect() protoreflect.Message { - mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[18] + mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1101,7 +1196,7 @@ func (x *DeleteRegisteredResourceValueRequest) ProtoReflect() protoreflect.Messa // Deprecated: Use DeleteRegisteredResourceValueRequest.ProtoReflect.Descriptor instead. func (*DeleteRegisteredResourceValueRequest) Descriptor() ([]byte, []int) { - return file_policy_registeredresources_registered_resources_proto_rawDescGZIP(), []int{18} + return file_policy_registeredresources_registered_resources_proto_rawDescGZIP(), []int{20} } func (x *DeleteRegisteredResourceValueRequest) GetId() string { @@ -1122,7 +1217,7 @@ type DeleteRegisteredResourceValueResponse struct { func (x *DeleteRegisteredResourceValueResponse) Reset() { *x = DeleteRegisteredResourceValueResponse{} if protoimpl.UnsafeEnabled { - mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[19] + mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1135,7 +1230,7 @@ func (x *DeleteRegisteredResourceValueResponse) String() string { func (*DeleteRegisteredResourceValueResponse) ProtoMessage() {} func (x *DeleteRegisteredResourceValueResponse) ProtoReflect() protoreflect.Message { - mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[19] + mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1148,7 +1243,7 @@ func (x *DeleteRegisteredResourceValueResponse) ProtoReflect() protoreflect.Mess // Deprecated: Use DeleteRegisteredResourceValueResponse.ProtoReflect.Descriptor instead. func (*DeleteRegisteredResourceValueResponse) Descriptor() ([]byte, []int) { - return file_policy_registeredresources_registered_resources_proto_rawDescGZIP(), []int{19} + return file_policy_registeredresources_registered_resources_proto_rawDescGZIP(), []int{21} } func (x *DeleteRegisteredResourceValueResponse) GetValue() *policy.RegisteredResourceValue { @@ -1207,328 +1302,378 @@ var file_policy_registeredresources_registered_resources_proto_rawDesc = []byte{ 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0x80, 0x01, 0x0a, 0x1c, + 0x65, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0x94, 0x03, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x0b, - 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x48, 0x00, 0x52, 0x0a, 0x72, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x03, 0x66, 0x71, 0x6e, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xba, 0x48, 0x07, 0x72, 0x05, 0x10, 0x01, 0x88, - 0x01, 0x01, 0x48, 0x00, 0x52, 0x03, 0x66, 0x71, 0x6e, 0x42, 0x13, 0x0a, 0x0a, 0x69, 0x64, 0x65, - 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x05, 0xba, 0x48, 0x02, 0x08, 0x01, 0x22, 0x57, - 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x36, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, - 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x08, 0x72, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0x55, 0x0a, 0x1e, 0x4c, 0x69, 0x73, 0x74, 0x52, - 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x33, 0x0a, 0x0a, 0x70, 0x61, 0x67, - 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, - 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x91, - 0x01, 0x0a, 0x1f, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, - 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x38, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x52, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x02, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, + 0x01, 0x01, 0x48, 0x00, 0x52, 0x02, 0x69, 0x64, 0x12, 0xc2, 0x02, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0xab, 0x02, 0xba, 0x48, 0xa7, 0x02, 0xba, 0x01, + 0x9b, 0x02, 0x0a, 0x0e, 0x72, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x12, 0xb3, 0x01, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, + 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x6d, 0x75, + 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x6e, 0x75, + 0x6d, 0x65, 0x72, 0x69, 0x63, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x61, 0x6c, + 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x79, 0x70, 0x68, 0x65, 0x6e, 0x73, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x20, 0x62, + 0x75, 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, + 0x72, 0x73, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x63, 0x68, 0x61, 0x72, + 0x61, 0x63, 0x74, 0x65, 0x72, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, + 0x64, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x6e, + 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x6c, 0x6f, 0x77, + 0x65, 0x72, 0x20, 0x63, 0x61, 0x73, 0x65, 0x2e, 0x1a, 0x53, 0x73, 0x69, 0x7a, 0x65, 0x28, 0x74, + 0x68, 0x69, 0x73, 0x29, 0x20, 0x3e, 0x20, 0x30, 0x20, 0x3f, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x5b, 0x61, 0x2d, 0x7a, 0x41, 0x2d, + 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x28, 0x3f, 0x3a, 0x5b, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, + 0x2d, 0x39, 0x5f, 0x2d, 0x5d, 0x2a, 0x5b, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, + 0x5d, 0x29, 0x3f, 0x24, 0x27, 0x29, 0x20, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xc8, 0x01, 0x00, + 0x72, 0x03, 0x18, 0xfd, 0x01, 0x48, 0x00, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x13, 0x0a, + 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x05, 0xba, 0x48, 0x02, + 0x08, 0x01, 0x22, 0x57, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, + 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x34, 0x0a, 0x0a, - 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x14, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x22, 0x89, 0x04, 0x0a, 0x1f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x67, - 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x02, 0x69, 0x64, - 0x12, 0xc0, 0x02, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, - 0xab, 0x02, 0xba, 0x48, 0xa7, 0x02, 0xba, 0x01, 0x9b, 0x02, 0x0a, 0x0e, 0x72, 0x72, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0xb3, 0x01, 0x52, 0x65, 0x67, - 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x20, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x6e, - 0x20, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x20, 0x73, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x68, - 0x79, 0x70, 0x68, 0x65, 0x6e, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, - 0x73, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x20, 0x62, 0x75, 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, - 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x6c, - 0x61, 0x73, 0x74, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x2e, 0x20, 0x54, - 0x68, 0x65, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x77, - 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, - 0x64, 0x20, 0x74, 0x6f, 0x20, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x20, 0x63, 0x61, 0x73, 0x65, 0x2e, - 0x1a, 0x53, 0x73, 0x69, 0x7a, 0x65, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x20, 0x3e, 0x20, 0x30, - 0x20, 0x3f, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, - 0x27, 0x5e, 0x5b, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x28, 0x3f, 0x3a, - 0x5b, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5f, 0x2d, 0x5d, 0x2a, 0x5b, 0x61, - 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x29, 0x3f, 0x24, 0x27, 0x29, 0x20, 0x3a, - 0x20, 0x74, 0x72, 0x75, 0x65, 0xc8, 0x01, 0x00, 0x72, 0x03, 0x18, 0xfd, 0x01, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x33, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, - 0x64, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x4d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x08, - 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x54, 0x0a, 0x18, 0x6d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x62, 0x65, 0x68, 0x61, - 0x76, 0x69, 0x6f, 0x72, 0x18, 0x65, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, - 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x16, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x42, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x22, 0x5a, - 0x0a, 0x20, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, - 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x36, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x52, 0x65, - 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0x3b, 0x0a, 0x1f, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, - 0xb0, 0x01, 0x01, 0x52, 0x02, 0x69, 0x64, 0x22, 0x5a, 0x0a, 0x20, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0x55, 0x0a, 0x1e, 0x4c, + 0x69, 0x73, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x33, 0x0a, + 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x91, 0x01, 0x0a, 0x1f, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, + 0x12, 0x34, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x50, 0x61, + 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, + 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x89, 0x04, 0x0a, 0x1f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x08, 0x72, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, - 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x22, 0xb6, 0x03, 0x0a, 0x24, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, - 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x0b, - 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x0a, 0x72, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x12, 0xad, 0x02, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x96, 0x02, 0xba, 0x48, 0x92, 0x02, 0xba, 0x01, - 0x86, 0x02, 0x0a, 0x0f, 0x72, 0x72, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x66, 0x6f, 0x72, - 0x6d, 0x61, 0x74, 0x12, 0xb5, 0x01, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, - 0x20, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x20, - 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2c, 0x20, - 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x79, 0x70, 0x68, 0x65, 0x6e, 0x73, - 0x20, 0x61, 0x6e, 0x64, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x73, - 0x20, 0x62, 0x75, 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x63, 0x68, - 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x73, 0x74, 0x6f, - 0x72, 0x65, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, - 0x65, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, - 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x20, 0x63, 0x61, 0x73, 0x65, 0x2e, 0x1a, 0x3b, 0x74, 0x68, 0x69, - 0x73, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x5b, 0x61, 0x2d, 0x7a, - 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x28, 0x3f, 0x3a, 0x5b, 0x61, 0x2d, 0x7a, 0x41, 0x2d, - 0x5a, 0x30, 0x2d, 0x39, 0x5f, 0x2d, 0x5d, 0x2a, 0x5b, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, - 0x2d, 0x39, 0x5d, 0x29, 0x3f, 0x24, 0x27, 0x29, 0xc8, 0x01, 0x01, 0x72, 0x03, 0x18, 0xfd, 0x01, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x33, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, + 0x72, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, + 0x52, 0x02, 0x69, 0x64, 0x12, 0xc0, 0x02, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x42, 0xab, 0x02, 0xba, 0x48, 0xa7, 0x02, 0xba, 0x01, 0x9b, 0x02, 0x0a, 0x0e, + 0x72, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0xb3, + 0x01, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, 0x52, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x20, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, + 0x65, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, + 0x63, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x69, + 0x6e, 0x67, 0x20, 0x68, 0x79, 0x70, 0x68, 0x65, 0x6e, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x75, + 0x6e, 0x64, 0x65, 0x72, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x20, 0x62, 0x75, 0x74, 0x20, 0x6e, + 0x6f, 0x74, 0x20, 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, + 0x6f, 0x72, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, + 0x72, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, + 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x20, 0x63, + 0x61, 0x73, 0x65, 0x2e, 0x1a, 0x53, 0x73, 0x69, 0x7a, 0x65, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, + 0x20, 0x3e, 0x20, 0x30, 0x20, 0x3f, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x74, 0x63, + 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x5b, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, + 0x5d, 0x28, 0x3f, 0x3a, 0x5b, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5f, 0x2d, + 0x5d, 0x2a, 0x5b, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x29, 0x3f, 0x24, + 0x27, 0x29, 0x20, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xc8, 0x01, 0x00, 0x72, 0x03, 0x18, 0xfd, + 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x33, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x64, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x4d, 0x75, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x5e, 0x0a, 0x25, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, - 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x52, 0x65, - 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x7f, 0x0a, 0x21, - 0x47, 0x65, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x25, 0x0a, 0x08, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x48, 0x00, 0x52, - 0x07, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x03, 0x66, 0x71, 0x6e, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xba, 0x48, 0x07, 0x72, 0x05, 0x10, 0x01, 0x88, 0x01, - 0x01, 0x48, 0x00, 0x52, 0x03, 0x66, 0x71, 0x6e, 0x42, 0x13, 0x0a, 0x0a, 0x69, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x05, 0xba, 0x48, 0x02, 0x08, 0x01, 0x22, 0x5b, 0x0a, - 0x22, 0x47, 0x65, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x52, 0x65, 0x67, 0x69, - 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xb2, 0x02, 0x0a, 0x23, 0x4c, - 0x69, 0x73, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0xd5, 0x01, 0x0a, 0x0b, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0xb3, 0x01, 0xba, 0x48, 0xaf, 0x01, 0xba, - 0x01, 0xab, 0x01, 0x0a, 0x14, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x75, 0x75, - 0x69, 0x64, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x23, 0x4f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x61, 0x6c, 0x20, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, - 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x55, 0x55, 0x49, 0x44, 0x1a, 0x6e, - 0x73, 0x69, 0x7a, 0x65, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x20, - 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, - 0x27, 0x5b, 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x5d, 0x7b, 0x38, 0x7d, 0x2d, - 0x5b, 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x5d, 0x7b, 0x34, 0x7d, 0x2d, 0x5b, - 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x5d, 0x7b, 0x34, 0x7d, 0x2d, 0x5b, 0x30, - 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x5d, 0x7b, 0x34, 0x7d, 0x2d, 0x5b, 0x30, 0x2d, - 0x39, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x5d, 0x7b, 0x31, 0x32, 0x7d, 0x27, 0x29, 0x52, 0x0a, - 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x12, 0x33, 0x0a, 0x0a, 0x70, 0x61, - 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, - 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, - 0x95, 0x01, 0x0a, 0x24, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, - 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x6c, 0x65, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x54, 0x0a, 0x18, + 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, + 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x18, 0x65, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, + 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x16, 0x6d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x42, 0x65, 0x68, 0x61, 0x76, 0x69, + 0x6f, 0x72, 0x22, 0x5a, 0x0a, 0x20, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x73, 0x12, 0x34, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x50, - 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x0a, 0x70, 0x61, 0x67, - 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x93, 0x04, 0x0a, 0x24, 0x55, 0x70, 0x64, 0x61, + 0x75, 0x72, 0x63, 0x65, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0x3b, + 0x0a, 0x1f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, + 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x18, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, + 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x02, 0x69, 0x64, 0x22, 0x5a, 0x0a, 0x20, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x36, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x08, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0xb6, 0x03, 0x0a, 0x24, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x18, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, - 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x02, 0x69, 0x64, 0x12, 0xc5, 0x02, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0xae, 0x02, 0xba, 0x48, 0xaa, - 0x02, 0xba, 0x01, 0x9e, 0x02, 0x0a, 0x0f, 0x72, 0x72, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, - 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0xb5, 0x01, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, - 0x72, 0x65, 0x64, 0x20, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x2c, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x79, 0x70, 0x68, - 0x65, 0x6e, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x73, 0x63, 0x6f, - 0x72, 0x65, 0x73, 0x20, 0x62, 0x75, 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x73, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x61, 0x73, 0x74, - 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, - 0x73, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x77, 0x69, 0x6c, - 0x6c, 0x20, 0x62, 0x65, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x20, - 0x74, 0x6f, 0x20, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x20, 0x63, 0x61, 0x73, 0x65, 0x2e, 0x1a, 0x53, - 0x73, 0x69, 0x7a, 0x65, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x20, 0x3e, 0x20, 0x30, 0x20, 0x3f, - 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, + 0x12, 0x29, 0x0a, 0x0b, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, + 0x0a, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x12, 0xad, 0x02, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x96, 0x02, 0xba, 0x48, + 0x92, 0x02, 0xba, 0x01, 0x86, 0x02, 0x0a, 0x0f, 0x72, 0x72, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0xb5, 0x01, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x65, 0x72, 0x65, 0x64, 0x20, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x6e, 0x20, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x20, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x2c, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x79, 0x70, + 0x68, 0x65, 0x6e, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x73, 0x63, + 0x6f, 0x72, 0x65, 0x73, 0x20, 0x62, 0x75, 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x73, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x61, 0x73, + 0x74, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x2e, 0x20, 0x54, 0x68, 0x65, + 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x77, 0x69, + 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, + 0x20, 0x74, 0x6f, 0x20, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x20, 0x63, 0x61, 0x73, 0x65, 0x2e, 0x1a, + 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x5b, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x28, 0x3f, 0x3a, 0x5b, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5f, 0x2d, 0x5d, 0x2a, 0x5b, 0x61, 0x2d, 0x7a, - 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x29, 0x3f, 0x24, 0x27, 0x29, 0x20, 0x3a, 0x20, 0x74, - 0x72, 0x75, 0x65, 0xc8, 0x01, 0x00, 0x72, 0x03, 0x18, 0xfd, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x12, 0x33, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x64, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x4d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x08, 0x6d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x54, 0x0a, 0x18, 0x6d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, - 0x69, 0x6f, 0x72, 0x18, 0x65, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, - 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x16, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x42, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x22, 0x5e, 0x0a, - 0x25, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, - 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x52, - 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x40, 0x0a, - 0x24, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, + 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x29, 0x3f, 0x24, 0x27, 0x29, 0xc8, 0x01, 0x01, 0x72, + 0x03, 0x18, 0xfd, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x33, 0x0a, 0x08, 0x6d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x64, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, + 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x4d, + 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x22, 0x5e, 0x0a, 0x25, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x22, 0x74, 0x0a, 0x21, 0x47, 0x65, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x02, 0x69, 0x64, 0x22, - 0x5e, 0x0a, 0x25, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, - 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x48, 0x00, 0x52, 0x02, 0x69, + 0x64, 0x12, 0x1e, 0x0a, 0x03, 0x66, 0x71, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, + 0xba, 0x48, 0x07, 0x72, 0x05, 0x10, 0x01, 0x88, 0x01, 0x01, 0x48, 0x00, 0x52, 0x03, 0x66, 0x71, + 0x6e, 0x42, 0x13, 0x0a, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, + 0x05, 0xba, 0x48, 0x02, 0x08, 0x01, 0x22, 0x5b, 0x0a, 0x22, 0x47, 0x65, 0x74, 0x52, 0x65, 0x67, + 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x22, 0x53, 0x0a, 0x28, 0x47, 0x65, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x73, 0x42, 0x79, 0x46, 0x51, 0x4e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x27, 0x0a, 0x04, 0x66, 0x71, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x42, 0x13, 0xba, + 0x48, 0x10, 0x92, 0x01, 0x0d, 0x08, 0x01, 0x18, 0x01, 0x22, 0x07, 0x72, 0x05, 0x10, 0x01, 0x88, + 0x01, 0x01, 0x52, 0x04, 0x66, 0x71, 0x6e, 0x73, 0x22, 0x88, 0x02, 0x0a, 0x29, 0x47, 0x65, 0x74, + 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x42, 0x79, 0x46, 0x51, 0x4e, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7a, 0x0a, 0x0d, 0x66, 0x71, 0x6e, 0x5f, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x56, 0x2e, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, + 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, + 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x42, 0x79, 0x46, 0x51, 0x4e, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x46, 0x71, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4d, 0x61, 0x70, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x66, 0x71, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4d, + 0x61, 0x70, 0x1a, 0x5f, 0x0a, 0x10, 0x46, 0x71, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4d, 0x61, + 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x35, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x32, - 0xd3, 0x0c, 0x0a, 0x1a, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x97, - 0x01, 0x0a, 0x18, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, - 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x3b, 0x2e, 0x70, 0x6f, + 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x22, 0xb2, 0x02, 0x0a, 0x23, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0xd5, 0x01, 0x0a, 0x0b, + 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x42, 0xb3, 0x01, 0xba, 0x48, 0xaf, 0x01, 0xba, 0x01, 0xab, 0x01, 0x0a, 0x14, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x5f, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x12, 0x23, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x66, 0x69, 0x65, + 0x6c, 0x64, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x20, 0x55, 0x55, 0x49, 0x44, 0x1a, 0x6e, 0x73, 0x69, 0x7a, 0x65, 0x28, 0x74, 0x68, + 0x69, 0x73, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, 0x5b, 0x30, 0x2d, 0x39, 0x61, 0x2d, + 0x66, 0x41, 0x2d, 0x46, 0x5d, 0x7b, 0x38, 0x7d, 0x2d, 0x5b, 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, + 0x41, 0x2d, 0x46, 0x5d, 0x7b, 0x34, 0x7d, 0x2d, 0x5b, 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x41, + 0x2d, 0x46, 0x5d, 0x7b, 0x34, 0x7d, 0x2d, 0x5b, 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x41, 0x2d, + 0x46, 0x5d, 0x7b, 0x34, 0x7d, 0x2d, 0x5b, 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, + 0x5d, 0x7b, 0x31, 0x32, 0x7d, 0x27, 0x29, 0x52, 0x0a, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x49, 0x64, 0x12, 0x33, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x70, 0x61, + 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x95, 0x01, 0x0a, 0x24, 0x4c, 0x69, 0x73, + 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x37, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x1f, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x34, 0x0a, 0x0a, 0x70, 0x61, + 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, + 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x93, 0x04, 0x0a, 0x24, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, + 0x02, 0x69, 0x64, 0x12, 0xc5, 0x02, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x42, 0xae, 0x02, 0xba, 0x48, 0xaa, 0x02, 0xba, 0x01, 0x9e, 0x02, 0x0a, 0x0f, + 0x72, 0x72, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, + 0xb5, 0x01, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, 0x52, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, + 0x20, 0x62, 0x65, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x6e, 0x75, 0x6d, 0x65, + 0x72, 0x69, 0x63, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x61, 0x6c, 0x6c, 0x6f, + 0x77, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x79, 0x70, 0x68, 0x65, 0x6e, 0x73, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x20, 0x62, 0x75, 0x74, + 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, + 0x74, 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, + 0x74, 0x65, 0x72, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x20, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x6e, 0x6f, + 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x6c, 0x6f, 0x77, 0x65, + 0x72, 0x20, 0x63, 0x61, 0x73, 0x65, 0x2e, 0x1a, 0x53, 0x73, 0x69, 0x7a, 0x65, 0x28, 0x74, 0x68, + 0x69, 0x73, 0x29, 0x20, 0x3e, 0x20, 0x30, 0x20, 0x3f, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, + 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x5b, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, + 0x30, 0x2d, 0x39, 0x5d, 0x28, 0x3f, 0x3a, 0x5b, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, + 0x39, 0x5f, 0x2d, 0x5d, 0x2a, 0x5b, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5d, + 0x29, 0x3f, 0x24, 0x27, 0x29, 0x20, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xc8, 0x01, 0x00, 0x72, + 0x03, 0x18, 0xfd, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x33, 0x0a, 0x08, 0x6d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x64, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, + 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x4d, + 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x12, 0x54, 0x0a, 0x18, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x18, 0x65, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x16, + 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x42, 0x65, + 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x22, 0x5e, 0x0a, 0x25, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x35, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, + 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, + 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x40, 0x0a, 0x24, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, + 0x03, 0xb0, 0x01, 0x01, 0x52, 0x02, 0x69, 0x64, 0x22, 0x5e, 0x0a, 0x25, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x35, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1f, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x32, 0x88, 0x0e, 0x0a, 0x1a, 0x52, 0x65, 0x67, + 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x97, 0x01, 0x0a, 0x18, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x12, 0x3b, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x72, 0x65, + 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x73, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, + 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x3c, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x65, 0x72, 0x65, 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x8e, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, + 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x38, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x72, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3c, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x72, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x8e, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, - 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x12, 0x38, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x72, 0x65, 0x67, 0x69, - 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, - 0x47, 0x65, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x39, 0x2e, 0x70, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, - 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x67, - 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x94, 0x01, 0x0a, 0x17, 0x4c, 0x69, - 0x73, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x3a, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x72, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x39, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, - 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x3b, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, - 0x74, 0x65, 0x72, 0x65, 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x4c, - 0x69, 0x73, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x97, 0x01, 0x0a, 0x18, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, - 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x3b, 0x2e, + 0x65, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, + 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x94, 0x01, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x3a, + 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, + 0x65, 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3b, 0x2e, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x97, 0x01, 0x0a, 0x18, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x3b, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, + 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x73, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x3c, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x72, 0x65, 0x67, + 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, + 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, + 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x97, 0x01, 0x0a, 0x18, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, + 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x12, 0x3b, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x65, 0x72, 0x65, 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3c, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, - 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3c, 0x2e, 0x70, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x72, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x72, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0xa6, 0x01, + 0x0a, 0x1d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, + 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, + 0x40, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, + 0x72, 0x65, 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x41, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x65, 0x72, 0x65, 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x9d, 0x01, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x97, 0x01, 0x0a, 0x18, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x3b, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x73, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, - 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3c, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x72, 0x65, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x3d, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x72, + 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, + 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3e, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x73, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, - 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0xa6, 0x01, 0x0a, 0x1d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x40, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, - 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x73, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, - 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x41, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x72, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, - 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x9d, 0x01, - 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x3d, 0x2e, 0x70, + 0x73, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0xb2, 0x01, 0x0a, 0x21, 0x47, 0x65, 0x74, 0x52, 0x65, + 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x42, 0x79, 0x46, 0x51, 0x4e, 0x73, 0x12, 0x44, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3e, 0x2e, 0x70, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x72, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x67, 0x69, - 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0xa3, 0x01, - 0x0a, 0x1c, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, - 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x3f, - 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, - 0x65, 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x40, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, - 0x72, 0x65, 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0xa6, 0x01, 0x0a, 0x1d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x61, 0x6c, 0x75, 0x65, 0x73, 0x42, 0x79, 0x46, 0x51, 0x4e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x45, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x72, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, + 0x47, 0x65, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x42, 0x79, 0x46, 0x51, 0x4e, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0xa3, 0x01, 0x0a, 0x1c, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x3f, 0x2e, 0x70, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, + 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x40, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x72, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x40, 0x2e, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, + 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0xa6, 0x01, 0x0a, 0x1d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x12, 0x40, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x72, 0x65, 0x67, + 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, + 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, + 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x41, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x41, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x73, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, - 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0xa6, 0x01, 0x0a, - 0x1d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, - 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x40, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0xa6, 0x01, 0x0a, 0x1d, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x40, 0x2e, 0x70, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, + 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x41, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x41, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, - 0x65, 0x72, 0x65, 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x87, 0x02, 0x0a, 0x1e, 0x63, 0x6f, 0x6d, 0x2e, 0x70, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x72, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x42, 0x18, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, - 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x50, 0x72, 0x6f, - 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x42, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, - 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x74, 0x64, 0x66, 0x2f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, - 0x6d, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x67, 0x6f, 0x2f, 0x70, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x2f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x72, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0xa2, 0x02, 0x03, 0x50, 0x52, 0x58, 0xaa, 0x02, - 0x1a, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, - 0x65, 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0xca, 0x02, 0x1a, 0x50, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x5c, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x72, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0xe2, 0x02, 0x26, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x5c, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x72, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x73, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0xea, 0x02, 0x1b, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x3a, 0x3a, 0x52, 0x65, 0x67, 0x69, - 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x42, 0x87, 0x02, 0x0a, 0x1e, 0x63, 0x6f, 0x6d, 0x2e, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x72, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x42, 0x18, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, + 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, + 0x50, 0x01, 0x5a, 0x42, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, + 0x70, 0x65, 0x6e, 0x74, 0x64, 0x66, 0x2f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2f, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x67, 0x6f, 0x2f, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x2f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x72, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0xa2, 0x02, 0x03, 0x50, 0x52, 0x58, 0xaa, 0x02, 0x1a, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, + 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0xca, 0x02, 0x1a, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x5c, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x72, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0xe2, 0x02, 0x26, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5c, + 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x73, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, + 0x02, 0x1b, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x3a, 0x3a, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x65, 0x72, 0x65, 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1543,81 +1688,88 @@ func file_policy_registeredresources_registered_resources_proto_rawDescGZIP() [] return file_policy_registeredresources_registered_resources_proto_rawDescData } -var file_policy_registeredresources_registered_resources_proto_msgTypes = make([]protoimpl.MessageInfo, 20) +var file_policy_registeredresources_registered_resources_proto_msgTypes = make([]protoimpl.MessageInfo, 23) var file_policy_registeredresources_registered_resources_proto_goTypes = []interface{}{ - (*CreateRegisteredResourceRequest)(nil), // 0: policy.registeredresources.CreateRegisteredResourceRequest - (*CreateRegisteredResourceResponse)(nil), // 1: policy.registeredresources.CreateRegisteredResourceResponse - (*GetRegisteredResourceRequest)(nil), // 2: policy.registeredresources.GetRegisteredResourceRequest - (*GetRegisteredResourceResponse)(nil), // 3: policy.registeredresources.GetRegisteredResourceResponse - (*ListRegisteredResourcesRequest)(nil), // 4: policy.registeredresources.ListRegisteredResourcesRequest - (*ListRegisteredResourcesResponse)(nil), // 5: policy.registeredresources.ListRegisteredResourcesResponse - (*UpdateRegisteredResourceRequest)(nil), // 6: policy.registeredresources.UpdateRegisteredResourceRequest - (*UpdateRegisteredResourceResponse)(nil), // 7: policy.registeredresources.UpdateRegisteredResourceResponse - (*DeleteRegisteredResourceRequest)(nil), // 8: policy.registeredresources.DeleteRegisteredResourceRequest - (*DeleteRegisteredResourceResponse)(nil), // 9: policy.registeredresources.DeleteRegisteredResourceResponse - (*CreateRegisteredResourceValueRequest)(nil), // 10: policy.registeredresources.CreateRegisteredResourceValueRequest - (*CreateRegisteredResourceValueResponse)(nil), // 11: policy.registeredresources.CreateRegisteredResourceValueResponse - (*GetRegisteredResourceValueRequest)(nil), // 12: policy.registeredresources.GetRegisteredResourceValueRequest - (*GetRegisteredResourceValueResponse)(nil), // 13: policy.registeredresources.GetRegisteredResourceValueResponse - (*ListRegisteredResourceValuesRequest)(nil), // 14: policy.registeredresources.ListRegisteredResourceValuesRequest - (*ListRegisteredResourceValuesResponse)(nil), // 15: policy.registeredresources.ListRegisteredResourceValuesResponse - (*UpdateRegisteredResourceValueRequest)(nil), // 16: policy.registeredresources.UpdateRegisteredResourceValueRequest - (*UpdateRegisteredResourceValueResponse)(nil), // 17: policy.registeredresources.UpdateRegisteredResourceValueResponse - (*DeleteRegisteredResourceValueRequest)(nil), // 18: policy.registeredresources.DeleteRegisteredResourceValueRequest - (*DeleteRegisteredResourceValueResponse)(nil), // 19: policy.registeredresources.DeleteRegisteredResourceValueResponse - (*common.MetadataMutable)(nil), // 20: common.MetadataMutable - (*policy.RegisteredResource)(nil), // 21: policy.RegisteredResource - (*policy.PageRequest)(nil), // 22: policy.PageRequest - (*policy.PageResponse)(nil), // 23: policy.PageResponse - (common.MetadataUpdateEnum)(0), // 24: common.MetadataUpdateEnum - (*policy.RegisteredResourceValue)(nil), // 25: policy.RegisteredResourceValue + (*CreateRegisteredResourceRequest)(nil), // 0: policy.registeredresources.CreateRegisteredResourceRequest + (*CreateRegisteredResourceResponse)(nil), // 1: policy.registeredresources.CreateRegisteredResourceResponse + (*GetRegisteredResourceRequest)(nil), // 2: policy.registeredresources.GetRegisteredResourceRequest + (*GetRegisteredResourceResponse)(nil), // 3: policy.registeredresources.GetRegisteredResourceResponse + (*ListRegisteredResourcesRequest)(nil), // 4: policy.registeredresources.ListRegisteredResourcesRequest + (*ListRegisteredResourcesResponse)(nil), // 5: policy.registeredresources.ListRegisteredResourcesResponse + (*UpdateRegisteredResourceRequest)(nil), // 6: policy.registeredresources.UpdateRegisteredResourceRequest + (*UpdateRegisteredResourceResponse)(nil), // 7: policy.registeredresources.UpdateRegisteredResourceResponse + (*DeleteRegisteredResourceRequest)(nil), // 8: policy.registeredresources.DeleteRegisteredResourceRequest + (*DeleteRegisteredResourceResponse)(nil), // 9: policy.registeredresources.DeleteRegisteredResourceResponse + (*CreateRegisteredResourceValueRequest)(nil), // 10: policy.registeredresources.CreateRegisteredResourceValueRequest + (*CreateRegisteredResourceValueResponse)(nil), // 11: policy.registeredresources.CreateRegisteredResourceValueResponse + (*GetRegisteredResourceValueRequest)(nil), // 12: policy.registeredresources.GetRegisteredResourceValueRequest + (*GetRegisteredResourceValueResponse)(nil), // 13: policy.registeredresources.GetRegisteredResourceValueResponse + (*GetRegisteredResourceValuesByFQNsRequest)(nil), // 14: policy.registeredresources.GetRegisteredResourceValuesByFQNsRequest + (*GetRegisteredResourceValuesByFQNsResponse)(nil), // 15: policy.registeredresources.GetRegisteredResourceValuesByFQNsResponse + (*ListRegisteredResourceValuesRequest)(nil), // 16: policy.registeredresources.ListRegisteredResourceValuesRequest + (*ListRegisteredResourceValuesResponse)(nil), // 17: policy.registeredresources.ListRegisteredResourceValuesResponse + (*UpdateRegisteredResourceValueRequest)(nil), // 18: policy.registeredresources.UpdateRegisteredResourceValueRequest + (*UpdateRegisteredResourceValueResponse)(nil), // 19: policy.registeredresources.UpdateRegisteredResourceValueResponse + (*DeleteRegisteredResourceValueRequest)(nil), // 20: policy.registeredresources.DeleteRegisteredResourceValueRequest + (*DeleteRegisteredResourceValueResponse)(nil), // 21: policy.registeredresources.DeleteRegisteredResourceValueResponse + nil, // 22: policy.registeredresources.GetRegisteredResourceValuesByFQNsResponse.FqnValueMapEntry + (*common.MetadataMutable)(nil), // 23: common.MetadataMutable + (*policy.RegisteredResource)(nil), // 24: policy.RegisteredResource + (*policy.PageRequest)(nil), // 25: policy.PageRequest + (*policy.PageResponse)(nil), // 26: policy.PageResponse + (common.MetadataUpdateEnum)(0), // 27: common.MetadataUpdateEnum + (*policy.RegisteredResourceValue)(nil), // 28: policy.RegisteredResourceValue } var file_policy_registeredresources_registered_resources_proto_depIdxs = []int32{ - 20, // 0: policy.registeredresources.CreateRegisteredResourceRequest.metadata:type_name -> common.MetadataMutable - 21, // 1: policy.registeredresources.CreateRegisteredResourceResponse.resource:type_name -> policy.RegisteredResource - 21, // 2: policy.registeredresources.GetRegisteredResourceResponse.resource:type_name -> policy.RegisteredResource - 22, // 3: policy.registeredresources.ListRegisteredResourcesRequest.pagination:type_name -> policy.PageRequest - 21, // 4: policy.registeredresources.ListRegisteredResourcesResponse.resources:type_name -> policy.RegisteredResource - 23, // 5: policy.registeredresources.ListRegisteredResourcesResponse.pagination:type_name -> policy.PageResponse - 20, // 6: policy.registeredresources.UpdateRegisteredResourceRequest.metadata:type_name -> common.MetadataMutable - 24, // 7: policy.registeredresources.UpdateRegisteredResourceRequest.metadata_update_behavior:type_name -> common.MetadataUpdateEnum - 21, // 8: policy.registeredresources.UpdateRegisteredResourceResponse.resource:type_name -> policy.RegisteredResource - 21, // 9: policy.registeredresources.DeleteRegisteredResourceResponse.resource:type_name -> policy.RegisteredResource - 20, // 10: policy.registeredresources.CreateRegisteredResourceValueRequest.metadata:type_name -> common.MetadataMutable - 25, // 11: policy.registeredresources.CreateRegisteredResourceValueResponse.value:type_name -> policy.RegisteredResourceValue - 25, // 12: policy.registeredresources.GetRegisteredResourceValueResponse.value:type_name -> policy.RegisteredResourceValue - 22, // 13: policy.registeredresources.ListRegisteredResourceValuesRequest.pagination:type_name -> policy.PageRequest - 25, // 14: policy.registeredresources.ListRegisteredResourceValuesResponse.values:type_name -> policy.RegisteredResourceValue - 23, // 15: policy.registeredresources.ListRegisteredResourceValuesResponse.pagination:type_name -> policy.PageResponse - 20, // 16: policy.registeredresources.UpdateRegisteredResourceValueRequest.metadata:type_name -> common.MetadataMutable - 24, // 17: policy.registeredresources.UpdateRegisteredResourceValueRequest.metadata_update_behavior:type_name -> common.MetadataUpdateEnum - 25, // 18: policy.registeredresources.UpdateRegisteredResourceValueResponse.value:type_name -> policy.RegisteredResourceValue - 25, // 19: policy.registeredresources.DeleteRegisteredResourceValueResponse.value:type_name -> policy.RegisteredResourceValue - 0, // 20: policy.registeredresources.RegisteredResourcesService.CreateRegisteredResource:input_type -> policy.registeredresources.CreateRegisteredResourceRequest - 2, // 21: policy.registeredresources.RegisteredResourcesService.GetRegisteredResource:input_type -> policy.registeredresources.GetRegisteredResourceRequest - 4, // 22: policy.registeredresources.RegisteredResourcesService.ListRegisteredResources:input_type -> policy.registeredresources.ListRegisteredResourcesRequest - 6, // 23: policy.registeredresources.RegisteredResourcesService.UpdateRegisteredResource:input_type -> policy.registeredresources.UpdateRegisteredResourceRequest - 8, // 24: policy.registeredresources.RegisteredResourcesService.DeleteRegisteredResource:input_type -> policy.registeredresources.DeleteRegisteredResourceRequest - 10, // 25: policy.registeredresources.RegisteredResourcesService.CreateRegisteredResourceValue:input_type -> policy.registeredresources.CreateRegisteredResourceValueRequest - 12, // 26: policy.registeredresources.RegisteredResourcesService.GetRegisteredResourceValue:input_type -> policy.registeredresources.GetRegisteredResourceValueRequest - 14, // 27: policy.registeredresources.RegisteredResourcesService.ListRegisteredResourceValues:input_type -> policy.registeredresources.ListRegisteredResourceValuesRequest - 16, // 28: policy.registeredresources.RegisteredResourcesService.UpdateRegisteredResourceValue:input_type -> policy.registeredresources.UpdateRegisteredResourceValueRequest - 18, // 29: policy.registeredresources.RegisteredResourcesService.DeleteRegisteredResourceValue:input_type -> policy.registeredresources.DeleteRegisteredResourceValueRequest - 1, // 30: policy.registeredresources.RegisteredResourcesService.CreateRegisteredResource:output_type -> policy.registeredresources.CreateRegisteredResourceResponse - 3, // 31: policy.registeredresources.RegisteredResourcesService.GetRegisteredResource:output_type -> policy.registeredresources.GetRegisteredResourceResponse - 5, // 32: policy.registeredresources.RegisteredResourcesService.ListRegisteredResources:output_type -> policy.registeredresources.ListRegisteredResourcesResponse - 7, // 33: policy.registeredresources.RegisteredResourcesService.UpdateRegisteredResource:output_type -> policy.registeredresources.UpdateRegisteredResourceResponse - 9, // 34: policy.registeredresources.RegisteredResourcesService.DeleteRegisteredResource:output_type -> policy.registeredresources.DeleteRegisteredResourceResponse - 11, // 35: policy.registeredresources.RegisteredResourcesService.CreateRegisteredResourceValue:output_type -> policy.registeredresources.CreateRegisteredResourceValueResponse - 13, // 36: policy.registeredresources.RegisteredResourcesService.GetRegisteredResourceValue:output_type -> policy.registeredresources.GetRegisteredResourceValueResponse - 15, // 37: policy.registeredresources.RegisteredResourcesService.ListRegisteredResourceValues:output_type -> policy.registeredresources.ListRegisteredResourceValuesResponse - 17, // 38: policy.registeredresources.RegisteredResourcesService.UpdateRegisteredResourceValue:output_type -> policy.registeredresources.UpdateRegisteredResourceValueResponse - 19, // 39: policy.registeredresources.RegisteredResourcesService.DeleteRegisteredResourceValue:output_type -> policy.registeredresources.DeleteRegisteredResourceValueResponse - 30, // [30:40] is the sub-list for method output_type - 20, // [20:30] is the sub-list for method input_type - 20, // [20:20] is the sub-list for extension type_name - 20, // [20:20] is the sub-list for extension extendee - 0, // [0:20] is the sub-list for field type_name + 23, // 0: policy.registeredresources.CreateRegisteredResourceRequest.metadata:type_name -> common.MetadataMutable + 24, // 1: policy.registeredresources.CreateRegisteredResourceResponse.resource:type_name -> policy.RegisteredResource + 24, // 2: policy.registeredresources.GetRegisteredResourceResponse.resource:type_name -> policy.RegisteredResource + 25, // 3: policy.registeredresources.ListRegisteredResourcesRequest.pagination:type_name -> policy.PageRequest + 24, // 4: policy.registeredresources.ListRegisteredResourcesResponse.resources:type_name -> policy.RegisteredResource + 26, // 5: policy.registeredresources.ListRegisteredResourcesResponse.pagination:type_name -> policy.PageResponse + 23, // 6: policy.registeredresources.UpdateRegisteredResourceRequest.metadata:type_name -> common.MetadataMutable + 27, // 7: policy.registeredresources.UpdateRegisteredResourceRequest.metadata_update_behavior:type_name -> common.MetadataUpdateEnum + 24, // 8: policy.registeredresources.UpdateRegisteredResourceResponse.resource:type_name -> policy.RegisteredResource + 24, // 9: policy.registeredresources.DeleteRegisteredResourceResponse.resource:type_name -> policy.RegisteredResource + 23, // 10: policy.registeredresources.CreateRegisteredResourceValueRequest.metadata:type_name -> common.MetadataMutable + 28, // 11: policy.registeredresources.CreateRegisteredResourceValueResponse.value:type_name -> policy.RegisteredResourceValue + 28, // 12: policy.registeredresources.GetRegisteredResourceValueResponse.value:type_name -> policy.RegisteredResourceValue + 22, // 13: policy.registeredresources.GetRegisteredResourceValuesByFQNsResponse.fqn_value_map:type_name -> policy.registeredresources.GetRegisteredResourceValuesByFQNsResponse.FqnValueMapEntry + 25, // 14: policy.registeredresources.ListRegisteredResourceValuesRequest.pagination:type_name -> policy.PageRequest + 28, // 15: policy.registeredresources.ListRegisteredResourceValuesResponse.values:type_name -> policy.RegisteredResourceValue + 26, // 16: policy.registeredresources.ListRegisteredResourceValuesResponse.pagination:type_name -> policy.PageResponse + 23, // 17: policy.registeredresources.UpdateRegisteredResourceValueRequest.metadata:type_name -> common.MetadataMutable + 27, // 18: policy.registeredresources.UpdateRegisteredResourceValueRequest.metadata_update_behavior:type_name -> common.MetadataUpdateEnum + 28, // 19: policy.registeredresources.UpdateRegisteredResourceValueResponse.value:type_name -> policy.RegisteredResourceValue + 28, // 20: policy.registeredresources.DeleteRegisteredResourceValueResponse.value:type_name -> policy.RegisteredResourceValue + 28, // 21: policy.registeredresources.GetRegisteredResourceValuesByFQNsResponse.FqnValueMapEntry.value:type_name -> policy.RegisteredResourceValue + 0, // 22: policy.registeredresources.RegisteredResourcesService.CreateRegisteredResource:input_type -> policy.registeredresources.CreateRegisteredResourceRequest + 2, // 23: policy.registeredresources.RegisteredResourcesService.GetRegisteredResource:input_type -> policy.registeredresources.GetRegisteredResourceRequest + 4, // 24: policy.registeredresources.RegisteredResourcesService.ListRegisteredResources:input_type -> policy.registeredresources.ListRegisteredResourcesRequest + 6, // 25: policy.registeredresources.RegisteredResourcesService.UpdateRegisteredResource:input_type -> policy.registeredresources.UpdateRegisteredResourceRequest + 8, // 26: policy.registeredresources.RegisteredResourcesService.DeleteRegisteredResource:input_type -> policy.registeredresources.DeleteRegisteredResourceRequest + 10, // 27: policy.registeredresources.RegisteredResourcesService.CreateRegisteredResourceValue:input_type -> policy.registeredresources.CreateRegisteredResourceValueRequest + 12, // 28: policy.registeredresources.RegisteredResourcesService.GetRegisteredResourceValue:input_type -> policy.registeredresources.GetRegisteredResourceValueRequest + 14, // 29: policy.registeredresources.RegisteredResourcesService.GetRegisteredResourceValuesByFQNs:input_type -> policy.registeredresources.GetRegisteredResourceValuesByFQNsRequest + 16, // 30: policy.registeredresources.RegisteredResourcesService.ListRegisteredResourceValues:input_type -> policy.registeredresources.ListRegisteredResourceValuesRequest + 18, // 31: policy.registeredresources.RegisteredResourcesService.UpdateRegisteredResourceValue:input_type -> policy.registeredresources.UpdateRegisteredResourceValueRequest + 20, // 32: policy.registeredresources.RegisteredResourcesService.DeleteRegisteredResourceValue:input_type -> policy.registeredresources.DeleteRegisteredResourceValueRequest + 1, // 33: policy.registeredresources.RegisteredResourcesService.CreateRegisteredResource:output_type -> policy.registeredresources.CreateRegisteredResourceResponse + 3, // 34: policy.registeredresources.RegisteredResourcesService.GetRegisteredResource:output_type -> policy.registeredresources.GetRegisteredResourceResponse + 5, // 35: policy.registeredresources.RegisteredResourcesService.ListRegisteredResources:output_type -> policy.registeredresources.ListRegisteredResourcesResponse + 7, // 36: policy.registeredresources.RegisteredResourcesService.UpdateRegisteredResource:output_type -> policy.registeredresources.UpdateRegisteredResourceResponse + 9, // 37: policy.registeredresources.RegisteredResourcesService.DeleteRegisteredResource:output_type -> policy.registeredresources.DeleteRegisteredResourceResponse + 11, // 38: policy.registeredresources.RegisteredResourcesService.CreateRegisteredResourceValue:output_type -> policy.registeredresources.CreateRegisteredResourceValueResponse + 13, // 39: policy.registeredresources.RegisteredResourcesService.GetRegisteredResourceValue:output_type -> policy.registeredresources.GetRegisteredResourceValueResponse + 15, // 40: policy.registeredresources.RegisteredResourcesService.GetRegisteredResourceValuesByFQNs:output_type -> policy.registeredresources.GetRegisteredResourceValuesByFQNsResponse + 17, // 41: policy.registeredresources.RegisteredResourcesService.ListRegisteredResourceValues:output_type -> policy.registeredresources.ListRegisteredResourceValuesResponse + 19, // 42: policy.registeredresources.RegisteredResourcesService.UpdateRegisteredResourceValue:output_type -> policy.registeredresources.UpdateRegisteredResourceValueResponse + 21, // 43: policy.registeredresources.RegisteredResourcesService.DeleteRegisteredResourceValue:output_type -> policy.registeredresources.DeleteRegisteredResourceValueResponse + 33, // [33:44] is the sub-list for method output_type + 22, // [22:33] is the sub-list for method input_type + 22, // [22:22] is the sub-list for extension type_name + 22, // [22:22] is the sub-list for extension extendee + 0, // [0:22] is the sub-list for field type_name } func init() { file_policy_registeredresources_registered_resources_proto_init() } @@ -1795,7 +1947,7 @@ func file_policy_registeredresources_registered_resources_proto_init() { } } file_policy_registeredresources_registered_resources_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListRegisteredResourceValuesRequest); i { + switch v := v.(*GetRegisteredResourceValuesByFQNsRequest); i { case 0: return &v.state case 1: @@ -1807,7 +1959,7 @@ func file_policy_registeredresources_registered_resources_proto_init() { } } file_policy_registeredresources_registered_resources_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListRegisteredResourceValuesResponse); i { + switch v := v.(*GetRegisteredResourceValuesByFQNsResponse); i { case 0: return &v.state case 1: @@ -1819,7 +1971,7 @@ func file_policy_registeredresources_registered_resources_proto_init() { } } file_policy_registeredresources_registered_resources_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateRegisteredResourceValueRequest); i { + switch v := v.(*ListRegisteredResourceValuesRequest); i { case 0: return &v.state case 1: @@ -1831,7 +1983,7 @@ func file_policy_registeredresources_registered_resources_proto_init() { } } file_policy_registeredresources_registered_resources_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateRegisteredResourceValueResponse); i { + switch v := v.(*ListRegisteredResourceValuesResponse); i { case 0: return &v.state case 1: @@ -1843,7 +1995,7 @@ func file_policy_registeredresources_registered_resources_proto_init() { } } file_policy_registeredresources_registered_resources_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteRegisteredResourceValueRequest); i { + switch v := v.(*UpdateRegisteredResourceValueRequest); i { case 0: return &v.state case 1: @@ -1855,6 +2007,30 @@ func file_policy_registeredresources_registered_resources_proto_init() { } } file_policy_registeredresources_registered_resources_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateRegisteredResourceValueResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_policy_registeredresources_registered_resources_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteRegisteredResourceValueRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_policy_registeredresources_registered_resources_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DeleteRegisteredResourceValueResponse); i { case 0: return &v.state @@ -1868,11 +2044,11 @@ func file_policy_registeredresources_registered_resources_proto_init() { } } file_policy_registeredresources_registered_resources_proto_msgTypes[2].OneofWrappers = []interface{}{ - (*GetRegisteredResourceRequest_ResourceId)(nil), - (*GetRegisteredResourceRequest_Fqn)(nil), + (*GetRegisteredResourceRequest_Id)(nil), + (*GetRegisteredResourceRequest_Name)(nil), } file_policy_registeredresources_registered_resources_proto_msgTypes[12].OneofWrappers = []interface{}{ - (*GetRegisteredResourceValueRequest_ValueId)(nil), + (*GetRegisteredResourceValueRequest_Id)(nil), (*GetRegisteredResourceValueRequest_Fqn)(nil), } type x struct{} @@ -1881,7 +2057,7 @@ func file_policy_registeredresources_registered_resources_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_policy_registeredresources_registered_resources_proto_rawDesc, NumEnums: 0, - NumMessages: 20, + NumMessages: 23, NumExtensions: 0, NumServices: 1, }, diff --git a/protocol/go/policy/registeredresources/registered_resources_grpc.pb.go b/protocol/go/policy/registeredresources/registered_resources_grpc.pb.go index 2b0197fdc6..19a14f625a 100644 --- a/protocol/go/policy/registeredresources/registered_resources_grpc.pb.go +++ b/protocol/go/policy/registeredresources/registered_resources_grpc.pb.go @@ -19,16 +19,17 @@ import ( const _ = grpc.SupportPackageIsVersion7 const ( - RegisteredResourcesService_CreateRegisteredResource_FullMethodName = "/policy.registeredresources.RegisteredResourcesService/CreateRegisteredResource" - RegisteredResourcesService_GetRegisteredResource_FullMethodName = "/policy.registeredresources.RegisteredResourcesService/GetRegisteredResource" - RegisteredResourcesService_ListRegisteredResources_FullMethodName = "/policy.registeredresources.RegisteredResourcesService/ListRegisteredResources" - RegisteredResourcesService_UpdateRegisteredResource_FullMethodName = "/policy.registeredresources.RegisteredResourcesService/UpdateRegisteredResource" - RegisteredResourcesService_DeleteRegisteredResource_FullMethodName = "/policy.registeredresources.RegisteredResourcesService/DeleteRegisteredResource" - RegisteredResourcesService_CreateRegisteredResourceValue_FullMethodName = "/policy.registeredresources.RegisteredResourcesService/CreateRegisteredResourceValue" - RegisteredResourcesService_GetRegisteredResourceValue_FullMethodName = "/policy.registeredresources.RegisteredResourcesService/GetRegisteredResourceValue" - RegisteredResourcesService_ListRegisteredResourceValues_FullMethodName = "/policy.registeredresources.RegisteredResourcesService/ListRegisteredResourceValues" - RegisteredResourcesService_UpdateRegisteredResourceValue_FullMethodName = "/policy.registeredresources.RegisteredResourcesService/UpdateRegisteredResourceValue" - RegisteredResourcesService_DeleteRegisteredResourceValue_FullMethodName = "/policy.registeredresources.RegisteredResourcesService/DeleteRegisteredResourceValue" + RegisteredResourcesService_CreateRegisteredResource_FullMethodName = "/policy.registeredresources.RegisteredResourcesService/CreateRegisteredResource" + RegisteredResourcesService_GetRegisteredResource_FullMethodName = "/policy.registeredresources.RegisteredResourcesService/GetRegisteredResource" + RegisteredResourcesService_ListRegisteredResources_FullMethodName = "/policy.registeredresources.RegisteredResourcesService/ListRegisteredResources" + RegisteredResourcesService_UpdateRegisteredResource_FullMethodName = "/policy.registeredresources.RegisteredResourcesService/UpdateRegisteredResource" + RegisteredResourcesService_DeleteRegisteredResource_FullMethodName = "/policy.registeredresources.RegisteredResourcesService/DeleteRegisteredResource" + RegisteredResourcesService_CreateRegisteredResourceValue_FullMethodName = "/policy.registeredresources.RegisteredResourcesService/CreateRegisteredResourceValue" + RegisteredResourcesService_GetRegisteredResourceValue_FullMethodName = "/policy.registeredresources.RegisteredResourcesService/GetRegisteredResourceValue" + RegisteredResourcesService_GetRegisteredResourceValuesByFQNs_FullMethodName = "/policy.registeredresources.RegisteredResourcesService/GetRegisteredResourceValuesByFQNs" + RegisteredResourcesService_ListRegisteredResourceValues_FullMethodName = "/policy.registeredresources.RegisteredResourcesService/ListRegisteredResourceValues" + RegisteredResourcesService_UpdateRegisteredResourceValue_FullMethodName = "/policy.registeredresources.RegisteredResourcesService/UpdateRegisteredResourceValue" + RegisteredResourcesService_DeleteRegisteredResourceValue_FullMethodName = "/policy.registeredresources.RegisteredResourcesService/DeleteRegisteredResourceValue" ) // RegisteredResourcesServiceClient is the client API for RegisteredResourcesService service. @@ -42,6 +43,7 @@ type RegisteredResourcesServiceClient interface { DeleteRegisteredResource(ctx context.Context, in *DeleteRegisteredResourceRequest, opts ...grpc.CallOption) (*DeleteRegisteredResourceResponse, error) CreateRegisteredResourceValue(ctx context.Context, in *CreateRegisteredResourceValueRequest, opts ...grpc.CallOption) (*CreateRegisteredResourceValueResponse, error) GetRegisteredResourceValue(ctx context.Context, in *GetRegisteredResourceValueRequest, opts ...grpc.CallOption) (*GetRegisteredResourceValueResponse, error) + GetRegisteredResourceValuesByFQNs(ctx context.Context, in *GetRegisteredResourceValuesByFQNsRequest, opts ...grpc.CallOption) (*GetRegisteredResourceValuesByFQNsResponse, error) ListRegisteredResourceValues(ctx context.Context, in *ListRegisteredResourceValuesRequest, opts ...grpc.CallOption) (*ListRegisteredResourceValuesResponse, error) UpdateRegisteredResourceValue(ctx context.Context, in *UpdateRegisteredResourceValueRequest, opts ...grpc.CallOption) (*UpdateRegisteredResourceValueResponse, error) DeleteRegisteredResourceValue(ctx context.Context, in *DeleteRegisteredResourceValueRequest, opts ...grpc.CallOption) (*DeleteRegisteredResourceValueResponse, error) @@ -118,6 +120,15 @@ func (c *registeredResourcesServiceClient) GetRegisteredResourceValue(ctx contex return out, nil } +func (c *registeredResourcesServiceClient) GetRegisteredResourceValuesByFQNs(ctx context.Context, in *GetRegisteredResourceValuesByFQNsRequest, opts ...grpc.CallOption) (*GetRegisteredResourceValuesByFQNsResponse, error) { + out := new(GetRegisteredResourceValuesByFQNsResponse) + err := c.cc.Invoke(ctx, RegisteredResourcesService_GetRegisteredResourceValuesByFQNs_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *registeredResourcesServiceClient) ListRegisteredResourceValues(ctx context.Context, in *ListRegisteredResourceValuesRequest, opts ...grpc.CallOption) (*ListRegisteredResourceValuesResponse, error) { out := new(ListRegisteredResourceValuesResponse) err := c.cc.Invoke(ctx, RegisteredResourcesService_ListRegisteredResourceValues_FullMethodName, in, out, opts...) @@ -156,6 +167,7 @@ type RegisteredResourcesServiceServer interface { DeleteRegisteredResource(context.Context, *DeleteRegisteredResourceRequest) (*DeleteRegisteredResourceResponse, error) CreateRegisteredResourceValue(context.Context, *CreateRegisteredResourceValueRequest) (*CreateRegisteredResourceValueResponse, error) GetRegisteredResourceValue(context.Context, *GetRegisteredResourceValueRequest) (*GetRegisteredResourceValueResponse, error) + GetRegisteredResourceValuesByFQNs(context.Context, *GetRegisteredResourceValuesByFQNsRequest) (*GetRegisteredResourceValuesByFQNsResponse, error) ListRegisteredResourceValues(context.Context, *ListRegisteredResourceValuesRequest) (*ListRegisteredResourceValuesResponse, error) UpdateRegisteredResourceValue(context.Context, *UpdateRegisteredResourceValueRequest) (*UpdateRegisteredResourceValueResponse, error) DeleteRegisteredResourceValue(context.Context, *DeleteRegisteredResourceValueRequest) (*DeleteRegisteredResourceValueResponse, error) @@ -187,6 +199,9 @@ func (UnimplementedRegisteredResourcesServiceServer) CreateRegisteredResourceVal func (UnimplementedRegisteredResourcesServiceServer) GetRegisteredResourceValue(context.Context, *GetRegisteredResourceValueRequest) (*GetRegisteredResourceValueResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetRegisteredResourceValue not implemented") } +func (UnimplementedRegisteredResourcesServiceServer) GetRegisteredResourceValuesByFQNs(context.Context, *GetRegisteredResourceValuesByFQNsRequest) (*GetRegisteredResourceValuesByFQNsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetRegisteredResourceValuesByFQNs not implemented") +} func (UnimplementedRegisteredResourcesServiceServer) ListRegisteredResourceValues(context.Context, *ListRegisteredResourceValuesRequest) (*ListRegisteredResourceValuesResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ListRegisteredResourceValues not implemented") } @@ -336,6 +351,24 @@ func _RegisteredResourcesService_GetRegisteredResourceValue_Handler(srv interfac return interceptor(ctx, in, info, handler) } +func _RegisteredResourcesService_GetRegisteredResourceValuesByFQNs_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetRegisteredResourceValuesByFQNsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(RegisteredResourcesServiceServer).GetRegisteredResourceValuesByFQNs(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: RegisteredResourcesService_GetRegisteredResourceValuesByFQNs_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(RegisteredResourcesServiceServer).GetRegisteredResourceValuesByFQNs(ctx, req.(*GetRegisteredResourceValuesByFQNsRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _RegisteredResourcesService_ListRegisteredResourceValues_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(ListRegisteredResourceValuesRequest) if err := dec(in); err != nil { @@ -425,6 +458,10 @@ var RegisteredResourcesService_ServiceDesc = grpc.ServiceDesc{ MethodName: "GetRegisteredResourceValue", Handler: _RegisteredResourcesService_GetRegisteredResourceValue_Handler, }, + { + MethodName: "GetRegisteredResourceValuesByFQNs", + Handler: _RegisteredResourcesService_GetRegisteredResourceValuesByFQNs_Handler, + }, { MethodName: "ListRegisteredResourceValues", Handler: _RegisteredResourcesService_ListRegisteredResourceValues_Handler, diff --git a/protocol/go/policy/registeredresources/registeredresourcesconnect/registered_resources.connect.go b/protocol/go/policy/registeredresources/registeredresourcesconnect/registered_resources.connect.go index a6fdf4ce33..d35ac7a546 100644 --- a/protocol/go/policy/registeredresources/registeredresourcesconnect/registered_resources.connect.go +++ b/protocol/go/policy/registeredresources/registeredresourcesconnect/registered_resources.connect.go @@ -55,6 +55,9 @@ const ( // RegisteredResourcesServiceGetRegisteredResourceValueProcedure is the fully-qualified name of the // RegisteredResourcesService's GetRegisteredResourceValue RPC. RegisteredResourcesServiceGetRegisteredResourceValueProcedure = "/policy.registeredresources.RegisteredResourcesService/GetRegisteredResourceValue" + // RegisteredResourcesServiceGetRegisteredResourceValuesByFQNsProcedure is the fully-qualified name + // of the RegisteredResourcesService's GetRegisteredResourceValuesByFQNs RPC. + RegisteredResourcesServiceGetRegisteredResourceValuesByFQNsProcedure = "/policy.registeredresources.RegisteredResourcesService/GetRegisteredResourceValuesByFQNs" // RegisteredResourcesServiceListRegisteredResourceValuesProcedure is the fully-qualified name of // the RegisteredResourcesService's ListRegisteredResourceValues RPC. RegisteredResourcesServiceListRegisteredResourceValuesProcedure = "/policy.registeredresources.RegisteredResourcesService/ListRegisteredResourceValues" @@ -68,17 +71,18 @@ const ( // These variables are the protoreflect.Descriptor objects for the RPCs defined in this package. var ( - registeredResourcesServiceServiceDescriptor = registeredresources.File_policy_registeredresources_registered_resources_proto.Services().ByName("RegisteredResourcesService") - registeredResourcesServiceCreateRegisteredResourceMethodDescriptor = registeredResourcesServiceServiceDescriptor.Methods().ByName("CreateRegisteredResource") - registeredResourcesServiceGetRegisteredResourceMethodDescriptor = registeredResourcesServiceServiceDescriptor.Methods().ByName("GetRegisteredResource") - registeredResourcesServiceListRegisteredResourcesMethodDescriptor = registeredResourcesServiceServiceDescriptor.Methods().ByName("ListRegisteredResources") - registeredResourcesServiceUpdateRegisteredResourceMethodDescriptor = registeredResourcesServiceServiceDescriptor.Methods().ByName("UpdateRegisteredResource") - registeredResourcesServiceDeleteRegisteredResourceMethodDescriptor = registeredResourcesServiceServiceDescriptor.Methods().ByName("DeleteRegisteredResource") - registeredResourcesServiceCreateRegisteredResourceValueMethodDescriptor = registeredResourcesServiceServiceDescriptor.Methods().ByName("CreateRegisteredResourceValue") - registeredResourcesServiceGetRegisteredResourceValueMethodDescriptor = registeredResourcesServiceServiceDescriptor.Methods().ByName("GetRegisteredResourceValue") - registeredResourcesServiceListRegisteredResourceValuesMethodDescriptor = registeredResourcesServiceServiceDescriptor.Methods().ByName("ListRegisteredResourceValues") - registeredResourcesServiceUpdateRegisteredResourceValueMethodDescriptor = registeredResourcesServiceServiceDescriptor.Methods().ByName("UpdateRegisteredResourceValue") - registeredResourcesServiceDeleteRegisteredResourceValueMethodDescriptor = registeredResourcesServiceServiceDescriptor.Methods().ByName("DeleteRegisteredResourceValue") + registeredResourcesServiceServiceDescriptor = registeredresources.File_policy_registeredresources_registered_resources_proto.Services().ByName("RegisteredResourcesService") + registeredResourcesServiceCreateRegisteredResourceMethodDescriptor = registeredResourcesServiceServiceDescriptor.Methods().ByName("CreateRegisteredResource") + registeredResourcesServiceGetRegisteredResourceMethodDescriptor = registeredResourcesServiceServiceDescriptor.Methods().ByName("GetRegisteredResource") + registeredResourcesServiceListRegisteredResourcesMethodDescriptor = registeredResourcesServiceServiceDescriptor.Methods().ByName("ListRegisteredResources") + registeredResourcesServiceUpdateRegisteredResourceMethodDescriptor = registeredResourcesServiceServiceDescriptor.Methods().ByName("UpdateRegisteredResource") + registeredResourcesServiceDeleteRegisteredResourceMethodDescriptor = registeredResourcesServiceServiceDescriptor.Methods().ByName("DeleteRegisteredResource") + registeredResourcesServiceCreateRegisteredResourceValueMethodDescriptor = registeredResourcesServiceServiceDescriptor.Methods().ByName("CreateRegisteredResourceValue") + registeredResourcesServiceGetRegisteredResourceValueMethodDescriptor = registeredResourcesServiceServiceDescriptor.Methods().ByName("GetRegisteredResourceValue") + registeredResourcesServiceGetRegisteredResourceValuesByFQNsMethodDescriptor = registeredResourcesServiceServiceDescriptor.Methods().ByName("GetRegisteredResourceValuesByFQNs") + registeredResourcesServiceListRegisteredResourceValuesMethodDescriptor = registeredResourcesServiceServiceDescriptor.Methods().ByName("ListRegisteredResourceValues") + registeredResourcesServiceUpdateRegisteredResourceValueMethodDescriptor = registeredResourcesServiceServiceDescriptor.Methods().ByName("UpdateRegisteredResourceValue") + registeredResourcesServiceDeleteRegisteredResourceValueMethodDescriptor = registeredResourcesServiceServiceDescriptor.Methods().ByName("DeleteRegisteredResourceValue") ) // RegisteredResourcesServiceClient is a client for the @@ -91,6 +95,7 @@ type RegisteredResourcesServiceClient interface { DeleteRegisteredResource(context.Context, *connect.Request[registeredresources.DeleteRegisteredResourceRequest]) (*connect.Response[registeredresources.DeleteRegisteredResourceResponse], error) CreateRegisteredResourceValue(context.Context, *connect.Request[registeredresources.CreateRegisteredResourceValueRequest]) (*connect.Response[registeredresources.CreateRegisteredResourceValueResponse], error) GetRegisteredResourceValue(context.Context, *connect.Request[registeredresources.GetRegisteredResourceValueRequest]) (*connect.Response[registeredresources.GetRegisteredResourceValueResponse], error) + GetRegisteredResourceValuesByFQNs(context.Context, *connect.Request[registeredresources.GetRegisteredResourceValuesByFQNsRequest]) (*connect.Response[registeredresources.GetRegisteredResourceValuesByFQNsResponse], error) ListRegisteredResourceValues(context.Context, *connect.Request[registeredresources.ListRegisteredResourceValuesRequest]) (*connect.Response[registeredresources.ListRegisteredResourceValuesResponse], error) UpdateRegisteredResourceValue(context.Context, *connect.Request[registeredresources.UpdateRegisteredResourceValueRequest]) (*connect.Response[registeredresources.UpdateRegisteredResourceValueResponse], error) DeleteRegisteredResourceValue(context.Context, *connect.Request[registeredresources.DeleteRegisteredResourceValueRequest]) (*connect.Response[registeredresources.DeleteRegisteredResourceValueResponse], error) @@ -149,6 +154,12 @@ func NewRegisteredResourcesServiceClient(httpClient connect.HTTPClient, baseURL connect.WithSchema(registeredResourcesServiceGetRegisteredResourceValueMethodDescriptor), connect.WithClientOptions(opts...), ), + getRegisteredResourceValuesByFQNs: connect.NewClient[registeredresources.GetRegisteredResourceValuesByFQNsRequest, registeredresources.GetRegisteredResourceValuesByFQNsResponse]( + httpClient, + baseURL+RegisteredResourcesServiceGetRegisteredResourceValuesByFQNsProcedure, + connect.WithSchema(registeredResourcesServiceGetRegisteredResourceValuesByFQNsMethodDescriptor), + connect.WithClientOptions(opts...), + ), listRegisteredResourceValues: connect.NewClient[registeredresources.ListRegisteredResourceValuesRequest, registeredresources.ListRegisteredResourceValuesResponse]( httpClient, baseURL+RegisteredResourcesServiceListRegisteredResourceValuesProcedure, @@ -172,16 +183,17 @@ func NewRegisteredResourcesServiceClient(httpClient connect.HTTPClient, baseURL // registeredResourcesServiceClient implements RegisteredResourcesServiceClient. type registeredResourcesServiceClient struct { - createRegisteredResource *connect.Client[registeredresources.CreateRegisteredResourceRequest, registeredresources.CreateRegisteredResourceResponse] - getRegisteredResource *connect.Client[registeredresources.GetRegisteredResourceRequest, registeredresources.GetRegisteredResourceResponse] - listRegisteredResources *connect.Client[registeredresources.ListRegisteredResourcesRequest, registeredresources.ListRegisteredResourcesResponse] - updateRegisteredResource *connect.Client[registeredresources.UpdateRegisteredResourceRequest, registeredresources.UpdateRegisteredResourceResponse] - deleteRegisteredResource *connect.Client[registeredresources.DeleteRegisteredResourceRequest, registeredresources.DeleteRegisteredResourceResponse] - createRegisteredResourceValue *connect.Client[registeredresources.CreateRegisteredResourceValueRequest, registeredresources.CreateRegisteredResourceValueResponse] - getRegisteredResourceValue *connect.Client[registeredresources.GetRegisteredResourceValueRequest, registeredresources.GetRegisteredResourceValueResponse] - listRegisteredResourceValues *connect.Client[registeredresources.ListRegisteredResourceValuesRequest, registeredresources.ListRegisteredResourceValuesResponse] - updateRegisteredResourceValue *connect.Client[registeredresources.UpdateRegisteredResourceValueRequest, registeredresources.UpdateRegisteredResourceValueResponse] - deleteRegisteredResourceValue *connect.Client[registeredresources.DeleteRegisteredResourceValueRequest, registeredresources.DeleteRegisteredResourceValueResponse] + createRegisteredResource *connect.Client[registeredresources.CreateRegisteredResourceRequest, registeredresources.CreateRegisteredResourceResponse] + getRegisteredResource *connect.Client[registeredresources.GetRegisteredResourceRequest, registeredresources.GetRegisteredResourceResponse] + listRegisteredResources *connect.Client[registeredresources.ListRegisteredResourcesRequest, registeredresources.ListRegisteredResourcesResponse] + updateRegisteredResource *connect.Client[registeredresources.UpdateRegisteredResourceRequest, registeredresources.UpdateRegisteredResourceResponse] + deleteRegisteredResource *connect.Client[registeredresources.DeleteRegisteredResourceRequest, registeredresources.DeleteRegisteredResourceResponse] + createRegisteredResourceValue *connect.Client[registeredresources.CreateRegisteredResourceValueRequest, registeredresources.CreateRegisteredResourceValueResponse] + getRegisteredResourceValue *connect.Client[registeredresources.GetRegisteredResourceValueRequest, registeredresources.GetRegisteredResourceValueResponse] + getRegisteredResourceValuesByFQNs *connect.Client[registeredresources.GetRegisteredResourceValuesByFQNsRequest, registeredresources.GetRegisteredResourceValuesByFQNsResponse] + listRegisteredResourceValues *connect.Client[registeredresources.ListRegisteredResourceValuesRequest, registeredresources.ListRegisteredResourceValuesResponse] + updateRegisteredResourceValue *connect.Client[registeredresources.UpdateRegisteredResourceValueRequest, registeredresources.UpdateRegisteredResourceValueResponse] + deleteRegisteredResourceValue *connect.Client[registeredresources.DeleteRegisteredResourceValueRequest, registeredresources.DeleteRegisteredResourceValueResponse] } // CreateRegisteredResource calls @@ -226,6 +238,12 @@ func (c *registeredResourcesServiceClient) GetRegisteredResourceValue(ctx contex return c.getRegisteredResourceValue.CallUnary(ctx, req) } +// GetRegisteredResourceValuesByFQNs calls +// policy.registeredresources.RegisteredResourcesService.GetRegisteredResourceValuesByFQNs. +func (c *registeredResourcesServiceClient) GetRegisteredResourceValuesByFQNs(ctx context.Context, req *connect.Request[registeredresources.GetRegisteredResourceValuesByFQNsRequest]) (*connect.Response[registeredresources.GetRegisteredResourceValuesByFQNsResponse], error) { + return c.getRegisteredResourceValuesByFQNs.CallUnary(ctx, req) +} + // ListRegisteredResourceValues calls // policy.registeredresources.RegisteredResourcesService.ListRegisteredResourceValues. func (c *registeredResourcesServiceClient) ListRegisteredResourceValues(ctx context.Context, req *connect.Request[registeredresources.ListRegisteredResourceValuesRequest]) (*connect.Response[registeredresources.ListRegisteredResourceValuesResponse], error) { @@ -254,6 +272,7 @@ type RegisteredResourcesServiceHandler interface { DeleteRegisteredResource(context.Context, *connect.Request[registeredresources.DeleteRegisteredResourceRequest]) (*connect.Response[registeredresources.DeleteRegisteredResourceResponse], error) CreateRegisteredResourceValue(context.Context, *connect.Request[registeredresources.CreateRegisteredResourceValueRequest]) (*connect.Response[registeredresources.CreateRegisteredResourceValueResponse], error) GetRegisteredResourceValue(context.Context, *connect.Request[registeredresources.GetRegisteredResourceValueRequest]) (*connect.Response[registeredresources.GetRegisteredResourceValueResponse], error) + GetRegisteredResourceValuesByFQNs(context.Context, *connect.Request[registeredresources.GetRegisteredResourceValuesByFQNsRequest]) (*connect.Response[registeredresources.GetRegisteredResourceValuesByFQNsResponse], error) ListRegisteredResourceValues(context.Context, *connect.Request[registeredresources.ListRegisteredResourceValuesRequest]) (*connect.Response[registeredresources.ListRegisteredResourceValuesResponse], error) UpdateRegisteredResourceValue(context.Context, *connect.Request[registeredresources.UpdateRegisteredResourceValueRequest]) (*connect.Response[registeredresources.UpdateRegisteredResourceValueResponse], error) DeleteRegisteredResourceValue(context.Context, *connect.Request[registeredresources.DeleteRegisteredResourceValueRequest]) (*connect.Response[registeredresources.DeleteRegisteredResourceValueResponse], error) @@ -307,6 +326,12 @@ func NewRegisteredResourcesServiceHandler(svc RegisteredResourcesServiceHandler, connect.WithSchema(registeredResourcesServiceGetRegisteredResourceValueMethodDescriptor), connect.WithHandlerOptions(opts...), ) + registeredResourcesServiceGetRegisteredResourceValuesByFQNsHandler := connect.NewUnaryHandler( + RegisteredResourcesServiceGetRegisteredResourceValuesByFQNsProcedure, + svc.GetRegisteredResourceValuesByFQNs, + connect.WithSchema(registeredResourcesServiceGetRegisteredResourceValuesByFQNsMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) registeredResourcesServiceListRegisteredResourceValuesHandler := connect.NewUnaryHandler( RegisteredResourcesServiceListRegisteredResourceValuesProcedure, svc.ListRegisteredResourceValues, @@ -341,6 +366,8 @@ func NewRegisteredResourcesServiceHandler(svc RegisteredResourcesServiceHandler, registeredResourcesServiceCreateRegisteredResourceValueHandler.ServeHTTP(w, r) case RegisteredResourcesServiceGetRegisteredResourceValueProcedure: registeredResourcesServiceGetRegisteredResourceValueHandler.ServeHTTP(w, r) + case RegisteredResourcesServiceGetRegisteredResourceValuesByFQNsProcedure: + registeredResourcesServiceGetRegisteredResourceValuesByFQNsHandler.ServeHTTP(w, r) case RegisteredResourcesServiceListRegisteredResourceValuesProcedure: registeredResourcesServiceListRegisteredResourceValuesHandler.ServeHTTP(w, r) case RegisteredResourcesServiceUpdateRegisteredResourceValueProcedure: @@ -384,6 +411,10 @@ func (UnimplementedRegisteredResourcesServiceHandler) GetRegisteredResourceValue return nil, connect.NewError(connect.CodeUnimplemented, errors.New("policy.registeredresources.RegisteredResourcesService.GetRegisteredResourceValue is not implemented")) } +func (UnimplementedRegisteredResourcesServiceHandler) GetRegisteredResourceValuesByFQNs(context.Context, *connect.Request[registeredresources.GetRegisteredResourceValuesByFQNsRequest]) (*connect.Response[registeredresources.GetRegisteredResourceValuesByFQNsResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("policy.registeredresources.RegisteredResourcesService.GetRegisteredResourceValuesByFQNs is not implemented")) +} + func (UnimplementedRegisteredResourcesServiceHandler) ListRegisteredResourceValues(context.Context, *connect.Request[registeredresources.ListRegisteredResourceValuesRequest]) (*connect.Response[registeredresources.ListRegisteredResourceValuesResponse], error) { return nil, connect.NewError(connect.CodeUnimplemented, errors.New("policy.registeredresources.RegisteredResourcesService.ListRegisteredResourceValues is not implemented")) } diff --git a/service/integration/registered_resources_test.go b/service/integration/registered_resources_test.go index 5b7a0ffc4b..61aa83c931 100644 --- a/service/integration/registered_resources_test.go +++ b/service/integration/registered_resources_test.go @@ -2,6 +2,7 @@ package integration import ( "context" + "fmt" "log/slog" "strings" "testing" @@ -123,12 +124,12 @@ func (s *RegisteredResourcesSuite) Test_CreateRegisteredResource_WithNonUniqueNa // Get -func (s *RegisteredResourcesSuite) Test_GetRegisteredResource_Succeeds() { +func (s *RegisteredResourcesSuite) Test_GetRegisteredResource_ByID_Succeeds() { existingRes := s.f.GetRegisteredResourceKey("res_only") got, err := s.db.PolicyClient.GetRegisteredResource(s.ctx, ®isteredresources.GetRegisteredResourceRequest{ - Identifier: ®isteredresources.GetRegisteredResourceRequest_ResourceId{ - ResourceId: existingRes.ID, + Identifier: ®isteredresources.GetRegisteredResourceRequest_Id{ + Id: existingRes.ID, }, }) s.Require().NoError(err) @@ -140,13 +141,30 @@ func (s *RegisteredResourcesSuite) Test_GetRegisteredResource_Succeeds() { s.Empty(got.GetValues()) } +func (s *RegisteredResourcesSuite) Test_GetRegisteredResource_ByName_Succeeds() { + existingRes := s.f.GetRegisteredResourceKey("res_only") + + got, err := s.db.PolicyClient.GetRegisteredResource(s.ctx, ®isteredresources.GetRegisteredResourceRequest{ + Identifier: ®isteredresources.GetRegisteredResourceRequest_Name{ + Name: existingRes.Name, + }, + }) + s.Require().NoError(err) + s.NotNil(got) + s.Equal(existingRes.ID, got.GetId()) + metadata := got.GetMetadata() + s.False(metadata.GetCreatedAt().AsTime().IsZero()) + s.False(metadata.GetUpdatedAt().AsTime().IsZero()) + s.Empty(got.GetValues()) +} + func (s *RegisteredResourcesSuite) Test_GetRegisteredResource_WithValues_Succeeds() { existingRes := s.f.GetRegisteredResourceKey("res_with_values") existingResValue1 := s.f.GetRegisteredResourceValueKey("res_with_values__value1") got, err := s.db.PolicyClient.GetRegisteredResource(s.ctx, ®isteredresources.GetRegisteredResourceRequest{ - Identifier: ®isteredresources.GetRegisteredResourceRequest_ResourceId{ - ResourceId: existingRes.ID, + Identifier: ®isteredresources.GetRegisteredResourceRequest_Id{ + Id: existingRes.ID, }, }) s.Require().NoError(err) @@ -165,10 +183,21 @@ func (s *RegisteredResourcesSuite) Test_GetRegisteredResource_WithValues_Succeed s.True(found) } -func (s *RegisteredResourcesSuite) Test_GetRegisteredResource_InvalidID_Fails() { +func (s *RegisteredResourcesSuite) Test_GetRegisteredResource_ByInvalidID_Fails() { got, err := s.db.PolicyClient.GetRegisteredResource(s.ctx, ®isteredresources.GetRegisteredResourceRequest{ - Identifier: ®isteredresources.GetRegisteredResourceRequest_ResourceId{ - ResourceId: invalidID, + Identifier: ®isteredresources.GetRegisteredResourceRequest_Id{ + Id: invalidID, + }, + }) + s.Require().Error(err) + s.Require().ErrorIs(err, db.ErrNotFound) + s.Nil(got) +} + +func (s *RegisteredResourcesSuite) Test_GetRegisteredResource_ByInvalidName_Fails() { + got, err := s.db.PolicyClient.GetRegisteredResource(s.ctx, ®isteredresources.GetRegisteredResourceRequest{ + Identifier: ®isteredresources.GetRegisteredResourceRequest_Name{ + Name: "invalid_name", }, }) s.Require().Error(err) @@ -321,8 +350,8 @@ func (s *RegisteredResourcesSuite) Test_UpdateRegisteredResource_Succeeds() { // verify resource not updated got, err := s.db.PolicyClient.GetRegisteredResource(s.ctx, ®isteredresources.GetRegisteredResourceRequest{ - Identifier: ®isteredresources.GetRegisteredResourceRequest_ResourceId{ - ResourceId: created.GetId(), + Identifier: ®isteredresources.GetRegisteredResourceRequest_Id{ + Id: created.GetId(), }, }) s.Require().NoError(err) @@ -344,8 +373,8 @@ func (s *RegisteredResourcesSuite) Test_UpdateRegisteredResource_Succeeds() { // verify resource updated got, err = s.db.PolicyClient.GetRegisteredResource(s.ctx, ®isteredresources.GetRegisteredResourceRequest{ - Identifier: ®isteredresources.GetRegisteredResourceRequest_ResourceId{ - ResourceId: created.GetId(), + Identifier: ®isteredresources.GetRegisteredResourceRequest_Id{ + Id: created.GetId(), }, }) s.Require().NoError(err) @@ -376,8 +405,8 @@ func (s *RegisteredResourcesSuite) Test_UpdateRegisteredResource_NormalizedName_ // verify resource updated got, err := s.db.PolicyClient.GetRegisteredResource(s.ctx, ®isteredresources.GetRegisteredResourceRequest{ - Identifier: ®isteredresources.GetRegisteredResourceRequest_ResourceId{ - ResourceId: created.GetId(), + Identifier: ®isteredresources.GetRegisteredResourceRequest_Id{ + Id: created.GetId(), }, }) s.Require().NoError(err) @@ -429,8 +458,8 @@ func (s *RegisteredResourcesSuite) Test_DeleteRegisteredResource_Succeeds() { // verify resource deleted got, err := s.db.PolicyClient.GetRegisteredResource(s.ctx, ®isteredresources.GetRegisteredResourceRequest{ - Identifier: ®isteredresources.GetRegisteredResourceRequest_ResourceId{ - ResourceId: created.GetId(), + Identifier: ®isteredresources.GetRegisteredResourceRequest_Id{ + Id: created.GetId(), }, }) s.Require().Error(err) @@ -441,8 +470,8 @@ func (s *RegisteredResourcesSuite) Test_DeleteRegisteredResource_Succeeds() { gotValues := created.GetValues() gotValue1, err := s.db.PolicyClient.GetRegisteredResourceValue(s.ctx, ®isteredresources.GetRegisteredResourceValueRequest{ - Identifier: ®isteredresources.GetRegisteredResourceValueRequest_ValueId{ - ValueId: gotValues[0].GetId(), + Identifier: ®isteredresources.GetRegisteredResourceValueRequest_Id{ + Id: gotValues[0].GetId(), }, }) s.Require().Error(err) @@ -450,8 +479,8 @@ func (s *RegisteredResourcesSuite) Test_DeleteRegisteredResource_Succeeds() { s.Nil(gotValue1) gotValue2, err := s.db.PolicyClient.GetRegisteredResourceValue(s.ctx, ®isteredresources.GetRegisteredResourceValueRequest{ - Identifier: ®isteredresources.GetRegisteredResourceValueRequest_ValueId{ - ValueId: gotValues[1].GetId(), + Identifier: ®isteredresources.GetRegisteredResourceValueRequest_Id{ + Id: gotValues[1].GetId(), }, }) s.Require().Error(err) @@ -560,28 +589,59 @@ func (s *RegisteredResourcesSuite) Test_CreateRegisteredResourceValue_WithNonUni // Get -func (s *RegisteredResourcesSuite) Test_GetRegisteredResourceValue_Succeeds() { +func (s *RegisteredResourcesSuite) Test_GetRegisteredResourceValue_ByID_Succeeds() { existingRes := s.f.GetRegisteredResourceKey("res_with_values") existingResValue1 := s.f.GetRegisteredResourceValueKey("res_with_values__value1") got, err := s.db.PolicyClient.GetRegisteredResourceValue(s.ctx, ®isteredresources.GetRegisteredResourceValueRequest{ - Identifier: ®isteredresources.GetRegisteredResourceValueRequest_ValueId{ - ValueId: existingResValue1.ID, + Identifier: ®isteredresources.GetRegisteredResourceValueRequest_Id{ + Id: existingResValue1.ID, }, }) s.Require().NoError(err) s.NotNil(got) + s.Equal(existingResValue1.Value, got.GetValue()) s.Equal(existingRes.ID, got.GetResource().GetId()) + metadata := got.GetMetadata() + s.False(metadata.GetCreatedAt().AsTime().IsZero()) + s.False(metadata.GetUpdatedAt().AsTime().IsZero()) +} + +func (s *RegisteredResourcesSuite) Test_GetRegisteredResourceValue_ByFQN_Succeeds() { + existingRes := s.f.GetRegisteredResourceKey("res_with_values") + existingResValue1 := s.f.GetRegisteredResourceValueKey("res_with_values__value1") + fqn := fmt.Sprintf("https://reg_res/%s/value/%s", existingRes.Name, existingResValue1.Value) + + got, err := s.db.PolicyClient.GetRegisteredResourceValue(s.ctx, ®isteredresources.GetRegisteredResourceValueRequest{ + Identifier: ®isteredresources.GetRegisteredResourceValueRequest_Fqn{ + Fqn: fqn, + }, + }) + s.Require().NoError(err) + s.NotNil(got) + s.Equal(existingResValue1.ID, got.GetId()) s.Equal(existingResValue1.Value, got.GetValue()) + s.Equal(existingRes.ID, got.GetResource().GetId()) metadata := got.GetMetadata() s.False(metadata.GetCreatedAt().AsTime().IsZero()) s.False(metadata.GetUpdatedAt().AsTime().IsZero()) } -func (s *RegisteredResourcesSuite) Test_GetRegisteredResourceValue_InvalidID_Fails() { +func (s *RegisteredResourcesSuite) Test_GetRegisteredResourceValue_ByInvalidID_Fails() { + got, err := s.db.PolicyClient.GetRegisteredResourceValue(s.ctx, ®isteredresources.GetRegisteredResourceValueRequest{ + Identifier: ®isteredresources.GetRegisteredResourceValueRequest_Id{ + Id: invalidID, + }, + }) + s.Require().Error(err) + s.Require().ErrorIs(err, db.ErrNotFound) + s.Nil(got) +} + +func (s *RegisteredResourcesSuite) Test_GetRegisteredResourceValue_ByInvalidFQN_Fails() { got, err := s.db.PolicyClient.GetRegisteredResourceValue(s.ctx, ®isteredresources.GetRegisteredResourceValueRequest{ - Identifier: ®isteredresources.GetRegisteredResourceValueRequest_ValueId{ - ValueId: invalidID, + Identifier: ®isteredresources.GetRegisteredResourceValueRequest_Fqn{ + Fqn: "https://reg_res/does_not_exist/value/does_not_exist", }, }) s.Require().Error(err) @@ -589,6 +649,66 @@ func (s *RegisteredResourcesSuite) Test_GetRegisteredResourceValue_InvalidID_Fai s.Nil(got) } +// Get By FQNs + +func (s *RegisteredResourcesSuite) TestGetRegisteredResourceValuesByFQNs_Valid_Succeeds() { + existingRes := s.f.GetRegisteredResourceKey("res_with_values") + existingResValue1 := s.f.GetRegisteredResourceValueKey("res_with_values__value1") + existingResValue2 := s.f.GetRegisteredResourceValueKey("res_with_values__value2") + fqns := []string{ + fmt.Sprintf("https://reg_res/%s/value/%s", existingRes.Name, existingResValue1.Value), + fmt.Sprintf("https://reg_res/%s/value/%s", existingRes.Name, existingResValue2.Value), + } + + got, err := s.db.PolicyClient.GetRegisteredResourceValuesByFQNs(s.ctx, ®isteredresources.GetRegisteredResourceValuesByFQNsRequest{ + Fqns: fqns, + }) + s.Require().NoError(err) + s.NotNil(got) + + foundFQN1 := got[fqns[0]] + s.NotNil(foundFQN1) + s.Equal(existingResValue1.ID, foundFQN1.GetId()) + s.Equal(existingResValue1.Value, foundFQN1.GetValue()) + s.Equal(existingRes.ID, foundFQN1.GetResource().GetId()) + + foundFQN2 := got[fqns[1]] + s.NotNil(foundFQN2) + s.Equal(existingResValue2.ID, foundFQN2.GetId()) + s.Equal(existingResValue2.Value, foundFQN2.GetValue()) + s.Equal(existingRes.ID, foundFQN2.GetResource().GetId()) +} + +func (s *RegisteredResourcesSuite) TestGetRegisteredResourceValuesByFQNs_SomeInvalid_Fails() { + existingRes := s.f.GetRegisteredResourceKey("res_with_values") + existingResValue1 := s.f.GetRegisteredResourceValueKey("res_with_values__value1") + fqns := []string{ + fmt.Sprintf("https://reg_res/%s/value/%s", existingRes.Name, existingResValue1.Value), + "https://reg_res/does_not_exist/value/does_not_exist", + } + + got, err := s.db.PolicyClient.GetRegisteredResourceValuesByFQNs(s.ctx, ®isteredresources.GetRegisteredResourceValuesByFQNsRequest{ + Fqns: fqns, + }) + s.Require().Error(err) + s.Require().ErrorIs(err, db.ErrNotFound) + s.Nil(got) +} + +func (s *RegisteredResourcesSuite) TestGetRegisteredResourceValuesByFQNs_AllInvalid_Fails() { + fqns := []string{ + "https://reg_res/does_not_exist/value/does_not_exist", + "https://reg_res/does_not_exist/value/does_not_exist2", + } + + got, err := s.db.PolicyClient.GetRegisteredResourceValuesByFQNs(s.ctx, ®isteredresources.GetRegisteredResourceValuesByFQNsRequest{ + Fqns: fqns, + }) + s.Require().Error(err) + s.Require().ErrorIs(err, db.ErrNotFound) + s.Nil(got) +} + // List func (s *RegisteredResourcesSuite) Test_ListRegisteredResourceValues_NoPagination_Succeeds() { @@ -767,8 +887,8 @@ func (s *RegisteredResourcesSuite) Test_UpdateRegisteredResourceValue_Succeeds() // verify resource value not updated got, err := s.db.PolicyClient.GetRegisteredResourceValue(s.ctx, ®isteredresources.GetRegisteredResourceValueRequest{ - Identifier: ®isteredresources.GetRegisteredResourceValueRequest_ValueId{ - ValueId: created.GetId(), + Identifier: ®isteredresources.GetRegisteredResourceValueRequest_Id{ + Id: created.GetId(), }, }) s.Require().NoError(err) @@ -790,8 +910,8 @@ func (s *RegisteredResourcesSuite) Test_UpdateRegisteredResourceValue_Succeeds() // verify resource updated got, err = s.db.PolicyClient.GetRegisteredResourceValue(s.ctx, ®isteredresources.GetRegisteredResourceValueRequest{ - Identifier: ®isteredresources.GetRegisteredResourceValueRequest_ValueId{ - ValueId: created.GetId(), + Identifier: ®isteredresources.GetRegisteredResourceValueRequest_Id{ + Id: created.GetId(), }, }) s.Require().NoError(err) @@ -829,8 +949,8 @@ func (s *RegisteredResourcesSuite) Test_UpdateRegisteredResourceValue_Normalized // verify resource value updated got, err := s.db.PolicyClient.GetRegisteredResourceValue(s.ctx, ®isteredresources.GetRegisteredResourceValueRequest{ - Identifier: ®isteredresources.GetRegisteredResourceValueRequest_ValueId{ - ValueId: created.GetId(), + Identifier: ®isteredresources.GetRegisteredResourceValueRequest_Id{ + Id: created.GetId(), }, }) s.Require().NoError(err) @@ -900,8 +1020,8 @@ func (s *RegisteredResourcesSuite) Test_DeleteRegisteredResourceValue_Succeeds() // verify resource value deleted got, err := s.db.PolicyClient.GetRegisteredResourceValue(s.ctx, ®isteredresources.GetRegisteredResourceValueRequest{ - Identifier: ®isteredresources.GetRegisteredResourceValueRequest_ValueId{ - ValueId: created.GetId(), + Identifier: ®isteredresources.GetRegisteredResourceValueRequest_Id{ + Id: created.GetId(), }, }) s.Require().Error(err) diff --git a/service/pkg/util/fqn.go b/service/pkg/util/fqn.go index 098d0b8f1c..cc82691475 100644 --- a/service/pkg/util/fqn.go +++ b/service/pkg/util/fqn.go @@ -11,6 +11,12 @@ type FullyQualifiedResourceMappingGroup struct { GroupName string } +type FullyQualifiedRegisteredResourceValue struct { + Fqn string + Name string + Value string +} + // protovalidate already validates the FQN format in the service request // for parsing purposes, we can just look for any non-whitespace characters // e.g. should be in format of "https:///resm/" @@ -18,8 +24,12 @@ var resourceMappingGroupFqnRegex = regexp.MustCompile( `^https:\/\/(?\S+)\/resm\/(?\S+)$`, ) -// todo: logic could be made more generic in the future to support multiple FQN formats -// e.g. parse FQN for '/attr', '/value', '/resm' or some other method +var registeredResourceValueFqnRegex = regexp.MustCompile( + `^https:\/\/reg_res\/(?\S+)\/value\/(?\S+)$`, +) + +// todo: is it possible to make this more generic and support all fqn formats? + func ParseResourceMappingGroupFqn(fqn string) (*FullyQualifiedResourceMappingGroup, error) { matches := resourceMappingGroupFqnRegex.FindStringSubmatch(fqn) numMatches := len(matches) @@ -37,3 +47,21 @@ func ParseResourceMappingGroupFqn(fqn string) (*FullyQualifiedResourceMappingGro GroupName: matches[groupNameIdx], }, nil } + +func ParseRegisteredResourceValueFqn(fqn string) (*FullyQualifiedRegisteredResourceValue, error) { + matches := registeredResourceValueFqnRegex.FindStringSubmatch(fqn) + numMatches := len(matches) + + nameIdx := registeredResourceValueFqnRegex.SubexpIndex("name") + valueIdx := registeredResourceValueFqnRegex.SubexpIndex("value") + + if numMatches < nameIdx || numMatches < valueIdx { + return nil, errors.New("error: valid FQN format of https://reg_res//value/ must be provided") + } + + return &FullyQualifiedRegisteredResourceValue{ + Fqn: fqn, + Name: matches[nameIdx], + Value: matches[valueIdx], + }, nil +} diff --git a/service/pkg/util/fqn_test.go b/service/pkg/util/fqn_test.go new file mode 100644 index 0000000000..d5a44f8751 --- /dev/null +++ b/service/pkg/util/fqn_test.go @@ -0,0 +1,64 @@ +package util + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestParseResourceMappingGroupFqn_Valid_Succeeds(t *testing.T) { + fqn := "https://namespace.com/resm/group_name" + + parsed, err := ParseResourceMappingGroupFqn(fqn) + require.NoError(t, err) + require.Equal(t, fqn, parsed.Fqn) + require.Equal(t, "namespace.com", parsed.Namespace) + require.Equal(t, "group_name", parsed.GroupName) +} + +func TestParseResourceMappingGroupFqn_Invalid_Fails(t *testing.T) { + invalidFQNs := []string{ + "", + "invalid", + "https://namespace.com", + "http://namespace.com/resm/group_name", + "somethinghttps://namespace.com/resm/group_name", + "https://namespace.com/resm", + "https://namespace.com/resm/", + } + + for _, fqn := range invalidFQNs { + parsed, err := ParseResourceMappingGroupFqn(fqn) + require.EqualError(t, err, "error: valid FQN format of https:///resm/ must be provided") + require.Nil(t, parsed) + } +} + +func TestParseRegisteredResourceValueFqn_Valid_Succeeds(t *testing.T) { + fqn := "https://reg_res/valid/value/test" + + parsed, err := ParseRegisteredResourceValueFqn(fqn) + require.NoError(t, err) + require.Equal(t, fqn, parsed.Fqn) + require.Equal(t, "valid", parsed.Name) + require.Equal(t, "test", parsed.Value) +} + +func TestParseRegisteredResourceValueFqn_Invalid_Fails(t *testing.T) { + invalidFQNs := []string{ + "", + "invalid", + "https://reg_res", + "https://reg_res/invalid", + "http://reg_res/test/value/something", + "somethinghttps://reg_res/test/value/something", + "https://reg_res/invalid/value", + "https://reg_res/invalid/value/", + } + + for _, fqn := range invalidFQNs { + parsed, err := ParseRegisteredResourceValueFqn(fqn) + require.EqualError(t, err, "error: valid FQN format of https://reg_res//value/ must be provided") + require.Nil(t, parsed) + } +} diff --git a/service/policy/db/query.sql b/service/policy/db/query.sql index 1ff98ef5e0..819570cb19 100644 --- a/service/policy/db/query.sql +++ b/service/policy/db/query.sql @@ -1418,7 +1418,6 @@ VALUES ($1, $2) RETURNING id; -- name: getRegisteredResource :one --- TODO add FQN support SELECT r.id, r.name, @@ -1431,7 +1430,9 @@ SELECT ) FILTER (WHERE v.id IS NOT NULL) as values FROM registered_resources r LEFT JOIN registered_resource_values v ON v.registered_resource_id = r.id -WHERE r.id = $1 +WHERE + (NULLIF(@id, '') IS NULL OR r.id = @id::UUID) AND + (NULLIF(@name, '') IS NULL OR r.name = @name::VARCHAR) GROUP BY r.id; -- name: listRegisteredResources :many @@ -1479,12 +1480,16 @@ RETURNING id; -- name: getRegisteredResourceValue :one SELECT - id, - registered_resource_id, - value, - JSON_STRIP_NULLS(JSON_BUILD_OBJECT('labels', metadata -> 'labels', 'created_at', created_at, 'updated_at', updated_at)) as metadata -FROM registered_resource_values -WHERE id = $1; + v.id, + v.registered_resource_id, + v.value, + JSON_STRIP_NULLS(JSON_BUILD_OBJECT('labels', v.metadata -> 'labels', 'created_at', v.created_at, 'updated_at', v.updated_at)) as metadata +FROM registered_resource_values v +JOIN registered_resources r ON v.registered_resource_id = r.id +WHERE + (NULLIF(@id, '') IS NULL OR v.id = @id::UUID) AND + (NULLIF(@name, '') IS NULL OR r.name = @name::VARCHAR) AND + (NULLIF(@value, '') IS NULL OR v.value = @value::VARCHAR); -- name: listRegisteredResourceValues :many WITH counted AS ( diff --git a/service/policy/db/query.sql.go b/service/policy/db/query.sql.go index 3d32b00c8f..4b44911f35 100644 --- a/service/policy/db/query.sql.go +++ b/service/policy/db/query.sql.go @@ -3570,10 +3570,17 @@ SELECT ) FILTER (WHERE v.id IS NOT NULL) as values FROM registered_resources r LEFT JOIN registered_resource_values v ON v.registered_resource_id = r.id -WHERE r.id = $1 +WHERE + (NULLIF($1, '') IS NULL OR r.id = $1::UUID) AND + (NULLIF($2, '') IS NULL OR r.name = $2::VARCHAR) GROUP BY r.id ` +type getRegisteredResourceParams struct { + ID interface{} `json:"id"` + Name interface{} `json:"name"` +} + type getRegisteredResourceRow struct { ID string `json:"id"` Name string `json:"name"` @@ -3581,7 +3588,7 @@ type getRegisteredResourceRow struct { Values []byte `json:"values"` } -// TODO add FQN support +// getRegisteredResource // // SELECT // r.id, @@ -3595,10 +3602,12 @@ type getRegisteredResourceRow struct { // ) FILTER (WHERE v.id IS NOT NULL) as values // FROM registered_resources r // LEFT JOIN registered_resource_values v ON v.registered_resource_id = r.id -// WHERE r.id = $1 +// WHERE +// (NULLIF($1, '') IS NULL OR r.id = $1::UUID) AND +// (NULLIF($2, '') IS NULL OR r.name = $2::VARCHAR) // GROUP BY r.id -func (q *Queries) getRegisteredResource(ctx context.Context, id string) (getRegisteredResourceRow, error) { - row := q.db.QueryRow(ctx, getRegisteredResource, id) +func (q *Queries) getRegisteredResource(ctx context.Context, arg getRegisteredResourceParams) (getRegisteredResourceRow, error) { + row := q.db.QueryRow(ctx, getRegisteredResource, arg.ID, arg.Name) var i getRegisteredResourceRow err := row.Scan( &i.ID, @@ -3611,14 +3620,24 @@ func (q *Queries) getRegisteredResource(ctx context.Context, id string) (getRegi const getRegisteredResourceValue = `-- name: getRegisteredResourceValue :one SELECT - id, - registered_resource_id, - value, - JSON_STRIP_NULLS(JSON_BUILD_OBJECT('labels', metadata -> 'labels', 'created_at', created_at, 'updated_at', updated_at)) as metadata -FROM registered_resource_values -WHERE id = $1 + v.id, + v.registered_resource_id, + v.value, + JSON_STRIP_NULLS(JSON_BUILD_OBJECT('labels', v.metadata -> 'labels', 'created_at', v.created_at, 'updated_at', v.updated_at)) as metadata +FROM registered_resource_values v +JOIN registered_resources r ON v.registered_resource_id = r.id +WHERE + (NULLIF($1, '') IS NULL OR v.id = $1::UUID) AND + (NULLIF($2, '') IS NULL OR r.name = $2::VARCHAR) AND + (NULLIF($3, '') IS NULL OR v.value = $3::VARCHAR) ` +type getRegisteredResourceValueParams struct { + ID interface{} `json:"id"` + Name interface{} `json:"name"` + Value interface{} `json:"value"` +} + type getRegisteredResourceValueRow struct { ID string `json:"id"` RegisteredResourceID string `json:"registered_resource_id"` @@ -3629,14 +3648,18 @@ type getRegisteredResourceValueRow struct { // getRegisteredResourceValue // // SELECT -// id, -// registered_resource_id, -// value, -// JSON_STRIP_NULLS(JSON_BUILD_OBJECT('labels', metadata -> 'labels', 'created_at', created_at, 'updated_at', updated_at)) as metadata -// FROM registered_resource_values -// WHERE id = $1 -func (q *Queries) getRegisteredResourceValue(ctx context.Context, id string) (getRegisteredResourceValueRow, error) { - row := q.db.QueryRow(ctx, getRegisteredResourceValue, id) +// v.id, +// v.registered_resource_id, +// v.value, +// JSON_STRIP_NULLS(JSON_BUILD_OBJECT('labels', v.metadata -> 'labels', 'created_at', v.created_at, 'updated_at', v.updated_at)) as metadata +// FROM registered_resource_values v +// JOIN registered_resources r ON v.registered_resource_id = r.id +// WHERE +// (NULLIF($1, '') IS NULL OR v.id = $1::UUID) AND +// (NULLIF($2, '') IS NULL OR r.name = $2::VARCHAR) AND +// (NULLIF($3, '') IS NULL OR v.value = $3::VARCHAR) +func (q *Queries) getRegisteredResourceValue(ctx context.Context, arg getRegisteredResourceValueParams) (getRegisteredResourceValueRow, error) { + row := q.db.QueryRow(ctx, getRegisteredResourceValue, arg.ID, arg.Name, arg.Value) var i getRegisteredResourceValueRow err := row.Scan( &i.ID, diff --git a/service/policy/db/registered_resources.go b/service/policy/db/registered_resources.go index e86dc26b7a..b18e61c092 100644 --- a/service/policy/db/registered_resources.go +++ b/service/policy/db/registered_resources.go @@ -3,14 +3,15 @@ package db import ( "context" "encoding/json" - "errors" "fmt" + "log/slog" "strings" "github.com/opentdf/platform/protocol/go/common" "github.com/opentdf/platform/protocol/go/policy" "github.com/opentdf/platform/protocol/go/policy/registeredresources" "github.com/opentdf/platform/service/pkg/db" + "github.com/opentdf/platform/service/pkg/util" "google.golang.org/protobuf/encoding/protojson" ) @@ -66,27 +67,25 @@ func (c PolicyDBClient) CreateRegisteredResource(ctx context.Context, r *registe } return c.GetRegisteredResource(ctx, ®isteredresources.GetRegisteredResourceRequest{ - Identifier: ®isteredresources.GetRegisteredResourceRequest_ResourceId{ - ResourceId: createdID, + Identifier: ®isteredresources.GetRegisteredResourceRequest_Id{ + Id: createdID, }, }) } func (c PolicyDBClient) GetRegisteredResource(ctx context.Context, r *registeredresources.GetRegisteredResourceRequest) (*policy.RegisteredResource, error) { - var id string + params := getRegisteredResourceParams{} switch { - case r.GetResourceId() != "": - // TODO: refactor to pgtype.UUID once the query supports both id and fqn - id = r.GetResourceId() - case r.GetFqn() != "": - // TODO: implement - return nil, errors.New("FQN support not yet implemented") + case r.GetId() != "": + params.ID = r.GetId() + case r.GetName() != "": + params.Name = strings.ToLower(r.GetName()) default: return nil, db.ErrSelectIdentifierInvalid } - rr, err := c.Queries.getRegisteredResource(ctx, id) + rr, err := c.Queries.getRegisteredResource(ctx, params) if err != nil { return nil, db.WrapIfKnownInvalidQueryErr(err) } @@ -168,8 +167,8 @@ func (c PolicyDBClient) UpdateRegisteredResource(ctx context.Context, r *registe name := strings.ToLower(r.GetName()) metadataJSON, metadata, err := db.MarshalUpdateMetadata(r.GetMetadata(), r.GetMetadataUpdateBehavior(), func() (*common.Metadata, error) { v, err := c.GetRegisteredResource(ctx, ®isteredresources.GetRegisteredResourceRequest{ - Identifier: ®isteredresources.GetRegisteredResourceRequest_ResourceId{ - ResourceId: id, + Identifier: ®isteredresources.GetRegisteredResourceRequest_Id{ + Id: id, }, }) if err != nil { @@ -236,28 +235,32 @@ func (c PolicyDBClient) CreateRegisteredResourceValue(ctx context.Context, r *re } return c.GetRegisteredResourceValue(ctx, ®isteredresources.GetRegisteredResourceValueRequest{ - Identifier: ®isteredresources.GetRegisteredResourceValueRequest_ValueId{ - ValueId: createdID, + Identifier: ®isteredresources.GetRegisteredResourceValueRequest_Id{ + Id: createdID, }, }) } func (c PolicyDBClient) GetRegisteredResourceValue(ctx context.Context, r *registeredresources.GetRegisteredResourceValueRequest) (*policy.RegisteredResourceValue, error) { - var id string + params := getRegisteredResourceValueParams{} switch { - case r.GetValueId() != "": - // TODO: refactor to pgtype.UUID once the query supports both id and fqn - id = r.GetValueId() + case r.GetId() != "": + params.ID = r.GetId() case r.GetFqn() != "": - // TODO: implement - return nil, errors.New("FQN support not yet implemented") + fqn := strings.ToLower(r.GetFqn()) + parsed, err := util.ParseRegisteredResourceValueFqn(fqn) + if err != nil { + return nil, err + } + params.Name = parsed.Name + params.Value = parsed.Value default: // unexpected type return nil, db.ErrSelectIdentifierInvalid } - rv, err := c.Queries.getRegisteredResourceValue(ctx, id) + rv, err := c.Queries.getRegisteredResourceValue(ctx, params) if err != nil { return nil, db.WrapIfKnownInvalidQueryErr(err) } @@ -277,6 +280,51 @@ func (c PolicyDBClient) GetRegisteredResourceValue(ctx context.Context, r *regis }, nil } +func (c PolicyDBClient) GetRegisteredResourceValuesByFQNs(ctx context.Context, r *registeredresources.GetRegisteredResourceValuesByFQNsRequest) (map[string]*policy.RegisteredResourceValue, error) { + resp := make(map[string]*policy.RegisteredResourceValue) + count := 0 + + for _, fqn := range r.GetFqns() { + normalizedFQN := strings.ToLower(fqn) + + parsed, err := util.ParseRegisteredResourceValueFqn(fqn) + if err != nil { + return nil, err + } + + rv, err := c.Queries.getRegisteredResourceValue(ctx, getRegisteredResourceValueParams{ + Name: parsed.Name, + Value: parsed.Value, + }) + if err != nil { + c.logger.Error("registered resource value for FQN not found", slog.String("fqn", fqn), slog.Any("err", err)) + return nil, db.WrapIfKnownInvalidQueryErr(err) + } + + count++ + + metadata := &common.Metadata{} + if err = unmarshalMetadata(rv.Metadata, metadata); err != nil { + return nil, err + } + + resp[normalizedFQN] = &policy.RegisteredResourceValue{ + Id: rv.ID, + Value: rv.Value, + Metadata: metadata, + Resource: &policy.RegisteredResource{ + Id: rv.RegisteredResourceID, + }, + } + } + + if count == 0 { + return nil, db.ErrNotFound + } + + return resp, nil +} + func (c PolicyDBClient) ListRegisteredResourceValues(ctx context.Context, r *registeredresources.ListRegisteredResourceValuesRequest) (*registeredresources.ListRegisteredResourceValuesResponse, error) { resourceID := r.GetResourceId() limit, offset := c.getRequestedLimitOffset(r.GetPagination()) @@ -335,8 +383,8 @@ func (c PolicyDBClient) UpdateRegisteredResourceValue(ctx context.Context, r *re value := strings.ToLower(r.GetValue()) metadataJSON, metadata, err := db.MarshalUpdateMetadata(r.GetMetadata(), r.GetMetadataUpdateBehavior(), func() (*common.Metadata, error) { v, err := c.GetRegisteredResourceValue(ctx, ®isteredresources.GetRegisteredResourceValueRequest{ - Identifier: ®isteredresources.GetRegisteredResourceValueRequest_ValueId{ - ValueId: id, + Identifier: ®isteredresources.GetRegisteredResourceValueRequest_Id{ + Id: id, }, }) if err != nil { diff --git a/service/policy/registeredresources/registered_resources.go b/service/policy/registeredresources/registered_resources.go index 142b7bb236..54f37cd2a9 100644 --- a/service/policy/registeredresources/registered_resources.go +++ b/service/policy/registeredresources/registered_resources.go @@ -150,8 +150,8 @@ func (s *RegisteredResourcesService) UpdateRegisteredResource(ctx context.Contex err := s.dbClient.RunInTx(ctx, func(txClient *policydb.PolicyDBClient) error { original, err := txClient.GetRegisteredResource(ctx, ®isteredresources.GetRegisteredResourceRequest{ - Identifier: ®isteredresources.GetRegisteredResourceRequest_ResourceId{ - ResourceId: resourceID, + Identifier: ®isteredresources.GetRegisteredResourceRequest_Id{ + Id: resourceID, }, }) if err != nil { @@ -251,6 +251,20 @@ func (s *RegisteredResourcesService) GetRegisteredResourceValue(ctx context.Cont return connect.NewResponse(rsp), nil } +func (s *RegisteredResourcesService) GetRegisteredResourceValuesByFQNs(ctx context.Context, req *connect.Request[registeredresources.GetRegisteredResourceValuesByFQNsRequest]) (*connect.Response[registeredresources.GetRegisteredResourceValuesByFQNsResponse], error) { + rsp := ®isteredresources.GetRegisteredResourceValuesByFQNsResponse{} + + s.logger.DebugContext(ctx, "getting registered resource values by FQNs", slog.Any("fqns", req.Msg.GetFqns())) + + fqnValueMap, err := s.dbClient.GetRegisteredResourceValuesByFQNs(ctx, req.Msg) + if err != nil { + return nil, db.StatusifyError(err, db.ErrTextGetRetrievalFailed, slog.Any("fqns", req.Msg.GetFqns())) + } + rsp.FqnValueMap = fqnValueMap + + return connect.NewResponse(rsp), nil +} + func (s *RegisteredResourcesService) ListRegisteredResourceValues(ctx context.Context, req *connect.Request[registeredresources.ListRegisteredResourceValuesRequest]) (*connect.Response[registeredresources.ListRegisteredResourceValuesResponse], error) { s.logger.DebugContext(ctx, "listing registered resource values") @@ -279,8 +293,8 @@ func (s *RegisteredResourcesService) UpdateRegisteredResourceValue(ctx context.C err := s.dbClient.RunInTx(ctx, func(txClient *policydb.PolicyDBClient) error { original, err := txClient.GetRegisteredResourceValue(ctx, ®isteredresources.GetRegisteredResourceValueRequest{ - Identifier: ®isteredresources.GetRegisteredResourceValueRequest_ValueId{ - ValueId: valueID, + Identifier: ®isteredresources.GetRegisteredResourceValueRequest_Id{ + Id: valueID, }, }) if err != nil { diff --git a/service/policy/registeredresources/registered_resources.proto b/service/policy/registeredresources/registered_resources.proto index 80c71e65db..aa86da9ab2 100644 --- a/service/policy/registeredresources/registered_resources.proto +++ b/service/policy/registeredresources/registered_resources.proto @@ -53,14 +53,17 @@ message GetRegisteredResourceRequest { oneof identifier { option (buf.validate.oneof).required = true; - string resource_id = 1 [ + string id = 1 [ (buf.validate.field).string.uuid = true ]; - string fqn = 2 [ - (buf.validate.field).string = { - min_len : 1 - uri : true + string name = 2 [ + (buf.validate.field).required = false, + (buf.validate.field).string.max_len = 253, + (buf.validate.field).cel = { + id: "rr_name_format", + message: "Registered Resource Name must be an alphanumeric string, allowing hyphens and underscores but not as the first or last character. The stored name will be normalized to lower case.", + expression: "size(this) > 0 ? this.matches('^[a-zA-Z0-9](?:[a-zA-Z0-9_-]*[a-zA-Z0-9])?$') : true" } ]; } @@ -148,7 +151,7 @@ message GetRegisteredResourceValueRequest { oneof identifier { option (buf.validate.oneof).required = true; - string value_id = 1 [ + string id = 1 [ (buf.validate.field).string.uuid = true ]; @@ -164,6 +167,26 @@ message GetRegisteredResourceValueResponse { policy.RegisteredResourceValue value = 1; } +message GetRegisteredResourceValuesByFQNsRequest { + // Required + repeated string fqns = 1 [ + (buf.validate.field).repeated = { + min_items: 1, + unique: true, + items: { + string: + { + min_len: 1, + uri: true + } + }, + } + ]; +} +message GetRegisteredResourceValuesByFQNsResponse { + map fqn_value_map = 1; +} + message ListRegisteredResourceValuesRequest { // Optional string resource_id = 1 [(buf.validate.field).cel = { @@ -248,6 +271,9 @@ service RegisteredResourcesService { rpc GetRegisteredResourceValue(GetRegisteredResourceValueRequest) returns (GetRegisteredResourceValueResponse) { } + rpc GetRegisteredResourceValuesByFQNs(GetRegisteredResourceValuesByFQNsRequest) returns (GetRegisteredResourceValuesByFQNsResponse) { + } + rpc ListRegisteredResourceValues(ListRegisteredResourceValuesRequest) returns (ListRegisteredResourceValuesResponse) { } diff --git a/service/policy/registeredresources/registered_resources_test.go b/service/policy/registeredresources/registered_resources_test.go index f7ae25a0fb..78eb3fd765 100644 --- a/service/policy/registeredresources/registered_resources_test.go +++ b/service/policy/registeredresources/registered_resources_test.go @@ -32,18 +32,22 @@ const ( validUUID = "00000000-0000-0000-0000-000000000000" validURI = "https://ndr-uri" + invalidName = "invalid name" invalidUUID = "not-uuid" invalidURI = "not-uri" - errMsgRequired = "required" - errMsgOneOfRequired = "oneof [required]" - errMsgUUID = "string.uuid" - errMsgOptionalUUID = "optional_uuid_format" - errMsgURI = "string.uri" - errMsgNameFormat = "rr_name_format" - errMsgValueFormat = "rr_value_format" - errMsgStringPattern = "string.pattern" - errMsgStringMaxLen = "string.max_len" + errMsgRequired = "required" + errMsgOneOfRequired = "oneof [required]" + errMsgUUID = "string.uuid" + errMsgOptionalUUID = "optional_uuid_format" + errMsgURI = "string.uri" + errMsgNameFormat = "rr_name_format" + errMsgValueFormat = "rr_value_format" + errMsgStringPattern = "string.pattern" + errMsgStringMinLen = "string.min_len" + errMsgStringMaxLen = "string.max_len" + errMsgRepeatedMinItems = "repeated.min_items" + errMsgRepeatedUnique = "repeated.unique" ) /// @@ -182,16 +186,16 @@ func (s *RegisteredResourcesSuite) TestGetRegisteredResource_Valid_Succeeds() { { name: "Identifier (UUID)", req: ®isteredresources.GetRegisteredResourceRequest{ - Identifier: ®isteredresources.GetRegisteredResourceRequest_ResourceId{ - ResourceId: validUUID, + Identifier: ®isteredresources.GetRegisteredResourceRequest_Id{ + Id: validUUID, }, }, }, { - name: "Identifier (FQN)", + name: "Identifier (Name)", req: ®isteredresources.GetRegisteredResourceRequest{ - Identifier: ®isteredresources.GetRegisteredResourceRequest_Fqn{ - Fqn: validURI, + Identifier: ®isteredresources.GetRegisteredResourceRequest_Name{ + Name: validName, }, }, }, @@ -220,20 +224,20 @@ func (s *RegisteredResourcesSuite) TestGetRegisteredResource_Invalid_Fails() { { name: "Invalid UUID", req: ®isteredresources.GetRegisteredResourceRequest{ - Identifier: ®isteredresources.GetRegisteredResourceRequest_ResourceId{ - ResourceId: invalidUUID, + Identifier: ®isteredresources.GetRegisteredResourceRequest_Id{ + Id: invalidUUID, }, }, errMsg: errMsgUUID, }, { - name: "Invalid FQN", + name: "Invalid Name", req: ®isteredresources.GetRegisteredResourceRequest{ - Identifier: ®isteredresources.GetRegisteredResourceRequest_Fqn{ - Fqn: invalidURI, + Identifier: ®isteredresources.GetRegisteredResourceRequest_Name{ + Name: invalidName, }, }, - errMsg: errMsgURI, + errMsg: errMsgNameFormat, }, } @@ -488,8 +492,8 @@ func (s *RegisteredResourcesSuite) TestGetRegisteredResourceValue_Valid_Succeeds { name: "Identifier (UUID)", req: ®isteredresources.GetRegisteredResourceValueRequest{ - Identifier: ®isteredresources.GetRegisteredResourceValueRequest_ValueId{ - ValueId: validUUID, + Identifier: ®isteredresources.GetRegisteredResourceValueRequest_Id{ + Id: validUUID, }, }, }, @@ -526,8 +530,8 @@ func (s *RegisteredResourcesSuite) TestGetRegisteredResourceValue_Invalid_Fails( { name: "Invalid UUID", req: ®isteredresources.GetRegisteredResourceValueRequest{ - Identifier: ®isteredresources.GetRegisteredResourceValueRequest_ValueId{ - ValueId: invalidUUID, + Identifier: ®isteredresources.GetRegisteredResourceValueRequest_Id{ + Id: invalidUUID, }, }, errMsg: errMsgUUID, @@ -553,6 +557,70 @@ func (s *RegisteredResourcesSuite) TestGetRegisteredResourceValue_Invalid_Fails( } } +// Get by FQNs + +func (s *RegisteredResourcesSuite) TestGetRegisteredResourceValuesByFQNs_Valid_Succeeds() { + req := ®isteredresources.GetRegisteredResourceValueRequest{ + Identifier: ®isteredresources.GetRegisteredResourceValueRequest_Fqn{ + Fqn: validURI, + }, + } + + err := s.v.Validate(req) + s.Require().NoError(err) +} + +func (s *RegisteredResourcesSuite) TestGetRegisteredResourceValuesByFQNs_Invalid_Fails() { + testCases := []struct { + name string + req *registeredresources.GetRegisteredResourceValuesByFQNsRequest + errMsg string + }{ + { + name: "Nil FQN list", + req: ®isteredresources.GetRegisteredResourceValuesByFQNsRequest{}, + errMsg: errMsgRepeatedMinItems, + }, + { + name: "Empty FQN list", + req: ®isteredresources.GetRegisteredResourceValuesByFQNsRequest{ + Fqns: []string{}, + }, + errMsg: errMsgRepeatedMinItems, + }, + { + name: "Empty String in FQN list", + req: ®isteredresources.GetRegisteredResourceValuesByFQNsRequest{ + Fqns: []string{""}, + }, + errMsg: errMsgStringMinLen, + }, + { + name: "Duplicates in FQN list", + req: ®isteredresources.GetRegisteredResourceValuesByFQNsRequest{ + Fqns: []string{validURI, validURI}, + }, + errMsg: errMsgRepeatedUnique, + }, + { + name: "Invalid FQN in FQN list", + req: ®isteredresources.GetRegisteredResourceValuesByFQNsRequest{ + Fqns: []string{invalidURI}, + }, + errMsg: errMsgURI, + }, + } + + for _, tc := range testCases { + s.Run(tc.name, func() { + err := s.v.Validate(tc.req) + + s.Require().Error(err) + s.Require().Contains(err.Error(), tc.errMsg) + }) + } +} + // List func (s *RegisteredResourcesSuite) TestListRegisteredResourceValues_Valid_Succeeds() {