diff --git a/apis/serviceconn/gateway_event/pb/gw_event.pb.go b/apis/serviceconn/gateway_event/pb/gw_event.pb.go index b8278ffe..d310a872 100644 --- a/apis/serviceconn/gateway_event/pb/gw_event.pb.go +++ b/apis/serviceconn/gateway_event/pb/gw_event.pb.go @@ -2022,8 +2022,11 @@ type ListEventsReq struct { Location string `protobuf:"bytes,9,opt,name=location,proto3" json:"location,omitempty"` // city / venue filter for in-person events ClientInfo *ClientInfo `protobuf:"bytes,10,opt,name=client_info,json=clientInfo,proto3" json:"client_info,omitempty"` GroupSlug string `protobuf:"bytes,11,opt,name=group_slug,json=groupSlug,proto3" json:"group_slug,omitempty"` // target community for GetGroupEvents - DateFilter string `protobuf:"bytes,12,opt,name=date_filter,json=dateFilter,proto3" json:"date_filter,omitempty"` // "this-week", "this-month", "all" + DateFilter string `protobuf:"bytes,12,opt,name=date_filter,json=dateFilter,proto3" json:"date_filter,omitempty"` // "upcoming", "past", "this-week", "this-month", "all" SortBy string `protobuf:"bytes,13,opt,name=sort_by,json=sortBy,proto3" json:"sort_by,omitempty"` // "soonest", "popular", "newest" + UserLat float64 `protobuf:"fixed64,14,opt,name=user_lat,json=userLat,proto3" json:"user_lat,omitempty"` // for distance calculations + UserLng float64 `protobuf:"fixed64,15,opt,name=user_lng,json=userLng,proto3" json:"user_lng,omitempty"` // for distance calculations + Radius int32 `protobuf:"varint,16,opt,name=radius,proto3" json:"radius,omitempty"` // search radius in km } func (x *ListEventsReq) Reset() { @@ -2149,6 +2152,27 @@ func (x *ListEventsReq) GetSortBy() string { return "" } +func (x *ListEventsReq) GetUserLat() float64 { + if x != nil { + return x.UserLat + } + return 0 +} + +func (x *ListEventsReq) GetUserLng() float64 { + if x != nil { + return x.UserLng + } + return 0 +} + +func (x *ListEventsReq) GetRadius() int32 { + if x != nil { + return x.Radius + } + return 0 +} + type ListEventsResp struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -4414,6 +4438,339 @@ func (x *AuthorizeResp) GetOwnsComment() bool { return false } +type CloneEventReq struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Slug string `protobuf:"bytes,1,opt,name=slug,proto3" json:"slug,omitempty"` + AccountId string `protobuf:"bytes,2,opt,name=account_id,json=accountId,proto3" json:"account_id,omitempty"` + StartTime *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=start_time,json=startTime,proto3" json:"start_time,omitempty"` + EndTime *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=end_time,json=endTime,proto3" json:"end_time,omitempty"` + ClientInfo *ClientInfo `protobuf:"bytes,5,opt,name=client_info,json=clientInfo,proto3" json:"client_info,omitempty"` +} + +func (x *CloneEventReq) Reset() { + *x = CloneEventReq{} + if protoimpl.UnsafeEnabled { + mi := &file_apis_serviceconn_gateway_event_pb_gw_event_proto_msgTypes[49] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CloneEventReq) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CloneEventReq) ProtoMessage() {} + +func (x *CloneEventReq) ProtoReflect() protoreflect.Message { + mi := &file_apis_serviceconn_gateway_event_pb_gw_event_proto_msgTypes[49] + 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 CloneEventReq.ProtoReflect.Descriptor instead. +func (*CloneEventReq) Descriptor() ([]byte, []int) { + return file_apis_serviceconn_gateway_event_pb_gw_event_proto_rawDescGZIP(), []int{49} +} + +func (x *CloneEventReq) GetSlug() string { + if x != nil { + return x.Slug + } + return "" +} + +func (x *CloneEventReq) GetAccountId() string { + if x != nil { + return x.AccountId + } + return "" +} + +func (x *CloneEventReq) GetStartTime() *timestamppb.Timestamp { + if x != nil { + return x.StartTime + } + return nil +} + +func (x *CloneEventReq) GetEndTime() *timestamppb.Timestamp { + if x != nil { + return x.EndTime + } + return nil +} + +func (x *CloneEventReq) GetClientInfo() *ClientInfo { + if x != nil { + return x.ClientInfo + } + return nil +} + +type Recurrence struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Freq string `protobuf:"bytes,1,opt,name=freq,proto3" json:"freq,omitempty"` // daily | weekly | monthly | yearly + Interval int32 `protobuf:"varint,2,opt,name=interval,proto3" json:"interval,omitempty"` // every N units; 0 means 1 + ByDay []string `protobuf:"bytes,3,rep,name=by_day,json=byDay,proto3" json:"by_day,omitempty"` // MO,TU,... for weekly + Count int32 `protobuf:"varint,4,opt,name=count,proto3" json:"count,omitempty"` // stop after N occurrences; 0 = unused + Until *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=until,proto3" json:"until,omitempty"` +} + +func (x *Recurrence) Reset() { + *x = Recurrence{} + if protoimpl.UnsafeEnabled { + mi := &file_apis_serviceconn_gateway_event_pb_gw_event_proto_msgTypes[50] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Recurrence) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Recurrence) ProtoMessage() {} + +func (x *Recurrence) ProtoReflect() protoreflect.Message { + mi := &file_apis_serviceconn_gateway_event_pb_gw_event_proto_msgTypes[50] + 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 Recurrence.ProtoReflect.Descriptor instead. +func (*Recurrence) Descriptor() ([]byte, []int) { + return file_apis_serviceconn_gateway_event_pb_gw_event_proto_rawDescGZIP(), []int{50} +} + +func (x *Recurrence) GetFreq() string { + if x != nil { + return x.Freq + } + return "" +} + +func (x *Recurrence) GetInterval() int32 { + if x != nil { + return x.Interval + } + return 0 +} + +func (x *Recurrence) GetByDay() []string { + if x != nil { + return x.ByDay + } + return nil +} + +func (x *Recurrence) GetCount() int32 { + if x != nil { + return x.Count + } + return 0 +} + +func (x *Recurrence) GetUntil() *timestamppb.Timestamp { + if x != nil { + return x.Until + } + return nil +} + +type CreateSeriesReq struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + AccountId string `protobuf:"bytes,1,opt,name=account_id,json=accountId,proto3" json:"account_id,omitempty"` + Title string `protobuf:"bytes,2,opt,name=title,proto3" json:"title,omitempty"` + Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` + StartTime *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=start_time,json=startTime,proto3" json:"start_time,omitempty"` + EndTime *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=end_time,json=endTime,proto3" json:"end_time,omitempty"` + Timezone string `protobuf:"bytes,6,opt,name=timezone,proto3" json:"timezone,omitempty"` + EventType string `protobuf:"bytes,7,opt,name=event_type,json=eventType,proto3" json:"event_type,omitempty"` + Location string `protobuf:"bytes,8,opt,name=location,proto3" json:"location,omitempty"` + MeetingLink string `protobuf:"bytes,9,opt,name=meeting_link,json=meetingLink,proto3" json:"meeting_link,omitempty"` + Capacity int32 `protobuf:"varint,10,opt,name=capacity,proto3" json:"capacity,omitempty"` + CoverImage string `protobuf:"bytes,11,opt,name=cover_image,json=coverImage,proto3" json:"cover_image,omitempty"` + Tags []string `protobuf:"bytes,12,rep,name=tags,proto3" json:"tags,omitempty"` + TicketTiers []*TicketTierInput `protobuf:"bytes,13,rep,name=ticket_tiers,json=ticketTiers,proto3" json:"ticket_tiers,omitempty"` + GroupSlug string `protobuf:"bytes,14,opt,name=group_slug,json=groupSlug,proto3" json:"group_slug,omitempty"` + Visibility string `protobuf:"bytes,15,opt,name=visibility,proto3" json:"visibility,omitempty"` + Recurrence *Recurrence `protobuf:"bytes,16,opt,name=recurrence,proto3" json:"recurrence,omitempty"` + ClientInfo *ClientInfo `protobuf:"bytes,17,opt,name=client_info,json=clientInfo,proto3" json:"client_info,omitempty"` +} + +func (x *CreateSeriesReq) Reset() { + *x = CreateSeriesReq{} + if protoimpl.UnsafeEnabled { + mi := &file_apis_serviceconn_gateway_event_pb_gw_event_proto_msgTypes[51] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateSeriesReq) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateSeriesReq) ProtoMessage() {} + +func (x *CreateSeriesReq) ProtoReflect() protoreflect.Message { + mi := &file_apis_serviceconn_gateway_event_pb_gw_event_proto_msgTypes[51] + 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 CreateSeriesReq.ProtoReflect.Descriptor instead. +func (*CreateSeriesReq) Descriptor() ([]byte, []int) { + return file_apis_serviceconn_gateway_event_pb_gw_event_proto_rawDescGZIP(), []int{51} +} + +func (x *CreateSeriesReq) GetAccountId() string { + if x != nil { + return x.AccountId + } + return "" +} + +func (x *CreateSeriesReq) GetTitle() string { + if x != nil { + return x.Title + } + return "" +} + +func (x *CreateSeriesReq) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *CreateSeriesReq) GetStartTime() *timestamppb.Timestamp { + if x != nil { + return x.StartTime + } + return nil +} + +func (x *CreateSeriesReq) GetEndTime() *timestamppb.Timestamp { + if x != nil { + return x.EndTime + } + return nil +} + +func (x *CreateSeriesReq) GetTimezone() string { + if x != nil { + return x.Timezone + } + return "" +} + +func (x *CreateSeriesReq) GetEventType() string { + if x != nil { + return x.EventType + } + return "" +} + +func (x *CreateSeriesReq) GetLocation() string { + if x != nil { + return x.Location + } + return "" +} + +func (x *CreateSeriesReq) GetMeetingLink() string { + if x != nil { + return x.MeetingLink + } + return "" +} + +func (x *CreateSeriesReq) GetCapacity() int32 { + if x != nil { + return x.Capacity + } + return 0 +} + +func (x *CreateSeriesReq) GetCoverImage() string { + if x != nil { + return x.CoverImage + } + return "" +} + +func (x *CreateSeriesReq) GetTags() []string { + if x != nil { + return x.Tags + } + return nil +} + +func (x *CreateSeriesReq) GetTicketTiers() []*TicketTierInput { + if x != nil { + return x.TicketTiers + } + return nil +} + +func (x *CreateSeriesReq) GetGroupSlug() string { + if x != nil { + return x.GroupSlug + } + return "" +} + +func (x *CreateSeriesReq) GetVisibility() string { + if x != nil { + return x.Visibility + } + return "" +} + +func (x *CreateSeriesReq) GetRecurrence() *Recurrence { + if x != nil { + return x.Recurrence + } + return nil +} + +func (x *CreateSeriesReq) GetClientInfo() *ClientInfo { + if x != nil { + return x.ClientInfo + } + return nil +} + var File_apis_serviceconn_gateway_event_pb_gw_event_proto protoreflect.FileDescriptor var file_apis_serviceconn_gateway_event_pb_gw_event_proto_rawDesc = []byte{ @@ -4808,7 +5165,7 @@ var file_apis_serviceconn_gateway_event_pb_gw_event_proto_rawDesc = []byte{ 0x72, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x2c, 0x0a, 0x12, 0x76, 0x69, 0x65, 0x77, 0x65, 0x72, 0x5f, 0x72, 0x73, 0x76, 0x70, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x76, 0x69, - 0x65, 0x77, 0x65, 0x72, 0x52, 0x73, 0x76, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x86, + 0x65, 0x77, 0x65, 0x72, 0x52, 0x73, 0x76, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0xd4, 0x03, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, @@ -4833,318 +5190,389 @@ var file_apis_serviceconn_gateway_event_pb_gw_event_proto_rawDesc = []byte{ 0x0b, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x61, 0x74, 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x6f, 0x72, 0x74, 0x5f, 0x62, 0x79, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x73, 0x6f, 0x72, 0x74, 0x42, 0x79, 0x22, 0x66, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x28, 0x0a, 0x06, 0x65, 0x76, 0x65, - 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x65, 0x76, 0x65, 0x6e, - 0x74, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, - 0x6e, 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, - 0x55, 0x0a, 0x09, 0x42, 0x61, 0x73, 0x69, 0x63, 0x52, 0x65, 0x73, 0x70, 0x12, 0x18, 0x0a, 0x07, - 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x18, 0x0a, 0x07, - 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, - 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0xbb, 0x01, 0x0a, 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x54, 0x69, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x1d, - 0x0a, 0x0a, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x6c, 0x75, 0x67, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x6c, 0x75, 0x67, 0x12, 0x1d, 0x0a, - 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x04, - 0x74, 0x69, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x65, 0x76, 0x65, - 0x6e, 0x74, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x54, 0x69, 0x65, - 0x72, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x52, 0x04, 0x74, 0x69, 0x65, 0x72, 0x12, 0x36, 0x0a, 0x0b, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x15, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x43, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x49, 0x6e, 0x66, 0x6f, 0x22, 0xd4, 0x01, 0x0a, 0x13, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, + 0x06, 0x73, 0x6f, 0x72, 0x74, 0x42, 0x79, 0x12, 0x19, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x5f, + 0x6c, 0x61, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x01, 0x52, 0x07, 0x75, 0x73, 0x65, 0x72, 0x4c, + 0x61, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6c, 0x6e, 0x67, 0x18, 0x0f, + 0x20, 0x01, 0x28, 0x01, 0x52, 0x07, 0x75, 0x73, 0x65, 0x72, 0x4c, 0x6e, 0x67, 0x12, 0x16, 0x0a, + 0x06, 0x72, 0x61, 0x64, 0x69, 0x75, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x72, + 0x61, 0x64, 0x69, 0x75, 0x73, 0x22, 0x66, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x28, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, + 0x73, 0x76, 0x63, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x73, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x55, 0x0a, + 0x09, 0x42, 0x61, 0x73, 0x69, 0x63, 0x52, 0x65, 0x73, 0x70, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x22, 0xbb, 0x01, 0x0a, 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x54, 0x69, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x6c, 0x75, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x6c, 0x75, 0x67, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x69, - 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x74, 0x69, 0x65, - 0x72, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x04, 0x74, 0x69, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x54, 0x69, - 0x63, 0x6b, 0x65, 0x74, 0x54, 0x69, 0x65, 0x72, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x52, 0x04, 0x74, - 0x69, 0x65, 0x72, 0x12, 0x36, 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, - 0x66, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, - 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x9e, 0x01, 0x0a, 0x0d, - 0x54, 0x69, 0x65, 0x72, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x12, 0x1d, 0x0a, + 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x04, 0x74, 0x69, + 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x54, 0x69, 0x65, 0x72, 0x49, + 0x6e, 0x70, 0x75, 0x74, 0x52, 0x04, 0x74, 0x69, 0x65, 0x72, 0x12, 0x36, 0x0a, 0x0b, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x15, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x43, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, + 0x66, 0x6f, 0x22, 0xd4, 0x01, 0x0a, 0x13, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x63, + 0x6b, 0x65, 0x74, 0x54, 0x69, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x6c, 0x75, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x6c, 0x75, 0x67, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x69, 0x65, 0x72, + 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x74, 0x69, 0x65, 0x72, 0x49, + 0x64, 0x12, 0x2e, 0x0a, 0x04, 0x74, 0x69, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x54, 0x69, 0x63, 0x6b, + 0x65, 0x74, 0x54, 0x69, 0x65, 0x72, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x52, 0x04, 0x74, 0x69, 0x65, + 0x72, 0x12, 0x36, 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, + 0x76, 0x63, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x9e, 0x01, 0x0a, 0x0d, 0x54, 0x69, + 0x65, 0x72, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x12, 0x1d, 0x0a, 0x0a, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x6c, 0x75, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x6c, 0x75, 0x67, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x69, 0x65, + 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x74, 0x69, 0x65, 0x72, + 0x49, 0x64, 0x12, 0x36, 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x66, + 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, + 0x73, 0x76, 0x63, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x6b, 0x0a, 0x0e, 0x54, 0x69, + 0x63, 0x6b, 0x65, 0x74, 0x54, 0x69, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x12, 0x18, 0x0a, 0x07, + 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x29, 0x0a, 0x04, 0x74, 0x69, 0x65, 0x72, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x76, 0x63, + 0x2e, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x54, 0x69, 0x65, 0x72, 0x52, 0x04, 0x74, 0x69, 0x65, + 0x72, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xd3, 0x02, 0x0a, 0x0f, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x43, 0x6f, 0x75, 0x70, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x12, 0x1d, 0x0a, 0x0a, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x6c, 0x75, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x6c, 0x75, 0x67, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x29, 0x0a, + 0x10, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, + 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x5f, + 0x75, 0x73, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x6d, 0x61, 0x78, 0x55, + 0x73, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x5f, 0x66, 0x72, 0x6f, + 0x6d, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x52, 0x09, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x12, 0x35, + 0x0a, 0x08, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x5f, 0x74, 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x76, 0x61, + 0x6c, 0x69, 0x64, 0x54, 0x6f, 0x12, 0x36, 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, + 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0xa4, 0x01, + 0x0a, 0x0f, 0x43, 0x6f, 0x75, 0x70, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x6c, 0x75, 0x67, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x6c, 0x75, 0x67, + 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, + 0x1b, 0x0a, 0x09, 0x63, 0x6f, 0x75, 0x70, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x08, 0x63, 0x6f, 0x75, 0x70, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x36, 0x0a, 0x0b, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x15, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x43, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x86, 0x01, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x75, + 0x70, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x5f, 0x73, 0x6c, 0x75, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x53, 0x6c, 0x75, 0x67, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x36, 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, + 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x54, 0x0a, + 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x75, 0x70, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x12, 0x2b, 0x0a, 0x07, 0x63, 0x6f, 0x75, 0x70, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x11, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x43, 0x6f, + 0x75, 0x70, 0x6f, 0x6e, 0x52, 0x07, 0x63, 0x6f, 0x75, 0x70, 0x6f, 0x6e, 0x73, 0x12, 0x14, 0x0a, + 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x22, 0xa4, 0x01, 0x0a, 0x11, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, + 0x43, 0x6f, 0x75, 0x70, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x5f, 0x73, 0x6c, 0x75, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x53, 0x6c, 0x75, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x24, 0x0a, 0x0e, + 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x74, 0x69, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x54, 0x69, 0x65, 0x72, + 0x49, 0x64, 0x12, 0x36, 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x66, + 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, + 0x73, 0x76, 0x63, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x94, 0x01, 0x0a, 0x0a, 0x43, + 0x6f, 0x75, 0x70, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x12, 0x29, 0x0a, 0x06, 0x63, 0x6f, 0x75, 0x70, 0x6f, 0x6e, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x76, 0x63, 0x2e, + 0x43, 0x6f, 0x75, 0x70, 0x6f, 0x6e, 0x52, 0x06, 0x63, 0x6f, 0x75, 0x70, 0x6f, 0x6e, 0x12, 0x14, + 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x12, 0x2b, 0x0a, 0x11, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x65, 0x64, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, + 0x10, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x64, 0x41, 0x6d, 0x6f, 0x75, 0x6e, + 0x74, 0x22, 0x98, 0x02, 0x0a, 0x07, 0x52, 0x53, 0x56, 0x50, 0x52, 0x65, 0x71, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x6c, 0x75, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x6c, 0x75, 0x67, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x74, - 0x69, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x74, 0x69, - 0x65, 0x72, 0x49, 0x64, 0x12, 0x36, 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, - 0x6e, 0x66, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x65, 0x76, 0x65, 0x6e, - 0x74, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x6b, 0x0a, 0x0e, - 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x54, 0x69, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x12, 0x18, - 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x29, 0x0a, 0x04, 0x74, 0x69, 0x65, 0x72, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, - 0x76, 0x63, 0x2e, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x54, 0x69, 0x65, 0x72, 0x52, 0x04, 0x74, - 0x69, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xd3, 0x02, 0x0a, 0x0f, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x75, 0x70, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x12, 0x1d, 0x0a, + 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0e, 0x74, + 0x69, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x74, 0x69, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x0c, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x54, 0x69, 0x65, 0x72, 0x49, + 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6f, 0x75, 0x70, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x64, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x75, 0x70, 0x6f, 0x6e, 0x43, 0x6f, + 0x64, 0x65, 0x12, 0x36, 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x66, + 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, + 0x73, 0x76, 0x63, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1f, 0x0a, 0x0b, 0x67, 0x75, + 0x65, 0x73, 0x74, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x0a, 0x67, 0x75, 0x65, 0x73, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x07, 0x61, + 0x6e, 0x73, 0x77, 0x65, 0x72, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x52, 0x53, 0x56, 0x50, 0x41, 0x6e, 0x73, + 0x77, 0x65, 0x72, 0x52, 0x07, 0x61, 0x6e, 0x73, 0x77, 0x65, 0x72, 0x73, 0x22, 0xdf, 0x01, 0x0a, + 0x08, 0x52, 0x53, 0x56, 0x50, 0x52, 0x65, 0x73, 0x70, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x70, + 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x72, + 0x64, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x5f, + 0x64, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x09, 0x61, 0x6d, 0x6f, 0x75, 0x6e, + 0x74, 0x44, 0x75, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, + 0x12, 0x26, 0x0a, 0x0f, 0x72, 0x61, 0x7a, 0x6f, 0x72, 0x70, 0x61, 0x79, 0x5f, 0x6b, 0x65, 0x79, + 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x72, 0x61, 0x7a, 0x6f, 0x72, + 0x70, 0x61, 0x79, 0x4b, 0x65, 0x79, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x85, + 0x01, 0x0a, 0x0d, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x52, 0x53, 0x56, 0x50, 0x52, 0x65, 0x71, + 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x6c, 0x75, 0x67, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x6c, 0x75, 0x67, 0x12, + 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x36, + 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x76, 0x63, 0x2e, + 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x4c, 0x0a, 0x11, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, + 0x74, 0x57, 0x65, 0x62, 0x68, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x71, 0x12, 0x1c, 0x0a, 0x09, 0x73, + 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x72, 0x61, 0x77, + 0x5f, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x72, 0x61, 0x77, + 0x42, 0x6f, 0x64, 0x79, 0x22, 0xce, 0x01, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x74, 0x74, + 0x65, 0x6e, 0x64, 0x65, 0x65, 0x73, 0x52, 0x65, 0x71, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x5f, 0x73, 0x6c, 0x75, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x53, 0x6c, 0x75, 0x67, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x16, 0x0a, + 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6f, + 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x36, 0x0a, + 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x43, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x72, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x74, 0x74, + 0x65, 0x6e, 0x64, 0x65, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x31, 0x0a, 0x09, 0x61, 0x74, + 0x74, 0x65, 0x6e, 0x64, 0x65, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x41, 0x74, 0x74, 0x65, 0x6e, 0x64, + 0x65, 0x65, 0x52, 0x09, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x65, 0x73, 0x12, 0x14, 0x0a, + 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x74, 0x6f, + 0x74, 0x61, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xf8, 0x01, 0x0a, 0x13, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x41, 0x74, 0x74, 0x65, 0x6e, 0x64, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x65, + 0x71, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x6c, 0x75, 0x67, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x6c, 0x75, 0x67, + 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, + 0x1f, 0x0a, 0x0b, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x65, 0x49, 0x64, + 0x12, 0x2b, 0x0a, 0x11, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x64, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x61, 0x74, 0x74, + 0x65, 0x6e, 0x64, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1d, 0x0a, + 0x0a, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x69, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x09, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x49, 0x6e, 0x12, 0x36, 0x0a, 0x0b, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x15, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x43, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x84, 0x01, 0x0a, 0x0c, 0x53, 0x61, 0x76, 0x65, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, + 0x6c, 0x75, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x53, 0x6c, 0x75, 0x67, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x49, 0x64, 0x12, 0x36, 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, + 0x66, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0xa8, 0x01, 0x0a, 0x0d, + 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x6c, 0x75, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x6c, 0x75, 0x67, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x63, - 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, - 0x29, 0x0a, 0x10, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x63, - 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0f, 0x64, 0x69, 0x73, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x61, - 0x78, 0x5f, 0x75, 0x73, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x6d, 0x61, - 0x78, 0x55, 0x73, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x5f, 0x66, - 0x72, 0x6f, 0x6d, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x46, 0x72, 0x6f, 0x6d, - 0x12, 0x35, 0x0a, 0x08, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x5f, 0x74, 0x6f, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, - 0x76, 0x61, 0x6c, 0x69, 0x64, 0x54, 0x6f, 0x12, 0x36, 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x65, - 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x22, - 0xa4, 0x01, 0x0a, 0x0f, 0x43, 0x6f, 0x75, 0x70, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x71, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x6c, 0x75, - 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x6c, - 0x75, 0x67, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, - 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x6f, 0x75, 0x70, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x63, 0x6f, 0x75, 0x70, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x36, + 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x63, + 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x54, 0x65, 0x78, 0x74, 0x12, 0x36, 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x86, 0x01, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x43, - 0x6f, 0x75, 0x70, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x76, 0x65, - 0x6e, 0x74, 0x5f, 0x73, 0x6c, 0x75, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, - 0x76, 0x65, 0x6e, 0x74, 0x53, 0x6c, 0x75, 0x67, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x36, 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x65, - 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x22, - 0x54, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x75, 0x70, 0x6f, 0x6e, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x12, 0x2b, 0x0a, 0x07, 0x63, 0x6f, 0x75, 0x70, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x76, 0x63, 0x2e, - 0x43, 0x6f, 0x75, 0x70, 0x6f, 0x6e, 0x52, 0x07, 0x63, 0x6f, 0x75, 0x70, 0x6f, 0x6e, 0x73, 0x12, - 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa4, 0x01, 0x0a, 0x11, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x65, 0x43, 0x6f, 0x75, 0x70, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x12, 0x1d, 0x0a, 0x0a, 0x65, + 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x70, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, + 0x31, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x17, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x65, + 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x5e, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, + 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x6c, 0x75, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x6c, 0x75, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, - 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x24, - 0x0a, 0x0e, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x74, 0x69, 0x65, 0x72, 0x5f, 0x69, 0x64, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x54, 0x69, - 0x65, 0x72, 0x49, 0x64, 0x12, 0x36, 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, - 0x6e, 0x66, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x65, 0x76, 0x65, 0x6e, - 0x74, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x94, 0x01, 0x0a, - 0x0a, 0x43, 0x6f, 0x75, 0x70, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x12, 0x18, 0x0a, 0x07, 0x6d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x29, 0x0a, 0x06, 0x63, 0x6f, 0x75, 0x70, 0x6f, 0x6e, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x76, - 0x63, 0x2e, 0x43, 0x6f, 0x75, 0x70, 0x6f, 0x6e, 0x52, 0x06, 0x63, 0x6f, 0x75, 0x70, 0x6f, 0x6e, - 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x2b, 0x0a, 0x11, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x01, 0x52, 0x10, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x64, 0x41, 0x6d, 0x6f, - 0x75, 0x6e, 0x74, 0x22, 0x98, 0x02, 0x0a, 0x07, 0x52, 0x53, 0x56, 0x50, 0x52, 0x65, 0x71, 0x12, - 0x1d, 0x0a, 0x0a, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x6c, 0x75, 0x67, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x6c, 0x75, 0x67, 0x12, 0x1d, - 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x24, 0x0a, - 0x0e, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x74, 0x69, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x54, 0x69, 0x65, - 0x72, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6f, 0x75, 0x70, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, - 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x75, 0x70, 0x6f, 0x6e, - 0x43, 0x6f, 0x64, 0x65, 0x12, 0x36, 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, - 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x65, 0x76, 0x65, 0x6e, - 0x74, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1f, 0x0a, 0x0b, - 0x67, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x0a, 0x67, 0x75, 0x65, 0x73, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2f, 0x0a, - 0x07, 0x61, 0x6e, 0x73, 0x77, 0x65, 0x72, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, - 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x52, 0x53, 0x56, 0x50, 0x41, - 0x6e, 0x73, 0x77, 0x65, 0x72, 0x52, 0x07, 0x61, 0x6e, 0x73, 0x77, 0x65, 0x72, 0x73, 0x22, 0xdf, - 0x01, 0x0a, 0x08, 0x52, 0x53, 0x56, 0x50, 0x52, 0x65, 0x73, 0x70, 0x12, 0x18, 0x0a, 0x07, 0x6d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x28, 0x0a, - 0x10, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x69, - 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, - 0x4f, 0x72, 0x64, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x6d, 0x6f, 0x75, 0x6e, - 0x74, 0x5f, 0x64, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x09, 0x61, 0x6d, 0x6f, - 0x75, 0x6e, 0x74, 0x44, 0x75, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, - 0x63, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, - 0x63, 0x79, 0x12, 0x26, 0x0a, 0x0f, 0x72, 0x61, 0x7a, 0x6f, 0x72, 0x70, 0x61, 0x79, 0x5f, 0x6b, - 0x65, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x72, 0x61, 0x7a, - 0x6f, 0x72, 0x70, 0x61, 0x79, 0x4b, 0x65, 0x79, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x22, 0x85, 0x01, 0x0a, 0x0d, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x52, 0x53, 0x56, 0x50, 0x52, + 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x6c, 0x75, 0x67, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x22, 0x73, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, + 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x33, 0x0a, 0x08, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, + 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa7, 0x01, + 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x6c, 0x75, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x6c, 0x75, 0x67, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, - 0x12, 0x36, 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x76, - 0x63, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x4c, 0x0a, 0x11, 0x50, 0x61, 0x79, 0x6d, - 0x65, 0x6e, 0x74, 0x57, 0x65, 0x62, 0x68, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x71, 0x12, 0x1c, 0x0a, - 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x72, - 0x61, 0x77, 0x5f, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x72, - 0x61, 0x77, 0x42, 0x6f, 0x64, 0x79, 0x22, 0xce, 0x01, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x41, - 0x74, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x65, 0x73, 0x52, 0x65, 0x71, 0x12, 0x1d, 0x0a, 0x0a, 0x65, - 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x6c, 0x75, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x6c, 0x75, 0x67, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, - 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, - 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, - 0x36, 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x06, + 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, + 0x36, 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x72, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x41, - 0x74, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x31, 0x0a, 0x09, - 0x61, 0x74, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x13, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x41, 0x74, 0x74, 0x65, - 0x6e, 0x64, 0x65, 0x65, 0x52, 0x09, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x65, 0x73, 0x12, - 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, - 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xf8, 0x01, 0x0a, 0x13, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x74, 0x74, 0x65, 0x6e, 0x64, 0x61, 0x6e, 0x63, 0x65, - 0x52, 0x65, 0x71, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x6c, 0x75, - 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x6c, - 0x75, 0x67, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, - 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x65, 0x5f, 0x69, 0x64, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x65, - 0x49, 0x64, 0x12, 0x2b, 0x0a, 0x11, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x64, 0x61, 0x6e, 0x63, 0x65, - 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x61, - 0x74, 0x74, 0x65, 0x6e, 0x64, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, - 0x1d, 0x0a, 0x0a, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x69, 0x6e, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x09, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x49, 0x6e, 0x12, 0x36, - 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x76, 0x63, 0x2e, - 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x84, 0x01, 0x0a, 0x0c, 0x53, 0x61, 0x76, 0x65, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x76, 0x65, 0x6e, 0x74, - 0x5f, 0x73, 0x6c, 0x75, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x76, 0x65, - 0x6e, 0x74, 0x53, 0x6c, 0x75, 0x67, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x36, 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, - 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x65, 0x76, 0x65, - 0x6e, 0x74, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0xa8, 0x01, - 0x0a, 0x0d, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x12, - 0x1d, 0x0a, 0x0a, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x6c, 0x75, 0x67, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x6c, 0x75, 0x67, 0x12, 0x1d, - 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x21, 0x0a, - 0x0c, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x54, 0x65, 0x78, 0x74, - 0x12, 0x36, 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x76, - 0x63, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x70, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x12, 0x31, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6d, - 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x5e, 0x0a, 0x0f, 0x4c, 0x69, - 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x12, 0x1d, 0x0a, - 0x0a, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x6c, 0x75, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x6c, 0x75, 0x67, 0x12, 0x14, 0x0a, 0x05, - 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x69, 0x6d, - 0x69, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x22, 0x73, 0x0a, 0x10, 0x4c, 0x69, - 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x33, - 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x17, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, - 0xa7, 0x01, 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0xa5, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x61, 0x63, 0x74, 0x52, 0x65, 0x71, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x6c, 0x75, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x6c, 0x75, 0x67, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x49, - 0x64, 0x12, 0x36, 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, - 0x76, 0x63, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0xa5, 0x01, 0x0a, 0x08, 0x52, 0x65, - 0x61, 0x63, 0x74, 0x52, 0x65, 0x71, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, - 0x73, 0x6c, 0x75, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x76, 0x65, 0x6e, - 0x74, 0x53, 0x6c, 0x75, 0x67, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x36, 0x0a, 0x0b, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, - 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, - 0x6f, 0x22, 0x9e, 0x01, 0x0a, 0x0e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x71, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x6c, - 0x75, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x53, - 0x6c, 0x75, 0x67, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x36, 0x0a, 0x0b, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x15, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x43, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, - 0x66, 0x6f, 0x22, 0xaa, 0x01, 0x0a, 0x09, 0x43, 0x6f, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, - 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x6c, 0x75, 0x67, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x6c, 0x75, 0x67, 0x12, - 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x27, - 0x0a, 0x0f, 0x63, 0x6f, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x68, 0x6f, 0x73, 0x74, 0x55, - 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x36, 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, + 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x36, 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x22, - 0x4b, 0x0a, 0x0b, 0x43, 0x61, 0x6c, 0x65, 0x6e, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x12, 0x1d, + 0x9e, 0x01, 0x0a, 0x0e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x71, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x6c, 0x75, 0x67, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x6c, 0x75, + 0x67, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, + 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x36, 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, + 0x22, 0xaa, 0x01, 0x0a, 0x09, 0x43, 0x6f, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x6c, 0x75, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x6c, 0x75, 0x67, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x22, 0x3f, 0x0a, 0x0c, - 0x43, 0x61, 0x6c, 0x65, 0x6e, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x12, 0x19, 0x0a, 0x08, - 0x69, 0x63, 0x73, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, - 0x69, 0x63, 0x73, 0x44, 0x61, 0x74, 0x61, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x6b, 0x0a, - 0x0c, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x71, 0x12, 0x1d, 0x0a, - 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, - 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x6c, 0x75, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x6c, 0x75, 0x67, 0x12, 0x1d, 0x0a, 0x0a, 0x63, - 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x09, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22, 0xcf, 0x01, 0x0a, 0x0d, 0x41, - 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x21, 0x0a, 0x0c, - 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0b, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x12, - 0x21, 0x0a, 0x0c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x65, 0x72, - 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x73, 0x5f, 0x61, - 0x74, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x69, - 0x73, 0x41, 0x74, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x6f, 0x77, 0x6e, - 0x73, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0b, 0x6f, 0x77, 0x6e, 0x73, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x32, 0xf9, 0x11, 0x0a, + 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x27, 0x0a, 0x0f, + 0x63, 0x6f, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x68, 0x6f, 0x73, 0x74, 0x55, 0x73, 0x65, + 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x36, 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, + 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x4b, 0x0a, + 0x0b, 0x43, 0x61, 0x6c, 0x65, 0x6e, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x12, 0x1d, 0x0a, 0x0a, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x6c, 0x75, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x6c, 0x75, 0x67, 0x12, 0x1d, 0x0a, 0x0a, 0x61, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x22, 0x3f, 0x0a, 0x0c, 0x43, 0x61, + 0x6c, 0x65, 0x6e, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x12, 0x19, 0x0a, 0x08, 0x69, 0x63, + 0x73, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x69, 0x63, + 0x73, 0x44, 0x61, 0x74, 0x61, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x6b, 0x0a, 0x0c, 0x41, + 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x71, 0x12, 0x1d, 0x0a, 0x0a, 0x61, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x6c, 0x75, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x6c, 0x75, 0x67, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, + 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22, 0xcf, 0x01, 0x0a, 0x0d, 0x41, 0x75, 0x74, + 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x21, 0x0a, 0x0c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x5f, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0b, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x12, 0x21, 0x0a, + 0x0c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x12, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x72, 0x6f, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x65, 0x72, 0x6d, 0x69, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x73, 0x5f, 0x61, 0x74, 0x74, + 0x65, 0x6e, 0x64, 0x65, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x69, 0x73, 0x41, + 0x74, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x6f, 0x77, 0x6e, 0x73, 0x5f, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x6f, + 0x77, 0x6e, 0x73, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0xec, 0x01, 0x0a, 0x0d, 0x43, + 0x6c, 0x6f, 0x6e, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, + 0x73, 0x6c, 0x75, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x6c, 0x75, 0x67, + 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, + 0x39, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, + 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x65, 0x6e, + 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, + 0x65, 0x12, 0x36, 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, + 0x76, 0x63, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x9b, 0x01, 0x0a, 0x0a, 0x52, 0x65, + 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x72, 0x65, 0x71, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x66, 0x72, 0x65, 0x71, 0x12, 0x1a, 0x0a, 0x08, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x79, 0x5f, 0x64, + 0x61, 0x79, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x62, 0x79, 0x44, 0x61, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x05, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x52, 0x05, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x22, 0x92, 0x05, 0x0a, 0x0f, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x12, 0x1d, 0x0a, 0x0a, 0x61, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x35, 0x0a, + 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x65, 0x6e, 0x64, + 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x69, 0x6d, 0x65, 0x7a, 0x6f, 0x6e, 0x65, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x69, 0x6d, 0x65, 0x7a, 0x6f, 0x6e, 0x65, + 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, + 0x1a, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x6d, + 0x65, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x6c, 0x69, 0x6e, 0x6b, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x6d, 0x65, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x4c, 0x69, 0x6e, 0x6b, 0x12, 0x1a, + 0x0a, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6f, + 0x76, 0x65, 0x72, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, + 0x61, 0x67, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, + 0x3d, 0x0a, 0x0c, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x74, 0x69, 0x65, 0x72, 0x73, 0x18, + 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x76, + 0x63, 0x2e, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x54, 0x69, 0x65, 0x72, 0x49, 0x6e, 0x70, 0x75, + 0x74, 0x52, 0x0b, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x54, 0x69, 0x65, 0x72, 0x73, 0x12, 0x1d, + 0x0a, 0x0a, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x6c, 0x75, 0x67, 0x18, 0x0e, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x6c, 0x75, 0x67, 0x12, 0x1e, 0x0a, + 0x0a, 0x76, 0x69, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x0f, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x76, 0x69, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x35, 0x0a, + 0x0a, 0x72, 0x65, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x15, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x52, 0x65, + 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x0a, 0x72, 0x65, 0x63, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x12, 0x36, 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, + 0x6e, 0x66, 0x6f, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x32, 0xc4, 0x13, 0x0a, 0x0c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x3e, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x19, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, @@ -5288,10 +5716,23 @@ var file_apis_serviceconn_gateway_event_pb_gw_event_proto_rawDesc = []byte{ 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x12, 0x17, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x18, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x6f, - 0x72, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x73, 0x70, 0x42, 0x25, 0x5a, 0x23, 0x2e, 0x2f, 0x61, 0x70, - 0x69, 0x73, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x2f, 0x67, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2f, 0x70, 0x62, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x72, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x3c, 0x0a, 0x0a, 0x43, 0x6c, 0x6f, 0x6e, + 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x18, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, + 0x76, 0x63, 0x2e, 0x43, 0x6c, 0x6f, 0x6e, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, + 0x1a, 0x14, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x40, 0x0a, 0x0c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, + 0x76, 0x63, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, + 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x49, 0x0a, 0x16, 0x43, 0x61, 0x6e, 0x63, + 0x65, 0x6c, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x4f, 0x63, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x12, 0x19, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x42, 0x61, 0x73, 0x69, 0x63, 0x52, + 0x65, 0x73, 0x70, 0x42, 0x25, 0x5a, 0x23, 0x2e, 0x2f, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x73, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x2f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x33, } var ( @@ -5306,7 +5747,7 @@ func file_apis_serviceconn_gateway_event_pb_gw_event_proto_rawDescGZIP() []byte return file_apis_serviceconn_gateway_event_pb_gw_event_proto_rawDescData } -var file_apis_serviceconn_gateway_event_pb_gw_event_proto_msgTypes = make([]protoimpl.MessageInfo, 49) +var file_apis_serviceconn_gateway_event_pb_gw_event_proto_msgTypes = make([]protoimpl.MessageInfo, 52) var file_apis_serviceconn_gateway_event_pb_gw_event_proto_goTypes = []interface{}{ (*ClientInfo)(nil), // 0: event_svc.ClientInfo (*Event)(nil), // 1: event_svc.Event @@ -5357,144 +5798,162 @@ var file_apis_serviceconn_gateway_event_pb_gw_event_proto_goTypes = []interface{ (*CalendarResp)(nil), // 46: event_svc.CalendarResp (*AuthorizeReq)(nil), // 47: event_svc.AuthorizeReq (*AuthorizeResp)(nil), // 48: event_svc.AuthorizeResp - (*timestamppb.Timestamp)(nil), // 49: google.protobuf.Timestamp + (*CloneEventReq)(nil), // 49: event_svc.CloneEventReq + (*Recurrence)(nil), // 50: event_svc.Recurrence + (*CreateSeriesReq)(nil), // 51: event_svc.CreateSeriesReq + (*timestamppb.Timestamp)(nil), // 52: google.protobuf.Timestamp } var file_apis_serviceconn_gateway_event_pb_gw_event_proto_depIdxs = []int32{ - 49, // 0: event_svc.Event.start_time:type_name -> google.protobuf.Timestamp - 49, // 1: event_svc.Event.end_time:type_name -> google.protobuf.Timestamp - 49, // 2: event_svc.Event.created_at:type_name -> google.protobuf.Timestamp - 49, // 3: event_svc.Event.updated_at:type_name -> google.protobuf.Timestamp - 3, // 4: event_svc.Event.ticket_tiers:type_name -> event_svc.TicketTier - 2, // 5: event_svc.Event.reactions:type_name -> event_svc.ReactionCount - 49, // 6: event_svc.Event.rsvp_opens_at:type_name -> google.protobuf.Timestamp - 49, // 7: event_svc.Event.rsvp_closes_at:type_name -> google.protobuf.Timestamp - 8, // 8: event_svc.Event.venue:type_name -> event_svc.Venue - 49, // 9: event_svc.Event.series_occurrence_at:type_name -> google.protobuf.Timestamp - 9, // 10: event_svc.Event.questions:type_name -> event_svc.EventQuestion - 49, // 11: event_svc.Coupon.valid_from:type_name -> google.protobuf.Timestamp - 49, // 12: event_svc.Coupon.valid_to:type_name -> google.protobuf.Timestamp - 49, // 13: event_svc.Attendee.created_at:type_name -> google.protobuf.Timestamp - 49, // 14: event_svc.Attendee.checked_in_at:type_name -> google.protobuf.Timestamp - 49, // 15: event_svc.EventComment.created_at:type_name -> google.protobuf.Timestamp - 49, // 16: event_svc.CreateEventReq.start_time:type_name -> google.protobuf.Timestamp - 49, // 17: event_svc.CreateEventReq.end_time:type_name -> google.protobuf.Timestamp - 4, // 18: event_svc.CreateEventReq.ticket_tiers:type_name -> event_svc.TicketTierInput - 0, // 19: event_svc.CreateEventReq.client_info:type_name -> event_svc.ClientInfo - 49, // 20: event_svc.CreateEventReq.rsvp_opens_at:type_name -> google.protobuf.Timestamp - 49, // 21: event_svc.CreateEventReq.rsvp_closes_at:type_name -> google.protobuf.Timestamp - 9, // 22: event_svc.CreateEventReq.questions:type_name -> event_svc.EventQuestion - 49, // 23: event_svc.UpdateEventReq.start_time:type_name -> google.protobuf.Timestamp - 49, // 24: event_svc.UpdateEventReq.end_time:type_name -> google.protobuf.Timestamp - 0, // 25: event_svc.UpdateEventReq.client_info:type_name -> event_svc.ClientInfo - 49, // 26: event_svc.UpdateEventReq.rsvp_opens_at:type_name -> google.protobuf.Timestamp - 49, // 27: event_svc.UpdateEventReq.rsvp_closes_at:type_name -> google.protobuf.Timestamp - 9, // 28: event_svc.UpdateEventReq.questions:type_name -> event_svc.EventQuestion - 0, // 29: event_svc.EventActionReq.client_info:type_name -> event_svc.ClientInfo - 0, // 30: event_svc.GetEventReq.client_info:type_name -> event_svc.ClientInfo - 1, // 31: event_svc.EventResp.event:type_name -> event_svc.Event - 0, // 32: event_svc.ListEventsReq.client_info:type_name -> event_svc.ClientInfo - 1, // 33: event_svc.ListEventsResp.events:type_name -> event_svc.Event - 4, // 34: event_svc.CreateTicketTierReq.tier:type_name -> event_svc.TicketTierInput - 0, // 35: event_svc.CreateTicketTierReq.client_info:type_name -> event_svc.ClientInfo - 4, // 36: event_svc.UpdateTicketTierReq.tier:type_name -> event_svc.TicketTierInput - 0, // 37: event_svc.UpdateTicketTierReq.client_info:type_name -> event_svc.ClientInfo - 0, // 38: event_svc.TierActionReq.client_info:type_name -> event_svc.ClientInfo - 3, // 39: event_svc.TicketTierResp.tier:type_name -> event_svc.TicketTier - 49, // 40: event_svc.CreateCouponReq.valid_from:type_name -> google.protobuf.Timestamp - 49, // 41: event_svc.CreateCouponReq.valid_to:type_name -> google.protobuf.Timestamp - 0, // 42: event_svc.CreateCouponReq.client_info:type_name -> event_svc.ClientInfo - 0, // 43: event_svc.CouponActionReq.client_info:type_name -> event_svc.ClientInfo - 0, // 44: event_svc.ListCouponsReq.client_info:type_name -> event_svc.ClientInfo - 5, // 45: event_svc.ListCouponsResp.coupons:type_name -> event_svc.Coupon - 0, // 46: event_svc.ValidateCouponReq.client_info:type_name -> event_svc.ClientInfo - 5, // 47: event_svc.CouponResp.coupon:type_name -> event_svc.Coupon - 0, // 48: event_svc.RSVPReq.client_info:type_name -> event_svc.ClientInfo - 10, // 49: event_svc.RSVPReq.answers:type_name -> event_svc.RSVPAnswer - 0, // 50: event_svc.CancelRSVPReq.client_info:type_name -> event_svc.ClientInfo - 0, // 51: event_svc.ListAttendeesReq.client_info:type_name -> event_svc.ClientInfo - 6, // 52: event_svc.ListAttendeesResp.attendees:type_name -> event_svc.Attendee - 0, // 53: event_svc.UpdateAttendanceReq.client_info:type_name -> event_svc.ClientInfo - 0, // 54: event_svc.SaveEventReq.client_info:type_name -> event_svc.ClientInfo - 0, // 55: event_svc.AddCommentReq.client_info:type_name -> event_svc.ClientInfo - 7, // 56: event_svc.CommentResp.comment:type_name -> event_svc.EventComment - 7, // 57: event_svc.ListCommentsResp.comments:type_name -> event_svc.EventComment - 0, // 58: event_svc.DeleteCommentReq.client_info:type_name -> event_svc.ClientInfo - 0, // 59: event_svc.ReactReq.client_info:type_name -> event_svc.ClientInfo - 0, // 60: event_svc.ReportEventReq.client_info:type_name -> event_svc.ClientInfo - 0, // 61: event_svc.CoHostReq.client_info:type_name -> event_svc.ClientInfo - 11, // 62: event_svc.EventService.CreateEvent:input_type -> event_svc.CreateEventReq - 12, // 63: event_svc.EventService.UpdateEvent:input_type -> event_svc.UpdateEventReq - 13, // 64: event_svc.EventService.DeleteEvent:input_type -> event_svc.EventActionReq - 13, // 65: event_svc.EventService.PublishEvent:input_type -> event_svc.EventActionReq - 13, // 66: event_svc.EventService.CancelEvent:input_type -> event_svc.EventActionReq - 14, // 67: event_svc.EventService.GetEvent:input_type -> event_svc.GetEventReq - 16, // 68: event_svc.EventService.ListEvents:input_type -> event_svc.ListEventsReq - 16, // 69: event_svc.EventService.GetUserEvents:input_type -> event_svc.ListEventsReq - 16, // 70: event_svc.EventService.GetUserAttendingEvents:input_type -> event_svc.ListEventsReq - 16, // 71: event_svc.EventService.GetGroupEvents:input_type -> event_svc.ListEventsReq - 19, // 72: event_svc.EventService.CreateTicketTier:input_type -> event_svc.CreateTicketTierReq - 20, // 73: event_svc.EventService.UpdateTicketTier:input_type -> event_svc.UpdateTicketTierReq - 21, // 74: event_svc.EventService.DeleteTicketTier:input_type -> event_svc.TierActionReq - 23, // 75: event_svc.EventService.CreateCoupon:input_type -> event_svc.CreateCouponReq - 25, // 76: event_svc.EventService.ListCoupons:input_type -> event_svc.ListCouponsReq - 24, // 77: event_svc.EventService.DeleteCoupon:input_type -> event_svc.CouponActionReq - 27, // 78: event_svc.EventService.ValidateCoupon:input_type -> event_svc.ValidateCouponReq - 29, // 79: event_svc.EventService.RSVPEvent:input_type -> event_svc.RSVPReq - 31, // 80: event_svc.EventService.CancelRSVP:input_type -> event_svc.CancelRSVPReq - 32, // 81: event_svc.EventService.ProcessPaymentWebhook:input_type -> event_svc.PaymentWebhookReq - 33, // 82: event_svc.EventService.GetAttendees:input_type -> event_svc.ListAttendeesReq - 35, // 83: event_svc.EventService.UpdateAttendance:input_type -> event_svc.UpdateAttendanceReq - 36, // 84: event_svc.EventService.SaveEvent:input_type -> event_svc.SaveEventReq - 36, // 85: event_svc.EventService.UnsaveEvent:input_type -> event_svc.SaveEventReq - 37, // 86: event_svc.EventService.AddEventComment:input_type -> event_svc.AddCommentReq - 39, // 87: event_svc.EventService.ListEventComments:input_type -> event_svc.ListCommentsReq - 41, // 88: event_svc.EventService.DeleteEventComment:input_type -> event_svc.DeleteCommentReq - 42, // 89: event_svc.EventService.ReactToEvent:input_type -> event_svc.ReactReq - 42, // 90: event_svc.EventService.RemoveReaction:input_type -> event_svc.ReactReq - 43, // 91: event_svc.EventService.ReportEvent:input_type -> event_svc.ReportEventReq - 44, // 92: event_svc.EventService.AddCoHost:input_type -> event_svc.CoHostReq - 44, // 93: event_svc.EventService.RemoveCoHost:input_type -> event_svc.CoHostReq - 45, // 94: event_svc.EventService.GetCalendarFile:input_type -> event_svc.CalendarReq - 47, // 95: event_svc.EventService.Authorize:input_type -> event_svc.AuthorizeReq - 15, // 96: event_svc.EventService.CreateEvent:output_type -> event_svc.EventResp - 15, // 97: event_svc.EventService.UpdateEvent:output_type -> event_svc.EventResp - 18, // 98: event_svc.EventService.DeleteEvent:output_type -> event_svc.BasicResp - 15, // 99: event_svc.EventService.PublishEvent:output_type -> event_svc.EventResp - 15, // 100: event_svc.EventService.CancelEvent:output_type -> event_svc.EventResp - 15, // 101: event_svc.EventService.GetEvent:output_type -> event_svc.EventResp - 17, // 102: event_svc.EventService.ListEvents:output_type -> event_svc.ListEventsResp - 17, // 103: event_svc.EventService.GetUserEvents:output_type -> event_svc.ListEventsResp - 17, // 104: event_svc.EventService.GetUserAttendingEvents:output_type -> event_svc.ListEventsResp - 17, // 105: event_svc.EventService.GetGroupEvents:output_type -> event_svc.ListEventsResp - 22, // 106: event_svc.EventService.CreateTicketTier:output_type -> event_svc.TicketTierResp - 22, // 107: event_svc.EventService.UpdateTicketTier:output_type -> event_svc.TicketTierResp - 18, // 108: event_svc.EventService.DeleteTicketTier:output_type -> event_svc.BasicResp - 28, // 109: event_svc.EventService.CreateCoupon:output_type -> event_svc.CouponResp - 26, // 110: event_svc.EventService.ListCoupons:output_type -> event_svc.ListCouponsResp - 18, // 111: event_svc.EventService.DeleteCoupon:output_type -> event_svc.BasicResp - 28, // 112: event_svc.EventService.ValidateCoupon:output_type -> event_svc.CouponResp - 30, // 113: event_svc.EventService.RSVPEvent:output_type -> event_svc.RSVPResp - 18, // 114: event_svc.EventService.CancelRSVP:output_type -> event_svc.BasicResp - 18, // 115: event_svc.EventService.ProcessPaymentWebhook:output_type -> event_svc.BasicResp - 34, // 116: event_svc.EventService.GetAttendees:output_type -> event_svc.ListAttendeesResp - 18, // 117: event_svc.EventService.UpdateAttendance:output_type -> event_svc.BasicResp - 18, // 118: event_svc.EventService.SaveEvent:output_type -> event_svc.BasicResp - 18, // 119: event_svc.EventService.UnsaveEvent:output_type -> event_svc.BasicResp - 38, // 120: event_svc.EventService.AddEventComment:output_type -> event_svc.CommentResp - 40, // 121: event_svc.EventService.ListEventComments:output_type -> event_svc.ListCommentsResp - 18, // 122: event_svc.EventService.DeleteEventComment:output_type -> event_svc.BasicResp - 18, // 123: event_svc.EventService.ReactToEvent:output_type -> event_svc.BasicResp - 18, // 124: event_svc.EventService.RemoveReaction:output_type -> event_svc.BasicResp - 18, // 125: event_svc.EventService.ReportEvent:output_type -> event_svc.BasicResp - 18, // 126: event_svc.EventService.AddCoHost:output_type -> event_svc.BasicResp - 18, // 127: event_svc.EventService.RemoveCoHost:output_type -> event_svc.BasicResp - 46, // 128: event_svc.EventService.GetCalendarFile:output_type -> event_svc.CalendarResp - 48, // 129: event_svc.EventService.Authorize:output_type -> event_svc.AuthorizeResp - 96, // [96:130] is the sub-list for method output_type - 62, // [62:96] is the sub-list for method input_type - 62, // [62:62] is the sub-list for extension type_name - 62, // [62:62] is the sub-list for extension extendee - 0, // [0:62] is the sub-list for field type_name + 52, // 0: event_svc.Event.start_time:type_name -> google.protobuf.Timestamp + 52, // 1: event_svc.Event.end_time:type_name -> google.protobuf.Timestamp + 52, // 2: event_svc.Event.created_at:type_name -> google.protobuf.Timestamp + 52, // 3: event_svc.Event.updated_at:type_name -> google.protobuf.Timestamp + 3, // 4: event_svc.Event.ticket_tiers:type_name -> event_svc.TicketTier + 2, // 5: event_svc.Event.reactions:type_name -> event_svc.ReactionCount + 52, // 6: event_svc.Event.rsvp_opens_at:type_name -> google.protobuf.Timestamp + 52, // 7: event_svc.Event.rsvp_closes_at:type_name -> google.protobuf.Timestamp + 8, // 8: event_svc.Event.venue:type_name -> event_svc.Venue + 52, // 9: event_svc.Event.series_occurrence_at:type_name -> google.protobuf.Timestamp + 9, // 10: event_svc.Event.questions:type_name -> event_svc.EventQuestion + 52, // 11: event_svc.Coupon.valid_from:type_name -> google.protobuf.Timestamp + 52, // 12: event_svc.Coupon.valid_to:type_name -> google.protobuf.Timestamp + 52, // 13: event_svc.Attendee.created_at:type_name -> google.protobuf.Timestamp + 52, // 14: event_svc.Attendee.checked_in_at:type_name -> google.protobuf.Timestamp + 52, // 15: event_svc.EventComment.created_at:type_name -> google.protobuf.Timestamp + 52, // 16: event_svc.CreateEventReq.start_time:type_name -> google.protobuf.Timestamp + 52, // 17: event_svc.CreateEventReq.end_time:type_name -> google.protobuf.Timestamp + 4, // 18: event_svc.CreateEventReq.ticket_tiers:type_name -> event_svc.TicketTierInput + 0, // 19: event_svc.CreateEventReq.client_info:type_name -> event_svc.ClientInfo + 52, // 20: event_svc.CreateEventReq.rsvp_opens_at:type_name -> google.protobuf.Timestamp + 52, // 21: event_svc.CreateEventReq.rsvp_closes_at:type_name -> google.protobuf.Timestamp + 9, // 22: event_svc.CreateEventReq.questions:type_name -> event_svc.EventQuestion + 52, // 23: event_svc.UpdateEventReq.start_time:type_name -> google.protobuf.Timestamp + 52, // 24: event_svc.UpdateEventReq.end_time:type_name -> google.protobuf.Timestamp + 0, // 25: event_svc.UpdateEventReq.client_info:type_name -> event_svc.ClientInfo + 52, // 26: event_svc.UpdateEventReq.rsvp_opens_at:type_name -> google.protobuf.Timestamp + 52, // 27: event_svc.UpdateEventReq.rsvp_closes_at:type_name -> google.protobuf.Timestamp + 9, // 28: event_svc.UpdateEventReq.questions:type_name -> event_svc.EventQuestion + 0, // 29: event_svc.EventActionReq.client_info:type_name -> event_svc.ClientInfo + 0, // 30: event_svc.GetEventReq.client_info:type_name -> event_svc.ClientInfo + 1, // 31: event_svc.EventResp.event:type_name -> event_svc.Event + 0, // 32: event_svc.ListEventsReq.client_info:type_name -> event_svc.ClientInfo + 1, // 33: event_svc.ListEventsResp.events:type_name -> event_svc.Event + 4, // 34: event_svc.CreateTicketTierReq.tier:type_name -> event_svc.TicketTierInput + 0, // 35: event_svc.CreateTicketTierReq.client_info:type_name -> event_svc.ClientInfo + 4, // 36: event_svc.UpdateTicketTierReq.tier:type_name -> event_svc.TicketTierInput + 0, // 37: event_svc.UpdateTicketTierReq.client_info:type_name -> event_svc.ClientInfo + 0, // 38: event_svc.TierActionReq.client_info:type_name -> event_svc.ClientInfo + 3, // 39: event_svc.TicketTierResp.tier:type_name -> event_svc.TicketTier + 52, // 40: event_svc.CreateCouponReq.valid_from:type_name -> google.protobuf.Timestamp + 52, // 41: event_svc.CreateCouponReq.valid_to:type_name -> google.protobuf.Timestamp + 0, // 42: event_svc.CreateCouponReq.client_info:type_name -> event_svc.ClientInfo + 0, // 43: event_svc.CouponActionReq.client_info:type_name -> event_svc.ClientInfo + 0, // 44: event_svc.ListCouponsReq.client_info:type_name -> event_svc.ClientInfo + 5, // 45: event_svc.ListCouponsResp.coupons:type_name -> event_svc.Coupon + 0, // 46: event_svc.ValidateCouponReq.client_info:type_name -> event_svc.ClientInfo + 5, // 47: event_svc.CouponResp.coupon:type_name -> event_svc.Coupon + 0, // 48: event_svc.RSVPReq.client_info:type_name -> event_svc.ClientInfo + 10, // 49: event_svc.RSVPReq.answers:type_name -> event_svc.RSVPAnswer + 0, // 50: event_svc.CancelRSVPReq.client_info:type_name -> event_svc.ClientInfo + 0, // 51: event_svc.ListAttendeesReq.client_info:type_name -> event_svc.ClientInfo + 6, // 52: event_svc.ListAttendeesResp.attendees:type_name -> event_svc.Attendee + 0, // 53: event_svc.UpdateAttendanceReq.client_info:type_name -> event_svc.ClientInfo + 0, // 54: event_svc.SaveEventReq.client_info:type_name -> event_svc.ClientInfo + 0, // 55: event_svc.AddCommentReq.client_info:type_name -> event_svc.ClientInfo + 7, // 56: event_svc.CommentResp.comment:type_name -> event_svc.EventComment + 7, // 57: event_svc.ListCommentsResp.comments:type_name -> event_svc.EventComment + 0, // 58: event_svc.DeleteCommentReq.client_info:type_name -> event_svc.ClientInfo + 0, // 59: event_svc.ReactReq.client_info:type_name -> event_svc.ClientInfo + 0, // 60: event_svc.ReportEventReq.client_info:type_name -> event_svc.ClientInfo + 0, // 61: event_svc.CoHostReq.client_info:type_name -> event_svc.ClientInfo + 52, // 62: event_svc.CloneEventReq.start_time:type_name -> google.protobuf.Timestamp + 52, // 63: event_svc.CloneEventReq.end_time:type_name -> google.protobuf.Timestamp + 0, // 64: event_svc.CloneEventReq.client_info:type_name -> event_svc.ClientInfo + 52, // 65: event_svc.Recurrence.until:type_name -> google.protobuf.Timestamp + 52, // 66: event_svc.CreateSeriesReq.start_time:type_name -> google.protobuf.Timestamp + 52, // 67: event_svc.CreateSeriesReq.end_time:type_name -> google.protobuf.Timestamp + 4, // 68: event_svc.CreateSeriesReq.ticket_tiers:type_name -> event_svc.TicketTierInput + 50, // 69: event_svc.CreateSeriesReq.recurrence:type_name -> event_svc.Recurrence + 0, // 70: event_svc.CreateSeriesReq.client_info:type_name -> event_svc.ClientInfo + 11, // 71: event_svc.EventService.CreateEvent:input_type -> event_svc.CreateEventReq + 12, // 72: event_svc.EventService.UpdateEvent:input_type -> event_svc.UpdateEventReq + 13, // 73: event_svc.EventService.DeleteEvent:input_type -> event_svc.EventActionReq + 13, // 74: event_svc.EventService.PublishEvent:input_type -> event_svc.EventActionReq + 13, // 75: event_svc.EventService.CancelEvent:input_type -> event_svc.EventActionReq + 14, // 76: event_svc.EventService.GetEvent:input_type -> event_svc.GetEventReq + 16, // 77: event_svc.EventService.ListEvents:input_type -> event_svc.ListEventsReq + 16, // 78: event_svc.EventService.GetUserEvents:input_type -> event_svc.ListEventsReq + 16, // 79: event_svc.EventService.GetUserAttendingEvents:input_type -> event_svc.ListEventsReq + 16, // 80: event_svc.EventService.GetGroupEvents:input_type -> event_svc.ListEventsReq + 19, // 81: event_svc.EventService.CreateTicketTier:input_type -> event_svc.CreateTicketTierReq + 20, // 82: event_svc.EventService.UpdateTicketTier:input_type -> event_svc.UpdateTicketTierReq + 21, // 83: event_svc.EventService.DeleteTicketTier:input_type -> event_svc.TierActionReq + 23, // 84: event_svc.EventService.CreateCoupon:input_type -> event_svc.CreateCouponReq + 25, // 85: event_svc.EventService.ListCoupons:input_type -> event_svc.ListCouponsReq + 24, // 86: event_svc.EventService.DeleteCoupon:input_type -> event_svc.CouponActionReq + 27, // 87: event_svc.EventService.ValidateCoupon:input_type -> event_svc.ValidateCouponReq + 29, // 88: event_svc.EventService.RSVPEvent:input_type -> event_svc.RSVPReq + 31, // 89: event_svc.EventService.CancelRSVP:input_type -> event_svc.CancelRSVPReq + 32, // 90: event_svc.EventService.ProcessPaymentWebhook:input_type -> event_svc.PaymentWebhookReq + 33, // 91: event_svc.EventService.GetAttendees:input_type -> event_svc.ListAttendeesReq + 35, // 92: event_svc.EventService.UpdateAttendance:input_type -> event_svc.UpdateAttendanceReq + 36, // 93: event_svc.EventService.SaveEvent:input_type -> event_svc.SaveEventReq + 36, // 94: event_svc.EventService.UnsaveEvent:input_type -> event_svc.SaveEventReq + 37, // 95: event_svc.EventService.AddEventComment:input_type -> event_svc.AddCommentReq + 39, // 96: event_svc.EventService.ListEventComments:input_type -> event_svc.ListCommentsReq + 41, // 97: event_svc.EventService.DeleteEventComment:input_type -> event_svc.DeleteCommentReq + 42, // 98: event_svc.EventService.ReactToEvent:input_type -> event_svc.ReactReq + 42, // 99: event_svc.EventService.RemoveReaction:input_type -> event_svc.ReactReq + 43, // 100: event_svc.EventService.ReportEvent:input_type -> event_svc.ReportEventReq + 44, // 101: event_svc.EventService.AddCoHost:input_type -> event_svc.CoHostReq + 44, // 102: event_svc.EventService.RemoveCoHost:input_type -> event_svc.CoHostReq + 45, // 103: event_svc.EventService.GetCalendarFile:input_type -> event_svc.CalendarReq + 47, // 104: event_svc.EventService.Authorize:input_type -> event_svc.AuthorizeReq + 49, // 105: event_svc.EventService.CloneEvent:input_type -> event_svc.CloneEventReq + 51, // 106: event_svc.EventService.CreateSeries:input_type -> event_svc.CreateSeriesReq + 13, // 107: event_svc.EventService.CancelSeriesOccurrence:input_type -> event_svc.EventActionReq + 15, // 108: event_svc.EventService.CreateEvent:output_type -> event_svc.EventResp + 15, // 109: event_svc.EventService.UpdateEvent:output_type -> event_svc.EventResp + 18, // 110: event_svc.EventService.DeleteEvent:output_type -> event_svc.BasicResp + 15, // 111: event_svc.EventService.PublishEvent:output_type -> event_svc.EventResp + 15, // 112: event_svc.EventService.CancelEvent:output_type -> event_svc.EventResp + 15, // 113: event_svc.EventService.GetEvent:output_type -> event_svc.EventResp + 17, // 114: event_svc.EventService.ListEvents:output_type -> event_svc.ListEventsResp + 17, // 115: event_svc.EventService.GetUserEvents:output_type -> event_svc.ListEventsResp + 17, // 116: event_svc.EventService.GetUserAttendingEvents:output_type -> event_svc.ListEventsResp + 17, // 117: event_svc.EventService.GetGroupEvents:output_type -> event_svc.ListEventsResp + 22, // 118: event_svc.EventService.CreateTicketTier:output_type -> event_svc.TicketTierResp + 22, // 119: event_svc.EventService.UpdateTicketTier:output_type -> event_svc.TicketTierResp + 18, // 120: event_svc.EventService.DeleteTicketTier:output_type -> event_svc.BasicResp + 28, // 121: event_svc.EventService.CreateCoupon:output_type -> event_svc.CouponResp + 26, // 122: event_svc.EventService.ListCoupons:output_type -> event_svc.ListCouponsResp + 18, // 123: event_svc.EventService.DeleteCoupon:output_type -> event_svc.BasicResp + 28, // 124: event_svc.EventService.ValidateCoupon:output_type -> event_svc.CouponResp + 30, // 125: event_svc.EventService.RSVPEvent:output_type -> event_svc.RSVPResp + 18, // 126: event_svc.EventService.CancelRSVP:output_type -> event_svc.BasicResp + 18, // 127: event_svc.EventService.ProcessPaymentWebhook:output_type -> event_svc.BasicResp + 34, // 128: event_svc.EventService.GetAttendees:output_type -> event_svc.ListAttendeesResp + 18, // 129: event_svc.EventService.UpdateAttendance:output_type -> event_svc.BasicResp + 18, // 130: event_svc.EventService.SaveEvent:output_type -> event_svc.BasicResp + 18, // 131: event_svc.EventService.UnsaveEvent:output_type -> event_svc.BasicResp + 38, // 132: event_svc.EventService.AddEventComment:output_type -> event_svc.CommentResp + 40, // 133: event_svc.EventService.ListEventComments:output_type -> event_svc.ListCommentsResp + 18, // 134: event_svc.EventService.DeleteEventComment:output_type -> event_svc.BasicResp + 18, // 135: event_svc.EventService.ReactToEvent:output_type -> event_svc.BasicResp + 18, // 136: event_svc.EventService.RemoveReaction:output_type -> event_svc.BasicResp + 18, // 137: event_svc.EventService.ReportEvent:output_type -> event_svc.BasicResp + 18, // 138: event_svc.EventService.AddCoHost:output_type -> event_svc.BasicResp + 18, // 139: event_svc.EventService.RemoveCoHost:output_type -> event_svc.BasicResp + 46, // 140: event_svc.EventService.GetCalendarFile:output_type -> event_svc.CalendarResp + 48, // 141: event_svc.EventService.Authorize:output_type -> event_svc.AuthorizeResp + 15, // 142: event_svc.EventService.CloneEvent:output_type -> event_svc.EventResp + 15, // 143: event_svc.EventService.CreateSeries:output_type -> event_svc.EventResp + 18, // 144: event_svc.EventService.CancelSeriesOccurrence:output_type -> event_svc.BasicResp + 108, // [108:145] is the sub-list for method output_type + 71, // [71:108] is the sub-list for method input_type + 71, // [71:71] is the sub-list for extension type_name + 71, // [71:71] is the sub-list for extension extendee + 0, // [0:71] is the sub-list for field type_name } func init() { file_apis_serviceconn_gateway_event_pb_gw_event_proto_init() } @@ -6091,6 +6550,42 @@ func file_apis_serviceconn_gateway_event_pb_gw_event_proto_init() { return nil } } + file_apis_serviceconn_gateway_event_pb_gw_event_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CloneEventReq); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_apis_serviceconn_gateway_event_pb_gw_event_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Recurrence); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_apis_serviceconn_gateway_event_pb_gw_event_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateSeriesReq); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } type x struct{} out := protoimpl.TypeBuilder{ @@ -6098,7 +6593,7 @@ func file_apis_serviceconn_gateway_event_pb_gw_event_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_apis_serviceconn_gateway_event_pb_gw_event_proto_rawDesc, NumEnums: 0, - NumMessages: 49, + NumMessages: 52, NumExtensions: 0, NumServices: 1, }, diff --git a/apis/serviceconn/gateway_event/pb/gw_event.proto b/apis/serviceconn/gateway_event/pb/gw_event.proto index 09fced46..0d9114e1 100644 --- a/apis/serviceconn/gateway_event/pb/gw_event.proto +++ b/apis/serviceconn/gateway_event/pb/gw_event.proto @@ -272,8 +272,11 @@ message ListEventsReq { string location = 9; // city / venue filter for in-person events ClientInfo client_info = 10; string group_slug = 11; // target community for GetGroupEvents - string date_filter = 12; // "this-week", "this-month", "all" + string date_filter = 12; // "upcoming", "past", "this-week", "this-month", "all" string sort_by = 13; // "soonest", "popular", "newest" + double user_lat = 14; // for distance calculations + double user_lng = 15; // for distance calculations + int32 radius = 16; // search radius in km } message ListEventsResp { @@ -531,6 +534,42 @@ message AuthorizeResp { bool owns_comment = 6; // set only when comment_id was supplied } +message CloneEventReq { + string slug = 1; + string account_id = 2; + google.protobuf.Timestamp start_time = 3; + google.protobuf.Timestamp end_time = 4; + ClientInfo client_info = 5; +} + +message Recurrence { + string freq = 1; // daily | weekly | monthly | yearly + int32 interval = 2; // every N units; 0 means 1 + repeated string by_day = 3; // MO,TU,... for weekly + int32 count = 4; // stop after N occurrences; 0 = unused + google.protobuf.Timestamp until = 5; +} + +message CreateSeriesReq { + string account_id = 1; + string title = 2; + string description = 3; + google.protobuf.Timestamp start_time = 4; + google.protobuf.Timestamp end_time = 5; + string timezone = 6; + string event_type = 7; + string location = 8; + string meeting_link = 9; + int32 capacity = 10; + string cover_image = 11; + repeated string tags = 12; + repeated TicketTierInput ticket_tiers = 13; + string group_slug = 14; + string visibility = 15; + Recurrence recurrence = 16; + ClientInfo client_info = 17; +} + // ----------------------------------------------------------------------------- // Service Definition // ----------------------------------------------------------------------------- @@ -589,4 +628,11 @@ service EventService { // Authorization rpc Authorize(AuthorizeReq) returns (AuthorizeResp); + + // Clone a past event into a new draft (new slug, new times). + rpc CloneEvent(CloneEventReq) returns (EventResp); + + // Recurring series. Occurrences are normal events linked by series_id. + rpc CreateSeries(CreateSeriesReq) returns (EventResp); + rpc CancelSeriesOccurrence(EventActionReq) returns (BasicResp); } diff --git a/apis/serviceconn/gateway_event/pb/gw_event_grpc.pb.go b/apis/serviceconn/gateway_event/pb/gw_event_grpc.pb.go index c01ae475..9f3960a1 100644 --- a/apis/serviceconn/gateway_event/pb/gw_event_grpc.pb.go +++ b/apis/serviceconn/gateway_event/pb/gw_event_grpc.pb.go @@ -53,6 +53,9 @@ const ( EventService_RemoveCoHost_FullMethodName = "/event_svc.EventService/RemoveCoHost" EventService_GetCalendarFile_FullMethodName = "/event_svc.EventService/GetCalendarFile" EventService_Authorize_FullMethodName = "/event_svc.EventService/Authorize" + EventService_CloneEvent_FullMethodName = "/event_svc.EventService/CloneEvent" + EventService_CreateSeries_FullMethodName = "/event_svc.EventService/CreateSeries" + EventService_CancelSeriesOccurrence_FullMethodName = "/event_svc.EventService/CancelSeriesOccurrence" ) // EventServiceClient is the client API for EventService service. @@ -103,6 +106,11 @@ type EventServiceClient interface { GetCalendarFile(ctx context.Context, in *CalendarReq, opts ...grpc.CallOption) (*CalendarResp, error) // Authorization Authorize(ctx context.Context, in *AuthorizeReq, opts ...grpc.CallOption) (*AuthorizeResp, error) + // Clone a past event into a new draft (new slug, new times). + CloneEvent(ctx context.Context, in *CloneEventReq, opts ...grpc.CallOption) (*EventResp, error) + // Recurring series. Occurrences are normal events linked by series_id. + CreateSeries(ctx context.Context, in *CreateSeriesReq, opts ...grpc.CallOption) (*EventResp, error) + CancelSeriesOccurrence(ctx context.Context, in *EventActionReq, opts ...grpc.CallOption) (*BasicResp, error) } type eventServiceClient struct { @@ -453,6 +461,36 @@ func (c *eventServiceClient) Authorize(ctx context.Context, in *AuthorizeReq, op return out, nil } +func (c *eventServiceClient) CloneEvent(ctx context.Context, in *CloneEventReq, opts ...grpc.CallOption) (*EventResp, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(EventResp) + err := c.cc.Invoke(ctx, EventService_CloneEvent_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *eventServiceClient) CreateSeries(ctx context.Context, in *CreateSeriesReq, opts ...grpc.CallOption) (*EventResp, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(EventResp) + err := c.cc.Invoke(ctx, EventService_CreateSeries_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *eventServiceClient) CancelSeriesOccurrence(ctx context.Context, in *EventActionReq, opts ...grpc.CallOption) (*BasicResp, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(BasicResp) + err := c.cc.Invoke(ctx, EventService_CancelSeriesOccurrence_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + // EventServiceServer is the server API for EventService service. // All implementations must embed UnimplementedEventServiceServer // for forward compatibility. @@ -501,6 +539,11 @@ type EventServiceServer interface { GetCalendarFile(context.Context, *CalendarReq) (*CalendarResp, error) // Authorization Authorize(context.Context, *AuthorizeReq) (*AuthorizeResp, error) + // Clone a past event into a new draft (new slug, new times). + CloneEvent(context.Context, *CloneEventReq) (*EventResp, error) + // Recurring series. Occurrences are normal events linked by series_id. + CreateSeries(context.Context, *CreateSeriesReq) (*EventResp, error) + CancelSeriesOccurrence(context.Context, *EventActionReq) (*BasicResp, error) mustEmbedUnimplementedEventServiceServer() } @@ -613,6 +656,15 @@ func (UnimplementedEventServiceServer) GetCalendarFile(context.Context, *Calenda func (UnimplementedEventServiceServer) Authorize(context.Context, *AuthorizeReq) (*AuthorizeResp, error) { return nil, status.Error(codes.Unimplemented, "method Authorize not implemented") } +func (UnimplementedEventServiceServer) CloneEvent(context.Context, *CloneEventReq) (*EventResp, error) { + return nil, status.Error(codes.Unimplemented, "method CloneEvent not implemented") +} +func (UnimplementedEventServiceServer) CreateSeries(context.Context, *CreateSeriesReq) (*EventResp, error) { + return nil, status.Error(codes.Unimplemented, "method CreateSeries not implemented") +} +func (UnimplementedEventServiceServer) CancelSeriesOccurrence(context.Context, *EventActionReq) (*BasicResp, error) { + return nil, status.Error(codes.Unimplemented, "method CancelSeriesOccurrence not implemented") +} func (UnimplementedEventServiceServer) mustEmbedUnimplementedEventServiceServer() {} func (UnimplementedEventServiceServer) testEmbeddedByValue() {} @@ -1246,6 +1298,60 @@ func _EventService_Authorize_Handler(srv interface{}, ctx context.Context, dec f return interceptor(ctx, in, info, handler) } +func _EventService_CloneEvent_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CloneEventReq) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(EventServiceServer).CloneEvent(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: EventService_CloneEvent_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(EventServiceServer).CloneEvent(ctx, req.(*CloneEventReq)) + } + return interceptor(ctx, in, info, handler) +} + +func _EventService_CreateSeries_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CreateSeriesReq) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(EventServiceServer).CreateSeries(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: EventService_CreateSeries_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(EventServiceServer).CreateSeries(ctx, req.(*CreateSeriesReq)) + } + return interceptor(ctx, in, info, handler) +} + +func _EventService_CancelSeriesOccurrence_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(EventActionReq) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(EventServiceServer).CancelSeriesOccurrence(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: EventService_CancelSeriesOccurrence_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(EventServiceServer).CancelSeriesOccurrence(ctx, req.(*EventActionReq)) + } + return interceptor(ctx, in, info, handler) +} + // EventService_ServiceDesc is the grpc.ServiceDesc for EventService service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -1389,6 +1495,18 @@ var EventService_ServiceDesc = grpc.ServiceDesc{ MethodName: "Authorize", Handler: _EventService_Authorize_Handler, }, + { + MethodName: "CloneEvent", + Handler: _EventService_CloneEvent_Handler, + }, + { + MethodName: "CreateSeries", + Handler: _EventService_CreateSeries_Handler, + }, + { + MethodName: "CancelSeriesOccurrence", + Handler: _EventService_CancelSeriesOccurrence_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "apis/serviceconn/gateway_event/pb/gw_event.proto", diff --git a/apis/serviceconn/gateway_group/pb/gw_group.pb.go b/apis/serviceconn/gateway_group/pb/gw_group.pb.go index cd8cf0fa..268ca6b5 100644 --- a/apis/serviceconn/gateway_group/pb/gw_group.pb.go +++ b/apis/serviceconn/gateway_group/pb/gw_group.pb.go @@ -1080,6 +1080,10 @@ type ListGroupsReq struct { AccountId string `protobuf:"bytes,9,opt,name=account_id,json=accountId,proto3" json:"account_id,omitempty"` // viewer / owner depending on the RPC Username string `protobuf:"bytes,10,opt,name=username,proto3" json:"username,omitempty"` // target user for "groups I organize/belong to" ClientInfo *ClientInfo `protobuf:"bytes,11,opt,name=client_info,json=clientInfo,proto3" json:"client_info,omitempty"` + UserLat float64 `protobuf:"fixed64,12,opt,name=user_lat,json=userLat,proto3" json:"user_lat,omitempty"` + UserLng float64 `protobuf:"fixed64,13,opt,name=user_lng,json=userLng,proto3" json:"user_lng,omitempty"` + Radius int32 `protobuf:"varint,14,opt,name=radius,proto3" json:"radius,omitempty"` // search radius in km + PublicOnly bool `protobuf:"varint,15,opt,name=public_only,json=publicOnly,proto3" json:"public_only,omitempty"` // profile: published public groups only } func (x *ListGroupsReq) Reset() { @@ -1191,6 +1195,34 @@ func (x *ListGroupsReq) GetClientInfo() *ClientInfo { return nil } +func (x *ListGroupsReq) GetUserLat() float64 { + if x != nil { + return x.UserLat + } + return 0 +} + +func (x *ListGroupsReq) GetUserLng() float64 { + if x != nil { + return x.UserLng + } + return 0 +} + +func (x *ListGroupsReq) GetRadius() int32 { + if x != nil { + return x.Radius + } + return 0 +} + +func (x *ListGroupsReq) GetPublicOnly() bool { + if x != nil { + return x.PublicOnly + } + return false +} + type ListGroupsResp struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2977,7 +3009,7 @@ var file_apis_serviceconn_gateway_group_pb_gw_group_proto_rawDesc = []byte{ 0x75, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xbc, 0x02, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xab, 0x03, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x71, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, @@ -2997,337 +3029,344 @@ var file_apis_serviceconn_gateway_group_pb_gw_group_proto_rawDesc = []byte{ 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x66, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x28, 0x0a, 0x06, 0x67, 0x72, 0x6f, 0x75, - 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, - 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x06, 0x67, 0x72, 0x6f, 0x75, - 0x70, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x55, - 0x0a, 0x09, 0x42, 0x61, 0x73, 0x69, 0x63, 0x52, 0x65, 0x73, 0x70, 0x12, 0x18, 0x0a, 0x07, 0x6d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x73, - 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, - 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x9c, 0x01, 0x0a, 0x0c, 0x4a, 0x6f, 0x69, 0x6e, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x6c, 0x75, 0x67, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x6c, 0x75, 0x67, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x6e, 0x73, - 0x77, 0x65, 0x72, 0x73, 0x5f, 0x6a, 0x73, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x61, 0x6e, 0x73, 0x77, 0x65, 0x72, 0x73, 0x4a, 0x73, 0x6f, 0x6e, 0x12, 0x36, 0x0a, 0x0b, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x15, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x43, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x49, 0x6e, 0x66, 0x6f, 0x22, 0xda, 0x01, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, - 0x73, 0x6c, 0x75, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x6c, 0x75, 0x67, - 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, - 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, - 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x12, 0x0a, - 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x6f, 0x6c, - 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x36, 0x0a, 0x0b, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, - 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, - 0x6f, 0x22, 0x74, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, - 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x30, 0x0a, 0x07, 0x6d, 0x65, 0x6d, - 0x62, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x72, 0x6f, - 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, - 0x65, 0x72, 0x52, 0x07, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x74, - 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, - 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xd5, 0x01, 0x0a, 0x13, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x12, - 0x12, 0x0a, 0x04, 0x73, 0x6c, 0x75, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, - 0x6c, 0x75, 0x67, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x49, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x75, 0x73, 0x65, - 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x72, - 0x6f, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x12, - 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x36, 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x67, - 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x22, - 0xa5, 0x01, 0x0a, 0x0f, 0x4a, 0x6f, 0x69, 0x6e, 0x44, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x6c, 0x75, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x73, 0x6c, 0x75, 0x67, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x5f, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x36, 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, - 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0xb6, 0x01, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x4d, - 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x6c, 0x75, 0x67, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x6c, 0x75, 0x67, 0x12, 0x1d, 0x0a, 0x0a, - 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x74, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x12, 0x36, 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, + 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x19, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6c, + 0x61, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x01, 0x52, 0x07, 0x75, 0x73, 0x65, 0x72, 0x4c, 0x61, + 0x74, 0x12, 0x19, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6c, 0x6e, 0x67, 0x18, 0x0d, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x07, 0x75, 0x73, 0x65, 0x72, 0x4c, 0x6e, 0x67, 0x12, 0x16, 0x0a, 0x06, + 0x72, 0x61, 0x64, 0x69, 0x75, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x72, 0x61, + 0x64, 0x69, 0x75, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6f, + 0x6e, 0x6c, 0x79, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, + 0x63, 0x4f, 0x6e, 0x6c, 0x79, 0x22, 0x66, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x28, 0x0a, 0x06, 0x67, 0x72, 0x6f, 0x75, 0x70, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, + 0x73, 0x76, 0x63, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x06, 0x67, 0x72, 0x6f, 0x75, 0x70, + 0x73, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x55, 0x0a, + 0x09, 0x42, 0x61, 0x73, 0x69, 0x63, 0x52, 0x65, 0x73, 0x70, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x22, 0x9c, 0x01, 0x0a, 0x0c, 0x4a, 0x6f, 0x69, 0x6e, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x6c, 0x75, 0x67, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x6c, 0x75, 0x67, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x6e, 0x73, 0x77, + 0x65, 0x72, 0x73, 0x5f, 0x6a, 0x73, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x61, 0x6e, 0x73, 0x77, 0x65, 0x72, 0x73, 0x4a, 0x73, 0x6f, 0x6e, 0x12, 0x36, 0x0a, 0x0b, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x15, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x43, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, + 0x6e, 0x66, 0x6f, 0x22, 0xda, 0x01, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x73, + 0x6c, 0x75, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x6c, 0x75, 0x67, 0x12, + 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x14, + 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, + 0x69, 0x6d, 0x69, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, + 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, + 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x36, 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, - 0x22, 0xd2, 0x03, 0x0a, 0x0b, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, - 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, - 0x12, 0x19, 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, - 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x5f, 0x75, 0x73, 0x65, - 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x6d, 0x61, 0x78, 0x55, 0x73, 0x65, 0x73, - 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, - 0x75, 0x73, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x5f, - 0x61, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x12, - 0x2e, 0x0a, 0x13, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x5f, 0x75, 0x73, - 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x64, 0x42, 0x79, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, - 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, - 0x76, 0x6f, 0x6b, 0x65, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x72, 0x65, 0x76, - 0x6f, 0x6b, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x6c, - 0x75, 0x67, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x53, - 0x6c, 0x75, 0x67, 0x12, 0x1d, 0x0a, 0x0a, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x76, 0x69, 0x73, 0x69, - 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x67, 0x72, - 0x6f, 0x75, 0x70, 0x56, 0x69, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x16, 0x0a, - 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x61, - 0x63, 0x74, 0x69, 0x76, 0x65, 0x22, 0xd5, 0x01, 0x0a, 0x0f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x6c, 0x75, - 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x6c, 0x75, 0x67, 0x12, 0x1d, 0x0a, - 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, - 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, - 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x5f, 0x75, 0x73, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x07, 0x6d, 0x61, 0x78, 0x55, 0x73, 0x65, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x65, - 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x69, 0x6e, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x73, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x49, 0x6e, - 0x48, 0x6f, 0x75, 0x72, 0x73, 0x12, 0x36, 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, - 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x67, 0x72, 0x6f, - 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x6c, 0x0a, - 0x0a, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x18, 0x0a, 0x07, 0x6d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2e, 0x0a, 0x06, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, - 0x63, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x52, 0x06, 0x69, - 0x6e, 0x76, 0x69, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x7b, 0x0a, 0x0e, 0x4c, - 0x69, 0x73, 0x74, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, - 0x04, 0x73, 0x6c, 0x75, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x6c, 0x75, - 0x67, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, - 0x12, 0x36, 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, - 0x63, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x59, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, - 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x30, 0x0a, 0x07, 0x69, - 0x6e, 0x76, 0x69, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, - 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x6e, - 0x76, 0x69, 0x74, 0x65, 0x52, 0x07, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x73, 0x12, 0x14, 0x0a, - 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x22, 0x99, 0x01, 0x0a, 0x0f, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x49, 0x6e, - 0x76, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x6c, 0x75, 0x67, 0x18, + 0x22, 0x74, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, + 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x30, 0x0a, 0x07, 0x6d, 0x65, 0x6d, 0x62, + 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x72, 0x6f, 0x75, + 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, + 0x72, 0x52, 0x07, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, + 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, + 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xd5, 0x01, 0x0a, 0x13, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x12, 0x12, + 0x0a, 0x04, 0x73, 0x6c, 0x75, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x6c, + 0x75, 0x67, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, + 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x75, 0x73, 0x65, 0x72, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x6f, + 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x12, 0x16, + 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x36, 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x67, 0x72, + 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0xa5, + 0x01, 0x0a, 0x0f, 0x4a, 0x6f, 0x69, 0x6e, 0x44, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x6c, 0x75, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x73, 0x6c, 0x75, 0x67, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, + 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x36, + 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, + 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0xb6, 0x01, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x4d, 0x65, + 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x6c, 0x75, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x6c, 0x75, 0x67, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x6e, - 0x76, 0x69, 0x74, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x69, - 0x6e, 0x76, 0x69, 0x74, 0x65, 0x49, 0x64, 0x12, 0x36, 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x67, + 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x12, 0x36, 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x22, - 0x7b, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, - 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x49, 0x64, 0x12, 0x36, 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, - 0x6e, 0x66, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x67, 0x72, 0x6f, 0x75, - 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x7e, 0x0a, 0x0f, - 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, - 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x49, 0x64, 0x12, 0x36, 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, - 0x6e, 0x66, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x67, 0x72, 0x6f, 0x75, + 0xd2, 0x03, 0x0a, 0x0b, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x12, + 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, + 0x19, 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x12, 0x12, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x72, 0x6f, 0x6c, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x5f, 0x75, 0x73, 0x65, 0x73, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x6d, 0x61, 0x78, 0x55, 0x73, 0x65, 0x73, 0x12, + 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x75, + 0x73, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x61, + 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x52, 0x09, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x12, 0x2e, + 0x0a, 0x13, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x5f, 0x75, 0x73, 0x65, + 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x64, 0x42, 0x79, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x39, + 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x76, + 0x6f, 0x6b, 0x65, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x72, 0x65, 0x76, 0x6f, + 0x6b, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x6c, 0x75, + 0x67, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x6c, + 0x75, 0x67, 0x12, 0x1d, 0x0a, 0x0a, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x29, 0x0a, 0x10, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x76, 0x69, 0x73, 0x69, 0x62, + 0x69, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x67, 0x72, 0x6f, + 0x75, 0x70, 0x56, 0x69, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x16, 0x0a, 0x06, + 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x61, 0x63, + 0x74, 0x69, 0x76, 0x65, 0x22, 0xd5, 0x01, 0x0a, 0x0f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, + 0x6e, 0x76, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x6c, 0x75, 0x67, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x6c, 0x75, 0x67, 0x12, 0x1d, 0x0a, 0x0a, + 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x72, + 0x6f, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x12, + 0x19, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x5f, 0x75, 0x73, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x07, 0x6d, 0x61, 0x78, 0x55, 0x73, 0x65, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x65, 0x78, + 0x70, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x69, 0x6e, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x73, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x49, 0x6e, 0x48, + 0x6f, 0x75, 0x72, 0x73, 0x12, 0x36, 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, + 0x6e, 0x66, 0x6f, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0xdb, 0x01, 0x0a, - 0x0c, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, - 0x04, 0x73, 0x6c, 0x75, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x6c, 0x75, - 0x67, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, - 0x12, 0x17, 0x0a, 0x07, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x06, 0x72, 0x75, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, - 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, - 0x12, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x62, - 0x6f, 0x64, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x6f, 0x72, 0x74, 0x5f, 0x6f, 0x72, 0x64, 0x65, - 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x73, 0x6f, 0x72, 0x74, 0x4f, 0x72, 0x64, - 0x65, 0x72, 0x12, 0x36, 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x66, - 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, - 0x73, 0x76, 0x63, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x69, 0x0a, 0x0d, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x18, 0x0a, 0x07, 0x6d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x28, 0x0a, 0x04, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x04, 0x72, 0x75, 0x6c, 0x65, 0x12, - 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x98, 0x01, 0x0a, 0x12, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, - 0x75, 0x6c, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, + 0x52, 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x6c, 0x0a, 0x0a, + 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x12, 0x2e, 0x0a, 0x06, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, + 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x52, 0x06, 0x69, 0x6e, + 0x76, 0x69, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x7b, 0x0a, 0x0e, 0x4c, 0x69, + 0x73, 0x74, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, + 0x73, 0x6c, 0x75, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x6c, 0x75, 0x67, + 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, + 0x36, 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, + 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x59, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x49, + 0x6e, 0x76, 0x69, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x30, 0x0a, 0x07, 0x69, 0x6e, + 0x76, 0x69, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x72, + 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x6e, 0x76, + 0x69, 0x74, 0x65, 0x52, 0x07, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x22, 0x99, 0x01, 0x0a, 0x0f, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x49, 0x6e, 0x76, + 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x6c, 0x75, 0x67, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x6c, 0x75, 0x67, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x6e, 0x76, + 0x69, 0x74, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x69, 0x6e, + 0x76, 0x69, 0x74, 0x65, 0x49, 0x64, 0x12, 0x36, 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x67, 0x72, + 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x7b, + 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x14, + 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x49, 0x64, 0x12, 0x36, 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, + 0x66, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, + 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x7e, 0x0a, 0x0f, 0x41, + 0x63, 0x63, 0x65, 0x70, 0x74, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x14, + 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x49, 0x64, 0x12, 0x36, 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, + 0x66, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, + 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0xdb, 0x01, 0x0a, 0x0c, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x6c, 0x75, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x6c, 0x75, 0x67, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x06, 0x72, 0x75, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x36, 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, - 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, - 0x22, 0x51, 0x0a, 0x11, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x52, 0x65, 0x71, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x6c, - 0x75, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x53, - 0x6c, 0x75, 0x67, 0x22, 0x9a, 0x02, 0x0a, 0x12, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, - 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x12, 0x21, 0x0a, 0x0c, 0x67, 0x72, - 0x6f, 0x75, 0x70, 0x5f, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0b, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x12, 0x21, 0x0a, - 0x0c, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x29, 0x0a, 0x10, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x76, 0x69, 0x73, 0x69, 0x62, 0x69, - 0x6c, 0x69, 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x67, 0x72, 0x6f, 0x75, - 0x70, 0x56, 0x69, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x72, - 0x6f, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x12, - 0x23, 0x0a, 0x0d, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x65, 0x72, 0x6d, 0x69, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x73, 0x5f, 0x6d, 0x65, 0x6d, - 0x62, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x4d, 0x65, 0x6d, - 0x62, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x73, 0x5f, 0x62, 0x61, 0x6e, 0x6e, 0x65, 0x64, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x42, 0x61, 0x6e, 0x6e, 0x65, 0x64, - 0x32, 0xa0, 0x0d, 0x0a, 0x0c, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x12, 0x3e, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x12, 0x19, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x67, 0x72, - 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x73, - 0x70, 0x12, 0x3e, 0x0a, 0x0b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x12, 0x19, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x67, 0x72, - 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x73, - 0x70, 0x12, 0x3e, 0x0a, 0x0b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x12, 0x19, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x67, 0x72, - 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x42, 0x61, 0x73, 0x69, 0x63, 0x52, 0x65, 0x73, - 0x70, 0x12, 0x3f, 0x0a, 0x0c, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x12, 0x19, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x67, - 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, - 0x73, 0x70, 0x12, 0x38, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x16, - 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, - 0x76, 0x63, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x12, 0x41, 0x0a, 0x0a, - 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, 0x18, 0x2e, 0x67, 0x72, 0x6f, - 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x73, 0x52, 0x65, 0x71, 0x1a, 0x19, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, - 0x44, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, - 0x12, 0x18, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x19, 0x2e, 0x67, 0x72, 0x6f, - 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x3a, 0x0a, 0x09, 0x4a, 0x6f, 0x69, 0x6e, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x12, 0x17, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x4a, - 0x6f, 0x69, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x67, 0x72, - 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x42, 0x61, 0x73, 0x69, 0x63, 0x52, 0x65, 0x73, - 0x70, 0x12, 0x3d, 0x0a, 0x0a, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, + 0x52, 0x06, 0x72, 0x75, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x12, + 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x62, 0x6f, + 0x64, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x6f, 0x72, 0x74, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x73, 0x6f, 0x72, 0x74, 0x4f, 0x72, 0x64, 0x65, + 0x72, 0x12, 0x36, 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, + 0x76, 0x63, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x69, 0x0a, 0x0d, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x12, 0x28, 0x0a, 0x04, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x04, 0x72, 0x75, 0x6c, 0x65, 0x12, 0x14, + 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x22, 0x98, 0x01, 0x0a, 0x12, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x75, + 0x6c, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x73, + 0x6c, 0x75, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x6c, 0x75, 0x67, 0x12, + 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x17, + 0x0a, 0x07, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x06, 0x72, 0x75, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x36, 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x67, + 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x22, + 0x51, 0x0a, 0x11, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x52, 0x65, 0x71, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x6c, 0x75, + 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x6c, + 0x75, 0x67, 0x22, 0x9a, 0x02, 0x0a, 0x12, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x12, 0x21, 0x0a, 0x0c, 0x67, 0x72, 0x6f, + 0x75, 0x70, 0x5f, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0b, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x12, 0x21, 0x0a, 0x0c, + 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, + 0x29, 0x0a, 0x10, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x76, 0x69, 0x73, 0x69, 0x62, 0x69, 0x6c, + 0x69, 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x67, 0x72, 0x6f, 0x75, 0x70, + 0x56, 0x69, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x6f, + 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x12, 0x23, + 0x0a, 0x0d, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x73, 0x5f, 0x6d, 0x65, 0x6d, 0x62, + 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x4d, 0x65, 0x6d, 0x62, + 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x73, 0x5f, 0x62, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x42, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x32, + 0xa0, 0x0d, 0x0a, 0x0c, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x12, 0x3e, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, + 0x19, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x67, 0x72, 0x6f, + 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, + 0x12, 0x3e, 0x0a, 0x0b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, + 0x19, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x67, 0x72, 0x6f, + 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, + 0x12, 0x3e, 0x0a, 0x0b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x19, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x42, 0x61, 0x73, 0x69, 0x63, 0x52, 0x65, 0x73, 0x70, - 0x12, 0x4e, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x12, - 0x1e, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x1a, - 0x1f, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x12, 0x48, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, - 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x1e, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, - 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x6f, 0x6c, - 0x65, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, - 0x2e, 0x42, 0x61, 0x73, 0x69, 0x63, 0x52, 0x65, 0x73, 0x70, 0x12, 0x44, 0x0a, 0x0c, 0x52, 0x65, - 0x6d, 0x6f, 0x76, 0x65, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x1e, 0x2e, 0x67, 0x72, 0x6f, - 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x65, 0x6d, - 0x62, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x67, 0x72, 0x6f, + 0x12, 0x3f, 0x0a, 0x0c, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x12, 0x19, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x67, 0x72, + 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x73, + 0x70, 0x12, 0x38, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x16, 0x2e, + 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, + 0x63, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x12, 0x41, 0x0a, 0x0a, 0x4c, + 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, 0x18, 0x2e, 0x67, 0x72, 0x6f, 0x75, + 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, + 0x52, 0x65, 0x71, 0x1a, 0x19, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x44, + 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, + 0x18, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x19, 0x2e, 0x67, 0x72, 0x6f, 0x75, + 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x12, 0x3a, 0x0a, 0x09, 0x4a, 0x6f, 0x69, 0x6e, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x12, 0x17, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x4a, 0x6f, + 0x69, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x42, 0x61, 0x73, 0x69, 0x63, 0x52, 0x65, 0x73, 0x70, - 0x12, 0x41, 0x0a, 0x09, 0x42, 0x61, 0x6e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x1e, 0x2e, - 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, - 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x42, 0x61, 0x73, 0x69, 0x63, 0x52, - 0x65, 0x73, 0x70, 0x12, 0x46, 0x0a, 0x12, 0x41, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x4a, 0x6f, - 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x2e, 0x67, 0x72, 0x6f, 0x75, - 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x4a, 0x6f, 0x69, 0x6e, 0x44, 0x65, 0x63, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, - 0x63, 0x2e, 0x42, 0x61, 0x73, 0x69, 0x63, 0x52, 0x65, 0x73, 0x70, 0x12, 0x45, 0x0a, 0x11, 0x52, - 0x65, 0x6a, 0x65, 0x63, 0x74, 0x4a, 0x6f, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x1a, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x4a, 0x6f, 0x69, - 0x6e, 0x44, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x67, - 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x42, 0x61, 0x73, 0x69, 0x63, 0x52, 0x65, - 0x73, 0x70, 0x12, 0x3a, 0x0a, 0x09, 0x41, 0x64, 0x64, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, - 0x17, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x4d, - 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, - 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x42, 0x61, 0x73, 0x69, 0x63, 0x52, 0x65, 0x73, 0x70, 0x12, 0x41, - 0x0a, 0x0c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x12, 0x1a, - 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x67, 0x72, 0x6f, - 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x12, 0x44, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x73, - 0x12, 0x19, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x1a, 0x2e, 0x67, 0x72, - 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x76, 0x69, - 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x40, 0x0a, 0x0c, 0x52, 0x65, 0x76, 0x6f, 0x6b, - 0x65, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x12, 0x1a, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, - 0x73, 0x76, 0x63, 0x2e, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, + 0x12, 0x3d, 0x0a, 0x0a, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x19, + 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x67, 0x72, 0x6f, 0x75, + 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x42, 0x61, 0x73, 0x69, 0x63, 0x52, 0x65, 0x73, 0x70, 0x12, + 0x4e, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x12, 0x1e, + 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x1f, + 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, + 0x48, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, + 0x6f, 0x6c, 0x65, 0x12, 0x1e, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, - 0x42, 0x61, 0x73, 0x69, 0x63, 0x52, 0x65, 0x73, 0x70, 0x12, 0x3b, 0x0a, 0x09, 0x47, 0x65, 0x74, - 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x12, 0x17, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, - 0x76, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, - 0x15, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x49, 0x6e, 0x76, 0x69, - 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x40, 0x0a, 0x0c, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, + 0x42, 0x61, 0x73, 0x69, 0x63, 0x52, 0x65, 0x73, 0x70, 0x12, 0x44, 0x0a, 0x0c, 0x52, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x1e, 0x2e, 0x67, 0x72, 0x6f, 0x75, + 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x65, 0x6d, 0x62, + 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x67, 0x72, 0x6f, 0x75, + 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x42, 0x61, 0x73, 0x69, 0x63, 0x52, 0x65, 0x73, 0x70, 0x12, + 0x41, 0x0a, 0x09, 0x42, 0x61, 0x6e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x1e, 0x2e, 0x67, + 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, + 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x67, + 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x42, 0x61, 0x73, 0x69, 0x63, 0x52, 0x65, + 0x73, 0x70, 0x12, 0x46, 0x0a, 0x12, 0x41, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x4a, 0x6f, 0x69, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, + 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x4a, 0x6f, 0x69, 0x6e, 0x44, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, + 0x2e, 0x42, 0x61, 0x73, 0x69, 0x63, 0x52, 0x65, 0x73, 0x70, 0x12, 0x45, 0x0a, 0x11, 0x52, 0x65, + 0x6a, 0x65, 0x63, 0x74, 0x4a, 0x6f, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1a, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x4a, 0x6f, 0x69, 0x6e, + 0x44, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x67, 0x72, + 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x42, 0x61, 0x73, 0x69, 0x63, 0x52, 0x65, 0x73, + 0x70, 0x12, 0x3a, 0x0a, 0x09, 0x41, 0x64, 0x64, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x17, + 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x4d, 0x65, + 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, + 0x73, 0x76, 0x63, 0x2e, 0x42, 0x61, 0x73, 0x69, 0x63, 0x52, 0x65, 0x73, 0x70, 0x12, 0x41, 0x0a, + 0x0c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x12, 0x1a, 0x2e, + 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x67, 0x72, 0x6f, 0x75, + 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x12, 0x44, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x73, 0x12, + 0x19, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x1a, 0x2e, 0x67, 0x72, 0x6f, + 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x76, 0x69, 0x74, + 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x40, 0x0a, 0x0c, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x12, 0x1a, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, - 0x76, 0x63, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x52, + 0x76, 0x63, 0x2e, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x42, - 0x61, 0x73, 0x69, 0x63, 0x52, 0x65, 0x73, 0x70, 0x12, 0x41, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x17, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, - 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, - 0x71, 0x1a, 0x18, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x44, 0x0a, 0x0f, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x17, - 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x18, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, - 0x73, 0x76, 0x63, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x12, 0x46, 0x0a, 0x0f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x52, 0x75, 0x6c, 0x65, 0x12, 0x1d, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, - 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x75, 0x6c, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, - 0x42, 0x61, 0x73, 0x69, 0x63, 0x52, 0x65, 0x73, 0x70, 0x12, 0x48, 0x0a, 0x09, 0x41, 0x75, 0x74, - 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x12, 0x1c, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, - 0x76, 0x63, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x52, 0x65, 0x71, 0x1a, 0x1d, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, - 0x2e, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, - 0x65, 0x73, 0x70, 0x42, 0x25, 0x5a, 0x23, 0x2e, 0x2f, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x2f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, + 0x61, 0x73, 0x69, 0x63, 0x52, 0x65, 0x73, 0x70, 0x12, 0x3b, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x49, + 0x6e, 0x76, 0x69, 0x74, 0x65, 0x12, 0x17, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, + 0x63, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x15, + 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x49, 0x6e, 0x76, 0x69, 0x74, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x40, 0x0a, 0x0c, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x49, + 0x6e, 0x76, 0x69, 0x74, 0x65, 0x12, 0x1a, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, + 0x63, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x52, 0x65, + 0x71, 0x1a, 0x14, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x42, 0x61, + 0x73, 0x69, 0x63, 0x52, 0x65, 0x73, 0x70, 0x12, 0x41, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x17, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, + 0x73, 0x76, 0x63, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, + 0x1a, 0x18, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x44, 0x0a, 0x0f, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x17, 0x2e, + 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, + 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x18, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, + 0x76, 0x63, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x12, 0x46, 0x0a, 0x0f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, + 0x75, 0x6c, 0x65, 0x12, 0x1d, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x75, 0x6c, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x42, + 0x61, 0x73, 0x69, 0x63, 0x52, 0x65, 0x73, 0x70, 0x12, 0x48, 0x0a, 0x09, 0x41, 0x75, 0x74, 0x68, + 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x12, 0x1c, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, + 0x63, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x52, 0x65, 0x71, 0x1a, 0x1d, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x76, 0x63, 0x2e, + 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, + 0x73, 0x70, 0x42, 0x25, 0x5a, 0x23, 0x2e, 0x2f, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x2f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, } var ( diff --git a/apis/serviceconn/gateway_group/pb/gw_group.proto b/apis/serviceconn/gateway_group/pb/gw_group.proto index 37e8f779..a9fed1c6 100644 --- a/apis/serviceconn/gateway_group/pb/gw_group.proto +++ b/apis/serviceconn/gateway_group/pb/gw_group.proto @@ -148,6 +148,10 @@ message ListGroupsReq { string account_id = 9; // viewer / owner depending on the RPC string username = 10; // target user for "groups I organize/belong to" ClientInfo client_info = 11; + double user_lat = 12; + double user_lng = 13; + int32 radius = 14; // search radius in km + bool public_only = 15; // profile: published public groups only } message ListGroupsResp { diff --git a/microservices/the_monkeys_events/internal/database/attendees.go b/microservices/the_monkeys_events/internal/database/attendees.go index 37f345ea..6ea0791d 100644 --- a/microservices/the_monkeys_events/internal/database/attendees.go +++ b/microservices/the_monkeys_events/internal/database/attendees.go @@ -68,10 +68,11 @@ func (db *eventDB) CreateRSVP(ctx context.Context, req *pb.RSVPReq) (*RSVPResult var eventID, organizerID int64 var eventStatus string var capacity int32 + var endTime time.Time if err := tx.QueryRowContext(ctx, ` - SELECT e.id, e.organizer_id, e.status, e.capacity, e.title, e.slug + SELECT e.id, e.organizer_id, e.status, e.capacity, e.title, e.slug, e.end_time FROM events e WHERE e.slug = $1 FOR UPDATE`, req.EventSlug, - ).Scan(&eventID, &organizerID, &eventStatus, &capacity, &out.EventTitle, &out.EventSlug); err != nil { + ).Scan(&eventID, &organizerID, &eventStatus, &capacity, &out.EventTitle, &out.EventSlug, &endTime); err != nil { if err == sql.ErrNoRows { return status.Error(codes.NotFound, "event not found") } @@ -80,6 +81,9 @@ func (db *eventDB) CreateRSVP(ctx context.Context, req *pb.RSVPReq) (*RSVPResult if eventStatus != StatusPublished && eventStatus != StatusLive { return status.Errorf(codes.FailedPrecondition, "event is not open for rsvp (%s)", eventStatus) } + if eventHasEnded(eventStatus, endTime) { + return status.Error(codes.FailedPrecondition, "event is not open for rsvp (ended)") + } if userID == organizerID { return status.Error(codes.FailedPrecondition, "the organizer is already attending") } @@ -305,14 +309,19 @@ func (db *eventDB) CancelRSVP(ctx context.Context, req *pb.CancelRSVPReq) (*Canc } var eventID int64 + var endTime time.Time + var eventStatus string if err := tx.QueryRowContext(ctx, - "SELECT id, title FROM events WHERE slug = $1 FOR UPDATE", req.EventSlug). - Scan(&eventID, &out.EventTitle); err != nil { + "SELECT id, title, end_time, status FROM events WHERE slug = $1 FOR UPDATE", req.EventSlug). + Scan(&eventID, &out.EventTitle, &endTime, &eventStatus); err != nil { if err == sql.ErrNoRows { return status.Error(codes.NotFound, "event not found") } return status.Error(codes.Internal, "failed to load event") } + if eventHasEnded(eventStatus, endTime) { + return status.Error(codes.FailedPrecondition, "event has ended") + } var attendeeID int64 var current string diff --git a/microservices/the_monkeys_events/internal/database/events.go b/microservices/the_monkeys_events/internal/database/events.go index ea995a5b..9d9eb80c 100644 --- a/microservices/the_monkeys_events/internal/database/events.go +++ b/microservices/the_monkeys_events/internal/database/events.go @@ -35,6 +35,8 @@ const ( DateFilterThisWeek = "this-week" DateFilterThisMonth = "this-month" DateFilterAll = "all" + DateFilterUpcoming = "upcoming" + DateFilterPast = "past" ) // Sort order values passed by the discovery UI. @@ -47,6 +49,9 @@ const ( // publicStatuses are the states an event is visible in to non-hosts. var publicStatuses = []string{StatusPublished, StatusLive, StatusCompleted} +// liveStatuses are upcoming discovery states; completed events are history. +var liveStatuses = []string{StatusPublished, StatusLive} + // eventVisibilities mirrors the events.visibility CHECK constraint. var eventVisibilities = map[string]struct{}{ "public": {}, "group_members": {}, "private": {}, "unlisted": {}, @@ -141,18 +146,19 @@ func (db *eventDB) CreateEvent(ctx context.Context, req *pb.CreateEventReq) (*pb } slug = slugify(req.Title) + lat, lng := Geocode(req.Location) var eventID int64 if err := tx.QueryRowContext(ctx, ` INSERT INTO events ( title, description, slug, start_time, end_time, timezone, event_type, location, meeting_link, capacity, cover_image, organizer_id, - group_id, visibility - ) VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14) + group_id, visibility, latitude, longitude + ) VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16) RETURNING id`, req.Title, req.Description, slug, req.StartTime.AsTime(), req.EndTime.AsTime(), defaultTimezone(req.Timezone), req.EventType, req.Location, req.MeetingLink, - req.Capacity, req.CoverImage, organizerID, groupCol, visibility, + req.Capacity, req.CoverImage, organizerID, groupCol, visibility, nullCoord(lat), nullCoord(lng), ).Scan(&eventID); err != nil { return status.Errorf(codes.Internal, "failed to create event: %v", err) } @@ -204,6 +210,36 @@ func (db *eventDB) UpdateEvent(ctx context.Context, req *pb.UpdateEventReq) (*pb return err } + var ( + curStatus, curType, curLoc, curLink, curVis string + curStart, curEnd time.Time + curCap int32 + ) + if err := tx.QueryRowContext(ctx, ` + SELECT status, start_time, end_time, event_type, COALESCE(location, ''), + COALESCE(meeting_link, ''), capacity, COALESCE(visibility, 'public') + FROM events WHERE id = $1`, eventID, + ).Scan(&curStatus, &curStart, &curEnd, &curType, &curLoc, &curLink, &curCap, &curVis); err != nil { + return status.Error(codes.Internal, "failed to load event") + } + if eventHasEnded(curStatus, curEnd) { + vis := req.Visibility + if vis == "" { + vis = curVis + } + frozen := !sameInstant(req.StartTime.AsTime(), curStart) || + !sameInstant(req.EndTime.AsTime(), curEnd) || + req.EventType != curType || + req.Location != curLoc || + req.MeetingLink != curLink || + req.Capacity != curCap || + vis != curVis + if frozen { + return status.Error(codes.FailedPrecondition, + "ended events can only update title, description, cover, and tags") + } + } + // Visibility is optional on update; when supplied it must be consistent // with the event's current group attachment. NULLIF preserves the stored // value when the caller omits it. @@ -222,16 +258,19 @@ func (db *eventDB) UpdateEvent(ctx context.Context, req *pb.UpdateEventReq) (*pb } } + lat, lng := Geocode(req.Location) + if _, err := tx.ExecContext(ctx, ` UPDATE events SET title = $1, description = $2, start_time = $3, end_time = $4, timezone = $5, event_type = $6, location = $7, meeting_link = $8, capacity = $9, cover_image = $10, visibility = COALESCE(NULLIF($11, ''), visibility), + latitude = $12, longitude = $13, updated_at = NOW() - WHERE id = $12`, + WHERE id = $14`, req.Title, req.Description, req.StartTime.AsTime(), req.EndTime.AsTime(), defaultTimezone(req.Timezone), req.EventType, req.Location, req.MeetingLink, - req.Capacity, req.CoverImage, req.Visibility, eventID, + req.Capacity, req.CoverImage, req.Visibility, nullCoord(lat), nullCoord(lng), eventID, ); err != nil { return status.Errorf(codes.Internal, "failed to update event: %v", err) } @@ -278,6 +317,111 @@ func (db *eventDB) DeleteEvent(ctx context.Context, req *pb.EventActionReq) erro }) } +func (db *eventDB) CloneEvent(ctx context.Context, req *pb.CloneEventReq) (*pb.Event, error) { + if err := validateWindow(req.StartTime, req.EndTime); err != nil { + return nil, err + } + + var slug string + err := db.inTx(ctx, func(tx *sql.Tx) error { + srcID, organizerID, err := authorize(ctx, tx, req.Slug, req.AccountId, permEditEvent) + if err != nil { + return err + } + + var ( + title, desc, tz, eventType, loc, link, cover, vis string + capacity int32 + groupID sql.NullInt64 + ) + if err := tx.QueryRowContext(ctx, ` + SELECT title, COALESCE(description, ''), COALESCE(timezone, 'UTC'), event_type, + COALESCE(location, ''), COALESCE(meeting_link, ''), capacity, + COALESCE(cover_image, ''), COALESCE(visibility, 'public'), group_id + FROM events WHERE id = $1`, srcID, + ).Scan(&title, &desc, &tz, &eventType, &loc, &link, &capacity, &cover, &vis, &groupID); err != nil { + return status.Error(codes.Internal, "failed to load event") + } + + var groupCol any + if groupID.Valid { + groupCol = groupID.Int64 + } + lat, lng := Geocode(loc) + slug = slugify(title) + + var eventID int64 + if err := tx.QueryRowContext(ctx, ` + INSERT INTO events ( + title, description, slug, start_time, end_time, timezone, + event_type, location, meeting_link, capacity, cover_image, organizer_id, + group_id, visibility, latitude, longitude + ) VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16) + RETURNING id`, + title, desc, slug, req.StartTime.AsTime(), req.EndTime.AsTime(), tz, + eventType, loc, link, capacity, cover, organizerID, groupCol, vis, + nullCoord(lat), nullCoord(lng), + ).Scan(&eventID); err != nil { + return status.Errorf(codes.Internal, "failed to clone event: %v", err) + } + if err := grantPermissions(ctx, tx, eventID, organizerID); err != nil { + return err + } + + rows, err := tx.QueryContext(ctx, + "SELECT tag_name FROM event_tags WHERE event_id = $1", srcID) + if err != nil { + return status.Error(codes.Internal, "failed to copy tags") + } + var tags []string + for rows.Next() { + var t string + if err := rows.Scan(&t); err != nil { + rows.Close() + return err + } + tags = append(tags, t) + } + rows.Close() + if err := replaceTags(ctx, tx, eventID, tags); err != nil { + return err + } + + trows, err := tx.QueryContext(ctx, ` + SELECT name, COALESCE(description, ''), price, COALESCE(currency, $2), capacity, sort_order + FROM event_ticket_tiers WHERE event_id = $1 ORDER BY sort_order`, srcID, defaultCurrency) + if err != nil { + return status.Error(codes.Internal, "failed to copy ticket tiers") + } + defer trows.Close() + i := int32(0) + copied := false + for trows.Next() { + in := &pb.TicketTierInput{} + if err := trows.Scan(&in.Name, &in.Description, &in.Price, &in.Currency, &in.Capacity, &in.SortOrder); err != nil { + return err + } + if _, err := insertTier(ctx, tx, eventID, in, i); err != nil { + return err + } + copied = true + i++ + } + if !copied { + if _, err := insertTier(ctx, tx, eventID, + &pb.TicketTierInput{Name: "General", Currency: defaultCurrency}, 0); err != nil { + return err + } + } + return trows.Err() + }) + if err != nil { + return nil, err + } + event, _, err := db.GetEvent(ctx, slug, req.AccountId) + return event, err +} + // SetEventStatus performs a lifecycle transition. Cancelling also releases // every outstanding RSVP; the caller notifies the affected attendees. func (db *eventDB) SetEventStatus(ctx context.Context, req *pb.EventActionReq, newStatus string) (*pb.Event, error) { @@ -421,19 +565,46 @@ func commonFilters(f *filter, req *pb.ListEventsReq) { if req.Query != "" { f.add("e.title ILIKE '%%' || $%d || '%%'", req.Query) } - if req.Location != "" { + // Legacy string search fallback, if no radius is given + if req.Location != "" && req.Radius == 0 { f.add("e.location ILIKE '%%' || $%d || '%%'", req.Location) } + + if req.UserLat != 0 && req.UserLng != 0 && req.Radius > 0 && + req.EventType != EventTypeOnline && req.EventType != EventTypeHybrid { + // Virtual/hybrid skip the radius: they are reachable from anywhere. + // In-person must sit inside the requested radius; the UI expands that + // from city up to country, never worldwide. + f.args = append(f.args, req.UserLat, req.UserLng, req.UserLat, req.Radius) + latPos := len(f.args) - 3 + lngPos := len(f.args) - 2 + lat2Pos := len(f.args) - 1 + radiusPos := len(f.args) + inRange := fmt.Sprintf( + "e.latitude IS NOT NULL AND e.longitude IS NOT NULL AND "+ + "(6371 * acos(LEAST(GREATEST(cos(radians($%d)) * cos(radians(e.latitude)) * cos(radians(e.longitude) - radians($%d)) + sin(radians($%d)) * sin(radians(e.latitude)), -1), 1))) <= $%d", + latPos, lngPos, lat2Pos, radiusPos) + if req.EventType == EventTypeInPerson { + f.conds = append(f.conds, inRange) + } else { + f.conds = append(f.conds, fmt.Sprintf( + "(e.event_type IN ('%s', '%s') OR (%s))", + EventTypeOnline, EventTypeHybrid, inRange)) + } + } + if len(req.Tags) > 0 { f.add("EXISTS (SELECT 1 FROM event_tags t WHERE t.event_id = e.id AND t.tag_name = ANY($%d))", req.Tags) } switch req.DateFilter { case DateFilterThisWeek: - f.addRaw("e.start_time >= CURRENT_DATE AND e.start_time < date_trunc('week', CURRENT_DATE + interval '1 week')") + f.addRaw("e.end_time >= NOW() AND e.start_time >= CURRENT_DATE AND e.start_time < date_trunc('week', CURRENT_DATE + interval '1 week')") case DateFilterThisMonth: - f.addRaw("e.start_time >= CURRENT_DATE AND e.start_time < date_trunc('month', CURRENT_DATE + interval '1 month')") - case DateFilterAll: - f.addRaw("e.start_time >= CURRENT_DATE") + f.addRaw("e.end_time >= NOW() AND e.start_time >= CURRENT_DATE AND e.start_time < date_trunc('month', CURRENT_DATE + interval '1 month')") + case DateFilterAll, DateFilterUpcoming: + f.addRaw("e.end_time >= NOW()") + case DateFilterPast: + f.addRaw("e.end_time < NOW()") } } @@ -464,6 +635,11 @@ func (db *eventDB) list(ctx context.Context, req *pb.ListEventsReq, f *filter, j orderBy = "e.created_at DESC" case SortByPopular: orderBy = "(SELECT COUNT(1) FROM event_attendees a WHERE a.event_id = e.id AND a.status = 'confirmed') DESC, e.start_time ASC" + case "nearest": + if req.UserLat != 0 && req.UserLng != 0 { + // Haversine sorting + orderBy = fmt.Sprintf(`(6371 * acos(cos(radians(%f)) * cos(radians(e.latitude)) * cos(radians(e.longitude) - radians(%f)) + sin(radians(%f)) * sin(radians(e.latitude)))) ASC, e.start_time ASC`, req.UserLat, req.UserLng, req.UserLat) + } } query := fmt.Sprintf("SELECT%s%s%s%s ORDER BY %s LIMIT $%d OFFSET $%d", @@ -498,14 +674,18 @@ func (db *eventDB) list(ctx context.Context, req *pb.ListEventsReq, f *filter, j // ListEvents is the public discovery feed; drafts are never exposed. func (db *eventDB) ListEvents(ctx context.Context, req *pb.ListEventsReq) ([]*pb.Event, int32, error) { + if req.DateFilter == "" { + req.DateFilter = DateFilterUpcoming + } + f := &filter{} if req.Status != "" && req.Status != StatusDraft { f.add("e.status = $%d", req.Status) - } else { + } else if req.DateFilter == DateFilterPast { f.add("e.status = ANY($%d)", publicStatuses) + } else { + f.add("e.status = ANY($%d)", liveStatuses) } - // The global feed only ever surfaces public events; group_members, private - // and unlisted events must never leak into discovery. f.addRaw("e.visibility = 'public'") commonFilters(f, req) return db.list(ctx, req, f, "") @@ -576,6 +756,10 @@ func (db *eventDB) GetUserEvents(ctx context.Context, req *pb.ListEventsReq) ([] return nil, 0, status.Error(codes.PermissionDenied, "drafts are private") } f.add("e.status = $%d", req.Status) + case req.DateFilter == DateFilterPast: + f.add("e.status = ANY($%d)", publicStatuses) + case req.DateFilter == DateFilterUpcoming: + f.add("e.status = ANY($%d)", liveStatuses) case !self: f.add("e.status = ANY($%d)", publicStatuses) } @@ -770,6 +954,26 @@ func defaultTimezone(tz string) string { return tz } +func eventHasEnded(status string, end time.Time) bool { + if status == StatusCompleted || status == StatusCancelled { + return true + } + return !end.IsZero() && !end.After(time.Now()) +} + +func sameInstant(a, b time.Time) bool { + return a.UTC().Truncate(time.Second).Equal(b.UTC().Truncate(time.Second)) +} + +// nullCoord maps a failed geocode (0,0) to NULL so online or unresolvable +// locations stay out of radius filters instead of anchoring to (0,0). +func nullCoord(c float64) any { + if c == 0 { + return nil + } + return c +} + func validateWindow(start, end *timestamppb.Timestamp) error { if start == nil || end == nil { return status.Error(codes.InvalidArgument, "start_time and end_time are required") diff --git a/microservices/the_monkeys_events/internal/database/geocoding.go b/microservices/the_monkeys_events/internal/database/geocoding.go new file mode 100644 index 00000000..1fa14061 --- /dev/null +++ b/microservices/the_monkeys_events/internal/database/geocoding.go @@ -0,0 +1,59 @@ +package database + +import ( + "encoding/json" + "fmt" + "net/http" + "net/url" + "strings" + "time" +) + +// Geocode uses OpenStreetMap's Nominatim API to convert a location string into latitude and longitude. +// It returns (0, 0) if the location is empty, not found, or an error occurs (failing gracefully). +func Geocode(location string) (float64, float64) { + if strings.TrimSpace(location) == "" { + return 0, 0 + } + + query := url.QueryEscape(location) + reqURL := fmt.Sprintf("https://nominatim.openstreetmap.org/search?q=%s&format=json&limit=1", query) + + client := http.Client{Timeout: 5 * time.Second} + req, err := http.NewRequest("GET", reqURL, nil) + if err != nil { + return 0, 0 + } + + // Nominatim strictly requires a User-Agent. + req.Header.Set("User-Agent", "TheMonkeysApp/1.0 (contact@monkeys.com.co)") + + resp, err := client.Do(req) + if err != nil { + return 0, 0 + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + return 0, 0 + } + + var results []struct { + Lat string `json:"lat"` + Lon string `json:"lon"` + } + + if err := json.NewDecoder(resp.Body).Decode(&results); err != nil { + return 0, 0 + } + + if len(results) == 0 { + return 0, 0 + } + + var lat, lon float64 + fmt.Sscanf(results[0].Lat, "%f", &lat) + fmt.Sscanf(results[0].Lon, "%f", &lon) + + return lat, lon +} diff --git a/microservices/the_monkeys_events/internal/database/interface.go b/microservices/the_monkeys_events/internal/database/interface.go index fd8c39dd..07ff8d47 100644 --- a/microservices/the_monkeys_events/internal/database/interface.go +++ b/microservices/the_monkeys_events/internal/database/interface.go @@ -12,6 +12,7 @@ import ( // implementation resolves those to numeric ids and enforces host permissions. type EventDB interface { // Events + CloneEvent(ctx context.Context, req *pb.CloneEventReq) (*pb.Event, error) CreateEvent(ctx context.Context, req *pb.CreateEventReq) (*pb.Event, error) UpdateEvent(ctx context.Context, req *pb.UpdateEventReq) (*pb.Event, error) DeleteEvent(ctx context.Context, req *pb.EventActionReq) error @@ -82,6 +83,7 @@ type EventDB interface { GenerateSeriesOccurrences(ctx context.Context, seriesID int64, occurrences []time.Time, tmpl OccurrenceTemplate) ([]string, error) CancelSeriesOccurrence(ctx context.Context, slug, accountID string) error UpdateSeriesFutureOccurrences(ctx context.Context, seriesID int64, actorAccountID string, cutoff time.Time, tmpl OccurrenceTemplate) (int64, error) + MaterializeSeries(ctx context.Context, req *pb.CreateSeriesReq, occs []time.Time, rule string) (*pb.Event, error) // Background upkeep ClaimDueReminders(ctx context.Context, offset string, earliest, latest time.Duration) ([]Reminder, error) diff --git a/microservices/the_monkeys_events/internal/database/recurring.go b/microservices/the_monkeys_events/internal/database/recurring.go index 0e438600..73614c74 100644 --- a/microservices/the_monkeys_events/internal/database/recurring.go +++ b/microservices/the_monkeys_events/internal/database/recurring.go @@ -44,6 +44,10 @@ type OccurrenceTemplate struct { CoverImage string Visibility string Duration time.Duration + Tags []string + Tiers []*pb.TicketTierInput + Latitude float64 + Longitude float64 } // CreateSeries records a recurring-event definition and returns its id. The @@ -156,12 +160,13 @@ func (db *eventDB) GenerateSeriesOccurrences(ctx context.Context, seriesID int64 title, description, slug, start_time, end_time, timezone, event_type, location, meeting_link, capacity, cover_image, organizer_id, group_id, visibility, status, - series_id, series_occurrence_at - ) VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17) + series_id, series_occurrence_at, latitude, longitude + ) VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19) RETURNING id`, title, description, slug, occ, occ.Add(tmpl.Duration), defaultTimezone(timezone), tmpl.EventType, tmpl.Location, tmpl.MeetingLink, tmpl.Capacity, tmpl.CoverImage, organizerID, groupCol, visibility, StatusPublished, seriesID, occ, + nullCoord(tmpl.Latitude), nullCoord(tmpl.Longitude), ).Scan(&eventID); err != nil { return status.Errorf(codes.Internal, "failed to create occurrence: %v", err) } @@ -169,12 +174,21 @@ func (db *eventDB) GenerateSeriesOccurrences(ctx context.Context, seriesID int64 if err := grantPermissions(ctx, tx, eventID, organizerID); err != nil { return err } - // A published event needs a tier for RSVP to attach to; mirror the - // default tier the publish path creates for free events. - if _, err := insertTier(ctx, tx, eventID, - &pb.TicketTierInput{Name: "General", Currency: defaultCurrency}, 0); err != nil { + if err := replaceTags(ctx, tx, eventID, tmpl.Tags); err != nil { return err } + if len(tmpl.Tiers) == 0 { + if _, err := insertTier(ctx, tx, eventID, + &pb.TicketTierInput{Name: "General", Currency: defaultCurrency}, 0); err != nil { + return err + } + } else { + for i, tier := range tmpl.Tiers { + if _, err := insertTier(ctx, tx, eventID, tier, int32(i)); err != nil { + return err + } + } + } created = append(created, slug) } return nil @@ -271,3 +285,77 @@ func defaultVisibility(v string) string { } return v } + +func (db *eventDB) MaterializeSeries(ctx context.Context, req *pb.CreateSeriesReq, occs []time.Time, rule string) (*pb.Event, error) { + if strings.TrimSpace(req.Title) == "" { + return nil, status.Error(codes.InvalidArgument, "title is required") + } + if len(occs) == 0 { + return nil, status.Error(codes.InvalidArgument, "recurrence produced no dates") + } + if req.StartTime == nil || req.EndTime == nil || !req.EndTime.AsTime().After(req.StartTime.AsTime()) { + return nil, status.Error(codes.InvalidArgument, "end_time must be after start_time") + } + + var endsAt *time.Time + if req.Recurrence != nil && req.Recurrence.Until != nil { + t := req.Recurrence.Until.AsTime() + endsAt = &t + } + + var groupID int64 + if strings.TrimSpace(req.GroupSlug) != "" { + err := db.inTx(ctx, func(tx *sql.Tx) error { + organizerID, err := resolveAccount(ctx, tx, req.AccountId) + if err != nil { + return err + } + gid, err := resolveGroupForOrganizer(ctx, tx, req.GroupSlug, organizerID) + if err != nil { + return err + } + groupID = gid + return nil + }) + if err != nil { + return nil, err + } + } + + seriesID, err := db.CreateSeries(ctx, SeriesInput{ + OrganizerAccountID: req.AccountId, + GroupID: groupID, + Title: req.Title, + Description: req.Description, + Timezone: req.Timezone, + RecurrenceRule: rule, + RecurrenceStartsAt: req.StartTime.AsTime(), + RecurrenceEndsAt: endsAt, + }) + if err != nil { + return nil, err + } + + lat, lng := Geocode(req.Location) + slugs, err := db.GenerateSeriesOccurrences(ctx, seriesID, occs, OccurrenceTemplate{ + EventType: req.EventType, + Location: req.Location, + MeetingLink: req.MeetingLink, + Capacity: req.Capacity, + CoverImage: req.CoverImage, + Visibility: req.Visibility, + Duration: req.EndTime.AsTime().Sub(req.StartTime.AsTime()), + Tags: req.Tags, + Tiers: req.TicketTiers, + Latitude: lat, + Longitude: lng, + }) + if err != nil { + return nil, err + } + if len(slugs) == 0 { + return nil, status.Error(codes.Internal, "failed to create series occurrences") + } + event, _, err := db.GetEvent(ctx, slugs[0], req.AccountId) + return event, err +} diff --git a/microservices/the_monkeys_events/internal/services/rrule.go b/microservices/the_monkeys_events/internal/services/rrule.go new file mode 100644 index 00000000..975694df --- /dev/null +++ b/microservices/the_monkeys_events/internal/services/rrule.go @@ -0,0 +1,153 @@ +package services + +import ( + "fmt" + "strings" + "time" + + "github.com/the-monkeys/the_monkeys/apis/serviceconn/gateway_event/pb" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" +) + +const ( + seriesHorizon = 12 + seriesCap = 52 +) + +func expandRecurrence(r *pb.Recurrence, start time.Time) ([]time.Time, string, error) { + if r == nil { + return nil, "", status.Error(codes.InvalidArgument, "recurrence is required") + } + freq := strings.ToLower(strings.TrimSpace(r.Freq)) + switch freq { + case "daily", "weekly", "monthly", "yearly": + default: + return nil, "", status.Error(codes.InvalidArgument, "freq must be daily, weekly, monthly, or yearly") + } + interval := int(r.Interval) + if interval < 1 { + interval = 1 + } + limit := seriesHorizon + if r.Count > 0 && int(r.Count) < limit { + limit = int(r.Count) + } + if r.Count > seriesCap { + limit = seriesCap + } + if limit > seriesCap { + limit = seriesCap + } + + var until *time.Time + if r.Until != nil { + t := r.Until.AsTime() + until = &t + } + + times := walkRecurrence(freq, interval, start, r.ByDay, int(r.Count), until, limit) + if len(times) == 0 { + return nil, "", status.Error(codes.InvalidArgument, "recurrence produced no dates") + } + return times, buildRRULE(freq, interval, r.ByDay, r.Count, until), nil +} + +func buildRRULE(freq string, interval int, byDay []string, count int32, until *time.Time) string { + parts := []string{"FREQ=" + strings.ToUpper(freq), fmt.Sprintf("INTERVAL=%d", interval)} + if days := rrDays(byDay); days != "" { + parts = append(parts, "BYDAY="+days) + } + if count > 0 { + parts = append(parts, fmt.Sprintf("COUNT=%d", count)) + } + if until != nil { + parts = append(parts, "UNTIL="+until.UTC().Format("20060102T150405Z")) + } + return strings.Join(parts, ";") +} + +func walkRecurrence(freq string, interval int, start time.Time, byDay []string, count int, until *time.Time, limit int) []time.Time { + out := make([]time.Time, 0, limit) + wanted := weekdaySet(byDay) + t := start + for n := 0; n < 400 && len(out) < limit; n++ { + if until != nil && t.After(*until) { + break + } + if count > 0 && len(out) >= count { + break + } + if freq == "weekly" && len(wanted) > 0 { + if wanted[t.Weekday()] { + weeks := int(t.Sub(start).Hours() / 24 / 7) + if weeks%interval == 0 { + out = append(out, t) + } + } + t = t.AddDate(0, 0, 1) + continue + } + out = append(out, t) + switch freq { + case "daily": + t = t.AddDate(0, 0, interval) + case "weekly": + t = t.AddDate(0, 0, 7*interval) + case "monthly": + t = t.AddDate(0, interval, 0) + case "yearly": + t = t.AddDate(interval, 0, 0) + default: + return out + } + } + return out +} + +func weekdaySet(byDay []string) map[time.Weekday]bool { + if len(byDay) == 0 { + return nil + } + m := map[time.Weekday]bool{} + for _, d := range byDay { + switch strings.ToUpper(strings.TrimSpace(d)) { + case "SU", "SUN", "SUNDAY": + m[time.Sunday] = true + case "MO", "MON", "MONDAY": + m[time.Monday] = true + case "TU", "TUE", "TUESDAY": + m[time.Tuesday] = true + case "WE", "WED", "WEDNESDAY": + m[time.Wednesday] = true + case "TH", "THU", "THURSDAY": + m[time.Thursday] = true + case "FR", "FRI", "FRIDAY": + m[time.Friday] = true + case "SA", "SAT", "SATURDAY": + m[time.Saturday] = true + } + } + return m +} + +func rrDays(byDay []string) string { + seen := weekdaySet(byDay) + if len(seen) == 0 { + return "" + } + order := []struct { + d time.Weekday + s string + }{ + {time.Monday, "MO"}, {time.Tuesday, "TU"}, {time.Wednesday, "WE"}, + {time.Thursday, "TH"}, {time.Friday, "FR"}, {time.Saturday, "SA"}, {time.Sunday, "SU"}, + } + var parts []string + for _, o := range order { + if seen[o.d] { + parts = append(parts, o.s) + } + } + return strings.Join(parts, ",") +} diff --git a/microservices/the_monkeys_events/internal/services/service.go b/microservices/the_monkeys_events/internal/services/service.go index 263ce754..17e8acdf 100644 --- a/microservices/the_monkeys_events/internal/services/service.go +++ b/microservices/the_monkeys_events/internal/services/service.go @@ -501,3 +501,30 @@ func (s *EventService) GetCalendarFile(ctx context.Context, req *pb.CalendarReq) func (s *EventService) Authorize(ctx context.Context, req *pb.AuthorizeReq) (*pb.AuthorizeResp, error) { return s.db.Authorize(ctx, req) } + +func (s *EventService) CloneEvent(ctx context.Context, req *pb.CloneEventReq) (*pb.EventResp, error) { + event, err := s.db.CloneEvent(ctx, req) + if err != nil { + return nil, err + } + return &pb.EventResp{Message: "event cloned as draft", Event: event}, nil +} + +func (s *EventService) CreateSeries(ctx context.Context, req *pb.CreateSeriesReq) (*pb.EventResp, error) { + occs, rule, err := expandRecurrence(req.Recurrence, req.GetStartTime().AsTime()) + if err != nil { + return nil, err + } + event, err := s.db.MaterializeSeries(ctx, req, occs, rule) + if err != nil { + return nil, err + } + return &pb.EventResp{Message: "series created", Event: event}, nil +} + +func (s *EventService) CancelSeriesOccurrence(ctx context.Context, req *pb.EventActionReq) (*pb.BasicResp, error) { + if err := s.db.CancelSeriesOccurrence(ctx, req.Slug, req.AccountId); err != nil { + return nil, err + } + return &pb.BasicResp{Message: "occurrence cancelled", Success: true}, nil +} diff --git a/microservices/the_monkeys_gateway/internal/admin/routes.go b/microservices/the_monkeys_gateway/internal/admin/routes.go index ecfeb8e0..8ff92c63 100644 --- a/microservices/the_monkeys_gateway/internal/admin/routes.go +++ b/microservices/the_monkeys_gateway/internal/admin/routes.go @@ -148,6 +148,14 @@ func RegisterAdminRouter(router *gin.Engine, cfg *config.Config, logg *zap.Sugar adminRoutes.POST("/backup/execute", asc.ExecuteBackup) } + // New admin apis + // GEt all the registered ussers with numbers of users + // GEt all blogs, published blogs, draft blogs, orphan blogs(available in elasticsearch but not present in postgres) + // Get VErification requests with stats of pending review, approved, rejected including pics available (make sure pics and videos are available local to admin and doesn't display on the homepage) + // Approve verification from daashboard itself + // CAn mark posts/images/accounts/events NSFW + // Add more looking at he db in postgrsss and elasticsearch in docker-compose.yaml + return asc } diff --git a/microservices/the_monkeys_gateway/internal/events/handler.go b/microservices/the_monkeys_gateway/internal/events/handler.go index 4afeab24..c9c831f8 100644 --- a/microservices/the_monkeys_gateway/internal/events/handler.go +++ b/microservices/the_monkeys_gateway/internal/events/handler.go @@ -59,6 +59,16 @@ func listQuery(ctx *gin.Context) *pb.ListEventsReq { DateFilter: ctx.Query("date"), SortBy: ctx.Query("sort"), } + + if lat, err := strconv.ParseFloat(ctx.Query("user_lat"), 64); err == nil { + req.UserLat = lat + } + if lng, err := strconv.ParseFloat(ctx.Query("user_lng"), 64); err == nil { + req.UserLng = lng + } + if radius, err := strconv.Atoi(ctx.DefaultQuery("radius", "0")); err == nil { + req.Radius = int32(radius) + } if tags := ctx.Query("tags"); tags != "" { req.Tags = strings.Split(tags, ",") } @@ -100,6 +110,61 @@ func (esc *EventServiceClient) CreateEvent(ctx *gin.Context) { ctx.JSON(http.StatusCreated, res) } +func (esc *EventServiceClient) CreateSeries(ctx *gin.Context) { + body, ok := bind[EventBody](ctx) + if !ok { + return + } + rec := body.Recurrence.toProto() + if rec == nil { + ctx.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"error": "recurrence is required"}) + return + } + + res, err := esc.Client.CreateSeries(ctx, &pb.CreateSeriesReq{ + AccountId: accountID(ctx), + Title: body.Title, + Description: body.Description, + StartTime: toTimestamp(&body.StartTime), + EndTime: toTimestamp(&body.EndTime), + Timezone: body.Timezone, + EventType: body.EventType, + Location: body.Location, + MeetingLink: body.MeetingLink, + Capacity: body.Capacity, + CoverImage: body.CoverImage, + Tags: body.Tags, + TicketTiers: tiersToProto(body.TicketTiers), + GroupSlug: body.GroupSlug, + Visibility: body.Visibility, + Recurrence: rec, + ClientInfo: clientInfo(ctx), + }) + if esc.fail(ctx, err, "create series") { + return + } + ctx.JSON(http.StatusCreated, res) +} + +func (esc *EventServiceClient) CloneEvent(ctx *gin.Context) { + body, ok := bind[CloneBody](ctx) + if !ok { + return + } + + res, err := esc.Client.CloneEvent(ctx, &pb.CloneEventReq{ + Slug: ctx.Param("slug"), + AccountId: accountID(ctx), + StartTime: toTimestamp(&body.StartTime), + EndTime: toTimestamp(&body.EndTime), + ClientInfo: clientInfo(ctx), + }) + if esc.fail(ctx, err, "clone event") { + return + } + ctx.JSON(http.StatusCreated, res) +} + func (esc *EventServiceClient) UpdateEvent(ctx *gin.Context) { body, ok := bind[EventBody](ctx) if !ok { diff --git a/microservices/the_monkeys_gateway/internal/events/models.go b/microservices/the_monkeys_gateway/internal/events/models.go index 6ef15ef4..039d09de 100644 --- a/microservices/the_monkeys_gateway/internal/events/models.go +++ b/microservices/the_monkeys_gateway/internal/events/models.go @@ -24,8 +24,39 @@ type EventBody struct { TicketTiers []TierBody `json:"ticket_tiers"` // GroupSlug attaches the event to a community the caller organizes; empty // means a standalone event. Visibility defaults to public server-side. - GroupSlug string `json:"group_slug"` - Visibility string `json:"visibility" binding:"omitempty,oneof=public group_members private unlisted"` + GroupSlug string `json:"group_slug"` + Visibility string `json:"visibility" binding:"omitempty,oneof=public group_members private unlisted"` + Recurrence *RecurrenceBody `json:"recurrence"` +} + +type RecurrenceBody struct { + Freq string `json:"freq"` + Interval int32 `json:"interval"` + ByDay []string `json:"by_day"` + Count int32 `json:"count"` + Until *time.Time `json:"until"` +} + +func (r *RecurrenceBody) toProto() *pb.Recurrence { + if r == nil || r.Freq == "" || r.Freq == "off" { + return nil + } + interval := r.Interval + if interval < 1 { + interval = 1 + } + return &pb.Recurrence{ + Freq: r.Freq, + Interval: interval, + ByDay: r.ByDay, + Count: r.Count, + Until: toTimestamp(r.Until), + } +} + +type CloneBody struct { + StartTime time.Time `json:"start_time" binding:"required"` + EndTime time.Time `json:"end_time" binding:"required"` } // TierBody is the JSON payload for a ticket tier. diff --git a/microservices/the_monkeys_gateway/internal/events/routes.go b/microservices/the_monkeys_gateway/internal/events/routes.go index f6f2e8d0..f3400e2a 100644 --- a/microservices/the_monkeys_gateway/internal/events/routes.go +++ b/microservices/the_monkeys_gateway/internal/events/routes.go @@ -73,7 +73,9 @@ func RegisterEventRouter(router *gin.Engine, cfg *config.Config, authClient *aut // Event lifecycle. Deleting an event is destructive enough to stay with // the organizer rather than delegate to co-hosts. write.POST("", esc.CreateEvent) + write.POST("/series", esc.CreateSeries) write.PUT("/:slug", guard.Require(authx.PermEditEvent), esc.UpdateEvent) + write.POST("/:slug/clone", guard.Require(authx.PermEditEvent), esc.CloneEvent) write.DELETE("/:slug", guard.RequireOrganizer(), esc.DeleteEvent) write.POST("/:slug/publish", guard.Require(authx.PermEditEvent), esc.PublishEvent) write.POST("/:slug/cancel", guard.Require(authx.PermEditEvent), esc.CancelEvent) diff --git a/microservices/the_monkeys_gateway/internal/groups/handler.go b/microservices/the_monkeys_gateway/internal/groups/handler.go index 212665b5..22eb6091 100644 --- a/microservices/the_monkeys_gateway/internal/groups/handler.go +++ b/microservices/the_monkeys_gateway/internal/groups/handler.go @@ -61,8 +61,20 @@ func (gsc *GroupServiceClient) ListGroups(ctx *gin.Context) { City: ctx.Query("city"), Query: ctx.Query("q"), AccountId: accountID(ctx), + Username: ctx.Param("username"), ClientInfo: clientInfo(ctx), } + + if lat, err := strconv.ParseFloat(ctx.Query("user_lat"), 64); err == nil { + req.UserLat = lat + } + if lng, err := strconv.ParseFloat(ctx.Query("user_lng"), 64); err == nil { + req.UserLng = lng + } + if radius, err := strconv.Atoi(ctx.DefaultQuery("radius", "0")); err == nil { + req.Radius = int32(radius) + } + if topics := ctx.QueryArray("topics"); len(topics) > 0 { req.Topics = topics } @@ -82,6 +94,7 @@ func (gsc *GroupServiceClient) GetUserGroups(ctx *gin.Context) { Limit: limit, Offset: offset, Status: ctx.Query("status"), + PublicOnly: ctx.Query("public_only") == "1" || ctx.Query("public_only") == "true", AccountId: accountID(ctx), Username: ctx.Param("username"), ClientInfo: clientInfo(ctx), diff --git a/microservices/the_monkeys_groups/internal/database/geocoding.go b/microservices/the_monkeys_groups/internal/database/geocoding.go new file mode 100644 index 00000000..29b72c36 --- /dev/null +++ b/microservices/the_monkeys_groups/internal/database/geocoding.go @@ -0,0 +1,66 @@ +package database + +import ( + "encoding/json" + "fmt" + "net/http" + "net/url" + "strings" + "time" +) + +// Geocode converts a free-text location into coordinates via Nominatim. +// Returns (0, 0) on empty input, miss, or error so callers can store NULL. +func Geocode(location string) (float64, float64) { + if strings.TrimSpace(location) == "" { + return 0, 0 + } + + reqURL := fmt.Sprintf( + "https://nominatim.openstreetmap.org/search?q=%s&format=json&limit=1", + url.QueryEscape(location), + ) + + req, err := http.NewRequest("GET", reqURL, nil) + if err != nil { + return 0, 0 + } + req.Header.Set("User-Agent", "TheMonkeysApp/1.0 (contact@monkeys.com.co)") + + resp, err := (&http.Client{Timeout: 5 * time.Second}).Do(req) + if err != nil { + return 0, 0 + } + defer resp.Body.Close() + if resp.StatusCode != http.StatusOK { + return 0, 0 + } + + var results []struct { + Lat string `json:"lat"` + Lon string `json:"lon"` + } + if err := json.NewDecoder(resp.Body).Decode(&results); err != nil || len(results) == 0 { + return 0, 0 + } + + var lat, lon float64 + fmt.Sscanf(results[0].Lat, "%f", &lat) + fmt.Sscanf(results[0].Lon, "%f", &lon) + return lat, lon +} + +// coordsFromPlace uses client-supplied coordinates when present, otherwise +// geocodes city, region, country. +func coordsFromPlace(lat, lng float64, city, region, country string) (float64, float64) { + if lat != 0 && lng != 0 { + return lat, lng + } + parts := make([]string, 0, 3) + for _, p := range []string{city, region, country} { + if s := strings.TrimSpace(p); s != "" { + parts = append(parts, s) + } + } + return Geocode(strings.Join(parts, ", ")) +} diff --git a/microservices/the_monkeys_groups/internal/database/groups.go b/microservices/the_monkeys_groups/internal/database/groups.go index 0b5ac0be..1fbd2eea 100644 --- a/microservices/the_monkeys_groups/internal/database/groups.go +++ b/microservices/the_monkeys_groups/internal/database/groups.go @@ -195,6 +195,8 @@ func (db *groupDB) CreateGroup(ctx context.Context, req *pb.CreateGroupReq) (*pb return nil, status.Error(codes.InvalidArgument, "group name is required") } + lat, lng := coordsFromPlace(req.Latitude, req.Longitude, req.City, req.Region, req.Country) + var out *pb.Group err := db.inTx(ctx, func(tx *sql.Tx) error { organizerID, err := resolveAccount(ctx, tx, req.AccountId) @@ -217,7 +219,7 @@ func (db *groupDB) CreateGroup(ctx context.Context, req *pb.CreateGroupReq) (*pb RETURNING id`, slug, req.Name, nullifyStr(req.Description), defaultVisibilityValue(req.Visibility), nullifyStr(req.City), nullifyStr(req.Region), nullifyStr(req.Country), timezone, - nullifyCoord(req.Latitude), nullifyCoord(req.Longitude), + nullifyCoord(lat), nullifyCoord(lng), nullifyStr(req.CoverImage), nullifyStr(req.LogoImage), organizerID, ).Scan(&groupID) if err != nil { @@ -251,6 +253,8 @@ func (db *groupDB) UpdateGroup(ctx context.Context, req *pb.UpdateGroupReq) (*pb return nil, status.Error(codes.InvalidArgument, "group name is required") } + lat, lng := coordsFromPlace(req.Latitude, req.Longitude, req.City, req.Region, req.Country) + var out *pb.Group err := db.inTx(ctx, func(tx *sql.Tx) error { groupID, _, err := authorizeGroup(ctx, tx, req.Slug, req.AccountId, permEditGroup) @@ -271,7 +275,7 @@ func (db *groupDB) UpdateGroup(ctx context.Context, req *pb.UpdateGroupReq) (*pb WHERE id = $1`, groupID, req.Name, nullifyStr(req.Description), defaultVisibilityValue(req.Visibility), nullifyStr(req.City), nullifyStr(req.Region), nullifyStr(req.Country), timezone, - nullifyCoord(req.Latitude), nullifyCoord(req.Longitude), + nullifyCoord(lat), nullifyCoord(lng), nullifyStr(req.CoverImage), nullifyStr(req.LogoImage)); err != nil { return status.Errorf(codes.Internal, "failed to update group: %v", err) } diff --git a/microservices/the_monkeys_groups/internal/database/search.go b/microservices/the_monkeys_groups/internal/database/search.go index af5ad6c7..c6cd1037 100644 --- a/microservices/the_monkeys_groups/internal/database/search.go +++ b/microservices/the_monkeys_groups/internal/database/search.go @@ -3,6 +3,7 @@ package database import ( "context" "database/sql" + "fmt" "strconv" "strings" @@ -109,6 +110,19 @@ func (db *groupDB) ListGroups(ctx context.Context, req *pb.ListGroupsReq) ([]*pb "WHERE t.group_id = g.id AND t.topic_name = ANY($"+strconv.Itoa(len(args))+"))") } + // Spatial radius filter: only include groups within `radius` km of the user. + if req.UserLat != 0 && req.UserLng != 0 && req.Radius > 0 { + args = append(args, req.UserLat, req.UserLng, req.UserLat, req.Radius) + latPos := len(args) - 3 + lngPos := len(args) - 2 + lat2Pos := len(args) - 1 + radiusPos := len(args) + conds = append(conds, fmt.Sprintf( + "g.latitude IS NOT NULL AND g.longitude IS NOT NULL AND "+ + "(6371 * acos(LEAST(GREATEST(cos(radians($%d)) * cos(radians(g.latitude)) * cos(radians(g.longitude) - radians($%d)) + sin(radians($%d)) * sin(radians(g.latitude)), -1), 1))) <= $%d", + latPos, lngPos, lat2Pos, radiusPos)) + } + where := " WHERE " + strings.Join(conds, " AND ") var total int32 @@ -123,9 +137,18 @@ func (db *groupDB) ListGroups(ctx context.Context, req *pb.ListGroupsReq) ([]*pb args = append(args, req.Offset) offsetPos := len(args) + orderBy := "g.member_count DESC, g.created_at DESC" + if req.UserLat != 0 && req.UserLng != 0 { + orderBy = fmt.Sprintf( + `(CASE WHEN g.latitude IS NULL OR g.longitude IS NULL THEN 1 ELSE 0 END), + (6371 * acos(LEAST(GREATEST(cos(radians(%f)) * cos(radians(g.latitude)) * cos(radians(g.longitude) - radians(%f)) + sin(radians(%f)) * sin(radians(g.latitude)), -1), 1))) ASC NULLS LAST, + g.member_count DESC`, + req.UserLat, req.UserLng, req.UserLat) + } + rows, err := db.db.QueryContext(ctx, "SELECT"+groupListColumns+groupFrom+where+ - " ORDER BY g.member_count DESC, g.created_at DESC"+ + " ORDER BY "+orderBy+ " LIMIT $"+strconv.Itoa(limitPos)+" OFFSET $"+strconv.Itoa(offsetPos), args...) if err != nil { return nil, 0, status.Error(codes.Internal, "failed to list groups") @@ -148,10 +171,10 @@ func (db *groupDB) GetUserGroups(ctx context.Context, req *pb.ListGroupsReq) ([] err error ) switch { - case strings.TrimSpace(req.AccountId) != "": - userID, err = resolveAccount(ctx, db.db, req.AccountId) case strings.TrimSpace(req.Username) != "": userID, err = resolveUsername(ctx, db.db, req.Username) + case strings.TrimSpace(req.AccountId) != "": + userID, err = resolveAccount(ctx, db.db, req.AccountId) default: return nil, 0, status.Error(codes.InvalidArgument, "account id or username is required") } @@ -162,15 +185,20 @@ func (db *groupDB) GetUserGroups(ctx context.Context, req *pb.ListGroupsReq) ([] const membershipJoin = ` JOIN group_members gm ON gm.group_id = g.id AND gm.user_id = $1 AND gm.status = 'active'` + publicFilter := "" + if req.PublicOnly { + publicFilter = " AND g.visibility = 'public' AND g.status = 'published'" + } + var total int32 if err = db.db.QueryRowContext(ctx, - "SELECT COUNT(1)"+groupFrom+membershipJoin, userID).Scan(&total); err != nil { + "SELECT COUNT(1)"+groupFrom+membershipJoin+publicFilter, userID).Scan(&total); err != nil { return nil, 0, status.Error(codes.Internal, "failed to count user groups") } limit := clampLimit(req.Limit) rows, err := db.db.QueryContext(ctx, - "SELECT"+groupListColumns+", gm.role"+groupFrom+membershipJoin+ + "SELECT"+groupListColumns+", gm.role"+groupFrom+membershipJoin+publicFilter+ " ORDER BY g.name ASC LIMIT $2 OFFSET $3", userID, limit, req.Offset) if err != nil { return nil, 0, status.Error(codes.Internal, "failed to list user groups") diff --git a/schema/000014_add_event_group_coordinates.down.sql b/schema/000014_add_event_group_coordinates.down.sql new file mode 100644 index 00000000..1e6d3207 --- /dev/null +++ b/schema/000014_add_event_group_coordinates.down.sql @@ -0,0 +1,5 @@ +-- Reverse 000014: drop only what the up migration created. +DROP INDEX IF EXISTS idx_events_lat_lng; + +ALTER TABLE events DROP COLUMN IF EXISTS latitude; +ALTER TABLE events DROP COLUMN IF EXISTS longitude; diff --git a/schema/000014_add_event_group_coordinates.up.sql b/schema/000014_add_event_group_coordinates.up.sql new file mode 100644 index 00000000..6b1f1850 --- /dev/null +++ b/schema/000014_add_event_group_coordinates.up.sql @@ -0,0 +1,6 @@ +-- Add geographic coordinates to events for radius / nearest searches. +-- groups already has latitude/longitude from 000011_meetup_communities. +ALTER TABLE events ADD COLUMN IF NOT EXISTS latitude double precision; +ALTER TABLE events ADD COLUMN IF NOT EXISTS longitude double precision; + +CREATE INDEX IF NOT EXISTS idx_events_lat_lng ON events (latitude, longitude);