diff --git a/.gitignore b/.gitignore index 61dbdb39c8..ef0029f9fa 100644 --- a/.gitignore +++ b/.gitignore @@ -137,6 +137,7 @@ build.yml # bscp 软连接 bcs-services/bscp.io .vscode +__debug_* bcs-scenarios/bcs-kourse-rollout/bin/* diff --git a/bcs-services/bcs-bscp/cmd/cache-service/service/cache/client/client.go b/bcs-services/bcs-bscp/cmd/cache-service/service/cache/client/client.go index 88c95ecb14..a066707e6e 100644 --- a/bcs-services/bcs-bscp/cmd/cache-service/service/cache/client/client.go +++ b/bcs-services/bcs-bscp/cmd/cache-service/service/cache/client/client.go @@ -16,11 +16,14 @@ package client import ( "context" + "github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/cmd/cache-service/service/cache/keys" "github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/pkg/dal/bedis" "github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/pkg/dal/dao" "github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/pkg/dal/table" "github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/pkg/kit" "github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/pkg/logs" + pbclient "github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/pkg/protocol/core/client" + pbce "github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/pkg/protocol/core/client-event" pbds "github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/pkg/protocol/data-service" "github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/pkg/runtime/jsoni" "github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/pkg/runtime/lock" @@ -37,6 +40,8 @@ type Interface interface { RefreshAppCache(kt *kit.Kit, bizID uint32, appID uint32) error GetReleasedKv(kt *kit.Kit, bizID uint32, releaseID uint32) (string, error) GetReleasedKvValue(kt *kit.Kit, bizID, appID, releaseID uint32, key string) (string, error) + SetClientMetric(kt *kit.Kit, bizID, appID uint32, payload []byte) error + BatchUpsertClientMetrics(kt *kit.Kit, clientData []*pbclient.Client, clientEventData []*pbce.ClientEvent) error } // New initialize a cache client. @@ -103,3 +108,25 @@ func (c *client) RefreshAppCache(kt *kit.Kit, bizID uint32, appID uint32) error return nil } + +// SetClientMetric set client metric data +func (c *client) SetClientMetric(kt *kit.Kit, bizID, appID uint32, payload []byte) error { + if err := c.bds.LPush(kt.Ctx, keys.Key.ClientMetricKey(bizID, appID), payload); err != nil { + return err + } + return nil +} + +// BatchUpsertClientMetrics batch upsert client metrics data +func (c *client) BatchUpsertClientMetrics(kt *kit.Kit, clientData []*pbclient.Client, + clientEventData []*pbce.ClientEvent) error { + in := &pbds.BatchUpsertClientMetricsReq{ + ClientItems: clientData, + ClientEventItems: clientEventData, + } + _, err := c.db.BatchUpsertClientMetrics(kt.Ctx, in) + if err != nil { + return err + } + return nil +} diff --git a/bcs-services/bcs-bscp/cmd/cache-service/service/cache/event/client_metric.go b/bcs-services/bcs-bscp/cmd/cache-service/service/cache/event/client_metric.go new file mode 100644 index 0000000000..8b29fe43b7 --- /dev/null +++ b/bcs-services/bcs-bscp/cmd/cache-service/service/cache/event/client_metric.go @@ -0,0 +1,321 @@ +/* + * Tencent is pleased to support the open source community by making Blueking Container Service available. + * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. + * Licensed under the MIT License (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * http://opensource.org/licenses/MIT + * Unless required by applicable law or agreed to in writing, software distributed under + * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, + * either express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Package event handle client metric +package event + +import ( + "context" + "fmt" + "regexp" + "time" + + "github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/cmd/cache-service/service/cache/client" + "github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/pkg/dal/bedis" + "github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/pkg/dal/dao" + "github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/pkg/kit" + "github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/pkg/logs" + pbclient "github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/pkg/protocol/core/client" + pbce "github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/pkg/protocol/core/client-event" + "github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/pkg/runtime/jsoni" + "github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/pkg/runtime/shutdown" + "github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/pkg/serviced" + sfs "github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/pkg/sf-share" +) + +const ( + defaultClientMetricTaskInterval = 10 * time.Second + clientMetricPattern = `*bscp:client-metric:*` + clientMetricKey = `\{\d+\}bscp:client-metric:\d+` +) + +// ClientMetric xxx +type ClientMetric struct { + set dao.Set + state serviced.State + bds bedis.Client + op client.Interface +} + +// NewClientMetric init client metric +func NewClientMetric(set dao.Set, state serviced.State, bds bedis.Client, op client.Interface) ClientMetric { + return ClientMetric{ + set: set, + state: state, + bds: bds, + op: op, + } +} + +// Run the client metric task +func (cm *ClientMetric) Run() { + logs.Infof("start client metric task") + notifier := shutdown.AddNotifier() + go func() { + ticker := time.NewTicker(defaultClientMetricTaskInterval) + defer ticker.Stop() + for { + kt := kit.New() + ctx, cancel := context.WithCancel(kt.Ctx) + kt.Ctx = ctx + + select { + case <-notifier.Signal: + logs.Infof("stop handle client metric data success") + cancel() + notifier.Done() + return + case <-ticker.C: + logs.Infof("start handle client metric data") + + if !cm.state.IsMaster() { + logs.V(2).Infof("this is slave, do not need to handle, skip. rid: %s", kt.Rid) + time.Sleep(sleepTime) + continue + } + cm.consumeClientMetricData(kt) + } + } + }() +} + +// 消费队列中的 client metric 数据 +func (cm *ClientMetric) consumeClientMetricData(kt *kit.Kit) { + // 先获取符合规则的key + keys, err := cm.matchKeys() + if err != nil { + logs.Errorf("the KEY is not matched, err: %s, rid: %s", err.Error(), kt.Rid) + return + } + if len(keys) == 0 { + logs.V(2).Infof("there is no matching KEY, rid: %s", kt.Rid) + return + } + for _, key := range keys { + lLen, err := cm.bds.LLen(kt.Ctx, key) + if err != nil { + logs.Errorf("get key: %s list length failed, err: %s", key, err.Error()) + continue + } + if lLen != 0 { + cm.getClientMetricList(kt, key, lLen) + } + } +} + +// 获取 client metric 数据列表 +func (cm *ClientMetric) getClientMetricList(kt *kit.Kit, key string, listLen int64) { + batchSize := 1000 + for i := 0; i < int(listLen); i += batchSize { + startIndex := int64(i) + endIndex := int64(i + batchSize - 1) + if endIndex >= listLen { + endIndex = listLen - 1 + } + list, err := cm.bds.LRange(kt.Ctx, key, startIndex, endIndex) + if err != nil { + logs.Errorf("get key: %s %v to %v client metric data failed, rid: %s, err: %s ", key, + startIndex, endIndex, kt.Rid, err.Error()) + continue + } + err = cm.handleClientMetricData(kt, list) + if err != nil { + logs.Errorf("handle client metric data failed, rid: %s, err: %s", kt.Rid, err.Error()) + continue + } + + _, err = cm.bds.LTrim(kt.Ctx, key, endIndex+1, -1) + if err != nil { + logs.Errorf("delete the Specify keys values data failed, key: %s, rid: %s, err: %s", key, kt.Rid, err.Error()) + continue + } + } + +} + +// 处理 client metric 数据 +// client 表是按照 业务+服务+客户端 维度:数据做聚合 +// 多条心跳把每条每一列中的最大值取出来,组合成一条 +// 多条变更数据只需要最后一条 +// client event 表是按照 业务+服务+事件ID 维度:数据做聚合 +func (cm *ClientMetric) handleClientMetricData(kt *kit.Kit, payload []string) error { // nolint + vc := new(sfs.VersionChangePayload) + hb := new(sfs.HeartbeatItem) + clientData := make([]*pbclient.Client, 0) + clientEventData := make([]*pbce.ClientEvent, 0) + + vcClientEvent := map[string]*pbce.ClientEvent{} + hbClientEvent := map[string]*pbce.ClientEvent{} + + hbClient := map[string]*pbclient.Client{} + vcClient := map[string]*pbclient.Client{} + + maxResourceUsageValues := make(map[string]*pbclient.ClientResource) + + clientMetricData := sfs.ClientMetricData{} + for _, v := range payload { + err := jsoni.Unmarshal([]byte(v), &clientMetricData) + if err != nil { + return err + } + switch sfs.MessagingType(clientMetricData.MessagingType) { + case sfs.Heartbeat: + err = jsoni.Unmarshal(clientMetricData.Payload, hb) + if err != nil { + return err + } + + hb.Application.AppID = clientMetricData.AppID + clientMetric, errHb := hb.PbClientMetric() + if errHb != nil { + return errHb + } + if clientMetric == nil { + continue + } + key := fmt.Sprintf("%d-%d-%s", clientMetric.Attachment.BizId, + clientMetric.Attachment.AppId, clientMetric.Attachment.Uid) + // 如果 key 已存在,比较并更新最大值 + if existing, ok := maxResourceUsageValues[key]; ok { + if clientMetric.Spec.Resource.CpuMaxUsage > existing.CpuMaxUsage { + existing.CpuMaxUsage = clientMetric.Spec.Resource.CpuMaxUsage + } + if clientMetric.Spec.Resource.CpuUsage > existing.CpuUsage { + existing.CpuUsage = clientMetric.Spec.Resource.CpuUsage + } + if clientMetric.Spec.Resource.MemoryMaxUsage > existing.MemoryMaxUsage { + existing.MemoryMaxUsage = clientMetric.Spec.Resource.MemoryMaxUsage + } + if clientMetric.Spec.Resource.MemoryUsage > existing.MemoryUsage { + existing.MemoryUsage = clientMetric.Spec.Resource.MemoryUsage + } + maxResourceUsageValues[key] = existing + } else { + maxResourceUsageValues[key] = &pbclient.ClientResource{ + CpuMaxUsage: clientMetric.Spec.Resource.CpuMaxUsage, + CpuUsage: clientMetric.Spec.Resource.CpuUsage, + MemoryUsage: clientMetric.Spec.Resource.MemoryUsage, + MemoryMaxUsage: clientMetric.Spec.Resource.MemoryMaxUsage, + } + } + clientMetric.Spec.Resource = maxResourceUsageValues[key] + hbClient[key] = clientMetric + // 处理clientEvent数据 + clientEventMetric, ceErr := hb.PbClientEventMetric() + if ceErr != nil { + return ceErr + } + hbClientEvent = lastClientEventData(clientEventMetric, hbClientEvent) + case sfs.VersionChangeMessage: + err = vc.Decode(clientMetricData.Payload) + if err != nil { + return err + } + vc.Application.AppID = clientMetricData.AppID + clientMetric, errCeVc := vc.PbClientMetric() + if errCeVc != nil { + return errCeVc + } + vcClient = lastClientData(clientMetric, vcClient) + clientEventMetric, errVc := vc.PbClientEventMetric() + if errVc != nil { + return errVc + } + vcClientEvent = lastClientEventData(clientEventMetric, vcClientEvent) + } + } + + for _, v := range vcClient { + clientData = append(clientData, v) + } + for _, v := range hbClient { + clientData = append(clientData, v) + } + for _, v := range vcClientEvent { + clientEventData = append(clientEventData, v) + } + for _, v := range hbClientEvent { + clientEventData = append(clientEventData, v) + } + + err := cm.op.BatchUpsertClientMetrics(kt, clientData, clientEventData) + if err != nil { + logs.Errorf("batch upsert client metrics failed, rid: %s, err: %s", kt.Rid, err.Error()) + return err + } + + return nil +} + +// matchKeys xxx +func (cm *ClientMetric) matchKeys() ([]string, error) { + kt := kit.New() + keys, err := cm.bds.Keys(kt.Ctx, clientMetricPattern) + if err != nil { + return nil, err + } + // 再次过滤 + keys, err = filterKeysByRegex(keys, clientMetricKey) + if err != nil { + return nil, err + } + return keys, nil +} + +// filterKeysByRegex 使用正则表达式筛选符合规则的键 +func filterKeysByRegex(keys []string, pattern string) ([]string, error) { + re, err := regexp.Compile(pattern) + if err != nil { + return nil, err + } + var matchingKeys []string + for _, key := range keys { + if re.MatchString(key) { + matchingKeys = append(matchingKeys, key) + } + } + return matchingKeys, nil +} + +// 过滤出最后一条数据 +func lastClientData(clientMetric *pbclient.Client, clientMap map[string]*pbclient.Client) map[string]*pbclient.Client { + if clientMetric == nil { + return nil + } + key := fmt.Sprintf("%d-%d-%s", clientMetric.Attachment.BizId, + clientMetric.Attachment.AppId, clientMetric.Attachment.Uid) + if p, ok := clientMap[key]; ok { + if p.Spec.LastHeartbeatTime.AsTime().After(clientMetric.Spec.LastHeartbeatTime.AsTime()) { + clientMap[key] = p + } + } else { + clientMap[key] = clientMetric + } + return clientMap +} + +func lastClientEventData(clientEventMetric *pbce.ClientEvent, + clientEventMap map[string]*pbce.ClientEvent) map[string]*pbce.ClientEvent { + if clientEventMetric == nil { + return nil + } + key := fmt.Sprintf("%d-%d-%s", clientEventMetric.Attachment.BizId, + clientEventMetric.Attachment.AppId, clientEventMetric.Attachment.CursorId) + if p, ok := clientEventMap[key]; ok { + if p.HeartbeatTime.AsTime().After(clientEventMetric.HeartbeatTime.AsTime()) { + clientEventMap[key] = p + } + } else { + clientEventMap[key] = clientEventMetric + } + return clientEventMap +} diff --git a/bcs-services/bcs-bscp/cmd/cache-service/service/cache/keys/cache.go b/bcs-services/bcs-bscp/cmd/cache-service/service/cache/keys/cache.go index fbf008c7cf..76b5ed0dea 100644 --- a/bcs-services/bcs-bscp/cmd/cache-service/service/cache/keys/cache.go +++ b/bcs-services/bcs-bscp/cmd/cache-service/service/cache/keys/cache.go @@ -48,6 +48,7 @@ const ( appMeta namespace = "app-meta" appID namespace = "app-id" releasedKv namespace = "released-kv" + clientMetric namespace = "client-metric" ) type keyGenerator struct { @@ -62,6 +63,15 @@ type keyGenerator struct { appHasRITTLRange [2]int } +// ClientMetricKey generate the client metric cache key. +func (k keyGenerator) ClientMetricKey(bizID uint32, appID uint32) string { + return element{ + biz: bizID, + ns: clientMetric, + key: strconv.FormatUint(uint64(appID), 10), + }.String() +} + // ReleasedGroup generate a release's released group cache key to save all the released groups under this release func (k keyGenerator) ReleasedGroup(bizID uint32, appID uint32) string { return element{ diff --git a/bcs-services/bcs-bscp/cmd/cache-service/service/feed.go b/bcs-services/bcs-bscp/cmd/cache-service/service/feed.go index 0cdf642a55..a34f48ae54 100644 --- a/bcs-services/bcs-bscp/cmd/cache-service/service/feed.go +++ b/bcs-services/bcs-bscp/cmd/cache-service/service/feed.go @@ -226,3 +226,14 @@ func (s *Service) ListEventsMeta(ctx context.Context, req *pbcs.ListEventsReq) ( return &pbcs.ListEventsResp{List: pbcs.PbEventMeta(metas)}, nil } + +// SetClientMetric set client metric +func (s *Service) SetClientMetric(ctx context.Context, req *pbcs.SetClientMetricReq) (*pbcs.SetClientMetricResp, + error) { + kt := kit.FromGrpcContext(ctx) + err := s.op.SetClientMetric(kt, req.BizId, req.AppId, req.Payload) + if err != nil { + return nil, err + } + return &pbcs.SetClientMetricResp{}, nil +} diff --git a/bcs-services/bcs-bscp/cmd/cache-service/service/service.go b/bcs-services/bcs-bscp/cmd/cache-service/service/service.go index b1f1c0ec55..d07945bc5c 100644 --- a/bcs-services/bcs-bscp/cmd/cache-service/service/service.go +++ b/bcs-services/bcs-bscp/cmd/cache-service/service/service.go @@ -41,7 +41,8 @@ func NewService(sd serviced.State, daoSet dao.Set, bs bedis.Client, op client.In if err != nil { return nil, fmt.Errorf("run event handling task failed, err: %v", err) } - + metric := event.NewClientMetric(daoSet, sd, bs, op) + metric.Run() gateway, err := newGateway(sd, daoSet, bs) if err != nil { return nil, fmt.Errorf("new gateway failed, err: %v", err) diff --git a/bcs-services/bcs-bscp/cmd/data-service/app/app.go b/bcs-services/bcs-bscp/cmd/data-service/app/app.go index 163dafeeda..d2e8a3966c 100644 --- a/bcs-services/bcs-bscp/cmd/data-service/app/app.go +++ b/bcs-services/bcs-bscp/cmd/data-service/app/app.go @@ -29,6 +29,7 @@ import ( "github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/cmd/data-service/options" "github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/cmd/data-service/service" + "github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/cmd/data-service/service/crontab" "github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/pkg/cc" "github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/pkg/criteria/uuid" "github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/pkg/dal/dao" @@ -133,6 +134,10 @@ func (ds *dataService) prepare(opt *options.Option) error { ds.daoSet = set + // 同步客户端在线状态 + state := crontab.NewSyncClientOnlineState(ds.daoSet, ds.sd) + state.Run() + // initial Vault set vaultSet, err := vault.NewSet(cc.DataService().Vault) if err != nil { diff --git a/bcs-services/bcs-bscp/cmd/data-service/db-migration/migrations/20231212174648_add_client.go b/bcs-services/bcs-bscp/cmd/data-service/db-migration/migrations/20231212174648_add_client.go new file mode 100644 index 0000000000..0a9cea5540 --- /dev/null +++ b/bcs-services/bcs-bscp/cmd/data-service/db-migration/migrations/20231212174648_add_client.go @@ -0,0 +1,93 @@ +/* + * Tencent is pleased to support the open source community by making Blueking Container Service available. + * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. + * Licensed under the MIT License (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * http://opensource.org/licenses/MIT + * Unless required by applicable law or agreed to in writing, software distributed under + * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, + * either express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + +package migrations + +import ( + "time" + + "gorm.io/gorm" + + "github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/cmd/data-service/db-migration/migrator" +) + +func init() { + // add current migration to migrator + migrator.GetMigrator().AddMigration(&migrator.Migration{ + Version: "20231212174648", + Name: "20231212174648_add_client", + Mode: migrator.GormMode, + Up: mig20231212174648Up, + Down: mig20231212174648Down, + }) +} + +// mig20231212174648Up for up migration +func mig20231212174648Up(tx *gorm.DB) error { + // Clients : client + type Clients struct { + ID uint `gorm:"column:id;type:bigint(1) unsigned;primary_key;autoIncrement:false"` + + BizID uint `gorm:"type:bigint(1) unsigned not null;uniqueIndex:idx_bizID_appID_uid,priority:1"` + APPID uint `gorm:"type:bigint(1) unsigned not null;uniqueIndex:idx_bizID_appID_uid,priority:2"` + UID string `gorm:"column:uid;type:varchar(64);NOT NULL;uniqueIndex:idx_bizID_appID_uid,priority:3"` + + ClientVersion string `gorm:"column:client_version;type:varchar(150);default:'';NOT NULL"` + ClientType string `gorm:"column:client_type;type:varchar(20);default:'';NOT NULL"` + Ip string `gorm:"column:ip;type:varchar(16);default:'';NOT NULL"` + Labels string `gorm:"column:labels;type:json;default:NULL"` + Annotations string `gorm:"column:annotations;type:json;default:NULL"` + FirstConnectTime time.Time `gorm:"column:first_connect_time;type:datetime(6);default:NULL"` + LastHeartbeatTime time.Time `gorm:"column:last_heartbeat_time;type:datetime(6);default:NULL;index:idx_lastHeartbeatTime_onlineStatus,priority:1"` // nolint + OnlineStatus string `gorm:"column:online_status;type:varchar(20);default:'';NOT NULL;index:idx_lastHeartbeatTime_onlineStatus,priority:2"` // nolint + CpuUsage float64 `gorm:"column:cpu_usage;type:double unsigned;default:0;NOT NULL"` + CpuMaxUsage float64 `gorm:"column:cpu_max_usage;type:double unsigned;default:0;NOT NULL"` + MemoryUsage uint64 `gorm:"column:memory_usage;type:bigint(1) unsigned;default:0;NOT NULL"` + MemoryMaxUsage uint64 `gorm:"column:memory_max_usage;type:bigint(1) unsigned;default:0;NOT NULL"` + CurrentReleaseID uint `gorm:"column:current_release_id;type:bigint(1) unsigned;default:0;NOT NULL"` + TargetReleaseID uint `gorm:"column:target_release_id;type:bigint(1) unsigned;default:0;NOT NULL"` + ReleaseChangeStatus string `gorm:"column:release_change_status;type:varchar(20);default:'';NOT NULL"` + ReleaseChangeFailedReason string `gorm:"column:release_change_failed_reason;type:varchar(20);default:'';NOT NULL"` + FailedDetailReason string `gorm:"column:failed_detail_reason;type:varchar(255);default:'';NOT NULL"` + } + + // IDGenerators : ID生成器 + type IDGenerators struct { + ID uint `gorm:"type:bigint(1) unsigned not null;primaryKey"` + Resource string `gorm:"type:varchar(50) not null;uniqueIndex:idx_resource"` + MaxID uint `gorm:"type:bigint(1) unsigned not null"` + UpdatedAt time.Time `gorm:"type:datetime(6) not null"` + } + + if err := tx.Set("gorm:table_options", "ENGINE=InnoDB CHARSET=utf8mb4"). + AutoMigrate(&Clients{}); err != nil { + return err + } + + now := time.Now() + if result := tx.Create([]IDGenerators{ + {Resource: "clients", MaxID: 0, UpdatedAt: now}, + }); result.Error != nil { + return result.Error + } + return nil + +} + +// mig20231212174648Down for down migration +func mig20231212174648Down(tx *gorm.DB) error { + if err := tx.Migrator().DropTable("model_example"); err != nil { + return err + } + + return nil +} diff --git a/bcs-services/bcs-bscp/cmd/data-service/db-migration/migrations/20231212174736_add_client_event.go b/bcs-services/bcs-bscp/cmd/data-service/db-migration/migrations/20231212174736_add_client_event.go new file mode 100644 index 0000000000..1a8314078f --- /dev/null +++ b/bcs-services/bcs-bscp/cmd/data-service/db-migration/migrations/20231212174736_add_client_event.go @@ -0,0 +1,92 @@ +/* + * Tencent is pleased to support the open source community by making Blueking Container Service available. + * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. + * Licensed under the MIT License (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * http://opensource.org/licenses/MIT + * Unless required by applicable law or agreed to in writing, software distributed under + * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, + * either express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + +package migrations + +import ( + "time" + + "gorm.io/gorm" + + "github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/cmd/data-service/db-migration/migrator" +) + +func init() { + // add current migration to migrator + migrator.GetMigrator().AddMigration(&migrator.Migration{ + Version: "20231212174736", + Name: "20231212174736_add_client_event", + Mode: migrator.GormMode, + Up: mig20231212174736Up, + Down: mig20231212174736Down, + }) +} + +// mig20231212174736Up for up migration +func mig20231212174736Up(tx *gorm.DB) error { + // ClientEvents : ClientEvents + type ClientEvents struct { + ID uint `gorm:"column:id;type:bigint(1) unsigned;primary_key"` + ClientID uint `gorm:"column:client_id;type:bigint(1) unsigned;NOT NULL;index:idx_clientID,priority:1"` + CursorID string `gorm:"column:cursor_id;type:varchar(128);NOT NULL;uniqueIndex:idx_bizID_appID_uid_cursorID,priority:1"` // nolint + + BizID uint `gorm:"type:bigint(1) unsigned not null;uniqueIndex:idx_bizID_appID_uid_cursorID,priority:2"` + AppID uint `gorm:"type:bigint(1) unsigned not null;uniqueIndex:idx_bizID_appID_uid_cursorID,priority:3"` + + UID string `gorm:"column:uid;type:varchar(64);NOT NULL;uniqueIndex:idx_bizID_appID_uid_cursorID,priority:4"` // nolint + ClientMode string `gorm:"column:client_mode;type:varchar(20);default:'';NOT NULL;"` + OriginalReleaseID uint `gorm:"column:original_release_id;type:bigint(1) unsigned;default:0;NOT NULL"` + TargetReleaseID uint `gorm:"column:target_release_id;type:bigint(1) unsigned;default:0;NOT NULL"` + StartTime time.Time `gorm:"column:start_time;type:datetime(6);default:NULL"` + EndTime time.Time `gorm:"column:end_time;type:datetime(6);default:NULL"` + TotalSeconds float64 `gorm:"column:total_seconds;type:double unsigned;default:0;NOT NULL"` + TotalFileSize float64 `gorm:"column:total_file_size;type:double unsigned;default:0;NOT NULL"` + DownloadFileSize float64 `gorm:"column:download_file_size;type:double unsigned;default:0;NOT NULL"` + TotalFileNum uint `gorm:"column:total_file_num;type:int(3) unsigned;default:0;NOT NULL"` + DownloadFileNum uint `gorm:"column:download_file_num;type:int(3) unsigned;default:0;NOT NULL"` + ReleaseChangeStatus string `gorm:"column:release_change_status;type:varchar(20);default:;NOT NULL"` + ReleaseChangeFailedReason string `gorm:"column:release_change_failed_reason;type:varchar(20);default:'';NOT NULL"` + FailedDetailReason string `gorm:"column:failed_detail_reason;type:varchar(255);default:'';NOT NULL"` + } + + // IDGenerators : ID生成器 + type IDGenerators struct { + ID uint `gorm:"type:bigint(1) unsigned not null;primaryKey"` + Resource string `gorm:"type:varchar(50) not null;uniqueIndex:idx_resource"` + MaxID uint `gorm:"type:bigint(1) unsigned not null"` + UpdatedAt time.Time `gorm:"type:datetime(6) not null"` + } + + if err := tx.Set("gorm:table_options", "ENGINE=InnoDB CHARSET=utf8mb4"). + AutoMigrate(&ClientEvents{}); err != nil { + return err + } + + now := time.Now() + if result := tx.Create([]IDGenerators{ + {Resource: "client_events", MaxID: 0, UpdatedAt: now}, + }); result.Error != nil { + return result.Error + } + + return nil + +} + +// mig20231212174736Down for down migration +func mig20231212174736Down(tx *gorm.DB) error { + if err := tx.Migrator().DropTable("model_example"); err != nil { + return err + } + + return nil +} diff --git a/bcs-services/bcs-bscp/cmd/data-service/service/client.go b/bcs-services/bcs-bscp/cmd/data-service/service/client.go new file mode 100644 index 0000000000..fbe229c584 --- /dev/null +++ b/bcs-services/bcs-bscp/cmd/data-service/service/client.go @@ -0,0 +1,221 @@ +/* + * Tencent is pleased to support the open source community by making Blueking Container Service available. + * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. + * Licensed under the MIT License (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * http://opensource.org/licenses/MIT + * Unless required by applicable law or agreed to in writing, software distributed under + * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, + * either express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + +package service + +import ( + "context" + "fmt" + "sort" + + "google.golang.org/protobuf/types/known/timestamppb" + + "github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/pkg/dal/table" + "github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/pkg/kit" + "github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/pkg/logs" + pbclient "github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/pkg/protocol/core/client" + pbds "github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/pkg/protocol/data-service" + sfs "github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/pkg/sf-share" +) + +// BatchUpsertClientMetrics 批量操作client metrics +func (s *Service) BatchUpsertClientMetrics(ctx context.Context, req *pbds.BatchUpsertClientMetricsReq) ( // nolint + *pbds.BatchUpsertClientMetricsResp, error) { + kt := kit.FromGrpcContext(ctx) + + var err error + toCreate := make([]*table.Client, 0) + clientUpdateData := make([]*pbclient.Client, 0) + if len(req.GetClientItems()) != 0 { + toCreate, clientUpdateData, err = s.handleBatchCreateClients(kt, req.GetClientItems()) + if err != nil { + return nil, err + } + } + + tx := s.dao.GenQuery().Begin() + err = s.dao.Client().BatchCreateWithTx(kt, tx, toCreate) + if err != nil { + if rErr := tx.Rollback(); rErr != nil { + logs.Errorf("transaction rollback failed, err: %v, rid: %s", rErr, kt.Rid) + } + return nil, err + } + + createID := make(map[string]uint32) + for _, item := range toCreate { + key := fmt.Sprintf("%d-%d-%s", item.Attachment.BizID, item.Attachment.AppID, item.Attachment.UID) + createID[key] = item.ID + } + + updateID := make(map[string]uint32) + if len(clientUpdateData) > 0 { + s.updatePrimaryKey(clientUpdateData, createID) + // 根据类型更新对应字段 + heartbeatData := []*table.Client{} + versionChangeData := []*table.Client{} + for _, item := range clientUpdateData { + key := fmt.Sprintf("%d-%d-%s", item.Attachment.BizId, item.Attachment.AppId, item.Attachment.Uid) + updateID[key] = item.Id + switch item.MessageType { + case "Heartbeat": + heartbeatData = append(heartbeatData, &table.Client{ + ID: item.Id, + Attachment: item.Attachment.ClientAttachment(), + Spec: item.Spec.ClientSpec(), + }) + case "VersionChange": + versionChangeData = append(versionChangeData, &table.Client{ + ID: item.Id, + Attachment: item.Attachment.ClientAttachment(), + Spec: item.Spec.ClientSpec(), + }) + } + } + if len(heartbeatData) != 0 { + err = s.dao.Client().BatchUpdateSelectFieldTx(kt, tx, sfs.Heartbeat, heartbeatData) + if err != nil { + if rErr := tx.Rollback(); rErr != nil { + logs.Errorf("transaction rollback failed, err: %v, rid: %s", rErr, kt.Rid) + } + return nil, err + } + } + if len(versionChangeData) != 0 { + err = s.dao.Client().BatchUpdateSelectFieldTx(kt, tx, sfs.VersionChangeMessage, versionChangeData) + if err != nil { + if rErr := tx.Rollback(); rErr != nil { + logs.Errorf("transaction rollback failed, err: %v, rid: %s", rErr, kt.Rid) + } + return nil, err + } + } + } + + if len(req.GetClientEventItems()) != 0 { + mergedMap := make(map[string]uint32) + for key, value := range createID { + mergedMap[key] = value + } + for key, value := range updateID { + if _, exists := mergedMap[key]; !exists { + mergedMap[key] = value + } + } + + err = s.doBatchCreateClientEvents(kt, tx, req.GetClientEventItems(), mergedMap) + if err != nil { + if rErr := tx.Rollback(); rErr != nil { + logs.Errorf("transaction rollback failed, err: %v, rid: %s", rErr, kt.Rid) + } + return nil, err + } + } + + if e := tx.Commit(); e != nil { + logs.Errorf("commit transaction failed, err: %v, rid: %s", e, kt.Rid) + return nil, e + } + return &pbds.BatchUpsertClientMetricsResp{}, nil +} + +func (s *Service) handleBatchCreateClients(kt *kit.Kit, clients []*pbclient.Client) (toCreate []*table.Client, + clientUpdateData []*pbclient.Client, err error) { + data := [][]interface{}{} + oldData := make(map[string]*table.Client) + + clientCreateData := []*pbclient.Client{} + clientUpdateData = []*pbclient.Client{} + + for _, item := range clients { + data = append(data, []interface{}{item.Attachment.BizId, item.Attachment.AppId, item.Attachment.Uid}) + } + tuple, err := s.dao.Client().ListClientByTuple(kt, data) + if err != nil { + return nil, nil, err + } + if len(tuple) != 0 { + for _, item := range tuple { + key := fmt.Sprintf("%d-%d-%s", item.Attachment.BizID, item.Attachment.AppID, item.Attachment.UID) + oldData[key] = item + } + } + + // 以心跳时间排序时间asc + sort.Slice(clients, func(i, j int) bool { + return clients[i].Spec.LastHeartbeatTime.AsTime().Before(clients[j].Spec.LastHeartbeatTime.AsTime()) + }) + for _, item := range clients { + key := fmt.Sprintf("%d-%d-%s", item.Attachment.BizId, item.Attachment.AppId, item.Attachment.Uid) + v, ok := oldData[key] + // 判断数据是否存在 + if !ok { + clientCreateData = append(clientCreateData, &pbclient.Client{ + Attachment: item.GetAttachment(), + Spec: item.GetSpec(), + MessageType: item.MessageType, + }) + } else { + // 处理第一次连接时间 + item.Spec.FirstConnectTime = timestamppb.New(v.Spec.FirstConnectTime) + if item.Spec.ReleaseChangeStatus != sfs.Success.String() { + item.Spec.CurrentReleaseId = v.Spec.CurrentReleaseID + } + clientUpdateData = append(clientUpdateData, &pbclient.Client{ + Id: v.ID, // 只需要填充ID + Attachment: item.GetAttachment(), + Spec: item.Spec, + MessageType: item.MessageType, + }) + } + } + + // 通过时间排序 + sort.Slice(clientCreateData, func(i, j int) bool { + return clientCreateData[i].Spec.LastHeartbeatTime.AsTime().Before(clientCreateData[j].Spec.LastHeartbeatTime.AsTime()) + }) + + // Client数据会存在同一维度下多个类型的消息 + // 如果同一维度下的数据都存在那么都是更新 + // 如果同一维度下的数据不存在,只允许一条创建其他都是更新操作 + createData := make(map[string]*pbclient.Client) + updateData := make([]*pbclient.Client, 0) + for _, item := range clientCreateData { + key := fmt.Sprintf("%d-%d-%s", item.Attachment.BizId, item.Attachment.AppId, item.Attachment.Uid) + if _, ok := createData[key]; !ok { + createData[key] = item + } else { + updateData = append(updateData, item) + } + } + + // 该数据是最终需要创建的数据 + toCreate = []*table.Client{} + for _, item := range createData { + toCreate = append(toCreate, &table.Client{ + Attachment: item.GetAttachment().ClientAttachment(), + Spec: item.GetSpec().ClientSpec(), + }) + } + clientUpdateData = append(clientUpdateData, updateData...) + return toCreate, clientUpdateData, nil +} + +func (s *Service) updatePrimaryKey(clientData []*pbclient.Client, createID map[string]uint32) { + for _, item := range clientData { + key := fmt.Sprintf("%d-%d-%s", item.Attachment.BizId, item.Attachment.AppId, item.Attachment.Uid) + v, ok := createID[key] + if ok { + item.Id = v + } + } +} diff --git a/bcs-services/bcs-bscp/cmd/data-service/service/client_event.go b/bcs-services/bcs-bscp/cmd/data-service/service/client_event.go new file mode 100644 index 0000000000..8d9e9166c2 --- /dev/null +++ b/bcs-services/bcs-bscp/cmd/data-service/service/client_event.go @@ -0,0 +1,184 @@ +/* + * Tencent is pleased to support the open source community by making Blueking Container Service available. + * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. + * Licensed under the MIT License (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * http://opensource.org/licenses/MIT + * Unless required by applicable law or agreed to in writing, software distributed under + * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, + * either express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + +package service + +import ( + "fmt" + + "github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/pkg/dal/gen" + "github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/pkg/dal/table" + "github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/pkg/kit" + pbce "github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/pkg/protocol/core/client-event" + sfs "github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/pkg/sf-share" +) + +func (s *Service) doBatchCreateClientEvents(kt *kit.Kit, tx *gen.QueryTx, clientEvents []*pbce.ClientEvent, // nolint + clientID map[string]uint32) error { + + // 处理clientID + clientEventsData := []*pbce.ClientEvent{} + for _, item := range clientEvents { + key := fmt.Sprintf("%d-%d-%s", item.Attachment.BizId, item.Attachment.AppId, item.Attachment.Uid) + id, ok := clientID[key] + if ok { + item.Attachment.ClientId = id + clientEventsData = append(clientEventsData, &pbce.ClientEvent{ + Attachment: item.Attachment, + Spec: item.Spec, + MessageType: item.MessageType, + }) + } + } + + if len(clientEventsData) == 0 { + return nil + } + + // 根据 bizID + appID + UID + CursorID 查找存在的数据 + data := [][]interface{}{} + for _, item := range clientEventsData { + data = append(data, []interface{}{item.Attachment.BizId, item.Attachment.AppId, item.Attachment.Uid, + item.Attachment.CursorId}) + } + list, err := s.dao.ClientEvent().ListClientByTuple(kt, data) + if err != nil { + return err + } + clientEventID := map[string]uint32{} + for _, v := range list { + key := fmt.Sprintf("%d-%d-%s-%s", v.Attachment.BizID, v.Attachment.AppID, v.Attachment.UID, v.Attachment.CursorID) + clientEventID[key] = v.ID + } + + toCreate, toUpdate := s.handleBatchCreateClientEvents(clientEventsData, clientEventID) + + err = s.dao.ClientEvent().BatchCreateWithTx(kt, tx, toCreate) + if err != nil { + return err + } + + // 获取创建后的ID + createID := make(map[string]uint32) + for _, item := range toCreate { + key := fmt.Sprintf("%d-%d-%s-%s", item.Attachment.BizID, item.Attachment.AppID, item.Attachment.UID, + item.Attachment.CursorID) + createID[key] = item.ID + } + + // 判断类型更新对应字段 + heartbeatData := []*table.ClientEvent{} + versionChangeData := []*table.ClientEvent{} + + for _, v := range toUpdate { + key := fmt.Sprintf("%d-%d-%s-%s", v.Attachment.BizId, v.Attachment.AppId, v.Attachment.Uid, + v.Attachment.CursorId) + uid := v.Id + if uid == 0 { + cid, ok := createID[key] + if !ok { + uid = 0 + } else { + uid = cid + } + } + if uid != 0 { + switch v.MessageType { + case "Heartbeat": + heartbeatData = append(heartbeatData, &table.ClientEvent{ + ID: uid, + Attachment: v.Attachment.ClientEventAttachment(), + Spec: v.Spec.ClientEventSpec(), + }) + case "VersionChange": + versionChangeData = append(versionChangeData, &table.ClientEvent{ + ID: uid, + Attachment: v.Attachment.ClientEventAttachment(), + Spec: v.Spec.ClientEventSpec(), + }) + } + } + } + + if len(heartbeatData) != 0 { + err = s.dao.ClientEvent().BatchUpdateSelectFieldTx(kt, tx, sfs.Heartbeat, heartbeatData) + if err != nil { + return err + } + } + + if len(versionChangeData) != 0 { + err = s.dao.ClientEvent().BatchUpdateSelectFieldTx(kt, tx, sfs.VersionChangeMessage, versionChangeData) + if err != nil { + return err + } + } + + return nil +} + +func (s *Service) handleBatchCreateClientEvents(clientEventsData []*pbce.ClientEvent, + clientEventID map[string]uint32) (toCreate []*table.ClientEvent, clientEUpdateData []*pbce.ClientEvent) { + clientEUpdateData = []*pbce.ClientEvent{} + clientECreateData := []*pbce.ClientEvent{} + // 验证哪些数据需要新增和修改 + for _, item := range clientEventsData { + key := fmt.Sprintf("%d-%d-%s-%s", item.Attachment.BizId, item.Attachment.AppId, item.Attachment.Uid, + item.Attachment.CursorId) + id, ok := clientEventID[key] + + if item.Spec.EndTime.GetSeconds() < 0 { + item.GetSpec().EndTime = nil + } + + if !ok { + clientECreateData = append(clientECreateData, &pbce.ClientEvent{ + Attachment: item.GetAttachment(), + Spec: item.GetSpec(), + MessageType: item.MessageType, + }) + } else { + clientEUpdateData = append(clientEUpdateData, &pbce.ClientEvent{ + Id: id, + Attachment: item.GetAttachment(), + Spec: item.GetSpec(), + MessageType: item.MessageType, + }) + } + } + + // Client Event数据会存在同一维度下多个类型的消息 + // 如果同一维度下的数据都存在那么都是更新 + // 如果同一维度下的数据不存在,只允许一条创建其他都是更新操作 + createData := make(map[string]*pbce.ClientEvent) + otherCreateData := make([]*pbce.ClientEvent, 0) + for _, item := range clientECreateData { + key := fmt.Sprintf("%d-%d-%s", item.Attachment.BizId, item.Attachment.AppId, item.Attachment.CursorId) + _, ok := createData[key] + if ok { + otherCreateData = append(otherCreateData, item) + } else { + createData[key] = item + } + } + + // 该数据是最终需要创建的数据 + toCreate = []*table.ClientEvent{} + for _, v := range createData { + toCreate = append(toCreate, &table.ClientEvent{ + Spec: v.Spec.ClientEventSpec(), + Attachment: v.Attachment.ClientEventAttachment(), + }) + } + clientEUpdateData = append(clientEUpdateData, otherCreateData...) + return toCreate, clientEUpdateData +} diff --git a/bcs-services/bcs-bscp/cmd/data-service/service/crontab/sync_client_online_state.go b/bcs-services/bcs-bscp/cmd/data-service/service/crontab/sync_client_online_state.go new file mode 100644 index 0000000000..a3aa0bfb93 --- /dev/null +++ b/bcs-services/bcs-bscp/cmd/data-service/service/crontab/sync_client_online_state.go @@ -0,0 +1,133 @@ +/* + * Tencent is pleased to support the open source community by making Blueking Container Service available. + * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. + * Licensed under the MIT License (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * http://opensource.org/licenses/MIT + * Unless required by applicable law or agreed to in writing, software distributed under + * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, + * either express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Package crontab example Synchronize the online status of the client +package crontab + +import ( + "context" + "sync" + "time" + + "github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/pkg/dal/dao" + "github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/pkg/dal/table" + "github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/pkg/kit" + "github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/pkg/logs" + "github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/pkg/runtime/shutdown" + "github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/pkg/serviced" +) + +const ( + defaultSyncClientStateInterval = 60 * time.Second +) + +// NewSyncClientOnlineState init client online state +func NewSyncClientOnlineState(set dao.Set, sd serviced.Service) ClientOnlineState { + return ClientOnlineState{ + set: set, + state: sd, + } +} + +// ClientOnlineState xxx +type ClientOnlineState struct { + set dao.Set + state serviced.Service + mutex sync.Mutex +} + +// Run the sync client online state task +func (c *ClientOnlineState) Run() { + logs.Infof("example Start an online synchronization task for the client") + notifier := shutdown.AddNotifier() + go func() { + ticker := time.NewTicker(defaultSyncClientStateInterval) + defer ticker.Stop() + for { + kt := kit.New() + ctx, cancel := context.WithCancel(kt.Ctx) + kt.Ctx = ctx + + select { + case <-notifier.Signal: + logs.Infof("stop sync client online status success") + cancel() + notifier.Done() + return + case <-ticker.C: + if !c.state.IsMaster() { + logs.Infof("current service instance is slave, skip sync client online status") + continue + } + logs.Infof("starts to synchronize the client online status") + c.syncClientOnlineState(kt) + } + } + }() +} + +// sync the online status of the client +func (c *ClientOnlineState) syncClientOnlineState(kt *kit.Kit) { + c.mutex.Lock() + defer func() { + c.mutex.Unlock() + }() + heartbeatTime := time.Now().Add(-60 * time.Second) + onlineStatus := "online" + var page uint32 + + limit := 100 + count, err := c.set.Client().GetClientCountByCondition(kt, heartbeatTime, onlineStatus) + if err != nil { + return + } + if count == 0 { + logs.Infof("there is no data to process,rid: %s, heartbeatTime: %s - onlineStatus: %s", kt.Rid, + heartbeatTime, onlineStatus) + return + } + listLen := int(count) + for i := 0; i < listLen; i += limit { + list, err := c.set.Client().ListByHeartbeatTimeOnlineState(kt, heartbeatTime, onlineStatus, limit, page) + if err != nil { + logs.Errorf("get client data failed, rid: %s, heartbeatTime: %s, page: %s, err: %s", kt.Rid, + heartbeatTime, page, err.Error()) + return + } + if len(list) == 0 { + logs.Infof("there is no data to process, rid: %s, heartbeatTime: %s, page: %s", kt.Rid, + heartbeatTime, page) + return + } + page = list[len(list)-1].ID + err = c.updateClientOnlineState(kt, list, heartbeatTime, onlineStatus) + if err != nil { + logs.Errorf("update client online state failed, rid: %s, heartbeatTime: %s, page: %s, err: %s", kt.Rid, + heartbeatTime, page, err.Error()) + return + } + } +} + +// Update the online status of the client +func (c *ClientOnlineState) updateClientOnlineState(kt *kit.Kit, list []*table.Client, + heartbeatTime time.Time, onlineStatus string) error { + ids := []uint32{} + for _, item := range list { + ids = append(ids, item.ID) + } + err := c.set.Client().UpdateClientOnlineState(kt, heartbeatTime, onlineStatus, ids) + if err != nil { + return err + } + return nil +} diff --git a/bcs-services/bcs-bscp/cmd/feed-server/bll/bll.go b/bcs-services/bcs-bscp/cmd/feed-server/bll/bll.go index 2b9718ec6d..790d1e468c 100644 --- a/bcs-services/bcs-bscp/cmd/feed-server/bll/bll.go +++ b/bcs-services/bcs-bscp/cmd/feed-server/bll/bll.go @@ -107,3 +107,8 @@ func (b *BLL) AppCache() *lcache.App { func (b *BLL) RKvCache() *lcache.ReleasedKv { return b.cache.ReleasedKv } + +// ClientMetric return the client metric instance. +func (b *BLL) ClientMetric() *lcache.ClientMetric { + return b.cache.ClientMetric +} diff --git a/bcs-services/bcs-bscp/cmd/feed-server/bll/lcache/cache.go b/bcs-services/bcs-bscp/cmd/feed-server/bll/lcache/cache.go index 5aaa7c8abf..c07fcdec57 100644 --- a/bcs-services/bcs-bscp/cmd/feed-server/bll/lcache/cache.go +++ b/bcs-services/bcs-bscp/cmd/feed-server/bll/lcache/cache.go @@ -35,6 +35,7 @@ func NewLocalCache(cs *clientset.ClientSet) (*Cache, error) { ReleasedHook: newReleasedHook(mc, cs), Credential: newCredential(mc, cs), Auth: newAuth(mc, cs.Authorizer()), + ClientMetric: newClientMetric(mc, cs), }, nil } @@ -47,6 +48,7 @@ type Cache struct { Credential *Credential ReleasedHook *ReleasedHook Auth *Auth + ClientMetric *ClientMetric } // Purge is used to clean the resource's cache with events. diff --git a/bcs-services/bcs-bscp/cmd/feed-server/bll/lcache/cilent_metric.go b/bcs-services/bcs-bscp/cmd/feed-server/bll/lcache/cilent_metric.go new file mode 100644 index 0000000000..5e76ad766a --- /dev/null +++ b/bcs-services/bcs-bscp/cmd/feed-server/bll/lcache/cilent_metric.go @@ -0,0 +1,46 @@ +/* + * Tencent is pleased to support the open source community by making Blueking Container Service available. + * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. + * Licensed under the MIT License (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * http://opensource.org/licenses/MIT + * Unless required by applicable law or agreed to in writing, software distributed under + * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, + * either express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + +package lcache + +import ( + clientset "github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/cmd/feed-server/bll/client-set" + "github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/pkg/kit" + pbcs "github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/pkg/protocol/cache-service" +) + +// newClientMetric xxx +func newClientMetric(mc *metric, cs *clientset.ClientSet) *ClientMetric { + cm := new(ClientMetric) + cm.mc = mc + cm.cs = cs + return cm +} + +// ClientMetric xxx +type ClientMetric struct { + mc *metric + cs *clientset.ClientSet +} + +// Set tore client metric data into redis queues +func (cm *ClientMetric) Set(kt *kit.Kit, bizID, appID uint32, payload []byte) error { + _, err := cm.cs.CS().SetClientMetric(kt.Ctx, &pbcs.SetClientMetricReq{ + BizId: bizID, + AppId: appID, + Payload: payload, + }) + if err != nil { + return err + } + return nil +} diff --git a/bcs-services/bcs-bscp/cmd/feed-server/service/metric.go b/bcs-services/bcs-bscp/cmd/feed-server/service/metric.go index 5d274e6577..9bde9dc090 100644 --- a/bcs-services/bcs-bscp/cmd/feed-server/service/metric.go +++ b/bcs-services/bcs-bscp/cmd/feed-server/service/metric.go @@ -42,6 +42,39 @@ func initMetric(name string) *metric { }, []string{"biz"}) metrics.Register().MustRegister(m.watchCounter) + m.clientMaxCPUUsage = prometheus.NewGaugeVec(prometheus.GaugeOpts{ + Namespace: metrics.Namespace, + Subsystem: metrics.FSConfigConsume, + Name: "client_max_cpu_usage", + Help: "record the maximum cpu usage", + ConstLabels: labels, + }, []string{"bizID", "appName"}) + metrics.Register().MustRegister(m.clientMaxCPUUsage) + m.clientMaxMemUsage = prometheus.NewGaugeVec(prometheus.GaugeOpts{ + Namespace: metrics.Namespace, + Subsystem: metrics.FSConfigConsume, + Name: "client_max_memory_usage", + Help: "record the maximum memory usage", + ConstLabels: labels, + }, []string{"bizID", "appName"}) + metrics.Register().MustRegister(m.clientMaxMemUsage) + m.clientCurrentCPUUsage = prometheus.NewGaugeVec(prometheus.GaugeOpts{ + Namespace: metrics.Namespace, + Subsystem: metrics.FSConfigConsume, + Name: "client_current_cpu_usage", + Help: "record the current cpu usage", + ConstLabels: labels, + }, []string{"bizID", "appName"}) + metrics.Register().MustRegister(m.clientCurrentCPUUsage) + m.clientCurrentMemUsage = prometheus.NewGaugeVec(prometheus.GaugeOpts{ + Namespace: metrics.Namespace, + Subsystem: metrics.FSConfigConsume, + Name: "client_current_memory_usage", + Help: "record the current memory usage", + ConstLabels: labels, + }, []string{"bizID", "appName"}) + metrics.Register().MustRegister(m.clientCurrentMemUsage) + return m } @@ -51,4 +84,12 @@ type metric struct { // watchCounter record the total connection count of sidecars with watch, used to get the new the connection count // within a specified time range. watchCounter *prometheus.CounterVec + // clientMaxCPUUsage The maximum cpu usage of the client was collected + clientMaxCPUUsage *prometheus.GaugeVec + // clientMaxMemUsage the maximum memory usage was collected + clientMaxMemUsage *prometheus.GaugeVec + // clientCurrentCPUUsage the cpu usage of the client was collected + clientCurrentCPUUsage *prometheus.GaugeVec + // clientCurrentMemUsage the current memory usage of the client is collected + clientCurrentMemUsage *prometheus.GaugeVec } diff --git a/bcs-services/bcs-bscp/cmd/feed-server/service/rpc_sidecar.go b/bcs-services/bcs-bscp/cmd/feed-server/service/rpc_sidecar.go index fbbd87e59a..5c0ea9d8ab 100644 --- a/bcs-services/bcs-bscp/cmd/feed-server/service/rpc_sidecar.go +++ b/bcs-services/bcs-bscp/cmd/feed-server/service/rpc_sidecar.go @@ -16,7 +16,9 @@ import ( "context" "fmt" "path" + "strconv" "strings" + "time" prm "github.com/prometheus/client_golang/prometheus" "google.golang.org/grpc/codes" @@ -180,7 +182,7 @@ func (s *Service) Watch(swm *pbfs.SideWatchMeta, fws pbfs.Upstream_WatchServer) } // Messaging received messages delivered from sidecar. -func (s *Service) Messaging(ctx context.Context, msg *pbfs.MessagingMeta) (*pbfs.MessagingResp, error) { +func (s *Service) Messaging(ctx context.Context, msg *pbfs.MessagingMeta) (*pbfs.MessagingResp, error) { // nolint im, err := sfs.ParseFeedIncomingContext(ctx) if err != nil { return nil, status.Error(codes.InvalidArgument, err.Error()) @@ -196,6 +198,79 @@ func (s *Service) Messaging(ctx context.Context, msg *pbfs.MessagingMeta) (*pbfs return nil, status.Errorf(codes.PermissionDenied, "no permission to access bscp server") } + clientMetricData := make(map[string]*sfs.ClientMetricData) + // 按照服务级别上报数据 + // 上报的事件分两种 心跳事件、变更事件 + switch sfs.MessagingType(msg.Type) { + case sfs.VersionChangeMessage: + vc := new(sfs.VersionChangePayload) + err = vc.Decode(msg.Payload) + if err != nil { + logs.Errorf("version change message decoding failed, %s", err.Error()) + return nil, err + } + // 处理 心跳时间和在线状态 + vc.BasicData.HeartbeatTime = time.Now() + vc.BasicData.OnlineStatus = sfs.Online + payload, errE := vc.Encode() + if errE != nil { + logs.Errorf("version change message encoding failed, %s", err.Error()) + return nil, err + } + s.handleResourceUsageMetrics(vc.BasicData.BizID, vc.Application.App, vc.ResourceUsage) + clientMetricData[vc.Application.App] = &sfs.ClientMetricData{ + MessagingType: msg.Type, + Payload: payload, + } + case sfs.Heartbeat: + hb := new(sfs.HeartbeatPayload) + err = hb.Decode(msg.Payload) + if err != nil { + return nil, err + } + heartbeatTime := time.Now() + onlineStatus := sfs.Online + for _, item := range hb.Applications { + s.handleResourceUsageMetrics(hb.BasicData.BizID, item.App, hb.ResourceUsage) + hb.BasicData.HeartbeatTime = heartbeatTime + hb.BasicData.OnlineStatus = onlineStatus + oneData := sfs.HeartbeatItem{ + BasicData: hb.BasicData, + Application: item, + ResourceUsage: hb.ResourceUsage, + } + marshal, errHb := jsoni.Marshal(oneData) + if errHb != nil { + return nil, errHb + } + clientMetricData[item.App] = &sfs.ClientMetricData{ + MessagingType: msg.Type, + Payload: marshal, + } + } + } + + for appName, v := range clientMetricData { + appID, err := s.bll.AppCache().GetAppID(im.Kit, im.Meta.BizID, appName) + if err != nil { + logs.Errorf("get app id failed, %s", err.Error()) + continue + } + v.AppID = appID + payload, err := jsoni.Marshal(v) + if err != nil { + logs.Errorf("failed to serialize clientMetricData, err: %s", err.Error()) + continue + } + if im.Meta.BizID != 0 && len(payload) != 0 { + err = s.bll.ClientMetric().Set(im.Kit, im.Meta.BizID, appID, payload) + if err != nil { + logs.Errorf("send %d biz %s message, payload: %s, rid: %s", im.Meta.BizID, im.Meta.Fingerprint, + payload, msg.Rid) + continue + } + } + } logs.V(3).Infof("receive %d biz %s sidecar %s message, payload: %s, rid: %s", im.Meta.BizID, im.Meta.Fingerprint, sfs.MessagingType(msg.Type).String(), msg.Payload, msg.Rid) return new(pbfs.MessagingResp), nil @@ -532,6 +607,13 @@ func matchPattern(name string, match []string) bool { return true } } - return false } + +func (s *Service) handleResourceUsageMetrics(bizID uint32, appName string, resource sfs.ResourceUsage) { + s.mc.clientMaxCPUUsage.WithLabelValues(strconv.Itoa(int(bizID)), appName).Set(resource.CpuMaxUsage) + s.mc.clientCurrentCPUUsage.WithLabelValues(strconv.Itoa(int(bizID)), appName).Set(resource.CpuUsage) + s.mc.clientMaxMemUsage.WithLabelValues(strconv.Itoa(int(bizID)), appName).Set(float64(resource.MemoryMaxUsage)) + s.mc.clientCurrentMemUsage.WithLabelValues(strconv.Itoa(int(bizID)), appName).Set(float64(resource.MemoryUsage)) + +} diff --git a/bcs-services/bcs-bscp/pkg/dal/bedis/base.go b/bcs-services/bcs-bscp/pkg/dal/bedis/base.go index 8a4f952112..23a89c5eb4 100644 --- a/bcs-services/bcs-bscp/pkg/dal/bedis/base.go +++ b/bcs-services/bcs-bscp/pkg/dal/bedis/base.go @@ -410,3 +410,122 @@ func (bs *bedis) Healthz() error { return nil } + +// LPush 将一个或多个值插入到列表头部 +func (bs *bedis) LPush(ctx context.Context, key string, values ...interface{}) error { + start := time.Now() + _, err := bs.client.LPush(ctx, key, values).Result() + if err != nil { + bs.mc.errCounter.With(prm.Labels{"cmd": "lpush"}).Inc() + return err + } + bs.logSlowCmd(ctx, key, time.Since(start)) + bs.mc.cmdLagMS.With(prm.Labels{"cmd": "lpush"}).Observe(float64(time.Since(start).Milliseconds())) + return nil +} + +// LRange 获取列表指定范围内的元素 +func (bs *bedis) LRange(ctx context.Context, key string, start, stop int64) ([]string, error) { + startTime := time.Now() + list, err := bs.client.LRange(ctx, key, start, stop).Result() + if err != nil { + if IsNilError(err) { + return nil, nil + } + bs.mc.errCounter.With(prm.Labels{"cmd": "lrange"}).Inc() + return nil, err + } + values := make([]string, 0) + for _, val := range list { + if val == "" { + continue + } + if len(val) == 0 { + continue + } + + values = append(values, val) + } + bs.logSlowCmd(ctx, "", time.Since(startTime)) + bs.mc.cmdLagMS.With(prm.Labels{"cmd": "lrange"}).Observe(float64(time.Since(startTime).Milliseconds())) + return values, nil +} + +// RPop 移除列表的最后一个元素,返回值为移除的元素 +func (bs *bedis) RPop(ctx context.Context, key string) (string, error) { + start := time.Now() + value, err := bs.client.RPop(ctx, key).Result() + if err != nil { + if IsNilError(err) { + return "", nil + } + bs.mc.errCounter.With(prm.Labels{"cmd": "rpop"}).Inc() + return "", err + } + bs.logSlowCmd(ctx, "", time.Since(start)) + bs.mc.cmdLagMS.With(prm.Labels{"cmd": "rpop"}).Observe(float64(time.Since(start).Milliseconds())) + + return value, nil +} + +// Keys finds all keys that match a given pattern +func (bs *bedis) Keys(ctx context.Context, pattern string) ([]string, error) { + start := time.Now() + list, err := bs.client.Keys(ctx, pattern).Result() + if err != nil { + if IsNilError(err) { + return nil, nil + } + bs.mc.errCounter.With(prm.Labels{"cmd": "keys"}).Inc() + return nil, err + } + values := make([]string, 0) + for _, val := range list { + if val == "" { + continue + } + if len(val) == 0 { + continue + } + + values = append(values, val) + } + bs.logSlowCmd(ctx, "", time.Since(start)) + bs.mc.cmdLagMS.With(prm.Labels{"cmd": "keys"}).Observe(float64(time.Since(start).Milliseconds())) + return values, nil +} + +// LLen get list length +func (bs *bedis) LLen(ctx context.Context, key string) (int64, error) { + start := time.Now() + value, err := bs.client.LLen(ctx, key).Result() + if err != nil { + if IsNilError(err) { + return 0, nil + } + bs.mc.errCounter.With(prm.Labels{"cmd": "llen"}).Inc() + return 0, err + } + bs.logSlowCmd(ctx, "", time.Since(start)) + bs.mc.cmdLagMS.With(prm.Labels{"cmd": "llen"}).Observe(float64(time.Since(start).Milliseconds())) + + return value, nil +} + +// LTrim trim a list, that is, make the list keep only the elements within the specified interval, +// and the elements that are not within the specified interval are deleted. +func (bs *bedis) LTrim(ctx context.Context, key string, start, stop int64) (string, error) { + startTime := time.Now() + value, err := bs.client.LTrim(ctx, key, start, stop).Result() + if err != nil { + if IsNilError(err) { + return "", nil + } + bs.mc.errCounter.With(prm.Labels{"cmd": "ltrim"}).Inc() + return "", err + } + bs.logSlowCmd(ctx, "", time.Since(startTime)) + bs.mc.cmdLagMS.With(prm.Labels{"cmd": "ltrim"}).Observe(float64(time.Since(startTime).Milliseconds())) + + return value, nil +} diff --git a/bcs-services/bcs-bscp/pkg/dal/bedis/bedis.go b/bcs-services/bcs-bscp/pkg/dal/bedis/bedis.go index db174198d9..91f89297ef 100644 --- a/bcs-services/bcs-bscp/pkg/dal/bedis/bedis.go +++ b/bcs-services/bcs-bscp/pkg/dal/bedis/bedis.go @@ -58,6 +58,12 @@ type RedisClient interface { Del(ctx context.Context, keys ...string) *redis.IntCmd Do(ctx context.Context, args ...interface{}) *redis.Cmd Ping(ctx context.Context) *redis.StatusCmd + LPush(ctx context.Context, key string, values ...interface{}) *redis.IntCmd + LRange(ctx context.Context, key string, start, stop int64) *redis.StringSliceCmd + RPop(ctx context.Context, key string) *redis.StringCmd + Keys(ctx context.Context, pattern string) *redis.StringSliceCmd + LLen(ctx context.Context, key string) *redis.IntCmd + LTrim(ctx context.Context, key string, start, stop int64) *redis.StatusCmd } // Client defines all the bscp used redis command @@ -78,6 +84,12 @@ type Client interface { Delete(ctx context.Context, keys ...string) error Expire(ctx context.Context, key string, ttlSeconds int, mode ExpireMode) error Healthz() error + LPush(ctx context.Context, key string, values ...interface{}) error + LRange(ctx context.Context, key string, start, stop int64) ([]string, error) + RPop(ctx context.Context, key string) (string, error) + Keys(ctx context.Context, pattern string) ([]string, error) + LLen(ctx context.Context, key string) (int64, error) + LTrim(ctx context.Context, key string, start, stop int64) (string, error) } // NewRedisCache create a redis cluster client. diff --git a/bcs-services/bcs-bscp/pkg/dal/dao/client.go b/bcs-services/bcs-bscp/pkg/dal/dao/client.go new file mode 100644 index 0000000000..66a169d5a5 --- /dev/null +++ b/bcs-services/bcs-bscp/pkg/dal/dao/client.go @@ -0,0 +1,149 @@ +/* + * Tencent is pleased to support the open source community by making Blueking Container Service available. + * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. + * Licensed under the MIT License (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * http://opensource.org/licenses/MIT + * Unless required by applicable law or agreed to in writing, software distributed under + * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, + * either express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + +package dao + +import ( + "time" + + "gorm.io/gen/field" + + "github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/pkg/dal/gen" + "github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/pkg/dal/table" + "github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/pkg/kit" + sfs "github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/pkg/sf-share" +) + +// Client supplies all the client related operations. +type Client interface { + // BatchCreateWithTx batch create client instances with transaction. + BatchCreateWithTx(kit *kit.Kit, tx *gen.QueryTx, data []*table.Client) error + // BatchUpdateWithTx batch update client instances with transaction. + BatchUpdateWithTx(kit *kit.Kit, tx *gen.QueryTx, data []*table.Client) error + // ListClientByTuple Query the client list according to multiple fields in + ListClientByTuple(kit *kit.Kit, data [][]interface{}) ([]*table.Client, error) + // BatchUpdateSelectFieldTx Update selected field + BatchUpdateSelectFieldTx(kit *kit.Kit, tx *gen.QueryTx, messageType sfs.MessagingType, data []*table.Client) error + // ListByHeartbeatTimeOnlineState obtain data based on the last heartbeat time and online status + ListByHeartbeatTimeOnlineState(kit *kit.Kit, heartbeatTime time.Time, onlineState string, + limit int, id uint32) ([]*table.Client, error) + // UpdateClientOnlineState Update the online status of the client + UpdateClientOnlineState(kit *kit.Kit, heartbeatTime time.Time, onlineState string, ids []uint32) error + // GetClientCountByCondition Get the total according to the condition + GetClientCountByCondition(kit *kit.Kit, heartbeatTime time.Time, onlineState string) (int64, error) +} + +var _ Client = new(clientDao) + +type clientDao struct { + genQ *gen.Query + idGen IDGenInterface + auditDao AuditDao +} + +// GetClientCountByCondition Get the total according to the condition +func (dao *clientDao) GetClientCountByCondition(kit *kit.Kit, heartbeatTime time.Time, + onlineState string) (int64, error) { + m := dao.genQ.Client + count, err := dao.genQ.Client.WithContext(kit.Ctx). + Where(m.LastHeartbeatTime.Lt(heartbeatTime)). + Where(m.OnlineStatus.Eq(onlineState)).Count() + return count, err +} + +// UpdateClientOnlineState Update the online status of the client +func (dao *clientDao) UpdateClientOnlineState(kit *kit.Kit, heartbeatTime time.Time, + onlineState string, ids []uint32) error { + m := dao.genQ.Client + _, err := dao.genQ.Client.WithContext(kit.Ctx). + Where(m.ID.In(ids...)). + Where(m.LastHeartbeatTime.Lt(heartbeatTime)). + Where(m.OnlineStatus.Eq(onlineState)). + Update(m.OnlineStatus, sfs.Offline.String()) + return err +} + +// ListByHeartbeatTimeOnlineState obtain data based on the last heartbeat time and online status +func (dao *clientDao) ListByHeartbeatTimeOnlineState(kit *kit.Kit, heartbeatTime time.Time, + onlineState string, limit int, id uint32) ([]*table.Client, error) { + m := dao.genQ.Client + q := dao.genQ.Client.WithContext(kit.Ctx) + find, err := q.Select(m.ID, m.LastHeartbeatTime, m.OnlineStatus). + Where(m.ID.Gt(id)). + Where(m.LastHeartbeatTime.Lt(heartbeatTime)). + Where(m.OnlineStatus.Eq(onlineState)). + Limit(limit). + Find() + return find, err +} + +// BatchUpdateSelectFieldTx Update selected field +func (dao *clientDao) BatchUpdateSelectFieldTx(kit *kit.Kit, tx *gen.QueryTx, + messageType sfs.MessagingType, data []*table.Client) error { + if len(data) == 0 { + return nil + } + m := dao.genQ.Client + q := tx.Client.WithContext(kit.Ctx) + + // 根据类型更新字段 + // 拉取状态时没有上报资源信息所以忽略cpu和内存等信息 + switch messageType { + case sfs.VersionChangeMessage: + q = q.Omit(m.FirstConnectTime) + case sfs.Heartbeat: + q = q.Omit(m.ClientVersion, m.Ip, m.Labels, m.Annotations, m.FirstConnectTime, m.CurrentReleaseID, + m.TargetReleaseID, m.FailedDetailReason, m.ReleaseChangeFailedReason) + } + + return q.Save(data...) +} + +// BatchUpdateWithTx batch update client instances with transaction. +func (dao *clientDao) BatchUpdateWithTx(kit *kit.Kit, tx *gen.QueryTx, data []*table.Client) error { + if len(data) == 0 { + return nil + } + return tx.Client.WithContext(kit.Ctx).Save(data...) +} + +// ListClientByTuple Query the client list according to multiple fields in +// data Example {{1, 1,"uid1"}, {2, 2,"uid2"}} +// SELECT * FROM `client` WHERE (`biz_id`, `app_id`,`uid`) IN ((1,1,"uid1"),(2,2,'uid2')); +func (dao *clientDao) ListClientByTuple(kit *kit.Kit, data [][]interface{}) ([]*table.Client, error) { + m := dao.genQ.Client + return dao.genQ.Client.WithContext(kit.Ctx). + Select(m.ID, m.BizID, m.AppID, m.UID, m.FirstConnectTime, m.CurrentReleaseID). + Where(m.WithContext(kit.Ctx).Columns(m.BizID, m.AppID, m.UID). + In(field.Values(data))). + Find() +} + +// BatchCreateWithTx batch create client instances with transaction. +func (dao *clientDao) BatchCreateWithTx(kit *kit.Kit, tx *gen.QueryTx, data []*table.Client) error { + // generate an config item id and update to config item. + if len(data) == 0 { + return nil + } + ids, err := dao.idGen.Batch(kit, table.ClientTable, len(data)) + if err != nil { + return err + } + for i, item := range data { + if err := item.ValidateCreate(); err != nil { + return err + } + item.ID = ids[i] + } + + return tx.Client.WithContext(kit.Ctx).Save(data...) +} diff --git a/bcs-services/bcs-bscp/pkg/dal/dao/client_event.go b/bcs-services/bcs-bscp/pkg/dal/dao/client_event.go new file mode 100644 index 0000000000..cd768e06fb --- /dev/null +++ b/bcs-services/bcs-bscp/pkg/dal/dao/client_event.go @@ -0,0 +1,92 @@ +/* + * Tencent is pleased to support the open source community by making Blueking Container Service available. + * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. + * Licensed under the MIT License (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * http://opensource.org/licenses/MIT + * Unless required by applicable law or agreed to in writing, software distributed under + * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, + * either express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + +package dao + +import ( + "gorm.io/gen/field" + + "github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/pkg/dal/gen" + "github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/pkg/dal/table" + "github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/pkg/kit" + sfs "github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/pkg/sf-share" +) + +// ClientEvent supplies all the client event related operations. +type ClientEvent interface { + // BatchCreateWithTx batch create client event instances with transaction. + BatchCreateWithTx(kit *kit.Kit, tx *gen.QueryTx, data []*table.ClientEvent) error + // BatchUpdateSelectFieldTx Update selected field + BatchUpdateSelectFieldTx(kit *kit.Kit, tx *gen.QueryTx, messageType sfs.MessagingType, data []*table.ClientEvent) error + // ListClientByTuple Query the client list according to multiple fields in + ListClientByTuple(kit *kit.Kit, data [][]interface{}) ([]*table.ClientEvent, error) +} + +var _ ClientEvent = new(clientEventDao) + +type clientEventDao struct { + genQ *gen.Query + idGen IDGenInterface + auditDao AuditDao +} + +// ListClientByTuple implements ClientEvent. +func (dao *clientEventDao) ListClientByTuple(kit *kit.Kit, data [][]interface{}) ([]*table.ClientEvent, error) { + m := dao.genQ.ClientEvent + return dao.genQ.ClientEvent.WithContext(kit.Ctx). + Select(m.ID, m.BizID, m.AppID, m.UID, m.CursorID, m.ClientMode). + Where(m.WithContext(kit.Ctx).Columns(m.BizID, m.AppID, m.UID, m.CursorID). + In(field.Values(data))). + Find() +} + +// BatchUpdateSelectFieldTx implements ClientEvent. +// 版本变更时所有所有数据都可以更新 +// 心跳主要更新下载数和下载文件大小、变更状态 +func (dao *clientEventDao) BatchUpdateSelectFieldTx(kit *kit.Kit, tx *gen.QueryTx, messageType sfs.MessagingType, + data []*table.ClientEvent) error { + m := dao.genQ.ClientEvent + q := tx.ClientEvent.WithContext(kit.Ctx) + + // 根据类型更新字段 + switch messageType { + case sfs.VersionChangeMessage: + q = q.Omit() + case sfs.Heartbeat: + q = q.Omit(m.ClientMode, m.TotalFileNum, m.TotalFileSize, m.TotalSeconds, m.OriginalReleaseID, + m.TargetReleaseID, m.StartTime, m.EndTime, m.FailedDetailReason, m.ReleaseChangeFailedReason) + } + + return q.Save(data...) +} + +// BatchCreateWithTx batch create client event instances with transaction. +func (dao *clientEventDao) BatchCreateWithTx(kit *kit.Kit, tx *gen.QueryTx, data []*table.ClientEvent) error { + // generate an config item id and update to config item. + if len(data) == 0 { + return nil + } + ids, err := dao.idGen.Batch(kit, table.ClientEventTable, len(data)) + if err != nil { + return err + } + for i, item := range data { + if err := item.ValidateCreate(); err != nil { + return err + } + item.ID = ids[i] + } + if err := tx.ClientEvent.WithContext(kit.Ctx).Save(data...); err != nil { + return err + } + return nil +} diff --git a/bcs-services/bcs-bscp/pkg/dal/dao/dao.go b/bcs-services/bcs-bscp/pkg/dal/dao/dao.go index d97f7c8e8a..fc4ccb1afc 100644 --- a/bcs-services/bcs-bscp/pkg/dal/dao/dao.go +++ b/bcs-services/bcs-bscp/pkg/dal/dao/dao.go @@ -67,6 +67,8 @@ type Set interface { CredentialScope() CredentialScope Kv() Kv ReleasedKv() ReleasedKv + Client() Client + ClientEvent() ClientEvent } // NewDaoSet create the DAO set instance. @@ -459,3 +461,21 @@ func (s *set) ReleasedKv() ReleasedKv { genQ: s.genQ, } } + +// Client returns the Client scope's DAO +func (s *set) Client() Client { + return &clientDao{ + idGen: s.idGen, + auditDao: s.auditDao, + genQ: s.genQ, + } +} + +// ClientEvent returns the ClientEvent scope's DAO +func (s *set) ClientEvent() ClientEvent { + return &clientEventDao{ + idGen: s.idGen, + auditDao: s.auditDao, + genQ: s.genQ, + } +} diff --git a/bcs-services/bcs-bscp/pkg/dal/gen/client_events.gen.go b/bcs-services/bcs-bscp/pkg/dal/gen/client_events.gen.go new file mode 100644 index 0000000000..4b7a3d66a4 --- /dev/null +++ b/bcs-services/bcs-bscp/pkg/dal/gen/client_events.gen.go @@ -0,0 +1,462 @@ +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. + +package gen + +import ( + "context" + + "gorm.io/gorm" + "gorm.io/gorm/clause" + "gorm.io/gorm/schema" + + "gorm.io/gen" + "gorm.io/gen/field" + + "gorm.io/plugin/dbresolver" + + "github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/pkg/dal/table" +) + +func newClientEvent(db *gorm.DB, opts ...gen.DOOption) clientEvent { + _clientEvent := clientEvent{} + + _clientEvent.clientEventDo.UseDB(db, opts...) + _clientEvent.clientEventDo.UseModel(&table.ClientEvent{}) + + tableName := _clientEvent.clientEventDo.TableName() + _clientEvent.ALL = field.NewAsterisk(tableName) + _clientEvent.ID = field.NewUint32(tableName, "id") + _clientEvent.ClientID = field.NewUint32(tableName, "client_id") + _clientEvent.CursorID = field.NewString(tableName, "cursor_id") + _clientEvent.UID = field.NewString(tableName, "uid") + _clientEvent.BizID = field.NewUint32(tableName, "biz_id") + _clientEvent.AppID = field.NewUint32(tableName, "app_id") + _clientEvent.ClientMode = field.NewString(tableName, "client_mode") + _clientEvent.OriginalReleaseID = field.NewUint32(tableName, "original_release_id") + _clientEvent.TargetReleaseID = field.NewUint32(tableName, "target_release_id") + _clientEvent.StartTime = field.NewTime(tableName, "start_time") + _clientEvent.EndTime = field.NewTime(tableName, "end_time") + _clientEvent.TotalSeconds = field.NewFloat64(tableName, "total_seconds") + _clientEvent.TotalFileSize = field.NewFloat64(tableName, "total_file_size") + _clientEvent.DownloadFileSize = field.NewFloat64(tableName, "download_file_size") + _clientEvent.TotalFileNum = field.NewUint32(tableName, "total_file_num") + _clientEvent.DownloadFileNum = field.NewUint32(tableName, "download_file_num") + _clientEvent.ReleaseChangeStatus = field.NewString(tableName, "release_change_status") + _clientEvent.ReleaseChangeFailedReason = field.NewString(tableName, "release_change_failed_reason") + _clientEvent.FailedDetailReason = field.NewString(tableName, "failed_detail_reason") + + _clientEvent.fillFieldMap() + + return _clientEvent +} + +type clientEvent struct { + clientEventDo clientEventDo + + ALL field.Asterisk + ID field.Uint32 + ClientID field.Uint32 + CursorID field.String + UID field.String + BizID field.Uint32 + AppID field.Uint32 + ClientMode field.String + OriginalReleaseID field.Uint32 + TargetReleaseID field.Uint32 + StartTime field.Time + EndTime field.Time + TotalSeconds field.Float64 + TotalFileSize field.Float64 + DownloadFileSize field.Float64 + TotalFileNum field.Uint32 + DownloadFileNum field.Uint32 + ReleaseChangeStatus field.String + ReleaseChangeFailedReason field.String + FailedDetailReason field.String + + fieldMap map[string]field.Expr +} + +func (c clientEvent) Table(newTableName string) *clientEvent { + c.clientEventDo.UseTable(newTableName) + return c.updateTableName(newTableName) +} + +func (c clientEvent) As(alias string) *clientEvent { + c.clientEventDo.DO = *(c.clientEventDo.As(alias).(*gen.DO)) + return c.updateTableName(alias) +} + +func (c *clientEvent) updateTableName(table string) *clientEvent { + c.ALL = field.NewAsterisk(table) + c.ID = field.NewUint32(table, "id") + c.ClientID = field.NewUint32(table, "client_id") + c.CursorID = field.NewString(table, "cursor_id") + c.UID = field.NewString(table, "uid") + c.BizID = field.NewUint32(table, "biz_id") + c.AppID = field.NewUint32(table, "app_id") + c.ClientMode = field.NewString(table, "client_mode") + c.OriginalReleaseID = field.NewUint32(table, "original_release_id") + c.TargetReleaseID = field.NewUint32(table, "target_release_id") + c.StartTime = field.NewTime(table, "start_time") + c.EndTime = field.NewTime(table, "end_time") + c.TotalSeconds = field.NewFloat64(table, "total_seconds") + c.TotalFileSize = field.NewFloat64(table, "total_file_size") + c.DownloadFileSize = field.NewFloat64(table, "download_file_size") + c.TotalFileNum = field.NewUint32(table, "total_file_num") + c.DownloadFileNum = field.NewUint32(table, "download_file_num") + c.ReleaseChangeStatus = field.NewString(table, "release_change_status") + c.ReleaseChangeFailedReason = field.NewString(table, "release_change_failed_reason") + c.FailedDetailReason = field.NewString(table, "failed_detail_reason") + + c.fillFieldMap() + + return c +} + +func (c *clientEvent) WithContext(ctx context.Context) IClientEventDo { + return c.clientEventDo.WithContext(ctx) +} + +func (c clientEvent) TableName() string { return c.clientEventDo.TableName() } + +func (c clientEvent) Alias() string { return c.clientEventDo.Alias() } + +func (c clientEvent) Columns(cols ...field.Expr) gen.Columns { return c.clientEventDo.Columns(cols...) } + +func (c *clientEvent) GetFieldByName(fieldName string) (field.OrderExpr, bool) { + _f, ok := c.fieldMap[fieldName] + if !ok || _f == nil { + return nil, false + } + _oe, ok := _f.(field.OrderExpr) + return _oe, ok +} + +func (c *clientEvent) fillFieldMap() { + c.fieldMap = make(map[string]field.Expr, 19) + c.fieldMap["id"] = c.ID + c.fieldMap["client_id"] = c.ClientID + c.fieldMap["cursor_id"] = c.CursorID + c.fieldMap["uid"] = c.UID + c.fieldMap["biz_id"] = c.BizID + c.fieldMap["app_id"] = c.AppID + c.fieldMap["client_mode"] = c.ClientMode + c.fieldMap["original_release_id"] = c.OriginalReleaseID + c.fieldMap["target_release_id"] = c.TargetReleaseID + c.fieldMap["start_time"] = c.StartTime + c.fieldMap["end_time"] = c.EndTime + c.fieldMap["total_seconds"] = c.TotalSeconds + c.fieldMap["total_file_size"] = c.TotalFileSize + c.fieldMap["download_file_size"] = c.DownloadFileSize + c.fieldMap["total_file_num"] = c.TotalFileNum + c.fieldMap["download_file_num"] = c.DownloadFileNum + c.fieldMap["release_change_status"] = c.ReleaseChangeStatus + c.fieldMap["release_change_failed_reason"] = c.ReleaseChangeFailedReason + c.fieldMap["failed_detail_reason"] = c.FailedDetailReason +} + +func (c clientEvent) clone(db *gorm.DB) clientEvent { + c.clientEventDo.ReplaceConnPool(db.Statement.ConnPool) + return c +} + +func (c clientEvent) replaceDB(db *gorm.DB) clientEvent { + c.clientEventDo.ReplaceDB(db) + return c +} + +type clientEventDo struct{ gen.DO } + +type IClientEventDo interface { + gen.SubQuery + Debug() IClientEventDo + WithContext(ctx context.Context) IClientEventDo + WithResult(fc func(tx gen.Dao)) gen.ResultInfo + ReplaceDB(db *gorm.DB) + ReadDB() IClientEventDo + WriteDB() IClientEventDo + As(alias string) gen.Dao + Session(config *gorm.Session) IClientEventDo + Columns(cols ...field.Expr) gen.Columns + Clauses(conds ...clause.Expression) IClientEventDo + Not(conds ...gen.Condition) IClientEventDo + Or(conds ...gen.Condition) IClientEventDo + Select(conds ...field.Expr) IClientEventDo + Where(conds ...gen.Condition) IClientEventDo + Order(conds ...field.Expr) IClientEventDo + Distinct(cols ...field.Expr) IClientEventDo + Omit(cols ...field.Expr) IClientEventDo + Join(table schema.Tabler, on ...field.Expr) IClientEventDo + LeftJoin(table schema.Tabler, on ...field.Expr) IClientEventDo + RightJoin(table schema.Tabler, on ...field.Expr) IClientEventDo + Group(cols ...field.Expr) IClientEventDo + Having(conds ...gen.Condition) IClientEventDo + Limit(limit int) IClientEventDo + Offset(offset int) IClientEventDo + Count() (count int64, err error) + Scopes(funcs ...func(gen.Dao) gen.Dao) IClientEventDo + Unscoped() IClientEventDo + Create(values ...*table.ClientEvent) error + CreateInBatches(values []*table.ClientEvent, batchSize int) error + Save(values ...*table.ClientEvent) error + First() (*table.ClientEvent, error) + Take() (*table.ClientEvent, error) + Last() (*table.ClientEvent, error) + Find() ([]*table.ClientEvent, error) + FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*table.ClientEvent, err error) + FindInBatches(result *[]*table.ClientEvent, batchSize int, fc func(tx gen.Dao, batch int) error) error + Pluck(column field.Expr, dest interface{}) error + Delete(...*table.ClientEvent) (info gen.ResultInfo, err error) + Update(column field.Expr, value interface{}) (info gen.ResultInfo, err error) + UpdateSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error) + Updates(value interface{}) (info gen.ResultInfo, err error) + UpdateColumn(column field.Expr, value interface{}) (info gen.ResultInfo, err error) + UpdateColumnSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error) + UpdateColumns(value interface{}) (info gen.ResultInfo, err error) + UpdateFrom(q gen.SubQuery) gen.Dao + Attrs(attrs ...field.AssignExpr) IClientEventDo + Assign(attrs ...field.AssignExpr) IClientEventDo + Joins(fields ...field.RelationField) IClientEventDo + Preload(fields ...field.RelationField) IClientEventDo + FirstOrInit() (*table.ClientEvent, error) + FirstOrCreate() (*table.ClientEvent, error) + FindByPage(offset int, limit int) (result []*table.ClientEvent, count int64, err error) + ScanByPage(result interface{}, offset int, limit int) (count int64, err error) + Scan(result interface{}) (err error) + Returning(value interface{}, columns ...string) IClientEventDo + UnderlyingDB() *gorm.DB + schema.Tabler +} + +func (c clientEventDo) Debug() IClientEventDo { + return c.withDO(c.DO.Debug()) +} + +func (c clientEventDo) WithContext(ctx context.Context) IClientEventDo { + return c.withDO(c.DO.WithContext(ctx)) +} + +func (c clientEventDo) ReadDB() IClientEventDo { + return c.Clauses(dbresolver.Read) +} + +func (c clientEventDo) WriteDB() IClientEventDo { + return c.Clauses(dbresolver.Write) +} + +func (c clientEventDo) Session(config *gorm.Session) IClientEventDo { + return c.withDO(c.DO.Session(config)) +} + +func (c clientEventDo) Clauses(conds ...clause.Expression) IClientEventDo { + return c.withDO(c.DO.Clauses(conds...)) +} + +func (c clientEventDo) Returning(value interface{}, columns ...string) IClientEventDo { + return c.withDO(c.DO.Returning(value, columns...)) +} + +func (c clientEventDo) Not(conds ...gen.Condition) IClientEventDo { + return c.withDO(c.DO.Not(conds...)) +} + +func (c clientEventDo) Or(conds ...gen.Condition) IClientEventDo { + return c.withDO(c.DO.Or(conds...)) +} + +func (c clientEventDo) Select(conds ...field.Expr) IClientEventDo { + return c.withDO(c.DO.Select(conds...)) +} + +func (c clientEventDo) Where(conds ...gen.Condition) IClientEventDo { + return c.withDO(c.DO.Where(conds...)) +} + +func (c clientEventDo) Order(conds ...field.Expr) IClientEventDo { + return c.withDO(c.DO.Order(conds...)) +} + +func (c clientEventDo) Distinct(cols ...field.Expr) IClientEventDo { + return c.withDO(c.DO.Distinct(cols...)) +} + +func (c clientEventDo) Omit(cols ...field.Expr) IClientEventDo { + return c.withDO(c.DO.Omit(cols...)) +} + +func (c clientEventDo) Join(table schema.Tabler, on ...field.Expr) IClientEventDo { + return c.withDO(c.DO.Join(table, on...)) +} + +func (c clientEventDo) LeftJoin(table schema.Tabler, on ...field.Expr) IClientEventDo { + return c.withDO(c.DO.LeftJoin(table, on...)) +} + +func (c clientEventDo) RightJoin(table schema.Tabler, on ...field.Expr) IClientEventDo { + return c.withDO(c.DO.RightJoin(table, on...)) +} + +func (c clientEventDo) Group(cols ...field.Expr) IClientEventDo { + return c.withDO(c.DO.Group(cols...)) +} + +func (c clientEventDo) Having(conds ...gen.Condition) IClientEventDo { + return c.withDO(c.DO.Having(conds...)) +} + +func (c clientEventDo) Limit(limit int) IClientEventDo { + return c.withDO(c.DO.Limit(limit)) +} + +func (c clientEventDo) Offset(offset int) IClientEventDo { + return c.withDO(c.DO.Offset(offset)) +} + +func (c clientEventDo) Scopes(funcs ...func(gen.Dao) gen.Dao) IClientEventDo { + return c.withDO(c.DO.Scopes(funcs...)) +} + +func (c clientEventDo) Unscoped() IClientEventDo { + return c.withDO(c.DO.Unscoped()) +} + +func (c clientEventDo) Create(values ...*table.ClientEvent) error { + if len(values) == 0 { + return nil + } + return c.DO.Create(values) +} + +func (c clientEventDo) CreateInBatches(values []*table.ClientEvent, batchSize int) error { + return c.DO.CreateInBatches(values, batchSize) +} + +// Save : !!! underlying implementation is different with GORM +// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values) +func (c clientEventDo) Save(values ...*table.ClientEvent) error { + if len(values) == 0 { + return nil + } + return c.DO.Save(values) +} + +func (c clientEventDo) First() (*table.ClientEvent, error) { + if result, err := c.DO.First(); err != nil { + return nil, err + } else { + return result.(*table.ClientEvent), nil + } +} + +func (c clientEventDo) Take() (*table.ClientEvent, error) { + if result, err := c.DO.Take(); err != nil { + return nil, err + } else { + return result.(*table.ClientEvent), nil + } +} + +func (c clientEventDo) Last() (*table.ClientEvent, error) { + if result, err := c.DO.Last(); err != nil { + return nil, err + } else { + return result.(*table.ClientEvent), nil + } +} + +func (c clientEventDo) Find() ([]*table.ClientEvent, error) { + result, err := c.DO.Find() + return result.([]*table.ClientEvent), err +} + +func (c clientEventDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*table.ClientEvent, err error) { + buf := make([]*table.ClientEvent, 0, batchSize) + err = c.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error { + defer func() { results = append(results, buf...) }() + return fc(tx, batch) + }) + return results, err +} + +func (c clientEventDo) FindInBatches(result *[]*table.ClientEvent, batchSize int, fc func(tx gen.Dao, batch int) error) error { + return c.DO.FindInBatches(result, batchSize, fc) +} + +func (c clientEventDo) Attrs(attrs ...field.AssignExpr) IClientEventDo { + return c.withDO(c.DO.Attrs(attrs...)) +} + +func (c clientEventDo) Assign(attrs ...field.AssignExpr) IClientEventDo { + return c.withDO(c.DO.Assign(attrs...)) +} + +func (c clientEventDo) Joins(fields ...field.RelationField) IClientEventDo { + for _, _f := range fields { + c = *c.withDO(c.DO.Joins(_f)) + } + return &c +} + +func (c clientEventDo) Preload(fields ...field.RelationField) IClientEventDo { + for _, _f := range fields { + c = *c.withDO(c.DO.Preload(_f)) + } + return &c +} + +func (c clientEventDo) FirstOrInit() (*table.ClientEvent, error) { + if result, err := c.DO.FirstOrInit(); err != nil { + return nil, err + } else { + return result.(*table.ClientEvent), nil + } +} + +func (c clientEventDo) FirstOrCreate() (*table.ClientEvent, error) { + if result, err := c.DO.FirstOrCreate(); err != nil { + return nil, err + } else { + return result.(*table.ClientEvent), nil + } +} + +func (c clientEventDo) FindByPage(offset int, limit int) (result []*table.ClientEvent, count int64, err error) { + result, err = c.Offset(offset).Limit(limit).Find() + if err != nil { + return + } + + if size := len(result); 0 < limit && 0 < size && size < limit { + count = int64(size + offset) + return + } + + count, err = c.Offset(-1).Limit(-1).Count() + return +} + +func (c clientEventDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) { + count, err = c.Count() + if err != nil { + return + } + + err = c.Offset(offset).Limit(limit).Scan(result) + return +} + +func (c clientEventDo) Scan(result interface{}) (err error) { + return c.DO.Scan(result) +} + +func (c clientEventDo) Delete(models ...*table.ClientEvent) (result gen.ResultInfo, err error) { + return c.DO.Delete(models) +} + +func (c *clientEventDo) withDO(do gen.Dao) *clientEventDo { + c.DO = *do.(*gen.DO) + return c +} diff --git a/bcs-services/bcs-bscp/pkg/dal/gen/clients.gen.go b/bcs-services/bcs-bscp/pkg/dal/gen/clients.gen.go new file mode 100644 index 0000000000..4593de8f79 --- /dev/null +++ b/bcs-services/bcs-bscp/pkg/dal/gen/clients.gen.go @@ -0,0 +1,468 @@ +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. + +package gen + +import ( + "context" + + "gorm.io/gorm" + "gorm.io/gorm/clause" + "gorm.io/gorm/schema" + + "gorm.io/gen" + "gorm.io/gen/field" + + "gorm.io/plugin/dbresolver" + + "github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/pkg/dal/table" +) + +func newClient(db *gorm.DB, opts ...gen.DOOption) client { + _client := client{} + + _client.clientDo.UseDB(db, opts...) + _client.clientDo.UseModel(&table.Client{}) + + tableName := _client.clientDo.TableName() + _client.ALL = field.NewAsterisk(tableName) + _client.ID = field.NewUint32(tableName, "id") + _client.UID = field.NewString(tableName, "uid") + _client.BizID = field.NewUint32(tableName, "biz_id") + _client.AppID = field.NewUint32(tableName, "app_id") + _client.ClientVersion = field.NewString(tableName, "client_version") + _client.ClientType = field.NewString(tableName, "client_type") + _client.Ip = field.NewString(tableName, "ip") + _client.Labels = field.NewString(tableName, "labels") + _client.Annotations = field.NewString(tableName, "annotations") + _client.FirstConnectTime = field.NewTime(tableName, "first_connect_time") + _client.LastHeartbeatTime = field.NewTime(tableName, "last_heartbeat_time") + _client.OnlineStatus = field.NewString(tableName, "online_status") + _client.CpuUsage = field.NewFloat64(tableName, "cpu_usage") + _client.CpuMaxUsage = field.NewFloat64(tableName, "cpu_max_usage") + _client.MemoryUsage = field.NewUint64(tableName, "memory_usage") + _client.MemoryMaxUsage = field.NewUint64(tableName, "memory_max_usage") + _client.CurrentReleaseID = field.NewUint32(tableName, "current_release_id") + _client.TargetReleaseID = field.NewUint32(tableName, "target_release_id") + _client.ReleaseChangeStatus = field.NewString(tableName, "release_change_status") + _client.ReleaseChangeFailedReason = field.NewString(tableName, "release_change_failed_reason") + _client.FailedDetailReason = field.NewString(tableName, "failed_detail_reason") + + _client.fillFieldMap() + + return _client +} + +type client struct { + clientDo clientDo + + ALL field.Asterisk + ID field.Uint32 + UID field.String + BizID field.Uint32 + AppID field.Uint32 + ClientVersion field.String + ClientType field.String + Ip field.String + Labels field.String + Annotations field.String + FirstConnectTime field.Time + LastHeartbeatTime field.Time + OnlineStatus field.String + CpuUsage field.Float64 + CpuMaxUsage field.Float64 + MemoryUsage field.Uint64 + MemoryMaxUsage field.Uint64 + CurrentReleaseID field.Uint32 + TargetReleaseID field.Uint32 + ReleaseChangeStatus field.String + ReleaseChangeFailedReason field.String + FailedDetailReason field.String + + fieldMap map[string]field.Expr +} + +func (c client) Table(newTableName string) *client { + c.clientDo.UseTable(newTableName) + return c.updateTableName(newTableName) +} + +func (c client) As(alias string) *client { + c.clientDo.DO = *(c.clientDo.As(alias).(*gen.DO)) + return c.updateTableName(alias) +} + +func (c *client) updateTableName(table string) *client { + c.ALL = field.NewAsterisk(table) + c.ID = field.NewUint32(table, "id") + c.UID = field.NewString(table, "uid") + c.BizID = field.NewUint32(table, "biz_id") + c.AppID = field.NewUint32(table, "app_id") + c.ClientVersion = field.NewString(table, "client_version") + c.ClientType = field.NewString(table, "client_type") + c.Ip = field.NewString(table, "ip") + c.Labels = field.NewString(table, "labels") + c.Annotations = field.NewString(table, "annotations") + c.FirstConnectTime = field.NewTime(table, "first_connect_time") + c.LastHeartbeatTime = field.NewTime(table, "last_heartbeat_time") + c.OnlineStatus = field.NewString(table, "online_status") + c.CpuUsage = field.NewFloat64(table, "cpu_usage") + c.CpuMaxUsage = field.NewFloat64(table, "cpu_max_usage") + c.MemoryUsage = field.NewUint64(table, "memory_usage") + c.MemoryMaxUsage = field.NewUint64(table, "memory_max_usage") + c.CurrentReleaseID = field.NewUint32(table, "current_release_id") + c.TargetReleaseID = field.NewUint32(table, "target_release_id") + c.ReleaseChangeStatus = field.NewString(table, "release_change_status") + c.ReleaseChangeFailedReason = field.NewString(table, "release_change_failed_reason") + c.FailedDetailReason = field.NewString(table, "failed_detail_reason") + + c.fillFieldMap() + + return c +} + +func (c *client) WithContext(ctx context.Context) IClientDo { return c.clientDo.WithContext(ctx) } + +func (c client) TableName() string { return c.clientDo.TableName() } + +func (c client) Alias() string { return c.clientDo.Alias() } + +func (c client) Columns(cols ...field.Expr) gen.Columns { return c.clientDo.Columns(cols...) } + +func (c *client) GetFieldByName(fieldName string) (field.OrderExpr, bool) { + _f, ok := c.fieldMap[fieldName] + if !ok || _f == nil { + return nil, false + } + _oe, ok := _f.(field.OrderExpr) + return _oe, ok +} + +func (c *client) fillFieldMap() { + c.fieldMap = make(map[string]field.Expr, 21) + c.fieldMap["id"] = c.ID + c.fieldMap["uid"] = c.UID + c.fieldMap["biz_id"] = c.BizID + c.fieldMap["app_id"] = c.AppID + c.fieldMap["client_version"] = c.ClientVersion + c.fieldMap["client_type"] = c.ClientType + c.fieldMap["ip"] = c.Ip + c.fieldMap["labels"] = c.Labels + c.fieldMap["annotations"] = c.Annotations + c.fieldMap["first_connect_time"] = c.FirstConnectTime + c.fieldMap["last_heartbeat_time"] = c.LastHeartbeatTime + c.fieldMap["online_status"] = c.OnlineStatus + c.fieldMap["cpu_usage"] = c.CpuUsage + c.fieldMap["cpu_max_usage"] = c.CpuMaxUsage + c.fieldMap["memory_usage"] = c.MemoryUsage + c.fieldMap["memory_max_usage"] = c.MemoryMaxUsage + c.fieldMap["current_release_id"] = c.CurrentReleaseID + c.fieldMap["target_release_id"] = c.TargetReleaseID + c.fieldMap["release_change_status"] = c.ReleaseChangeStatus + c.fieldMap["release_change_failed_reason"] = c.ReleaseChangeFailedReason + c.fieldMap["failed_detail_reason"] = c.FailedDetailReason +} + +func (c client) clone(db *gorm.DB) client { + c.clientDo.ReplaceConnPool(db.Statement.ConnPool) + return c +} + +func (c client) replaceDB(db *gorm.DB) client { + c.clientDo.ReplaceDB(db) + return c +} + +type clientDo struct{ gen.DO } + +type IClientDo interface { + gen.SubQuery + Debug() IClientDo + WithContext(ctx context.Context) IClientDo + WithResult(fc func(tx gen.Dao)) gen.ResultInfo + ReplaceDB(db *gorm.DB) + ReadDB() IClientDo + WriteDB() IClientDo + As(alias string) gen.Dao + Session(config *gorm.Session) IClientDo + Columns(cols ...field.Expr) gen.Columns + Clauses(conds ...clause.Expression) IClientDo + Not(conds ...gen.Condition) IClientDo + Or(conds ...gen.Condition) IClientDo + Select(conds ...field.Expr) IClientDo + Where(conds ...gen.Condition) IClientDo + Order(conds ...field.Expr) IClientDo + Distinct(cols ...field.Expr) IClientDo + Omit(cols ...field.Expr) IClientDo + Join(table schema.Tabler, on ...field.Expr) IClientDo + LeftJoin(table schema.Tabler, on ...field.Expr) IClientDo + RightJoin(table schema.Tabler, on ...field.Expr) IClientDo + Group(cols ...field.Expr) IClientDo + Having(conds ...gen.Condition) IClientDo + Limit(limit int) IClientDo + Offset(offset int) IClientDo + Count() (count int64, err error) + Scopes(funcs ...func(gen.Dao) gen.Dao) IClientDo + Unscoped() IClientDo + Create(values ...*table.Client) error + CreateInBatches(values []*table.Client, batchSize int) error + Save(values ...*table.Client) error + First() (*table.Client, error) + Take() (*table.Client, error) + Last() (*table.Client, error) + Find() ([]*table.Client, error) + FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*table.Client, err error) + FindInBatches(result *[]*table.Client, batchSize int, fc func(tx gen.Dao, batch int) error) error + Pluck(column field.Expr, dest interface{}) error + Delete(...*table.Client) (info gen.ResultInfo, err error) + Update(column field.Expr, value interface{}) (info gen.ResultInfo, err error) + UpdateSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error) + Updates(value interface{}) (info gen.ResultInfo, err error) + UpdateColumn(column field.Expr, value interface{}) (info gen.ResultInfo, err error) + UpdateColumnSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error) + UpdateColumns(value interface{}) (info gen.ResultInfo, err error) + UpdateFrom(q gen.SubQuery) gen.Dao + Attrs(attrs ...field.AssignExpr) IClientDo + Assign(attrs ...field.AssignExpr) IClientDo + Joins(fields ...field.RelationField) IClientDo + Preload(fields ...field.RelationField) IClientDo + FirstOrInit() (*table.Client, error) + FirstOrCreate() (*table.Client, error) + FindByPage(offset int, limit int) (result []*table.Client, count int64, err error) + ScanByPage(result interface{}, offset int, limit int) (count int64, err error) + Scan(result interface{}) (err error) + Returning(value interface{}, columns ...string) IClientDo + UnderlyingDB() *gorm.DB + schema.Tabler +} + +func (c clientDo) Debug() IClientDo { + return c.withDO(c.DO.Debug()) +} + +func (c clientDo) WithContext(ctx context.Context) IClientDo { + return c.withDO(c.DO.WithContext(ctx)) +} + +func (c clientDo) ReadDB() IClientDo { + return c.Clauses(dbresolver.Read) +} + +func (c clientDo) WriteDB() IClientDo { + return c.Clauses(dbresolver.Write) +} + +func (c clientDo) Session(config *gorm.Session) IClientDo { + return c.withDO(c.DO.Session(config)) +} + +func (c clientDo) Clauses(conds ...clause.Expression) IClientDo { + return c.withDO(c.DO.Clauses(conds...)) +} + +func (c clientDo) Returning(value interface{}, columns ...string) IClientDo { + return c.withDO(c.DO.Returning(value, columns...)) +} + +func (c clientDo) Not(conds ...gen.Condition) IClientDo { + return c.withDO(c.DO.Not(conds...)) +} + +func (c clientDo) Or(conds ...gen.Condition) IClientDo { + return c.withDO(c.DO.Or(conds...)) +} + +func (c clientDo) Select(conds ...field.Expr) IClientDo { + return c.withDO(c.DO.Select(conds...)) +} + +func (c clientDo) Where(conds ...gen.Condition) IClientDo { + return c.withDO(c.DO.Where(conds...)) +} + +func (c clientDo) Order(conds ...field.Expr) IClientDo { + return c.withDO(c.DO.Order(conds...)) +} + +func (c clientDo) Distinct(cols ...field.Expr) IClientDo { + return c.withDO(c.DO.Distinct(cols...)) +} + +func (c clientDo) Omit(cols ...field.Expr) IClientDo { + return c.withDO(c.DO.Omit(cols...)) +} + +func (c clientDo) Join(table schema.Tabler, on ...field.Expr) IClientDo { + return c.withDO(c.DO.Join(table, on...)) +} + +func (c clientDo) LeftJoin(table schema.Tabler, on ...field.Expr) IClientDo { + return c.withDO(c.DO.LeftJoin(table, on...)) +} + +func (c clientDo) RightJoin(table schema.Tabler, on ...field.Expr) IClientDo { + return c.withDO(c.DO.RightJoin(table, on...)) +} + +func (c clientDo) Group(cols ...field.Expr) IClientDo { + return c.withDO(c.DO.Group(cols...)) +} + +func (c clientDo) Having(conds ...gen.Condition) IClientDo { + return c.withDO(c.DO.Having(conds...)) +} + +func (c clientDo) Limit(limit int) IClientDo { + return c.withDO(c.DO.Limit(limit)) +} + +func (c clientDo) Offset(offset int) IClientDo { + return c.withDO(c.DO.Offset(offset)) +} + +func (c clientDo) Scopes(funcs ...func(gen.Dao) gen.Dao) IClientDo { + return c.withDO(c.DO.Scopes(funcs...)) +} + +func (c clientDo) Unscoped() IClientDo { + return c.withDO(c.DO.Unscoped()) +} + +func (c clientDo) Create(values ...*table.Client) error { + if len(values) == 0 { + return nil + } + return c.DO.Create(values) +} + +func (c clientDo) CreateInBatches(values []*table.Client, batchSize int) error { + return c.DO.CreateInBatches(values, batchSize) +} + +// Save : !!! underlying implementation is different with GORM +// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values) +func (c clientDo) Save(values ...*table.Client) error { + if len(values) == 0 { + return nil + } + return c.DO.Save(values) +} + +func (c clientDo) First() (*table.Client, error) { + if result, err := c.DO.First(); err != nil { + return nil, err + } else { + return result.(*table.Client), nil + } +} + +func (c clientDo) Take() (*table.Client, error) { + if result, err := c.DO.Take(); err != nil { + return nil, err + } else { + return result.(*table.Client), nil + } +} + +func (c clientDo) Last() (*table.Client, error) { + if result, err := c.DO.Last(); err != nil { + return nil, err + } else { + return result.(*table.Client), nil + } +} + +func (c clientDo) Find() ([]*table.Client, error) { + result, err := c.DO.Find() + return result.([]*table.Client), err +} + +func (c clientDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*table.Client, err error) { + buf := make([]*table.Client, 0, batchSize) + err = c.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error { + defer func() { results = append(results, buf...) }() + return fc(tx, batch) + }) + return results, err +} + +func (c clientDo) FindInBatches(result *[]*table.Client, batchSize int, fc func(tx gen.Dao, batch int) error) error { + return c.DO.FindInBatches(result, batchSize, fc) +} + +func (c clientDo) Attrs(attrs ...field.AssignExpr) IClientDo { + return c.withDO(c.DO.Attrs(attrs...)) +} + +func (c clientDo) Assign(attrs ...field.AssignExpr) IClientDo { + return c.withDO(c.DO.Assign(attrs...)) +} + +func (c clientDo) Joins(fields ...field.RelationField) IClientDo { + for _, _f := range fields { + c = *c.withDO(c.DO.Joins(_f)) + } + return &c +} + +func (c clientDo) Preload(fields ...field.RelationField) IClientDo { + for _, _f := range fields { + c = *c.withDO(c.DO.Preload(_f)) + } + return &c +} + +func (c clientDo) FirstOrInit() (*table.Client, error) { + if result, err := c.DO.FirstOrInit(); err != nil { + return nil, err + } else { + return result.(*table.Client), nil + } +} + +func (c clientDo) FirstOrCreate() (*table.Client, error) { + if result, err := c.DO.FirstOrCreate(); err != nil { + return nil, err + } else { + return result.(*table.Client), nil + } +} + +func (c clientDo) FindByPage(offset int, limit int) (result []*table.Client, count int64, err error) { + result, err = c.Offset(offset).Limit(limit).Find() + if err != nil { + return + } + + if size := len(result); 0 < limit && 0 < size && size < limit { + count = int64(size + offset) + return + } + + count, err = c.Offset(-1).Limit(-1).Count() + return +} + +func (c clientDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) { + count, err = c.Count() + if err != nil { + return + } + + err = c.Offset(offset).Limit(limit).Scan(result) + return +} + +func (c clientDo) Scan(result interface{}) (err error) { + return c.DO.Scan(result) +} + +func (c clientDo) Delete(models ...*table.Client) (result gen.ResultInfo, err error) { + return c.DO.Delete(models) +} + +func (c *clientDo) withDO(do gen.Dao) *clientDo { + c.DO = *do.(*gen.DO) + return c +} diff --git a/bcs-services/bcs-bscp/pkg/dal/gen/gen.go b/bcs-services/bcs-bscp/pkg/dal/gen/gen.go index 1ce00b235c..d76a5df05b 100644 --- a/bcs-services/bcs-bscp/pkg/dal/gen/gen.go +++ b/bcs-services/bcs-bscp/pkg/dal/gen/gen.go @@ -22,6 +22,8 @@ var ( AppTemplateVariable *appTemplateVariable ArchivedApp *archivedApp Audit *audit + Client *client + ClientEvent *clientEvent Commit *commit ConfigItem *configItem Content *content @@ -57,6 +59,8 @@ func SetDefault(db *gorm.DB, opts ...gen.DOOption) { AppTemplateVariable = &Q.AppTemplateVariable ArchivedApp = &Q.ArchivedApp Audit = &Q.Audit + Client = &Q.Client + ClientEvent = &Q.ClientEvent Commit = &Q.Commit ConfigItem = &Q.ConfigItem Content = &Q.Content @@ -93,6 +97,8 @@ func Use(db *gorm.DB, opts ...gen.DOOption) *Query { AppTemplateVariable: newAppTemplateVariable(db, opts...), ArchivedApp: newArchivedApp(db, opts...), Audit: newAudit(db, opts...), + Client: newClient(db, opts...), + ClientEvent: newClientEvent(db, opts...), Commit: newCommit(db, opts...), ConfigItem: newConfigItem(db, opts...), Content: newContent(db, opts...), @@ -130,6 +136,8 @@ type Query struct { AppTemplateVariable appTemplateVariable ArchivedApp archivedApp Audit audit + Client client + ClientEvent clientEvent Commit commit ConfigItem configItem Content content @@ -168,6 +176,8 @@ func (q *Query) clone(db *gorm.DB) *Query { AppTemplateVariable: q.AppTemplateVariable.clone(db), ArchivedApp: q.ArchivedApp.clone(db), Audit: q.Audit.clone(db), + Client: q.Client.clone(db), + ClientEvent: q.ClientEvent.clone(db), Commit: q.Commit.clone(db), ConfigItem: q.ConfigItem.clone(db), Content: q.Content.clone(db), @@ -213,6 +223,8 @@ func (q *Query) ReplaceDB(db *gorm.DB) *Query { AppTemplateVariable: q.AppTemplateVariable.replaceDB(db), ArchivedApp: q.ArchivedApp.replaceDB(db), Audit: q.Audit.replaceDB(db), + Client: q.Client.replaceDB(db), + ClientEvent: q.ClientEvent.replaceDB(db), Commit: q.Commit.replaceDB(db), ConfigItem: q.ConfigItem.replaceDB(db), Content: q.Content.replaceDB(db), @@ -248,6 +260,8 @@ type queryCtx struct { AppTemplateVariable IAppTemplateVariableDo ArchivedApp IArchivedAppDo Audit IAuditDo + Client IClientDo + ClientEvent IClientEventDo Commit ICommitDo ConfigItem IConfigItemDo Content IContentDo @@ -283,6 +297,8 @@ func (q *Query) WithContext(ctx context.Context) *queryCtx { AppTemplateVariable: q.AppTemplateVariable.WithContext(ctx), ArchivedApp: q.ArchivedApp.WithContext(ctx), Audit: q.Audit.WithContext(ctx), + Client: q.Client.WithContext(ctx), + ClientEvent: q.ClientEvent.WithContext(ctx), Commit: q.Commit.WithContext(ctx), ConfigItem: q.ConfigItem.WithContext(ctx), Content: q.Content.WithContext(ctx), diff --git a/bcs-services/bcs-bscp/pkg/dal/table/client.go b/bcs-services/bcs-bscp/pkg/dal/table/client.go new file mode 100644 index 0000000000..77a6ae6055 --- /dev/null +++ b/bcs-services/bcs-bscp/pkg/dal/table/client.go @@ -0,0 +1,247 @@ +/* + * Tencent is pleased to support the open source community by making Blueking Container Service available. + * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. + * Licensed under the MIT License (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * http://opensource.org/licenses/MIT + * Unless required by applicable law or agreed to in writing, software distributed under + * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, + * either express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + +package table + +import ( + "errors" + "fmt" + "time" +) + +// Client is a client +type Client struct { + ID uint32 `gorm:"column:id" json:"id"` + Attachment *ClientAttachment `json:"attachment" gorm:"embedded"` + Spec *ClientSpec `json:"spec" gorm:"embedded"` +} + +// ClientSpec is a client spec +type ClientSpec struct { + ClientVersion string `gorm:"column:client_version" json:"client_version"` + ClientType ClientType `gorm:"column:client_type" json:"client_type"` + Ip string `gorm:"column:ip" json:"ip"` + Labels string `gorm:"column:labels" json:"labels"` + Annotations string `gorm:"column:annotations" json:"annotations"` + FirstConnectTime time.Time `gorm:"column:first_connect_time" json:"first_connect_time"` + LastHeartbeatTime time.Time `gorm:"column:last_heartbeat_time" json:"last_heartbeat_time"` + OnlineStatus OnlineStatus `gorm:"column:online_status" json:"online_status"` + Resource Resource `json:"resource" gorm:"embedded"` + CurrentReleaseID uint32 `gorm:"column:current_release_id" json:"current_release_id"` + TargetReleaseID uint32 `gorm:"column:target_release_id" json:"target_release_id"` + ReleaseChangeStatus Status `gorm:"column:release_change_status" json:"release_change_status"` + ReleaseChangeFailedReason FailedReason `gorm:"column:release_change_failed_reason" json:"release_change_failed_reason"` + FailedDetailReason string `gorm:"column:failed_detail_reason" json:"failed_detail_reason"` +} + +// ClientAttachment is a client attachment +type ClientAttachment struct { + UID string `gorm:"column:uid" json:"uid"` + BizID uint32 `db:"biz_id" gorm:"column:biz_id"` + AppID uint32 `db:"app_id" gorm:"column:app_id"` +} + +// Resource resource information +type Resource struct { + CpuUsage float64 `gorm:"column:cpu_usage" json:"cpu_usage"` + CpuMaxUsage float64 `gorm:"column:cpu_max_usage" json:"cpu_max_usage"` + MemoryUsage uint64 `gorm:"column:memory_usage" json:"memory_usage"` + MemoryMaxUsage uint64 `gorm:"column:memory_max_usage" json:"memory_max_usage"` +} + +// TableName is the app's database table name. +func (c *Client) TableName() string { + return "clients" +} + +// AppID AuditRes interface +func (c *Client) AppID() uint32 { + return c.ID +} + +// ResID AuditRes interface +func (c *Client) ResID() uint32 { + return c.ID +} + +// ResType AuditRes interface +func (c *Client) ResType() string { + return "client" +} + +// ValidateCreate validate app's info when created. +func (c *Client) ValidateCreate() error { + if c.ID != 0 { + return errors.New("id can not be set") + } + + if c.Spec == nil { + return errors.New("spec not set") + } + + if err := c.Spec.ValidateCreate(); err != nil { + return err + } + + if c.Attachment == nil { + return errors.New("attachment not set") + } + + if err := c.Attachment.ValidateCreate(); err != nil { + return err + } + + return nil +} + +// ValidateCreate validate client spec when it is created. +func (c *ClientSpec) ValidateCreate() error { + if c.ClientVersion == "" { + return errors.New("client version not set") + } + + if c.Ip == "" { + return errors.New("ip not set") + } + + if c.LastHeartbeatTime.String() == "" { + return errors.New("last heartbeat time not set") + } + + if err := c.OnlineStatus.Validate(); err != nil { + return err + } + + return nil +} + +// ValidateCreate validate client attachment when it is created. +func (c *ClientAttachment) ValidateCreate() error { + if c.BizID <= 0 { + return errors.New("biz id not set") + } + + if c.UID == "" { + return errors.New("uid not set") + } + + if c.AppID <= 0 { + return errors.New("app id not set") + } + + return nil +} + +// Status define the status structure +type Status string + +const ( + // Success xxx + Success Status = "Success" + // Failed xxx + Failed Status = "Failed" + // Processing xxx + Processing Status = "Processing" + // Skip xxx + Skip Status = "Skip" +) + +// Validate the version change status is valid or not. +func (rs Status) Validate() error { + switch rs { + case Success: + case Failed: + case Processing: + case Skip: + } + + return nil +} + +// OnlineStatus define the online status structure +type OnlineStatus string + +const ( + // Online xxx + Online OnlineStatus = "online" + // Offline xxx + Offline OnlineStatus = "offline" +) + +// Validate the online status is valid or not. +func (os OnlineStatus) Validate() error { + switch os { + case Online: + case Offline: + default: + return fmt.Errorf("unknown %s sidecar online status", os) + } + + return nil +} + +// FailedReason define the failure cause structure +type FailedReason string + +const ( + // PreHookFailed pre hook failed + PreHookFailed FailedReason = "PreHookFailed" + // PostHookFailed post hook failed + PostHookFailed FailedReason = "PostHookFailed" + // DownloadFailed download failed + DownloadFailed FailedReason = "DownloadFailed" + // SkipFailed Skip failed + SkipFailed FailedReason = "SkipFailed" +) + +// Validate the failed reason is valid or not. +func (fr FailedReason) Validate() error { + switch fr { + case PreHookFailed: + case PostHookFailed: + case DownloadFailed: + case SkipFailed: + } + + return nil +} + +// ClientType client type (agent、sidecar、sdk、command). +type ClientType string + +const ( + // SDK xxx + SDK ClientType = "sdk" + // Sidecar xxx + Sidecar ClientType = "sidecar" + // Agent xxx + Agent ClientType = "agent" + // Command xxx + Command ClientType = "command" + // Unknown xxx + Unknown ClientType = "unknown" +) + +// Validate the client type is valid or not. +func (ct ClientType) Validate() error { + switch ct { + case SDK: + case Sidecar: + case Agent: + case Command: + case Unknown: + default: + return fmt.Errorf("unknown %s client type", ct) + } + + return nil +} diff --git a/bcs-services/bcs-bscp/pkg/dal/table/client_event.go b/bcs-services/bcs-bscp/pkg/dal/table/client_event.go new file mode 100644 index 0000000000..7e41cc5fc9 --- /dev/null +++ b/bcs-services/bcs-bscp/pkg/dal/table/client_event.go @@ -0,0 +1,162 @@ +/* + * Tencent is pleased to support the open source community by making Blueking Container Service available. + * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. + * Licensed under the MIT License (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * http://opensource.org/licenses/MIT + * Unless required by applicable law or agreed to in writing, software distributed under + * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, + * either express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + +package table + +import ( + "errors" + "fmt" + "time" +) + +// ClientEvent is a client event +type ClientEvent struct { + ID uint32 `gorm:"column:id" json:"id"` + Attachment *ClientEventAttachment `json:"attachment" gorm:"embedded"` + Spec *ClientEventSpec `json:"spec" gorm:"embedded"` +} + +// ClientEventSpec is a client event spec +type ClientEventSpec struct { + OriginalReleaseID uint32 `gorm:"column:original_release_id" json:"original_release_id"` + TargetReleaseID uint32 `gorm:"column:target_release_id" json:"target_release_id"` + StartTime time.Time `gorm:"column:start_time" json:"start_time"` + EndTime time.Time `gorm:"column:end_time" json:"end_time"` + TotalSeconds float64 `gorm:"column:total_seconds" json:"total_seconds"` + TotalFileSize float64 `gorm:"column:total_file_size" json:"total_file_size"` + DownloadFileSize float64 `gorm:"column:download_file_size" json:"download_file_size"` + TotalFileNum uint32 `gorm:"column:total_file_num" json:"total_file_num"` + DownloadFileNum uint32 `gorm:"column:download_file_num" json:"download_file_num"` + ReleaseChangeStatus Status `gorm:"column:release_change_status" json:"release_change_status"` + ReleaseChangeFailedReason FailedReason `gorm:"column:release_change_failed_reason" json:"release_change_failed_reason"` + FailedDetailReason string `gorm:"column:failed_detail_reason" json:"failed_detail_reason"` +} + +// ClientEventAttachment is a client event attachment +type ClientEventAttachment struct { + ClientID uint32 `gorm:"column:client_id" json:"client_id"` + CursorID string `gorm:"column:cursor_id" json:"cursor_id"` + UID string `gorm:"column:uid" json:"uid"` + BizID uint32 `db:"biz_id" gorm:"column:biz_id"` + AppID uint32 `db:"app_id" gorm:"column:app_id"` + ClientMode ClientMode `gorm:"column:client_mode" json:"client_mode"` +} + +// ClientMode define the client mode structure +type ClientMode string + +const ( + // Pull xxx + Pull ClientMode = "Pull" + // Watch xxx + Watch ClientMode = "Watch" +) + +// Validate the client mode is valid or not. +func (cm ClientMode) Validate() error { + switch cm { + case Pull: + case Watch: + default: + return fmt.Errorf("unknown %s sidecar client mode", cm) + } + + return nil +} + +// TableName is the app's database table name. +func (c *ClientEvent) TableName() string { + return "client_events" +} + +// AppID AuditRes interface +func (c *ClientEvent) AppID() uint32 { + return c.ID +} + +// ResID AuditRes interface +func (c *ClientEvent) ResID() uint32 { + return c.ID +} + +// ResType AuditRes interface +func (c *ClientEvent) ResType() string { + return "client_event" +} + +// ValidateCreate validate group is valid or not when create it. +func (c *ClientEvent) ValidateCreate() error { + + if c.ID > 0 { + return errors.New("id should not be set") + } + + if c.Spec == nil { + return errors.New("spec not set") + } + + if err := c.Spec.ValidateCreate(); err != nil { + return err + } + + if c.Attachment == nil { + return errors.New("attachment not set") + } + + if err := c.Attachment.ValidateCreate(); err != nil { + return err + } + + return nil +} + +// ValidateCreate validate client event spec when it is created. +func (c *ClientEventSpec) ValidateCreate() error { + // if c.TargetReleaseID <= 0 { + // return errors.New("target release id not set") + // } + + if c.StartTime.String() == "" { + return errors.New("start time not set") + } + + if c.EndTime.String() == "" { + return errors.New("end time not set") + } + + return nil +} + +// ValidateCreate validate client event attachment when it is created. +func (c *ClientEventAttachment) ValidateCreate() error { + if c.BizID <= 0 { + return errors.New("biz id not set") + } + + if c.UID == "" { + return errors.New("uid not set") + } + + if c.AppID <= 0 { + return errors.New("app id not set") + } + + if c.ClientID <= 0 { + return errors.New("client id not set") + } + + if err := c.ClientMode.Validate(); err != nil { + return err + } + + return nil +} diff --git a/bcs-services/bcs-bscp/pkg/dal/table/table.go b/bcs-services/bcs-bscp/pkg/dal/table/table.go index 70690260ef..83bff273d3 100644 --- a/bcs-services/bcs-bscp/pkg/dal/table/table.go +++ b/bcs-services/bcs-bscp/pkg/dal/table/table.go @@ -247,6 +247,10 @@ const ( TemplateRevisionsTable Name = "template_revisions" // ReleasedKvTable is released kv table's name ReleasedKvTable Name = "released_kvs" + // ClientTable is clients table's name + ClientTable Name = "clients" + // ClientEventTable is client_events table's name + ClientEventTable Name = "client_events" ) // RevisionColumns defines all the Revision table's columns. diff --git a/bcs-services/bcs-bscp/pkg/protocol/cache-service/cache_service.pb.go b/bcs-services/bcs-bscp/pkg/protocol/cache-service/cache_service.pb.go index 74e6b1fcf3..a3485eeea0 100644 --- a/bcs-services/bcs-bscp/pkg/protocol/cache-service/cache_service.pb.go +++ b/bcs-services/bcs-bscp/pkg/protocol/cache-service/cache_service.pb.go @@ -1347,6 +1347,107 @@ func (x *GetReleasedKvValueReq) GetKey() string { return "" } +type SetClientMetricReq struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + BizId uint32 `protobuf:"varint,1,opt,name=biz_id,json=bizId,proto3" json:"biz_id,omitempty"` + AppId uint32 `protobuf:"varint,2,opt,name=app_id,json=appId,proto3" json:"app_id,omitempty"` + Payload []byte `protobuf:"bytes,3,opt,name=payload,proto3" json:"payload,omitempty"` +} + +func (x *SetClientMetricReq) Reset() { + *x = SetClientMetricReq{} + if protoimpl.UnsafeEnabled { + mi := &file_cache_service_proto_msgTypes[24] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SetClientMetricReq) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SetClientMetricReq) ProtoMessage() {} + +func (x *SetClientMetricReq) ProtoReflect() protoreflect.Message { + mi := &file_cache_service_proto_msgTypes[24] + 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 SetClientMetricReq.ProtoReflect.Descriptor instead. +func (*SetClientMetricReq) Descriptor() ([]byte, []int) { + return file_cache_service_proto_rawDescGZIP(), []int{24} +} + +func (x *SetClientMetricReq) GetBizId() uint32 { + if x != nil { + return x.BizId + } + return 0 +} + +func (x *SetClientMetricReq) GetAppId() uint32 { + if x != nil { + return x.AppId + } + return 0 +} + +func (x *SetClientMetricReq) GetPayload() []byte { + if x != nil { + return x.Payload + } + return nil +} + +type SetClientMetricResp struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *SetClientMetricResp) Reset() { + *x = SetClientMetricResp{} + if protoimpl.UnsafeEnabled { + mi := &file_cache_service_proto_msgTypes[25] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SetClientMetricResp) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SetClientMetricResp) ProtoMessage() {} + +func (x *SetClientMetricResp) ProtoReflect() protoreflect.Message { + mi := &file_cache_service_proto_msgTypes[25] + 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 SetClientMetricResp.ProtoReflect.Descriptor instead. +func (*SetClientMetricResp) Descriptor() ([]byte, []int) { + return file_cache_service_proto_rawDescGZIP(), []int{25} +} + var File_cache_service_proto protoreflect.FileDescriptor var file_cache_service_proto_rawDesc = []byte{ @@ -1479,103 +1580,119 @@ var file_cache_service_proto_rawDesc = []byte{ 0x73, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x32, - 0x8d, 0x0b, 0x0a, 0x05, 0x43, 0x61, 0x63, 0x68, 0x65, 0x12, 0x6c, 0x0a, 0x08, 0x47, 0x65, 0x74, - 0x41, 0x70, 0x70, 0x49, 0x44, 0x12, 0x11, 0x2e, 0x70, 0x62, 0x63, 0x73, 0x2e, 0x47, 0x65, 0x74, - 0x41, 0x70, 0x70, 0x49, 0x44, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x70, 0x62, 0x63, 0x73, 0x2e, - 0x47, 0x65, 0x74, 0x41, 0x70, 0x70, 0x49, 0x44, 0x52, 0x65, 0x73, 0x70, 0x22, 0x39, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x33, 0x12, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x61, - 0x63, 0x68, 0x65, 0x2f, 0x62, 0x69, 0x7a, 0x2f, 0x7b, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x7d, - 0x2f, 0x61, 0x70, 0x70, 0x73, 0x2f, 0x7b, 0x61, 0x70, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, - 0x2f, 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x12, 0x6b, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x41, 0x70, - 0x70, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x13, 0x2e, 0x70, 0x62, 0x63, 0x73, 0x2e, 0x47, 0x65, 0x74, - 0x41, 0x70, 0x70, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x70, 0x62, 0x63, - 0x73, 0x2e, 0x4a, 0x73, 0x6f, 0x6e, 0x52, 0x61, 0x77, 0x52, 0x65, 0x73, 0x70, 0x22, 0x35, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x2f, 0x3a, 0x01, 0x2a, 0x22, 0x2a, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, - 0x31, 0x2f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x61, 0x70, 0x70, 0x2f, - 0x6d, 0x65, 0x74, 0x61, 0x2f, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x2f, 0x7b, 0x62, 0x69, 0x7a, - 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x33, 0x0a, 0x08, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x70, 0x70, 0x73, - 0x12, 0x11, 0x2e, 0x70, 0x62, 0x63, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x70, 0x70, 0x73, - 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x70, 0x62, 0x63, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, - 0x70, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x12, 0x70, 0x0a, 0x0d, 0x47, 0x65, 0x74, - 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x43, 0x49, 0x12, 0x16, 0x2e, 0x70, 0x62, 0x63, - 0x73, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x43, 0x49, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x22, + 0x5c, 0x0a, 0x12, 0x53, 0x65, 0x74, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, + 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x61, 0x70, + 0x70, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x15, 0x0a, + 0x13, 0x53, 0x65, 0x74, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x52, 0x65, 0x73, 0x70, 0x32, 0x99, 0x0c, 0x0a, 0x05, 0x43, 0x61, 0x63, 0x68, 0x65, 0x12, 0x6c, + 0x0a, 0x08, 0x47, 0x65, 0x74, 0x41, 0x70, 0x70, 0x49, 0x44, 0x12, 0x11, 0x2e, 0x70, 0x62, 0x63, + 0x73, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x70, 0x70, 0x49, 0x44, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, + 0x70, 0x62, 0x63, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x70, 0x70, 0x49, 0x44, 0x52, 0x65, 0x73, + 0x70, 0x22, 0x39, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x33, 0x12, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f, + 0x76, 0x31, 0x2f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x2f, 0x62, 0x69, 0x7a, 0x2f, 0x7b, 0x62, 0x69, + 0x7a, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x61, 0x70, 0x70, 0x73, 0x2f, 0x7b, 0x61, 0x70, 0x70, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x12, 0x6b, 0x0a, 0x0a, + 0x47, 0x65, 0x74, 0x41, 0x70, 0x70, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x13, 0x2e, 0x70, 0x62, 0x63, + 0x73, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x70, 0x70, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x65, 0x71, 0x1a, + 0x11, 0x2e, 0x70, 0x62, 0x63, 0x73, 0x2e, 0x4a, 0x73, 0x6f, 0x6e, 0x52, 0x61, 0x77, 0x52, 0x65, + 0x73, 0x70, 0x22, 0x35, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2f, 0x3a, 0x01, 0x2a, 0x22, 0x2a, 0x2f, + 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x2f, 0x61, 0x70, 0x70, + 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x6d, 0x65, 0x74, 0x61, 0x2f, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, + 0x2f, 0x7b, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x33, 0x0a, 0x08, 0x4c, 0x69, 0x73, + 0x74, 0x41, 0x70, 0x70, 0x73, 0x12, 0x11, 0x2e, 0x70, 0x62, 0x63, 0x73, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x41, 0x70, 0x70, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x70, 0x62, 0x63, 0x73, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x41, 0x70, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x12, 0x70, + 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x43, 0x49, 0x12, + 0x16, 0x2e, 0x70, 0x62, 0x63, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, + 0x65, 0x64, 0x43, 0x49, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x70, 0x62, 0x63, 0x73, 0x2e, 0x4a, + 0x73, 0x6f, 0x6e, 0x52, 0x61, 0x77, 0x52, 0x65, 0x73, 0x70, 0x22, 0x34, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x2e, 0x3a, 0x01, 0x2a, 0x22, 0x29, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x63, + 0x61, 0x63, 0x68, 0x65, 0x2f, 0x63, 0x69, 0x2f, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, + 0x2f, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x2f, 0x7b, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x7d, + 0x12, 0x76, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x48, + 0x6f, 0x6f, 0x6b, 0x12, 0x18, 0x2e, 0x70, 0x62, 0x63, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, + 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, + 0x70, 0x62, 0x63, 0x73, 0x2e, 0x4a, 0x73, 0x6f, 0x6e, 0x52, 0x61, 0x77, 0x52, 0x65, 0x73, 0x70, + 0x22, 0x36, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x30, 0x3a, 0x01, 0x2a, 0x22, 0x2b, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x2f, 0x68, 0x6f, 0x6f, 0x6b, 0x2f, + 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x2f, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x2f, + 0x7b, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x8c, 0x01, 0x0a, 0x15, 0x4c, 0x69, 0x73, + 0x74, 0x41, 0x70, 0x70, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x73, 0x12, 0x1e, 0x2e, 0x70, 0x62, 0x63, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x70, + 0x70, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x70, 0x62, 0x63, 0x73, 0x2e, 0x4a, 0x73, 0x6f, 0x6e, 0x52, 0x61, - 0x77, 0x52, 0x65, 0x73, 0x70, 0x22, 0x34, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2e, 0x3a, 0x01, 0x2a, - 0x22, 0x29, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x2f, - 0x63, 0x69, 0x2f, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x2f, 0x62, 0x69, 0x7a, 0x5f, - 0x69, 0x64, 0x2f, 0x7b, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x76, 0x0a, 0x0f, 0x47, - 0x65, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x48, 0x6f, 0x6f, 0x6b, 0x12, 0x18, + 0x77, 0x52, 0x65, 0x73, 0x70, 0x22, 0x40, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3a, 0x12, 0x38, 0x2f, + 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x2f, 0x62, 0x69, 0x7a, + 0x2f, 0x7b, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x61, 0x70, 0x70, 0x73, 0x2f, 0x7b, + 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, + 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, 0x83, 0x01, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x43, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x52, 0x65, 0x6d, 0x69, + 0x6e, 0x64, 0x65, 0x72, 0x12, 0x10, 0x2e, 0x70, 0x62, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x52, 0x65, 0x71, 0x1a, 0x1f, 0x2e, 0x70, 0x62, 0x63, 0x73, 0x2e, 0x43, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x52, 0x65, 0x6d, 0x69, 0x6e, + 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x22, 0x34, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2e, 0x3a, + 0x01, 0x2a, 0x22, 0x29, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x61, 0x63, 0x68, + 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x2f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2f, 0x72, 0x65, 0x6d, + 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x6b, 0x0a, + 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x4d, 0x65, 0x74, 0x61, 0x12, + 0x13, 0x2e, 0x70, 0x62, 0x63, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x73, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x70, 0x62, 0x63, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x28, 0x3a, 0x01, 0x2a, 0x22, 0x23, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x63, + 0x61, 0x63, 0x68, 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x2f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2f, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2f, 0x6d, 0x65, 0x74, 0x61, 0x12, 0x76, 0x0a, 0x0d, 0x47, 0x65, + 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x12, 0x16, 0x2e, 0x70, 0x62, + 0x63, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, + 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x70, 0x62, 0x63, 0x73, 0x2e, 0x4a, 0x73, 0x6f, 0x6e, 0x52, + 0x61, 0x77, 0x52, 0x65, 0x73, 0x70, 0x22, 0x3a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x34, 0x12, 0x32, + 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x2f, 0x62, 0x69, + 0x7a, 0x2f, 0x7b, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x63, 0x72, 0x65, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x2f, 0x7b, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, + 0x6c, 0x7d, 0x12, 0x3f, 0x0a, 0x0c, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x41, 0x70, 0x70, 0x4d, 0x65, + 0x74, 0x61, 0x12, 0x15, 0x2e, 0x70, 0x62, 0x63, 0x73, 0x2e, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x41, + 0x70, 0x70, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x70, 0x62, 0x63, 0x73, + 0x2e, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x41, 0x70, 0x70, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x65, 0x73, + 0x70, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0f, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x52, 0x65, 0x6c, 0x65, + 0x61, 0x73, 0x65, 0x64, 0x43, 0x49, 0x12, 0x18, 0x2e, 0x70, 0x62, 0x63, 0x73, 0x2e, 0x42, 0x65, + 0x6e, 0x63, 0x68, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x43, 0x49, 0x52, 0x65, 0x71, + 0x1a, 0x19, 0x2e, 0x70, 0x62, 0x63, 0x73, 0x2e, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x52, 0x65, 0x6c, + 0x65, 0x61, 0x73, 0x65, 0x64, 0x43, 0x49, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x12, 0x70, 0x0a, + 0x0d, 0x47, 0x65, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x4b, 0x76, 0x12, 0x16, 0x2e, 0x70, 0x62, 0x63, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, - 0x64, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x70, 0x62, 0x63, 0x73, 0x2e, - 0x4a, 0x73, 0x6f, 0x6e, 0x52, 0x61, 0x77, 0x52, 0x65, 0x73, 0x70, 0x22, 0x36, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x30, 0x3a, 0x01, 0x2a, 0x22, 0x2b, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, - 0x63, 0x61, 0x63, 0x68, 0x65, 0x2f, 0x68, 0x6f, 0x6f, 0x6b, 0x2f, 0x72, 0x65, 0x6c, 0x65, 0x61, - 0x73, 0x65, 0x64, 0x2f, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x2f, 0x7b, 0x62, 0x69, 0x7a, 0x5f, - 0x69, 0x64, 0x7d, 0x12, 0x8c, 0x01, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x70, 0x70, 0x52, - 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, 0x1e, 0x2e, - 0x70, 0x62, 0x63, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x70, 0x70, 0x52, 0x65, 0x6c, 0x65, - 0x61, 0x73, 0x65, 0x64, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, - 0x70, 0x62, 0x63, 0x73, 0x2e, 0x4a, 0x73, 0x6f, 0x6e, 0x52, 0x61, 0x77, 0x52, 0x65, 0x73, 0x70, - 0x22, 0x40, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3a, 0x12, 0x38, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, + 0x64, 0x4b, 0x76, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x70, 0x62, 0x63, 0x73, 0x2e, 0x4a, 0x73, + 0x6f, 0x6e, 0x52, 0x61, 0x77, 0x52, 0x65, 0x73, 0x70, 0x22, 0x34, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x2e, 0x3a, 0x01, 0x2a, 0x22, 0x29, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x61, + 0x63, 0x68, 0x65, 0x2f, 0x6b, 0x76, 0x2f, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x2f, + 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x2f, 0x7b, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x7d, 0x12, + 0x92, 0x01, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x4b, + 0x76, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1b, 0x2e, 0x70, 0x62, 0x63, 0x73, 0x2e, 0x47, 0x65, + 0x74, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x4b, 0x76, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x70, 0x62, 0x63, 0x73, 0x2e, 0x4a, 0x73, 0x6f, 0x6e, 0x52, + 0x61, 0x77, 0x52, 0x65, 0x73, 0x70, 0x22, 0x4c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x46, 0x3a, 0x01, + 0x2a, 0x22, 0x41, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x61, 0x63, 0x68, 0x65, + 0x2f, 0x6b, 0x76, 0x2f, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x2f, 0x62, 0x69, 0x7a, + 0x5f, 0x69, 0x64, 0x2f, 0x7b, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x61, 0x70, 0x70, + 0x73, 0x2f, 0x7b, 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6b, 0x65, 0x79, 0x2f, 0x7b, + 0x6b, 0x65, 0x79, 0x7d, 0x12, 0x89, 0x01, 0x0a, 0x0f, 0x53, 0x65, 0x74, 0x43, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x18, 0x2e, 0x70, 0x62, 0x63, 0x73, 0x2e, + 0x53, 0x65, 0x74, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, + 0x65, 0x71, 0x1a, 0x19, 0x2e, 0x70, 0x62, 0x63, 0x73, 0x2e, 0x53, 0x65, 0x74, 0x43, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x65, 0x73, 0x70, 0x22, 0x41, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x3b, 0x3a, 0x01, 0x2a, 0x22, 0x36, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x2f, 0x62, 0x69, 0x7a, 0x2f, 0x7b, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x61, 0x70, 0x70, 0x73, 0x2f, 0x7b, 0x61, 0x70, 0x70, 0x5f, 0x69, - 0x64, 0x7d, 0x2f, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x5f, 0x67, 0x72, 0x6f, 0x75, - 0x70, 0x73, 0x12, 0x83, 0x01, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, - 0x74, 0x43, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x52, 0x65, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x12, - 0x10, 0x2e, 0x70, 0x62, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x52, 0x65, - 0x71, 0x1a, 0x1f, 0x2e, 0x70, 0x62, 0x63, 0x73, 0x2e, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, - 0x43, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x52, 0x65, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x52, 0x65, - 0x73, 0x70, 0x22, 0x34, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2e, 0x3a, 0x01, 0x2a, 0x22, 0x29, 0x2f, - 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x2f, 0x6c, 0x69, 0x73, - 0x74, 0x2f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2f, 0x72, 0x65, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, - 0x2f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x6b, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x13, 0x2e, 0x70, 0x62, 0x63, - 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x1a, - 0x14, 0x2e, 0x70, 0x62, 0x63, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x28, 0x3a, 0x01, 0x2a, - 0x22, 0x23, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x2f, - 0x6c, 0x69, 0x73, 0x74, 0x2f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2f, 0x65, 0x76, 0x65, 0x6e, 0x74, - 0x2f, 0x6d, 0x65, 0x74, 0x61, 0x12, 0x76, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x43, 0x72, 0x65, 0x64, - 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x12, 0x16, 0x2e, 0x70, 0x62, 0x63, 0x73, 0x2e, 0x47, 0x65, - 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x1a, 0x11, - 0x2e, 0x70, 0x62, 0x63, 0x73, 0x2e, 0x4a, 0x73, 0x6f, 0x6e, 0x52, 0x61, 0x77, 0x52, 0x65, 0x73, - 0x70, 0x22, 0x3a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x34, 0x12, 0x32, 0x2f, 0x61, 0x70, 0x69, 0x2f, - 0x76, 0x31, 0x2f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x2f, 0x62, 0x69, 0x7a, 0x2f, 0x7b, 0x62, 0x69, - 0x7a, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, - 0x2f, 0x7b, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x7d, 0x12, 0x3f, 0x0a, - 0x0c, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x41, 0x70, 0x70, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x15, 0x2e, - 0x70, 0x62, 0x63, 0x73, 0x2e, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x41, 0x70, 0x70, 0x4d, 0x65, 0x74, - 0x61, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x70, 0x62, 0x63, 0x73, 0x2e, 0x42, 0x65, 0x6e, 0x63, - 0x68, 0x41, 0x70, 0x70, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x12, 0x48, - 0x0a, 0x0f, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x43, - 0x49, 0x12, 0x18, 0x2e, 0x70, 0x62, 0x63, 0x73, 0x2e, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x52, 0x65, - 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x43, 0x49, 0x52, 0x65, 0x71, 0x1a, 0x19, 0x2e, 0x70, 0x62, - 0x63, 0x73, 0x2e, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, - 0x43, 0x49, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x12, 0x70, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x52, - 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x4b, 0x76, 0x12, 0x16, 0x2e, 0x70, 0x62, 0x63, 0x73, - 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x4b, 0x76, 0x52, 0x65, - 0x71, 0x1a, 0x11, 0x2e, 0x70, 0x62, 0x63, 0x73, 0x2e, 0x4a, 0x73, 0x6f, 0x6e, 0x52, 0x61, 0x77, - 0x52, 0x65, 0x73, 0x70, 0x22, 0x34, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2e, 0x3a, 0x01, 0x2a, 0x22, - 0x29, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x2f, 0x6b, - 0x76, 0x2f, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x2f, 0x62, 0x69, 0x7a, 0x5f, 0x69, - 0x64, 0x2f, 0x7b, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x92, 0x01, 0x0a, 0x12, 0x47, - 0x65, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x4b, 0x76, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x12, 0x1b, 0x2e, 0x70, 0x62, 0x63, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x6c, 0x65, - 0x61, 0x73, 0x65, 0x64, 0x4b, 0x76, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x11, - 0x2e, 0x70, 0x62, 0x63, 0x73, 0x2e, 0x4a, 0x73, 0x6f, 0x6e, 0x52, 0x61, 0x77, 0x52, 0x65, 0x73, - 0x70, 0x22, 0x4c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x46, 0x3a, 0x01, 0x2a, 0x22, 0x41, 0x2f, 0x61, - 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x2f, 0x6b, 0x76, 0x2f, 0x72, - 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x2f, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x2f, 0x7b, - 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x61, 0x70, 0x70, 0x73, 0x2f, 0x7b, 0x61, 0x70, - 0x70, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6b, 0x65, 0x79, 0x2f, 0x7b, 0x6b, 0x65, 0x79, 0x7d, 0x42, - 0x59, 0x5a, 0x57, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x54, 0x65, - 0x6e, 0x63, 0x65, 0x6e, 0x74, 0x42, 0x6c, 0x75, 0x65, 0x4b, 0x69, 0x6e, 0x67, 0x2f, 0x62, 0x6b, - 0x2d, 0x62, 0x63, 0x73, 0x2f, 0x62, 0x63, 0x73, 0x2d, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x73, 0x2f, 0x62, 0x63, 0x73, 0x2d, 0x62, 0x73, 0x63, 0x70, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x2d, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x3b, 0x70, 0x62, 0x63, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, + 0x64, 0x7d, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x42, 0x59, 0x5a, 0x57, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x54, + 0x65, 0x6e, 0x63, 0x65, 0x6e, 0x74, 0x42, 0x6c, 0x75, 0x65, 0x4b, 0x69, 0x6e, 0x67, 0x2f, 0x62, + 0x6b, 0x2d, 0x62, 0x63, 0x73, 0x2f, 0x62, 0x63, 0x73, 0x2d, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x2f, 0x62, 0x63, 0x73, 0x2d, 0x62, 0x73, 0x63, 0x70, 0x2f, 0x70, 0x6b, 0x67, 0x2f, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x2d, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x3b, 0x70, 0x62, 0x63, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, } var ( @@ -1590,7 +1707,7 @@ func file_cache_service_proto_rawDescGZIP() []byte { return file_cache_service_proto_rawDescData } -var file_cache_service_proto_msgTypes = make([]protoimpl.MessageInfo, 25) +var file_cache_service_proto_msgTypes = make([]protoimpl.MessageInfo, 27) var file_cache_service_proto_goTypes = []interface{}{ (*JsonRawResp)(nil), // 0: pbcs.JsonRawResp (*GetAppIDReq)(nil), // 1: pbcs.GetAppIDReq @@ -1616,24 +1733,26 @@ var file_cache_service_proto_goTypes = []interface{}{ (*GetCredentialReq)(nil), // 21: pbcs.GetCredentialReq (*GetReleasedKvReq)(nil), // 22: pbcs.GetReleasedKvReq (*GetReleasedKvValueReq)(nil), // 23: pbcs.GetReleasedKvValueReq - nil, // 24: pbcs.BenchAppMetaResp.MetaEntry - (*app.App)(nil), // 25: pbapp.App - (*app.Reload)(nil), // 26: pbapp.Reload - (*released_ci.ReleasedConfigItem)(nil), // 27: pbrci.ReleasedConfigItem - (*base.BasePage)(nil), // 28: pbbase.BasePage - (*event.EventSpec)(nil), // 29: pbevent.EventSpec - (*event.EventAttachment)(nil), // 30: pbevent.EventAttachment - (*base.EmptyReq)(nil), // 31: pbbase.EmptyReq + (*SetClientMetricReq)(nil), // 24: pbcs.SetClientMetricReq + (*SetClientMetricResp)(nil), // 25: pbcs.SetClientMetricResp + nil, // 26: pbcs.BenchAppMetaResp.MetaEntry + (*app.App)(nil), // 27: pbapp.App + (*app.Reload)(nil), // 28: pbapp.Reload + (*released_ci.ReleasedConfigItem)(nil), // 29: pbrci.ReleasedConfigItem + (*base.BasePage)(nil), // 30: pbbase.BasePage + (*event.EventSpec)(nil), // 31: pbevent.EventSpec + (*event.EventAttachment)(nil), // 32: pbevent.EventAttachment + (*base.EmptyReq)(nil), // 33: pbbase.EmptyReq } var file_cache_service_proto_depIdxs = []int32{ - 25, // 0: pbcs.ListAppsResp.details:type_name -> pbapp.App - 24, // 1: pbcs.BenchAppMetaResp.meta:type_name -> pbcs.BenchAppMetaResp.MetaEntry - 26, // 2: pbcs.AppMeta.reload:type_name -> pbapp.Reload - 27, // 3: pbcs.BenchReleasedCIResp.meta:type_name -> pbrci.ReleasedConfigItem - 28, // 4: pbcs.ListEventsReq.page:type_name -> pbbase.BasePage + 27, // 0: pbcs.ListAppsResp.details:type_name -> pbapp.App + 26, // 1: pbcs.BenchAppMetaResp.meta:type_name -> pbcs.BenchAppMetaResp.MetaEntry + 28, // 2: pbcs.AppMeta.reload:type_name -> pbapp.Reload + 29, // 3: pbcs.BenchReleasedCIResp.meta:type_name -> pbrci.ReleasedConfigItem + 30, // 4: pbcs.ListEventsReq.page:type_name -> pbbase.BasePage 19, // 5: pbcs.ListEventsResp.list:type_name -> pbcs.EventMeta - 29, // 6: pbcs.EventMeta.spec:type_name -> pbevent.EventSpec - 30, // 7: pbcs.EventMeta.attachment:type_name -> pbevent.EventAttachment + 31, // 6: pbcs.EventMeta.spec:type_name -> pbevent.EventSpec + 32, // 7: pbcs.EventMeta.attachment:type_name -> pbevent.EventAttachment 12, // 8: pbcs.BenchAppMetaResp.MetaEntry.value:type_name -> pbcs.AppMeta 1, // 9: pbcs.Cache.GetAppID:input_type -> pbcs.GetAppIDReq 3, // 10: pbcs.Cache.GetAppMeta:input_type -> pbcs.GetAppMetaReq @@ -1641,28 +1760,30 @@ var file_cache_service_proto_depIdxs = []int32{ 6, // 12: pbcs.Cache.GetReleasedCI:input_type -> pbcs.GetReleasedCIReq 7, // 13: pbcs.Cache.GetReleasedHook:input_type -> pbcs.GetReleasedHookReq 8, // 14: pbcs.Cache.ListAppReleasedGroups:input_type -> pbcs.ListAppReleasedGroupsReq - 31, // 15: pbcs.Cache.GetCurrentCursorReminder:input_type -> pbbase.EmptyReq + 33, // 15: pbcs.Cache.GetCurrentCursorReminder:input_type -> pbbase.EmptyReq 17, // 16: pbcs.Cache.ListEventsMeta:input_type -> pbcs.ListEventsReq 21, // 17: pbcs.Cache.GetCredential:input_type -> pbcs.GetCredentialReq 10, // 18: pbcs.Cache.BenchAppMeta:input_type -> pbcs.BenchAppMetaReq 14, // 19: pbcs.Cache.BenchReleasedCI:input_type -> pbcs.BenchReleasedCIReq 22, // 20: pbcs.Cache.GetReleasedKv:input_type -> pbcs.GetReleasedKvReq 23, // 21: pbcs.Cache.GetReleasedKvValue:input_type -> pbcs.GetReleasedKvValueReq - 2, // 22: pbcs.Cache.GetAppID:output_type -> pbcs.GetAppIDResp - 0, // 23: pbcs.Cache.GetAppMeta:output_type -> pbcs.JsonRawResp - 5, // 24: pbcs.Cache.ListApps:output_type -> pbcs.ListAppsResp - 0, // 25: pbcs.Cache.GetReleasedCI:output_type -> pbcs.JsonRawResp - 0, // 26: pbcs.Cache.GetReleasedHook:output_type -> pbcs.JsonRawResp - 0, // 27: pbcs.Cache.ListAppReleasedGroups:output_type -> pbcs.JsonRawResp - 16, // 28: pbcs.Cache.GetCurrentCursorReminder:output_type -> pbcs.CurrentCursorReminderResp - 18, // 29: pbcs.Cache.ListEventsMeta:output_type -> pbcs.ListEventsResp - 0, // 30: pbcs.Cache.GetCredential:output_type -> pbcs.JsonRawResp - 11, // 31: pbcs.Cache.BenchAppMeta:output_type -> pbcs.BenchAppMetaResp - 15, // 32: pbcs.Cache.BenchReleasedCI:output_type -> pbcs.BenchReleasedCIResp - 0, // 33: pbcs.Cache.GetReleasedKv:output_type -> pbcs.JsonRawResp - 0, // 34: pbcs.Cache.GetReleasedKvValue:output_type -> pbcs.JsonRawResp - 22, // [22:35] is the sub-list for method output_type - 9, // [9:22] is the sub-list for method input_type + 24, // 22: pbcs.Cache.SetClientMetric:input_type -> pbcs.SetClientMetricReq + 2, // 23: pbcs.Cache.GetAppID:output_type -> pbcs.GetAppIDResp + 0, // 24: pbcs.Cache.GetAppMeta:output_type -> pbcs.JsonRawResp + 5, // 25: pbcs.Cache.ListApps:output_type -> pbcs.ListAppsResp + 0, // 26: pbcs.Cache.GetReleasedCI:output_type -> pbcs.JsonRawResp + 0, // 27: pbcs.Cache.GetReleasedHook:output_type -> pbcs.JsonRawResp + 0, // 28: pbcs.Cache.ListAppReleasedGroups:output_type -> pbcs.JsonRawResp + 16, // 29: pbcs.Cache.GetCurrentCursorReminder:output_type -> pbcs.CurrentCursorReminderResp + 18, // 30: pbcs.Cache.ListEventsMeta:output_type -> pbcs.ListEventsResp + 0, // 31: pbcs.Cache.GetCredential:output_type -> pbcs.JsonRawResp + 11, // 32: pbcs.Cache.BenchAppMeta:output_type -> pbcs.BenchAppMetaResp + 15, // 33: pbcs.Cache.BenchReleasedCI:output_type -> pbcs.BenchReleasedCIResp + 0, // 34: pbcs.Cache.GetReleasedKv:output_type -> pbcs.JsonRawResp + 0, // 35: pbcs.Cache.GetReleasedKvValue:output_type -> pbcs.JsonRawResp + 25, // 36: pbcs.Cache.SetClientMetric:output_type -> pbcs.SetClientMetricResp + 23, // [23:37] is the sub-list for method output_type + 9, // [9:23] is the sub-list for method input_type 9, // [9:9] is the sub-list for extension type_name 9, // [9:9] is the sub-list for extension extendee 0, // [0:9] is the sub-list for field type_name @@ -1962,6 +2083,30 @@ func file_cache_service_proto_init() { return nil } } + file_cache_service_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SetClientMetricReq); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_cache_service_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SetClientMetricResp); 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{ @@ -1969,7 +2114,7 @@ func file_cache_service_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_cache_service_proto_rawDesc, NumEnums: 0, - NumMessages: 25, + NumMessages: 27, NumExtensions: 0, NumServices: 1, }, diff --git a/bcs-services/bcs-bscp/pkg/protocol/cache-service/cache_service.pb.gw.go b/bcs-services/bcs-bscp/pkg/protocol/cache-service/cache_service.pb.gw.go index 5270f940fe..2f2d70a7a4 100644 --- a/bcs-services/bcs-bscp/pkg/protocol/cache-service/cache_service.pb.gw.go +++ b/bcs-services/bcs-bscp/pkg/protocol/cache-service/cache_service.pb.gw.go @@ -714,6 +714,94 @@ func local_request_Cache_GetReleasedKvValue_0(ctx context.Context, marshaler run } +func request_Cache_SetClientMetric_0(ctx context.Context, marshaler runtime.Marshaler, client CacheClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq SetClientMetricReq + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["biz_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "biz_id") + } + + protoReq.BizId, err = runtime.Uint32(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "biz_id", err) + } + + val, ok = pathParams["app_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "app_id") + } + + protoReq.AppId, err = runtime.Uint32(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "app_id", err) + } + + msg, err := client.SetClientMetric(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Cache_SetClientMetric_0(ctx context.Context, marshaler runtime.Marshaler, server CacheServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq SetClientMetricReq + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["biz_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "biz_id") + } + + protoReq.BizId, err = runtime.Uint32(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "biz_id", err) + } + + val, ok = pathParams["app_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "app_id") + } + + protoReq.AppId, err = runtime.Uint32(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "app_id", err) + } + + msg, err := server.SetClientMetric(ctx, &protoReq) + return msg, metadata, err + +} + // RegisterCacheHandlerServer registers the http handlers for service Cache to "mux". // UnaryRPC :call CacheServer directly. // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. @@ -970,6 +1058,31 @@ func RegisterCacheHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv }) + mux.Handle("POST", pattern_Cache_SetClientMetric_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/pbcs.Cache/SetClientMetric", runtime.WithHTTPPathPattern("/api/v1/cache/biz/{biz_id}/apps/{app_id}/client_metric")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Cache_SetClientMetric_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_Cache_SetClientMetric_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -1231,6 +1344,28 @@ func RegisterCacheHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie }) + mux.Handle("POST", pattern_Cache_SetClientMetric_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/pbcs.Cache/SetClientMetric", runtime.WithHTTPPathPattern("/api/v1/cache/biz/{biz_id}/apps/{app_id}/client_metric")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Cache_SetClientMetric_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_Cache_SetClientMetric_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -1254,6 +1389,8 @@ var ( pattern_Cache_GetReleasedKv_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4, 2, 5, 1, 0, 4, 1, 5, 5}, []string{"api", "v1", "cache", "kv", "released", "biz_id"}, "")) pattern_Cache_GetReleasedKvValue_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4, 2, 5, 1, 0, 4, 1, 5, 5, 2, 6, 1, 0, 4, 1, 5, 7, 2, 8, 1, 0, 4, 1, 5, 8}, []string{"api", "v1", "cache", "kv", "released", "biz_id", "apps", "app_id", "key"}, "")) + + pattern_Cache_SetClientMetric_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4, 2, 5, 1, 0, 4, 1, 5, 6, 2, 7}, []string{"api", "v1", "cache", "biz", "biz_id", "apps", "app_id", "client_metric"}, "")) ) var ( @@ -1276,4 +1413,6 @@ var ( forward_Cache_GetReleasedKv_0 = runtime.ForwardResponseMessage forward_Cache_GetReleasedKvValue_0 = runtime.ForwardResponseMessage + + forward_Cache_SetClientMetric_0 = runtime.ForwardResponseMessage ) diff --git a/bcs-services/bcs-bscp/pkg/protocol/cache-service/cache_service.proto b/bcs-services/bcs-bscp/pkg/protocol/cache-service/cache_service.proto index 1c6da9b468..12332630a5 100644 --- a/bcs-services/bcs-bscp/pkg/protocol/cache-service/cache_service.proto +++ b/bcs-services/bcs-bscp/pkg/protocol/cache-service/cache_service.proto @@ -94,6 +94,13 @@ service Cache { body: "*" }; } + + rpc SetClientMetric(SetClientMetricReq) returns (SetClientMetricResp) { + option (google.api.http) = { + post: "/api/v1/cache/biz/{biz_id}/apps/{app_id}/client_metric" + body: "*" + }; + } } message JsonRawResp { @@ -216,4 +223,12 @@ message GetReleasedKvValueReq { uint32 release_id = 2; uint32 app_id = 3; string key = 4; -} \ No newline at end of file +} + +message SetClientMetricReq { + uint32 biz_id = 1; + uint32 app_id = 2; + bytes payload = 3; +} + +message SetClientMetricResp {} \ No newline at end of file diff --git a/bcs-services/bcs-bscp/pkg/protocol/cache-service/cache_service_grpc.pb.go b/bcs-services/bcs-bscp/pkg/protocol/cache-service/cache_service_grpc.pb.go index 461ddef492..ea71c01a21 100644 --- a/bcs-services/bcs-bscp/pkg/protocol/cache-service/cache_service_grpc.pb.go +++ b/bcs-services/bcs-bscp/pkg/protocol/cache-service/cache_service_grpc.pb.go @@ -33,6 +33,7 @@ const ( Cache_BenchReleasedCI_FullMethodName = "/pbcs.Cache/BenchReleasedCI" Cache_GetReleasedKv_FullMethodName = "/pbcs.Cache/GetReleasedKv" Cache_GetReleasedKvValue_FullMethodName = "/pbcs.Cache/GetReleasedKvValue" + Cache_SetClientMetric_FullMethodName = "/pbcs.Cache/SetClientMetric" ) // CacheClient is the client API for Cache service. @@ -53,6 +54,7 @@ type CacheClient interface { BenchReleasedCI(ctx context.Context, in *BenchReleasedCIReq, opts ...grpc.CallOption) (*BenchReleasedCIResp, error) GetReleasedKv(ctx context.Context, in *GetReleasedKvReq, opts ...grpc.CallOption) (*JsonRawResp, error) GetReleasedKvValue(ctx context.Context, in *GetReleasedKvValueReq, opts ...grpc.CallOption) (*JsonRawResp, error) + SetClientMetric(ctx context.Context, in *SetClientMetricReq, opts ...grpc.CallOption) (*SetClientMetricResp, error) } type cacheClient struct { @@ -180,6 +182,15 @@ func (c *cacheClient) GetReleasedKvValue(ctx context.Context, in *GetReleasedKvV return out, nil } +func (c *cacheClient) SetClientMetric(ctx context.Context, in *SetClientMetricReq, opts ...grpc.CallOption) (*SetClientMetricResp, error) { + out := new(SetClientMetricResp) + err := c.cc.Invoke(ctx, Cache_SetClientMetric_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // CacheServer is the server API for Cache service. // All implementations should embed UnimplementedCacheServer // for forward compatibility @@ -198,6 +209,7 @@ type CacheServer interface { BenchReleasedCI(context.Context, *BenchReleasedCIReq) (*BenchReleasedCIResp, error) GetReleasedKv(context.Context, *GetReleasedKvReq) (*JsonRawResp, error) GetReleasedKvValue(context.Context, *GetReleasedKvValueReq) (*JsonRawResp, error) + SetClientMetric(context.Context, *SetClientMetricReq) (*SetClientMetricResp, error) } // UnimplementedCacheServer should be embedded to have forward compatible implementations. @@ -243,6 +255,9 @@ func (UnimplementedCacheServer) GetReleasedKv(context.Context, *GetReleasedKvReq func (UnimplementedCacheServer) GetReleasedKvValue(context.Context, *GetReleasedKvValueReq) (*JsonRawResp, error) { return nil, status.Errorf(codes.Unimplemented, "method GetReleasedKvValue not implemented") } +func (UnimplementedCacheServer) SetClientMetric(context.Context, *SetClientMetricReq) (*SetClientMetricResp, error) { + return nil, status.Errorf(codes.Unimplemented, "method SetClientMetric not implemented") +} // UnsafeCacheServer may be embedded to opt out of forward compatibility for this service. // Use of this interface is not recommended, as added methods to CacheServer will @@ -489,6 +504,24 @@ func _Cache_GetReleasedKvValue_Handler(srv interface{}, ctx context.Context, dec return interceptor(ctx, in, info, handler) } +func _Cache_SetClientMetric_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SetClientMetricReq) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(CacheServer).SetClientMetric(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Cache_SetClientMetric_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(CacheServer).SetClientMetric(ctx, req.(*SetClientMetricReq)) + } + return interceptor(ctx, in, info, handler) +} + // Cache_ServiceDesc is the grpc.ServiceDesc for Cache service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -548,6 +581,10 @@ var Cache_ServiceDesc = grpc.ServiceDesc{ MethodName: "GetReleasedKvValue", Handler: _Cache_GetReleasedKvValue_Handler, }, + { + MethodName: "SetClientMetric", + Handler: _Cache_SetClientMetric_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "cache_service.proto", diff --git a/bcs-services/bcs-bscp/pkg/protocol/core/Makefile b/bcs-services/bcs-bscp/pkg/protocol/core/Makefile index c6ebdaef17..46b175986f 100644 --- a/bcs-services/bcs-bscp/pkg/protocol/core/Makefile +++ b/bcs-services/bcs-bscp/pkg/protocol/core/Makefile @@ -23,6 +23,8 @@ all: @cd app-template-variable && make @cd kv && make @cd released-kv && make + @cd client && make + @cd client-event && make clean: @cd base && make clean @@ -49,4 +51,5 @@ clean: @cd app-template-variable && make clean @cd kv && make clean @cd released-kv && make clean - + @cd client && make clean + @cd client-event && make clean diff --git a/bcs-services/bcs-bscp/pkg/protocol/core/client-event/Makefile b/bcs-services/bcs-bscp/pkg/protocol/core/client-event/Makefile new file mode 100644 index 0000000000..296efe0f5c --- /dev/null +++ b/bcs-services/bcs-bscp/pkg/protocol/core/client-event/Makefile @@ -0,0 +1 @@ +include ../../../../scripts/makefile/core_pb.mk diff --git a/bcs-services/bcs-bscp/pkg/protocol/core/client-event/client_event.pb.go b/bcs-services/bcs-bscp/pkg/protocol/core/client-event/client_event.pb.go new file mode 100644 index 0000000000..955e6ed853 --- /dev/null +++ b/bcs-services/bcs-bscp/pkg/protocol/core/client-event/client_event.pb.go @@ -0,0 +1,500 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.31.0 +// protoc v4.25.1 +// source: client_event.proto + +package pbce + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// ClientEvent source resource reference: pkg/dal/table/client-event.go +type ClientEvent struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id uint32 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` + Spec *ClientEventSpec `protobuf:"bytes,2,opt,name=spec,proto3" json:"spec,omitempty"` + Attachment *ClientEventAttachment `protobuf:"bytes,3,opt,name=attachment,proto3" json:"attachment,omitempty"` + HeartbeatTime *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=heartbeat_time,json=heartbeatTime,proto3" json:"heartbeat_time,omitempty"` + MessageType string `protobuf:"bytes,5,opt,name=message_type,json=messageType,proto3" json:"message_type,omitempty"` +} + +func (x *ClientEvent) Reset() { + *x = ClientEvent{} + if protoimpl.UnsafeEnabled { + mi := &file_client_event_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ClientEvent) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ClientEvent) ProtoMessage() {} + +func (x *ClientEvent) ProtoReflect() protoreflect.Message { + mi := &file_client_event_proto_msgTypes[0] + 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 ClientEvent.ProtoReflect.Descriptor instead. +func (*ClientEvent) Descriptor() ([]byte, []int) { + return file_client_event_proto_rawDescGZIP(), []int{0} +} + +func (x *ClientEvent) GetId() uint32 { + if x != nil { + return x.Id + } + return 0 +} + +func (x *ClientEvent) GetSpec() *ClientEventSpec { + if x != nil { + return x.Spec + } + return nil +} + +func (x *ClientEvent) GetAttachment() *ClientEventAttachment { + if x != nil { + return x.Attachment + } + return nil +} + +func (x *ClientEvent) GetHeartbeatTime() *timestamppb.Timestamp { + if x != nil { + return x.HeartbeatTime + } + return nil +} + +func (x *ClientEvent) GetMessageType() string { + if x != nil { + return x.MessageType + } + return "" +} + +// ClientEventSpec source resource reference: pkg/dal/table/client-event.go +type ClientEventSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + OriginalReleaseId uint32 `protobuf:"varint,1,opt,name=original_release_id,json=originalReleaseId,proto3" json:"original_release_id,omitempty"` + TargetReleaseId uint32 `protobuf:"varint,2,opt,name=target_release_id,json=targetReleaseId,proto3" json:"target_release_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"` + TotalSeconds float64 `protobuf:"fixed64,5,opt,name=total_seconds,json=totalSeconds,proto3" json:"total_seconds,omitempty"` + TotalFileSize float64 `protobuf:"fixed64,6,opt,name=total_file_size,json=totalFileSize,proto3" json:"total_file_size,omitempty"` + DownloadFileSize float64 `protobuf:"fixed64,7,opt,name=download_file_size,json=downloadFileSize,proto3" json:"download_file_size,omitempty"` + TotalFileNum uint32 `protobuf:"varint,8,opt,name=total_file_num,json=totalFileNum,proto3" json:"total_file_num,omitempty"` + DownloadFileNum uint32 `protobuf:"varint,9,opt,name=download_file_num,json=downloadFileNum,proto3" json:"download_file_num,omitempty"` + ReleaseChangeStatus string `protobuf:"bytes,10,opt,name=release_change_status,json=releaseChangeStatus,proto3" json:"release_change_status,omitempty"` + ReleaseChangeFailedReason string `protobuf:"bytes,11,opt,name=release_change_failed_reason,json=releaseChangeFailedReason,proto3" json:"release_change_failed_reason,omitempty"` + FailedDetailReason string `protobuf:"bytes,12,opt,name=failed_detail_reason,json=failedDetailReason,proto3" json:"failed_detail_reason,omitempty"` +} + +func (x *ClientEventSpec) Reset() { + *x = ClientEventSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_client_event_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ClientEventSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ClientEventSpec) ProtoMessage() {} + +func (x *ClientEventSpec) ProtoReflect() protoreflect.Message { + mi := &file_client_event_proto_msgTypes[1] + 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 ClientEventSpec.ProtoReflect.Descriptor instead. +func (*ClientEventSpec) Descriptor() ([]byte, []int) { + return file_client_event_proto_rawDescGZIP(), []int{1} +} + +func (x *ClientEventSpec) GetOriginalReleaseId() uint32 { + if x != nil { + return x.OriginalReleaseId + } + return 0 +} + +func (x *ClientEventSpec) GetTargetReleaseId() uint32 { + if x != nil { + return x.TargetReleaseId + } + return 0 +} + +func (x *ClientEventSpec) GetStartTime() *timestamppb.Timestamp { + if x != nil { + return x.StartTime + } + return nil +} + +func (x *ClientEventSpec) GetEndTime() *timestamppb.Timestamp { + if x != nil { + return x.EndTime + } + return nil +} + +func (x *ClientEventSpec) GetTotalSeconds() float64 { + if x != nil { + return x.TotalSeconds + } + return 0 +} + +func (x *ClientEventSpec) GetTotalFileSize() float64 { + if x != nil { + return x.TotalFileSize + } + return 0 +} + +func (x *ClientEventSpec) GetDownloadFileSize() float64 { + if x != nil { + return x.DownloadFileSize + } + return 0 +} + +func (x *ClientEventSpec) GetTotalFileNum() uint32 { + if x != nil { + return x.TotalFileNum + } + return 0 +} + +func (x *ClientEventSpec) GetDownloadFileNum() uint32 { + if x != nil { + return x.DownloadFileNum + } + return 0 +} + +func (x *ClientEventSpec) GetReleaseChangeStatus() string { + if x != nil { + return x.ReleaseChangeStatus + } + return "" +} + +func (x *ClientEventSpec) GetReleaseChangeFailedReason() string { + if x != nil { + return x.ReleaseChangeFailedReason + } + return "" +} + +func (x *ClientEventSpec) GetFailedDetailReason() string { + if x != nil { + return x.FailedDetailReason + } + return "" +} + +// ClientEventAttachment source resource reference: pkg/dal/table/client-event.go +type ClientEventAttachment struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ClientId uint32 `protobuf:"varint,1,opt,name=client_id,json=clientId,proto3" json:"client_id,omitempty"` + Uid string `protobuf:"bytes,2,opt,name=uid,proto3" json:"uid,omitempty"` + BizId uint32 `protobuf:"varint,3,opt,name=biz_id,json=bizId,proto3" json:"biz_id,omitempty"` + AppId uint32 `protobuf:"varint,4,opt,name=app_id,json=appId,proto3" json:"app_id,omitempty"` + ClientMode string `protobuf:"bytes,5,opt,name=client_mode,json=clientMode,proto3" json:"client_mode,omitempty"` + CursorId string `protobuf:"bytes,6,opt,name=cursor_id,json=cursorId,proto3" json:"cursor_id,omitempty"` +} + +func (x *ClientEventAttachment) Reset() { + *x = ClientEventAttachment{} + if protoimpl.UnsafeEnabled { + mi := &file_client_event_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ClientEventAttachment) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ClientEventAttachment) ProtoMessage() {} + +func (x *ClientEventAttachment) ProtoReflect() protoreflect.Message { + mi := &file_client_event_proto_msgTypes[2] + 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 ClientEventAttachment.ProtoReflect.Descriptor instead. +func (*ClientEventAttachment) Descriptor() ([]byte, []int) { + return file_client_event_proto_rawDescGZIP(), []int{2} +} + +func (x *ClientEventAttachment) GetClientId() uint32 { + if x != nil { + return x.ClientId + } + return 0 +} + +func (x *ClientEventAttachment) GetUid() string { + if x != nil { + return x.Uid + } + return "" +} + +func (x *ClientEventAttachment) GetBizId() uint32 { + if x != nil { + return x.BizId + } + return 0 +} + +func (x *ClientEventAttachment) GetAppId() uint32 { + if x != nil { + return x.AppId + } + return 0 +} + +func (x *ClientEventAttachment) GetClientMode() string { + if x != nil { + return x.ClientMode + } + return "" +} + +func (x *ClientEventAttachment) GetCursorId() string { + if x != nil { + return x.CursorId + } + return "" +} + +var File_client_event_proto protoreflect.FileDescriptor + +var file_client_event_proto_rawDesc = []byte{ + 0x0a, 0x12, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x04, 0x70, 0x62, 0x63, 0x65, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xeb, 0x01, 0x0a, 0x0b, + 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x29, 0x0a, 0x04, 0x73, + 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x70, 0x62, 0x63, 0x65, + 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x70, 0x65, 0x63, + 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x12, 0x3b, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, + 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x70, 0x62, 0x63, + 0x65, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x74, + 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, + 0x65, 0x6e, 0x74, 0x12, 0x41, 0x0a, 0x0e, 0x68, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 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, 0x0d, 0x68, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, + 0x61, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x22, 0xd3, 0x04, 0x0a, 0x0f, 0x43, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x70, 0x65, 0x63, 0x12, 0x2e, 0x0a, + 0x13, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, + 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x6f, 0x72, 0x69, 0x67, + 0x69, 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x49, 0x64, 0x12, 0x2a, 0x0a, + 0x11, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x5f, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 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, 0x23, 0x0a, 0x0d, 0x74, + 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x01, 0x52, 0x0c, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, + 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x73, + 0x69, 0x7a, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0d, 0x74, 0x6f, 0x74, 0x61, 0x6c, + 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x64, 0x6f, 0x77, 0x6e, + 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x01, 0x52, 0x10, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, + 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x24, 0x0a, 0x0e, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, + 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, + 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x46, 0x69, 0x6c, 0x65, 0x4e, 0x75, 0x6d, 0x12, 0x2a, 0x0a, 0x11, + 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x75, + 0x6d, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, + 0x64, 0x46, 0x69, 0x6c, 0x65, 0x4e, 0x75, 0x6d, 0x12, 0x32, 0x0a, 0x15, 0x72, 0x65, 0x6c, 0x65, + 0x61, 0x73, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, + 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3f, 0x0a, 0x1c, + 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x66, + 0x61, 0x69, 0x6c, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x19, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x30, 0x0a, + 0x14, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x5f, 0x72, + 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x66, 0x61, 0x69, + 0x6c, 0x65, 0x64, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, + 0xb2, 0x01, 0x0a, 0x15, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x41, + 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, + 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, + 0x15, 0x0a, 0x06, 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x75, 0x72, 0x73, 0x6f, + 0x72, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x75, 0x72, 0x73, + 0x6f, 0x72, 0x49, 0x64, 0x42, 0x5d, 0x5a, 0x5b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x54, 0x65, 0x6e, 0x63, 0x65, 0x6e, 0x74, 0x42, 0x6c, 0x75, 0x65, 0x4b, 0x69, + 0x6e, 0x67, 0x2f, 0x62, 0x6b, 0x2d, 0x62, 0x63, 0x73, 0x2f, 0x62, 0x63, 0x73, 0x2d, 0x73, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x62, 0x63, 0x73, 0x2d, 0x62, 0x73, 0x63, 0x70, 0x2f, + 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, + 0x65, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2d, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3b, 0x70, + 0x62, 0x63, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_client_event_proto_rawDescOnce sync.Once + file_client_event_proto_rawDescData = file_client_event_proto_rawDesc +) + +func file_client_event_proto_rawDescGZIP() []byte { + file_client_event_proto_rawDescOnce.Do(func() { + file_client_event_proto_rawDescData = protoimpl.X.CompressGZIP(file_client_event_proto_rawDescData) + }) + return file_client_event_proto_rawDescData +} + +var file_client_event_proto_msgTypes = make([]protoimpl.MessageInfo, 3) +var file_client_event_proto_goTypes = []interface{}{ + (*ClientEvent)(nil), // 0: pbce.ClientEvent + (*ClientEventSpec)(nil), // 1: pbce.ClientEventSpec + (*ClientEventAttachment)(nil), // 2: pbce.ClientEventAttachment + (*timestamppb.Timestamp)(nil), // 3: google.protobuf.Timestamp +} +var file_client_event_proto_depIdxs = []int32{ + 1, // 0: pbce.ClientEvent.spec:type_name -> pbce.ClientEventSpec + 2, // 1: pbce.ClientEvent.attachment:type_name -> pbce.ClientEventAttachment + 3, // 2: pbce.ClientEvent.heartbeat_time:type_name -> google.protobuf.Timestamp + 3, // 3: pbce.ClientEventSpec.start_time:type_name -> google.protobuf.Timestamp + 3, // 4: pbce.ClientEventSpec.end_time:type_name -> google.protobuf.Timestamp + 5, // [5:5] is the sub-list for method output_type + 5, // [5:5] is the sub-list for method input_type + 5, // [5:5] is the sub-list for extension type_name + 5, // [5:5] is the sub-list for extension extendee + 0, // [0:5] is the sub-list for field type_name +} + +func init() { file_client_event_proto_init() } +func file_client_event_proto_init() { + if File_client_event_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_client_event_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ClientEvent); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_client_event_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ClientEventSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_client_event_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ClientEventAttachment); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_client_event_proto_rawDesc, + NumEnums: 0, + NumMessages: 3, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_client_event_proto_goTypes, + DependencyIndexes: file_client_event_proto_depIdxs, + MessageInfos: file_client_event_proto_msgTypes, + }.Build() + File_client_event_proto = out.File + file_client_event_proto_rawDesc = nil + file_client_event_proto_goTypes = nil + file_client_event_proto_depIdxs = nil +} diff --git a/bcs-services/bcs-bscp/pkg/protocol/core/client-event/client_event.proto b/bcs-services/bcs-bscp/pkg/protocol/core/client-event/client_event.proto new file mode 100644 index 0000000000..8daae8842f --- /dev/null +++ b/bcs-services/bcs-bscp/pkg/protocol/core/client-event/client_event.proto @@ -0,0 +1,42 @@ +syntax = "proto3"; + +import "google/protobuf/timestamp.proto"; + +package pbce; + +option go_package = "github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/pkg/protocol/core/client-event;pbce"; + +// ClientEvent source resource reference: pkg/dal/table/client-event.go +message ClientEvent { + uint32 id = 1; + ClientEventSpec spec = 2; + ClientEventAttachment attachment = 3; + google.protobuf.Timestamp heartbeat_time = 4; + string message_type = 5; +} + +// ClientEventSpec source resource reference: pkg/dal/table/client-event.go +message ClientEventSpec { + uint32 original_release_id = 1; + uint32 target_release_id = 2; + google.protobuf.Timestamp start_time = 3; + google.protobuf.Timestamp end_time = 4; + double total_seconds = 5; + double total_file_size = 6; + double download_file_size = 7; + uint32 total_file_num = 8; + uint32 download_file_num = 9; + string release_change_status = 10; + string release_change_failed_reason = 11; + string failed_detail_reason = 12; +} + +// ClientEventAttachment source resource reference: pkg/dal/table/client-event.go +message ClientEventAttachment { + uint32 client_id = 1; + string uid = 2; + uint32 biz_id = 3; + uint32 app_id = 4; + string client_mode = 5; + string cursor_id = 6; +} diff --git a/bcs-services/bcs-bscp/pkg/protocol/core/client-event/convert.go b/bcs-services/bcs-bscp/pkg/protocol/core/client-event/convert.go new file mode 100644 index 0000000000..fe5f83efa1 --- /dev/null +++ b/bcs-services/bcs-bscp/pkg/protocol/core/client-event/convert.go @@ -0,0 +1,56 @@ +/* + * Tencent is pleased to support the open source community by making Blueking Container Service available. + * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. + * Licensed under the MIT License (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * http://opensource.org/licenses/MIT + * Unless required by applicable law or agreed to in writing, software distributed under + * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, + * either express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Package pbce xxx +package pbce + +import ( + "github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/pkg/dal/table" +) + +// ClientEventSpec convert pb ClientEventSpec to table ClientEventSpec +func (c *ClientEventSpec) ClientEventSpec() *table.ClientEventSpec { + if c == nil { + return nil + } + + return &table.ClientEventSpec{ + OriginalReleaseID: c.OriginalReleaseId, + TargetReleaseID: c.TargetReleaseId, + StartTime: c.StartTime.AsTime(), + EndTime: c.EndTime.AsTime(), + TotalSeconds: c.TotalSeconds, + TotalFileSize: c.TotalFileSize, + DownloadFileSize: c.DownloadFileSize, + TotalFileNum: c.TotalFileNum, + DownloadFileNum: c.DownloadFileNum, + ReleaseChangeStatus: table.Status(c.ReleaseChangeStatus), + ReleaseChangeFailedReason: table.FailedReason(c.ReleaseChangeFailedReason), + FailedDetailReason: c.FailedDetailReason, + } +} + +// ClientEventAttachment convert pb ClientEventAttachment to table ClientEventAttachment +func (c *ClientEventAttachment) ClientEventAttachment() *table.ClientEventAttachment { + if c == nil { + return nil + } + + return &table.ClientEventAttachment{ + ClientID: c.ClientId, + CursorID: c.CursorId, + UID: c.Uid, + BizID: c.BizId, + AppID: c.AppId, + ClientMode: table.ClientMode(c.ClientMode), + } +} diff --git a/bcs-services/bcs-bscp/pkg/protocol/core/client/Makefile b/bcs-services/bcs-bscp/pkg/protocol/core/client/Makefile new file mode 100644 index 0000000000..296efe0f5c --- /dev/null +++ b/bcs-services/bcs-bscp/pkg/protocol/core/client/Makefile @@ -0,0 +1 @@ +include ../../../../scripts/makefile/core_pb.mk diff --git a/bcs-services/bcs-bscp/pkg/protocol/core/client/client.pb.go b/bcs-services/bcs-bscp/pkg/protocol/core/client/client.pb.go new file mode 100644 index 0000000000..87ecbb6e49 --- /dev/null +++ b/bcs-services/bcs-bscp/pkg/protocol/core/client/client.pb.go @@ -0,0 +1,572 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.31.0 +// protoc v4.25.1 +// source: client.proto + +package pbclient + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// Client source resource reference: pkg/dal/table/client.go +type Client struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id uint32 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` + Spec *ClientSpec `protobuf:"bytes,2,opt,name=spec,proto3" json:"spec,omitempty"` + Attachment *ClientAttachment `protobuf:"bytes,3,opt,name=attachment,proto3" json:"attachment,omitempty"` + MessageType string `protobuf:"bytes,4,opt,name=message_type,json=messageType,proto3" json:"message_type,omitempty"` +} + +func (x *Client) Reset() { + *x = Client{} + if protoimpl.UnsafeEnabled { + mi := &file_client_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Client) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Client) ProtoMessage() {} + +func (x *Client) ProtoReflect() protoreflect.Message { + mi := &file_client_proto_msgTypes[0] + 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 Client.ProtoReflect.Descriptor instead. +func (*Client) Descriptor() ([]byte, []int) { + return file_client_proto_rawDescGZIP(), []int{0} +} + +func (x *Client) GetId() uint32 { + if x != nil { + return x.Id + } + return 0 +} + +func (x *Client) GetSpec() *ClientSpec { + if x != nil { + return x.Spec + } + return nil +} + +func (x *Client) GetAttachment() *ClientAttachment { + if x != nil { + return x.Attachment + } + return nil +} + +func (x *Client) GetMessageType() string { + if x != nil { + return x.MessageType + } + return "" +} + +// ClientSpec source resource reference: pkg/dal/table/client.go +type ClientSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ClientVersion string `protobuf:"bytes,1,opt,name=client_version,json=clientVersion,proto3" json:"client_version,omitempty"` + Ip string `protobuf:"bytes,2,opt,name=ip,proto3" json:"ip,omitempty"` + Labels string `protobuf:"bytes,3,opt,name=labels,proto3" json:"labels,omitempty"` + Annotations string `protobuf:"bytes,4,opt,name=annotations,proto3" json:"annotations,omitempty"` + FirstConnectTime *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=first_connect_time,json=firstConnectTime,proto3" json:"first_connect_time,omitempty"` + LastHeartbeatTime *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=last_heartbeat_time,json=lastHeartbeatTime,proto3" json:"last_heartbeat_time,omitempty"` + OnlineStatus string `protobuf:"bytes,7,opt,name=online_status,json=onlineStatus,proto3" json:"online_status,omitempty"` + Resource *ClientResource `protobuf:"bytes,8,opt,name=resource,proto3" json:"resource,omitempty"` + CurrentReleaseId uint32 `protobuf:"varint,9,opt,name=current_release_id,json=currentReleaseId,proto3" json:"current_release_id,omitempty"` + TargetReleaseId uint32 `protobuf:"varint,10,opt,name=target_release_id,json=targetReleaseId,proto3" json:"target_release_id,omitempty"` + ReleaseChangeStatus string `protobuf:"bytes,11,opt,name=release_change_status,json=releaseChangeStatus,proto3" json:"release_change_status,omitempty"` + ReleaseChangeFailedReason string `protobuf:"bytes,12,opt,name=release_change_failed_reason,json=releaseChangeFailedReason,proto3" json:"release_change_failed_reason,omitempty"` + FailedDetailReason string `protobuf:"bytes,13,opt,name=failed_detail_reason,json=failedDetailReason,proto3" json:"failed_detail_reason,omitempty"` + ClientType string `protobuf:"bytes,14,opt,name=client_type,json=clientType,proto3" json:"client_type,omitempty"` +} + +func (x *ClientSpec) Reset() { + *x = ClientSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_client_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ClientSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ClientSpec) ProtoMessage() {} + +func (x *ClientSpec) ProtoReflect() protoreflect.Message { + mi := &file_client_proto_msgTypes[1] + 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 ClientSpec.ProtoReflect.Descriptor instead. +func (*ClientSpec) Descriptor() ([]byte, []int) { + return file_client_proto_rawDescGZIP(), []int{1} +} + +func (x *ClientSpec) GetClientVersion() string { + if x != nil { + return x.ClientVersion + } + return "" +} + +func (x *ClientSpec) GetIp() string { + if x != nil { + return x.Ip + } + return "" +} + +func (x *ClientSpec) GetLabels() string { + if x != nil { + return x.Labels + } + return "" +} + +func (x *ClientSpec) GetAnnotations() string { + if x != nil { + return x.Annotations + } + return "" +} + +func (x *ClientSpec) GetFirstConnectTime() *timestamppb.Timestamp { + if x != nil { + return x.FirstConnectTime + } + return nil +} + +func (x *ClientSpec) GetLastHeartbeatTime() *timestamppb.Timestamp { + if x != nil { + return x.LastHeartbeatTime + } + return nil +} + +func (x *ClientSpec) GetOnlineStatus() string { + if x != nil { + return x.OnlineStatus + } + return "" +} + +func (x *ClientSpec) GetResource() *ClientResource { + if x != nil { + return x.Resource + } + return nil +} + +func (x *ClientSpec) GetCurrentReleaseId() uint32 { + if x != nil { + return x.CurrentReleaseId + } + return 0 +} + +func (x *ClientSpec) GetTargetReleaseId() uint32 { + if x != nil { + return x.TargetReleaseId + } + return 0 +} + +func (x *ClientSpec) GetReleaseChangeStatus() string { + if x != nil { + return x.ReleaseChangeStatus + } + return "" +} + +func (x *ClientSpec) GetReleaseChangeFailedReason() string { + if x != nil { + return x.ReleaseChangeFailedReason + } + return "" +} + +func (x *ClientSpec) GetFailedDetailReason() string { + if x != nil { + return x.FailedDetailReason + } + return "" +} + +func (x *ClientSpec) GetClientType() string { + if x != nil { + return x.ClientType + } + return "" +} + +// ClientAttachment source resource reference: pkg/dal/table/client.go +type ClientAttachment struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Uid string `protobuf:"bytes,1,opt,name=uid,proto3" json:"uid,omitempty"` + BizId uint32 `protobuf:"varint,2,opt,name=biz_id,json=bizId,proto3" json:"biz_id,omitempty"` + AppId uint32 `protobuf:"varint,3,opt,name=app_id,json=appId,proto3" json:"app_id,omitempty"` +} + +func (x *ClientAttachment) Reset() { + *x = ClientAttachment{} + if protoimpl.UnsafeEnabled { + mi := &file_client_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ClientAttachment) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ClientAttachment) ProtoMessage() {} + +func (x *ClientAttachment) ProtoReflect() protoreflect.Message { + mi := &file_client_proto_msgTypes[2] + 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 ClientAttachment.ProtoReflect.Descriptor instead. +func (*ClientAttachment) Descriptor() ([]byte, []int) { + return file_client_proto_rawDescGZIP(), []int{2} +} + +func (x *ClientAttachment) GetUid() string { + if x != nil { + return x.Uid + } + return "" +} + +func (x *ClientAttachment) GetBizId() uint32 { + if x != nil { + return x.BizId + } + return 0 +} + +func (x *ClientAttachment) GetAppId() uint32 { + if x != nil { + return x.AppId + } + return 0 +} + +// ClientResource source resource reference: pkg/dal/table/client.go +type ClientResource struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + CpuUsage float64 `protobuf:"fixed64,1,opt,name=cpu_usage,json=cpuUsage,proto3" json:"cpu_usage,omitempty"` + CpuMaxUsage float64 `protobuf:"fixed64,2,opt,name=cpu_max_usage,json=cpuMaxUsage,proto3" json:"cpu_max_usage,omitempty"` + MemoryUsage uint64 `protobuf:"varint,3,opt,name=memory_usage,json=memoryUsage,proto3" json:"memory_usage,omitempty"` + MemoryMaxUsage uint64 `protobuf:"varint,4,opt,name=memory_max_usage,json=memoryMaxUsage,proto3" json:"memory_max_usage,omitempty"` +} + +func (x *ClientResource) Reset() { + *x = ClientResource{} + if protoimpl.UnsafeEnabled { + mi := &file_client_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ClientResource) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ClientResource) ProtoMessage() {} + +func (x *ClientResource) ProtoReflect() protoreflect.Message { + mi := &file_client_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ClientResource.ProtoReflect.Descriptor instead. +func (*ClientResource) Descriptor() ([]byte, []int) { + return file_client_proto_rawDescGZIP(), []int{3} +} + +func (x *ClientResource) GetCpuUsage() float64 { + if x != nil { + return x.CpuUsage + } + return 0 +} + +func (x *ClientResource) GetCpuMaxUsage() float64 { + if x != nil { + return x.CpuMaxUsage + } + return 0 +} + +func (x *ClientResource) GetMemoryUsage() uint64 { + if x != nil { + return x.MemoryUsage + } + return 0 +} + +func (x *ClientResource) GetMemoryMaxUsage() uint64 { + if x != nil { + return x.MemoryMaxUsage + } + return 0 +} + +var File_client_proto protoreflect.FileDescriptor + +var file_client_proto_rawDesc = []byte{ + 0x0a, 0x0c, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x08, + 0x70, 0x62, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xa1, 0x01, 0x0a, 0x06, 0x43, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x02, 0x69, 0x64, 0x12, 0x28, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x70, 0x62, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x12, 0x3a, + 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x62, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, + 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x22, 0x90, 0x05, + 0x0a, 0x0a, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x53, 0x70, 0x65, 0x63, 0x12, 0x25, 0x0a, 0x0e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x56, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x02, 0x69, 0x70, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x61, + 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x48, 0x0a, + 0x12, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 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, 0x10, 0x66, 0x69, 0x72, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x4a, 0x0a, 0x13, 0x6c, 0x61, 0x73, 0x74, 0x5f, + 0x68, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 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, 0x11, 0x6c, 0x61, 0x73, 0x74, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x54, + 0x69, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x6f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6f, 0x6e, 0x6c, 0x69, + 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x34, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x70, 0x62, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x2c, + 0x0a, 0x12, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, + 0x65, 0x5f, 0x69, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x11, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x5f, 0x69, + 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, + 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x49, 0x64, 0x12, 0x32, 0x0a, 0x15, 0x72, 0x65, 0x6c, 0x65, + 0x61, 0x73, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, + 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3f, 0x0a, 0x1c, + 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x66, + 0x61, 0x69, 0x6c, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x19, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x30, 0x0a, + 0x14, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x5f, 0x72, + 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x66, 0x61, 0x69, + 0x6c, 0x65, 0x64, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, + 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x0e, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, + 0x22, 0x52, 0x0a, 0x10, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, + 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x15, 0x0a, + 0x06, 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x61, + 0x70, 0x70, 0x49, 0x64, 0x22, 0x9e, 0x01, 0x0a, 0x0e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x70, 0x75, 0x5f, 0x75, + 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x08, 0x63, 0x70, 0x75, 0x55, + 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0d, 0x63, 0x70, 0x75, 0x5f, 0x6d, 0x61, 0x78, 0x5f, + 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0b, 0x63, 0x70, 0x75, + 0x4d, 0x61, 0x78, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x65, 0x6d, 0x6f, + 0x72, 0x79, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, + 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x6d, + 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4d, 0x61, 0x78, + 0x55, 0x73, 0x61, 0x67, 0x65, 0x42, 0x5b, 0x5a, 0x59, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x54, 0x65, 0x6e, 0x63, 0x65, 0x6e, 0x74, 0x42, 0x6c, 0x75, 0x65, 0x4b, + 0x69, 0x6e, 0x67, 0x2f, 0x62, 0x6b, 0x2d, 0x62, 0x63, 0x73, 0x2f, 0x62, 0x63, 0x73, 0x2d, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x62, 0x63, 0x73, 0x2d, 0x62, 0x73, 0x63, 0x70, + 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, + 0x72, 0x65, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x3b, 0x70, 0x62, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_client_proto_rawDescOnce sync.Once + file_client_proto_rawDescData = file_client_proto_rawDesc +) + +func file_client_proto_rawDescGZIP() []byte { + file_client_proto_rawDescOnce.Do(func() { + file_client_proto_rawDescData = protoimpl.X.CompressGZIP(file_client_proto_rawDescData) + }) + return file_client_proto_rawDescData +} + +var file_client_proto_msgTypes = make([]protoimpl.MessageInfo, 4) +var file_client_proto_goTypes = []interface{}{ + (*Client)(nil), // 0: pbclient.Client + (*ClientSpec)(nil), // 1: pbclient.ClientSpec + (*ClientAttachment)(nil), // 2: pbclient.ClientAttachment + (*ClientResource)(nil), // 3: pbclient.ClientResource + (*timestamppb.Timestamp)(nil), // 4: google.protobuf.Timestamp +} +var file_client_proto_depIdxs = []int32{ + 1, // 0: pbclient.Client.spec:type_name -> pbclient.ClientSpec + 2, // 1: pbclient.Client.attachment:type_name -> pbclient.ClientAttachment + 4, // 2: pbclient.ClientSpec.first_connect_time:type_name -> google.protobuf.Timestamp + 4, // 3: pbclient.ClientSpec.last_heartbeat_time:type_name -> google.protobuf.Timestamp + 3, // 4: pbclient.ClientSpec.resource:type_name -> pbclient.ClientResource + 5, // [5:5] is the sub-list for method output_type + 5, // [5:5] is the sub-list for method input_type + 5, // [5:5] is the sub-list for extension type_name + 5, // [5:5] is the sub-list for extension extendee + 0, // [0:5] is the sub-list for field type_name +} + +func init() { file_client_proto_init() } +func file_client_proto_init() { + if File_client_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_client_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Client); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_client_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ClientSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_client_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ClientAttachment); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_client_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ClientResource); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_client_proto_rawDesc, + NumEnums: 0, + NumMessages: 4, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_client_proto_goTypes, + DependencyIndexes: file_client_proto_depIdxs, + MessageInfos: file_client_proto_msgTypes, + }.Build() + File_client_proto = out.File + file_client_proto_rawDesc = nil + file_client_proto_goTypes = nil + file_client_proto_depIdxs = nil +} diff --git a/bcs-services/bcs-bscp/pkg/protocol/core/client/client.proto b/bcs-services/bcs-bscp/pkg/protocol/core/client/client.proto new file mode 100644 index 0000000000..7fc9ef782f --- /dev/null +++ b/bcs-services/bcs-bscp/pkg/protocol/core/client/client.proto @@ -0,0 +1,48 @@ +syntax = "proto3"; + +import "google/protobuf/timestamp.proto"; + +package pbclient; + +option go_package = "github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/pkg/protocol/core/client;pbclient"; + +// Client source resource reference: pkg/dal/table/client.go +message Client { + uint32 id = 1; + ClientSpec spec = 2; + ClientAttachment attachment = 3; + string message_type = 4; +} + +// ClientSpec source resource reference: pkg/dal/table/client.go +message ClientSpec { + string client_version = 1; + string ip = 2; + string labels = 3; + string annotations = 4; + google.protobuf.Timestamp first_connect_time = 5; + google.protobuf.Timestamp last_heartbeat_time = 6; + string online_status = 7; + ClientResource resource = 8; + uint32 current_release_id = 9; + uint32 target_release_id = 10; + string release_change_status = 11; + string release_change_failed_reason = 12; + string failed_detail_reason = 13; + string client_type = 14; +} + +// ClientAttachment source resource reference: pkg/dal/table/client.go +message ClientAttachment { + string uid = 1; + uint32 biz_id = 2; + uint32 app_id = 3; +} + +// ClientResource source resource reference: pkg/dal/table/client.go +message ClientResource { + double cpu_usage = 1; + double cpu_max_usage = 2; + uint64 memory_usage = 3; + uint64 memory_max_usage = 4; +} \ No newline at end of file diff --git a/bcs-services/bcs-bscp/pkg/protocol/core/client/convert.go b/bcs-services/bcs-bscp/pkg/protocol/core/client/convert.go new file mode 100644 index 0000000000..fca088967f --- /dev/null +++ b/bcs-services/bcs-bscp/pkg/protocol/core/client/convert.go @@ -0,0 +1,71 @@ +/* + * Tencent is pleased to support the open source community by making Blueking Container Service available. + * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. + * Licensed under the MIT License (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * http://opensource.org/licenses/MIT + * Unless required by applicable law or agreed to in writing, software distributed under + * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, + * either express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Package pbclient xxx +package pbclient + +import ( + "github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/pkg/dal/table" +) + +// ClientSpec convert pb ClientSpec to table ClientSpec +func (c *ClientSpec) ClientSpec() *table.ClientSpec { + if c == nil { + return nil + } + resource := table.Resource{} + if c.Resource != nil { + resource = table.Resource{ + CpuMaxUsage: c.Resource.CpuMaxUsage, + MemoryMaxUsage: c.Resource.MemoryMaxUsage, + CpuUsage: c.Resource.CpuUsage, + MemoryUsage: c.Resource.MemoryUsage, + } + } + return &table.ClientSpec{ + ClientVersion: c.ClientVersion, + ClientType: table.ClientType(c.ClientType), + Ip: c.Ip, + Labels: c.Labels, + Annotations: c.Annotations, + FirstConnectTime: c.FirstConnectTime.AsTime(), + LastHeartbeatTime: c.LastHeartbeatTime.AsTime(), + OnlineStatus: table.OnlineStatus(c.OnlineStatus), + Resource: resource, + CurrentReleaseID: c.CurrentReleaseId, + TargetReleaseID: c.TargetReleaseId, + ReleaseChangeStatus: table.Status(c.ReleaseChangeStatus), + ReleaseChangeFailedReason: table.FailedReason(c.ReleaseChangeFailedReason), + FailedDetailReason: c.FailedDetailReason, + } +} + +// ClientAttachment convert pb ClientAttachment to table ClientAttachment +func (c *ClientAttachment) ClientAttachment() *table.ClientAttachment { + return &table.ClientAttachment{ + UID: c.Uid, + BizID: c.BizId, + AppID: c.AppId, + } +} + +// PbClientAttachment convert table ClientAttachment to pb ClientAttachment +func PbClientAttachment(attachment *table.ClientAttachment) *ClientAttachment { // nolint + if attachment == nil { + return nil + } + return &ClientAttachment{ + Uid: attachment.UID, + BizId: attachment.BizID, + AppId: attachment.AppID, + } +} diff --git a/bcs-services/bcs-bscp/pkg/protocol/data-service/data_service.pb.go b/bcs-services/bcs-bscp/pkg/protocol/data-service/data_service.pb.go index 586a1930c0..4daed6cdf8 100644 --- a/bcs-services/bcs-bscp/pkg/protocol/data-service/data_service.pb.go +++ b/bcs-services/bcs-bscp/pkg/protocol/data-service/data_service.pb.go @@ -11,6 +11,8 @@ import ( app_template_binding "github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/pkg/protocol/core/app-template-binding" app_template_variable "github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/pkg/protocol/core/app-template-variable" base "github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/pkg/protocol/core/base" + client "github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/pkg/protocol/core/client" + client_event "github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/pkg/protocol/core/client-event" commit "github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/pkg/protocol/core/commit" config_item "github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/pkg/protocol/core/config-item" content "github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/pkg/protocol/core/content" @@ -13635,6 +13637,99 @@ func (x *UnDeleteKvReq) GetAttachment() *kv.KvAttachment { return nil } +type BatchUpsertClientMetricsReq struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ClientItems []*client.Client `protobuf:"bytes,1,rep,name=client_items,json=clientItems,proto3" json:"client_items,omitempty"` + ClientEventItems []*client_event.ClientEvent `protobuf:"bytes,2,rep,name=client_event_items,json=clientEventItems,proto3" json:"client_event_items,omitempty"` +} + +func (x *BatchUpsertClientMetricsReq) Reset() { + *x = BatchUpsertClientMetricsReq{} + if protoimpl.UnsafeEnabled { + mi := &file_data_service_proto_msgTypes[217] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BatchUpsertClientMetricsReq) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BatchUpsertClientMetricsReq) ProtoMessage() {} + +func (x *BatchUpsertClientMetricsReq) ProtoReflect() protoreflect.Message { + mi := &file_data_service_proto_msgTypes[217] + 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 BatchUpsertClientMetricsReq.ProtoReflect.Descriptor instead. +func (*BatchUpsertClientMetricsReq) Descriptor() ([]byte, []int) { + return file_data_service_proto_rawDescGZIP(), []int{217} +} + +func (x *BatchUpsertClientMetricsReq) GetClientItems() []*client.Client { + if x != nil { + return x.ClientItems + } + return nil +} + +func (x *BatchUpsertClientMetricsReq) GetClientEventItems() []*client_event.ClientEvent { + if x != nil { + return x.ClientEventItems + } + return nil +} + +type BatchUpsertClientMetricsResp struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *BatchUpsertClientMetricsResp) Reset() { + *x = BatchUpsertClientMetricsResp{} + if protoimpl.UnsafeEnabled { + mi := &file_data_service_proto_msgTypes[218] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BatchUpsertClientMetricsResp) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BatchUpsertClientMetricsResp) ProtoMessage() {} + +func (x *BatchUpsertClientMetricsResp) ProtoReflect() protoreflect.Message { + mi := &file_data_service_proto_msgTypes[218] + 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 BatchUpsertClientMetricsResp.ProtoReflect.Descriptor instead. +func (*BatchUpsertClientMetricsResp) Descriptor() ([]byte, []int) { + return file_data_service_proto_rawDescGZIP(), []int{218} +} + type BatchUpsertConfigItemsReq_ConfigItem struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -13648,7 +13743,7 @@ type BatchUpsertConfigItemsReq_ConfigItem struct { func (x *BatchUpsertConfigItemsReq_ConfigItem) Reset() { *x = BatchUpsertConfigItemsReq_ConfigItem{} if protoimpl.UnsafeEnabled { - mi := &file_data_service_proto_msgTypes[217] + mi := &file_data_service_proto_msgTypes[219] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13661,7 +13756,7 @@ func (x *BatchUpsertConfigItemsReq_ConfigItem) String() string { func (*BatchUpsertConfigItemsReq_ConfigItem) ProtoMessage() {} func (x *BatchUpsertConfigItemsReq_ConfigItem) ProtoReflect() protoreflect.Message { - mi := &file_data_service_proto_msgTypes[217] + mi := &file_data_service_proto_msgTypes[219] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13712,7 +13807,7 @@ type ListConfigItemByTupleReq_Item struct { func (x *ListConfigItemByTupleReq_Item) Reset() { *x = ListConfigItemByTupleReq_Item{} if protoimpl.UnsafeEnabled { - mi := &file_data_service_proto_msgTypes[218] + mi := &file_data_service_proto_msgTypes[220] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13725,7 +13820,7 @@ func (x *ListConfigItemByTupleReq_Item) String() string { func (*ListConfigItemByTupleReq_Item) ProtoMessage() {} func (x *ListConfigItemByTupleReq_Item) ProtoReflect() protoreflect.Message { - mi := &file_data_service_proto_msgTypes[218] + mi := &file_data_service_proto_msgTypes[220] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13780,7 +13875,7 @@ type GetHookInfoSpec_Releases struct { func (x *GetHookInfoSpec_Releases) Reset() { *x = GetHookInfoSpec_Releases{} if protoimpl.UnsafeEnabled { - mi := &file_data_service_proto_msgTypes[219] + mi := &file_data_service_proto_msgTypes[221] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13793,7 +13888,7 @@ func (x *GetHookInfoSpec_Releases) String() string { func (*GetHookInfoSpec_Releases) ProtoMessage() {} func (x *GetHookInfoSpec_Releases) ProtoReflect() protoreflect.Message { - mi := &file_data_service_proto_msgTypes[219] + mi := &file_data_service_proto_msgTypes[221] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13830,7 +13925,7 @@ type ListHooksResp_Detail struct { func (x *ListHooksResp_Detail) Reset() { *x = ListHooksResp_Detail{} if protoimpl.UnsafeEnabled { - mi := &file_data_service_proto_msgTypes[220] + mi := &file_data_service_proto_msgTypes[222] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13843,7 +13938,7 @@ func (x *ListHooksResp_Detail) String() string { func (*ListHooksResp_Detail) ProtoMessage() {} func (x *ListHooksResp_Detail) ProtoReflect() protoreflect.Message { - mi := &file_data_service_proto_msgTypes[220] + mi := &file_data_service_proto_msgTypes[222] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13905,7 +14000,7 @@ type ListHookReferencesResp_Detail struct { func (x *ListHookReferencesResp_Detail) Reset() { *x = ListHookReferencesResp_Detail{} if protoimpl.UnsafeEnabled { - mi := &file_data_service_proto_msgTypes[221] + mi := &file_data_service_proto_msgTypes[223] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13918,7 +14013,7 @@ func (x *ListHookReferencesResp_Detail) String() string { func (*ListHookReferencesResp_Detail) ProtoMessage() {} func (x *ListHookReferencesResp_Detail) ProtoReflect() protoreflect.Message { - mi := &file_data_service_proto_msgTypes[221] + mi := &file_data_service_proto_msgTypes[223] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14003,7 +14098,7 @@ type ListHookRevisionsResp_ListHookRevisionsData struct { func (x *ListHookRevisionsResp_ListHookRevisionsData) Reset() { *x = ListHookRevisionsResp_ListHookRevisionsData{} if protoimpl.UnsafeEnabled { - mi := &file_data_service_proto_msgTypes[222] + mi := &file_data_service_proto_msgTypes[224] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14016,7 +14111,7 @@ func (x *ListHookRevisionsResp_ListHookRevisionsData) String() string { func (*ListHookRevisionsResp_ListHookRevisionsData) ProtoMessage() {} func (x *ListHookRevisionsResp_ListHookRevisionsData) ProtoReflect() protoreflect.Message { - mi := &file_data_service_proto_msgTypes[222] + mi := &file_data_service_proto_msgTypes[224] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14071,7 +14166,7 @@ type ListHookRevisionReferencesResp_Detail struct { func (x *ListHookRevisionReferencesResp_Detail) Reset() { *x = ListHookRevisionReferencesResp_Detail{} if protoimpl.UnsafeEnabled { - mi := &file_data_service_proto_msgTypes[223] + mi := &file_data_service_proto_msgTypes[225] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14084,7 +14179,7 @@ func (x *ListHookRevisionReferencesResp_Detail) String() string { func (*ListHookRevisionReferencesResp_Detail) ProtoMessage() {} func (x *ListHookRevisionReferencesResp_Detail) ProtoReflect() protoreflect.Message { - mi := &file_data_service_proto_msgTypes[223] + mi := &file_data_service_proto_msgTypes[225] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14173,7 +14268,7 @@ type GetReleaseHookResp_Hook struct { func (x *GetReleaseHookResp_Hook) Reset() { *x = GetReleaseHookResp_Hook{} if protoimpl.UnsafeEnabled { - mi := &file_data_service_proto_msgTypes[224] + mi := &file_data_service_proto_msgTypes[226] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14186,7 +14281,7 @@ func (x *GetReleaseHookResp_Hook) String() string { func (*GetReleaseHookResp_Hook) ProtoMessage() {} func (x *GetReleaseHookResp_Hook) ProtoReflect() protoreflect.Message { - mi := &file_data_service_proto_msgTypes[224] + mi := &file_data_service_proto_msgTypes[226] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14265,7 +14360,7 @@ type ListTemplateByTupleReq_Item struct { func (x *ListTemplateByTupleReq_Item) Reset() { *x = ListTemplateByTupleReq_Item{} if protoimpl.UnsafeEnabled { - mi := &file_data_service_proto_msgTypes[225] + mi := &file_data_service_proto_msgTypes[227] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14278,7 +14373,7 @@ func (x *ListTemplateByTupleReq_Item) String() string { func (*ListTemplateByTupleReq_Item) ProtoMessage() {} func (x *ListTemplateByTupleReq_Item) ProtoReflect() protoreflect.Message { - mi := &file_data_service_proto_msgTypes[225] + mi := &file_data_service_proto_msgTypes[227] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14334,7 +14429,7 @@ type ListTemplateByTupleReqResp_Item struct { func (x *ListTemplateByTupleReqResp_Item) Reset() { *x = ListTemplateByTupleReqResp_Item{} if protoimpl.UnsafeEnabled { - mi := &file_data_service_proto_msgTypes[226] + mi := &file_data_service_proto_msgTypes[228] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14347,7 +14442,7 @@ func (x *ListTemplateByTupleReqResp_Item) String() string { func (*ListTemplateByTupleReqResp_Item) ProtoMessage() {} func (x *ListTemplateByTupleReqResp_Item) ProtoReflect() protoreflect.Message { - mi := &file_data_service_proto_msgTypes[226] + mi := &file_data_service_proto_msgTypes[228] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14389,7 +14484,7 @@ type BatchUpsertTemplatesReq_Item struct { func (x *BatchUpsertTemplatesReq_Item) Reset() { *x = BatchUpsertTemplatesReq_Item{} if protoimpl.UnsafeEnabled { - mi := &file_data_service_proto_msgTypes[227] + mi := &file_data_service_proto_msgTypes[229] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14402,7 +14497,7 @@ func (x *BatchUpsertTemplatesReq_Item) String() string { func (*BatchUpsertTemplatesReq_Item) ProtoMessage() {} func (x *BatchUpsertTemplatesReq_Item) ProtoReflect() protoreflect.Message { - mi := &file_data_service_proto_msgTypes[227] + mi := &file_data_service_proto_msgTypes[229] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14449,7 +14544,7 @@ type ListAppGroupsResp_ListAppGroupsData struct { func (x *ListAppGroupsResp_ListAppGroupsData) Reset() { *x = ListAppGroupsResp_ListAppGroupsData{} if protoimpl.UnsafeEnabled { - mi := &file_data_service_proto_msgTypes[228] + mi := &file_data_service_proto_msgTypes[230] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14462,7 +14557,7 @@ func (x *ListAppGroupsResp_ListAppGroupsData) String() string { func (*ListAppGroupsResp_ListAppGroupsData) ProtoMessage() {} func (x *ListAppGroupsResp_ListAppGroupsData) ProtoReflect() protoreflect.Message { - mi := &file_data_service_proto_msgTypes[228] + mi := &file_data_service_proto_msgTypes[230] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14540,7 +14635,7 @@ type CountGroupsReleasedAppsResp_CountGroupsReleasedAppsData struct { func (x *CountGroupsReleasedAppsResp_CountGroupsReleasedAppsData) Reset() { *x = CountGroupsReleasedAppsResp_CountGroupsReleasedAppsData{} if protoimpl.UnsafeEnabled { - mi := &file_data_service_proto_msgTypes[229] + mi := &file_data_service_proto_msgTypes[231] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14553,7 +14648,7 @@ func (x *CountGroupsReleasedAppsResp_CountGroupsReleasedAppsData) String() strin func (*CountGroupsReleasedAppsResp_CountGroupsReleasedAppsData) ProtoMessage() {} func (x *CountGroupsReleasedAppsResp_CountGroupsReleasedAppsData) ProtoReflect() protoreflect.Message { - mi := &file_data_service_proto_msgTypes[229] + mi := &file_data_service_proto_msgTypes[231] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14605,7 +14700,7 @@ type ListGroupReleasedAppsResp_ListGroupReleasedAppsData struct { func (x *ListGroupReleasedAppsResp_ListGroupReleasedAppsData) Reset() { *x = ListGroupReleasedAppsResp_ListGroupReleasedAppsData{} if protoimpl.UnsafeEnabled { - mi := &file_data_service_proto_msgTypes[230] + mi := &file_data_service_proto_msgTypes[232] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14618,7 +14713,7 @@ func (x *ListGroupReleasedAppsResp_ListGroupReleasedAppsData) String() string { func (*ListGroupReleasedAppsResp_ListGroupReleasedAppsData) ProtoMessage() {} func (x *ListGroupReleasedAppsResp_ListGroupReleasedAppsData) ProtoReflect() protoreflect.Message { - mi := &file_data_service_proto_msgTypes[230] + mi := &file_data_service_proto_msgTypes[232] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14681,7 +14776,7 @@ type BatchUpsertKvsReq_Kv struct { func (x *BatchUpsertKvsReq_Kv) Reset() { *x = BatchUpsertKvsReq_Kv{} if protoimpl.UnsafeEnabled { - mi := &file_data_service_proto_msgTypes[231] + mi := &file_data_service_proto_msgTypes[233] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14694,7 +14789,7 @@ func (x *BatchUpsertKvsReq_Kv) String() string { func (*BatchUpsertKvsReq_Kv) ProtoMessage() {} func (x *BatchUpsertKvsReq_Kv) ProtoReflect() protoreflect.Message { - mi := &file_data_service_proto_msgTypes[231] + mi := &file_data_service_proto_msgTypes[233] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14741,1179 +14836,913 @@ var file_data_service_proto_rawDesc = []byte{ 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2d, 0x69, 0x74, 0x65, 0x6d, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x25, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, - 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x2f, 0x63, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x27, 0x70, 0x6b, 0x67, 0x2f, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x63, 0x6f, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x1a, 0x2d, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, - 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, - 0x2f, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x1a, 0x39, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, - 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x2d, - 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2f, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, - 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x23, 0x70, 0x6b, + 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2f, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x31, 0x70, 0x6b, 0x67, 0x2f, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x2d, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x25, 0x70, 0x6b, + 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, + 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x1a, 0x27, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, + 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2f, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2d, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, - 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x1a, 0x21, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, - 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x68, 0x6f, 0x6f, 0x6b, 0x2f, 0x68, 0x6f, 0x6f, 0x6b, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x33, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, - 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x68, 0x6f, 0x6f, 0x6b, 0x2d, 0x72, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x2f, 0x68, 0x6f, 0x6f, 0x6b, 0x5f, 0x72, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x27, 0x70, 0x6b, 0x67, 0x2f, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x72, 0x65, 0x6c, - 0x65, 0x61, 0x73, 0x65, 0x2f, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x1a, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, - 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x2d, 0x63, - 0x69, 0x2f, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x5f, 0x63, 0x69, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x1a, 0x29, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, - 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x2f, - 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x4b, + 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x2f, 0x63, 0x72, 0x65, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x39, 0x70, 0x6b, 0x67, + 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x63, + 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2f, + 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x23, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2f, + 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x21, 0x70, 0x6b, 0x67, + 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x68, + 0x6f, 0x6f, 0x6b, 0x2f, 0x68, 0x6f, 0x6f, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x33, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, - 0x65, 0x2f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x2d, 0x62, 0x69, 0x6e, 0x64, 0x69, - 0x6e, 0x67, 0x2d, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x74, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x65, 0x6c, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x3b, 0x70, 0x6b, 0x67, - 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x74, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x2d, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x2f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x31, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, + 0x65, 0x2f, 0x68, 0x6f, 0x6f, 0x6b, 0x2d, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x2f, + 0x68, 0x6f, 0x6f, 0x6b, 0x5f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x1a, 0x27, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, + 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x72, + 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2f, 0x70, 0x6b, + 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, + 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x2d, 0x63, 0x69, 0x2f, 0x72, 0x65, 0x6c, 0x65, + 0x61, 0x73, 0x65, 0x64, 0x5f, 0x63, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x29, 0x70, + 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, + 0x2f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x2f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x4b, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x74, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x2d, 0x73, 0x65, 0x74, 0x2f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, - 0x65, 0x5f, 0x73, 0x65, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x35, 0x70, 0x6b, 0x67, - 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x74, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x2d, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2f, 0x74, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x1a, 0x43, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, - 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x61, 0x70, 0x70, 0x2d, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x2d, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x70, 0x5f, - 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x3b, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x74, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x2d, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x74, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, - 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x6b, 0x76, 0x2f, 0x6b, 0x76, 0x73, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, - 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, - 0x2d, 0x6b, 0x76, 0x2f, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x5f, 0x6b, 0x76, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, - 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x22, 0xd9, 0x01, 0x0a, 0x19, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x72, 0x65, 0x64, - 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x52, 0x65, 0x71, 0x12, - 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x63, - 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x49, 0x64, 0x12, 0x34, 0x0a, 0x07, 0x63, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, - 0x62, 0x63, 0x72, 0x73, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x53, - 0x63, 0x6f, 0x70, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x12, 0x30, 0x0a, 0x07, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x70, 0x62, 0x63, 0x72, 0x73, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x07, 0x75, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x05, - 0x20, 0x03, 0x28, 0x0d, 0x52, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x22, 0x1c, 0x0a, - 0x1a, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, - 0x6c, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x22, 0x6d, 0x0a, 0x19, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x53, - 0x63, 0x6f, 0x70, 0x65, 0x73, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x40, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x61, - 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x70, - 0x62, 0x63, 0x72, 0x73, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x53, - 0x63, 0x6f, 0x70, 0x65, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, - 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x1c, 0x0a, 0x1a, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x53, 0x63, - 0x6f, 0x70, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x22, 0x55, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, - 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x73, - 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x72, - 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x49, 0x64, 0x22, - 0x66, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, - 0x6c, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x12, 0x34, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x62, 0x63, 0x72, 0x73, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, - 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x07, - 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x70, 0x0a, 0x18, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x6c, 0x61, 0x74, 0x65, 0x2d, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x2d, 0x72, 0x65, 0x6c, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x62, + 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x3b, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x63, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x2d, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x2f, 0x74, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x5f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x1a, 0x31, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, + 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x2d, 0x73, + 0x65, 0x74, 0x2f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x65, 0x74, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x35, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x63, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x2d, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x5f, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x43, 0x70, 0x6b, + 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, + 0x61, 0x70, 0x70, 0x2d, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x2d, 0x76, 0x61, 0x72, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x70, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x5f, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x1a, 0x3b, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, + 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x2d, 0x76, 0x61, + 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, + 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, + 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, + 0x65, 0x2f, 0x6b, 0x76, 0x2f, 0x6b, 0x76, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2f, + 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, + 0x65, 0x2f, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x2d, 0x6b, 0x76, 0x2f, 0x72, 0x65, + 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x5f, 0x6b, 0x76, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, + 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xd9, 0x01, 0x0a, 0x19, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, + 0x53, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, + 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x69, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x61, 0x6c, 0x49, 0x64, 0x12, 0x34, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x62, 0x63, 0x72, 0x73, 0x2e, 0x43, + 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x53, 0x70, + 0x65, 0x63, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x30, 0x0a, 0x07, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x70, + 0x62, 0x63, 0x72, 0x73, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x63, 0x6f, 0x70, 0x65, + 0x53, 0x70, 0x65, 0x63, 0x52, 0x07, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x18, 0x0a, + 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x07, + 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x22, 0x1c, 0x0a, 0x1a, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x53, 0x63, 0x6f, 0x70, 0x65, - 0x52, 0x65, 0x71, 0x12, 0x40, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x70, 0x62, 0x63, 0x72, 0x73, 0x2e, - 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x41, - 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, - 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x22, 0x8b, 0x01, 0x0a, 0x13, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x52, 0x65, - 0x71, 0x12, 0x42, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x62, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x61, 0x6c, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x41, - 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, - 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x70, 0x62, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, - 0x61, 0x6c, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x53, 0x70, 0x65, - 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x22, 0x8d, 0x01, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, - 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x22, 0x6d, 0x0a, 0x19, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, + 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x52, + 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x02, + 0x69, 0x64, 0x12, 0x40, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x70, 0x62, 0x63, 0x72, 0x73, 0x2e, 0x43, + 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x41, 0x74, + 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, + 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x1c, 0x0a, 0x1a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x72, + 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x22, 0x55, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x61, 0x6c, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, - 0x69, 0x7a, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x65, - 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, - 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, - 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x17, - 0x0a, 0x07, 0x74, 0x6f, 0x70, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x74, 0x6f, 0x70, 0x49, 0x64, 0x73, 0x22, 0x62, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x43, - 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x12, 0x14, 0x0a, - 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x12, 0x36, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x70, 0x62, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, - 0x69, 0x61, 0x6c, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x4c, 0x69, - 0x73, 0x74, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x9b, 0x01, 0x0a, 0x13, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, - 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x02, 0x69, 0x64, 0x12, 0x42, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, - 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x62, 0x63, 0x72, 0x65, 0x64, - 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, - 0x6c, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x61, 0x74, 0x74, - 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x70, 0x62, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x61, 0x6c, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x53, - 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x22, 0x58, 0x0a, 0x16, 0x43, 0x68, 0x65, - 0x63, 0x6b, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x4e, 0x61, 0x6d, 0x65, - 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x72, - 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x4e, - 0x61, 0x6d, 0x65, 0x22, 0x2f, 0x0a, 0x17, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x72, 0x65, 0x64, - 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x14, - 0x0a, 0x05, 0x65, 0x78, 0x69, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x65, - 0x78, 0x69, 0x73, 0x74, 0x22, 0x69, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x72, - 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x42, 0x0a, 0x0a, 0x61, - 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x69, 0x7a, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x63, 0x72, 0x65, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x49, 0x64, 0x22, 0x66, 0x0a, 0x18, 0x4c, 0x69, 0x73, + 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x53, 0x63, 0x6f, 0x70, 0x65, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x07, 0x64, + 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, + 0x62, 0x63, 0x72, 0x73, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x53, + 0x63, 0x6f, 0x70, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, + 0x73, 0x22, 0x70, 0x0a, 0x18, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x72, 0x65, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x52, 0x65, 0x71, 0x12, 0x40, 0x0a, + 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x20, 0x2e, 0x70, 0x62, 0x63, 0x72, 0x73, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x61, 0x6c, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x12, + 0x12, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x73, + 0x70, 0x65, 0x63, 0x22, 0x8b, 0x01, 0x0a, 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x72, + 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x12, 0x42, 0x0a, 0x0a, 0x61, + 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x62, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x22, - 0x54, 0x0a, 0x13, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, - 0x69, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x16, 0x0a, - 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x65, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x1c, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x02, 0x69, 0x64, 0x22, 0x85, 0x01, 0x0a, 0x13, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, - 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, - 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0b, 0x70, 0x72, 0x65, - 0x5f, 0x68, 0x6f, 0x6f, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, - 0x70, 0x72, 0x65, 0x48, 0x6f, 0x6f, 0x6b, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0c, 0x70, 0x6f, 0x73, - 0x74, 0x5f, 0x68, 0x6f, 0x6f, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x0a, 0x70, 0x6f, 0x73, 0x74, 0x48, 0x6f, 0x6f, 0x6b, 0x49, 0x64, 0x22, 0x40, 0x0a, 0x10, 0x47, - 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x71, 0x12, - 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x22, 0x49, 0x0a, - 0x0c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x70, 0x70, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, + 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x12, + 0x30, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, + 0x70, 0x62, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x2e, 0x43, 0x72, 0x65, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, + 0x63, 0x22, 0x8d, 0x01, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x1c, + 0x0a, 0x09, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x6f, 0x70, 0x5f, + 0x69, 0x64, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x6f, 0x70, 0x49, 0x64, + 0x73, 0x22, 0x62, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x36, 0x0a, + 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, + 0x2e, 0x70, 0x62, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x2e, 0x43, 0x72, + 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x07, 0x64, 0x65, + 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x9b, 0x01, 0x0a, 0x13, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x42, 0x0a, + 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x62, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, + 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x41, 0x74, 0x74, 0x61, 0x63, + 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, + 0x74, 0x12, 0x30, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1c, 0x2e, 0x70, 0x62, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x2e, 0x43, + 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, + 0x70, 0x65, 0x63, 0x22, 0x58, 0x0a, 0x16, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x72, 0x65, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, - 0x69, 0x7a, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x70, 0x62, 0x61, 0x70, 0x70, 0x2e, 0x41, 0x70, 0x70, 0x53, 0x70, - 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x22, 0x59, 0x0a, 0x0c, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x41, 0x70, 0x70, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, - 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, - 0x22, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, - 0x70, 0x62, 0x61, 0x70, 0x70, 0x2e, 0x41, 0x70, 0x70, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, - 0x70, 0x65, 0x63, 0x22, 0x35, 0x0a, 0x0c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x70, 0x70, - 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x02, 0x69, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x22, 0x39, 0x0a, 0x09, 0x47, 0x65, - 0x74, 0x41, 0x70, 0x70, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x15, - 0x0a, 0x06, 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, - 0x61, 0x70, 0x70, 0x49, 0x64, 0x22, 0x26, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x41, 0x70, 0x70, 0x42, - 0x79, 0x49, 0x44, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x22, 0x43, 0x0a, - 0x0f, 0x47, 0x65, 0x74, 0x41, 0x70, 0x70, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, - 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x70, 0x70, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x70, 0x70, 0x4e, 0x61, - 0x6d, 0x65, 0x22, 0x96, 0x01, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x70, 0x70, 0x73, 0x52, - 0x65, 0x73, 0x74, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x14, 0x0a, - 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6f, 0x70, 0x65, - 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f, 0x70, 0x65, - 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x6c, 0x6c, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x61, 0x6c, 0x6c, 0x22, 0x4a, 0x0a, 0x0c, 0x4c, - 0x69, 0x73, 0x74, 0x41, 0x70, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x12, 0x24, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x70, 0x62, 0x61, 0x70, 0x70, 0x2e, 0x41, 0x70, 0x70, 0x52, 0x07, - 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x24, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x41, - 0x70, 0x70, 0x73, 0x42, 0x79, 0x49, 0x44, 0x73, 0x52, 0x65, 0x71, 0x12, 0x10, 0x0a, 0x03, 0x69, - 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x03, 0x69, 0x64, 0x73, 0x22, 0x39, 0x0a, - 0x11, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x70, 0x70, 0x73, 0x42, 0x79, 0x49, 0x44, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x12, 0x24, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x70, 0x62, 0x61, 0x70, 0x70, 0x2e, 0x41, 0x70, 0x70, 0x52, - 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0xe2, 0x01, 0x0a, 0x13, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x71, - 0x12, 0x50, 0x0a, 0x16, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x5f, - 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x70, 0x62, 0x63, 0x69, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x74, - 0x65, 0x6d, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x14, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x49, 0x74, 0x65, 0x6d, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, - 0x6e, 0x74, 0x12, 0x3e, 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x74, 0x65, - 0x6d, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x70, - 0x62, 0x63, 0x69, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x74, 0x65, 0x6d, 0x53, 0x70, - 0x65, 0x63, 0x52, 0x0e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x74, 0x65, 0x6d, 0x53, 0x70, - 0x65, 0x63, 0x12, 0x39, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x70, - 0x65, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x70, 0x62, 0x63, 0x6f, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x53, 0x70, 0x65, 0x63, - 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x53, 0x70, 0x65, 0x63, 0x22, 0x88, 0x03, - 0x0a, 0x19, 0x42, 0x61, 0x74, 0x63, 0x68, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, - 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, - 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x12, 0x40, 0x0a, 0x05, 0x69, 0x74, 0x65, - 0x6d, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x70, 0x62, 0x64, 0x73, 0x2e, - 0x42, 0x61, 0x74, 0x63, 0x68, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x52, 0x65, 0x71, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x49, 0x74, 0x65, 0x6d, 0x52, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x72, - 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x5f, 0x61, 0x6c, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x41, 0x6c, 0x6c, 0x1a, 0xd9, 0x01, 0x0a, - 0x0a, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x50, 0x0a, 0x16, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x5f, 0x61, 0x74, 0x74, 0x61, 0x63, - 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x62, - 0x63, 0x69, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x74, 0x65, 0x6d, 0x41, 0x74, 0x74, - 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x14, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, - 0x74, 0x65, 0x6d, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x3e, 0x0a, - 0x10, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x5f, 0x73, 0x70, 0x65, - 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x70, 0x62, 0x63, 0x69, 0x2e, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x74, 0x65, 0x6d, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0e, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x74, 0x65, 0x6d, 0x53, 0x70, 0x65, 0x63, 0x12, 0x39, 0x0a, - 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x70, 0x62, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, - 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0b, 0x63, 0x6f, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x53, 0x70, 0x65, 0x63, 0x22, 0x2e, 0x0a, 0x1a, 0x42, 0x61, 0x74, 0x63, - 0x68, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x74, 0x65, - 0x6d, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x10, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0d, 0x52, 0x03, 0x69, 0x64, 0x73, 0x22, 0x8b, 0x01, 0x0a, 0x13, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x71, + 0x69, 0x7a, 0x49, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x61, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, + 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x2f, 0x0a, + 0x17, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, + 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x78, 0x69, 0x73, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x65, 0x78, 0x69, 0x73, 0x74, 0x22, 0x69, + 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x61, 0x6c, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x42, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, + 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x62, 0x63, 0x72, + 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x61, 0x6c, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x61, + 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x54, 0x0a, 0x13, 0x45, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, - 0x12, 0x3a, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x62, 0x63, 0x69, 0x2e, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x49, 0x74, 0x65, 0x6d, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x04, - 0x73, 0x70, 0x65, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x70, 0x62, 0x63, - 0x69, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x74, 0x65, 0x6d, 0x53, 0x70, 0x65, 0x63, - 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x22, 0x61, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x22, + 0x1c, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x22, 0x85, 0x01, + 0x0a, 0x13, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x6f, + 0x6f, 0x6b, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, + 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x61, 0x70, + 0x70, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0b, 0x70, 0x72, 0x65, 0x5f, 0x68, 0x6f, 0x6f, 0x6b, 0x5f, + 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x70, 0x72, 0x65, 0x48, 0x6f, 0x6f, + 0x6b, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0c, 0x70, 0x6f, 0x73, 0x74, 0x5f, 0x68, 0x6f, 0x6f, 0x6b, + 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x70, 0x6f, 0x73, 0x74, 0x48, + 0x6f, 0x6f, 0x6b, 0x49, 0x64, 0x22, 0x40, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, + 0x12, 0x15, 0x0a, 0x06, 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x22, 0x49, 0x0a, 0x0c, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x41, 0x70, 0x70, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x22, + 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x70, + 0x62, 0x61, 0x70, 0x70, 0x2e, 0x41, 0x70, 0x70, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, + 0x65, 0x63, 0x22, 0x59, 0x0a, 0x0c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x70, 0x70, 0x52, + 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, + 0x69, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x04, 0x73, 0x70, 0x65, + 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x70, 0x62, 0x61, 0x70, 0x70, 0x2e, + 0x41, 0x70, 0x70, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x22, 0x35, 0x0a, + 0x0c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x70, 0x70, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x15, 0x0a, + 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, + 0x69, 0x7a, 0x49, 0x64, 0x22, 0x39, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x41, 0x70, 0x70, 0x52, 0x65, + 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x61, 0x70, 0x70, 0x5f, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x22, + 0x26, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x41, 0x70, 0x70, 0x42, 0x79, 0x49, 0x44, 0x52, 0x65, 0x71, + 0x12, 0x15, 0x0a, 0x06, 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x41, 0x70, + 0x70, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, + 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, + 0x64, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x70, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x70, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x96, 0x01, 0x0a, + 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x70, 0x70, 0x73, 0x52, 0x65, 0x73, 0x74, 0x52, 0x65, 0x71, + 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x14, 0x0a, + 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x6c, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x03, 0x61, 0x6c, 0x6c, 0x22, 0x4a, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x70, 0x70, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x24, 0x0a, 0x07, 0x64, + 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x70, + 0x62, 0x61, 0x70, 0x70, 0x2e, 0x41, 0x70, 0x70, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, + 0x73, 0x22, 0x24, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x70, 0x70, 0x73, 0x42, 0x79, 0x49, + 0x44, 0x73, 0x52, 0x65, 0x71, 0x12, 0x10, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0d, 0x52, 0x03, 0x69, 0x64, 0x73, 0x22, 0x39, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x41, + 0x70, 0x70, 0x73, 0x42, 0x79, 0x49, 0x44, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x24, 0x0a, 0x07, + 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0a, 0x2e, + 0x70, 0x62, 0x61, 0x70, 0x70, 0x2e, 0x41, 0x70, 0x70, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, + 0x6c, 0x73, 0x22, 0xe2, 0x01, 0x0a, 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x71, 0x12, 0x50, 0x0a, 0x16, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x5f, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, + 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x62, 0x63, + 0x69, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x74, 0x65, 0x6d, 0x41, 0x74, 0x74, 0x61, + 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x14, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x74, + 0x65, 0x6d, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x3e, 0x0a, 0x10, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x5f, 0x73, 0x70, 0x65, 0x63, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x70, 0x62, 0x63, 0x69, 0x2e, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x49, 0x74, 0x65, 0x6d, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0e, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x49, 0x74, 0x65, 0x6d, 0x53, 0x70, 0x65, 0x63, 0x12, 0x39, 0x0a, 0x0c, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x70, 0x62, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x43, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x53, 0x70, 0x65, 0x63, 0x22, 0x88, 0x03, 0x0a, 0x19, 0x42, 0x61, 0x74, 0x63, + 0x68, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x74, 0x65, + 0x6d, 0x73, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, + 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x61, 0x70, + 0x70, 0x49, 0x64, 0x12, 0x40, 0x0a, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x70, 0x62, 0x64, 0x73, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x55, + 0x70, 0x73, 0x65, 0x72, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x74, 0x65, 0x6d, 0x73, + 0x52, 0x65, 0x71, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x05, + 0x69, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, + 0x5f, 0x61, 0x6c, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6c, + 0x61, 0x63, 0x65, 0x41, 0x6c, 0x6c, 0x1a, 0xd9, 0x01, 0x0a, 0x0a, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x50, 0x0a, 0x16, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, + 0x69, 0x74, 0x65, 0x6d, 0x5f, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x62, 0x63, 0x69, 0x2e, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x49, 0x74, 0x65, 0x6d, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x14, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x74, 0x65, 0x6d, 0x41, 0x74, 0x74, + 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x3e, 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x14, 0x2e, 0x70, 0x62, 0x63, 0x69, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, + 0x74, 0x65, 0x6d, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, + 0x74, 0x65, 0x6d, 0x53, 0x70, 0x65, 0x63, 0x12, 0x39, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, + 0x70, 0x62, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x53, 0x70, + 0x65, 0x63, 0x22, 0x2e, 0x0a, 0x1a, 0x42, 0x61, 0x74, 0x63, 0x68, 0x55, 0x70, 0x73, 0x65, 0x72, + 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x12, 0x10, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x03, 0x69, + 0x64, 0x73, 0x22, 0x8b, 0x01, 0x0a, 0x13, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3a, 0x0a, 0x0a, 0x61, 0x74, + 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x70, 0x62, 0x63, 0x69, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x74, 0x65, 0x6d, + 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x61, + 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x70, 0x62, 0x63, 0x69, 0x2e, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x49, 0x74, 0x65, 0x6d, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, + 0x22, 0x61, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x49, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3a, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, + 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x62, + 0x63, 0x69, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x74, 0x65, 0x6d, 0x41, 0x74, 0x74, + 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, + 0x65, 0x6e, 0x74, 0x22, 0x63, 0x0a, 0x15, 0x55, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3a, 0x0a, 0x0a, + 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x70, 0x62, 0x63, 0x69, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x74, + 0x65, 0x6d, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x61, 0x74, + 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x5f, 0x0a, 0x11, 0x55, 0x6e, 0x64, 0x6f, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3a, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x62, 0x63, 0x69, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x74, 0x65, 0x6d, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x61, - 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x63, 0x0a, 0x15, 0x55, 0x6e, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x74, 0x65, 0x6d, 0x52, - 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, - 0x69, 0x64, 0x12, 0x3a, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x62, 0x63, 0x69, 0x2e, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x49, 0x74, 0x65, 0x6d, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x5f, - 0x0a, 0x11, 0x55, 0x6e, 0x64, 0x6f, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x74, 0x65, 0x6d, - 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x02, 0x69, 0x64, 0x12, 0x3a, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, - 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x62, 0x63, 0x69, 0x2e, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x74, 0x65, 0x6d, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x22, - 0x50, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x74, 0x65, 0x6d, - 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x02, 0x69, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x61, 0x70, - 0x70, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, - 0x64, 0x22, 0x93, 0x02, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x49, 0x74, 0x65, 0x6d, 0x73, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, - 0x15, 0x0a, 0x06, 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, - 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, + 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x50, 0x0a, 0x10, 0x47, 0x65, 0x74, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x15, 0x0a, + 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, + 0x69, 0x7a, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x22, 0x93, 0x02, 0x0a, 0x12, + 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x52, + 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x61, 0x70, 0x70, + 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, + 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, + 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x46, + 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x61, + 0x72, 0x63, 0x68, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x14, + 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, + 0x69, 0x6d, 0x69, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x69, 0x64, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x6c, 0x6c, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x03, 0x61, 0x6c, 0x6c, 0x12, 0x1f, 0x0a, 0x0b, 0x77, 0x69, 0x74, 0x68, + 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x77, + 0x69, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x22, 0x57, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, + 0x74, 0x65, 0x6d, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2a, + 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x10, 0x2e, 0x70, 0x62, 0x63, 0x69, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x74, 0x65, + 0x6d, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0xef, 0x01, 0x0a, 0x1a, 0x4c, + 0x69, 0x73, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, + 0x12, 0x15, 0x0a, 0x06, 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x6c, 0x65, 0x61, + 0x73, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x72, 0x65, 0x6c, + 0x65, 0x61, 0x73, 0x65, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x73, - 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, - 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x69, 0x64, - 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x69, 0x64, 0x73, 0x12, 0x10, 0x0a, 0x03, - 0x61, 0x6c, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x61, 0x6c, 0x6c, 0x12, 0x1f, - 0x0a, 0x0b, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0a, 0x77, 0x69, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, - 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x57, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x14, - 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2a, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x62, 0x63, 0x69, 0x2e, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, - 0x22, 0xef, 0x01, 0x0a, 0x1a, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, - 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x52, 0x65, 0x71, 0x12, + 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x6c, + 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x61, 0x6c, 0x6c, 0x22, 0x68, 0x0a, 0x1b, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x12, 0x33, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x62, 0x72, 0x63, 0x69, 0x2e, 0x52, 0x65, 0x6c, 0x65, 0x61, + 0x73, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x07, 0x64, + 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x46, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x49, 0x74, 0x65, 0x6d, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, + 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x61, 0x70, 0x70, 0x5f, 0x69, + 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x22, 0x4f, + 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x74, 0x65, 0x6d, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x34, 0x0a, 0x07, 0x64, 0x65, 0x74, + 0x61, 0x69, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x62, 0x63, + 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x74, 0x65, 0x6d, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, + 0xb3, 0x01, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x74, + 0x65, 0x6d, 0x42, 0x79, 0x54, 0x75, 0x70, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x12, 0x39, 0x0a, 0x05, + 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x70, 0x62, + 0x64, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x74, 0x65, + 0x6d, 0x42, 0x79, 0x54, 0x75, 0x70, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x2e, 0x49, 0x74, 0x65, 0x6d, + 0x52, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x1a, 0x5c, 0x0a, 0x04, 0x49, 0x74, 0x65, 0x6d, 0x12, + 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x70, 0x61, 0x74, 0x68, 0x22, 0x50, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x49, 0x74, 0x65, 0x6d, 0x42, 0x79, 0x54, 0x75, 0x70, 0x6c, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x12, 0x33, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x74, 0x65, + 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x62, 0x63, 0x69, 0x2e, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x7c, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x12, 0x3c, 0x0a, 0x0a, 0x61, + 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1c, 0x2e, 0x70, 0x62, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x61, + 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2a, 0x0a, 0x04, 0x73, 0x70, 0x65, + 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x70, 0x62, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x53, 0x70, 0x65, 0x63, 0x52, + 0x04, 0x73, 0x70, 0x65, 0x63, 0x22, 0x4d, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x15, 0x0a, + 0x06, 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x61, + 0x70, 0x70, 0x49, 0x64, 0x22, 0x80, 0x01, 0x0a, 0x0f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, + 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x12, 0x3a, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x61, + 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, + 0x62, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x41, 0x74, + 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, + 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x65, 0x6d, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6d, 0x65, 0x6d, 0x6f, 0x22, 0x68, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x4c, 0x61, + 0x74, 0x65, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, + 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, + 0x69, 0x7a, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0e, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x74, 0x65, 0x6d, 0x49, + 0x64, 0x22, 0xb6, 0x01, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x6c, 0x65, + 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x12, 0x3c, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, + 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x70, 0x62, 0x72, + 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x41, 0x74, + 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, + 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2a, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x70, 0x62, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2e, 0x52, + 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, + 0x12, 0x38, 0x0a, 0x09, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x62, 0x74, 0x76, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, + 0x09, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x22, 0xbb, 0x01, 0x0a, 0x0f, 0x4c, + 0x69, 0x73, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x73, 0x52, 0x65, 0x71, 0x12, 0x15, + 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, + 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, + 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x14, 0x0a, 0x05, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x6c, 0x6c, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x61, 0x6c, 0x6c, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, + 0x61, 0x72, 0x63, 0x68, 0x4b, 0x65, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x65, 0x79, 0x22, 0x56, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x14, 0x0a, 0x05, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x70, 0x62, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2e, + 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, + 0x22, 0x66, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x42, 0x79, + 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x15, + 0x0a, 0x06, 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, + 0x61, 0x70, 0x70, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x6c, + 0x65, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x62, 0x0a, 0x13, 0x44, 0x65, 0x70, 0x72, + 0x65, 0x63, 0x61, 0x74, 0x65, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x09, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, - 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x46, 0x69, 0x65, 0x6c, 0x64, - 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, - 0x6d, 0x69, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, - 0x12, 0x10, 0x0a, 0x03, 0x61, 0x6c, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x61, - 0x6c, 0x6c, 0x22, 0x68, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, - 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x33, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, - 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x62, 0x72, 0x63, 0x69, - 0x2e, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, - 0x74, 0x65, 0x6d, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x46, 0x0a, 0x16, - 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x74, 0x65, 0x6d, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x15, 0x0a, - 0x06, 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x05, 0x61, - 0x70, 0x70, 0x49, 0x64, 0x22, 0x4f, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x49, 0x74, 0x65, 0x6d, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, - 0x34, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x70, 0x62, 0x63, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x49, 0x74, 0x65, 0x6d, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, 0x07, 0x64, 0x65, - 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0xb3, 0x01, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x49, 0x74, 0x65, 0x6d, 0x42, 0x79, 0x54, 0x75, 0x70, 0x6c, 0x65, 0x52, - 0x65, 0x71, 0x12, 0x39, 0x0a, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x23, 0x2e, 0x70, 0x62, 0x64, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x49, 0x74, 0x65, 0x6d, 0x42, 0x79, 0x54, 0x75, 0x70, 0x6c, 0x65, 0x52, 0x65, - 0x71, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x1a, 0x5c, 0x0a, - 0x04, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, + 0x0d, 0x52, 0x09, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x49, 0x64, 0x22, 0x64, 0x0a, 0x15, + 0x55, 0x6e, 0x44, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x52, 0x65, 0x6c, 0x65, 0x61, + 0x73, 0x65, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x61, 0x70, - 0x70, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x22, 0x50, 0x0a, 0x19, 0x4c, - 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x74, 0x65, 0x6d, 0x42, 0x79, 0x54, - 0x75, 0x70, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x33, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, - 0x2e, 0x70, 0x62, 0x63, 0x69, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x74, 0x65, 0x6d, - 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x7c, 0x0a, - 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x71, 0x12, 0x3c, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x70, 0x62, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, - 0x74, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x12, - 0x2a, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, - 0x70, 0x62, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, - 0x74, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x22, 0x4d, 0x0a, 0x0d, 0x47, - 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x15, 0x0a, 0x06, - 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, - 0x7a, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x22, 0x80, 0x01, 0x0a, 0x0f, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x12, 0x3a, - 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x62, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x2e, 0x43, 0x6f, - 0x6d, 0x6d, 0x69, 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, - 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6f, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, - 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x65, 0x6d, - 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6d, 0x65, 0x6d, 0x6f, 0x22, 0x68, 0x0a, - 0x12, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x61, 0x70, - 0x70, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, - 0x64, 0x12, 0x24, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x74, 0x65, 0x6d, - 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x49, 0x74, 0x65, 0x6d, 0x49, 0x64, 0x22, 0xb6, 0x01, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x12, 0x3c, 0x0a, 0x0a, - 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1c, 0x2e, 0x70, 0x62, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x6c, - 0x65, 0x61, 0x73, 0x65, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, - 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2a, 0x0a, 0x04, 0x73, 0x70, - 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x70, 0x62, 0x72, 0x65, 0x6c, - 0x65, 0x61, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x53, 0x70, 0x65, 0x63, - 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x12, 0x38, 0x0a, 0x09, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, - 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x62, 0x74, 0x76, - 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, - 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x09, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, - 0x22, 0xbb, 0x01, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, - 0x73, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x70, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x5f, 0x69, + 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, + 0x49, 0x64, 0x22, 0x5f, 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x6c, 0x65, + 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x15, 0x0a, + 0x06, 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x61, + 0x70, 0x70, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x5f, + 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, + 0x65, 0x49, 0x64, 0x22, 0x85, 0x01, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x61, + 0x73, 0x65, 0x64, 0x43, 0x49, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, + 0x15, 0x0a, 0x06, 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, + 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x72, 0x65, 0x6c, 0x65, + 0x61, 0x73, 0x65, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, + 0x69, 0x74, 0x65, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x74, 0x65, 0x6d, 0x49, 0x64, 0x22, 0x71, 0x0a, 0x10, 0x47, + 0x65, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x4b, 0x76, 0x52, 0x65, 0x71, 0x12, + 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x12, 0x1d, 0x0a, + 0x0a, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x09, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x22, 0x92, + 0x02, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x4b, + 0x76, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x61, 0x70, 0x70, - 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, - 0x65, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x5f, 0x69, 0x64, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x49, + 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x6b, 0x65, 0x79, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x65, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, - 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x10, - 0x0a, 0x03, 0x61, 0x6c, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x61, 0x6c, 0x6c, - 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x65, 0x79, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x65, 0x79, 0x22, 0x56, - 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, - 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x70, 0x62, 0x72, 0x65, - 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x52, 0x07, 0x64, - 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x66, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x52, 0x65, 0x6c, - 0x65, 0x61, 0x73, 0x65, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, + 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x10, + 0x0a, 0x03, 0x61, 0x6c, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x61, 0x6c, 0x6c, + 0x12, 0x17, 0x0a, 0x07, 0x6b, 0x76, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x09, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x06, 0x6b, 0x76, 0x54, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x6f, 0x72, + 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x12, 0x14, 0x0a, + 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, 0x72, + 0x64, 0x65, 0x72, 0x22, 0x57, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x61, + 0x73, 0x65, 0x64, 0x4b, 0x76, 0x52, 0x65, 0x73, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, + 0x2b, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x11, 0x2e, 0x70, 0x62, 0x72, 0x6b, 0x76, 0x2e, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, + 0x64, 0x4b, 0x76, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x6d, 0x0a, 0x0d, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x71, 0x12, 0x36, 0x0a, + 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x16, 0x2e, 0x70, 0x62, 0x68, 0x6f, 0x6f, 0x6b, 0x2e, 0x48, 0x6f, 0x6f, 0x6b, 0x41, + 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, + 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x62, 0x68, 0x6f, 0x6f, 0x6b, 0x2e, 0x48, 0x6f, 0x6f, + 0x6b, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x22, 0x27, 0x0a, 0x0e, 0x4c, + 0x69, 0x73, 0x74, 0x48, 0x6f, 0x6f, 0x6b, 0x54, 0x61, 0x67, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, - 0x69, 0x7a, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x72, - 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x62, - 0x0a, 0x13, 0x44, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x52, 0x65, 0x6c, 0x65, 0x61, - 0x73, 0x65, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, - 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x61, 0x70, - 0x70, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x5f, 0x69, - 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, - 0x49, 0x64, 0x22, 0x64, 0x0a, 0x15, 0x55, 0x6e, 0x44, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, - 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, - 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x6c, - 0x65, 0x61, 0x73, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x72, - 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x49, 0x64, 0x22, 0x5f, 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, - 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, - 0x7a, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, - 0x6c, 0x65, 0x61, 0x73, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, - 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x49, 0x64, 0x22, 0x85, 0x01, 0x0a, 0x10, 0x47, 0x65, - 0x74, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x43, 0x49, 0x52, 0x65, 0x71, 0x12, 0x15, - 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, - 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, - 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x09, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0e, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x74, 0x65, 0x6d, 0x49, - 0x64, 0x22, 0x71, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, - 0x4b, 0x76, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, - 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x61, 0x70, - 0x70, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x5f, 0x69, - 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, - 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x22, 0x92, 0x02, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x6c, - 0x65, 0x61, 0x73, 0x65, 0x64, 0x4b, 0x76, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, - 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, - 0x64, 0x12, 0x15, 0x0a, 0x06, 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x6c, 0x65, - 0x61, 0x73, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x72, 0x65, - 0x6c, 0x65, 0x61, 0x73, 0x65, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x61, 0x72, 0x63, - 0x68, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x61, - 0x72, 0x63, 0x68, 0x4b, 0x65, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x05, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, - 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x14, - 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, - 0x69, 0x6d, 0x69, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x6c, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x03, 0x61, 0x6c, 0x6c, 0x12, 0x17, 0x0a, 0x07, 0x6b, 0x76, 0x5f, 0x74, 0x79, 0x70, - 0x65, 0x18, 0x09, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x6b, 0x76, 0x54, 0x79, 0x70, 0x65, 0x12, - 0x12, 0x0a, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, - 0x6f, 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x0b, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x22, 0x57, 0x0a, 0x12, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x4b, 0x76, 0x52, 0x65, 0x73, 0x70, 0x12, - 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2b, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x70, 0x62, 0x72, 0x6b, 0x76, 0x2e, 0x52, - 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x4b, 0x76, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, - 0x6c, 0x73, 0x22, 0x6d, 0x0a, 0x0d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x48, 0x6f, 0x6f, 0x6b, - 0x52, 0x65, 0x71, 0x12, 0x36, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x70, 0x62, 0x68, 0x6f, 0x6f, 0x6b, - 0x2e, 0x48, 0x6f, 0x6f, 0x6b, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x0a, 0x04, 0x73, - 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x62, 0x68, 0x6f, - 0x6f, 0x6b, 0x2e, 0x48, 0x6f, 0x6f, 0x6b, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, - 0x63, 0x22, 0x27, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x48, 0x6f, 0x6f, 0x6b, 0x54, 0x61, 0x67, - 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x22, 0x3c, 0x0a, 0x0a, 0x47, 0x65, - 0x74, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, + 0x69, 0x7a, 0x49, 0x64, 0x22, 0x3c, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x48, 0x6f, 0x6f, 0x6b, 0x52, + 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x68, 0x6f, 0x6f, + 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x68, 0x6f, 0x6f, 0x6b, + 0x49, 0x64, 0x22, 0xae, 0x01, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, + 0x73, 0x70, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, + 0x69, 0x64, 0x12, 0x29, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x15, 0x2e, 0x70, 0x62, 0x64, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x48, 0x6f, 0x6f, 0x6b, 0x49, + 0x6e, 0x66, 0x6f, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x12, 0x36, 0x0a, + 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x16, 0x2e, 0x70, 0x62, 0x68, 0x6f, 0x6f, 0x6b, 0x2e, 0x48, 0x6f, 0x6f, 0x6b, 0x41, + 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, + 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x62, 0x62, 0x61, 0x73, 0x65, + 0x2e, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x22, 0xee, 0x01, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x48, 0x6f, 0x6f, 0x6b, 0x49, + 0x6e, 0x66, 0x6f, 0x53, 0x70, 0x65, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, + 0x10, 0x0a, 0x03, 0x74, 0x61, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x61, + 0x67, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x65, 0x6d, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6d, 0x65, 0x6d, 0x6f, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, + 0x5f, 0x6e, 0x75, 0x6d, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x70, 0x75, 0x62, 0x6c, + 0x69, 0x73, 0x68, 0x4e, 0x75, 0x6d, 0x12, 0x3a, 0x0a, 0x08, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, + 0x65, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x70, 0x62, 0x64, 0x73, 0x2e, + 0x47, 0x65, 0x74, 0x48, 0x6f, 0x6f, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x53, 0x70, 0x65, 0x63, 0x2e, + 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x73, 0x52, 0x08, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, + 0x65, 0x73, 0x1a, 0x30, 0x0a, 0x08, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x73, 0x12, 0x24, + 0x0a, 0x0e, 0x6e, 0x6f, 0x74, 0x5f, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x6e, 0x6f, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x61, + 0x73, 0x65, 0x49, 0x64, 0x22, 0xc0, 0x01, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x48, 0x6f, 0x6f, + 0x6b, 0x73, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x10, 0x0a, 0x03, 0x74, 0x61, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, + 0x61, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x6c, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x03, 0x61, 0x6c, 0x6c, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x74, 0x5f, 0x74, 0x61, 0x67, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x74, 0x54, 0x61, 0x67, 0x12, 0x14, 0x0a, + 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x61, + 0x72, 0x63, 0x68, 0x4b, 0x65, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, + 0x61, 0x72, 0x63, 0x68, 0x4b, 0x65, 0x79, 0x22, 0x80, 0x02, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, + 0x48, 0x6f, 0x6f, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, + 0x34, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x70, 0x62, 0x64, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x48, 0x6f, 0x6f, 0x6b, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x2e, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x07, 0x64, 0x65, + 0x74, 0x61, 0x69, 0x6c, 0x73, 0x1a, 0xa2, 0x01, 0x0a, 0x06, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, + 0x12, 0x20, 0x0a, 0x04, 0x68, 0x6f, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, + 0x2e, 0x70, 0x62, 0x68, 0x6f, 0x6f, 0x6b, 0x2e, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x04, 0x68, 0x6f, + 0x6f, 0x6b, 0x12, 0x1b, 0x0a, 0x09, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x6e, 0x75, 0x6d, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x4e, 0x75, 0x6d, 0x12, + 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, + 0x68, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x42, 0x0a, 0x0f, 0x4c, 0x69, + 0x73, 0x74, 0x48, 0x6f, 0x6f, 0x6b, 0x54, 0x61, 0x67, 0x52, 0x65, 0x73, 0x70, 0x12, 0x2f, 0x0a, + 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, + 0x2e, 0x70, 0x62, 0x68, 0x6f, 0x6f, 0x6b, 0x2e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x48, 0x6f, 0x6f, + 0x6b, 0x54, 0x61, 0x67, 0x73, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x91, + 0x01, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x68, 0x6f, 0x6f, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x06, 0x68, 0x6f, 0x6f, 0x6b, 0x49, 0x64, 0x22, 0xae, 0x01, 0x0a, 0x0b, 0x47, 0x65, 0x74, - 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x29, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x70, 0x62, 0x64, 0x73, 0x2e, 0x47, 0x65, - 0x74, 0x48, 0x6f, 0x6f, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, - 0x70, 0x65, 0x63, 0x12, 0x36, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, - 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x70, 0x62, 0x68, 0x6f, 0x6f, 0x6b, - 0x2e, 0x48, 0x6f, 0x6f, 0x6b, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x08, 0x72, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, - 0x70, 0x62, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, - 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xee, 0x01, 0x0a, 0x0f, 0x47, 0x65, - 0x74, 0x48, 0x6f, 0x6f, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x53, 0x70, 0x65, 0x63, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x61, 0x67, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x74, 0x61, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x65, 0x6d, 0x6f, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6d, 0x65, 0x6d, 0x6f, 0x12, 0x1f, 0x0a, 0x0b, 0x70, - 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x5f, 0x6e, 0x75, 0x6d, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x4e, 0x75, 0x6d, 0x12, 0x3a, 0x0a, 0x08, - 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, - 0x2e, 0x70, 0x62, 0x64, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x48, 0x6f, 0x6f, 0x6b, 0x49, 0x6e, 0x66, - 0x6f, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x73, 0x52, 0x08, - 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x73, 0x1a, 0x30, 0x0a, 0x08, 0x52, 0x65, 0x6c, 0x65, - 0x61, 0x73, 0x65, 0x73, 0x12, 0x24, 0x0a, 0x0e, 0x6e, 0x6f, 0x74, 0x5f, 0x72, 0x65, 0x6c, 0x65, - 0x61, 0x73, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x6e, 0x6f, - 0x74, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x49, 0x64, 0x22, 0xc0, 0x01, 0x0a, 0x0c, 0x4c, - 0x69, 0x73, 0x74, 0x48, 0x6f, 0x6f, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, - 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, - 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x61, 0x67, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x61, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x6c, 0x6c, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x61, 0x6c, 0x6c, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, - 0x74, 0x5f, 0x74, 0x61, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x74, - 0x54, 0x61, 0x67, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, - 0x69, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, - 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x65, 0x79, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x65, 0x79, 0x22, 0x80, 0x02, - 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x48, 0x6f, 0x6f, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, - 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x62, 0x64, 0x73, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x48, 0x6f, 0x6f, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x2e, 0x44, 0x65, 0x74, 0x61, - 0x69, 0x6c, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x1a, 0xa2, 0x01, 0x0a, 0x06, - 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x20, 0x0a, 0x04, 0x68, 0x6f, 0x6f, 0x6b, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x70, 0x62, 0x68, 0x6f, 0x6f, 0x6b, 0x2e, 0x48, 0x6f, - 0x6f, 0x6b, 0x52, 0x04, 0x68, 0x6f, 0x6f, 0x6b, 0x12, 0x1b, 0x0a, 0x09, 0x62, 0x6f, 0x75, 0x6e, - 0x64, 0x5f, 0x6e, 0x75, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x62, 0x6f, 0x75, - 0x6e, 0x64, 0x4e, 0x75, 0x6d, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, - 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x32, 0x0a, 0x15, - 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x70, 0x75, 0x62, - 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, - 0x22, 0x42, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x48, 0x6f, 0x6f, 0x6b, 0x54, 0x61, 0x67, 0x52, - 0x65, 0x73, 0x70, 0x12, 0x2f, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x70, 0x62, 0x68, 0x6f, 0x6f, 0x6b, 0x2e, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x48, 0x6f, 0x6f, 0x6b, 0x54, 0x61, 0x67, 0x73, 0x52, 0x07, 0x64, 0x65, 0x74, - 0x61, 0x69, 0x6c, 0x73, 0x22, 0x91, 0x01, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x48, 0x6f, 0x6f, - 0x6b, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x12, 0x15, + 0x52, 0x06, 0x68, 0x6f, 0x6f, 0x6b, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x14, + 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, + 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x65, + 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, + 0x65, 0x79, 0x22, 0xf8, 0x02, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x48, 0x6f, 0x6f, 0x6b, 0x52, + 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x14, 0x0a, + 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x12, 0x3d, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x70, 0x62, 0x64, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x2e, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, + 0x6c, 0x73, 0x1a, 0x88, 0x02, 0x0a, 0x06, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x28, 0x0a, + 0x10, 0x68, 0x6f, 0x6f, 0x6b, 0x5f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x68, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x2c, 0x0a, 0x12, 0x68, 0x6f, 0x6f, 0x6b, 0x5f, + 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x10, 0x68, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x15, 0x0a, 0x06, 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, + 0x61, 0x70, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x61, 0x70, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x6c, 0x65, 0x61, + 0x73, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x72, 0x65, 0x6c, + 0x65, 0x61, 0x73, 0x65, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, + 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, + 0x6c, 0x65, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1e, 0x0a, + 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x22, 0x55, 0x0a, + 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x68, 0x6f, 0x6f, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x68, 0x6f, 0x6f, 0x6b, 0x49, 0x64, 0x12, 0x14, - 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, - 0x61, 0x72, 0x63, 0x68, 0x4b, 0x65, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, - 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x65, 0x79, 0x22, 0xf8, 0x02, 0x0a, 0x16, 0x4c, 0x69, 0x73, - 0x74, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x3d, 0x0a, 0x07, 0x64, 0x65, 0x74, - 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x70, 0x62, 0x64, - 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x2e, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, - 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x1a, 0x88, 0x02, 0x0a, 0x06, 0x44, 0x65, 0x74, - 0x61, 0x69, 0x6c, 0x12, 0x28, 0x0a, 0x10, 0x68, 0x6f, 0x6f, 0x6b, 0x5f, 0x72, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x68, - 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x2c, 0x0a, - 0x12, 0x68, 0x6f, 0x6f, 0x6b, 0x5f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x68, 0x6f, 0x6f, 0x6b, 0x52, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x15, 0x0a, 0x06, 0x61, - 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x61, 0x70, 0x70, - 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x70, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x70, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, - 0x0a, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x09, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, - 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, - 0x79, 0x70, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, - 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, - 0x74, 0x65, 0x64, 0x22, 0x55, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x48, 0x6f, 0x6f, - 0x6b, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x68, - 0x6f, 0x6f, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x68, 0x6f, - 0x6f, 0x6b, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x81, 0x01, 0x0a, 0x15, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x12, 0x3c, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, - 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x70, 0x62, 0x68, 0x72, 0x2e, - 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x74, 0x74, 0x61, - 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, - 0x6e, 0x74, 0x12, 0x2a, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x16, 0x2e, 0x70, 0x62, 0x68, 0x72, 0x2e, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x22, 0xb9, - 0x01, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x17, - 0x0a, 0x07, 0x68, 0x6f, 0x6f, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x06, 0x68, 0x6f, 0x6f, 0x6b, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x61, 0x72, 0x63, - 0x68, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x61, - 0x72, 0x63, 0x68, 0x4b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, - 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, - 0x69, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x6c, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x03, 0x61, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x91, 0x02, 0x0a, 0x15, 0x4c, - 0x69, 0x73, 0x74, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x4b, 0x0a, 0x07, 0x64, 0x65, - 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x70, 0x62, - 0x64, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x48, 0x6f, 0x6f, - 0x6b, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x44, 0x61, 0x74, 0x61, 0x52, 0x07, - 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x1a, 0x94, 0x01, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, - 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x44, 0x61, 0x74, - 0x61, 0x12, 0x37, 0x0a, 0x0d, 0x68, 0x6f, 0x6f, 0x6b, 0x5f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x70, 0x62, 0x68, 0x72, 0x2e, - 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x68, 0x6f, - 0x6f, 0x6b, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x62, 0x6f, - 0x75, 0x6e, 0x64, 0x5f, 0x6e, 0x75, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x62, - 0x6f, 0x75, 0x6e, 0x64, 0x4e, 0x75, 0x6d, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x72, 0x6d, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x22, 0x58, - 0x0a, 0x16, 0x47, 0x65, 0x74, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x42, 0x79, 0x49, 0x64, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, - 0x17, 0x0a, 0x07, 0x68, 0x6f, 0x6f, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x06, 0x68, 0x6f, 0x6f, 0x6b, 0x49, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x22, 0x7e, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, + 0x6f, 0x72, 0x63, 0x65, 0x22, 0x81, 0x01, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x48, + 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x12, 0x3c, + 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x70, 0x62, 0x68, 0x72, 0x2e, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2a, 0x0a, 0x04, + 0x73, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x70, 0x62, 0x68, + 0x72, 0x2e, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x70, + 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x22, 0xb9, 0x01, 0x0a, 0x14, 0x4c, 0x69, 0x73, + 0x74, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x68, 0x6f, 0x6f, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x68, 0x6f, 0x6f, 0x6b, 0x49, - 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x58, 0x0a, 0x16, 0x50, 0x75, 0x62, 0x6c, - 0x69, 0x73, 0x68, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, + 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x6b, 0x65, 0x79, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x65, 0x79, + 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x10, 0x0a, 0x03, + 0x61, 0x6c, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x61, 0x6c, 0x6c, 0x12, 0x14, + 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x22, 0x91, 0x02, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x48, 0x6f, 0x6f, + 0x6b, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x14, + 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x4b, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x70, 0x62, 0x64, 0x73, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x73, 0x44, 0x61, 0x74, 0x61, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, + 0x73, 0x1a, 0x94, 0x01, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x44, 0x61, 0x74, 0x61, 0x12, 0x37, 0x0a, 0x0d, 0x68, + 0x6f, 0x6f, 0x6b, 0x5f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x70, 0x62, 0x68, 0x72, 0x2e, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x68, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x6e, 0x75, + 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x4e, 0x75, + 0x6d, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x5f, 0x64, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x72, 0x6d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x22, 0x58, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x48, + 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x79, 0x49, 0x64, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x68, 0x6f, 0x6f, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x68, 0x6f, 0x6f, 0x6b, 0x49, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, - 0x69, 0x64, 0x22, 0x58, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x42, 0x79, 0x50, 0x75, 0x62, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x17, 0x0a, - 0x07, 0x68, 0x6f, 0x6f, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, - 0x68, 0x6f, 0x6f, 0x6b, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x91, 0x01, 0x0a, - 0x15, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3c, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, - 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x70, 0x62, 0x68, - 0x72, 0x2e, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x74, - 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, - 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2a, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x70, 0x62, 0x68, 0x72, 0x2e, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, - 0x22, 0xba, 0x01, 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, - 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x68, 0x6f, 0x6f, - 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x68, 0x6f, 0x6f, 0x6b, - 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, - 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, - 0x69, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, - 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x65, 0x79, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x65, 0x79, 0x22, 0xf6, 0x02, - 0x0a, 0x1e, 0x4c, 0x69, 0x73, 0x74, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x45, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, - 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x70, 0x62, 0x64, 0x73, 0x2e, 0x4c, - 0x69, 0x73, 0x74, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x2e, 0x44, 0x65, - 0x74, 0x61, 0x69, 0x6c, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x1a, 0xf6, 0x01, - 0x0a, 0x06, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x72, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0c, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x15, - 0x0a, 0x06, 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, - 0x61, 0x70, 0x70, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x70, 0x70, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x70, 0x70, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x49, 0x64, 0x12, - 0x21, 0x0a, 0x0c, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, - 0x61, 0x74, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, - 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x22, 0x60, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x52, 0x65, 0x6c, - 0x65, 0x61, 0x73, 0x65, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, + 0x69, 0x64, 0x22, 0x7e, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x48, 0x6f, 0x6f, 0x6b, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, - 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x6c, - 0x65, 0x61, 0x73, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x72, - 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x49, 0x64, 0x22, 0xe3, 0x02, 0x0a, 0x12, 0x47, 0x65, 0x74, - 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x12, - 0x38, 0x0a, 0x08, 0x70, 0x72, 0x65, 0x5f, 0x68, 0x6f, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1d, 0x2e, 0x70, 0x62, 0x64, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x6c, 0x65, - 0x61, 0x73, 0x65, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x2e, 0x48, 0x6f, 0x6f, 0x6b, - 0x52, 0x07, 0x70, 0x72, 0x65, 0x48, 0x6f, 0x6f, 0x6b, 0x12, 0x3a, 0x0a, 0x09, 0x70, 0x6f, 0x73, - 0x74, 0x5f, 0x68, 0x6f, 0x6f, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x70, - 0x62, 0x64, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x48, 0x6f, - 0x6f, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x2e, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x08, 0x70, 0x6f, 0x73, - 0x74, 0x48, 0x6f, 0x6f, 0x6b, 0x1a, 0xd6, 0x01, 0x0a, 0x04, 0x48, 0x6f, 0x6f, 0x6b, 0x12, 0x17, - 0x0a, 0x07, 0x68, 0x6f, 0x6f, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x06, 0x68, 0x6f, 0x6f, 0x6b, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x68, 0x6f, 0x6f, 0x6b, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x6f, 0x6b, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x68, 0x6f, 0x6f, 0x6b, 0x5f, 0x72, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, - 0x68, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x2c, - 0x0a, 0x12, 0x68, 0x6f, 0x6f, 0x6b, 0x5f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x68, 0x6f, 0x6f, 0x6b, - 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, - 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x65, 0x6d, 0x6f, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6d, 0x65, 0x6d, 0x6f, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x84, - 0x01, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, - 0x65, 0x53, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x12, 0x3d, 0x0a, 0x0a, 0x61, 0x74, 0x74, - 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, - 0x70, 0x62, 0x74, 0x73, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x70, 0x61, - 0x63, 0x65, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x61, 0x74, - 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2b, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x62, 0x74, 0x73, 0x2e, 0x54, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x70, 0x61, 0x63, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, - 0x04, 0x73, 0x70, 0x65, 0x63, 0x22, 0xb4, 0x01, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x12, - 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, - 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, - 0x65, 0x61, 0x72, 0x63, 0x68, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x73, - 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, - 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x6c, - 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x61, 0x6c, 0x6c, 0x22, 0x5d, 0x0a, 0x16, - 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x70, 0x61, 0x63, - 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2d, 0x0a, 0x07, - 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, + 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x68, 0x6f, 0x6f, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x06, 0x68, 0x6f, 0x6f, 0x6b, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x72, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x0a, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, + 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, + 0x63, 0x65, 0x22, 0x58, 0x0a, 0x16, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x48, 0x6f, 0x6f, + 0x6b, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, + 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, + 0x7a, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x68, 0x6f, 0x6f, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x68, 0x6f, 0x6f, 0x6b, 0x49, 0x64, 0x12, 0x0e, 0x0a, 0x02, + 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x22, 0x58, 0x0a, 0x10, + 0x47, 0x65, 0x74, 0x42, 0x79, 0x50, 0x75, 0x62, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x68, 0x6f, 0x6f, 0x6b, 0x5f, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x68, 0x6f, 0x6f, 0x6b, 0x49, 0x64, + 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x91, 0x01, 0x0a, 0x15, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, + 0x12, 0x3c, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x70, 0x62, 0x68, 0x72, 0x2e, 0x48, 0x6f, 0x6f, 0x6b, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2a, + 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x70, + 0x62, 0x68, 0x72, 0x2e, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x22, 0xba, 0x01, 0x0a, 0x1d, 0x4c, + 0x69, 0x73, 0x74, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, + 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, + 0x7a, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x68, 0x6f, 0x6f, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x68, 0x6f, 0x6f, 0x6b, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, + 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x0a, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x14, 0x0a, + 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x61, + 0x72, 0x63, 0x68, 0x4b, 0x65, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, + 0x61, 0x72, 0x63, 0x68, 0x4b, 0x65, 0x79, 0x22, 0xf6, 0x02, 0x0a, 0x1e, 0x4c, 0x69, 0x73, 0x74, + 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x12, 0x45, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x2b, 0x2e, 0x70, 0x62, 0x64, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x48, 0x6f, 0x6f, + 0x6b, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x2e, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x07, + 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x1a, 0xf6, 0x01, 0x0a, 0x06, 0x44, 0x65, 0x74, 0x61, + 0x69, 0x6c, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x15, 0x0a, 0x06, 0x61, 0x70, 0x70, 0x5f, + 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x12, + 0x19, 0x0a, 0x08, 0x61, 0x70, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x61, 0x70, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, + 0x6c, 0x65, 0x61, 0x73, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, + 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x65, 0x6c, + 0x65, 0x61, 0x73, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, + 0x74, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, + 0x22, 0x60, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x48, 0x6f, + 0x6f, 0x6b, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, + 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x61, 0x70, + 0x70, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x5f, 0x69, + 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, + 0x49, 0x64, 0x22, 0xe3, 0x02, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, + 0x65, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x12, 0x38, 0x0a, 0x08, 0x70, 0x72, 0x65, + 0x5f, 0x68, 0x6f, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x70, 0x62, + 0x64, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x48, 0x6f, 0x6f, + 0x6b, 0x52, 0x65, 0x73, 0x70, 0x2e, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x07, 0x70, 0x72, 0x65, 0x48, + 0x6f, 0x6f, 0x6b, 0x12, 0x3a, 0x0a, 0x09, 0x70, 0x6f, 0x73, 0x74, 0x5f, 0x68, 0x6f, 0x6f, 0x6b, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x70, 0x62, 0x64, 0x73, 0x2e, 0x47, 0x65, + 0x74, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x73, 0x70, + 0x2e, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x74, 0x48, 0x6f, 0x6f, 0x6b, 0x1a, + 0xd6, 0x01, 0x0a, 0x04, 0x48, 0x6f, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x68, 0x6f, 0x6f, 0x6b, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x68, 0x6f, 0x6f, 0x6b, 0x49, + 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x68, 0x6f, 0x6f, 0x6b, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x6f, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x28, + 0x0a, 0x10, 0x68, 0x6f, 0x6f, 0x6b, 0x5f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x5f, + 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x68, 0x6f, 0x6f, 0x6b, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x2c, 0x0a, 0x12, 0x68, 0x6f, 0x6f, 0x6b, + 0x5f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x68, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x65, + 0x6d, 0x6f, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6d, 0x65, 0x6d, 0x6f, 0x12, 0x18, + 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x84, 0x01, 0x0a, 0x16, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x70, 0x61, 0x63, 0x65, + 0x52, 0x65, 0x71, 0x12, 0x3d, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x70, 0x62, 0x74, 0x73, 0x2e, 0x54, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x70, 0x61, 0x63, 0x65, 0x41, 0x74, 0x74, 0x61, + 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, + 0x6e, 0x74, 0x12, 0x2b, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x17, 0x2e, 0x70, 0x62, 0x74, 0x73, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x53, 0x70, 0x61, 0x63, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x22, + 0xb4, 0x01, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x53, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, + 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, + 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x46, + 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x61, + 0x72, 0x63, 0x68, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x14, + 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, + 0x69, 0x6d, 0x69, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x6c, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x03, 0x61, 0x6c, 0x6c, 0x22, 0x5d, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2d, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x62, 0x74, 0x73, 0x2e, 0x54, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x70, 0x61, 0x63, 0x65, 0x52, 0x07, 0x64, 0x65, + 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x94, 0x01, 0x0a, 0x16, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, + 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, + 0x12, 0x3d, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x70, 0x62, 0x74, 0x73, 0x2e, 0x54, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x53, 0x70, 0x61, 0x63, 0x65, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x12, + 0x2b, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x62, 0x74, 0x73, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x70, 0x61, - 0x63, 0x65, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x94, 0x01, 0x0a, 0x16, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x70, + 0x63, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x22, 0x67, 0x0a, 0x16, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3d, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x70, 0x62, 0x74, 0x73, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x70, 0x61, 0x63, 0x65, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, - 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2b, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x62, 0x74, 0x73, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x53, 0x70, 0x61, 0x63, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, - 0x65, 0x63, 0x22, 0x67, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x53, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3d, 0x0a, 0x0a, - 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1d, 0x2e, 0x70, 0x62, 0x74, 0x73, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, - 0x53, 0x70, 0x61, 0x63, 0x65, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x35, 0x0a, 0x1a, 0x47, - 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x42, 0x69, 0x7a, 0x73, 0x4f, 0x66, 0x54, 0x6d, 0x70, 0x6c, 0x53, - 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x17, 0x0a, 0x07, 0x62, 0x69, 0x7a, - 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x06, 0x62, 0x69, 0x7a, 0x49, - 0x64, 0x73, 0x22, 0x32, 0x0a, 0x19, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x54, 0x6d, 0x70, 0x6c, 0x53, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x12, - 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x22, 0x2a, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6d, - 0x70, 0x6c, 0x53, 0x70, 0x61, 0x63, 0x65, 0x73, 0x42, 0x79, 0x49, 0x44, 0x73, 0x52, 0x65, 0x71, - 0x12, 0x10, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x03, 0x69, - 0x64, 0x73, 0x22, 0x48, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6d, 0x70, 0x6c, 0x53, 0x70, - 0x61, 0x63, 0x65, 0x73, 0x42, 0x79, 0x49, 0x44, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x2d, 0x0a, - 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, - 0x2e, 0x70, 0x62, 0x74, 0x73, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x70, - 0x61, 0x63, 0x65, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0xe0, 0x01, 0x0a, - 0x11, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x71, 0x12, 0x3e, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x70, 0x62, 0x74, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x41, 0x74, 0x74, 0x61, - 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, - 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x18, 0x2e, 0x70, 0x62, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x2e, 0x54, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, - 0x12, 0x33, 0x0a, 0x07, 0x74, 0x72, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x62, 0x74, 0x72, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x52, 0x06, 0x74, - 0x72, 0x53, 0x70, 0x65, 0x63, 0x12, 0x28, 0x0a, 0x10, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, - 0x65, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0d, 0x52, - 0x0e, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x65, 0x74, 0x49, 0x64, 0x73, 0x22, - 0xed, 0x01, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, - 0x73, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x74, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, - 0x53, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x65, 0x61, 0x72, 0x63, - 0x68, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, - 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x21, 0x0a, 0x0c, - 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, - 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, - 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x69, - 0x64, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x69, 0x64, 0x73, 0x12, 0x10, 0x0a, - 0x03, 0x61, 0x6c, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x61, 0x6c, 0x6c, 0x22, - 0x59, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x07, 0x64, 0x65, - 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x70, 0x62, - 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, - 0x65, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x91, 0x01, 0x0a, 0x11, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, - 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, + 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x35, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x42, + 0x69, 0x7a, 0x73, 0x4f, 0x66, 0x54, 0x6d, 0x70, 0x6c, 0x53, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x12, 0x17, 0x0a, 0x07, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0d, 0x52, 0x06, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x73, 0x22, 0x32, 0x0a, 0x19, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x54, 0x6d, 0x70, + 0x6c, 0x53, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, + 0x22, 0x2a, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6d, 0x70, 0x6c, 0x53, 0x70, 0x61, 0x63, + 0x65, 0x73, 0x42, 0x79, 0x49, 0x44, 0x73, 0x52, 0x65, 0x71, 0x12, 0x10, 0x0a, 0x03, 0x69, 0x64, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x03, 0x69, 0x64, 0x73, 0x22, 0x48, 0x0a, 0x17, + 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6d, 0x70, 0x6c, 0x53, 0x70, 0x61, 0x63, 0x65, 0x73, 0x42, 0x79, + 0x49, 0x44, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x2d, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, + 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x62, 0x74, 0x73, 0x2e, + 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x70, 0x61, 0x63, 0x65, 0x52, 0x07, 0x64, + 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0xe0, 0x01, 0x0a, 0x11, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x3e, 0x0a, 0x0a, + 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1e, 0x2e, 0x70, 0x62, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x2e, 0x54, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x04, + 0x73, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x70, 0x62, 0x74, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x12, 0x33, 0x0a, 0x07, 0x74, 0x72, + 0x5f, 0x73, 0x70, 0x65, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x62, + 0x74, 0x72, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x52, 0x06, 0x74, 0x72, 0x53, 0x70, 0x65, 0x63, 0x12, + 0x28, 0x0a, 0x10, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x65, 0x74, 0x5f, + 0x69, 0x64, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x0e, 0x74, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x53, 0x65, 0x74, 0x49, 0x64, 0x73, 0x22, 0xed, 0x01, 0x0a, 0x10, 0x4c, 0x69, + 0x73, 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x12, 0x15, + 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, + 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x5f, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x0f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x70, 0x61, 0x63, 0x65, 0x49, + 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x66, 0x69, 0x65, 0x6c, + 0x64, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, + 0x61, 0x72, 0x63, 0x68, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, + 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x69, 0x64, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x6c, 0x6c, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x61, 0x6c, 0x6c, 0x22, 0x59, 0x0a, 0x11, 0x4c, 0x69, 0x73, + 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x14, + 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x70, 0x62, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x07, 0x64, 0x65, 0x74, + 0x61, 0x69, 0x6c, 0x73, 0x22, 0x91, 0x01, 0x0a, 0x11, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3e, 0x0a, 0x0a, 0x61, 0x74, + 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, + 0x2e, 0x70, 0x62, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x2e, 0x54, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, + 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x04, 0x73, 0x70, + 0x65, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x70, 0x62, 0x74, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x70, + 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x22, 0x79, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3e, 0x0a, + 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1e, 0x2e, 0x70, 0x62, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x2e, 0x54, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x14, 0x0a, + 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, + 0x72, 0x63, 0x65, 0x22, 0x80, 0x01, 0x0a, 0x16, 0x42, 0x61, 0x74, 0x63, 0x68, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x10, + 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x03, 0x69, 0x64, 0x73, 0x12, 0x3e, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x70, 0x62, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, - 0x12, 0x2c, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, + 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0xa7, 0x01, 0x0a, 0x15, 0x41, 0x64, 0x64, 0x54, 0x6d, + 0x70, 0x6c, 0x73, 0x54, 0x6f, 0x54, 0x6d, 0x70, 0x6c, 0x53, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, + 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x74, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x5f, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x0f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x70, 0x61, 0x63, + 0x65, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, + 0x69, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x0b, 0x74, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x49, 0x64, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0d, + 0x52, 0x0e, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x65, 0x74, 0x49, 0x64, 0x73, + 0x22, 0xac, 0x01, 0x0a, 0x1a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x6d, 0x70, 0x6c, 0x73, + 0x46, 0x72, 0x6f, 0x6d, 0x54, 0x6d, 0x70, 0x6c, 0x53, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x12, + 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x5f, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x0f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x70, 0x61, 0x63, 0x65, + 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x69, + 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x0b, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x49, 0x64, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0d, 0x52, + 0x0e, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x65, 0x74, 0x49, 0x64, 0x73, 0x22, + 0x29, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, + 0x42, 0x79, 0x49, 0x44, 0x73, 0x52, 0x65, 0x71, 0x12, 0x10, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x03, 0x69, 0x64, 0x73, 0x22, 0x48, 0x0a, 0x16, 0x4c, 0x69, + 0x73, 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x42, 0x79, 0x49, 0x44, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x12, 0x2e, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x70, 0x62, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x07, 0x64, 0x65, 0x74, + 0x61, 0x69, 0x6c, 0x73, 0x22, 0xe3, 0x01, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x4e, 0x6f, 0x74, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, + 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x74, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x70, 0x61, + 0x63, 0x65, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x66, + 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x65, 0x61, + 0x72, 0x63, 0x68, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x61, + 0x72, 0x63, 0x68, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x6c, 0x6c, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x61, 0x6c, 0x6c, 0x22, 0x61, 0x0a, 0x19, 0x4c, 0x69, + 0x73, 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x4e, 0x6f, 0x74, 0x42, 0x6f, + 0x75, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2e, 0x0a, + 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x70, 0x62, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x2e, 0x54, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x22, 0x79, - 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, - 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x02, 0x69, 0x64, 0x12, 0x3e, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, - 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x70, 0x62, 0x74, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x41, 0x74, 0x74, - 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, - 0x65, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x80, 0x01, 0x0a, 0x16, 0x42, 0x61, - 0x74, 0x63, 0x68, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x71, 0x12, 0x10, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0d, 0x52, 0x03, 0x69, 0x64, 0x73, 0x12, 0x3e, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, - 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x70, 0x62, 0x74, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, - 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x61, - 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0xa7, 0x01, 0x0a, - 0x15, 0x41, 0x64, 0x64, 0x54, 0x6d, 0x70, 0x6c, 0x73, 0x54, 0x6f, 0x54, 0x6d, 0x70, 0x6c, 0x53, - 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x2a, 0x0a, - 0x11, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, - 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x53, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0d, 0x52, - 0x0b, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x64, 0x73, 0x12, 0x28, 0x0a, 0x10, - 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x73, - 0x18, 0x04, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x0e, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, - 0x53, 0x65, 0x74, 0x49, 0x64, 0x73, 0x22, 0xac, 0x01, 0x0a, 0x1a, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x54, 0x6d, 0x70, 0x6c, 0x73, 0x46, 0x72, 0x6f, 0x6d, 0x54, 0x6d, 0x70, 0x6c, 0x53, 0x65, - 0x74, 0x73, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x11, - 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, - 0x65, 0x53, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x0b, - 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x64, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x74, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x73, 0x18, - 0x04, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x0e, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, - 0x65, 0x74, 0x49, 0x64, 0x73, 0x22, 0x29, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x42, 0x79, 0x49, 0x44, 0x73, 0x52, 0x65, 0x71, 0x12, 0x10, - 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x03, 0x69, 0x64, 0x73, - 0x22, 0x48, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, - 0x73, 0x42, 0x79, 0x49, 0x44, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x2e, 0x0a, 0x07, 0x64, 0x65, - 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x70, 0x62, - 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, - 0x65, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0xe3, 0x01, 0x0a, 0x18, 0x4c, - 0x69, 0x73, 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x4e, 0x6f, 0x74, 0x42, - 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, + 0x6c, 0x61, 0x74, 0x65, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x9a, 0x02, + 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6d, 0x70, 0x6c, 0x73, 0x4f, 0x66, 0x54, 0x6d, 0x70, + 0x6c, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x74, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x53, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x65, - 0x61, 0x72, 0x63, 0x68, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0c, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, - 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, - 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x10, - 0x0a, 0x03, 0x61, 0x6c, 0x6c, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x61, 0x6c, 0x6c, - 0x22, 0x61, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, - 0x73, 0x4e, 0x6f, 0x74, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x12, 0x14, 0x0a, - 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x70, 0x62, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, - 0x65, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, - 0x69, 0x6c, 0x73, 0x22, 0x9a, 0x02, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6d, 0x70, 0x6c, - 0x73, 0x4f, 0x66, 0x54, 0x6d, 0x70, 0x6c, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, - 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, - 0x69, 0x7a, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, - 0x5f, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x0f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, - 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x65, 0x74, - 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x74, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x53, 0x65, 0x74, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x65, 0x61, 0x72, - 0x63, 0x68, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0c, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x21, 0x0a, - 0x0c, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x10, 0x0a, 0x03, - 0x69, 0x64, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x69, 0x64, 0x73, 0x12, 0x10, - 0x0a, 0x03, 0x61, 0x6c, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x61, 0x6c, 0x6c, - 0x22, 0x5e, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6d, 0x70, 0x6c, 0x73, 0x4f, 0x66, 0x54, - 0x6d, 0x70, 0x6c, 0x53, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x12, 0x2e, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x14, 0x2e, 0x70, 0x62, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x2e, 0x54, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, - 0x22, 0xc4, 0x01, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, - 0x65, 0x42, 0x79, 0x54, 0x75, 0x70, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x12, 0x37, 0x0a, 0x05, 0x69, - 0x74, 0x65, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70, 0x62, 0x64, - 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x42, 0x79, - 0x54, 0x75, 0x70, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x05, 0x69, - 0x74, 0x65, 0x6d, 0x73, 0x1a, 0x71, 0x0a, 0x04, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x15, 0x0a, 0x06, - 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, - 0x7a, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, - 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x22, 0xd8, 0x01, 0x0a, 0x1a, 0x4c, 0x69, 0x73, 0x74, - 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x42, 0x79, 0x54, 0x75, 0x70, 0x6c, 0x65, 0x52, - 0x65, 0x71, 0x52, 0x65, 0x73, 0x70, 0x12, 0x3b, 0x0a, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x70, 0x62, 0x64, 0x73, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x42, 0x79, 0x54, 0x75, 0x70, 0x6c, 0x65, - 0x52, 0x65, 0x71, 0x52, 0x65, 0x73, 0x70, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x05, 0x69, 0x74, - 0x65, 0x6d, 0x73, 0x1a, 0x7d, 0x0a, 0x04, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x30, 0x0a, 0x08, 0x74, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, - 0x70, 0x62, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x43, 0x0a, - 0x11, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x70, 0x62, 0x74, 0x72, 0x2e, - 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x52, 0x10, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x22, 0xd2, 0x01, 0x0a, 0x17, 0x42, 0x61, 0x74, 0x63, 0x68, 0x55, 0x70, 0x73, 0x65, - 0x72, 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x12, 0x38, - 0x0a, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, - 0x70, 0x62, 0x64, 0x73, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, - 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x2e, 0x49, 0x74, 0x65, - 0x6d, 0x52, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x1a, 0x7d, 0x0a, 0x04, 0x49, 0x74, 0x65, 0x6d, - 0x12, 0x30, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x70, 0x62, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x2e, - 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x12, 0x43, 0x0a, 0x11, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x72, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, - 0x70, 0x62, 0x74, 0x72, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x2f, 0x0a, 0x1b, 0x42, 0x61, 0x74, 0x63, 0x68, - 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, - 0x65, 0x71, 0x52, 0x65, 0x73, 0x70, 0x12, 0x10, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0d, 0x52, 0x03, 0x69, 0x64, 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x19, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x12, 0x40, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, - 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x70, 0x62, 0x74, - 0x72, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x61, 0x74, - 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x62, 0x74, 0x72, 0x2e, 0x54, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x70, - 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x22, 0x84, 0x02, 0x0a, 0x18, 0x4c, 0x69, 0x73, - 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x73, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x11, - 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, - 0x65, 0x53, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x74, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x65, 0x61, - 0x72, 0x63, 0x68, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0c, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x21, - 0x0a, 0x0c, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x10, 0x0a, - 0x03, 0x61, 0x6c, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x61, 0x6c, 0x6c, 0x22, - 0x63, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x14, 0x0a, 0x05, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x70, 0x62, 0x74, 0x72, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x64, 0x65, 0x74, - 0x61, 0x69, 0x6c, 0x73, 0x22, 0x6d, 0x0a, 0x19, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x40, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x70, 0x62, 0x74, 0x72, 0x2e, 0x54, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x74, 0x74, - 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, - 0x65, 0x6e, 0x74, 0x22, 0x31, 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x79, 0x49, 0x44, - 0x73, 0x52, 0x65, 0x71, 0x12, 0x10, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0d, 0x52, 0x03, 0x69, 0x64, 0x73, 0x22, 0x52, 0x0a, 0x1e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x42, - 0x79, 0x49, 0x44, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x30, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, - 0x69, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x70, 0x62, 0x74, 0x72, - 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x5d, 0x0a, 0x21, 0x4c, 0x69, - 0x73, 0x74, 0x54, 0x6d, 0x70, 0x6c, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x4e, 0x61, - 0x6d, 0x65, 0x73, 0x42, 0x79, 0x54, 0x6d, 0x70, 0x6c, 0x49, 0x44, 0x73, 0x52, 0x65, 0x71, 0x12, - 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x0b, 0x74, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x64, 0x73, 0x22, 0x61, 0x0a, 0x22, 0x4c, 0x69, 0x73, - 0x74, 0x54, 0x6d, 0x70, 0x6c, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, - 0x65, 0x73, 0x42, 0x79, 0x54, 0x6d, 0x70, 0x6c, 0x49, 0x44, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, - 0x3b, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x21, 0x2e, 0x70, 0x62, 0x74, 0x72, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, - 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x44, 0x65, 0x74, - 0x61, 0x69, 0x6c, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x82, 0x01, 0x0a, - 0x14, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, - 0x65, 0x74, 0x52, 0x65, 0x71, 0x12, 0x3d, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, - 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x70, 0x62, 0x74, 0x73, - 0x65, 0x74, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x65, 0x74, 0x41, 0x74, - 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, - 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2b, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x62, 0x74, 0x73, 0x65, 0x74, 0x2e, 0x54, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x53, 0x65, 0x74, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, - 0x63, 0x22, 0xde, 0x01, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x53, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, - 0x12, 0x2a, 0x0a, 0x11, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x74, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, - 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x46, 0x69, 0x65, 0x6c, 0x64, - 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, - 0x6d, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, - 0x12, 0x10, 0x0a, 0x03, 0x61, 0x6c, 0x6c, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x61, - 0x6c, 0x6c, 0x22, 0x5b, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x53, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x12, 0x2d, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x62, 0x74, 0x73, 0x65, 0x74, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x53, 0x65, 0x74, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, - 0xa8, 0x01, 0x0a, 0x14, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3d, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x61, - 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x70, - 0x62, 0x74, 0x73, 0x65, 0x74, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x65, - 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x61, 0x74, 0x74, - 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2b, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x62, 0x74, 0x73, 0x65, 0x74, 0x2e, 0x54, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x65, 0x74, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, - 0x73, 0x70, 0x65, 0x63, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x7b, 0x0a, 0x14, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x65, 0x74, 0x52, - 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, - 0x69, 0x64, 0x12, 0x3d, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x70, 0x62, 0x74, 0x73, 0x65, 0x74, 0x2e, - 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x65, 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, - 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, - 0x74, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x46, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x41, - 0x70, 0x70, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x65, 0x74, 0x73, 0x52, 0x65, - 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x61, 0x70, 0x70, 0x5f, - 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x22, - 0x48, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x70, 0x70, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x53, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x2d, 0x0a, 0x07, 0x64, 0x65, - 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x62, - 0x74, 0x73, 0x65, 0x74, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x65, 0x74, - 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x2c, 0x0a, 0x18, 0x4c, 0x69, 0x73, - 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x65, 0x74, 0x73, 0x42, 0x79, 0x49, - 0x44, 0x73, 0x52, 0x65, 0x71, 0x12, 0x10, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0d, 0x52, 0x03, 0x69, 0x64, 0x73, 0x22, 0x4a, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x54, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x65, 0x74, 0x73, 0x42, 0x79, 0x49, 0x44, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x12, 0x2d, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x62, 0x74, 0x73, 0x65, 0x74, 0x2e, 0x54, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x65, 0x74, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, - 0x69, 0x6c, 0x73, 0x22, 0x34, 0x0a, 0x20, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x53, 0x65, 0x74, 0x42, 0x72, 0x69, 0x65, 0x66, 0x49, 0x6e, 0x66, 0x6f, 0x42, - 0x79, 0x49, 0x44, 0x73, 0x52, 0x65, 0x71, 0x12, 0x10, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0d, 0x52, 0x03, 0x69, 0x64, 0x73, 0x22, 0x5b, 0x0a, 0x21, 0x4c, 0x69, 0x73, - 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x65, 0x74, 0x42, 0x72, 0x69, 0x65, - 0x66, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x79, 0x49, 0x44, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x36, - 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x1c, 0x2e, 0x70, 0x62, 0x74, 0x73, 0x65, 0x74, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, - 0x65, 0x53, 0x65, 0x74, 0x42, 0x72, 0x69, 0x65, 0x66, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x64, - 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x44, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6d, - 0x70, 0x6c, 0x53, 0x65, 0x74, 0x73, 0x4f, 0x66, 0x42, 0x69, 0x7a, 0x52, 0x65, 0x71, 0x12, 0x15, - 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, - 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x22, 0x51, 0x0a, 0x15, - 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6d, 0x70, 0x6c, 0x53, 0x65, 0x74, 0x73, 0x4f, 0x66, 0x42, 0x69, - 0x7a, 0x52, 0x65, 0x73, 0x70, 0x12, 0x38, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x70, 0x62, 0x74, 0x73, 0x65, 0x74, 0x2e, - 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x65, 0x74, 0x4f, 0x66, 0x42, 0x69, 0x7a, - 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, - 0x95, 0x01, 0x0a, 0x1b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x70, 0x70, 0x54, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x12, - 0x43, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x70, 0x62, 0x61, 0x74, 0x62, 0x2e, 0x41, 0x70, 0x70, 0x54, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x41, 0x74, - 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, - 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x31, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x70, 0x62, 0x61, 0x74, 0x62, 0x2e, 0x41, 0x70, 0x70, 0x54, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x70, 0x65, - 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x22, 0x88, 0x01, 0x0a, 0x1a, 0x4c, 0x69, 0x73, 0x74, - 0x41, 0x70, 0x70, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, - 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x15, 0x0a, - 0x06, 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x61, - 0x70, 0x70, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, - 0x6d, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, - 0x12, 0x10, 0x0a, 0x03, 0x61, 0x6c, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x61, - 0x6c, 0x6c, 0x22, 0x68, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x70, 0x70, 0x54, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x33, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, - 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x62, 0x61, 0x74, 0x62, - 0x2e, 0x41, 0x70, 0x70, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x42, 0x69, 0x6e, 0x64, - 0x69, 0x6e, 0x67, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0xa5, 0x01, 0x0a, - 0x1b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x70, 0x70, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x43, 0x0a, 0x0a, - 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x23, 0x2e, 0x70, 0x62, 0x61, 0x74, 0x62, 0x2e, 0x41, 0x70, 0x70, 0x54, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x41, 0x74, 0x74, 0x61, 0x63, - 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, - 0x74, 0x12, 0x31, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1d, 0x2e, 0x70, 0x62, 0x61, 0x74, 0x62, 0x2e, 0x41, 0x70, 0x70, 0x54, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, - 0x73, 0x70, 0x65, 0x63, 0x22, 0x72, 0x0a, 0x1b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x70, - 0x70, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, - 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x02, 0x69, 0x64, 0x12, 0x43, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, - 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x70, 0x62, 0x61, 0x74, 0x62, 0x2e, - 0x41, 0x70, 0x70, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, - 0x6e, 0x67, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x61, 0x74, - 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0xf3, 0x01, 0x0a, 0x1c, 0x4c, 0x69, 0x73, - 0x74, 0x41, 0x70, 0x70, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x6d, 0x70, 0x6c, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, - 0x12, 0x15, 0x0a, 0x06, 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x65, 0x61, 0x72, 0x63, - 0x68, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, - 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x21, 0x0a, 0x0c, - 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, - 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, - 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x61, - 0x6c, 0x6c, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x61, 0x6c, 0x6c, 0x12, 0x1f, 0x0a, - 0x0b, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0a, 0x77, 0x69, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x6c, - 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x70, 0x70, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x6d, - 0x70, 0x6c, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, - 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x35, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x70, 0x62, 0x61, 0x74, 0x62, 0x2e, 0x41, - 0x70, 0x70, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x6d, 0x70, 0x6c, 0x52, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0xf9, 0x01, 0x0a, - 0x24, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x41, 0x70, 0x70, - 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x6d, 0x70, 0x6c, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x73, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, - 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x61, 0x70, - 0x70, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x5f, 0x69, - 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, + 0x61, 0x74, 0x65, 0x53, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x65, 0x74, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x61, 0x72, 0x63, @@ -15921,181 +15750,68 @@ var file_data_service_proto_rawDesc = []byte{ 0x65, 0x61, 0x72, 0x63, 0x68, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x6c, 0x6c, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x03, 0x61, 0x6c, 0x6c, 0x22, 0x7c, 0x0a, 0x25, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x41, 0x70, 0x70, 0x42, 0x6f, 0x75, 0x6e, 0x64, - 0x54, 0x6d, 0x70, 0x6c, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x3d, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, - 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x70, 0x62, 0x61, 0x74, 0x62, - 0x2e, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x41, 0x70, 0x70, 0x42, 0x6f, 0x75, 0x6e, - 0x64, 0x54, 0x6d, 0x70, 0x6c, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x64, - 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0xa3, 0x01, 0x0a, 0x22, 0x47, 0x65, 0x74, 0x52, 0x65, - 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x41, 0x70, 0x70, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x6d, - 0x70, 0x6c, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, - 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, - 0x69, 0x7a, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x72, - 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x09, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x14, 0x74, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x5f, - 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x62, 0x0a, 0x23, - 0x47, 0x65, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x41, 0x70, 0x70, 0x42, 0x6f, - 0x75, 0x6e, 0x64, 0x54, 0x6d, 0x70, 0x6c, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x73, 0x70, 0x12, 0x3b, 0x0a, 0x06, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x70, 0x62, 0x61, 0x74, 0x62, 0x2e, 0x52, 0x65, 0x6c, 0x65, - 0x61, 0x73, 0x65, 0x64, 0x41, 0x70, 0x70, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x6d, 0x70, 0x6c, - 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, - 0x22, 0x94, 0x01, 0x0a, 0x1a, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x41, 0x70, 0x70, 0x54, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x12, - 0x43, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x70, 0x62, 0x61, 0x74, 0x62, 0x2e, 0x41, 0x70, 0x70, 0x54, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x41, 0x74, - 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, - 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x31, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x70, 0x62, 0x61, 0x74, 0x62, 0x2e, 0x41, 0x70, 0x70, 0x54, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x70, 0x65, - 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x22, 0x48, 0x0a, 0x1b, 0x43, 0x68, 0x65, 0x63, 0x6b, - 0x41, 0x70, 0x70, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, - 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x12, 0x29, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x70, 0x62, 0x61, 0x74, 0x62, 0x2e, - 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, - 0x73, 0x22, 0x4a, 0x0a, 0x1a, 0x45, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x41, 0x70, 0x70, 0x54, - 0x6d, 0x70, 0x6c, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x12, - 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x22, 0x37, 0x0a, - 0x1b, 0x45, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x41, 0x70, 0x70, 0x54, 0x6d, 0x70, 0x6c, 0x56, - 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x18, 0x0a, 0x07, - 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x64, - 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x49, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x41, 0x70, 0x70, - 0x54, 0x6d, 0x70, 0x6c, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x66, 0x73, - 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x61, 0x70, - 0x70, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, - 0x64, 0x22, 0x5b, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x41, 0x70, 0x70, 0x54, 0x6d, 0x70, 0x6c, 0x56, - 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x66, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, - 0x3d, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x23, 0x2e, 0x70, 0x62, 0x61, 0x74, 0x76, 0x2e, 0x41, 0x70, 0x70, 0x54, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x70, - 0x0a, 0x21, 0x47, 0x65, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x41, 0x70, 0x70, - 0x54, 0x6d, 0x70, 0x6c, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x66, 0x73, - 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x61, 0x70, - 0x70, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, - 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x5f, 0x69, 0x64, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x49, 0x64, - 0x22, 0x63, 0x0a, 0x22, 0x47, 0x65, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x41, - 0x70, 0x70, 0x54, 0x6d, 0x70, 0x6c, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, - 0x66, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x3d, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x70, 0x62, 0x61, 0x74, 0x76, 0x2e, - 0x41, 0x70, 0x70, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, - 0x62, 0x6c, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x07, 0x64, 0x65, - 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x95, 0x01, 0x0a, 0x19, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x41, 0x70, 0x70, 0x54, 0x6d, 0x70, 0x6c, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, - 0x52, 0x65, 0x71, 0x12, 0x44, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x70, 0x62, 0x61, 0x74, 0x76, 0x2e, - 0x41, 0x70, 0x70, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, - 0x62, 0x6c, 0x65, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x61, - 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x32, 0x0a, 0x04, 0x73, 0x70, 0x65, - 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x70, 0x62, 0x61, 0x74, 0x76, 0x2e, - 0x41, 0x70, 0x70, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, - 0x62, 0x6c, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x22, 0x47, 0x0a, - 0x17, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x70, 0x70, 0x54, 0x6d, 0x70, 0x6c, 0x56, 0x61, 0x72, 0x69, - 0x61, 0x62, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, - 0x15, 0x0a, 0x06, 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x22, 0x50, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x70, - 0x70, 0x54, 0x6d, 0x70, 0x6c, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x12, 0x34, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x62, 0x74, 0x76, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, - 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x6e, 0x0a, 0x1f, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x41, 0x70, 0x70, 0x54, 0x6d, 0x70, 0x6c, 0x56, - 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, - 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, - 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x6c, - 0x65, 0x61, 0x73, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x72, - 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x49, 0x64, 0x22, 0x58, 0x0a, 0x20, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x41, 0x70, 0x70, 0x54, 0x6d, 0x70, 0x6c, 0x56, - 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x34, 0x0a, 0x07, - 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x70, 0x62, 0x74, 0x76, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, - 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, - 0x6c, 0x73, 0x22, 0x7e, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6d, 0x70, 0x6c, 0x42, 0x6f, - 0x75, 0x6e, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, - 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, - 0x7a, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, - 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, - 0x21, 0x0a, 0x0c, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x64, 0x73, 0x18, - 0x03, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x0b, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, - 0x64, 0x73, 0x22, 0x4f, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6d, 0x70, 0x6c, 0x42, 0x6f, - 0x75, 0x6e, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x34, 0x0a, - 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x70, 0x62, 0x74, 0x62, 0x72, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x42, - 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, - 0x69, 0x6c, 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x1e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6d, 0x70, 0x6c, - 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x6f, 0x75, - 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, + 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x69, 0x64, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x6c, 0x6c, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x61, 0x6c, 0x6c, 0x22, 0x5e, 0x0a, 0x16, 0x4c, 0x69, + 0x73, 0x74, 0x54, 0x6d, 0x70, 0x6c, 0x73, 0x4f, 0x66, 0x54, 0x6d, 0x70, 0x6c, 0x53, 0x65, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x07, 0x64, 0x65, + 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x70, 0x62, + 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0xc4, 0x01, 0x0a, 0x16, 0x4c, + 0x69, 0x73, 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x42, 0x79, 0x54, 0x75, 0x70, + 0x6c, 0x65, 0x52, 0x65, 0x71, 0x12, 0x37, 0x0a, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70, 0x62, 0x64, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x42, 0x79, 0x54, 0x75, 0x70, 0x6c, 0x65, 0x52, + 0x65, 0x71, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x1a, 0x71, + 0x0a, 0x04, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x53, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, - 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x64, 0x12, 0x32, 0x0a, 0x15, 0x74, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x5f, - 0x69, 0x64, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x13, 0x74, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x22, 0x5f, - 0x0a, 0x1f, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6d, 0x70, 0x6c, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x12, 0x3c, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x62, 0x74, 0x62, 0x72, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x6f, 0x75, 0x6e, 0x64, - 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, - 0x88, 0x01, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6d, 0x70, 0x6c, 0x53, 0x65, 0x74, 0x42, - 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, - 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, - 0x69, 0x7a, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, - 0x5f, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x0f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, - 0x12, 0x28, 0x0a, 0x10, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x65, 0x74, - 0x5f, 0x69, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x0e, 0x74, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x53, 0x65, 0x74, 0x49, 0x64, 0x73, 0x22, 0x55, 0x0a, 0x1a, 0x4c, 0x69, - 0x73, 0x74, 0x54, 0x6d, 0x70, 0x6c, 0x53, 0x65, 0x74, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x37, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, - 0x69, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x70, 0x62, 0x74, 0x62, - 0x72, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x65, 0x74, 0x42, 0x6f, 0x75, - 0x6e, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, - 0x73, 0x22, 0x87, 0x02, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6d, 0x70, 0x6c, 0x42, 0x6f, - 0x75, 0x6e, 0x64, 0x55, 0x6e, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x41, 0x70, 0x70, 0x73, 0x52, 0x65, - 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x74, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x70, 0x61, - 0x63, 0x65, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, - 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x74, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, - 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x65, - 0x61, 0x72, 0x63, 0x68, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, - 0x61, 0x72, 0x63, 0x68, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, - 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x6c, 0x6c, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x61, 0x6c, 0x6c, 0x22, 0x74, 0x0a, 0x1c, 0x4c, - 0x69, 0x73, 0x74, 0x54, 0x6d, 0x70, 0x6c, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x55, 0x6e, 0x6e, 0x61, - 0x6d, 0x65, 0x64, 0x41, 0x70, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x12, 0x3e, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x70, 0x62, 0x74, 0x62, 0x72, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x55, 0x6e, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x41, - 0x70, 0x70, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, - 0x73, 0x22, 0x85, 0x02, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6d, 0x70, 0x6c, 0x42, 0x6f, - 0x75, 0x6e, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x41, 0x70, 0x70, 0x73, 0x52, 0x65, 0x71, 0x12, + 0x74, 0x65, 0x53, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, + 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, + 0x68, 0x22, 0xd8, 0x01, 0x0a, 0x1a, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x42, 0x79, 0x54, 0x75, 0x70, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x52, 0x65, 0x73, 0x70, + 0x12, 0x3b, 0x0a, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x25, 0x2e, 0x70, 0x62, 0x64, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x42, 0x79, 0x54, 0x75, 0x70, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x52, 0x65, 0x73, + 0x70, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x1a, 0x7d, 0x0a, + 0x04, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x30, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x70, 0x62, 0x74, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x08, 0x74, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x43, 0x0a, 0x11, 0x74, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x5f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x70, 0x62, 0x74, 0x72, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x74, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xd2, 0x01, 0x0a, + 0x17, 0x42, 0x61, 0x74, 0x63, 0x68, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x54, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x12, 0x38, 0x0a, 0x05, 0x69, 0x74, 0x65, 0x6d, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x62, 0x64, 0x73, 0x2e, 0x42, + 0x61, 0x74, 0x63, 0x68, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x05, 0x69, 0x74, 0x65, + 0x6d, 0x73, 0x1a, 0x7d, 0x0a, 0x04, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x30, 0x0a, 0x08, 0x74, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x70, + 0x62, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x43, 0x0a, 0x11, + 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x70, 0x62, 0x74, 0x72, 0x2e, 0x54, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, + 0x10, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x22, 0x2f, 0x0a, 0x1b, 0x42, 0x61, 0x74, 0x63, 0x68, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, + 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x52, 0x65, 0x73, 0x70, + 0x12, 0x10, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x03, 0x69, + 0x64, 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x19, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x12, 0x40, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x70, 0x62, 0x74, 0x72, 0x2e, 0x54, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x74, 0x74, 0x61, + 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, + 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x70, 0x62, 0x74, 0x72, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, + 0x65, 0x63, 0x22, 0x84, 0x02, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, @@ -16110,520 +15826,916 @@ var file_data_service_proto_rawDesc = []byte{ 0x74, 0x61, 0x72, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x6c, 0x6c, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x61, 0x6c, 0x6c, 0x22, 0x70, 0x0a, 0x1a, 0x4c, 0x69, 0x73, - 0x74, 0x54, 0x6d, 0x70, 0x6c, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x41, - 0x70, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x3c, 0x0a, - 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, - 0x2e, 0x70, 0x62, 0x74, 0x62, 0x72, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x42, - 0x6f, 0x75, 0x6e, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x41, 0x70, 0x70, 0x44, 0x65, 0x74, 0x61, - 0x69, 0x6c, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0xbc, 0x01, 0x0a, 0x18, - 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6d, 0x70, 0x6c, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x6d, 0x70, - 0x6c, 0x53, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x61, 0x6c, 0x6c, 0x22, 0x63, 0x0a, 0x19, 0x4c, 0x69, 0x73, + 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x07, + 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, + 0x70, 0x62, 0x74, 0x72, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x6d, + 0x0a, 0x19, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x40, 0x0a, 0x0a, 0x61, + 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x20, 0x2e, 0x70, 0x62, 0x74, 0x72, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x31, 0x0a, + 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x79, 0x49, 0x44, 0x73, 0x52, 0x65, 0x71, 0x12, 0x10, + 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x03, 0x69, 0x64, 0x73, + 0x22, 0x52, 0x0a, 0x1e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x79, 0x49, 0x44, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x12, 0x30, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x70, 0x62, 0x74, 0x72, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x64, 0x65, 0x74, + 0x61, 0x69, 0x6c, 0x73, 0x22, 0x5d, 0x0a, 0x21, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6d, 0x70, 0x6c, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x54, + 0x6d, 0x70, 0x6c, 0x49, 0x44, 0x73, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, + 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x64, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x0b, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x49, 0x64, 0x73, 0x22, 0x61, 0x0a, 0x22, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6d, 0x70, 0x6c, 0x52, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x54, 0x6d, + 0x70, 0x6c, 0x49, 0x44, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x3b, 0x0a, 0x07, 0x64, 0x65, 0x74, + 0x61, 0x69, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70, 0x62, 0x74, + 0x72, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x07, 0x64, + 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x82, 0x01, 0x0a, 0x14, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x12, + 0x3d, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x70, 0x62, 0x74, 0x73, 0x65, 0x74, 0x2e, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x65, 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2b, + 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, + 0x62, 0x74, 0x73, 0x65, 0x74, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x65, + 0x74, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x22, 0xde, 0x01, 0x0a, 0x13, + 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x65, 0x74, 0x73, + 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x74, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, + 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x73, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, + 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x6c, + 0x6c, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x61, 0x6c, 0x6c, 0x22, 0x5b, 0x0a, 0x14, + 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x65, 0x74, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2d, 0x0a, 0x07, 0x64, 0x65, + 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x62, + 0x74, 0x73, 0x65, 0x74, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x65, 0x74, + 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0xa8, 0x01, 0x0a, 0x14, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x65, 0x74, 0x52, + 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, + 0x69, 0x64, 0x12, 0x3d, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x70, 0x62, 0x74, 0x73, 0x65, 0x74, 0x2e, + 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x65, 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, + 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, + 0x74, 0x12, 0x2b, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x17, 0x2e, 0x70, 0x62, 0x74, 0x73, 0x65, 0x74, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x53, 0x65, 0x74, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x12, 0x14, + 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, + 0x6f, 0x72, 0x63, 0x65, 0x22, 0x7b, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3d, 0x0a, 0x0a, + 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1d, 0x2e, 0x70, 0x62, 0x74, 0x73, 0x65, 0x74, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x53, 0x65, 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x66, + 0x6f, 0x72, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, + 0x65, 0x22, 0x46, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x70, 0x70, 0x54, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x53, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, + 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, + 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x22, 0x48, 0x0a, 0x17, 0x4c, 0x69, 0x73, + 0x74, 0x41, 0x70, 0x70, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x65, 0x74, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x12, 0x2d, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x62, 0x74, 0x73, 0x65, 0x74, 0x2e, 0x54, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x65, 0x74, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, + 0x69, 0x6c, 0x73, 0x22, 0x2c, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x53, 0x65, 0x74, 0x73, 0x42, 0x79, 0x49, 0x44, 0x73, 0x52, 0x65, 0x71, 0x12, + 0x10, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x03, 0x69, 0x64, + 0x73, 0x22, 0x4a, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x53, 0x65, 0x74, 0x73, 0x42, 0x79, 0x49, 0x44, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x2d, + 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x13, 0x2e, 0x70, 0x62, 0x74, 0x73, 0x65, 0x74, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x53, 0x65, 0x74, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x34, 0x0a, + 0x20, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x65, 0x74, + 0x42, 0x72, 0x69, 0x65, 0x66, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x79, 0x49, 0x44, 0x73, 0x52, 0x65, + 0x71, 0x12, 0x10, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x03, + 0x69, 0x64, 0x73, 0x22, 0x5b, 0x0a, 0x21, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x53, 0x65, 0x74, 0x42, 0x72, 0x69, 0x65, 0x66, 0x49, 0x6e, 0x66, 0x6f, 0x42, + 0x79, 0x49, 0x44, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x36, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, + 0x69, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x70, 0x62, 0x74, 0x73, + 0x65, 0x74, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x65, 0x74, 0x42, 0x72, + 0x69, 0x65, 0x66, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, + 0x22, 0x44, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6d, 0x70, 0x6c, 0x53, 0x65, 0x74, 0x73, + 0x4f, 0x66, 0x42, 0x69, 0x7a, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, - 0x2a, 0x0a, 0x11, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x74, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x53, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x74, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x0a, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, - 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x6c, 0x6c, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x61, 0x6c, 0x6c, 0x22, 0x72, 0x0a, 0x19, 0x4c, 0x69, - 0x73, 0x74, 0x54, 0x6d, 0x70, 0x6c, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x6d, 0x70, 0x6c, 0x53, - 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x3f, 0x0a, - 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, - 0x2e, 0x70, 0x62, 0x74, 0x62, 0x72, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x42, - 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x65, 0x74, 0x44, - 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0xc3, - 0x01, 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x54, 0x6d, 0x70, 0x6c, - 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x6d, 0x70, 0x6c, 0x53, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, + 0x15, 0x0a, 0x06, 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x22, 0x51, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6d, + 0x70, 0x6c, 0x53, 0x65, 0x74, 0x73, 0x4f, 0x66, 0x42, 0x69, 0x7a, 0x52, 0x65, 0x73, 0x70, 0x12, + 0x38, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1e, 0x2e, 0x70, 0x62, 0x74, 0x73, 0x65, 0x74, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x53, 0x65, 0x74, 0x4f, 0x66, 0x42, 0x69, 0x7a, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, + 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x95, 0x01, 0x0a, 0x1b, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x41, 0x70, 0x70, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x42, + 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x12, 0x43, 0x0a, 0x0a, 0x61, 0x74, 0x74, + 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, + 0x70, 0x62, 0x61, 0x74, 0x62, 0x2e, 0x41, 0x70, 0x70, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x31, + 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x70, + 0x62, 0x61, 0x74, 0x62, 0x2e, 0x41, 0x70, 0x70, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, + 0x63, 0x22, 0x88, 0x01, 0x0a, 0x1a, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x70, 0x70, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, + 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x61, 0x70, 0x70, 0x5f, 0x69, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x12, 0x14, + 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x6c, + 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x61, 0x6c, 0x6c, 0x22, 0x68, 0x0a, 0x1b, + 0x4c, 0x69, 0x73, 0x74, 0x41, 0x70, 0x70, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x42, + 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x12, 0x33, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x62, 0x61, 0x74, 0x62, 0x2e, 0x41, 0x70, 0x70, 0x54, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x07, 0x64, + 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0xa5, 0x01, 0x0a, 0x1b, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x41, 0x70, 0x70, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x42, 0x69, 0x6e, 0x64, + 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x43, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, + 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x70, 0x62, 0x61, + 0x74, 0x62, 0x2e, 0x41, 0x70, 0x70, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x42, 0x69, + 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x31, 0x0a, 0x04, 0x73, + 0x70, 0x65, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x70, 0x62, 0x61, 0x74, + 0x62, 0x2e, 0x41, 0x70, 0x70, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x42, 0x69, 0x6e, + 0x64, 0x69, 0x6e, 0x67, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x22, 0x72, + 0x0a, 0x1b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x70, 0x70, 0x54, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x43, 0x0a, + 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x23, 0x2e, 0x70, 0x62, 0x61, 0x74, 0x62, 0x2e, 0x41, 0x70, 0x70, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x41, 0x74, 0x74, 0x61, + 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, + 0x6e, 0x74, 0x22, 0xf3, 0x01, 0x0a, 0x1c, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x70, 0x70, 0x42, 0x6f, + 0x75, 0x6e, 0x64, 0x54, 0x6d, 0x70, 0x6c, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, + 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x61, 0x70, + 0x70, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, + 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x66, 0x69, 0x65, 0x6c, + 0x64, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, + 0x61, 0x72, 0x63, 0x68, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, + 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x6c, 0x6c, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x03, 0x61, 0x6c, 0x6c, 0x12, 0x1f, 0x0a, 0x0b, 0x77, 0x69, 0x74, 0x68, 0x5f, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x77, 0x69, + 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x6c, 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, + 0x41, 0x70, 0x70, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x6d, 0x70, 0x6c, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, + 0x35, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1b, 0x2e, 0x70, 0x62, 0x61, 0x74, 0x62, 0x2e, 0x41, 0x70, 0x70, 0x42, 0x6f, 0x75, 0x6e, + 0x64, 0x54, 0x6d, 0x70, 0x6c, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x64, + 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0xf9, 0x01, 0x0a, 0x24, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x41, 0x70, 0x70, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x54, + 0x6d, 0x70, 0x6c, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x12, + 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x12, 0x1d, 0x0a, + 0x0a, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x09, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, + 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x46, 0x69, 0x65, 0x6c, 0x64, + 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x12, 0x10, 0x0a, 0x03, 0x61, 0x6c, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x61, + 0x6c, 0x6c, 0x22, 0x7c, 0x0a, 0x25, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, + 0x65, 0x64, 0x41, 0x70, 0x70, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x6d, 0x70, 0x6c, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x12, 0x3d, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x70, 0x62, 0x61, 0x74, 0x62, 0x2e, 0x52, 0x65, 0x6c, 0x65, 0x61, + 0x73, 0x65, 0x64, 0x41, 0x70, 0x70, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x6d, 0x70, 0x6c, 0x52, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, + 0x22, 0xa3, 0x01, 0x0a, 0x22, 0x47, 0x65, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, + 0x41, 0x70, 0x70, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x6d, 0x70, 0x6c, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x15, + 0x0a, 0x06, 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, + 0x61, 0x70, 0x70, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, + 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x72, 0x65, 0x6c, 0x65, 0x61, + 0x73, 0x65, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x14, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x5f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x12, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x62, 0x0a, 0x23, 0x47, 0x65, 0x74, 0x52, 0x65, 0x6c, + 0x65, 0x61, 0x73, 0x65, 0x64, 0x41, 0x70, 0x70, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x6d, 0x70, + 0x6c, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x12, 0x3b, 0x0a, + 0x06, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, + 0x70, 0x62, 0x61, 0x74, 0x62, 0x2e, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x41, 0x70, + 0x70, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x6d, 0x70, 0x6c, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x52, 0x06, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x22, 0x94, 0x01, 0x0a, 0x1a, 0x43, + 0x68, 0x65, 0x63, 0x6b, 0x41, 0x70, 0x70, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x42, + 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x12, 0x43, 0x0a, 0x0a, 0x61, 0x74, 0x74, + 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, + 0x70, 0x62, 0x61, 0x74, 0x62, 0x2e, 0x41, 0x70, 0x70, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x31, + 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x70, + 0x62, 0x61, 0x74, 0x62, 0x2e, 0x41, 0x70, 0x70, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, + 0x63, 0x22, 0x48, 0x0a, 0x1b, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x41, 0x70, 0x70, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, + 0x12, 0x29, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x0f, 0x2e, 0x70, 0x62, 0x61, 0x74, 0x62, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69, + 0x63, 0x74, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x4a, 0x0a, 0x1a, 0x45, + 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x41, 0x70, 0x70, 0x54, 0x6d, 0x70, 0x6c, 0x56, 0x61, 0x72, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, + 0x12, 0x15, 0x0a, 0x06, 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x22, 0x37, 0x0a, 0x1b, 0x45, 0x78, 0x74, 0x72, 0x61, + 0x63, 0x74, 0x41, 0x70, 0x70, 0x54, 0x6d, 0x70, 0x6c, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, + 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, + 0x22, 0x49, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x41, 0x70, 0x70, 0x54, 0x6d, 0x70, 0x6c, 0x56, 0x61, + 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x66, 0x73, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, + 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, + 0x69, 0x7a, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x22, 0x5b, 0x0a, 0x1a, 0x47, + 0x65, 0x74, 0x41, 0x70, 0x70, 0x54, 0x6d, 0x70, 0x6c, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, + 0x65, 0x52, 0x65, 0x66, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x3d, 0x0a, 0x07, 0x64, 0x65, 0x74, + 0x61, 0x69, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x70, 0x62, 0x61, + 0x74, 0x76, 0x2e, 0x41, 0x70, 0x70, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x56, 0x61, + 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, + 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x70, 0x0a, 0x21, 0x47, 0x65, 0x74, 0x52, + 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x41, 0x70, 0x70, 0x54, 0x6d, 0x70, 0x6c, 0x56, 0x61, + 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x66, 0x73, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, + 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, + 0x69, 0x7a, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x72, + 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x09, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x49, 0x64, 0x22, 0x63, 0x0a, 0x22, 0x47, 0x65, + 0x74, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x41, 0x70, 0x70, 0x54, 0x6d, 0x70, 0x6c, + 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x66, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x12, 0x3d, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x23, 0x2e, 0x70, 0x62, 0x61, 0x74, 0x76, 0x2e, 0x41, 0x70, 0x70, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, + 0x95, 0x01, 0x0a, 0x19, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x70, 0x70, 0x54, 0x6d, 0x70, + 0x6c, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x12, 0x44, 0x0a, + 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x24, 0x2e, 0x70, 0x62, 0x61, 0x74, 0x76, 0x2e, 0x41, 0x70, 0x70, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x41, 0x74, 0x74, + 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, + 0x65, 0x6e, 0x74, 0x12, 0x32, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1e, 0x2e, 0x70, 0x62, 0x61, 0x74, 0x76, 0x2e, 0x41, 0x70, 0x70, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x70, 0x65, + 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x22, 0x47, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x41, + 0x70, 0x70, 0x54, 0x6d, 0x70, 0x6c, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x52, + 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x61, 0x70, 0x70, + 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, + 0x22, 0x50, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x70, 0x70, 0x54, 0x6d, 0x70, 0x6c, 0x56, + 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x34, 0x0a, 0x07, + 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x70, 0x62, 0x74, 0x76, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, + 0x6c, 0x73, 0x22, 0x6e, 0x0a, 0x1f, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, + 0x65, 0x64, 0x41, 0x70, 0x70, 0x54, 0x6d, 0x70, 0x6c, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, + 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x61, 0x70, + 0x70, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x5f, 0x69, + 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, + 0x49, 0x64, 0x22, 0x58, 0x0a, 0x20, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, + 0x65, 0x64, 0x41, 0x70, 0x70, 0x54, 0x6d, 0x70, 0x6c, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, + 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x34, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x62, 0x74, 0x76, 0x2e, 0x54, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, + 0x70, 0x65, 0x63, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x7e, 0x0a, 0x16, + 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6d, 0x70, 0x6c, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x6f, 0x75, + 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x2a, 0x0a, + 0x11, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x53, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0d, 0x52, + 0x0b, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x64, 0x73, 0x22, 0x4f, 0x0a, 0x17, + 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6d, 0x70, 0x6c, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x6f, 0x75, + 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x34, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, + 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x62, 0x74, 0x62, 0x72, + 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x73, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0xb8, 0x01, + 0x0a, 0x1e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6d, 0x70, 0x6c, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x70, 0x61, 0x63, - 0x65, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, - 0x69, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x0b, 0x74, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x49, 0x64, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, + 0x65, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, + 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x49, 0x64, 0x12, 0x32, 0x0a, 0x15, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x5f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x04, 0x20, + 0x03, 0x28, 0x0d, 0x52, 0x13, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x22, 0x5f, 0x0a, 0x1f, 0x4c, 0x69, 0x73, 0x74, + 0x54, 0x6d, 0x70, 0x6c, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x6f, 0x75, 0x6e, + 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x3c, 0x0a, 0x07, 0x64, + 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, + 0x62, 0x74, 0x62, 0x72, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, + 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x88, 0x01, 0x0a, 0x19, 0x4c, 0x69, + 0x73, 0x74, 0x54, 0x6d, 0x70, 0x6c, 0x53, 0x65, 0x74, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x2a, + 0x0a, 0x11, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x74, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x53, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x28, 0x0a, 0x10, 0x74, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x0d, 0x52, 0x0e, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x65, + 0x74, 0x49, 0x64, 0x73, 0x22, 0x55, 0x0a, 0x1a, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6d, 0x70, 0x6c, + 0x53, 0x65, 0x74, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x12, 0x37, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x70, 0x62, 0x74, 0x62, 0x72, 0x2e, 0x54, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x53, 0x65, 0x74, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x73, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x87, 0x02, 0x0a, 0x1b, + 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6d, 0x70, 0x6c, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x55, 0x6e, 0x6e, + 0x61, 0x6d, 0x65, 0x64, 0x41, 0x70, 0x70, 0x73, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, + 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, + 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x74, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1f, + 0x0a, 0x0b, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x64, 0x12, + 0x23, 0x0a, 0x0d, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x46, 0x69, + 0x65, 0x6c, 0x64, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x61, 0x72, + 0x63, 0x68, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x14, 0x0a, + 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x6c, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x03, 0x61, 0x6c, 0x6c, 0x22, 0x74, 0x0a, 0x1c, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6d, 0x70, + 0x6c, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x55, 0x6e, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x41, 0x70, 0x70, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x3e, 0x0a, 0x07, 0x64, + 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x70, + 0x62, 0x74, 0x62, 0x72, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x42, 0x6f, 0x75, + 0x6e, 0x64, 0x55, 0x6e, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x41, 0x70, 0x70, 0x44, 0x65, 0x74, 0x61, + 0x69, 0x6c, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x85, 0x02, 0x0a, 0x19, + 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6d, 0x70, 0x6c, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x4e, 0x61, 0x6d, + 0x65, 0x64, 0x41, 0x70, 0x70, 0x73, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, + 0x12, 0x2a, 0x0a, 0x11, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x74, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, + 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x0a, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x64, 0x12, 0x23, 0x0a, + 0x0d, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x46, 0x69, 0x65, 0x6c, + 0x64, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, + 0x69, 0x6d, 0x69, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, + 0x74, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x6c, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, + 0x61, 0x6c, 0x6c, 0x22, 0x70, 0x0a, 0x1a, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6d, 0x70, 0x6c, 0x42, + 0x6f, 0x75, 0x6e, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x41, 0x70, 0x70, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x3c, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, + 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x62, 0x74, 0x62, 0x72, + 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x4e, 0x61, + 0x6d, 0x65, 0x64, 0x41, 0x70, 0x70, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x07, 0x64, 0x65, + 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0xbc, 0x01, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6d, + 0x70, 0x6c, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x6d, 0x70, 0x6c, 0x53, 0x65, 0x74, 0x73, 0x52, + 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x74, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x70, + 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x74, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x6c, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x03, 0x61, 0x6c, 0x6c, 0x22, 0x7c, 0x0a, 0x1e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x75, 0x6c, 0x74, - 0x69, 0x54, 0x6d, 0x70, 0x6c, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x6d, 0x70, 0x6c, 0x53, 0x65, - 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x44, 0x0a, 0x07, - 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, - 0x70, 0x62, 0x74, 0x62, 0x72, 0x2e, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x54, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, - 0x53, 0x65, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, - 0x6c, 0x73, 0x22, 0xc1, 0x02, 0x0a, 0x23, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6d, 0x70, 0x6c, 0x52, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x55, 0x6e, 0x6e, 0x61, - 0x6d, 0x65, 0x64, 0x41, 0x70, 0x70, 0x73, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, + 0x03, 0x61, 0x6c, 0x6c, 0x22, 0x72, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6d, 0x70, 0x6c, + 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x6d, 0x70, 0x6c, 0x53, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x3f, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, + 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x70, 0x62, 0x74, 0x62, 0x72, + 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x65, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, + 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0xc3, 0x01, 0x0a, 0x1d, 0x4c, 0x69, 0x73, + 0x74, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x54, 0x6d, 0x70, 0x6c, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x54, + 0x6d, 0x70, 0x6c, 0x53, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x74, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1f, 0x0a, - 0x0b, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x0a, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x64, 0x12, 0x30, - 0x0a, 0x14, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x74, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, - 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, - 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x46, - 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x61, - 0x72, 0x63, 0x68, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, - 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x14, - 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, - 0x69, 0x6d, 0x69, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x6c, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x03, 0x61, 0x6c, 0x6c, 0x22, 0x84, 0x01, 0x0a, 0x24, 0x4c, 0x69, 0x73, 0x74, 0x54, - 0x6d, 0x70, 0x6c, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x6f, 0x75, 0x6e, 0x64, - 0x55, 0x6e, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x41, 0x70, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, - 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x46, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x70, 0x62, 0x74, 0x62, 0x72, 0x2e, 0x54, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x42, - 0x6f, 0x75, 0x6e, 0x64, 0x55, 0x6e, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x41, 0x70, 0x70, 0x44, 0x65, - 0x74, 0x61, 0x69, 0x6c, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0xbf, 0x02, - 0x0a, 0x21, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6d, 0x70, 0x6c, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x41, 0x70, 0x70, 0x73, - 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x74, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, - 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x74, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x14, 0x74, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x5f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x65, 0x61, - 0x72, 0x63, 0x68, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0c, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x21, - 0x0a, 0x0c, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x10, 0x0a, - 0x03, 0x61, 0x6c, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x61, 0x6c, 0x6c, 0x22, - 0x80, 0x01, 0x0a, 0x22, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6d, 0x70, 0x6c, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x41, 0x70, - 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x44, 0x0a, 0x07, - 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, - 0x70, 0x62, 0x74, 0x62, 0x72, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x64, - 0x41, 0x70, 0x70, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, - 0x6c, 0x73, 0x22, 0xc9, 0x01, 0x0a, 0x1e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6d, 0x70, 0x6c, 0x53, - 0x65, 0x74, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x55, 0x6e, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x41, 0x70, - 0x70, 0x73, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x11, - 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, - 0x65, 0x53, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x0d, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x65, 0x74, 0x49, 0x64, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x21, 0x0a, + 0x0c, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x0d, 0x52, 0x0b, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x64, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x10, 0x0a, 0x03, - 0x61, 0x6c, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x61, 0x6c, 0x6c, 0x22, 0x7a, - 0x0a, 0x1f, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6d, 0x70, 0x6c, 0x53, 0x65, 0x74, 0x42, 0x6f, 0x75, - 0x6e, 0x64, 0x55, 0x6e, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x41, 0x70, 0x70, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x41, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, - 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x70, 0x62, 0x74, 0x62, 0x72, - 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x65, 0x74, 0x42, 0x6f, 0x75, 0x6e, - 0x64, 0x55, 0x6e, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x41, 0x70, 0x70, 0x44, 0x65, 0x74, 0x61, 0x69, - 0x6c, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0xd0, 0x01, 0x0a, 0x23, 0x4c, - 0x69, 0x73, 0x74, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x54, 0x6d, 0x70, 0x6c, 0x53, 0x65, 0x74, 0x42, - 0x6f, 0x75, 0x6e, 0x64, 0x55, 0x6e, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x41, 0x70, 0x70, 0x73, 0x52, - 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x74, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x70, - 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x28, 0x0a, 0x10, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, - 0x65, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0d, 0x52, - 0x0e, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x65, 0x74, 0x49, 0x64, 0x73, 0x12, - 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, - 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x61, - 0x6c, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x61, 0x6c, 0x6c, 0x22, 0x84, 0x01, - 0x0a, 0x24, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x54, 0x6d, 0x70, 0x6c, 0x53, - 0x65, 0x74, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x55, 0x6e, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x41, 0x70, - 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x46, 0x0a, 0x07, - 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, - 0x70, 0x62, 0x74, 0x62, 0x72, 0x2e, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x54, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x6c, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x61, 0x6c, 0x6c, 0x22, 0x7c, + 0x0a, 0x1e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x54, 0x6d, 0x70, 0x6c, 0x42, + 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x6d, 0x70, 0x6c, 0x53, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x44, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x70, 0x62, 0x74, 0x62, 0x72, 0x2e, + 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x42, 0x6f, 0x75, + 0x6e, 0x64, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x65, 0x74, 0x44, 0x65, 0x74, + 0x61, 0x69, 0x6c, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0xc1, 0x02, 0x0a, + 0x23, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6d, 0x70, 0x6c, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x55, 0x6e, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x41, 0x70, 0x70, + 0x73, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x74, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x53, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x74, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x14, 0x74, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x65, + 0x61, 0x72, 0x63, 0x68, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, + 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, + 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x10, + 0x0a, 0x03, 0x61, 0x6c, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x61, 0x6c, 0x6c, + 0x22, 0x84, 0x01, 0x0a, 0x24, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6d, 0x70, 0x6c, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x55, 0x6e, 0x6e, 0x61, 0x6d, 0x65, + 0x64, 0x41, 0x70, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, + 0x46, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x2c, 0x2e, 0x70, 0x62, 0x74, 0x62, 0x72, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x55, 0x6e, + 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x41, 0x70, 0x70, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x07, + 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0xbf, 0x02, 0x0a, 0x21, 0x4c, 0x69, 0x73, 0x74, + 0x54, 0x6d, 0x70, 0x6c, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x6f, 0x75, 0x6e, + 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x41, 0x70, 0x70, 0x73, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, + 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, + 0x69, 0x7a, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x5f, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x0f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, + 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, + 0x64, 0x12, 0x30, 0x0a, 0x14, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x12, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x66, 0x69, + 0x65, 0x6c, 0x64, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x65, 0x61, 0x72, + 0x63, 0x68, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x61, 0x72, + 0x63, 0x68, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x6c, 0x6c, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x61, 0x6c, 0x6c, 0x22, 0x80, 0x01, 0x0a, 0x22, 0x4c, 0x69, + 0x73, 0x74, 0x54, 0x6d, 0x70, 0x6c, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x6f, + 0x75, 0x6e, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x41, 0x70, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x44, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x70, 0x62, 0x74, 0x62, 0x72, 0x2e, + 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x41, 0x70, 0x70, 0x44, 0x65, 0x74, + 0x61, 0x69, 0x6c, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0xc9, 0x01, 0x0a, + 0x1e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6d, 0x70, 0x6c, 0x53, 0x65, 0x74, 0x42, 0x6f, 0x75, 0x6e, + 0x64, 0x55, 0x6e, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x41, 0x70, 0x70, 0x73, 0x52, 0x65, 0x71, 0x12, + 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x5f, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x0f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x70, 0x61, 0x63, 0x65, + 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x73, + 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x74, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x65, 0x74, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x6c, 0x6c, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x03, 0x61, 0x6c, 0x6c, 0x22, 0x7a, 0x0a, 0x1f, 0x4c, 0x69, 0x73, 0x74, + 0x54, 0x6d, 0x70, 0x6c, 0x53, 0x65, 0x74, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x55, 0x6e, 0x6e, 0x61, + 0x6d, 0x65, 0x64, 0x41, 0x70, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x12, 0x41, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x70, 0x62, 0x74, 0x62, 0x72, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x65, 0x74, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x55, 0x6e, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x41, 0x70, 0x70, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x07, 0x64, 0x65, 0x74, - 0x61, 0x69, 0x6c, 0x73, 0x22, 0xc7, 0x01, 0x0a, 0x1c, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6d, 0x70, - 0x6c, 0x53, 0x65, 0x74, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x41, 0x70, - 0x70, 0x73, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x11, - 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, - 0x65, 0x53, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x0d, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x65, 0x74, 0x49, 0x64, - 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x10, 0x0a, 0x03, - 0x61, 0x6c, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x61, 0x6c, 0x6c, 0x22, 0x76, - 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6d, 0x70, 0x6c, 0x53, 0x65, 0x74, 0x42, 0x6f, 0x75, - 0x6e, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x41, 0x70, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, - 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x3f, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x70, 0x62, 0x74, 0x62, 0x72, 0x2e, 0x54, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x65, 0x74, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x4e, - 0x61, 0x6d, 0x65, 0x64, 0x41, 0x70, 0x70, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x07, 0x64, - 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0xc5, 0x01, 0x0a, 0x21, 0x4c, 0x69, 0x73, 0x74, 0x4c, - 0x61, 0x74, 0x65, 0x73, 0x74, 0x54, 0x6d, 0x70, 0x6c, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x55, 0x6e, + 0x61, 0x69, 0x6c, 0x73, 0x22, 0xd0, 0x01, 0x0a, 0x23, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x75, 0x6c, + 0x74, 0x69, 0x54, 0x6d, 0x70, 0x6c, 0x53, 0x65, 0x74, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x55, 0x6e, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x41, 0x70, 0x70, 0x73, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, - 0x1f, 0x0a, 0x0b, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x64, - 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x10, 0x0a, 0x03, - 0x61, 0x6c, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x61, 0x6c, 0x6c, 0x22, 0x80, - 0x01, 0x0a, 0x22, 0x4c, 0x69, 0x73, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x54, 0x6d, 0x70, - 0x6c, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x55, 0x6e, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x41, 0x70, 0x70, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x44, 0x0a, 0x07, 0x64, - 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x70, - 0x62, 0x74, 0x62, 0x72, 0x2e, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x55, 0x6e, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x41, - 0x70, 0x70, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, - 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x19, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x12, - 0x40, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x70, 0x62, 0x74, 0x76, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x41, 0x74, 0x74, 0x61, 0x63, - 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, - 0x74, 0x12, 0x2e, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x70, 0x62, 0x74, 0x76, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x56, - 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, - 0x63, 0x22, 0x65, 0x0a, 0x1a, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x12, + 0x28, 0x0a, 0x10, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x65, 0x74, 0x5f, + 0x69, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x0e, 0x74, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x53, 0x65, 0x74, 0x49, 0x64, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, + 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x6c, 0x6c, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x03, 0x61, 0x6c, 0x6c, 0x22, 0x84, 0x01, 0x0a, 0x24, 0x4c, 0x69, 0x73, 0x74, + 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x54, 0x6d, 0x70, 0x6c, 0x53, 0x65, 0x74, 0x42, 0x6f, 0x75, 0x6e, + 0x64, 0x55, 0x6e, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x41, 0x70, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x46, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x70, 0x62, 0x74, 0x62, 0x72, 0x2e, + 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x65, 0x74, + 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x55, 0x6e, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x41, 0x70, 0x70, 0x44, + 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0xc7, + 0x01, 0x0a, 0x1c, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6d, 0x70, 0x6c, 0x53, 0x65, 0x74, 0x42, 0x6f, + 0x75, 0x6e, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x41, 0x70, 0x70, 0x73, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x05, 0x73, 0x70, 0x65, 0x63, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x62, 0x74, 0x76, 0x2e, 0x54, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x70, 0x65, - 0x63, 0x52, 0x05, 0x73, 0x70, 0x65, 0x63, 0x73, 0x22, 0x44, 0x0a, 0x1b, 0x49, 0x6d, 0x70, 0x6f, - 0x72, 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, - 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x25, 0x0a, 0x0e, 0x76, 0x61, 0x72, 0x69, 0x61, - 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x0d, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xb7, - 0x01, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x56, - 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, - 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, - 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x66, 0x69, 0x65, - 0x6c, 0x64, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x65, 0x61, 0x72, 0x63, - 0x68, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x61, 0x72, 0x63, - 0x68, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, - 0x65, 0x61, 0x72, 0x63, 0x68, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, + 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x5f, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x0f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x70, 0x61, 0x63, 0x65, + 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x73, + 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x74, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x65, 0x74, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x6c, 0x6c, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x03, 0x61, 0x6c, 0x6c, 0x22, 0x76, 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, + 0x54, 0x6d, 0x70, 0x6c, 0x53, 0x65, 0x74, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x4e, 0x61, 0x6d, 0x65, + 0x64, 0x41, 0x70, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, + 0x3f, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x25, 0x2e, 0x70, 0x62, 0x74, 0x62, 0x72, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x53, 0x65, 0x74, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x41, 0x70, + 0x70, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, + 0x22, 0xc5, 0x01, 0x0a, 0x21, 0x4c, 0x69, 0x73, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x54, + 0x6d, 0x70, 0x6c, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x55, 0x6e, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x41, + 0x70, 0x70, 0x73, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x2a, 0x0a, + 0x11, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x53, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, + 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x6c, 0x6c, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x03, 0x61, 0x6c, 0x6c, 0x22, 0x63, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, + 0x01, 0x28, 0x08, 0x52, 0x03, 0x61, 0x6c, 0x6c, 0x22, 0x80, 0x01, 0x0a, 0x22, 0x4c, 0x69, 0x73, + 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x54, 0x6d, 0x70, 0x6c, 0x42, 0x6f, 0x75, 0x6e, 0x64, + 0x55, 0x6e, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x41, 0x70, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, + 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x44, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x70, 0x62, 0x74, 0x62, 0x72, 0x2e, 0x4c, + 0x61, 0x74, 0x65, 0x73, 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x42, 0x6f, 0x75, + 0x6e, 0x64, 0x55, 0x6e, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x41, 0x70, 0x70, 0x44, 0x65, 0x74, 0x61, + 0x69, 0x6c, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x19, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x56, 0x61, + 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x12, 0x40, 0x0a, 0x0a, 0x61, 0x74, 0x74, + 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, + 0x70, 0x62, 0x74, 0x76, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x04, 0x73, + 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x62, 0x74, 0x76, + 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, + 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x22, 0x65, 0x0a, 0x1a, 0x49, + 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, + 0x12, 0x30, 0x0a, 0x05, 0x73, 0x70, 0x65, 0x63, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x70, 0x62, 0x74, 0x76, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x56, + 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x05, 0x73, 0x70, 0x65, + 0x63, 0x73, 0x22, 0x44, 0x0a, 0x1b, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x12, 0x25, 0x0a, 0x0e, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x76, 0x61, 0x72, 0x69, 0x61, + 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xb7, 0x01, 0x0a, 0x18, 0x4c, 0x69, 0x73, + 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, + 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x46, 0x69, 0x65, 0x6c, 0x64, + 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x12, 0x10, 0x0a, 0x03, 0x61, 0x6c, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x61, + 0x6c, 0x6c, 0x22, 0x63, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, + 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x70, 0x62, 0x74, 0x76, 0x2e, 0x54, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x07, + 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x9d, 0x01, 0x0a, 0x19, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, + 0x6c, 0x65, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x40, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, + 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x70, 0x62, 0x74, 0x76, + 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, + 0x65, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x61, 0x74, 0x74, + 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x62, 0x74, 0x76, 0x2e, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x70, 0x65, + 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x22, 0x6d, 0x0a, 0x19, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, + 0x65, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x02, 0x69, 0x64, 0x12, 0x40, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, + 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x70, 0x62, 0x74, 0x76, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x07, 0x64, - 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x70, - 0x62, 0x74, 0x76, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, - 0x61, 0x62, 0x6c, 0x65, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x9d, 0x01, - 0x0a, 0x19, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, - 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x40, 0x0a, 0x0a, 0x61, - 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x20, 0x2e, 0x70, 0x62, 0x74, 0x76, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x56, - 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2e, 0x0a, - 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x62, - 0x74, 0x76, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, - 0x62, 0x6c, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x22, 0x6d, 0x0a, - 0x19, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x56, - 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x40, 0x0a, 0x0a, 0x61, 0x74, - 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, - 0x2e, 0x70, 0x62, 0x74, 0x76, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x56, 0x61, - 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x72, 0x0a, 0x0e, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x12, 0x38, - 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x70, 0x62, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x61, 0x74, - 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x26, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x70, 0x62, 0x67, 0x72, 0x6f, 0x75, 0x70, - 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, - 0x22, 0x29, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x73, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x22, 0x3d, 0x0a, 0x11, 0x4c, - 0x69, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x12, 0x28, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x0e, 0x2e, 0x70, 0x62, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x40, 0x0a, 0x10, 0x4c, 0x69, - 0x73, 0x74, 0x41, 0x70, 0x70, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x71, 0x12, 0x15, - 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, - 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x22, 0xfa, 0x02, 0x0a, - 0x11, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x70, 0x70, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x12, 0x43, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x70, 0x62, 0x64, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, - 0x70, 0x70, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x41, 0x70, 0x70, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x44, 0x61, 0x74, 0x61, 0x52, 0x07, - 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x1a, 0x9f, 0x02, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, - 0x41, 0x70, 0x70, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x44, 0x61, 0x74, 0x61, 0x12, 0x19, 0x0a, - 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x67, 0x72, 0x6f, 0x75, - 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x67, 0x72, - 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x6c, 0x65, 0x61, - 0x73, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x72, 0x65, 0x6c, - 0x65, 0x61, 0x73, 0x65, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, - 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, - 0x6c, 0x65, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3a, 0x0a, 0x0c, 0x6f, 0x6c, 0x64, - 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x0b, 0x6f, 0x6c, 0x64, 0x53, 0x65, 0x6c, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x3a, 0x0a, 0x0c, 0x6e, 0x65, 0x77, 0x5f, 0x73, 0x65, 0x6c, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, - 0x72, 0x75, 0x63, 0x74, 0x52, 0x0b, 0x6e, 0x65, 0x77, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x64, 0x69, 0x74, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x06, 0x65, 0x64, 0x69, 0x74, 0x65, 0x64, 0x22, 0x49, 0x0a, 0x11, 0x47, 0x65, 0x74, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x12, 0x15, + 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x61, + 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x72, 0x0a, 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x12, 0x38, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x61, + 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x70, + 0x62, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x41, 0x74, 0x74, 0x61, + 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, + 0x6e, 0x74, 0x12, 0x26, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x12, 0x2e, 0x70, 0x62, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x22, 0x29, 0x0a, 0x10, 0x4c, 0x69, + 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, - 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, - 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x82, 0x01, 0x0a, 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x38, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, - 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x70, 0x62, - 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x41, 0x74, 0x74, 0x61, 0x63, - 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, - 0x74, 0x12, 0x26, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x12, 0x2e, 0x70, 0x62, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, - 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x22, 0x5a, 0x0a, 0x0e, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x38, 0x0a, 0x0a, 0x61, - 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x18, 0x2e, 0x70, 0x62, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x41, - 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, - 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x4b, 0x0a, 0x1a, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x41, 0x70, 0x70, 0x73, - 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x67, 0x72, - 0x6f, 0x75, 0x70, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x06, 0x67, 0x72, 0x6f, 0x75, - 0x70, 0x73, 0x22, 0xd8, 0x01, 0x0a, 0x1b, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x73, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x41, 0x70, 0x70, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x12, 0x51, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x3d, 0x2e, 0x70, 0x62, 0x64, 0x73, 0x2e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x73, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x41, 0x70, 0x70, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x2e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, - 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x41, 0x70, 0x70, 0x73, 0x44, 0x61, 0x74, 0x61, 0x52, - 0x04, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x66, 0x0a, 0x1b, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x41, 0x70, 0x70, 0x73, - 0x44, 0x61, 0x74, 0x61, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x12, - 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x64, 0x69, 0x74, 0x65, 0x64, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x65, 0x64, 0x69, 0x74, 0x65, 0x64, 0x22, 0x97, 0x01, - 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x6c, 0x65, 0x61, - 0x73, 0x65, 0x64, 0x41, 0x70, 0x70, 0x73, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, - 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, - 0x64, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, - 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, - 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0xb0, 0x02, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, + 0x62, 0x69, 0x7a, 0x49, 0x64, 0x22, 0x3d, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x6c, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x28, 0x0a, 0x07, 0x64, 0x65, + 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x70, 0x62, + 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x07, 0x64, 0x65, 0x74, + 0x61, 0x69, 0x6c, 0x73, 0x22, 0x40, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x70, 0x70, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, + 0x15, 0x0a, 0x06, 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x22, 0xfa, 0x02, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x41, + 0x70, 0x70, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x43, 0x0a, 0x07, + 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, + 0x70, 0x62, 0x64, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x70, 0x70, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x70, 0x70, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x73, 0x44, 0x61, 0x74, 0x61, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, + 0x73, 0x1a, 0x9f, 0x02, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x70, 0x70, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x73, 0x44, 0x61, 0x74, 0x61, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, + 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x5f, 0x69, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x49, 0x64, + 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x3a, 0x0a, 0x0c, 0x6f, 0x6c, 0x64, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x52, 0x0b, 0x6f, 0x6c, 0x64, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, + 0x3a, 0x0a, 0x0c, 0x6e, 0x65, 0x77, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x0b, + 0x6e, 0x65, 0x77, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x65, + 0x64, 0x69, 0x74, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x65, 0x64, 0x69, + 0x74, 0x65, 0x64, 0x22, 0x49, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x42, + 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, + 0x1d, 0x0a, 0x0a, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x82, + 0x01, 0x0a, 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, + 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, + 0x64, 0x12, 0x38, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x70, 0x62, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x26, 0x0a, 0x04, 0x73, + 0x70, 0x65, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x70, 0x62, 0x67, 0x72, + 0x6f, 0x75, 0x70, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, + 0x70, 0x65, 0x63, 0x22, 0x5a, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x38, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, + 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x70, 0x62, 0x67, 0x72, + 0x6f, 0x75, 0x70, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x22, + 0x4b, 0x0a, 0x1a, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, + 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x41, 0x70, 0x70, 0x73, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, + 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, + 0x69, 0x7a, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0d, 0x52, 0x06, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x22, 0xd8, 0x01, 0x0a, + 0x1b, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x6c, 0x65, + 0x61, 0x73, 0x65, 0x64, 0x41, 0x70, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x51, 0x0a, 0x04, + 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x70, 0x62, 0x64, + 0x73, 0x2e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x6c, + 0x65, 0x61, 0x73, 0x65, 0x64, 0x41, 0x70, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x2e, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, + 0x64, 0x41, 0x70, 0x70, 0x73, 0x44, 0x61, 0x74, 0x61, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x1a, + 0x66, 0x0a, 0x1b, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, + 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x41, 0x70, 0x70, 0x73, 0x44, 0x61, 0x74, 0x61, 0x12, 0x19, + 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, + 0x16, 0x0a, 0x06, 0x65, 0x64, 0x69, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x06, 0x65, 0x64, 0x69, 0x74, 0x65, 0x64, 0x22, 0x97, 0x01, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x41, 0x70, 0x70, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x53, 0x0a, 0x07, 0x64, - 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x70, - 0x62, 0x64, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x6c, - 0x65, 0x61, 0x73, 0x65, 0x64, 0x41, 0x70, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x2e, 0x4c, 0x69, + 0x73, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x67, + 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x67, + 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x61, 0x72, + 0x63, 0x68, 0x4b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, + 0x69, 0x6d, 0x69, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, + 0x74, 0x22, 0xb0, 0x02, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, + 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x41, 0x70, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, + 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x53, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x70, 0x62, 0x64, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x41, - 0x70, 0x70, 0x73, 0x44, 0x61, 0x74, 0x61, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, - 0x1a, 0xa7, 0x01, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, - 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x41, 0x70, 0x70, 0x73, 0x44, 0x61, 0x74, 0x61, 0x12, 0x15, - 0x0a, 0x06, 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, - 0x61, 0x70, 0x70, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x70, 0x70, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x70, 0x70, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x49, 0x64, 0x12, - 0x21, 0x0a, 0x0c, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x64, 0x69, 0x74, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x06, 0x65, 0x64, 0x69, 0x74, 0x65, 0x64, 0x22, 0xad, 0x02, 0x0a, 0x0a, 0x50, - 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, - 0x12, 0x15, 0x0a, 0x06, 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x6c, 0x65, 0x61, - 0x73, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x72, 0x65, 0x6c, - 0x65, 0x61, 0x73, 0x65, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x65, 0x6d, 0x6f, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6d, 0x65, 0x6d, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x6c, - 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x61, 0x6c, 0x6c, 0x12, 0x2a, 0x0a, 0x11, - 0x67, 0x72, 0x61, 0x79, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x5f, 0x6d, 0x6f, 0x64, - 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x67, 0x72, 0x61, 0x79, 0x50, 0x75, 0x62, - 0x6c, 0x69, 0x73, 0x68, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x18, 0x08, 0x20, 0x03, - 0x28, 0x0d, 0x52, 0x06, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, 0x2f, 0x0a, 0x06, 0x6c, 0x61, - 0x62, 0x65, 0x6c, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, - 0x75, 0x63, 0x74, 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x67, - 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xf2, 0x02, 0x0a, 0x1c, 0x47, - 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x41, 0x6e, - 0x64, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, - 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, - 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x65, 0x6c, - 0x65, 0x61, 0x73, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, - 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x12, - 0x38, 0x0a, 0x09, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x62, 0x74, 0x76, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x09, - 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x6c, 0x6c, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x61, 0x6c, 0x6c, 0x12, 0x2a, 0x0a, 0x11, 0x67, - 0x72, 0x61, 0x79, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x5f, 0x6d, 0x6f, 0x64, 0x65, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x67, 0x72, 0x61, 0x79, 0x50, 0x75, 0x62, 0x6c, - 0x69, 0x73, 0x68, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x67, 0x72, 0x6f, 0x75, 0x70, - 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, - 0x2f, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, - 0x12, 0x1d, 0x0a, 0x0a, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0a, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x22, - 0x7b, 0x0a, 0x0b, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, 0x73, 0x70, 0x12, 0x41, - 0x0a, 0x1d, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x5f, 0x73, 0x74, 0x72, 0x61, - 0x74, 0x65, 0x67, 0x79, 0x5f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x1a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, - 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x49, - 0x64, 0x12, 0x29, 0x0a, 0x10, 0x68, 0x61, 0x76, 0x65, 0x5f, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x61, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x68, 0x61, 0x76, - 0x65, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x22, 0x9b, 0x01, 0x0a, - 0x10, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, + 0x70, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x41, 0x70, 0x70, 0x73, 0x44, 0x61, 0x74, + 0x61, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x1a, 0xa7, 0x01, 0x0a, 0x19, 0x4c, + 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, + 0x41, 0x70, 0x70, 0x73, 0x44, 0x61, 0x74, 0x61, 0x12, 0x15, 0x0a, 0x06, 0x61, 0x70, 0x70, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x12, + 0x19, 0x0a, 0x08, 0x61, 0x70, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x61, 0x70, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, + 0x6c, 0x65, 0x61, 0x73, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, + 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x65, 0x6c, + 0x65, 0x61, 0x73, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, + 0x65, 0x64, 0x69, 0x74, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x65, 0x64, + 0x69, 0x74, 0x65, 0x64, 0x22, 0xad, 0x02, 0x0a, 0x0a, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, + 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x61, 0x70, + 0x70, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, + 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x5f, 0x69, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x49, 0x64, + 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x65, 0x6d, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6d, 0x65, 0x6d, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x6c, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x03, 0x61, 0x6c, 0x6c, 0x12, 0x2a, 0x0a, 0x11, 0x67, 0x72, 0x61, 0x79, 0x5f, 0x70, + 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0f, 0x67, 0x72, 0x61, 0x79, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x4d, 0x6f, + 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x16, 0x0a, 0x06, + 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x06, 0x67, 0x72, + 0x6f, 0x75, 0x70, 0x73, 0x12, 0x2f, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x09, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x06, 0x6c, + 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, + 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xf2, 0x02, 0x0a, 0x1c, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, + 0x65, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x41, 0x6e, 0x64, 0x50, 0x75, 0x62, 0x6c, 0x69, + 0x73, 0x68, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, + 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x61, 0x70, + 0x70, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x6c, 0x65, 0x61, + 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, + 0x65, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, + 0x6c, 0x65, 0x61, 0x73, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x12, 0x38, 0x0a, 0x09, 0x76, 0x61, 0x72, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, + 0x62, 0x74, 0x76, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x09, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, + 0x6c, 0x65, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x6c, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x03, 0x61, 0x6c, 0x6c, 0x12, 0x2a, 0x0a, 0x11, 0x67, 0x72, 0x61, 0x79, 0x5f, 0x70, 0x75, + 0x62, 0x6c, 0x69, 0x73, 0x68, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0f, 0x67, 0x72, 0x61, 0x79, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x4d, 0x6f, 0x64, + 0x65, 0x12, 0x16, 0x0a, 0x06, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x06, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, 0x2f, 0x0a, 0x06, 0x6c, 0x61, 0x62, + 0x65, 0x6c, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x67, 0x72, + 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x7b, 0x0a, 0x0b, 0x50, 0x75, 0x62, + 0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, 0x73, 0x70, 0x12, 0x41, 0x0a, 0x1d, 0x70, 0x75, 0x62, 0x6c, + 0x69, 0x73, 0x68, 0x65, 0x64, 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x5f, 0x68, + 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x1a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, + 0x67, 0x79, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x49, 0x64, 0x12, 0x29, 0x0a, 0x10, 0x68, + 0x61, 0x76, 0x65, 0x5f, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x68, 0x61, 0x76, 0x65, 0x43, 0x72, 0x65, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x22, 0x9b, 0x01, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x49, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x12, 0x23, 0x0a, 0x0d, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x24, + 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, + 0x62, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x42, 0x61, 0x73, 0x65, 0x50, 0x61, 0x67, 0x65, 0x52, 0x04, + 0x70, 0x61, 0x67, 0x65, 0x22, 0x5b, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, + 0x30, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x16, 0x2e, 0x70, 0x62, 0x64, 0x73, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, + 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, + 0x73, 0x22, 0x36, 0x0a, 0x10, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x4d, 0x0a, 0x14, 0x46, 0x65, 0x74, + 0x63, 0x68, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, - 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x61, 0x72, - 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x72, 0x65, 0x6e, - 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x72, 0x65, - 0x6e, 0x74, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x62, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x42, 0x61, 0x73, 0x65, - 0x50, 0x61, 0x67, 0x65, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x22, 0x5b, 0x0a, 0x11, 0x4c, 0x69, - 0x73, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, - 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x70, 0x62, 0x64, 0x73, 0x2e, 0x49, 0x6e, - 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x07, - 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x36, 0x0a, 0x10, 0x49, 0x6e, 0x73, 0x74, 0x61, - 0x6e, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, - 0x4d, 0x0a, 0x14, 0x46, 0x65, 0x74, 0x63, 0x68, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, - 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, 0x03, - 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x69, 0x64, 0x73, 0x22, 0x45, - 0x0a, 0x15, 0x46, 0x65, 0x74, 0x63, 0x68, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x12, 0x2c, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, - 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x70, 0x62, 0x64, 0x73, 0x2e, - 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x64, 0x65, - 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x71, 0x0a, 0x0c, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, - 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, - 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x61, 0x70, 0x70, 0x72, - 0x6f, 0x76, 0x65, 0x72, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x61, 0x70, 0x70, 0x72, - 0x6f, 0x76, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x22, 0x1d, 0x0a, 0x07, 0x50, 0x69, 0x6e, 0x67, - 0x4d, 0x73, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x63, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x4b, 0x76, 0x52, 0x65, 0x71, 0x12, 0x32, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, - 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x70, 0x62, 0x6b, + 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x03, 0x69, 0x64, 0x73, 0x22, 0x45, 0x0a, 0x15, 0x46, 0x65, 0x74, 0x63, + 0x68, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, + 0x70, 0x12, 0x2c, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x70, 0x62, 0x64, 0x73, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, + 0x71, 0x0a, 0x0c, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, + 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x72, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x72, 0x12, 0x12, + 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, + 0x74, 0x68, 0x22, 0x1d, 0x0a, 0x07, 0x50, 0x69, 0x6e, 0x67, 0x4d, 0x73, 0x67, 0x12, 0x12, 0x0a, + 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, + 0x61, 0x22, 0x63, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, 0x76, 0x52, 0x65, 0x71, + 0x12, 0x32, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x70, 0x62, 0x6b, 0x76, 0x2e, 0x4b, 0x76, 0x41, 0x74, + 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, + 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x70, 0x62, 0x6b, 0x76, 0x2e, 0x4b, 0x76, 0x53, 0x70, 0x65, 0x63, + 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x22, 0x73, 0x0a, 0x0b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x4b, 0x76, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x32, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, + 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x70, 0x62, 0x6b, 0x76, + 0x2e, 0x4b, 0x76, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x61, + 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x0a, 0x04, 0x73, 0x70, 0x65, + 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x70, 0x62, 0x6b, 0x76, 0x2e, 0x4b, + 0x76, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x22, 0x86, 0x03, 0x0a, 0x0a, + 0x4c, 0x69, 0x73, 0x74, 0x4b, 0x76, 0x73, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, + 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, + 0x64, 0x12, 0x15, 0x0a, 0x06, 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x6c, 0x6c, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x61, 0x6c, 0x6c, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, + 0x61, 0x72, 0x63, 0x68, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x65, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x77, 0x69, 0x74, 0x68, 0x5f, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x77, 0x69, + 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x65, 0x61, 0x72, + 0x63, 0x68, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0c, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x21, 0x0a, + 0x0c, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x0a, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x12, 0x17, 0x0a, 0x07, 0x6b, 0x76, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x0b, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x06, 0x6b, 0x76, 0x54, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x6f, 0x72, + 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x12, 0x14, 0x0a, + 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, 0x72, + 0x64, 0x65, 0x72, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x6f, 0x70, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x0e, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x6f, 0x70, 0x49, 0x64, 0x73, 0x12, 0x16, 0x0a, 0x06, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0f, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x22, 0x47, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x4b, 0x76, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x22, 0x0a, 0x07, 0x64, 0x65, 0x74, + 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x70, 0x62, 0x6b, + 0x76, 0x2e, 0x4b, 0x76, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x73, 0x0a, + 0x0b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x76, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x20, 0x0a, 0x04, + 0x73, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x70, 0x62, 0x6b, + 0x76, 0x2e, 0x4b, 0x76, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x12, 0x32, + 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x70, 0x62, 0x6b, 0x76, 0x2e, 0x4b, 0x76, 0x41, 0x74, 0x74, 0x61, + 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, + 0x6e, 0x74, 0x22, 0xf6, 0x01, 0x0a, 0x11, 0x42, 0x61, 0x74, 0x63, 0x68, 0x55, 0x70, 0x73, 0x65, + 0x72, 0x74, 0x4b, 0x76, 0x73, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, + 0x15, 0x0a, 0x06, 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x12, 0x2c, 0x0a, 0x03, 0x6b, 0x76, 0x73, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x62, 0x64, 0x73, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, + 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x4b, 0x76, 0x73, 0x52, 0x65, 0x71, 0x2e, 0x4b, 0x76, 0x52, + 0x03, 0x6b, 0x76, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x5f, + 0x61, 0x6c, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6c, 0x61, + 0x63, 0x65, 0x41, 0x6c, 0x6c, 0x1a, 0x64, 0x0a, 0x02, 0x4b, 0x76, 0x12, 0x37, 0x0a, 0x0d, 0x6b, + 0x76, 0x5f, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x70, 0x62, 0x6b, 0x76, 0x2e, 0x4b, 0x76, 0x41, 0x74, 0x74, 0x61, + 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0c, 0x6b, 0x76, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, + 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x25, 0x0a, 0x07, 0x6b, 0x76, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x70, 0x62, 0x6b, 0x76, 0x2e, 0x4b, 0x76, 0x53, + 0x70, 0x65, 0x63, 0x52, 0x06, 0x6b, 0x76, 0x53, 0x70, 0x65, 0x63, 0x22, 0x26, 0x0a, 0x12, 0x42, + 0x61, 0x74, 0x63, 0x68, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x4b, 0x76, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x12, 0x10, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x03, + 0x69, 0x64, 0x73, 0x22, 0x75, 0x0a, 0x0d, 0x55, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, + 0x76, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x02, 0x69, 0x64, 0x12, 0x20, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x70, 0x62, 0x6b, 0x76, 0x2e, 0x4b, 0x76, 0x53, 0x70, 0x65, 0x63, + 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x12, 0x32, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, + 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x70, 0x62, 0x6b, 0x76, 0x2e, 0x4b, 0x76, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, - 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x0a, 0x04, 0x73, 0x70, - 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x70, 0x62, 0x6b, 0x76, 0x2e, - 0x4b, 0x76, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x22, 0x73, 0x0a, 0x0b, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4b, 0x76, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x32, 0x0a, 0x0a, 0x61, - 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x12, 0x2e, 0x70, 0x62, 0x6b, 0x76, 0x2e, 0x4b, 0x76, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x12, - 0x20, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, - 0x70, 0x62, 0x6b, 0x76, 0x2e, 0x4b, 0x76, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, - 0x63, 0x22, 0x86, 0x03, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x4b, 0x76, 0x73, 0x52, 0x65, 0x71, - 0x12, 0x15, 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x05, 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x61, 0x70, 0x70, 0x5f, 0x69, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x12, 0x10, - 0x0a, 0x03, 0x61, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x61, 0x6c, 0x6c, - 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x65, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1f, 0x0a, - 0x0b, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0a, 0x77, 0x69, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x23, - 0x0a, 0x0d, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x46, 0x69, 0x65, - 0x6c, 0x64, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x61, 0x72, 0x63, - 0x68, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x6b, 0x76, 0x5f, 0x74, 0x79, 0x70, - 0x65, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x6b, 0x76, 0x54, 0x79, 0x70, 0x65, 0x12, - 0x12, 0x0a, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, - 0x6f, 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x0d, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x6f, 0x70, - 0x5f, 0x69, 0x64, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x6f, 0x70, 0x49, - 0x64, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0f, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x47, 0x0a, 0x0b, 0x4c, 0x69, - 0x73, 0x74, 0x4b, 0x76, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, - 0x22, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x08, 0x2e, 0x70, 0x62, 0x6b, 0x76, 0x2e, 0x4b, 0x76, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, - 0x69, 0x6c, 0x73, 0x22, 0x73, 0x0a, 0x0b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x76, 0x52, - 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, - 0x69, 0x64, 0x12, 0x20, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x0c, 0x2e, 0x70, 0x62, 0x6b, 0x76, 0x2e, 0x4b, 0x76, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, - 0x73, 0x70, 0x65, 0x63, 0x12, 0x32, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, - 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x70, 0x62, 0x6b, 0x76, 0x2e, - 0x4b, 0x76, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x61, 0x74, - 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0xf6, 0x01, 0x0a, 0x11, 0x42, 0x61, 0x74, - 0x63, 0x68, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x4b, 0x76, 0x73, 0x52, 0x65, 0x71, 0x12, 0x15, - 0x0a, 0x06, 0x62, 0x69, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, - 0x62, 0x69, 0x7a, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x12, 0x2c, 0x0a, 0x03, - 0x6b, 0x76, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x62, 0x64, 0x73, - 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x4b, 0x76, 0x73, 0x52, - 0x65, 0x71, 0x2e, 0x4b, 0x76, 0x52, 0x03, 0x6b, 0x76, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, - 0x70, 0x6c, 0x61, 0x63, 0x65, 0x5f, 0x61, 0x6c, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0a, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x41, 0x6c, 0x6c, 0x1a, 0x64, 0x0a, 0x02, 0x4b, - 0x76, 0x12, 0x37, 0x0a, 0x0d, 0x6b, 0x76, 0x5f, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, - 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x70, 0x62, 0x6b, 0x76, 0x2e, - 0x4b, 0x76, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0c, 0x6b, 0x76, - 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x25, 0x0a, 0x07, 0x6b, 0x76, - 0x5f, 0x73, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x70, 0x62, - 0x6b, 0x76, 0x2e, 0x4b, 0x76, 0x53, 0x70, 0x65, 0x63, 0x52, 0x06, 0x6b, 0x76, 0x53, 0x70, 0x65, - 0x63, 0x22, 0x26, 0x0a, 0x12, 0x42, 0x61, 0x74, 0x63, 0x68, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, - 0x4b, 0x76, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x10, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0d, 0x52, 0x03, 0x69, 0x64, 0x73, 0x22, 0x75, 0x0a, 0x0d, 0x55, 0x6e, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x76, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x20, 0x0a, 0x04, 0x73, 0x70, - 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x70, 0x62, 0x6b, 0x76, 0x2e, - 0x4b, 0x76, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x12, 0x32, 0x0a, 0x0a, - 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x12, 0x2e, 0x70, 0x62, 0x6b, 0x76, 0x2e, 0x4b, 0x76, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, - 0x32, 0xe9, 0x54, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x33, 0x0a, 0x09, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x93, 0x01, 0x0a, 0x1b, 0x42, + 0x61, 0x74, 0x63, 0x68, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x12, 0x33, 0x0a, 0x0c, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x10, 0x2e, 0x70, 0x62, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x52, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x12, + 0x3f, 0x0a, 0x12, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, + 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x70, 0x62, + 0x63, 0x65, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x10, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x49, 0x74, 0x65, 0x6d, 0x73, + 0x22, 0x1e, 0x0a, 0x1c, 0x42, 0x61, 0x74, 0x63, 0x68, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x43, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x32, 0xce, 0x55, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x33, 0x0a, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x70, 0x70, 0x12, 0x12, 0x2e, 0x70, 0x62, 0x64, 0x73, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x70, 0x70, 0x52, 0x65, 0x71, 0x1a, 0x10, 0x2e, 0x70, 0x62, 0x64, 0x73, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x12, 0x2d, @@ -17301,13 +17413,20 @@ var file_data_service_proto_rawDesc = []byte{ 0x73, 0x70, 0x22, 0x00, 0x12, 0x36, 0x0a, 0x04, 0x50, 0x69, 0x6e, 0x67, 0x12, 0x0d, 0x2e, 0x70, 0x62, 0x64, 0x73, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x4d, 0x73, 0x67, 0x1a, 0x0d, 0x2e, 0x70, 0x62, 0x64, 0x73, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x4d, 0x73, 0x67, 0x22, 0x10, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x0a, 0x3a, 0x01, 0x2a, 0x22, 0x05, 0x2f, 0x70, 0x69, 0x6e, 0x67, 0x42, 0x58, 0x5a, 0x56, - 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x54, 0x65, 0x6e, 0x63, 0x65, - 0x6e, 0x74, 0x42, 0x6c, 0x75, 0x65, 0x4b, 0x69, 0x6e, 0x67, 0x2f, 0x62, 0x6b, 0x2d, 0x62, 0x63, - 0x73, 0x2f, 0x62, 0x63, 0x73, 0x2d, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x62, - 0x63, 0x73, 0x2d, 0x62, 0x73, 0x63, 0x70, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x3b, 0x70, 0x62, 0x64, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x02, 0x0a, 0x3a, 0x01, 0x2a, 0x22, 0x05, 0x2f, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x63, 0x0a, 0x18, + 0x42, 0x61, 0x74, 0x63, 0x68, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x43, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x21, 0x2e, 0x70, 0x62, 0x64, 0x73, 0x2e, + 0x42, 0x61, 0x74, 0x63, 0x68, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x43, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x22, 0x2e, 0x70, 0x62, + 0x64, 0x73, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x43, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x22, + 0x00, 0x42, 0x58, 0x5a, 0x56, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x54, 0x65, 0x6e, 0x63, 0x65, 0x6e, 0x74, 0x42, 0x6c, 0x75, 0x65, 0x4b, 0x69, 0x6e, 0x67, 0x2f, + 0x62, 0x6b, 0x2d, 0x62, 0x63, 0x73, 0x2f, 0x62, 0x63, 0x73, 0x2d, 0x73, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x2f, 0x62, 0x63, 0x73, 0x2d, 0x62, 0x73, 0x63, 0x70, 0x2f, 0x70, 0x6b, 0x67, + 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x3b, 0x70, 0x62, 0x64, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, } var ( @@ -17322,7 +17441,7 @@ func file_data_service_proto_rawDescGZIP() []byte { return file_data_service_proto_rawDescData } -var file_data_service_proto_msgTypes = make([]protoimpl.MessageInfo, 232) +var file_data_service_proto_msgTypes = make([]protoimpl.MessageInfo, 234) var file_data_service_proto_goTypes = []interface{}{ (*UpdateCredentialScopesReq)(nil), // 0: pbds.UpdateCredentialScopesReq (*UpdateCredentialScopesResp)(nil), // 1: pbds.UpdateCredentialScopesResp @@ -17541,552 +17660,560 @@ var file_data_service_proto_goTypes = []interface{}{ (*BatchUpsertKvsReq)(nil), // 214: pbds.BatchUpsertKvsReq (*BatchUpsertKvsResp)(nil), // 215: pbds.BatchUpsertKvsResp (*UnDeleteKvReq)(nil), // 216: pbds.UnDeleteKvReq - (*BatchUpsertConfigItemsReq_ConfigItem)(nil), // 217: pbds.BatchUpsertConfigItemsReq.ConfigItem - (*ListConfigItemByTupleReq_Item)(nil), // 218: pbds.ListConfigItemByTupleReq.Item - (*GetHookInfoSpec_Releases)(nil), // 219: pbds.GetHookInfoSpec.Releases - (*ListHooksResp_Detail)(nil), // 220: pbds.ListHooksResp.Detail - (*ListHookReferencesResp_Detail)(nil), // 221: pbds.ListHookReferencesResp.Detail - (*ListHookRevisionsResp_ListHookRevisionsData)(nil), // 222: pbds.ListHookRevisionsResp.ListHookRevisionsData - (*ListHookRevisionReferencesResp_Detail)(nil), // 223: pbds.ListHookRevisionReferencesResp.Detail - (*GetReleaseHookResp_Hook)(nil), // 224: pbds.GetReleaseHookResp.Hook - (*ListTemplateByTupleReq_Item)(nil), // 225: pbds.ListTemplateByTupleReq.Item - (*ListTemplateByTupleReqResp_Item)(nil), // 226: pbds.ListTemplateByTupleReqResp.Item - (*BatchUpsertTemplatesReq_Item)(nil), // 227: pbds.BatchUpsertTemplatesReq.Item - (*ListAppGroupsResp_ListAppGroupsData)(nil), // 228: pbds.ListAppGroupsResp.ListAppGroupsData - (*CountGroupsReleasedAppsResp_CountGroupsReleasedAppsData)(nil), // 229: pbds.CountGroupsReleasedAppsResp.CountGroupsReleasedAppsData - (*ListGroupReleasedAppsResp_ListGroupReleasedAppsData)(nil), // 230: pbds.ListGroupReleasedAppsResp.ListGroupReleasedAppsData - (*BatchUpsertKvsReq_Kv)(nil), // 231: pbds.BatchUpsertKvsReq.Kv - (*credential_scope.CredentialScopeSpec)(nil), // 232: pbcrs.CredentialScopeSpec - (*credential_scope.UpdateScopeSpec)(nil), // 233: pbcrs.UpdateScopeSpec - (*credential_scope.CredentialScopeAttachment)(nil), // 234: pbcrs.CredentialScopeAttachment - (*credential_scope.CredentialScopeList)(nil), // 235: pbcrs.CredentialScopeList - (*credential.CredentialAttachment)(nil), // 236: pbcredential.CredentialAttachment - (*credential.CredentialSpec)(nil), // 237: pbcredential.CredentialSpec - (*credential.CredentialList)(nil), // 238: pbcredential.CredentialList - (*app.AppSpec)(nil), // 239: pbapp.AppSpec - (*app.App)(nil), // 240: pbapp.App - (*config_item.ConfigItemAttachment)(nil), // 241: pbci.ConfigItemAttachment - (*config_item.ConfigItemSpec)(nil), // 242: pbci.ConfigItemSpec - (*content.ContentSpec)(nil), // 243: pbcontent.ContentSpec - (*config_item.ConfigItem)(nil), // 244: pbci.ConfigItem - (*released_ci.ReleasedConfigItem)(nil), // 245: pbrci.ReleasedConfigItem - (*config_item.ListConfigItemCounts)(nil), // 246: pbci.ListConfigItemCounts - (*content.ContentAttachment)(nil), // 247: pbcontent.ContentAttachment - (*commit.CommitAttachment)(nil), // 248: pbcommit.CommitAttachment - (*release.ReleaseAttachment)(nil), // 249: pbrelease.ReleaseAttachment - (*release.ReleaseSpec)(nil), // 250: pbrelease.ReleaseSpec - (*template_variable.TemplateVariableSpec)(nil), // 251: pbtv.TemplateVariableSpec - (*release.Release)(nil), // 252: pbrelease.Release - (*released_kv.ReleasedKv)(nil), // 253: pbrkv.ReleasedKv - (*hook.HookAttachment)(nil), // 254: pbhook.HookAttachment - (*hook.HookSpec)(nil), // 255: pbhook.HookSpec - (*base.Revision)(nil), // 256: pbbase.Revision - (*hook.CountHookTags)(nil), // 257: pbhook.CountHookTags - (*hook_revision.HookRevisionAttachment)(nil), // 258: pbhr.HookRevisionAttachment - (*hook_revision.HookRevisionSpec)(nil), // 259: pbhr.HookRevisionSpec - (*template_space.TemplateSpaceAttachment)(nil), // 260: pbts.TemplateSpaceAttachment - (*template_space.TemplateSpaceSpec)(nil), // 261: pbts.TemplateSpaceSpec - (*template_space.TemplateSpace)(nil), // 262: pbts.TemplateSpace - (*template.TemplateAttachment)(nil), // 263: pbtemplate.TemplateAttachment - (*template.TemplateSpec)(nil), // 264: pbtemplate.TemplateSpec - (*template_revision.TemplateRevisionSpec)(nil), // 265: pbtr.TemplateRevisionSpec - (*template.Template)(nil), // 266: pbtemplate.Template - (*template_revision.TemplateRevisionAttachment)(nil), // 267: pbtr.TemplateRevisionAttachment - (*template_revision.TemplateRevision)(nil), // 268: pbtr.TemplateRevision - (*template_revision.TemplateRevisionNamesDetail)(nil), // 269: pbtr.TemplateRevisionNamesDetail - (*template_set.TemplateSetAttachment)(nil), // 270: pbtset.TemplateSetAttachment - (*template_set.TemplateSetSpec)(nil), // 271: pbtset.TemplateSetSpec - (*template_set.TemplateSet)(nil), // 272: pbtset.TemplateSet - (*template_set.TemplateSetBriefInfo)(nil), // 273: pbtset.TemplateSetBriefInfo - (*template_set.TemplateSetOfBizDetail)(nil), // 274: pbtset.TemplateSetOfBizDetail - (*app_template_binding.AppTemplateBindingAttachment)(nil), // 275: pbatb.AppTemplateBindingAttachment - (*app_template_binding.AppTemplateBindingSpec)(nil), // 276: pbatb.AppTemplateBindingSpec - (*app_template_binding.AppTemplateBinding)(nil), // 277: pbatb.AppTemplateBinding - (*app_template_binding.AppBoundTmplRevision)(nil), // 278: pbatb.AppBoundTmplRevision - (*app_template_binding.ReleasedAppBoundTmplRevision)(nil), // 279: pbatb.ReleasedAppBoundTmplRevision - (*app_template_binding.Conflict)(nil), // 280: pbatb.Conflict - (*app_template_variable.AppTemplateVariableReference)(nil), // 281: pbatv.AppTemplateVariableReference - (*app_template_variable.AppTemplateVariableAttachment)(nil), // 282: pbatv.AppTemplateVariableAttachment - (*app_template_variable.AppTemplateVariableSpec)(nil), // 283: pbatv.AppTemplateVariableSpec - (*template_binding_relation.TemplateBoundCounts)(nil), // 284: pbtbr.TemplateBoundCounts - (*template_binding_relation.TemplateRevisionBoundCounts)(nil), // 285: pbtbr.TemplateRevisionBoundCounts - (*template_binding_relation.TemplateSetBoundCounts)(nil), // 286: pbtbr.TemplateSetBoundCounts - (*template_binding_relation.TemplateBoundUnnamedAppDetail)(nil), // 287: pbtbr.TemplateBoundUnnamedAppDetail - (*template_binding_relation.TemplateBoundNamedAppDetail)(nil), // 288: pbtbr.TemplateBoundNamedAppDetail - (*template_binding_relation.TemplateBoundTemplateSetDetail)(nil), // 289: pbtbr.TemplateBoundTemplateSetDetail - (*template_binding_relation.MultiTemplateBoundTemplateSetDetail)(nil), // 290: pbtbr.MultiTemplateBoundTemplateSetDetail - (*template_binding_relation.TemplateRevisionBoundUnnamedAppDetail)(nil), // 291: pbtbr.TemplateRevisionBoundUnnamedAppDetail - (*template_binding_relation.TemplateRevisionBoundNamedAppDetail)(nil), // 292: pbtbr.TemplateRevisionBoundNamedAppDetail - (*template_binding_relation.TemplateSetBoundUnnamedAppDetail)(nil), // 293: pbtbr.TemplateSetBoundUnnamedAppDetail - (*template_binding_relation.MultiTemplateSetBoundUnnamedAppDetail)(nil), // 294: pbtbr.MultiTemplateSetBoundUnnamedAppDetail - (*template_binding_relation.TemplateSetBoundNamedAppDetail)(nil), // 295: pbtbr.TemplateSetBoundNamedAppDetail - (*template_binding_relation.LatestTemplateBoundUnnamedAppDetail)(nil), // 296: pbtbr.LatestTemplateBoundUnnamedAppDetail - (*template_variable.TemplateVariableAttachment)(nil), // 297: pbtv.TemplateVariableAttachment - (*template_variable.TemplateVariable)(nil), // 298: pbtv.TemplateVariable - (*group.GroupAttachment)(nil), // 299: pbgroup.GroupAttachment - (*group.GroupSpec)(nil), // 300: pbgroup.GroupSpec - (*group.Group)(nil), // 301: pbgroup.Group - (*structpb.Struct)(nil), // 302: google.protobuf.Struct - (*base.BasePage)(nil), // 303: pbbase.BasePage - (*kv.KvAttachment)(nil), // 304: pbkv.KvAttachment - (*kv.KvSpec)(nil), // 305: pbkv.KvSpec - (*kv.Kv)(nil), // 306: pbkv.Kv - (*hook.Hook)(nil), // 307: pbhook.Hook - (*hook_revision.HookRevision)(nil), // 308: pbhr.HookRevision - (*base.EmptyReq)(nil), // 309: pbbase.EmptyReq - (*base.EmptyResp)(nil), // 310: pbbase.EmptyResp - (*content.Content)(nil), // 311: pbcontent.Content - (*commit.Commit)(nil), // 312: pbcommit.Commit + (*BatchUpsertClientMetricsReq)(nil), // 217: pbds.BatchUpsertClientMetricsReq + (*BatchUpsertClientMetricsResp)(nil), // 218: pbds.BatchUpsertClientMetricsResp + (*BatchUpsertConfigItemsReq_ConfigItem)(nil), // 219: pbds.BatchUpsertConfigItemsReq.ConfigItem + (*ListConfigItemByTupleReq_Item)(nil), // 220: pbds.ListConfigItemByTupleReq.Item + (*GetHookInfoSpec_Releases)(nil), // 221: pbds.GetHookInfoSpec.Releases + (*ListHooksResp_Detail)(nil), // 222: pbds.ListHooksResp.Detail + (*ListHookReferencesResp_Detail)(nil), // 223: pbds.ListHookReferencesResp.Detail + (*ListHookRevisionsResp_ListHookRevisionsData)(nil), // 224: pbds.ListHookRevisionsResp.ListHookRevisionsData + (*ListHookRevisionReferencesResp_Detail)(nil), // 225: pbds.ListHookRevisionReferencesResp.Detail + (*GetReleaseHookResp_Hook)(nil), // 226: pbds.GetReleaseHookResp.Hook + (*ListTemplateByTupleReq_Item)(nil), // 227: pbds.ListTemplateByTupleReq.Item + (*ListTemplateByTupleReqResp_Item)(nil), // 228: pbds.ListTemplateByTupleReqResp.Item + (*BatchUpsertTemplatesReq_Item)(nil), // 229: pbds.BatchUpsertTemplatesReq.Item + (*ListAppGroupsResp_ListAppGroupsData)(nil), // 230: pbds.ListAppGroupsResp.ListAppGroupsData + (*CountGroupsReleasedAppsResp_CountGroupsReleasedAppsData)(nil), // 231: pbds.CountGroupsReleasedAppsResp.CountGroupsReleasedAppsData + (*ListGroupReleasedAppsResp_ListGroupReleasedAppsData)(nil), // 232: pbds.ListGroupReleasedAppsResp.ListGroupReleasedAppsData + (*BatchUpsertKvsReq_Kv)(nil), // 233: pbds.BatchUpsertKvsReq.Kv + (*credential_scope.CredentialScopeSpec)(nil), // 234: pbcrs.CredentialScopeSpec + (*credential_scope.UpdateScopeSpec)(nil), // 235: pbcrs.UpdateScopeSpec + (*credential_scope.CredentialScopeAttachment)(nil), // 236: pbcrs.CredentialScopeAttachment + (*credential_scope.CredentialScopeList)(nil), // 237: pbcrs.CredentialScopeList + (*credential.CredentialAttachment)(nil), // 238: pbcredential.CredentialAttachment + (*credential.CredentialSpec)(nil), // 239: pbcredential.CredentialSpec + (*credential.CredentialList)(nil), // 240: pbcredential.CredentialList + (*app.AppSpec)(nil), // 241: pbapp.AppSpec + (*app.App)(nil), // 242: pbapp.App + (*config_item.ConfigItemAttachment)(nil), // 243: pbci.ConfigItemAttachment + (*config_item.ConfigItemSpec)(nil), // 244: pbci.ConfigItemSpec + (*content.ContentSpec)(nil), // 245: pbcontent.ContentSpec + (*config_item.ConfigItem)(nil), // 246: pbci.ConfigItem + (*released_ci.ReleasedConfigItem)(nil), // 247: pbrci.ReleasedConfigItem + (*config_item.ListConfigItemCounts)(nil), // 248: pbci.ListConfigItemCounts + (*content.ContentAttachment)(nil), // 249: pbcontent.ContentAttachment + (*commit.CommitAttachment)(nil), // 250: pbcommit.CommitAttachment + (*release.ReleaseAttachment)(nil), // 251: pbrelease.ReleaseAttachment + (*release.ReleaseSpec)(nil), // 252: pbrelease.ReleaseSpec + (*template_variable.TemplateVariableSpec)(nil), // 253: pbtv.TemplateVariableSpec + (*release.Release)(nil), // 254: pbrelease.Release + (*released_kv.ReleasedKv)(nil), // 255: pbrkv.ReleasedKv + (*hook.HookAttachment)(nil), // 256: pbhook.HookAttachment + (*hook.HookSpec)(nil), // 257: pbhook.HookSpec + (*base.Revision)(nil), // 258: pbbase.Revision + (*hook.CountHookTags)(nil), // 259: pbhook.CountHookTags + (*hook_revision.HookRevisionAttachment)(nil), // 260: pbhr.HookRevisionAttachment + (*hook_revision.HookRevisionSpec)(nil), // 261: pbhr.HookRevisionSpec + (*template_space.TemplateSpaceAttachment)(nil), // 262: pbts.TemplateSpaceAttachment + (*template_space.TemplateSpaceSpec)(nil), // 263: pbts.TemplateSpaceSpec + (*template_space.TemplateSpace)(nil), // 264: pbts.TemplateSpace + (*template.TemplateAttachment)(nil), // 265: pbtemplate.TemplateAttachment + (*template.TemplateSpec)(nil), // 266: pbtemplate.TemplateSpec + (*template_revision.TemplateRevisionSpec)(nil), // 267: pbtr.TemplateRevisionSpec + (*template.Template)(nil), // 268: pbtemplate.Template + (*template_revision.TemplateRevisionAttachment)(nil), // 269: pbtr.TemplateRevisionAttachment + (*template_revision.TemplateRevision)(nil), // 270: pbtr.TemplateRevision + (*template_revision.TemplateRevisionNamesDetail)(nil), // 271: pbtr.TemplateRevisionNamesDetail + (*template_set.TemplateSetAttachment)(nil), // 272: pbtset.TemplateSetAttachment + (*template_set.TemplateSetSpec)(nil), // 273: pbtset.TemplateSetSpec + (*template_set.TemplateSet)(nil), // 274: pbtset.TemplateSet + (*template_set.TemplateSetBriefInfo)(nil), // 275: pbtset.TemplateSetBriefInfo + (*template_set.TemplateSetOfBizDetail)(nil), // 276: pbtset.TemplateSetOfBizDetail + (*app_template_binding.AppTemplateBindingAttachment)(nil), // 277: pbatb.AppTemplateBindingAttachment + (*app_template_binding.AppTemplateBindingSpec)(nil), // 278: pbatb.AppTemplateBindingSpec + (*app_template_binding.AppTemplateBinding)(nil), // 279: pbatb.AppTemplateBinding + (*app_template_binding.AppBoundTmplRevision)(nil), // 280: pbatb.AppBoundTmplRevision + (*app_template_binding.ReleasedAppBoundTmplRevision)(nil), // 281: pbatb.ReleasedAppBoundTmplRevision + (*app_template_binding.Conflict)(nil), // 282: pbatb.Conflict + (*app_template_variable.AppTemplateVariableReference)(nil), // 283: pbatv.AppTemplateVariableReference + (*app_template_variable.AppTemplateVariableAttachment)(nil), // 284: pbatv.AppTemplateVariableAttachment + (*app_template_variable.AppTemplateVariableSpec)(nil), // 285: pbatv.AppTemplateVariableSpec + (*template_binding_relation.TemplateBoundCounts)(nil), // 286: pbtbr.TemplateBoundCounts + (*template_binding_relation.TemplateRevisionBoundCounts)(nil), // 287: pbtbr.TemplateRevisionBoundCounts + (*template_binding_relation.TemplateSetBoundCounts)(nil), // 288: pbtbr.TemplateSetBoundCounts + (*template_binding_relation.TemplateBoundUnnamedAppDetail)(nil), // 289: pbtbr.TemplateBoundUnnamedAppDetail + (*template_binding_relation.TemplateBoundNamedAppDetail)(nil), // 290: pbtbr.TemplateBoundNamedAppDetail + (*template_binding_relation.TemplateBoundTemplateSetDetail)(nil), // 291: pbtbr.TemplateBoundTemplateSetDetail + (*template_binding_relation.MultiTemplateBoundTemplateSetDetail)(nil), // 292: pbtbr.MultiTemplateBoundTemplateSetDetail + (*template_binding_relation.TemplateRevisionBoundUnnamedAppDetail)(nil), // 293: pbtbr.TemplateRevisionBoundUnnamedAppDetail + (*template_binding_relation.TemplateRevisionBoundNamedAppDetail)(nil), // 294: pbtbr.TemplateRevisionBoundNamedAppDetail + (*template_binding_relation.TemplateSetBoundUnnamedAppDetail)(nil), // 295: pbtbr.TemplateSetBoundUnnamedAppDetail + (*template_binding_relation.MultiTemplateSetBoundUnnamedAppDetail)(nil), // 296: pbtbr.MultiTemplateSetBoundUnnamedAppDetail + (*template_binding_relation.TemplateSetBoundNamedAppDetail)(nil), // 297: pbtbr.TemplateSetBoundNamedAppDetail + (*template_binding_relation.LatestTemplateBoundUnnamedAppDetail)(nil), // 298: pbtbr.LatestTemplateBoundUnnamedAppDetail + (*template_variable.TemplateVariableAttachment)(nil), // 299: pbtv.TemplateVariableAttachment + (*template_variable.TemplateVariable)(nil), // 300: pbtv.TemplateVariable + (*group.GroupAttachment)(nil), // 301: pbgroup.GroupAttachment + (*group.GroupSpec)(nil), // 302: pbgroup.GroupSpec + (*group.Group)(nil), // 303: pbgroup.Group + (*structpb.Struct)(nil), // 304: google.protobuf.Struct + (*base.BasePage)(nil), // 305: pbbase.BasePage + (*kv.KvAttachment)(nil), // 306: pbkv.KvAttachment + (*kv.KvSpec)(nil), // 307: pbkv.KvSpec + (*kv.Kv)(nil), // 308: pbkv.Kv + (*client.Client)(nil), // 309: pbclient.Client + (*client_event.ClientEvent)(nil), // 310: pbce.ClientEvent + (*hook.Hook)(nil), // 311: pbhook.Hook + (*hook_revision.HookRevision)(nil), // 312: pbhr.HookRevision + (*base.EmptyReq)(nil), // 313: pbbase.EmptyReq + (*base.EmptyResp)(nil), // 314: pbbase.EmptyResp + (*content.Content)(nil), // 315: pbcontent.Content + (*commit.Commit)(nil), // 316: pbcommit.Commit } var file_data_service_proto_depIdxs = []int32{ - 232, // 0: pbds.UpdateCredentialScopesReq.created:type_name -> pbcrs.CredentialScopeSpec - 233, // 1: pbds.UpdateCredentialScopesReq.updated:type_name -> pbcrs.UpdateScopeSpec - 234, // 2: pbds.DeleteCredentialScopesReq.attachment:type_name -> pbcrs.CredentialScopeAttachment - 235, // 3: pbds.ListCredentialScopesResp.details:type_name -> pbcrs.CredentialScopeList - 234, // 4: pbds.CreateCredentialScopeReq.attachment:type_name -> pbcrs.CredentialScopeAttachment - 236, // 5: pbds.CreateCredentialReq.attachment:type_name -> pbcredential.CredentialAttachment - 237, // 6: pbds.CreateCredentialReq.spec:type_name -> pbcredential.CredentialSpec - 238, // 7: pbds.ListCredentialResp.details:type_name -> pbcredential.CredentialList - 236, // 8: pbds.UpdateCredentialReq.attachment:type_name -> pbcredential.CredentialAttachment - 237, // 9: pbds.UpdateCredentialReq.spec:type_name -> pbcredential.CredentialSpec - 236, // 10: pbds.DeleteCredentialReq.attachment:type_name -> pbcredential.CredentialAttachment - 239, // 11: pbds.CreateAppReq.spec:type_name -> pbapp.AppSpec - 239, // 12: pbds.UpdateAppReq.spec:type_name -> pbapp.AppSpec - 240, // 13: pbds.ListAppsResp.details:type_name -> pbapp.App - 240, // 14: pbds.ListAppsByIDsResp.details:type_name -> pbapp.App - 241, // 15: pbds.CreateConfigItemReq.config_item_attachment:type_name -> pbci.ConfigItemAttachment - 242, // 16: pbds.CreateConfigItemReq.config_item_spec:type_name -> pbci.ConfigItemSpec - 243, // 17: pbds.CreateConfigItemReq.content_spec:type_name -> pbcontent.ContentSpec - 217, // 18: pbds.BatchUpsertConfigItemsReq.items:type_name -> pbds.BatchUpsertConfigItemsReq.ConfigItem - 241, // 19: pbds.UpdateConfigItemReq.attachment:type_name -> pbci.ConfigItemAttachment - 242, // 20: pbds.UpdateConfigItemReq.spec:type_name -> pbci.ConfigItemSpec - 241, // 21: pbds.DeleteConfigItemReq.attachment:type_name -> pbci.ConfigItemAttachment - 241, // 22: pbds.UnDeleteConfigItemReq.attachment:type_name -> pbci.ConfigItemAttachment - 241, // 23: pbds.UndoConfigItemReq.attachment:type_name -> pbci.ConfigItemAttachment - 244, // 24: pbds.ListConfigItemsResp.details:type_name -> pbci.ConfigItem - 245, // 25: pbds.ListReleasedConfigItemsResp.details:type_name -> pbrci.ReleasedConfigItem - 246, // 26: pbds.ListConfigItemCountResp.details:type_name -> pbci.ListConfigItemCounts - 218, // 27: pbds.ListConfigItemByTupleReq.items:type_name -> pbds.ListConfigItemByTupleReq.Item - 244, // 28: pbds.ListConfigItemByTupleResp.config_items:type_name -> pbci.ConfigItem - 247, // 29: pbds.CreateContentReq.attachment:type_name -> pbcontent.ContentAttachment - 243, // 30: pbds.CreateContentReq.spec:type_name -> pbcontent.ContentSpec - 248, // 31: pbds.CreateCommitReq.attachment:type_name -> pbcommit.CommitAttachment - 249, // 32: pbds.CreateReleaseReq.attachment:type_name -> pbrelease.ReleaseAttachment - 250, // 33: pbds.CreateReleaseReq.spec:type_name -> pbrelease.ReleaseSpec - 251, // 34: pbds.CreateReleaseReq.variables:type_name -> pbtv.TemplateVariableSpec - 252, // 35: pbds.ListReleasesResp.details:type_name -> pbrelease.Release - 253, // 36: pbds.ListReleasedKvResp.details:type_name -> pbrkv.ReleasedKv - 254, // 37: pbds.CreateHookReq.attachment:type_name -> pbhook.HookAttachment - 255, // 38: pbds.CreateHookReq.spec:type_name -> pbhook.HookSpec + 234, // 0: pbds.UpdateCredentialScopesReq.created:type_name -> pbcrs.CredentialScopeSpec + 235, // 1: pbds.UpdateCredentialScopesReq.updated:type_name -> pbcrs.UpdateScopeSpec + 236, // 2: pbds.DeleteCredentialScopesReq.attachment:type_name -> pbcrs.CredentialScopeAttachment + 237, // 3: pbds.ListCredentialScopesResp.details:type_name -> pbcrs.CredentialScopeList + 236, // 4: pbds.CreateCredentialScopeReq.attachment:type_name -> pbcrs.CredentialScopeAttachment + 238, // 5: pbds.CreateCredentialReq.attachment:type_name -> pbcredential.CredentialAttachment + 239, // 6: pbds.CreateCredentialReq.spec:type_name -> pbcredential.CredentialSpec + 240, // 7: pbds.ListCredentialResp.details:type_name -> pbcredential.CredentialList + 238, // 8: pbds.UpdateCredentialReq.attachment:type_name -> pbcredential.CredentialAttachment + 239, // 9: pbds.UpdateCredentialReq.spec:type_name -> pbcredential.CredentialSpec + 238, // 10: pbds.DeleteCredentialReq.attachment:type_name -> pbcredential.CredentialAttachment + 241, // 11: pbds.CreateAppReq.spec:type_name -> pbapp.AppSpec + 241, // 12: pbds.UpdateAppReq.spec:type_name -> pbapp.AppSpec + 242, // 13: pbds.ListAppsResp.details:type_name -> pbapp.App + 242, // 14: pbds.ListAppsByIDsResp.details:type_name -> pbapp.App + 243, // 15: pbds.CreateConfigItemReq.config_item_attachment:type_name -> pbci.ConfigItemAttachment + 244, // 16: pbds.CreateConfigItemReq.config_item_spec:type_name -> pbci.ConfigItemSpec + 245, // 17: pbds.CreateConfigItemReq.content_spec:type_name -> pbcontent.ContentSpec + 219, // 18: pbds.BatchUpsertConfigItemsReq.items:type_name -> pbds.BatchUpsertConfigItemsReq.ConfigItem + 243, // 19: pbds.UpdateConfigItemReq.attachment:type_name -> pbci.ConfigItemAttachment + 244, // 20: pbds.UpdateConfigItemReq.spec:type_name -> pbci.ConfigItemSpec + 243, // 21: pbds.DeleteConfigItemReq.attachment:type_name -> pbci.ConfigItemAttachment + 243, // 22: pbds.UnDeleteConfigItemReq.attachment:type_name -> pbci.ConfigItemAttachment + 243, // 23: pbds.UndoConfigItemReq.attachment:type_name -> pbci.ConfigItemAttachment + 246, // 24: pbds.ListConfigItemsResp.details:type_name -> pbci.ConfigItem + 247, // 25: pbds.ListReleasedConfigItemsResp.details:type_name -> pbrci.ReleasedConfigItem + 248, // 26: pbds.ListConfigItemCountResp.details:type_name -> pbci.ListConfigItemCounts + 220, // 27: pbds.ListConfigItemByTupleReq.items:type_name -> pbds.ListConfigItemByTupleReq.Item + 246, // 28: pbds.ListConfigItemByTupleResp.config_items:type_name -> pbci.ConfigItem + 249, // 29: pbds.CreateContentReq.attachment:type_name -> pbcontent.ContentAttachment + 245, // 30: pbds.CreateContentReq.spec:type_name -> pbcontent.ContentSpec + 250, // 31: pbds.CreateCommitReq.attachment:type_name -> pbcommit.CommitAttachment + 251, // 32: pbds.CreateReleaseReq.attachment:type_name -> pbrelease.ReleaseAttachment + 252, // 33: pbds.CreateReleaseReq.spec:type_name -> pbrelease.ReleaseSpec + 253, // 34: pbds.CreateReleaseReq.variables:type_name -> pbtv.TemplateVariableSpec + 254, // 35: pbds.ListReleasesResp.details:type_name -> pbrelease.Release + 255, // 36: pbds.ListReleasedKvResp.details:type_name -> pbrkv.ReleasedKv + 256, // 37: pbds.CreateHookReq.attachment:type_name -> pbhook.HookAttachment + 257, // 38: pbds.CreateHookReq.spec:type_name -> pbhook.HookSpec 63, // 39: pbds.GetHookResp.spec:type_name -> pbds.GetHookInfoSpec - 254, // 40: pbds.GetHookResp.attachment:type_name -> pbhook.HookAttachment - 256, // 41: pbds.GetHookResp.revision:type_name -> pbbase.Revision - 219, // 42: pbds.GetHookInfoSpec.releases:type_name -> pbds.GetHookInfoSpec.Releases - 220, // 43: pbds.ListHooksResp.details:type_name -> pbds.ListHooksResp.Detail - 257, // 44: pbds.ListHookTagResp.details:type_name -> pbhook.CountHookTags - 221, // 45: pbds.ListHookReferencesResp.details:type_name -> pbds.ListHookReferencesResp.Detail - 258, // 46: pbds.CreateHookRevisionReq.attachment:type_name -> pbhr.HookRevisionAttachment - 259, // 47: pbds.CreateHookRevisionReq.spec:type_name -> pbhr.HookRevisionSpec - 222, // 48: pbds.ListHookRevisionsResp.details:type_name -> pbds.ListHookRevisionsResp.ListHookRevisionsData - 258, // 49: pbds.UpdateHookRevisionReq.attachment:type_name -> pbhr.HookRevisionAttachment - 259, // 50: pbds.UpdateHookRevisionReq.spec:type_name -> pbhr.HookRevisionSpec - 223, // 51: pbds.ListHookRevisionReferencesResp.details:type_name -> pbds.ListHookRevisionReferencesResp.Detail - 224, // 52: pbds.GetReleaseHookResp.pre_hook:type_name -> pbds.GetReleaseHookResp.Hook - 224, // 53: pbds.GetReleaseHookResp.post_hook:type_name -> pbds.GetReleaseHookResp.Hook - 260, // 54: pbds.CreateTemplateSpaceReq.attachment:type_name -> pbts.TemplateSpaceAttachment - 261, // 55: pbds.CreateTemplateSpaceReq.spec:type_name -> pbts.TemplateSpaceSpec - 262, // 56: pbds.ListTemplateSpacesResp.details:type_name -> pbts.TemplateSpace - 260, // 57: pbds.UpdateTemplateSpaceReq.attachment:type_name -> pbts.TemplateSpaceAttachment - 261, // 58: pbds.UpdateTemplateSpaceReq.spec:type_name -> pbts.TemplateSpaceSpec - 260, // 59: pbds.DeleteTemplateSpaceReq.attachment:type_name -> pbts.TemplateSpaceAttachment - 262, // 60: pbds.ListTmplSpacesByIDsResp.details:type_name -> pbts.TemplateSpace - 263, // 61: pbds.CreateTemplateReq.attachment:type_name -> pbtemplate.TemplateAttachment - 264, // 62: pbds.CreateTemplateReq.spec:type_name -> pbtemplate.TemplateSpec - 265, // 63: pbds.CreateTemplateReq.tr_spec:type_name -> pbtr.TemplateRevisionSpec - 266, // 64: pbds.ListTemplatesResp.details:type_name -> pbtemplate.Template - 263, // 65: pbds.UpdateTemplateReq.attachment:type_name -> pbtemplate.TemplateAttachment - 264, // 66: pbds.UpdateTemplateReq.spec:type_name -> pbtemplate.TemplateSpec - 263, // 67: pbds.DeleteTemplateReq.attachment:type_name -> pbtemplate.TemplateAttachment - 263, // 68: pbds.BatchDeleteTemplateReq.attachment:type_name -> pbtemplate.TemplateAttachment - 266, // 69: pbds.ListTemplatesByIDsResp.details:type_name -> pbtemplate.Template - 266, // 70: pbds.ListTemplatesNotBoundResp.details:type_name -> pbtemplate.Template - 266, // 71: pbds.ListTmplsOfTmplSetResp.details:type_name -> pbtemplate.Template - 225, // 72: pbds.ListTemplateByTupleReq.items:type_name -> pbds.ListTemplateByTupleReq.Item - 226, // 73: pbds.ListTemplateByTupleReqResp.items:type_name -> pbds.ListTemplateByTupleReqResp.Item - 227, // 74: pbds.BatchUpsertTemplatesReq.items:type_name -> pbds.BatchUpsertTemplatesReq.Item - 267, // 75: pbds.CreateTemplateRevisionReq.attachment:type_name -> pbtr.TemplateRevisionAttachment - 265, // 76: pbds.CreateTemplateRevisionReq.spec:type_name -> pbtr.TemplateRevisionSpec - 268, // 77: pbds.ListTemplateRevisionsResp.details:type_name -> pbtr.TemplateRevision - 267, // 78: pbds.DeleteTemplateRevisionReq.attachment:type_name -> pbtr.TemplateRevisionAttachment - 268, // 79: pbds.ListTemplateRevisionsByIDsResp.details:type_name -> pbtr.TemplateRevision - 269, // 80: pbds.ListTmplRevisionNamesByTmplIDsResp.details:type_name -> pbtr.TemplateRevisionNamesDetail - 270, // 81: pbds.CreateTemplateSetReq.attachment:type_name -> pbtset.TemplateSetAttachment - 271, // 82: pbds.CreateTemplateSetReq.spec:type_name -> pbtset.TemplateSetSpec - 272, // 83: pbds.ListTemplateSetsResp.details:type_name -> pbtset.TemplateSet - 270, // 84: pbds.UpdateTemplateSetReq.attachment:type_name -> pbtset.TemplateSetAttachment - 271, // 85: pbds.UpdateTemplateSetReq.spec:type_name -> pbtset.TemplateSetSpec - 270, // 86: pbds.DeleteTemplateSetReq.attachment:type_name -> pbtset.TemplateSetAttachment - 272, // 87: pbds.ListAppTemplateSetsResp.details:type_name -> pbtset.TemplateSet - 272, // 88: pbds.ListTemplateSetsByIDsResp.details:type_name -> pbtset.TemplateSet - 273, // 89: pbds.ListTemplateSetBriefInfoByIDsResp.details:type_name -> pbtset.TemplateSetBriefInfo - 274, // 90: pbds.ListTmplSetsOfBizResp.details:type_name -> pbtset.TemplateSetOfBizDetail - 275, // 91: pbds.CreateAppTemplateBindingReq.attachment:type_name -> pbatb.AppTemplateBindingAttachment - 276, // 92: pbds.CreateAppTemplateBindingReq.spec:type_name -> pbatb.AppTemplateBindingSpec - 277, // 93: pbds.ListAppTemplateBindingsResp.details:type_name -> pbatb.AppTemplateBinding - 275, // 94: pbds.UpdateAppTemplateBindingReq.attachment:type_name -> pbatb.AppTemplateBindingAttachment - 276, // 95: pbds.UpdateAppTemplateBindingReq.spec:type_name -> pbatb.AppTemplateBindingSpec - 275, // 96: pbds.DeleteAppTemplateBindingReq.attachment:type_name -> pbatb.AppTemplateBindingAttachment - 278, // 97: pbds.ListAppBoundTmplRevisionsResp.details:type_name -> pbatb.AppBoundTmplRevision - 279, // 98: pbds.ListReleasedAppBoundTmplRevisionsResp.details:type_name -> pbatb.ReleasedAppBoundTmplRevision - 279, // 99: pbds.GetReleasedAppBoundTmplRevisionResp.detail:type_name -> pbatb.ReleasedAppBoundTmplRevision - 275, // 100: pbds.CheckAppTemplateBindingReq.attachment:type_name -> pbatb.AppTemplateBindingAttachment - 276, // 101: pbds.CheckAppTemplateBindingReq.spec:type_name -> pbatb.AppTemplateBindingSpec - 280, // 102: pbds.CheckAppTemplateBindingResp.details:type_name -> pbatb.Conflict - 281, // 103: pbds.GetAppTmplVariableRefsResp.details:type_name -> pbatv.AppTemplateVariableReference - 281, // 104: pbds.GetReleasedAppTmplVariableRefsResp.details:type_name -> pbatv.AppTemplateVariableReference - 282, // 105: pbds.UpdateAppTmplVariablesReq.attachment:type_name -> pbatv.AppTemplateVariableAttachment - 283, // 106: pbds.UpdateAppTmplVariablesReq.spec:type_name -> pbatv.AppTemplateVariableSpec - 251, // 107: pbds.ListAppTmplVariablesResp.details:type_name -> pbtv.TemplateVariableSpec - 251, // 108: pbds.ListReleasedAppTmplVariablesResp.details:type_name -> pbtv.TemplateVariableSpec - 284, // 109: pbds.ListTmplBoundCountsResp.details:type_name -> pbtbr.TemplateBoundCounts - 285, // 110: pbds.ListTmplRevisionBoundCountsResp.details:type_name -> pbtbr.TemplateRevisionBoundCounts - 286, // 111: pbds.ListTmplSetBoundCountsResp.details:type_name -> pbtbr.TemplateSetBoundCounts - 287, // 112: pbds.ListTmplBoundUnnamedAppsResp.details:type_name -> pbtbr.TemplateBoundUnnamedAppDetail - 288, // 113: pbds.ListTmplBoundNamedAppsResp.details:type_name -> pbtbr.TemplateBoundNamedAppDetail - 289, // 114: pbds.ListTmplBoundTmplSetsResp.details:type_name -> pbtbr.TemplateBoundTemplateSetDetail - 290, // 115: pbds.ListMultiTmplBoundTmplSetsResp.details:type_name -> pbtbr.MultiTemplateBoundTemplateSetDetail - 291, // 116: pbds.ListTmplRevisionBoundUnnamedAppsResp.details:type_name -> pbtbr.TemplateRevisionBoundUnnamedAppDetail - 292, // 117: pbds.ListTmplRevisionBoundNamedAppsResp.details:type_name -> pbtbr.TemplateRevisionBoundNamedAppDetail - 293, // 118: pbds.ListTmplSetBoundUnnamedAppsResp.details:type_name -> pbtbr.TemplateSetBoundUnnamedAppDetail - 294, // 119: pbds.ListMultiTmplSetBoundUnnamedAppsResp.details:type_name -> pbtbr.MultiTemplateSetBoundUnnamedAppDetail - 295, // 120: pbds.ListTmplSetBoundNamedAppsResp.details:type_name -> pbtbr.TemplateSetBoundNamedAppDetail - 296, // 121: pbds.ListLatestTmplBoundUnnamedAppsResp.details:type_name -> pbtbr.LatestTemplateBoundUnnamedAppDetail - 297, // 122: pbds.CreateTemplateVariableReq.attachment:type_name -> pbtv.TemplateVariableAttachment - 251, // 123: pbds.CreateTemplateVariableReq.spec:type_name -> pbtv.TemplateVariableSpec - 251, // 124: pbds.ImportTemplateVariablesReq.specs:type_name -> pbtv.TemplateVariableSpec - 298, // 125: pbds.ListTemplateVariablesResp.details:type_name -> pbtv.TemplateVariable - 297, // 126: pbds.UpdateTemplateVariableReq.attachment:type_name -> pbtv.TemplateVariableAttachment - 251, // 127: pbds.UpdateTemplateVariableReq.spec:type_name -> pbtv.TemplateVariableSpec - 297, // 128: pbds.DeleteTemplateVariableReq.attachment:type_name -> pbtv.TemplateVariableAttachment - 299, // 129: pbds.CreateGroupReq.attachment:type_name -> pbgroup.GroupAttachment - 300, // 130: pbds.CreateGroupReq.spec:type_name -> pbgroup.GroupSpec - 301, // 131: pbds.ListAllGroupsResp.details:type_name -> pbgroup.Group - 228, // 132: pbds.ListAppGroupsResp.details:type_name -> pbds.ListAppGroupsResp.ListAppGroupsData - 299, // 133: pbds.UpdateGroupReq.attachment:type_name -> pbgroup.GroupAttachment - 300, // 134: pbds.UpdateGroupReq.spec:type_name -> pbgroup.GroupSpec - 299, // 135: pbds.DeleteGroupReq.attachment:type_name -> pbgroup.GroupAttachment - 229, // 136: pbds.CountGroupsReleasedAppsResp.data:type_name -> pbds.CountGroupsReleasedAppsResp.CountGroupsReleasedAppsData - 230, // 137: pbds.ListGroupReleasedAppsResp.details:type_name -> pbds.ListGroupReleasedAppsResp.ListGroupReleasedAppsData - 302, // 138: pbds.PublishReq.labels:type_name -> google.protobuf.Struct - 251, // 139: pbds.GenerateReleaseAndPublishReq.variables:type_name -> pbtv.TemplateVariableSpec - 302, // 140: pbds.GenerateReleaseAndPublishReq.labels:type_name -> google.protobuf.Struct - 303, // 141: pbds.ListInstancesReq.page:type_name -> pbbase.BasePage + 256, // 40: pbds.GetHookResp.attachment:type_name -> pbhook.HookAttachment + 258, // 41: pbds.GetHookResp.revision:type_name -> pbbase.Revision + 221, // 42: pbds.GetHookInfoSpec.releases:type_name -> pbds.GetHookInfoSpec.Releases + 222, // 43: pbds.ListHooksResp.details:type_name -> pbds.ListHooksResp.Detail + 259, // 44: pbds.ListHookTagResp.details:type_name -> pbhook.CountHookTags + 223, // 45: pbds.ListHookReferencesResp.details:type_name -> pbds.ListHookReferencesResp.Detail + 260, // 46: pbds.CreateHookRevisionReq.attachment:type_name -> pbhr.HookRevisionAttachment + 261, // 47: pbds.CreateHookRevisionReq.spec:type_name -> pbhr.HookRevisionSpec + 224, // 48: pbds.ListHookRevisionsResp.details:type_name -> pbds.ListHookRevisionsResp.ListHookRevisionsData + 260, // 49: pbds.UpdateHookRevisionReq.attachment:type_name -> pbhr.HookRevisionAttachment + 261, // 50: pbds.UpdateHookRevisionReq.spec:type_name -> pbhr.HookRevisionSpec + 225, // 51: pbds.ListHookRevisionReferencesResp.details:type_name -> pbds.ListHookRevisionReferencesResp.Detail + 226, // 52: pbds.GetReleaseHookResp.pre_hook:type_name -> pbds.GetReleaseHookResp.Hook + 226, // 53: pbds.GetReleaseHookResp.post_hook:type_name -> pbds.GetReleaseHookResp.Hook + 262, // 54: pbds.CreateTemplateSpaceReq.attachment:type_name -> pbts.TemplateSpaceAttachment + 263, // 55: pbds.CreateTemplateSpaceReq.spec:type_name -> pbts.TemplateSpaceSpec + 264, // 56: pbds.ListTemplateSpacesResp.details:type_name -> pbts.TemplateSpace + 262, // 57: pbds.UpdateTemplateSpaceReq.attachment:type_name -> pbts.TemplateSpaceAttachment + 263, // 58: pbds.UpdateTemplateSpaceReq.spec:type_name -> pbts.TemplateSpaceSpec + 262, // 59: pbds.DeleteTemplateSpaceReq.attachment:type_name -> pbts.TemplateSpaceAttachment + 264, // 60: pbds.ListTmplSpacesByIDsResp.details:type_name -> pbts.TemplateSpace + 265, // 61: pbds.CreateTemplateReq.attachment:type_name -> pbtemplate.TemplateAttachment + 266, // 62: pbds.CreateTemplateReq.spec:type_name -> pbtemplate.TemplateSpec + 267, // 63: pbds.CreateTemplateReq.tr_spec:type_name -> pbtr.TemplateRevisionSpec + 268, // 64: pbds.ListTemplatesResp.details:type_name -> pbtemplate.Template + 265, // 65: pbds.UpdateTemplateReq.attachment:type_name -> pbtemplate.TemplateAttachment + 266, // 66: pbds.UpdateTemplateReq.spec:type_name -> pbtemplate.TemplateSpec + 265, // 67: pbds.DeleteTemplateReq.attachment:type_name -> pbtemplate.TemplateAttachment + 265, // 68: pbds.BatchDeleteTemplateReq.attachment:type_name -> pbtemplate.TemplateAttachment + 268, // 69: pbds.ListTemplatesByIDsResp.details:type_name -> pbtemplate.Template + 268, // 70: pbds.ListTemplatesNotBoundResp.details:type_name -> pbtemplate.Template + 268, // 71: pbds.ListTmplsOfTmplSetResp.details:type_name -> pbtemplate.Template + 227, // 72: pbds.ListTemplateByTupleReq.items:type_name -> pbds.ListTemplateByTupleReq.Item + 228, // 73: pbds.ListTemplateByTupleReqResp.items:type_name -> pbds.ListTemplateByTupleReqResp.Item + 229, // 74: pbds.BatchUpsertTemplatesReq.items:type_name -> pbds.BatchUpsertTemplatesReq.Item + 269, // 75: pbds.CreateTemplateRevisionReq.attachment:type_name -> pbtr.TemplateRevisionAttachment + 267, // 76: pbds.CreateTemplateRevisionReq.spec:type_name -> pbtr.TemplateRevisionSpec + 270, // 77: pbds.ListTemplateRevisionsResp.details:type_name -> pbtr.TemplateRevision + 269, // 78: pbds.DeleteTemplateRevisionReq.attachment:type_name -> pbtr.TemplateRevisionAttachment + 270, // 79: pbds.ListTemplateRevisionsByIDsResp.details:type_name -> pbtr.TemplateRevision + 271, // 80: pbds.ListTmplRevisionNamesByTmplIDsResp.details:type_name -> pbtr.TemplateRevisionNamesDetail + 272, // 81: pbds.CreateTemplateSetReq.attachment:type_name -> pbtset.TemplateSetAttachment + 273, // 82: pbds.CreateTemplateSetReq.spec:type_name -> pbtset.TemplateSetSpec + 274, // 83: pbds.ListTemplateSetsResp.details:type_name -> pbtset.TemplateSet + 272, // 84: pbds.UpdateTemplateSetReq.attachment:type_name -> pbtset.TemplateSetAttachment + 273, // 85: pbds.UpdateTemplateSetReq.spec:type_name -> pbtset.TemplateSetSpec + 272, // 86: pbds.DeleteTemplateSetReq.attachment:type_name -> pbtset.TemplateSetAttachment + 274, // 87: pbds.ListAppTemplateSetsResp.details:type_name -> pbtset.TemplateSet + 274, // 88: pbds.ListTemplateSetsByIDsResp.details:type_name -> pbtset.TemplateSet + 275, // 89: pbds.ListTemplateSetBriefInfoByIDsResp.details:type_name -> pbtset.TemplateSetBriefInfo + 276, // 90: pbds.ListTmplSetsOfBizResp.details:type_name -> pbtset.TemplateSetOfBizDetail + 277, // 91: pbds.CreateAppTemplateBindingReq.attachment:type_name -> pbatb.AppTemplateBindingAttachment + 278, // 92: pbds.CreateAppTemplateBindingReq.spec:type_name -> pbatb.AppTemplateBindingSpec + 279, // 93: pbds.ListAppTemplateBindingsResp.details:type_name -> pbatb.AppTemplateBinding + 277, // 94: pbds.UpdateAppTemplateBindingReq.attachment:type_name -> pbatb.AppTemplateBindingAttachment + 278, // 95: pbds.UpdateAppTemplateBindingReq.spec:type_name -> pbatb.AppTemplateBindingSpec + 277, // 96: pbds.DeleteAppTemplateBindingReq.attachment:type_name -> pbatb.AppTemplateBindingAttachment + 280, // 97: pbds.ListAppBoundTmplRevisionsResp.details:type_name -> pbatb.AppBoundTmplRevision + 281, // 98: pbds.ListReleasedAppBoundTmplRevisionsResp.details:type_name -> pbatb.ReleasedAppBoundTmplRevision + 281, // 99: pbds.GetReleasedAppBoundTmplRevisionResp.detail:type_name -> pbatb.ReleasedAppBoundTmplRevision + 277, // 100: pbds.CheckAppTemplateBindingReq.attachment:type_name -> pbatb.AppTemplateBindingAttachment + 278, // 101: pbds.CheckAppTemplateBindingReq.spec:type_name -> pbatb.AppTemplateBindingSpec + 282, // 102: pbds.CheckAppTemplateBindingResp.details:type_name -> pbatb.Conflict + 283, // 103: pbds.GetAppTmplVariableRefsResp.details:type_name -> pbatv.AppTemplateVariableReference + 283, // 104: pbds.GetReleasedAppTmplVariableRefsResp.details:type_name -> pbatv.AppTemplateVariableReference + 284, // 105: pbds.UpdateAppTmplVariablesReq.attachment:type_name -> pbatv.AppTemplateVariableAttachment + 285, // 106: pbds.UpdateAppTmplVariablesReq.spec:type_name -> pbatv.AppTemplateVariableSpec + 253, // 107: pbds.ListAppTmplVariablesResp.details:type_name -> pbtv.TemplateVariableSpec + 253, // 108: pbds.ListReleasedAppTmplVariablesResp.details:type_name -> pbtv.TemplateVariableSpec + 286, // 109: pbds.ListTmplBoundCountsResp.details:type_name -> pbtbr.TemplateBoundCounts + 287, // 110: pbds.ListTmplRevisionBoundCountsResp.details:type_name -> pbtbr.TemplateRevisionBoundCounts + 288, // 111: pbds.ListTmplSetBoundCountsResp.details:type_name -> pbtbr.TemplateSetBoundCounts + 289, // 112: pbds.ListTmplBoundUnnamedAppsResp.details:type_name -> pbtbr.TemplateBoundUnnamedAppDetail + 290, // 113: pbds.ListTmplBoundNamedAppsResp.details:type_name -> pbtbr.TemplateBoundNamedAppDetail + 291, // 114: pbds.ListTmplBoundTmplSetsResp.details:type_name -> pbtbr.TemplateBoundTemplateSetDetail + 292, // 115: pbds.ListMultiTmplBoundTmplSetsResp.details:type_name -> pbtbr.MultiTemplateBoundTemplateSetDetail + 293, // 116: pbds.ListTmplRevisionBoundUnnamedAppsResp.details:type_name -> pbtbr.TemplateRevisionBoundUnnamedAppDetail + 294, // 117: pbds.ListTmplRevisionBoundNamedAppsResp.details:type_name -> pbtbr.TemplateRevisionBoundNamedAppDetail + 295, // 118: pbds.ListTmplSetBoundUnnamedAppsResp.details:type_name -> pbtbr.TemplateSetBoundUnnamedAppDetail + 296, // 119: pbds.ListMultiTmplSetBoundUnnamedAppsResp.details:type_name -> pbtbr.MultiTemplateSetBoundUnnamedAppDetail + 297, // 120: pbds.ListTmplSetBoundNamedAppsResp.details:type_name -> pbtbr.TemplateSetBoundNamedAppDetail + 298, // 121: pbds.ListLatestTmplBoundUnnamedAppsResp.details:type_name -> pbtbr.LatestTemplateBoundUnnamedAppDetail + 299, // 122: pbds.CreateTemplateVariableReq.attachment:type_name -> pbtv.TemplateVariableAttachment + 253, // 123: pbds.CreateTemplateVariableReq.spec:type_name -> pbtv.TemplateVariableSpec + 253, // 124: pbds.ImportTemplateVariablesReq.specs:type_name -> pbtv.TemplateVariableSpec + 300, // 125: pbds.ListTemplateVariablesResp.details:type_name -> pbtv.TemplateVariable + 299, // 126: pbds.UpdateTemplateVariableReq.attachment:type_name -> pbtv.TemplateVariableAttachment + 253, // 127: pbds.UpdateTemplateVariableReq.spec:type_name -> pbtv.TemplateVariableSpec + 299, // 128: pbds.DeleteTemplateVariableReq.attachment:type_name -> pbtv.TemplateVariableAttachment + 301, // 129: pbds.CreateGroupReq.attachment:type_name -> pbgroup.GroupAttachment + 302, // 130: pbds.CreateGroupReq.spec:type_name -> pbgroup.GroupSpec + 303, // 131: pbds.ListAllGroupsResp.details:type_name -> pbgroup.Group + 230, // 132: pbds.ListAppGroupsResp.details:type_name -> pbds.ListAppGroupsResp.ListAppGroupsData + 301, // 133: pbds.UpdateGroupReq.attachment:type_name -> pbgroup.GroupAttachment + 302, // 134: pbds.UpdateGroupReq.spec:type_name -> pbgroup.GroupSpec + 301, // 135: pbds.DeleteGroupReq.attachment:type_name -> pbgroup.GroupAttachment + 231, // 136: pbds.CountGroupsReleasedAppsResp.data:type_name -> pbds.CountGroupsReleasedAppsResp.CountGroupsReleasedAppsData + 232, // 137: pbds.ListGroupReleasedAppsResp.details:type_name -> pbds.ListGroupReleasedAppsResp.ListGroupReleasedAppsData + 304, // 138: pbds.PublishReq.labels:type_name -> google.protobuf.Struct + 253, // 139: pbds.GenerateReleaseAndPublishReq.variables:type_name -> pbtv.TemplateVariableSpec + 304, // 140: pbds.GenerateReleaseAndPublishReq.labels:type_name -> google.protobuf.Struct + 305, // 141: pbds.ListInstancesReq.page:type_name -> pbbase.BasePage 204, // 142: pbds.ListInstancesResp.details:type_name -> pbds.InstanceResource 207, // 143: pbds.FetchInstanceInfoResp.details:type_name -> pbds.InstanceInfo - 304, // 144: pbds.CreateKvReq.attachment:type_name -> pbkv.KvAttachment - 305, // 145: pbds.CreateKvReq.spec:type_name -> pbkv.KvSpec - 304, // 146: pbds.UpdateKvReq.attachment:type_name -> pbkv.KvAttachment - 305, // 147: pbds.UpdateKvReq.spec:type_name -> pbkv.KvSpec - 306, // 148: pbds.ListKvsResp.details:type_name -> pbkv.Kv - 305, // 149: pbds.DeleteKvReq.spec:type_name -> pbkv.KvSpec - 304, // 150: pbds.DeleteKvReq.attachment:type_name -> pbkv.KvAttachment - 231, // 151: pbds.BatchUpsertKvsReq.kvs:type_name -> pbds.BatchUpsertKvsReq.Kv - 305, // 152: pbds.UnDeleteKvReq.spec:type_name -> pbkv.KvSpec - 304, // 153: pbds.UnDeleteKvReq.attachment:type_name -> pbkv.KvAttachment - 241, // 154: pbds.BatchUpsertConfigItemsReq.ConfigItem.config_item_attachment:type_name -> pbci.ConfigItemAttachment - 242, // 155: pbds.BatchUpsertConfigItemsReq.ConfigItem.config_item_spec:type_name -> pbci.ConfigItemSpec - 243, // 156: pbds.BatchUpsertConfigItemsReq.ConfigItem.content_spec:type_name -> pbcontent.ContentSpec - 307, // 157: pbds.ListHooksResp.Detail.hook:type_name -> pbhook.Hook - 308, // 158: pbds.ListHookRevisionsResp.ListHookRevisionsData.hook_revision:type_name -> pbhr.HookRevision - 266, // 159: pbds.ListTemplateByTupleReqResp.Item.template:type_name -> pbtemplate.Template - 268, // 160: pbds.ListTemplateByTupleReqResp.Item.template_revision:type_name -> pbtr.TemplateRevision - 266, // 161: pbds.BatchUpsertTemplatesReq.Item.template:type_name -> pbtemplate.Template - 268, // 162: pbds.BatchUpsertTemplatesReq.Item.template_revision:type_name -> pbtr.TemplateRevision - 302, // 163: pbds.ListAppGroupsResp.ListAppGroupsData.old_selector:type_name -> google.protobuf.Struct - 302, // 164: pbds.ListAppGroupsResp.ListAppGroupsData.new_selector:type_name -> google.protobuf.Struct - 304, // 165: pbds.BatchUpsertKvsReq.Kv.kv_attachment:type_name -> pbkv.KvAttachment - 305, // 166: pbds.BatchUpsertKvsReq.Kv.kv_spec:type_name -> pbkv.KvSpec - 18, // 167: pbds.Data.CreateApp:input_type -> pbds.CreateAppReq - 19, // 168: pbds.Data.UpdateApp:input_type -> pbds.UpdateAppReq - 20, // 169: pbds.Data.DeleteApp:input_type -> pbds.DeleteAppReq - 21, // 170: pbds.Data.GetApp:input_type -> pbds.GetAppReq - 22, // 171: pbds.Data.GetAppByID:input_type -> pbds.GetAppByIDReq - 23, // 172: pbds.Data.GetAppByName:input_type -> pbds.GetAppByNameReq - 24, // 173: pbds.Data.ListAppsRest:input_type -> pbds.ListAppsRestReq - 26, // 174: pbds.Data.ListAppsByIDs:input_type -> pbds.ListAppsByIDsReq - 28, // 175: pbds.Data.CreateConfigItem:input_type -> pbds.CreateConfigItemReq - 29, // 176: pbds.Data.BatchUpsertConfigItems:input_type -> pbds.BatchUpsertConfigItemsReq - 31, // 177: pbds.Data.UpdateConfigItem:input_type -> pbds.UpdateConfigItemReq - 32, // 178: pbds.Data.DeleteConfigItem:input_type -> pbds.DeleteConfigItemReq - 33, // 179: pbds.Data.UnDeleteConfigItem:input_type -> pbds.UnDeleteConfigItemReq - 34, // 180: pbds.Data.UndoConfigItem:input_type -> pbds.UndoConfigItemReq - 35, // 181: pbds.Data.GetConfigItem:input_type -> pbds.GetConfigItemReq - 36, // 182: pbds.Data.ListConfigItems:input_type -> pbds.ListConfigItemsReq - 38, // 183: pbds.Data.ListReleasedConfigItems:input_type -> pbds.ListReleasedConfigItemsReq - 40, // 184: pbds.Data.ListConfigItemCount:input_type -> pbds.ListConfigItemCountReq - 42, // 185: pbds.Data.ListConfigItemByTuple:input_type -> pbds.ListConfigItemByTupleReq - 16, // 186: pbds.Data.UpdateConfigHook:input_type -> pbds.UpdateConfigHookReq - 44, // 187: pbds.Data.CreateContent:input_type -> pbds.CreateContentReq - 45, // 188: pbds.Data.GetContent:input_type -> pbds.GetContentReq - 46, // 189: pbds.Data.CreateCommit:input_type -> pbds.CreateCommitReq - 47, // 190: pbds.Data.GetLatestCommit:input_type -> pbds.GetLatestCommitReq - 48, // 191: pbds.Data.CreateRelease:input_type -> pbds.CreateReleaseReq - 49, // 192: pbds.Data.ListReleases:input_type -> pbds.ListReleasesReq - 51, // 193: pbds.Data.GetReleaseByName:input_type -> pbds.GetReleaseByNameReq - 52, // 194: pbds.Data.DeprecateRelease:input_type -> pbds.DeprecateReleaseReq - 53, // 195: pbds.Data.UnDeprecateRelease:input_type -> pbds.UnDeprecateReleaseReq - 54, // 196: pbds.Data.DeleteRelease:input_type -> pbds.DeleteReleaseReq - 55, // 197: pbds.Data.GetReleasedConfigItem:input_type -> pbds.GetReleasedCIReq - 56, // 198: pbds.Data.GetReleasedKv:input_type -> pbds.GetReleasedKvReq - 57, // 199: pbds.Data.ListReleasedKvs:input_type -> pbds.ListReleasedKvReq - 59, // 200: pbds.Data.CreateHook:input_type -> pbds.CreateHookReq - 64, // 201: pbds.Data.ListHooks:input_type -> pbds.ListHooksReq - 69, // 202: pbds.Data.DeleteHook:input_type -> pbds.DeleteHookReq - 60, // 203: pbds.Data.ListHookTags:input_type -> pbds.ListHookTagReq - 67, // 204: pbds.Data.ListHookReferences:input_type -> pbds.ListHookReferencesReq - 61, // 205: pbds.Data.GetHook:input_type -> pbds.GetHookReq - 70, // 206: pbds.Data.CreateHookRevision:input_type -> pbds.CreateHookRevisionReq - 71, // 207: pbds.Data.ListHookRevisions:input_type -> pbds.ListHookRevisionsReq - 73, // 208: pbds.Data.GetHookRevisionByID:input_type -> pbds.GetHookRevisionByIdReq - 74, // 209: pbds.Data.DeleteHookRevision:input_type -> pbds.DeleteHookRevisionReq - 75, // 210: pbds.Data.PublishHookRevision:input_type -> pbds.PublishHookRevisionReq - 76, // 211: pbds.Data.GetHookRevisionByPubState:input_type -> pbds.GetByPubStateReq - 77, // 212: pbds.Data.UpdateHookRevision:input_type -> pbds.UpdateHookRevisionReq - 78, // 213: pbds.Data.ListHookRevisionReferences:input_type -> pbds.ListHookRevisionReferencesReq - 80, // 214: pbds.Data.GetReleaseHook:input_type -> pbds.GetReleaseHookReq - 82, // 215: pbds.Data.CreateTemplateSpace:input_type -> pbds.CreateTemplateSpaceReq - 83, // 216: pbds.Data.ListTemplateSpaces:input_type -> pbds.ListTemplateSpacesReq - 85, // 217: pbds.Data.UpdateTemplateSpace:input_type -> pbds.UpdateTemplateSpaceReq - 86, // 218: pbds.Data.DeleteTemplateSpace:input_type -> pbds.DeleteTemplateSpaceReq - 309, // 219: pbds.Data.GetAllBizsOfTmplSpaces:input_type -> pbbase.EmptyReq - 88, // 220: pbds.Data.CreateDefaultTmplSpace:input_type -> pbds.CreateDefaultTmplSpaceReq - 89, // 221: pbds.Data.ListTmplSpacesByIDs:input_type -> pbds.ListTmplSpacesByIDsReq - 91, // 222: pbds.Data.CreateTemplate:input_type -> pbds.CreateTemplateReq - 92, // 223: pbds.Data.ListTemplates:input_type -> pbds.ListTemplatesReq - 94, // 224: pbds.Data.UpdateTemplate:input_type -> pbds.UpdateTemplateReq - 95, // 225: pbds.Data.DeleteTemplate:input_type -> pbds.DeleteTemplateReq - 96, // 226: pbds.Data.BatchDeleteTemplate:input_type -> pbds.BatchDeleteTemplateReq - 97, // 227: pbds.Data.AddTmplsToTmplSets:input_type -> pbds.AddTmplsToTmplSetsReq - 98, // 228: pbds.Data.DeleteTmplsFromTmplSets:input_type -> pbds.DeleteTmplsFromTmplSetsReq - 99, // 229: pbds.Data.ListTemplatesByIDs:input_type -> pbds.ListTemplatesByIDsReq - 101, // 230: pbds.Data.ListTemplatesNotBound:input_type -> pbds.ListTemplatesNotBoundReq - 103, // 231: pbds.Data.ListTmplsOfTmplSet:input_type -> pbds.ListTmplsOfTmplSetReq - 105, // 232: pbds.Data.ListTemplateByTuple:input_type -> pbds.ListTemplateByTupleReq - 107, // 233: pbds.Data.BatchUpsertTemplates:input_type -> pbds.BatchUpsertTemplatesReq - 109, // 234: pbds.Data.CreateTemplateRevision:input_type -> pbds.CreateTemplateRevisionReq - 110, // 235: pbds.Data.ListTemplateRevisions:input_type -> pbds.ListTemplateRevisionsReq - 112, // 236: pbds.Data.DeleteTemplateRevision:input_type -> pbds.DeleteTemplateRevisionReq - 113, // 237: pbds.Data.ListTemplateRevisionsByIDs:input_type -> pbds.ListTemplateRevisionsByIDsReq - 115, // 238: pbds.Data.ListTmplRevisionNamesByTmplIDs:input_type -> pbds.ListTmplRevisionNamesByTmplIDsReq - 117, // 239: pbds.Data.CreateTemplateSet:input_type -> pbds.CreateTemplateSetReq - 118, // 240: pbds.Data.ListTemplateSets:input_type -> pbds.ListTemplateSetsReq - 120, // 241: pbds.Data.UpdateTemplateSet:input_type -> pbds.UpdateTemplateSetReq - 121, // 242: pbds.Data.DeleteTemplateSet:input_type -> pbds.DeleteTemplateSetReq - 122, // 243: pbds.Data.ListAppTemplateSets:input_type -> pbds.ListAppTemplateSetsReq - 124, // 244: pbds.Data.ListTemplateSetsByIDs:input_type -> pbds.ListTemplateSetsByIDsReq - 126, // 245: pbds.Data.ListTemplateSetBriefInfoByIDs:input_type -> pbds.ListTemplateSetBriefInfoByIDsReq - 128, // 246: pbds.Data.ListTmplSetsOfBiz:input_type -> pbds.ListTmplSetsOfBizReq - 130, // 247: pbds.Data.CreateAppTemplateBinding:input_type -> pbds.CreateAppTemplateBindingReq - 131, // 248: pbds.Data.ListAppTemplateBindings:input_type -> pbds.ListAppTemplateBindingsReq - 133, // 249: pbds.Data.UpdateAppTemplateBinding:input_type -> pbds.UpdateAppTemplateBindingReq - 134, // 250: pbds.Data.DeleteAppTemplateBinding:input_type -> pbds.DeleteAppTemplateBindingReq - 135, // 251: pbds.Data.ListAppBoundTmplRevisions:input_type -> pbds.ListAppBoundTmplRevisionsReq - 137, // 252: pbds.Data.ListReleasedAppBoundTmplRevisions:input_type -> pbds.ListReleasedAppBoundTmplRevisionsReq - 139, // 253: pbds.Data.GetReleasedAppBoundTmplRevision:input_type -> pbds.GetReleasedAppBoundTmplRevisionReq - 141, // 254: pbds.Data.CheckAppTemplateBinding:input_type -> pbds.CheckAppTemplateBindingReq - 143, // 255: pbds.Data.ExtractAppTmplVariables:input_type -> pbds.ExtractAppTmplVariablesReq - 145, // 256: pbds.Data.GetAppTmplVariableRefs:input_type -> pbds.GetAppTmplVariableRefsReq - 147, // 257: pbds.Data.GetReleasedAppTmplVariableRefs:input_type -> pbds.GetReleasedAppTmplVariableRefsReq - 149, // 258: pbds.Data.UpdateAppTmplVariables:input_type -> pbds.UpdateAppTmplVariablesReq - 150, // 259: pbds.Data.ListAppTmplVariables:input_type -> pbds.ListAppTmplVariablesReq - 152, // 260: pbds.Data.ListReleasedAppTmplVariables:input_type -> pbds.ListReleasedAppTmplVariablesReq - 154, // 261: pbds.Data.ListTmplBoundCounts:input_type -> pbds.ListTmplBoundCountsReq - 156, // 262: pbds.Data.ListTmplRevisionBoundCounts:input_type -> pbds.ListTmplRevisionBoundCountsReq - 158, // 263: pbds.Data.ListTmplSetBoundCounts:input_type -> pbds.ListTmplSetBoundCountsReq - 160, // 264: pbds.Data.ListTmplBoundUnnamedApps:input_type -> pbds.ListTmplBoundUnnamedAppsReq - 162, // 265: pbds.Data.ListTmplBoundNamedApps:input_type -> pbds.ListTmplBoundNamedAppsReq - 164, // 266: pbds.Data.ListTmplBoundTmplSets:input_type -> pbds.ListTmplBoundTmplSetsReq - 166, // 267: pbds.Data.ListMultiTmplBoundTmplSets:input_type -> pbds.ListMultiTmplBoundTmplSetsReq - 168, // 268: pbds.Data.ListTmplRevisionBoundUnnamedApps:input_type -> pbds.ListTmplRevisionBoundUnnamedAppsReq - 170, // 269: pbds.Data.ListTmplRevisionBoundNamedApps:input_type -> pbds.ListTmplRevisionBoundNamedAppsReq - 172, // 270: pbds.Data.ListTmplSetBoundUnnamedApps:input_type -> pbds.ListTmplSetBoundUnnamedAppsReq - 174, // 271: pbds.Data.ListMultiTmplSetBoundUnnamedApps:input_type -> pbds.ListMultiTmplSetBoundUnnamedAppsReq - 176, // 272: pbds.Data.ListTmplSetBoundNamedApps:input_type -> pbds.ListTmplSetBoundNamedAppsReq - 178, // 273: pbds.Data.ListLatestTmplBoundUnnamedApps:input_type -> pbds.ListLatestTmplBoundUnnamedAppsReq - 180, // 274: pbds.Data.CreateTemplateVariable:input_type -> pbds.CreateTemplateVariableReq - 183, // 275: pbds.Data.ListTemplateVariables:input_type -> pbds.ListTemplateVariablesReq - 185, // 276: pbds.Data.UpdateTemplateVariable:input_type -> pbds.UpdateTemplateVariableReq - 186, // 277: pbds.Data.DeleteTemplateVariable:input_type -> pbds.DeleteTemplateVariableReq - 181, // 278: pbds.Data.ImportTemplateVariables:input_type -> pbds.ImportTemplateVariablesReq - 187, // 279: pbds.Data.CreateGroup:input_type -> pbds.CreateGroupReq - 188, // 280: pbds.Data.ListAllGroups:input_type -> pbds.ListAllGroupsReq - 190, // 281: pbds.Data.ListAppGroups:input_type -> pbds.ListAppGroupsReq - 192, // 282: pbds.Data.GetGroupByName:input_type -> pbds.GetGroupByNameReq - 193, // 283: pbds.Data.UpdateGroup:input_type -> pbds.UpdateGroupReq - 194, // 284: pbds.Data.DeleteGroup:input_type -> pbds.DeleteGroupReq - 195, // 285: pbds.Data.CountGroupsReleasedApps:input_type -> pbds.CountGroupsReleasedAppsReq - 197, // 286: pbds.Data.ListGroupReleasedApps:input_type -> pbds.ListGroupReleasedAppsReq - 199, // 287: pbds.Data.Publish:input_type -> pbds.PublishReq - 200, // 288: pbds.Data.GenerateReleaseAndPublish:input_type -> pbds.GenerateReleaseAndPublishReq - 7, // 289: pbds.Data.CreateCredential:input_type -> pbds.CreateCredentialReq - 8, // 290: pbds.Data.ListCredentials:input_type -> pbds.ListCredentialReq - 13, // 291: pbds.Data.DeleteCredential:input_type -> pbds.DeleteCredentialReq - 10, // 292: pbds.Data.UpdateCredential:input_type -> pbds.UpdateCredentialReq - 11, // 293: pbds.Data.CheckCredentialName:input_type -> pbds.CheckCredentialNameReq - 4, // 294: pbds.Data.ListCredentialScopes:input_type -> pbds.ListCredentialScopesReq - 0, // 295: pbds.Data.UpdateCredentialScopes:input_type -> pbds.UpdateCredentialScopesReq - 209, // 296: pbds.Data.CreateKv:input_type -> pbds.CreateKvReq - 210, // 297: pbds.Data.UpdateKv:input_type -> pbds.UpdateKvReq - 211, // 298: pbds.Data.ListKvs:input_type -> pbds.ListKvsReq - 213, // 299: pbds.Data.DeleteKv:input_type -> pbds.DeleteKvReq - 214, // 300: pbds.Data.BatchUpsertKvs:input_type -> pbds.BatchUpsertKvsReq - 216, // 301: pbds.Data.UnDeleteKv:input_type -> pbds.UnDeleteKvReq - 202, // 302: pbds.Data.ListInstances:input_type -> pbds.ListInstancesReq - 205, // 303: pbds.Data.FetchInstanceInfo:input_type -> pbds.FetchInstanceInfoReq - 208, // 304: pbds.Data.Ping:input_type -> pbds.PingMsg - 15, // 305: pbds.Data.CreateApp:output_type -> pbds.CreateResp - 240, // 306: pbds.Data.UpdateApp:output_type -> pbapp.App - 310, // 307: pbds.Data.DeleteApp:output_type -> pbbase.EmptyResp - 240, // 308: pbds.Data.GetApp:output_type -> pbapp.App - 240, // 309: pbds.Data.GetAppByID:output_type -> pbapp.App - 240, // 310: pbds.Data.GetAppByName:output_type -> pbapp.App - 25, // 311: pbds.Data.ListAppsRest:output_type -> pbds.ListAppsResp - 27, // 312: pbds.Data.ListAppsByIDs:output_type -> pbds.ListAppsByIDsResp - 15, // 313: pbds.Data.CreateConfigItem:output_type -> pbds.CreateResp - 30, // 314: pbds.Data.BatchUpsertConfigItems:output_type -> pbds.BatchUpsertConfigItemsResp - 310, // 315: pbds.Data.UpdateConfigItem:output_type -> pbbase.EmptyResp - 310, // 316: pbds.Data.DeleteConfigItem:output_type -> pbbase.EmptyResp - 310, // 317: pbds.Data.UnDeleteConfigItem:output_type -> pbbase.EmptyResp - 310, // 318: pbds.Data.UndoConfigItem:output_type -> pbbase.EmptyResp - 244, // 319: pbds.Data.GetConfigItem:output_type -> pbci.ConfigItem - 37, // 320: pbds.Data.ListConfigItems:output_type -> pbds.ListConfigItemsResp - 39, // 321: pbds.Data.ListReleasedConfigItems:output_type -> pbds.ListReleasedConfigItemsResp - 41, // 322: pbds.Data.ListConfigItemCount:output_type -> pbds.ListConfigItemCountResp - 43, // 323: pbds.Data.ListConfigItemByTuple:output_type -> pbds.ListConfigItemByTupleResp - 310, // 324: pbds.Data.UpdateConfigHook:output_type -> pbbase.EmptyResp - 15, // 325: pbds.Data.CreateContent:output_type -> pbds.CreateResp - 311, // 326: pbds.Data.GetContent:output_type -> pbcontent.Content - 15, // 327: pbds.Data.CreateCommit:output_type -> pbds.CreateResp - 312, // 328: pbds.Data.GetLatestCommit:output_type -> pbcommit.Commit - 15, // 329: pbds.Data.CreateRelease:output_type -> pbds.CreateResp - 50, // 330: pbds.Data.ListReleases:output_type -> pbds.ListReleasesResp - 252, // 331: pbds.Data.GetReleaseByName:output_type -> pbrelease.Release - 310, // 332: pbds.Data.DeprecateRelease:output_type -> pbbase.EmptyResp - 310, // 333: pbds.Data.UnDeprecateRelease:output_type -> pbbase.EmptyResp - 310, // 334: pbds.Data.DeleteRelease:output_type -> pbbase.EmptyResp - 245, // 335: pbds.Data.GetReleasedConfigItem:output_type -> pbrci.ReleasedConfigItem - 253, // 336: pbds.Data.GetReleasedKv:output_type -> pbrkv.ReleasedKv - 58, // 337: pbds.Data.ListReleasedKvs:output_type -> pbds.ListReleasedKvResp - 15, // 338: pbds.Data.CreateHook:output_type -> pbds.CreateResp - 65, // 339: pbds.Data.ListHooks:output_type -> pbds.ListHooksResp - 310, // 340: pbds.Data.DeleteHook:output_type -> pbbase.EmptyResp - 66, // 341: pbds.Data.ListHookTags:output_type -> pbds.ListHookTagResp - 68, // 342: pbds.Data.ListHookReferences:output_type -> pbds.ListHookReferencesResp - 62, // 343: pbds.Data.GetHook:output_type -> pbds.GetHookResp - 15, // 344: pbds.Data.CreateHookRevision:output_type -> pbds.CreateResp - 72, // 345: pbds.Data.ListHookRevisions:output_type -> pbds.ListHookRevisionsResp - 308, // 346: pbds.Data.GetHookRevisionByID:output_type -> pbhr.HookRevision - 310, // 347: pbds.Data.DeleteHookRevision:output_type -> pbbase.EmptyResp - 310, // 348: pbds.Data.PublishHookRevision:output_type -> pbbase.EmptyResp - 308, // 349: pbds.Data.GetHookRevisionByPubState:output_type -> pbhr.HookRevision - 310, // 350: pbds.Data.UpdateHookRevision:output_type -> pbbase.EmptyResp - 79, // 351: pbds.Data.ListHookRevisionReferences:output_type -> pbds.ListHookRevisionReferencesResp - 81, // 352: pbds.Data.GetReleaseHook:output_type -> pbds.GetReleaseHookResp - 15, // 353: pbds.Data.CreateTemplateSpace:output_type -> pbds.CreateResp - 84, // 354: pbds.Data.ListTemplateSpaces:output_type -> pbds.ListTemplateSpacesResp - 310, // 355: pbds.Data.UpdateTemplateSpace:output_type -> pbbase.EmptyResp - 310, // 356: pbds.Data.DeleteTemplateSpace:output_type -> pbbase.EmptyResp - 87, // 357: pbds.Data.GetAllBizsOfTmplSpaces:output_type -> pbds.GetAllBizsOfTmplSpacesResp - 15, // 358: pbds.Data.CreateDefaultTmplSpace:output_type -> pbds.CreateResp - 90, // 359: pbds.Data.ListTmplSpacesByIDs:output_type -> pbds.ListTmplSpacesByIDsResp - 15, // 360: pbds.Data.CreateTemplate:output_type -> pbds.CreateResp - 93, // 361: pbds.Data.ListTemplates:output_type -> pbds.ListTemplatesResp - 310, // 362: pbds.Data.UpdateTemplate:output_type -> pbbase.EmptyResp - 310, // 363: pbds.Data.DeleteTemplate:output_type -> pbbase.EmptyResp - 310, // 364: pbds.Data.BatchDeleteTemplate:output_type -> pbbase.EmptyResp - 310, // 365: pbds.Data.AddTmplsToTmplSets:output_type -> pbbase.EmptyResp - 310, // 366: pbds.Data.DeleteTmplsFromTmplSets:output_type -> pbbase.EmptyResp - 100, // 367: pbds.Data.ListTemplatesByIDs:output_type -> pbds.ListTemplatesByIDsResp - 102, // 368: pbds.Data.ListTemplatesNotBound:output_type -> pbds.ListTemplatesNotBoundResp - 104, // 369: pbds.Data.ListTmplsOfTmplSet:output_type -> pbds.ListTmplsOfTmplSetResp - 106, // 370: pbds.Data.ListTemplateByTuple:output_type -> pbds.ListTemplateByTupleReqResp - 108, // 371: pbds.Data.BatchUpsertTemplates:output_type -> pbds.BatchUpsertTemplatesReqResp - 15, // 372: pbds.Data.CreateTemplateRevision:output_type -> pbds.CreateResp - 111, // 373: pbds.Data.ListTemplateRevisions:output_type -> pbds.ListTemplateRevisionsResp - 310, // 374: pbds.Data.DeleteTemplateRevision:output_type -> pbbase.EmptyResp - 114, // 375: pbds.Data.ListTemplateRevisionsByIDs:output_type -> pbds.ListTemplateRevisionsByIDsResp - 116, // 376: pbds.Data.ListTmplRevisionNamesByTmplIDs:output_type -> pbds.ListTmplRevisionNamesByTmplIDsResp - 15, // 377: pbds.Data.CreateTemplateSet:output_type -> pbds.CreateResp - 119, // 378: pbds.Data.ListTemplateSets:output_type -> pbds.ListTemplateSetsResp - 310, // 379: pbds.Data.UpdateTemplateSet:output_type -> pbbase.EmptyResp - 310, // 380: pbds.Data.DeleteTemplateSet:output_type -> pbbase.EmptyResp - 123, // 381: pbds.Data.ListAppTemplateSets:output_type -> pbds.ListAppTemplateSetsResp - 125, // 382: pbds.Data.ListTemplateSetsByIDs:output_type -> pbds.ListTemplateSetsByIDsResp - 127, // 383: pbds.Data.ListTemplateSetBriefInfoByIDs:output_type -> pbds.ListTemplateSetBriefInfoByIDsResp - 129, // 384: pbds.Data.ListTmplSetsOfBiz:output_type -> pbds.ListTmplSetsOfBizResp - 15, // 385: pbds.Data.CreateAppTemplateBinding:output_type -> pbds.CreateResp - 132, // 386: pbds.Data.ListAppTemplateBindings:output_type -> pbds.ListAppTemplateBindingsResp - 310, // 387: pbds.Data.UpdateAppTemplateBinding:output_type -> pbbase.EmptyResp - 310, // 388: pbds.Data.DeleteAppTemplateBinding:output_type -> pbbase.EmptyResp - 136, // 389: pbds.Data.ListAppBoundTmplRevisions:output_type -> pbds.ListAppBoundTmplRevisionsResp - 138, // 390: pbds.Data.ListReleasedAppBoundTmplRevisions:output_type -> pbds.ListReleasedAppBoundTmplRevisionsResp - 140, // 391: pbds.Data.GetReleasedAppBoundTmplRevision:output_type -> pbds.GetReleasedAppBoundTmplRevisionResp - 142, // 392: pbds.Data.CheckAppTemplateBinding:output_type -> pbds.CheckAppTemplateBindingResp - 144, // 393: pbds.Data.ExtractAppTmplVariables:output_type -> pbds.ExtractAppTmplVariablesResp - 146, // 394: pbds.Data.GetAppTmplVariableRefs:output_type -> pbds.GetAppTmplVariableRefsResp - 148, // 395: pbds.Data.GetReleasedAppTmplVariableRefs:output_type -> pbds.GetReleasedAppTmplVariableRefsResp - 310, // 396: pbds.Data.UpdateAppTmplVariables:output_type -> pbbase.EmptyResp - 151, // 397: pbds.Data.ListAppTmplVariables:output_type -> pbds.ListAppTmplVariablesResp - 153, // 398: pbds.Data.ListReleasedAppTmplVariables:output_type -> pbds.ListReleasedAppTmplVariablesResp - 155, // 399: pbds.Data.ListTmplBoundCounts:output_type -> pbds.ListTmplBoundCountsResp - 157, // 400: pbds.Data.ListTmplRevisionBoundCounts:output_type -> pbds.ListTmplRevisionBoundCountsResp - 159, // 401: pbds.Data.ListTmplSetBoundCounts:output_type -> pbds.ListTmplSetBoundCountsResp - 161, // 402: pbds.Data.ListTmplBoundUnnamedApps:output_type -> pbds.ListTmplBoundUnnamedAppsResp - 163, // 403: pbds.Data.ListTmplBoundNamedApps:output_type -> pbds.ListTmplBoundNamedAppsResp - 165, // 404: pbds.Data.ListTmplBoundTmplSets:output_type -> pbds.ListTmplBoundTmplSetsResp - 167, // 405: pbds.Data.ListMultiTmplBoundTmplSets:output_type -> pbds.ListMultiTmplBoundTmplSetsResp - 169, // 406: pbds.Data.ListTmplRevisionBoundUnnamedApps:output_type -> pbds.ListTmplRevisionBoundUnnamedAppsResp - 171, // 407: pbds.Data.ListTmplRevisionBoundNamedApps:output_type -> pbds.ListTmplRevisionBoundNamedAppsResp - 173, // 408: pbds.Data.ListTmplSetBoundUnnamedApps:output_type -> pbds.ListTmplSetBoundUnnamedAppsResp - 175, // 409: pbds.Data.ListMultiTmplSetBoundUnnamedApps:output_type -> pbds.ListMultiTmplSetBoundUnnamedAppsResp - 177, // 410: pbds.Data.ListTmplSetBoundNamedApps:output_type -> pbds.ListTmplSetBoundNamedAppsResp - 179, // 411: pbds.Data.ListLatestTmplBoundUnnamedApps:output_type -> pbds.ListLatestTmplBoundUnnamedAppsResp - 15, // 412: pbds.Data.CreateTemplateVariable:output_type -> pbds.CreateResp - 184, // 413: pbds.Data.ListTemplateVariables:output_type -> pbds.ListTemplateVariablesResp - 310, // 414: pbds.Data.UpdateTemplateVariable:output_type -> pbbase.EmptyResp - 310, // 415: pbds.Data.DeleteTemplateVariable:output_type -> pbbase.EmptyResp - 182, // 416: pbds.Data.ImportTemplateVariables:output_type -> pbds.ImportTemplateVariablesResp - 15, // 417: pbds.Data.CreateGroup:output_type -> pbds.CreateResp - 189, // 418: pbds.Data.ListAllGroups:output_type -> pbds.ListAllGroupsResp - 191, // 419: pbds.Data.ListAppGroups:output_type -> pbds.ListAppGroupsResp - 301, // 420: pbds.Data.GetGroupByName:output_type -> pbgroup.Group - 310, // 421: pbds.Data.UpdateGroup:output_type -> pbbase.EmptyResp - 310, // 422: pbds.Data.DeleteGroup:output_type -> pbbase.EmptyResp - 196, // 423: pbds.Data.CountGroupsReleasedApps:output_type -> pbds.CountGroupsReleasedAppsResp - 198, // 424: pbds.Data.ListGroupReleasedApps:output_type -> pbds.ListGroupReleasedAppsResp - 201, // 425: pbds.Data.Publish:output_type -> pbds.PublishResp - 201, // 426: pbds.Data.GenerateReleaseAndPublish:output_type -> pbds.PublishResp - 15, // 427: pbds.Data.CreateCredential:output_type -> pbds.CreateResp - 9, // 428: pbds.Data.ListCredentials:output_type -> pbds.ListCredentialResp - 310, // 429: pbds.Data.DeleteCredential:output_type -> pbbase.EmptyResp - 310, // 430: pbds.Data.UpdateCredential:output_type -> pbbase.EmptyResp - 12, // 431: pbds.Data.CheckCredentialName:output_type -> pbds.CheckCredentialNameResp - 5, // 432: pbds.Data.ListCredentialScopes:output_type -> pbds.ListCredentialScopesResp - 1, // 433: pbds.Data.UpdateCredentialScopes:output_type -> pbds.UpdateCredentialScopesResp - 15, // 434: pbds.Data.CreateKv:output_type -> pbds.CreateResp - 310, // 435: pbds.Data.UpdateKv:output_type -> pbbase.EmptyResp - 212, // 436: pbds.Data.ListKvs:output_type -> pbds.ListKvsResp - 310, // 437: pbds.Data.DeleteKv:output_type -> pbbase.EmptyResp - 215, // 438: pbds.Data.BatchUpsertKvs:output_type -> pbds.BatchUpsertKvsResp - 310, // 439: pbds.Data.UnDeleteKv:output_type -> pbbase.EmptyResp - 203, // 440: pbds.Data.ListInstances:output_type -> pbds.ListInstancesResp - 206, // 441: pbds.Data.FetchInstanceInfo:output_type -> pbds.FetchInstanceInfoResp - 208, // 442: pbds.Data.Ping:output_type -> pbds.PingMsg - 305, // [305:443] is the sub-list for method output_type - 167, // [167:305] is the sub-list for method input_type - 167, // [167:167] is the sub-list for extension type_name - 167, // [167:167] is the sub-list for extension extendee - 0, // [0:167] is the sub-list for field type_name + 306, // 144: pbds.CreateKvReq.attachment:type_name -> pbkv.KvAttachment + 307, // 145: pbds.CreateKvReq.spec:type_name -> pbkv.KvSpec + 306, // 146: pbds.UpdateKvReq.attachment:type_name -> pbkv.KvAttachment + 307, // 147: pbds.UpdateKvReq.spec:type_name -> pbkv.KvSpec + 308, // 148: pbds.ListKvsResp.details:type_name -> pbkv.Kv + 307, // 149: pbds.DeleteKvReq.spec:type_name -> pbkv.KvSpec + 306, // 150: pbds.DeleteKvReq.attachment:type_name -> pbkv.KvAttachment + 233, // 151: pbds.BatchUpsertKvsReq.kvs:type_name -> pbds.BatchUpsertKvsReq.Kv + 307, // 152: pbds.UnDeleteKvReq.spec:type_name -> pbkv.KvSpec + 306, // 153: pbds.UnDeleteKvReq.attachment:type_name -> pbkv.KvAttachment + 309, // 154: pbds.BatchUpsertClientMetricsReq.client_items:type_name -> pbclient.Client + 310, // 155: pbds.BatchUpsertClientMetricsReq.client_event_items:type_name -> pbce.ClientEvent + 243, // 156: pbds.BatchUpsertConfigItemsReq.ConfigItem.config_item_attachment:type_name -> pbci.ConfigItemAttachment + 244, // 157: pbds.BatchUpsertConfigItemsReq.ConfigItem.config_item_spec:type_name -> pbci.ConfigItemSpec + 245, // 158: pbds.BatchUpsertConfigItemsReq.ConfigItem.content_spec:type_name -> pbcontent.ContentSpec + 311, // 159: pbds.ListHooksResp.Detail.hook:type_name -> pbhook.Hook + 312, // 160: pbds.ListHookRevisionsResp.ListHookRevisionsData.hook_revision:type_name -> pbhr.HookRevision + 268, // 161: pbds.ListTemplateByTupleReqResp.Item.template:type_name -> pbtemplate.Template + 270, // 162: pbds.ListTemplateByTupleReqResp.Item.template_revision:type_name -> pbtr.TemplateRevision + 268, // 163: pbds.BatchUpsertTemplatesReq.Item.template:type_name -> pbtemplate.Template + 270, // 164: pbds.BatchUpsertTemplatesReq.Item.template_revision:type_name -> pbtr.TemplateRevision + 304, // 165: pbds.ListAppGroupsResp.ListAppGroupsData.old_selector:type_name -> google.protobuf.Struct + 304, // 166: pbds.ListAppGroupsResp.ListAppGroupsData.new_selector:type_name -> google.protobuf.Struct + 306, // 167: pbds.BatchUpsertKvsReq.Kv.kv_attachment:type_name -> pbkv.KvAttachment + 307, // 168: pbds.BatchUpsertKvsReq.Kv.kv_spec:type_name -> pbkv.KvSpec + 18, // 169: pbds.Data.CreateApp:input_type -> pbds.CreateAppReq + 19, // 170: pbds.Data.UpdateApp:input_type -> pbds.UpdateAppReq + 20, // 171: pbds.Data.DeleteApp:input_type -> pbds.DeleteAppReq + 21, // 172: pbds.Data.GetApp:input_type -> pbds.GetAppReq + 22, // 173: pbds.Data.GetAppByID:input_type -> pbds.GetAppByIDReq + 23, // 174: pbds.Data.GetAppByName:input_type -> pbds.GetAppByNameReq + 24, // 175: pbds.Data.ListAppsRest:input_type -> pbds.ListAppsRestReq + 26, // 176: pbds.Data.ListAppsByIDs:input_type -> pbds.ListAppsByIDsReq + 28, // 177: pbds.Data.CreateConfigItem:input_type -> pbds.CreateConfigItemReq + 29, // 178: pbds.Data.BatchUpsertConfigItems:input_type -> pbds.BatchUpsertConfigItemsReq + 31, // 179: pbds.Data.UpdateConfigItem:input_type -> pbds.UpdateConfigItemReq + 32, // 180: pbds.Data.DeleteConfigItem:input_type -> pbds.DeleteConfigItemReq + 33, // 181: pbds.Data.UnDeleteConfigItem:input_type -> pbds.UnDeleteConfigItemReq + 34, // 182: pbds.Data.UndoConfigItem:input_type -> pbds.UndoConfigItemReq + 35, // 183: pbds.Data.GetConfigItem:input_type -> pbds.GetConfigItemReq + 36, // 184: pbds.Data.ListConfigItems:input_type -> pbds.ListConfigItemsReq + 38, // 185: pbds.Data.ListReleasedConfigItems:input_type -> pbds.ListReleasedConfigItemsReq + 40, // 186: pbds.Data.ListConfigItemCount:input_type -> pbds.ListConfigItemCountReq + 42, // 187: pbds.Data.ListConfigItemByTuple:input_type -> pbds.ListConfigItemByTupleReq + 16, // 188: pbds.Data.UpdateConfigHook:input_type -> pbds.UpdateConfigHookReq + 44, // 189: pbds.Data.CreateContent:input_type -> pbds.CreateContentReq + 45, // 190: pbds.Data.GetContent:input_type -> pbds.GetContentReq + 46, // 191: pbds.Data.CreateCommit:input_type -> pbds.CreateCommitReq + 47, // 192: pbds.Data.GetLatestCommit:input_type -> pbds.GetLatestCommitReq + 48, // 193: pbds.Data.CreateRelease:input_type -> pbds.CreateReleaseReq + 49, // 194: pbds.Data.ListReleases:input_type -> pbds.ListReleasesReq + 51, // 195: pbds.Data.GetReleaseByName:input_type -> pbds.GetReleaseByNameReq + 52, // 196: pbds.Data.DeprecateRelease:input_type -> pbds.DeprecateReleaseReq + 53, // 197: pbds.Data.UnDeprecateRelease:input_type -> pbds.UnDeprecateReleaseReq + 54, // 198: pbds.Data.DeleteRelease:input_type -> pbds.DeleteReleaseReq + 55, // 199: pbds.Data.GetReleasedConfigItem:input_type -> pbds.GetReleasedCIReq + 56, // 200: pbds.Data.GetReleasedKv:input_type -> pbds.GetReleasedKvReq + 57, // 201: pbds.Data.ListReleasedKvs:input_type -> pbds.ListReleasedKvReq + 59, // 202: pbds.Data.CreateHook:input_type -> pbds.CreateHookReq + 64, // 203: pbds.Data.ListHooks:input_type -> pbds.ListHooksReq + 69, // 204: pbds.Data.DeleteHook:input_type -> pbds.DeleteHookReq + 60, // 205: pbds.Data.ListHookTags:input_type -> pbds.ListHookTagReq + 67, // 206: pbds.Data.ListHookReferences:input_type -> pbds.ListHookReferencesReq + 61, // 207: pbds.Data.GetHook:input_type -> pbds.GetHookReq + 70, // 208: pbds.Data.CreateHookRevision:input_type -> pbds.CreateHookRevisionReq + 71, // 209: pbds.Data.ListHookRevisions:input_type -> pbds.ListHookRevisionsReq + 73, // 210: pbds.Data.GetHookRevisionByID:input_type -> pbds.GetHookRevisionByIdReq + 74, // 211: pbds.Data.DeleteHookRevision:input_type -> pbds.DeleteHookRevisionReq + 75, // 212: pbds.Data.PublishHookRevision:input_type -> pbds.PublishHookRevisionReq + 76, // 213: pbds.Data.GetHookRevisionByPubState:input_type -> pbds.GetByPubStateReq + 77, // 214: pbds.Data.UpdateHookRevision:input_type -> pbds.UpdateHookRevisionReq + 78, // 215: pbds.Data.ListHookRevisionReferences:input_type -> pbds.ListHookRevisionReferencesReq + 80, // 216: pbds.Data.GetReleaseHook:input_type -> pbds.GetReleaseHookReq + 82, // 217: pbds.Data.CreateTemplateSpace:input_type -> pbds.CreateTemplateSpaceReq + 83, // 218: pbds.Data.ListTemplateSpaces:input_type -> pbds.ListTemplateSpacesReq + 85, // 219: pbds.Data.UpdateTemplateSpace:input_type -> pbds.UpdateTemplateSpaceReq + 86, // 220: pbds.Data.DeleteTemplateSpace:input_type -> pbds.DeleteTemplateSpaceReq + 313, // 221: pbds.Data.GetAllBizsOfTmplSpaces:input_type -> pbbase.EmptyReq + 88, // 222: pbds.Data.CreateDefaultTmplSpace:input_type -> pbds.CreateDefaultTmplSpaceReq + 89, // 223: pbds.Data.ListTmplSpacesByIDs:input_type -> pbds.ListTmplSpacesByIDsReq + 91, // 224: pbds.Data.CreateTemplate:input_type -> pbds.CreateTemplateReq + 92, // 225: pbds.Data.ListTemplates:input_type -> pbds.ListTemplatesReq + 94, // 226: pbds.Data.UpdateTemplate:input_type -> pbds.UpdateTemplateReq + 95, // 227: pbds.Data.DeleteTemplate:input_type -> pbds.DeleteTemplateReq + 96, // 228: pbds.Data.BatchDeleteTemplate:input_type -> pbds.BatchDeleteTemplateReq + 97, // 229: pbds.Data.AddTmplsToTmplSets:input_type -> pbds.AddTmplsToTmplSetsReq + 98, // 230: pbds.Data.DeleteTmplsFromTmplSets:input_type -> pbds.DeleteTmplsFromTmplSetsReq + 99, // 231: pbds.Data.ListTemplatesByIDs:input_type -> pbds.ListTemplatesByIDsReq + 101, // 232: pbds.Data.ListTemplatesNotBound:input_type -> pbds.ListTemplatesNotBoundReq + 103, // 233: pbds.Data.ListTmplsOfTmplSet:input_type -> pbds.ListTmplsOfTmplSetReq + 105, // 234: pbds.Data.ListTemplateByTuple:input_type -> pbds.ListTemplateByTupleReq + 107, // 235: pbds.Data.BatchUpsertTemplates:input_type -> pbds.BatchUpsertTemplatesReq + 109, // 236: pbds.Data.CreateTemplateRevision:input_type -> pbds.CreateTemplateRevisionReq + 110, // 237: pbds.Data.ListTemplateRevisions:input_type -> pbds.ListTemplateRevisionsReq + 112, // 238: pbds.Data.DeleteTemplateRevision:input_type -> pbds.DeleteTemplateRevisionReq + 113, // 239: pbds.Data.ListTemplateRevisionsByIDs:input_type -> pbds.ListTemplateRevisionsByIDsReq + 115, // 240: pbds.Data.ListTmplRevisionNamesByTmplIDs:input_type -> pbds.ListTmplRevisionNamesByTmplIDsReq + 117, // 241: pbds.Data.CreateTemplateSet:input_type -> pbds.CreateTemplateSetReq + 118, // 242: pbds.Data.ListTemplateSets:input_type -> pbds.ListTemplateSetsReq + 120, // 243: pbds.Data.UpdateTemplateSet:input_type -> pbds.UpdateTemplateSetReq + 121, // 244: pbds.Data.DeleteTemplateSet:input_type -> pbds.DeleteTemplateSetReq + 122, // 245: pbds.Data.ListAppTemplateSets:input_type -> pbds.ListAppTemplateSetsReq + 124, // 246: pbds.Data.ListTemplateSetsByIDs:input_type -> pbds.ListTemplateSetsByIDsReq + 126, // 247: pbds.Data.ListTemplateSetBriefInfoByIDs:input_type -> pbds.ListTemplateSetBriefInfoByIDsReq + 128, // 248: pbds.Data.ListTmplSetsOfBiz:input_type -> pbds.ListTmplSetsOfBizReq + 130, // 249: pbds.Data.CreateAppTemplateBinding:input_type -> pbds.CreateAppTemplateBindingReq + 131, // 250: pbds.Data.ListAppTemplateBindings:input_type -> pbds.ListAppTemplateBindingsReq + 133, // 251: pbds.Data.UpdateAppTemplateBinding:input_type -> pbds.UpdateAppTemplateBindingReq + 134, // 252: pbds.Data.DeleteAppTemplateBinding:input_type -> pbds.DeleteAppTemplateBindingReq + 135, // 253: pbds.Data.ListAppBoundTmplRevisions:input_type -> pbds.ListAppBoundTmplRevisionsReq + 137, // 254: pbds.Data.ListReleasedAppBoundTmplRevisions:input_type -> pbds.ListReleasedAppBoundTmplRevisionsReq + 139, // 255: pbds.Data.GetReleasedAppBoundTmplRevision:input_type -> pbds.GetReleasedAppBoundTmplRevisionReq + 141, // 256: pbds.Data.CheckAppTemplateBinding:input_type -> pbds.CheckAppTemplateBindingReq + 143, // 257: pbds.Data.ExtractAppTmplVariables:input_type -> pbds.ExtractAppTmplVariablesReq + 145, // 258: pbds.Data.GetAppTmplVariableRefs:input_type -> pbds.GetAppTmplVariableRefsReq + 147, // 259: pbds.Data.GetReleasedAppTmplVariableRefs:input_type -> pbds.GetReleasedAppTmplVariableRefsReq + 149, // 260: pbds.Data.UpdateAppTmplVariables:input_type -> pbds.UpdateAppTmplVariablesReq + 150, // 261: pbds.Data.ListAppTmplVariables:input_type -> pbds.ListAppTmplVariablesReq + 152, // 262: pbds.Data.ListReleasedAppTmplVariables:input_type -> pbds.ListReleasedAppTmplVariablesReq + 154, // 263: pbds.Data.ListTmplBoundCounts:input_type -> pbds.ListTmplBoundCountsReq + 156, // 264: pbds.Data.ListTmplRevisionBoundCounts:input_type -> pbds.ListTmplRevisionBoundCountsReq + 158, // 265: pbds.Data.ListTmplSetBoundCounts:input_type -> pbds.ListTmplSetBoundCountsReq + 160, // 266: pbds.Data.ListTmplBoundUnnamedApps:input_type -> pbds.ListTmplBoundUnnamedAppsReq + 162, // 267: pbds.Data.ListTmplBoundNamedApps:input_type -> pbds.ListTmplBoundNamedAppsReq + 164, // 268: pbds.Data.ListTmplBoundTmplSets:input_type -> pbds.ListTmplBoundTmplSetsReq + 166, // 269: pbds.Data.ListMultiTmplBoundTmplSets:input_type -> pbds.ListMultiTmplBoundTmplSetsReq + 168, // 270: pbds.Data.ListTmplRevisionBoundUnnamedApps:input_type -> pbds.ListTmplRevisionBoundUnnamedAppsReq + 170, // 271: pbds.Data.ListTmplRevisionBoundNamedApps:input_type -> pbds.ListTmplRevisionBoundNamedAppsReq + 172, // 272: pbds.Data.ListTmplSetBoundUnnamedApps:input_type -> pbds.ListTmplSetBoundUnnamedAppsReq + 174, // 273: pbds.Data.ListMultiTmplSetBoundUnnamedApps:input_type -> pbds.ListMultiTmplSetBoundUnnamedAppsReq + 176, // 274: pbds.Data.ListTmplSetBoundNamedApps:input_type -> pbds.ListTmplSetBoundNamedAppsReq + 178, // 275: pbds.Data.ListLatestTmplBoundUnnamedApps:input_type -> pbds.ListLatestTmplBoundUnnamedAppsReq + 180, // 276: pbds.Data.CreateTemplateVariable:input_type -> pbds.CreateTemplateVariableReq + 183, // 277: pbds.Data.ListTemplateVariables:input_type -> pbds.ListTemplateVariablesReq + 185, // 278: pbds.Data.UpdateTemplateVariable:input_type -> pbds.UpdateTemplateVariableReq + 186, // 279: pbds.Data.DeleteTemplateVariable:input_type -> pbds.DeleteTemplateVariableReq + 181, // 280: pbds.Data.ImportTemplateVariables:input_type -> pbds.ImportTemplateVariablesReq + 187, // 281: pbds.Data.CreateGroup:input_type -> pbds.CreateGroupReq + 188, // 282: pbds.Data.ListAllGroups:input_type -> pbds.ListAllGroupsReq + 190, // 283: pbds.Data.ListAppGroups:input_type -> pbds.ListAppGroupsReq + 192, // 284: pbds.Data.GetGroupByName:input_type -> pbds.GetGroupByNameReq + 193, // 285: pbds.Data.UpdateGroup:input_type -> pbds.UpdateGroupReq + 194, // 286: pbds.Data.DeleteGroup:input_type -> pbds.DeleteGroupReq + 195, // 287: pbds.Data.CountGroupsReleasedApps:input_type -> pbds.CountGroupsReleasedAppsReq + 197, // 288: pbds.Data.ListGroupReleasedApps:input_type -> pbds.ListGroupReleasedAppsReq + 199, // 289: pbds.Data.Publish:input_type -> pbds.PublishReq + 200, // 290: pbds.Data.GenerateReleaseAndPublish:input_type -> pbds.GenerateReleaseAndPublishReq + 7, // 291: pbds.Data.CreateCredential:input_type -> pbds.CreateCredentialReq + 8, // 292: pbds.Data.ListCredentials:input_type -> pbds.ListCredentialReq + 13, // 293: pbds.Data.DeleteCredential:input_type -> pbds.DeleteCredentialReq + 10, // 294: pbds.Data.UpdateCredential:input_type -> pbds.UpdateCredentialReq + 11, // 295: pbds.Data.CheckCredentialName:input_type -> pbds.CheckCredentialNameReq + 4, // 296: pbds.Data.ListCredentialScopes:input_type -> pbds.ListCredentialScopesReq + 0, // 297: pbds.Data.UpdateCredentialScopes:input_type -> pbds.UpdateCredentialScopesReq + 209, // 298: pbds.Data.CreateKv:input_type -> pbds.CreateKvReq + 210, // 299: pbds.Data.UpdateKv:input_type -> pbds.UpdateKvReq + 211, // 300: pbds.Data.ListKvs:input_type -> pbds.ListKvsReq + 213, // 301: pbds.Data.DeleteKv:input_type -> pbds.DeleteKvReq + 214, // 302: pbds.Data.BatchUpsertKvs:input_type -> pbds.BatchUpsertKvsReq + 216, // 303: pbds.Data.UnDeleteKv:input_type -> pbds.UnDeleteKvReq + 202, // 304: pbds.Data.ListInstances:input_type -> pbds.ListInstancesReq + 205, // 305: pbds.Data.FetchInstanceInfo:input_type -> pbds.FetchInstanceInfoReq + 208, // 306: pbds.Data.Ping:input_type -> pbds.PingMsg + 217, // 307: pbds.Data.BatchUpsertClientMetrics:input_type -> pbds.BatchUpsertClientMetricsReq + 15, // 308: pbds.Data.CreateApp:output_type -> pbds.CreateResp + 242, // 309: pbds.Data.UpdateApp:output_type -> pbapp.App + 314, // 310: pbds.Data.DeleteApp:output_type -> pbbase.EmptyResp + 242, // 311: pbds.Data.GetApp:output_type -> pbapp.App + 242, // 312: pbds.Data.GetAppByID:output_type -> pbapp.App + 242, // 313: pbds.Data.GetAppByName:output_type -> pbapp.App + 25, // 314: pbds.Data.ListAppsRest:output_type -> pbds.ListAppsResp + 27, // 315: pbds.Data.ListAppsByIDs:output_type -> pbds.ListAppsByIDsResp + 15, // 316: pbds.Data.CreateConfigItem:output_type -> pbds.CreateResp + 30, // 317: pbds.Data.BatchUpsertConfigItems:output_type -> pbds.BatchUpsertConfigItemsResp + 314, // 318: pbds.Data.UpdateConfigItem:output_type -> pbbase.EmptyResp + 314, // 319: pbds.Data.DeleteConfigItem:output_type -> pbbase.EmptyResp + 314, // 320: pbds.Data.UnDeleteConfigItem:output_type -> pbbase.EmptyResp + 314, // 321: pbds.Data.UndoConfigItem:output_type -> pbbase.EmptyResp + 246, // 322: pbds.Data.GetConfigItem:output_type -> pbci.ConfigItem + 37, // 323: pbds.Data.ListConfigItems:output_type -> pbds.ListConfigItemsResp + 39, // 324: pbds.Data.ListReleasedConfigItems:output_type -> pbds.ListReleasedConfigItemsResp + 41, // 325: pbds.Data.ListConfigItemCount:output_type -> pbds.ListConfigItemCountResp + 43, // 326: pbds.Data.ListConfigItemByTuple:output_type -> pbds.ListConfigItemByTupleResp + 314, // 327: pbds.Data.UpdateConfigHook:output_type -> pbbase.EmptyResp + 15, // 328: pbds.Data.CreateContent:output_type -> pbds.CreateResp + 315, // 329: pbds.Data.GetContent:output_type -> pbcontent.Content + 15, // 330: pbds.Data.CreateCommit:output_type -> pbds.CreateResp + 316, // 331: pbds.Data.GetLatestCommit:output_type -> pbcommit.Commit + 15, // 332: pbds.Data.CreateRelease:output_type -> pbds.CreateResp + 50, // 333: pbds.Data.ListReleases:output_type -> pbds.ListReleasesResp + 254, // 334: pbds.Data.GetReleaseByName:output_type -> pbrelease.Release + 314, // 335: pbds.Data.DeprecateRelease:output_type -> pbbase.EmptyResp + 314, // 336: pbds.Data.UnDeprecateRelease:output_type -> pbbase.EmptyResp + 314, // 337: pbds.Data.DeleteRelease:output_type -> pbbase.EmptyResp + 247, // 338: pbds.Data.GetReleasedConfigItem:output_type -> pbrci.ReleasedConfigItem + 255, // 339: pbds.Data.GetReleasedKv:output_type -> pbrkv.ReleasedKv + 58, // 340: pbds.Data.ListReleasedKvs:output_type -> pbds.ListReleasedKvResp + 15, // 341: pbds.Data.CreateHook:output_type -> pbds.CreateResp + 65, // 342: pbds.Data.ListHooks:output_type -> pbds.ListHooksResp + 314, // 343: pbds.Data.DeleteHook:output_type -> pbbase.EmptyResp + 66, // 344: pbds.Data.ListHookTags:output_type -> pbds.ListHookTagResp + 68, // 345: pbds.Data.ListHookReferences:output_type -> pbds.ListHookReferencesResp + 62, // 346: pbds.Data.GetHook:output_type -> pbds.GetHookResp + 15, // 347: pbds.Data.CreateHookRevision:output_type -> pbds.CreateResp + 72, // 348: pbds.Data.ListHookRevisions:output_type -> pbds.ListHookRevisionsResp + 312, // 349: pbds.Data.GetHookRevisionByID:output_type -> pbhr.HookRevision + 314, // 350: pbds.Data.DeleteHookRevision:output_type -> pbbase.EmptyResp + 314, // 351: pbds.Data.PublishHookRevision:output_type -> pbbase.EmptyResp + 312, // 352: pbds.Data.GetHookRevisionByPubState:output_type -> pbhr.HookRevision + 314, // 353: pbds.Data.UpdateHookRevision:output_type -> pbbase.EmptyResp + 79, // 354: pbds.Data.ListHookRevisionReferences:output_type -> pbds.ListHookRevisionReferencesResp + 81, // 355: pbds.Data.GetReleaseHook:output_type -> pbds.GetReleaseHookResp + 15, // 356: pbds.Data.CreateTemplateSpace:output_type -> pbds.CreateResp + 84, // 357: pbds.Data.ListTemplateSpaces:output_type -> pbds.ListTemplateSpacesResp + 314, // 358: pbds.Data.UpdateTemplateSpace:output_type -> pbbase.EmptyResp + 314, // 359: pbds.Data.DeleteTemplateSpace:output_type -> pbbase.EmptyResp + 87, // 360: pbds.Data.GetAllBizsOfTmplSpaces:output_type -> pbds.GetAllBizsOfTmplSpacesResp + 15, // 361: pbds.Data.CreateDefaultTmplSpace:output_type -> pbds.CreateResp + 90, // 362: pbds.Data.ListTmplSpacesByIDs:output_type -> pbds.ListTmplSpacesByIDsResp + 15, // 363: pbds.Data.CreateTemplate:output_type -> pbds.CreateResp + 93, // 364: pbds.Data.ListTemplates:output_type -> pbds.ListTemplatesResp + 314, // 365: pbds.Data.UpdateTemplate:output_type -> pbbase.EmptyResp + 314, // 366: pbds.Data.DeleteTemplate:output_type -> pbbase.EmptyResp + 314, // 367: pbds.Data.BatchDeleteTemplate:output_type -> pbbase.EmptyResp + 314, // 368: pbds.Data.AddTmplsToTmplSets:output_type -> pbbase.EmptyResp + 314, // 369: pbds.Data.DeleteTmplsFromTmplSets:output_type -> pbbase.EmptyResp + 100, // 370: pbds.Data.ListTemplatesByIDs:output_type -> pbds.ListTemplatesByIDsResp + 102, // 371: pbds.Data.ListTemplatesNotBound:output_type -> pbds.ListTemplatesNotBoundResp + 104, // 372: pbds.Data.ListTmplsOfTmplSet:output_type -> pbds.ListTmplsOfTmplSetResp + 106, // 373: pbds.Data.ListTemplateByTuple:output_type -> pbds.ListTemplateByTupleReqResp + 108, // 374: pbds.Data.BatchUpsertTemplates:output_type -> pbds.BatchUpsertTemplatesReqResp + 15, // 375: pbds.Data.CreateTemplateRevision:output_type -> pbds.CreateResp + 111, // 376: pbds.Data.ListTemplateRevisions:output_type -> pbds.ListTemplateRevisionsResp + 314, // 377: pbds.Data.DeleteTemplateRevision:output_type -> pbbase.EmptyResp + 114, // 378: pbds.Data.ListTemplateRevisionsByIDs:output_type -> pbds.ListTemplateRevisionsByIDsResp + 116, // 379: pbds.Data.ListTmplRevisionNamesByTmplIDs:output_type -> pbds.ListTmplRevisionNamesByTmplIDsResp + 15, // 380: pbds.Data.CreateTemplateSet:output_type -> pbds.CreateResp + 119, // 381: pbds.Data.ListTemplateSets:output_type -> pbds.ListTemplateSetsResp + 314, // 382: pbds.Data.UpdateTemplateSet:output_type -> pbbase.EmptyResp + 314, // 383: pbds.Data.DeleteTemplateSet:output_type -> pbbase.EmptyResp + 123, // 384: pbds.Data.ListAppTemplateSets:output_type -> pbds.ListAppTemplateSetsResp + 125, // 385: pbds.Data.ListTemplateSetsByIDs:output_type -> pbds.ListTemplateSetsByIDsResp + 127, // 386: pbds.Data.ListTemplateSetBriefInfoByIDs:output_type -> pbds.ListTemplateSetBriefInfoByIDsResp + 129, // 387: pbds.Data.ListTmplSetsOfBiz:output_type -> pbds.ListTmplSetsOfBizResp + 15, // 388: pbds.Data.CreateAppTemplateBinding:output_type -> pbds.CreateResp + 132, // 389: pbds.Data.ListAppTemplateBindings:output_type -> pbds.ListAppTemplateBindingsResp + 314, // 390: pbds.Data.UpdateAppTemplateBinding:output_type -> pbbase.EmptyResp + 314, // 391: pbds.Data.DeleteAppTemplateBinding:output_type -> pbbase.EmptyResp + 136, // 392: pbds.Data.ListAppBoundTmplRevisions:output_type -> pbds.ListAppBoundTmplRevisionsResp + 138, // 393: pbds.Data.ListReleasedAppBoundTmplRevisions:output_type -> pbds.ListReleasedAppBoundTmplRevisionsResp + 140, // 394: pbds.Data.GetReleasedAppBoundTmplRevision:output_type -> pbds.GetReleasedAppBoundTmplRevisionResp + 142, // 395: pbds.Data.CheckAppTemplateBinding:output_type -> pbds.CheckAppTemplateBindingResp + 144, // 396: pbds.Data.ExtractAppTmplVariables:output_type -> pbds.ExtractAppTmplVariablesResp + 146, // 397: pbds.Data.GetAppTmplVariableRefs:output_type -> pbds.GetAppTmplVariableRefsResp + 148, // 398: pbds.Data.GetReleasedAppTmplVariableRefs:output_type -> pbds.GetReleasedAppTmplVariableRefsResp + 314, // 399: pbds.Data.UpdateAppTmplVariables:output_type -> pbbase.EmptyResp + 151, // 400: pbds.Data.ListAppTmplVariables:output_type -> pbds.ListAppTmplVariablesResp + 153, // 401: pbds.Data.ListReleasedAppTmplVariables:output_type -> pbds.ListReleasedAppTmplVariablesResp + 155, // 402: pbds.Data.ListTmplBoundCounts:output_type -> pbds.ListTmplBoundCountsResp + 157, // 403: pbds.Data.ListTmplRevisionBoundCounts:output_type -> pbds.ListTmplRevisionBoundCountsResp + 159, // 404: pbds.Data.ListTmplSetBoundCounts:output_type -> pbds.ListTmplSetBoundCountsResp + 161, // 405: pbds.Data.ListTmplBoundUnnamedApps:output_type -> pbds.ListTmplBoundUnnamedAppsResp + 163, // 406: pbds.Data.ListTmplBoundNamedApps:output_type -> pbds.ListTmplBoundNamedAppsResp + 165, // 407: pbds.Data.ListTmplBoundTmplSets:output_type -> pbds.ListTmplBoundTmplSetsResp + 167, // 408: pbds.Data.ListMultiTmplBoundTmplSets:output_type -> pbds.ListMultiTmplBoundTmplSetsResp + 169, // 409: pbds.Data.ListTmplRevisionBoundUnnamedApps:output_type -> pbds.ListTmplRevisionBoundUnnamedAppsResp + 171, // 410: pbds.Data.ListTmplRevisionBoundNamedApps:output_type -> pbds.ListTmplRevisionBoundNamedAppsResp + 173, // 411: pbds.Data.ListTmplSetBoundUnnamedApps:output_type -> pbds.ListTmplSetBoundUnnamedAppsResp + 175, // 412: pbds.Data.ListMultiTmplSetBoundUnnamedApps:output_type -> pbds.ListMultiTmplSetBoundUnnamedAppsResp + 177, // 413: pbds.Data.ListTmplSetBoundNamedApps:output_type -> pbds.ListTmplSetBoundNamedAppsResp + 179, // 414: pbds.Data.ListLatestTmplBoundUnnamedApps:output_type -> pbds.ListLatestTmplBoundUnnamedAppsResp + 15, // 415: pbds.Data.CreateTemplateVariable:output_type -> pbds.CreateResp + 184, // 416: pbds.Data.ListTemplateVariables:output_type -> pbds.ListTemplateVariablesResp + 314, // 417: pbds.Data.UpdateTemplateVariable:output_type -> pbbase.EmptyResp + 314, // 418: pbds.Data.DeleteTemplateVariable:output_type -> pbbase.EmptyResp + 182, // 419: pbds.Data.ImportTemplateVariables:output_type -> pbds.ImportTemplateVariablesResp + 15, // 420: pbds.Data.CreateGroup:output_type -> pbds.CreateResp + 189, // 421: pbds.Data.ListAllGroups:output_type -> pbds.ListAllGroupsResp + 191, // 422: pbds.Data.ListAppGroups:output_type -> pbds.ListAppGroupsResp + 303, // 423: pbds.Data.GetGroupByName:output_type -> pbgroup.Group + 314, // 424: pbds.Data.UpdateGroup:output_type -> pbbase.EmptyResp + 314, // 425: pbds.Data.DeleteGroup:output_type -> pbbase.EmptyResp + 196, // 426: pbds.Data.CountGroupsReleasedApps:output_type -> pbds.CountGroupsReleasedAppsResp + 198, // 427: pbds.Data.ListGroupReleasedApps:output_type -> pbds.ListGroupReleasedAppsResp + 201, // 428: pbds.Data.Publish:output_type -> pbds.PublishResp + 201, // 429: pbds.Data.GenerateReleaseAndPublish:output_type -> pbds.PublishResp + 15, // 430: pbds.Data.CreateCredential:output_type -> pbds.CreateResp + 9, // 431: pbds.Data.ListCredentials:output_type -> pbds.ListCredentialResp + 314, // 432: pbds.Data.DeleteCredential:output_type -> pbbase.EmptyResp + 314, // 433: pbds.Data.UpdateCredential:output_type -> pbbase.EmptyResp + 12, // 434: pbds.Data.CheckCredentialName:output_type -> pbds.CheckCredentialNameResp + 5, // 435: pbds.Data.ListCredentialScopes:output_type -> pbds.ListCredentialScopesResp + 1, // 436: pbds.Data.UpdateCredentialScopes:output_type -> pbds.UpdateCredentialScopesResp + 15, // 437: pbds.Data.CreateKv:output_type -> pbds.CreateResp + 314, // 438: pbds.Data.UpdateKv:output_type -> pbbase.EmptyResp + 212, // 439: pbds.Data.ListKvs:output_type -> pbds.ListKvsResp + 314, // 440: pbds.Data.DeleteKv:output_type -> pbbase.EmptyResp + 215, // 441: pbds.Data.BatchUpsertKvs:output_type -> pbds.BatchUpsertKvsResp + 314, // 442: pbds.Data.UnDeleteKv:output_type -> pbbase.EmptyResp + 203, // 443: pbds.Data.ListInstances:output_type -> pbds.ListInstancesResp + 206, // 444: pbds.Data.FetchInstanceInfo:output_type -> pbds.FetchInstanceInfoResp + 208, // 445: pbds.Data.Ping:output_type -> pbds.PingMsg + 218, // 446: pbds.Data.BatchUpsertClientMetrics:output_type -> pbds.BatchUpsertClientMetricsResp + 308, // [308:447] is the sub-list for method output_type + 169, // [169:308] is the sub-list for method input_type + 169, // [169:169] is the sub-list for extension type_name + 169, // [169:169] is the sub-list for extension extendee + 0, // [0:169] is the sub-list for field type_name } func init() { file_data_service_proto_init() } @@ -20700,7 +20827,7 @@ func file_data_service_proto_init() { } } file_data_service_proto_msgTypes[217].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BatchUpsertConfigItemsReq_ConfigItem); i { + switch v := v.(*BatchUpsertClientMetricsReq); i { case 0: return &v.state case 1: @@ -20712,7 +20839,7 @@ func file_data_service_proto_init() { } } file_data_service_proto_msgTypes[218].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListConfigItemByTupleReq_Item); i { + switch v := v.(*BatchUpsertClientMetricsResp); i { case 0: return &v.state case 1: @@ -20724,7 +20851,7 @@ func file_data_service_proto_init() { } } file_data_service_proto_msgTypes[219].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetHookInfoSpec_Releases); i { + switch v := v.(*BatchUpsertConfigItemsReq_ConfigItem); i { case 0: return &v.state case 1: @@ -20736,7 +20863,7 @@ func file_data_service_proto_init() { } } file_data_service_proto_msgTypes[220].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListHooksResp_Detail); i { + switch v := v.(*ListConfigItemByTupleReq_Item); i { case 0: return &v.state case 1: @@ -20748,7 +20875,7 @@ func file_data_service_proto_init() { } } file_data_service_proto_msgTypes[221].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListHookReferencesResp_Detail); i { + switch v := v.(*GetHookInfoSpec_Releases); i { case 0: return &v.state case 1: @@ -20760,7 +20887,7 @@ func file_data_service_proto_init() { } } file_data_service_proto_msgTypes[222].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListHookRevisionsResp_ListHookRevisionsData); i { + switch v := v.(*ListHooksResp_Detail); i { case 0: return &v.state case 1: @@ -20772,7 +20899,7 @@ func file_data_service_proto_init() { } } file_data_service_proto_msgTypes[223].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListHookRevisionReferencesResp_Detail); i { + switch v := v.(*ListHookReferencesResp_Detail); i { case 0: return &v.state case 1: @@ -20784,7 +20911,7 @@ func file_data_service_proto_init() { } } file_data_service_proto_msgTypes[224].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetReleaseHookResp_Hook); i { + switch v := v.(*ListHookRevisionsResp_ListHookRevisionsData); i { case 0: return &v.state case 1: @@ -20796,7 +20923,7 @@ func file_data_service_proto_init() { } } file_data_service_proto_msgTypes[225].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListTemplateByTupleReq_Item); i { + switch v := v.(*ListHookRevisionReferencesResp_Detail); i { case 0: return &v.state case 1: @@ -20808,7 +20935,7 @@ func file_data_service_proto_init() { } } file_data_service_proto_msgTypes[226].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListTemplateByTupleReqResp_Item); i { + switch v := v.(*GetReleaseHookResp_Hook); i { case 0: return &v.state case 1: @@ -20820,7 +20947,7 @@ func file_data_service_proto_init() { } } file_data_service_proto_msgTypes[227].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BatchUpsertTemplatesReq_Item); i { + switch v := v.(*ListTemplateByTupleReq_Item); i { case 0: return &v.state case 1: @@ -20832,7 +20959,7 @@ func file_data_service_proto_init() { } } file_data_service_proto_msgTypes[228].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListAppGroupsResp_ListAppGroupsData); i { + switch v := v.(*ListTemplateByTupleReqResp_Item); i { case 0: return &v.state case 1: @@ -20844,7 +20971,7 @@ func file_data_service_proto_init() { } } file_data_service_proto_msgTypes[229].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CountGroupsReleasedAppsResp_CountGroupsReleasedAppsData); i { + switch v := v.(*BatchUpsertTemplatesReq_Item); i { case 0: return &v.state case 1: @@ -20856,7 +20983,7 @@ func file_data_service_proto_init() { } } file_data_service_proto_msgTypes[230].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListGroupReleasedAppsResp_ListGroupReleasedAppsData); i { + switch v := v.(*ListAppGroupsResp_ListAppGroupsData); i { case 0: return &v.state case 1: @@ -20868,6 +20995,30 @@ func file_data_service_proto_init() { } } file_data_service_proto_msgTypes[231].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CountGroupsReleasedAppsResp_CountGroupsReleasedAppsData); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_data_service_proto_msgTypes[232].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListGroupReleasedAppsResp_ListGroupReleasedAppsData); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_data_service_proto_msgTypes[233].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*BatchUpsertKvsReq_Kv); i { case 0: return &v.state @@ -20886,7 +21037,7 @@ func file_data_service_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_data_service_proto_rawDesc, NumEnums: 0, - NumMessages: 232, + NumMessages: 234, NumExtensions: 0, NumServices: 1, }, diff --git a/bcs-services/bcs-bscp/pkg/protocol/data-service/data_service.proto b/bcs-services/bcs-bscp/pkg/protocol/data-service/data_service.proto index 9989e7a447..5528152117 100644 --- a/bcs-services/bcs-bscp/pkg/protocol/data-service/data_service.proto +++ b/bcs-services/bcs-bscp/pkg/protocol/data-service/data_service.proto @@ -4,6 +4,8 @@ import "pkg/protocol/core/app/app.proto"; import "pkg/protocol/core/app-template-binding/app_template_binding.proto"; import "pkg/protocol/core/base/base.proto"; import "pkg/protocol/core/config-item/config_item.proto"; +import "pkg/protocol/core/client/client.proto"; +import "pkg/protocol/core/client-event/client_event.proto"; import "pkg/protocol/core/commit/commit.proto"; import "pkg/protocol/core/content/content.proto"; import "pkg/protocol/core/credential/credential.proto"; @@ -229,6 +231,9 @@ service Data { body: "*" }; } + + // client metric related interface + rpc BatchUpsertClientMetrics(BatchUpsertClientMetricsReq) returns (BatchUpsertClientMetricsResp) {} } message UpdateCredentialScopesReq { uint32 biz_id = 1; @@ -1613,3 +1618,10 @@ message UnDeleteKvReq { pbkv.KvSpec spec = 2; pbkv.KvAttachment attachment = 3; } + +message BatchUpsertClientMetricsReq { + repeated pbclient.Client client_items = 1; + repeated pbce.ClientEvent client_event_items = 2; +} + +message BatchUpsertClientMetricsResp {} \ No newline at end of file diff --git a/bcs-services/bcs-bscp/pkg/protocol/data-service/data_service_grpc.pb.go b/bcs-services/bcs-bscp/pkg/protocol/data-service/data_service_grpc.pb.go index 4916224c4b..4d049620fa 100644 --- a/bcs-services/bcs-bscp/pkg/protocol/data-service/data_service_grpc.pb.go +++ b/bcs-services/bcs-bscp/pkg/protocol/data-service/data_service_grpc.pb.go @@ -167,6 +167,7 @@ const ( Data_ListInstances_FullMethodName = "/pbds.Data/ListInstances" Data_FetchInstanceInfo_FullMethodName = "/pbds.Data/FetchInstanceInfo" Data_Ping_FullMethodName = "/pbds.Data/Ping" + Data_BatchUpsertClientMetrics_FullMethodName = "/pbds.Data/BatchUpsertClientMetrics" ) // DataClient is the client API for Data service. @@ -337,6 +338,8 @@ type DataClient interface { FetchInstanceInfo(ctx context.Context, in *FetchInstanceInfoReq, opts ...grpc.CallOption) (*FetchInstanceInfoResp, error) // Ping verifies if the grpc connection is still alive. Ping(ctx context.Context, in *PingMsg, opts ...grpc.CallOption) (*PingMsg, error) + // client metric related interface + BatchUpsertClientMetrics(ctx context.Context, in *BatchUpsertClientMetricsReq, opts ...grpc.CallOption) (*BatchUpsertClientMetricsResp, error) } type dataClient struct { @@ -1589,6 +1592,15 @@ func (c *dataClient) Ping(ctx context.Context, in *PingMsg, opts ...grpc.CallOpt return out, nil } +func (c *dataClient) BatchUpsertClientMetrics(ctx context.Context, in *BatchUpsertClientMetricsReq, opts ...grpc.CallOption) (*BatchUpsertClientMetricsResp, error) { + out := new(BatchUpsertClientMetricsResp) + err := c.cc.Invoke(ctx, Data_BatchUpsertClientMetrics_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // DataServer is the server API for Data service. // All implementations should embed UnimplementedDataServer // for forward compatibility @@ -1757,6 +1769,8 @@ type DataServer interface { FetchInstanceInfo(context.Context, *FetchInstanceInfoReq) (*FetchInstanceInfoResp, error) // Ping verifies if the grpc connection is still alive. Ping(context.Context, *PingMsg) (*PingMsg, error) + // client metric related interface + BatchUpsertClientMetrics(context.Context, *BatchUpsertClientMetricsReq) (*BatchUpsertClientMetricsResp, error) } // UnimplementedDataServer should be embedded to have forward compatible implementations. @@ -2177,6 +2191,9 @@ func (UnimplementedDataServer) FetchInstanceInfo(context.Context, *FetchInstance func (UnimplementedDataServer) Ping(context.Context, *PingMsg) (*PingMsg, error) { return nil, status.Errorf(codes.Unimplemented, "method Ping not implemented") } +func (UnimplementedDataServer) BatchUpsertClientMetrics(context.Context, *BatchUpsertClientMetricsReq) (*BatchUpsertClientMetricsResp, error) { + return nil, status.Errorf(codes.Unimplemented, "method BatchUpsertClientMetrics not implemented") +} // UnsafeDataServer may be embedded to opt out of forward compatibility for this service. // Use of this interface is not recommended, as added methods to DataServer will @@ -4673,6 +4690,24 @@ func _Data_Ping_Handler(srv interface{}, ctx context.Context, dec func(interface return interceptor(ctx, in, info, handler) } +func _Data_BatchUpsertClientMetrics_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(BatchUpsertClientMetricsReq) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(DataServer).BatchUpsertClientMetrics(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Data_BatchUpsertClientMetrics_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(DataServer).BatchUpsertClientMetrics(ctx, req.(*BatchUpsertClientMetricsReq)) + } + return interceptor(ctx, in, info, handler) +} + // Data_ServiceDesc is the grpc.ServiceDesc for Data service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -5232,6 +5267,10 @@ var Data_ServiceDesc = grpc.ServiceDesc{ MethodName: "Ping", Handler: _Data_Ping_Handler, }, + { + MethodName: "BatchUpsertClientMetrics", + Handler: _Data_BatchUpsertClientMetrics_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "data_service.proto", diff --git a/bcs-services/bcs-bscp/pkg/sf-share/convert.go b/bcs-services/bcs-bscp/pkg/sf-share/convert.go new file mode 100644 index 0000000000..801b97594e --- /dev/null +++ b/bcs-services/bcs-bscp/pkg/sf-share/convert.go @@ -0,0 +1,185 @@ +/* + * Tencent is pleased to support the open source community by making Blueking Container Service available. + * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. + * Licensed under the MIT License (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * http://opensource.org/licenses/MIT + * Unless required by applicable law or agreed to in writing, software distributed under + * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, + * either express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + +package sfs + +import ( + "errors" + + "google.golang.org/protobuf/types/known/timestamppb" + + pbclient "github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/pkg/protocol/core/client" + pbce "github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/pkg/protocol/core/client-event" + "github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/pkg/runtime/jsoni" +) + +// PbClientMetric Version Change Payload convert to client metric proto +func (v *VersionChangePayload) PbClientMetric() (*pbclient.Client, error) { + if v == nil { + return nil, errors.New("VersionChangePayload is nil, can not be convert to proto") + } + var currentReleaseId uint32 + // 在clien表中更新目标ID和当前ID + // 如果成功了CurrentReleaseId和TargetReleaseId是一致的 + if v.Application.ReleaseChangeStatus == Success { + currentReleaseId = v.Application.TargetReleaseID + } else { + currentReleaseId = v.Application.CurrentReleaseID + } + + data := &pbclient.Client{ + Spec: &pbclient.ClientSpec{ + ClientVersion: v.BasicData.ClientVersion, + ClientType: string(v.BasicData.ClientType), + Ip: v.BasicData.IP, + Labels: toString(v.Application.Labels), + Annotations: toString(v.BasicData.Annotations), + FirstConnectTime: timestamppb.New(v.BasicData.HeartbeatTime), + LastHeartbeatTime: timestamppb.New(v.BasicData.HeartbeatTime), + OnlineStatus: v.BasicData.OnlineStatus.String(), + Resource: &pbclient.ClientResource{ + CpuUsage: v.ResourceUsage.CpuUsage, + CpuMaxUsage: v.ResourceUsage.CpuMaxUsage, + MemoryUsage: v.ResourceUsage.MemoryUsage, + MemoryMaxUsage: v.ResourceUsage.MemoryMaxUsage, + }, + CurrentReleaseId: currentReleaseId, + TargetReleaseId: v.Application.TargetReleaseID, + ReleaseChangeStatus: v.Application.ReleaseChangeStatus.String(), + ReleaseChangeFailedReason: v.Application.FailedReason.String(), + FailedDetailReason: v.Application.FailedDetailReason, + }, + Attachment: &pbclient.ClientAttachment{ + Uid: v.Application.Uid, + BizId: v.BasicData.BizID, + AppId: v.Application.AppID, + }, + MessageType: VersionChangeMessage.String(), + } + return data, nil +} + +// PbClientEventMetric Version Change Payload convert to client event metric proto +func (v *VersionChangePayload) PbClientEventMetric() (*pbce.ClientEvent, error) { + if v == nil { + return nil, errors.New("VersionChangePayload is nil, can not be convert to proto") + } + data := &pbce.ClientEvent{ + Spec: &pbce.ClientEventSpec{ + OriginalReleaseId: v.Application.CurrentReleaseID, + TargetReleaseId: v.Application.TargetReleaseID, + StartTime: timestamppb.New(v.Application.StartTime), + EndTime: timestamppb.New(v.Application.EndTime), + TotalSeconds: v.Application.TotalSeconds, + TotalFileSize: float64(v.Application.TotalFileSize), + TotalFileNum: uint32(v.Application.TotalFileNum), + DownloadFileSize: float64(v.Application.DownloadFileSize), + DownloadFileNum: uint32(v.Application.DownloadFileNum), + ReleaseChangeStatus: v.Application.ReleaseChangeStatus.String(), + ReleaseChangeFailedReason: v.Application.FailedReason.String(), + FailedDetailReason: v.Application.FailedDetailReason, + }, + Attachment: &pbce.ClientEventAttachment{ + Uid: v.Application.Uid, + ClientMode: v.BasicData.ClientMode.String(), + BizId: v.BasicData.BizID, + AppId: v.Application.AppID, + CursorId: v.Application.CursorID, + }, + MessageType: VersionChangeMessage.String(), + } + return data, nil +} + +// PbClientMetric heart beat Payload convert to client metric proto +func (h *HeartbeatItem) PbClientMetric() (*pbclient.Client, error) { + if h == nil { + return nil, errors.New("HeartbeatItem is nil, can not be convert to proto") + } + // 过滤没有目标版本号的数据,无意义 + if h.Application.CursorID == "" { + return nil, nil + } + data := &pbclient.Client{ + Spec: &pbclient.ClientSpec{ + ClientVersion: h.BasicData.ClientVersion, + ClientType: string(h.BasicData.ClientType), + Ip: h.BasicData.IP, + Labels: toString(h.Application.Labels), + Annotations: toString(h.BasicData.Annotations), + FirstConnectTime: timestamppb.New(h.BasicData.HeartbeatTime), + LastHeartbeatTime: timestamppb.New(h.BasicData.HeartbeatTime), + OnlineStatus: h.BasicData.OnlineStatus.String(), + Resource: &pbclient.ClientResource{ + CpuUsage: h.ResourceUsage.CpuUsage, + CpuMaxUsage: h.ResourceUsage.CpuMaxUsage, + MemoryUsage: h.ResourceUsage.MemoryUsage, + MemoryMaxUsage: h.ResourceUsage.MemoryMaxUsage, + }, + ReleaseChangeStatus: h.Application.ReleaseChangeStatus.String(), + CurrentReleaseId: h.Application.CurrentReleaseID, + TargetReleaseId: h.Application.TargetReleaseID, + }, + Attachment: &pbclient.ClientAttachment{ + Uid: h.Application.Uid, + BizId: h.BasicData.BizID, + AppId: h.Application.AppID, + }, + MessageType: Heartbeat.String(), + } + + return data, nil +} + +// PbClientEventMetric heart beat Payload convert to client event metric proto +// 心跳事件 ClientEvent表 只需更新 ReleaseChangeStatus 、SuccessDownloads、SuccessFileSize +func (h *HeartbeatItem) PbClientEventMetric() (*pbce.ClientEvent, error) { + if h == nil { + return nil, errors.New("HeartbeatItem is nil, can not be convert to proto") + } + + // 客户端启动时可能有客户端连接和心跳数据, + // 但没有发生拉取和变更事件, 所以CursorID会存在空 + // 过滤CursorID为空的数据,该数据没有任何意义 + if h.Application.CursorID == "" { + return nil, nil + } + data := &pbce.ClientEvent{ + Spec: &pbce.ClientEventSpec{ + ReleaseChangeStatus: h.Application.ReleaseChangeStatus.String(), + DownloadFileSize: float64(h.Application.DownloadFileSize), + DownloadFileNum: uint32(h.Application.DownloadFileNum), + }, + Attachment: &pbce.ClientEventAttachment{ + Uid: h.Application.Uid, + ClientMode: h.BasicData.ClientMode.String(), + BizId: h.BasicData.BizID, + AppId: h.Application.AppID, + CursorId: h.Application.CursorID, + }, + HeartbeatTime: timestamppb.New(h.BasicData.HeartbeatTime), + MessageType: Heartbeat.String(), + } + + return data, nil +} + +func toString(label interface{}) string { + marshal, err := jsoni.Marshal(label) + if err != nil { + return "{}" + } + if len(marshal) == 0 { + return "{}" + } + return string(marshal) +} diff --git a/bcs-services/bcs-bscp/pkg/sf-share/types.go b/bcs-services/bcs-bscp/pkg/sf-share/types.go index 4da4b45201..0380bea0e0 100644 --- a/bcs-services/bcs-bscp/pkg/sf-share/types.go +++ b/bcs-services/bcs-bscp/pkg/sf-share/types.go @@ -18,6 +18,7 @@ import ( "fmt" "os" "strings" + "time" "github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/pkg/cc" "github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/pkg/criteria/validator" @@ -66,6 +67,12 @@ const ( SidecarOffline MessagingType = 1 // Heartbeat means the sidecar is online, to tell feed server this sidecar is live. Heartbeat MessagingType = 2 + // VersionChangeMessage the version change event was reported. Procedure + VersionChangeMessage MessagingType = 3 + // PullStatus the current pull status is reported + PullStatus MessagingType = 4 + // ClientInfo report basic information about the client when the client first connects to the client + ClientInfo MessagingType = 5 ) // Validate the messaging type is valid or not. @@ -73,6 +80,9 @@ func (sm MessagingType) Validate() error { switch sm { case SidecarOffline: case Heartbeat: + case VersionChangeMessage: + case PullStatus: + case ClientInfo: default: return fmt.Errorf("unknown %d sidecar message type", sm) } @@ -87,6 +97,12 @@ func (sm MessagingType) String() string { return "SidecarOffline" case Heartbeat: return "Heartbeat" + case VersionChangeMessage: + return "VersionChange" + case PullStatus: + return "PullStatus" + case ClientInfo: + return "ClientInfo" default: return "Unknown" } @@ -132,6 +148,25 @@ type SideAppMeta struct { CurrentReleaseID uint32 `json:"currentReleaseID"` // sidecar's current cursor id CurrentCursorID uint32 `json:"currentCursorID"` + // TargetReleaseID is sidecar's target release id + TargetReleaseID uint32 `json:"targetReleaseID"` + // TotalFileSize 总文件大小 + TotalFileSize uint64 `json:"totalFileSize"` + // SuccessFileSize 下载文件大小 + DownloadFileSize uint64 `json:"downloadFileSize"` + // TotalFileNum 总文件数量 + TotalFileNum int `json:"totalFileNum"` + // DownloadFileNum 下载文件数量 + DownloadFileNum int32 `json:"downloadFileNum"` + // CursorID 事件ID + CursorID string `json:"cursorID"` + // ReleaseChangeStatus 变更状态 + ReleaseChangeStatus Status `json:"releaseChangeStatus"` + FailedReason FailedReason `json:"failedReason"` + FailedDetailReason string `json:"failedDetailReason"` + StartTime time.Time `json:"startTime"` + EndTime time.Time `json:"endTime"` + TotalSeconds float64 `json:"totalSeconds"` } // Validate the sidecar's app meta is valid or not. @@ -455,10 +490,11 @@ func (o *OfflinePayload) Encode() ([]byte, error) { // HeartbeatPayload defines sdk heartbeat to send payload to feed server. type HeartbeatPayload struct { - // FingerPrint sdk instance fingerprint, reference: pkg/dal/sf-share/fingerprint.go - FingerPrint string `json:"fingerprint"` + BasicData BasicData `json:"basicData"` // Applications sdk instance bind app meta info,include app,namespace,uid,labels and app current release id. Applications []SideAppMeta `json:"applications"` + // ResourceUsage 资源相关信息:例如 cpu、内存等 + ResourceUsage ResourceUsage `json:"resourceUsage"` } // MessagingType return the payload related sidecar message type. @@ -475,6 +511,19 @@ func (h *HeartbeatPayload) Encode() ([]byte, error) { return jsoni.Marshal(h) } +// Decode the HeartbeatPayload to bytes. +func (h *HeartbeatPayload) Decode(data []byte) error { + if len(data) == 0 { + return errors.New("HeartbeatPayload is nil, can not be decoded") + } + + err := jsoni.Unmarshal(data, h) + if err != nil { + return err + } + return nil +} + // KvMetaV1 defines the released kv metadata. type KvMetaV1 struct { // ID is released configuration item identity id. @@ -485,3 +534,270 @@ type KvMetaV1 struct { KvAttachment *pbkv.KvAttachment `json:"kv_attachment"` ContentSpec *pbcontent.ContentSpec `json:"content_spec"` } + +// BasicData 上报时基础数据 +type BasicData struct { + // BizID xxx + BizID uint32 `json:"bizID"` + // ClientMode 客户端模式 pull、watch + ClientMode ClientMode `json:"clientMode"` + // HeartbeatTime 心跳时间 + HeartbeatTime time.Time `json:"heartbeatTime"` + // OnlineStatus 在线状态,枚举类型:online, offline + OnlineStatus OnlineStatus `json:"onlineStatus"` + // 客户端版本 + ClientVersion string `json:"clientVersion"` + // IP client ip + IP string `json:"ip"` + // Annotations Additional info (Platform information such as cluster ID, agent ID, host ID, etc.) + Annotations map[string]interface{} `json:"annotations"` + // ClientType client type (agent、sidecar、sdk、command) + ClientType ClientType `json:"clientType"` +} + +// Validate the instance spec is valid or not +func (bd BasicData) Validate() error { + if bd.BizID <= 0 { + return errors.New("invalid biz id") + } + + return nil +} + +// ResourceUsage Resource utilization rate +type ResourceUsage struct { + CpuMaxUsage float64 `json:"cpuMaxUsage"` + CpuUsage float64 `json:"cpuUsage"` + MemoryUsage uint64 `json:"memoryUsage"` + MemoryMaxUsage uint64 `json:"memoryMaxUsage"` +} + +// VersionChangePayload defines sdk version change to send payload to feed server. +type VersionChangePayload struct { + // BasicData 基础信息:例如客户端唯一标识、bizID、客户端模式 + BasicData *BasicData `json:"basicData"` + // Application app相关信息:例如 appName、appID、currentReleaseID等 + Application *SideAppMeta `json:"application"` + // ResourceUsage 资源相关信息:例如 cpu、内存等 + ResourceUsage ResourceUsage `json:"resourceUsage"` +} + +// MessagingType return the payload related sidecar message type. +func (v *VersionChangePayload) MessagingType() MessagingType { + return VersionChangeMessage +} + +// Encode the VersionChangePayload to bytes. +func (v *VersionChangePayload) Encode() ([]byte, error) { + if v == nil { + return nil, errors.New("VersionChangePayload is nil, can not be encoded") + } + + return jsoni.Marshal(v) +} + +// Decode the VersionChangePayload to bytes. +func (v *VersionChangePayload) Decode(data []byte) error { + if len(data) == 0 { + return errors.New("VersionChangePayload is nil, can not be decoded") + } + err := jsoni.Unmarshal(data, v) + if err != nil { + return err + } + return nil +} + +// OnlineStatus define the online status structure +type OnlineStatus uint32 + +const ( + // Online 在线 + Online OnlineStatus = 1 + // Offline 离线 + Offline OnlineStatus = 2 +) + +// Validate the online status is valid or not. +func (cm OnlineStatus) Validate() error { + switch cm { + case Online: + case Offline: + default: + return fmt.Errorf("unknown %d sidecar online status", cm) + } + + return nil +} + +// String return the corresponding string type +func (cm OnlineStatus) String() string { + switch cm { + case Online: + return "online" + case Offline: + return "offline" + default: + return "" + } +} + +// Status define the status structure +type Status uint32 + +const ( + // Success xxx + Success Status = 1 + // Failed xxx + Failed Status = 2 + // Processing xxx + Processing Status = 3 +) + +// Validate the status is valid or not. +func (rs Status) Validate() error { + switch rs { + case Success: + case Failed: + case Processing: + default: + return fmt.Errorf("unknown %d sidecar version change status", rs) + } + return nil +} + +// String return the corresponding string type +func (rs Status) String() string { + switch rs { + case Success: + return "Success" + case Failed: + return "Failed" + case Processing: + return "Processing" + default: + return "" + } +} + +// FailedReason define the failure cause structure +type FailedReason uint32 + +const ( + // PreHookFailed pre hook failed + PreHookFailed FailedReason = 1 + // PostHookFailed post hook failed + PostHookFailed FailedReason = 2 + // DownloadFailed download failed + DownloadFailed FailedReason = 3 + // SkipFailed skip failed + SkipFailed FailedReason = 4 + // ClearOldFilesFailed Clear old files failed + ClearOldFilesFailed FailedReason = 5 + // UpdateMetadataFailed Update Metadata failed + UpdateMetadataFailed FailedReason = 6 +) + +// Validate the failed reason is valid or not. +func (fr FailedReason) Validate() error { + switch fr { + case PreHookFailed: + case PostHookFailed: + case DownloadFailed: + case SkipFailed: + default: + return fmt.Errorf("unknown %d sidecar failed reason", fr) + } + + return nil +} + +// String return the corresponding string type +func (fr FailedReason) String() string { + switch fr { + case PreHookFailed: + return "PreHookFailed" + case PostHookFailed: + return "PostHookFailed" + case DownloadFailed: + return "DownloadFailed" + case SkipFailed: + return "SkipFailed" + default: + return "" + } +} + +// ClientMode define the client mode structure +type ClientMode uint32 + +const ( + // Pull xxx + Pull ClientMode = 1 + // Watch xxx + Watch ClientMode = 2 +) + +// Validate the client mode is valid or not. +func (cm ClientMode) Validate() error { + switch cm { + case Pull: + case Watch: + default: + return fmt.Errorf("unknown %d sidecar client mode", cm) + } + + return nil +} + +// String return the corresponding string type +func (cm ClientMode) String() string { + switch cm { + case Pull: + return "Pull" + case Watch: + return "Watch" + default: + return "" + } +} + +// ClientMetricData feed-server 和 cache-service 通信的结构体 +type ClientMetricData struct { + AppID uint32 + MessagingType uint32 + Payload []byte +} + +// // ClientInfoItem 单个客户端连接信息 +// type ClientInfoItem struct { +// // BasicData 基础信息:例如客户端唯一标识、bizID、客户端模式 +// BasicData BasicData `json:"basic_data"` +// // Applications app相关信息:例如 appName、appID、currentReleaseID等 +// Application SideAppMeta `json:"application"` +// } + +// HeartbeatItem 单个服务心跳数据 +type HeartbeatItem struct { + BasicData BasicData `json:"basicData"` + // Applications sdk instance bind app meta info,include app,namespace,uid,labels and app current release id. + Application SideAppMeta `json:"application"` + // ResourceUsage 资源相关信息:例如 cpu、内存等 + ResourceUsage ResourceUsage `json:"resourceUsage"` +} + +// ClientType client type (agent、sidecar、sdk、command). +type ClientType string + +const ( + // SDK xxx + SDK ClientType = "sdk" + // Sidecar xxx + Sidecar ClientType = "sidecar" + // Agent xxx + Agent ClientType = "agent" + // Command xxx + Command ClientType = "command" + // Unknown xxx + Unknown ClientType = "unknown" +) diff --git a/bcs-services/bcs-bscp/pkg/version/version.go b/bcs-services/bcs-bscp/pkg/version/version.go index f8982155fa..9fe33d75fa 100644 --- a/bcs-services/bcs-bscp/pkg/version/version.go +++ b/bcs-services/bcs-bscp/pkg/version/version.go @@ -57,6 +57,9 @@ var ( // DEBUG if enable debug. DEBUG = "false" + // CLIENTTYPE client type (agent、sidecar、sdk、command). + CLIENTTYPE = "sdk" + // GoVersion Go 版本号 GoVersion = runtime.Version() @@ -84,10 +87,11 @@ func FormatVersion(prefix string, format Format) string { if prefix != "" { prefix += " " } - rawFormat := fmt.Sprintf("%sVersion : %s\nBuildTime: %s\nGitHash : %s\nGoVersion: %s", - prefix, VERSION, BUILDTIME, GITHASH, GoVersion) - jsonFormat := fmt.Sprintf(`%s{"Version": "%s", "BuildTime": "%s", "GitHash": "%s", "GoVersion": "%s"}`, - prefix, VERSION, BUILDTIME, GITHASH, GoVersion) + rawFormat := fmt.Sprintf("%sVersion : %s\nBuildTime: %s\nGitHash : %s\nGoVersion: %s\nClientType: %s", + prefix, VERSION, BUILDTIME, GITHASH, GoVersion, CLIENTTYPE) + jsonFormat := fmt.Sprintf(`%s{"Version": "%s", "BuildTime": "%s", "GitHash": "%s", "GoVersion": "%s", + "ClientType": "%s"}`, + prefix, VERSION, BUILDTIME, GITHASH, GoVersion, CLIENTTYPE) switch format { case Row: @@ -108,10 +112,11 @@ func GetStartInfo() string { // Version NOTES func Version() *SysVersion { return &SysVersion{ - Version: VERSION, - Hash: GITHASH, - Time: BUILDTIME, - GoVersion: GoVersion, + Version: VERSION, + Hash: GITHASH, + Time: BUILDTIME, + GoVersion: GoVersion, + ClientType: CLIENTTYPE, } } @@ -146,8 +151,9 @@ func parseVersion(v string) ([3]uint32, error) { // SysVersion describe a binary version type SysVersion struct { - Version string `json:"version"` - Hash string `json:"hash"` - Time string `json:"time"` - GoVersion string `json:"go_version"` + Version string `json:"version"` + Hash string `json:"hash"` + Time string `json:"time"` + GoVersion string `json:"go_version"` + ClientType string `json:"client_type"` } diff --git a/bcs-services/bcs-bscp/scripts/gen/main.go b/bcs-services/bcs-bscp/scripts/gen/main.go index 3f75e350c4..53b704761b 100644 --- a/bcs-services/bcs-bscp/scripts/gen/main.go +++ b/bcs-services/bcs-bscp/scripts/gen/main.go @@ -60,6 +60,8 @@ func main() { table.ReleasedAppTemplateVariable{}, table.Kv{}, table.ReleasedKv{}, + table.Client{}, + table.ClientEvent{}, ) g.Execute()