Quellcode durchsuchen

wip:逻辑修改

wangkaiyue vor 2 Jahren
Ursprung
Commit
eb895e936d

+ 1 - 1
jyBXSubscribe/api/bxsubscribe.api

@@ -168,7 +168,7 @@ type (
 		AppId     string `header:"appId"`
 		EntId     int64  `header:"entId,optional"`
 		EntUserId int64  `header:"entUserId,optional"`
-		StaffId   int64  `json:"staffId,optional"`
+		Token     string `json:"token,optional"`
 	}
 	StaffSubscribeCommonResp {
 		Err_code int64       `json:"error_code"`

+ 1 - 1
jyBXSubscribe/api/internal/logic/getstaffsubscribedetaillogic.go

@@ -29,7 +29,7 @@ func (l *GetStaffSubscribeDetailLogic) GetStaffSubscribeDetail(req *types.GetSta
 	res, err := l.svcCtx.Suscribe.GetStaffSubscribeDetail(l.ctx, &bxsubscribe.StaffSubscribeDetailReq{
 		EntId:     req.EntId,
 		EntUserId: req.EntUserId,
-		StaffId:   req.StaffId,
+		Token:     req.Token,
 	})
 	if err != nil {
 		return nil, err

+ 1 - 1
jyBXSubscribe/api/internal/types/types.go

@@ -170,7 +170,7 @@ type GetStaffSubscribeDetailReq struct {
 	AppId     string `header:"appId"`
 	EntId     int64  `header:"entId,optional"`
 	EntUserId int64  `header:"entUserId,optional"`
-	StaffId   int64  `json:"staffId,optional"`
+	Token     string `json:"token,optional"`
 }
 
 type StaffSubscribeCommonResp struct {

+ 7 - 6
jyBXSubscribe/rpc/bxsubscribe.go

@@ -36,17 +36,18 @@ func main() {
 	//初始化日志信息
 	conf.MustLoad(*logFile, &IC.Logc)
 	IC.InitC()
-
-	//total, list := model.GetStaffSubscribeList(15241, 4967, "", 0, 0, 0, 5)
-	//total, list := model.GetStaffSubscribeList(14650, 3680, "", 0, -1, 0, 5)
-	//fmt.Println(total)
+	// 部门
+	//total, list := model.GetStaffSubscribeList(15799, 5889, "", 0, 0, 0, 5)
+	//// 管理员
+	////total, list := model.GetStaffSubscribeList(15799, 5886, "", 0, 1, 0, 5)
 	//if total > 0 {
 	//	for _, i2 := range list {
 	//		g.Dump(i2)
 	//	}
 	//}
-	//g.Dump(model.GetStaffSubscribeDetail(14650, 4916))
-
+	//
+	//g.Dump(model.GetStaffSubscribeDetail(15799, 5889, "ABCYGZBfzxYGTc7AlV6dXECMzMoDjRmZnNgPD8jLSEeZ3tpZSslNzg7IndcSXI9OAU3IQJZQA2e"))
+	//return
 	go func() {
 		err := endless.ListenAndServe(":"+MC.InterfaceToStr(IC.C.Webrpcport), nil, func() {})
 		if err != nil {

+ 3 - 3
jyBXSubscribe/rpc/bxsubscribe.proto

@@ -369,8 +369,8 @@ message StaffSubscribeListResp {
   repeated StaffSubscribe items = 4;
 }
 message StaffSubscribe {
-  string name = 1;
-  int64 id = 2;
+  string token = 1;
+  string name = 2;
   string phone = 3;
   int64 eStatus = 4;
   int64 pStatus = 5;
@@ -379,7 +379,7 @@ message StaffSubscribe {
 message StaffSubscribeDetailReq{
   int64  entId = 1;
   int64  entUserId = 2;
-  int64  staffId =3;
+  string  token =3;
 }
 
 message StaffSubscribeDetail{

+ 1 - 1
jyBXSubscribe/rpc/internal/logic/getstaffsubscribedetaillogic.go

@@ -27,7 +27,7 @@ func NewGetStaffSubscribeDetailLogic(ctx context.Context, svcCtx *svc.ServiceCon
 
 // GetStaffSubscribeDetail 查看企业员工用户订阅详情
 func (l *GetStaffSubscribeDetailLogic) GetStaffSubscribeDetail(in *bxsubscribe.StaffSubscribeDetailReq) (*bxsubscribe.StaffSubscribeDetail, error) {
-	rData, err := model.GetStaffSubscribeDetail(in.EntId, in.EntUserId, in.StaffId)
+	rData, err := model.GetStaffSubscribeDetail(in.EntId, in.EntUserId, in.Token)
 	if err != nil {
 		return &bxsubscribe.StaffSubscribeDetail{
 			ErrCode: -1,

+ 111 - 45
jyBXSubscribe/rpc/model/staffSubscribe.go

@@ -2,11 +2,14 @@ package model
 
 import (
 	"app.yhyue.com/moapp/jybase/common"
+	"app.yhyue.com/moapp/jybase/date"
+	"app.yhyue.com/moapp/jybase/encrypt"
 	"fmt"
 	"github.com/gogf/gf/v2/util/gconv"
 	IC "jyBXSubscribe/rpc/init"
 	"jyBXSubscribe/rpc/type/bxsubscribe"
 	"strings"
+	"time"
 )
 
 // GetStaffSubscribeList 员工订阅总览列表
@@ -22,14 +25,57 @@ func GetStaffSubscribeList(entId, entUserId int, query string, eStatus, pStatus,
 	// 当检索是否有个人订阅时,因为无法关联查询,需要提前加载员工是否有个人订阅
 	pSubscribeList := getEntPersonOrderList(entId)
 
-	var sql string = ` FROM entniche_user e `
+	var sql string = ` FROM (
+	SELECT
+		a.id,
+		a.name,
+		a.phone,
+		b.rule_id,
+		a.createtime,
+		GROUP_CONCAT( a.product_type ) AS product_type 
+	FROM
+		(
+		SELECT
+			u.id,
+			u.NAME,
+			u.phone,
+			'e' AS product_type,
+			u.createtime
+		FROM
+			entniche_info a
+			INNER JOIN entniche_user u ON ( a.id = ? AND a.STATUS = 1 AND u.power = 1 AND a.id = u.ent_id ) 
+			%s
+			UNION
+		SELECT
+			u.id,
+			u.NAME,
+			u.phone,
+			IF ( instr( a.product_type, 'v' )> 0, 'v', 'm' ) AS product_type ,
+			u.createtime
+		FROM
+			entniche_wait_empower a
+			INNER JOIN entniche_power b ON ( a.ent_id = ? AND a.end_time > ? AND b.STATUS = 1 AND a.id = b.wait_empower_id )
+			INNER JOIN entniche_user u ON ( b.ent_user_id = u.id ) 
+			%s
+		) a
+		LEFT JOIN entniche_user_rule b ON ( a.id = b.user_id ) 
+	GROUP BY
+		a.id,
+		a.NAME,
+		a.phone,
+		b.rule_id,
+		a.createtime
+) as AllData 
+WHERE`
 	queryArr, valueArr := []string{" 1=1 "}, []interface{}{}
-	if userEnt.Role_admin_department { //部门管理员
-		sql += `INNER JOIN entniche_department_user a ON (e.id = a.user_id AND e.ent_id = ? ) INNER JOIN entniche_department_parent p ON (a.dept_id = p.id AND p.id = ?) LEFT JOIN entniche_user_rule r  ON e.id =r.user_id WHERE   `
-		valueArr = append(valueArr, entId, userEnt.Dept.Id)
-	} else { //企业管理员
-		sql += ` LEFT JOIN entniche_user_rule r ON (e.id = r.user_id ) WHERE  e.ent_id = ? AND`
-		valueArr = append(valueArr, entId)
+	nowStr := time.Now().Format(date.Date_Full_Layout)
+	if userEnt.Role_admin_system { //企业管理员
+		sql = fmt.Sprintf(sql, "", "")
+		valueArr = append(valueArr, entId, entId, nowStr)
+	} else { //部门管理员
+		limit := fmt.Sprintf(" INNER JOIN entniche_department_user d ON ( d.user_id = u.id) WHERE d.dept_id =? ")
+		sql = fmt.Sprintf(sql, limit, limit)
+		valueArr = append(valueArr, entId, userEnt.Dept.Id, entId, nowStr, userEnt.Dept.Id)
 	}
 
 	// 查询条件过滤
@@ -39,9 +85,9 @@ func GetStaffSubscribeList(entId, entUserId int, query string, eStatus, pStatus,
 	}
 	// 企业订阅过滤
 	if eStatus == 1 { //有企业订阅
-		queryArr = append(queryArr, ` r.rule_id is not null `)
+		queryArr = append(queryArr, ` rule_id is not null `)
 	} else if eStatus == -1 { // 无企业订阅
-		queryArr = append(queryArr, ` r.rule_id is  null `)
+		queryArr = append(queryArr, ` rule_id is  null `)
 	}
 	// 个人订阅过滤
 	if pStatus != 0 && len(pSubscribeList) > 0 {
@@ -54,16 +100,16 @@ func GetStaffSubscribeList(entId, entUserId int, query string, eStatus, pStatus,
 		}
 
 		if pStatus == 1 { //有个人订阅
-			queryArr = append(queryArr, fmt.Sprintf(` e.id in ( %s ) `, tStr))
+			queryArr = append(queryArr, fmt.Sprintf(` id in ( %s ) `, tStr))
 		} else if pStatus == -1 { //无个人订阅
-			queryArr = append(queryArr, fmt.Sprintf(` e.id not in ( %s ) `, tStr))
+			queryArr = append(queryArr, fmt.Sprintf(` id not in ( %s ) `, tStr))
 		}
 	}
 
-	countSql := fmt.Sprintf("SELECT count(e.id) %s  %s", sql, strings.Join(queryArr, " AND "))
+	countSql := fmt.Sprintf("SELECT count(id) %s  %s", sql, strings.Join(queryArr, " AND "))
 	total = IC.MainMysql.CountBySql(countSql, valueArr...)
 	if total > 0 {
-		finalSql := fmt.Sprintf("SELECT e.id,e.name,e.phone,r.rule_id %s  %s ORDER BY e.createtime DESC  LIMIT %d,%d", sql, strings.Join(queryArr, " AND "), common.If(pageNum >= 0, pageNum, 0).(int64)*pageSize, pageSize)
+		finalSql := fmt.Sprintf("SELECT * %s  %s ORDER BY createtime DESC  LIMIT %d,%d", sql, strings.Join(queryArr, " AND "), common.If(pageNum >= 0, pageNum, 0).(int64)*pageSize, pageSize)
 		finalRes := IC.MainMysql.SelectBySql(finalSql, valueArr...)
 		if finalRes != nil && len(*finalRes) > 0 {
 			for _, m := range *finalRes {
@@ -76,8 +122,8 @@ func GetStaffSubscribeList(entId, entUserId int, query string, eStatus, pStatus,
 					}
 				}
 				list = append(list, &bxsubscribe.StaffSubscribe{
+					Token:   encodeSubscribeMsg(gconv.Int64(entId), gconv.Int64(m["id"]), common.ObjToString(m["rule_id"]), gconv.String(m["product_type"])),
 					Name:    common.ObjToString(m["name"]),
-					Id:      gconv.Int64(m["id"]),
 					Phone:   common.ObjToString(m["phone"]),
 					EStatus: gconv.Int64(common.If(common.ObjToString(m["rule_id"]) == "", -1, 1)),
 					PStatus: gconv.Int64(common.If(hasPersonSubscribe, 1, -1)),
@@ -88,6 +134,30 @@ func GetStaffSubscribeList(entId, entUserId int, query string, eStatus, pStatus,
 	return
 }
 
+// decodeSubscribeMsg /解密
+func decodeSubscribeMsg(token string) (entId, uId int64, ruleId, power string, err error) {
+	values := encrypt.DecodeArticleId2ByCheck(token)
+	if len(values) != 4 {
+		err = fmt.Errorf("解析异常")
+		return
+	}
+	entId = gconv.Int64(values[0])
+	uId = gconv.Int64(values[1])
+	ruleId = gconv.String(values[2])
+	power = gconv.String(values[3])
+
+	if entId == 0 || uId == 0 {
+		err = fmt.Errorf("参数异常")
+		return
+	}
+	return
+}
+
+// encodeSubscribeMsg 加密
+func encodeSubscribeMsg(entId, uId int64, ruleId, power string) string {
+	return encrypt.EncodeArticleId2ByCheck(fmt.Sprintf("%d,%d,%s,%s", entId, uId, ruleId, strings.Replace(power, ",", "_", -1)))
+}
+
 // PersonSubscribe 个人订阅结构体
 type PersonSubscribe struct {
 	AInfotype     []string            `json:"a_infotype"`
@@ -138,33 +208,38 @@ func getEntPersonOrderList(entId int) (uIds []int64) {
 }
 
 // GetStaffSubscribeDetail 获取企业个人订阅
-func GetStaffSubscribeDetail(entId, uid, staffId int64) (rData map[string]interface{}, err error) {
-	rData = map[string]interface{}{}
-	//个人订阅
-	if data := getPersonSubscribe(map[string]interface{}{"i_entid": entId, "i_userid": staffId, "i_type": 2}); data != nil && len(data) > 0 {
-		rData["个人订阅"] = data
+func GetStaffSubscribeDetail(entId, uid int64, token string) (rData map[string]interface{}, err error) {
+	entIdCheck, staffId, ruleId, power, err := decodeSubscribeMsg(token)
+	if err != nil {
+		return
 	}
-	//个人订阅商机管理
-	if data := getPersonSubscribe(map[string]interface{}{"i_entid": entId, "i_userid": staffId, "i_type": 0}); data != nil && len(data) > 0 {
-		rData["个人订阅<br>商机管理"] = data
+	if entId != entIdCheck {
+		err = fmt.Errorf("权限异常")
+		return
+	}
+	if power == "" {
+		err = fmt.Errorf("无订阅内容")
+		return
 	}
-	//大会员或超级订阅企业版
-	if data := getPersonSubscribe(map[string]interface{}{"i_entid": entId, "i_userid": staffId, "i_type": 1}); data != nil && len(data) > 0 {
-		key := "企业版"
-		//查询企业版是大会员还是超级订阅
-		if vipRes := IC.MainMysql.FindOne("entniche_wait_empower", map[string]interface{}{"ent_id": entId}, "product_type", "id desc"); vipRes != nil && len(*vipRes) > 0 {
-			typeFiled := gconv.String((*vipRes)["product_type"])
-			if strings.HasPrefix(typeFiled, "vip") {
-				key = "大会员企业版"
-			} else if strings.HasPrefix(typeFiled, "vip") {
-				key = "超级订阅企业版"
+	rData = map[string]interface{}{}
+	for _, vipFlag := range strings.Split(power, ",") {
+		if vipFlag == "e" {
+			//个人订阅商机管理
+			if data := getPersonSubscribe(map[string]interface{}{"i_entid": entId, "i_userid": staffId, "i_type": 0}); data != nil && len(data) > 0 {
+				rData["个人订阅<br>商机管理"] = data
+			}
+		} else if vipFlag == "v" || vipFlag == "m" {
+			//大会员或超级订阅企业版
+			if data := getPersonSubscribe(map[string]interface{}{"i_entid": entId, "i_userid": staffId, "i_type": 1}); data != nil && len(data) > 0 {
+				rData[fmt.Sprintf("个人订阅<br>%s", common.If(vipFlag == "v", "超级订阅企业版", "大会员企业版"))] = data
 			}
 		}
-		rData[fmt.Sprintf("个人订阅<br>%s", key)] = data
 	}
 	// 企业自动分发
-	if data := getEntDistribute(entId, staffId); data != nil && len(data) > 0 {
-		rData["企业自动分发"] = data
+	if ruleId != "" {
+		if data := getEntDistribute(ruleId, entId, staffId); data != nil && len(data) > 0 {
+			rData["企业自动分发"] = data
+		}
 	}
 	return
 }
@@ -202,16 +277,7 @@ func getPersonSubscribe(query map[string]interface{}) (rData map[string]interfac
 }
 
 // getEntDistribute 获取企业分发订阅
-func getEntDistribute(entId, uid int64) (rData map[string]interface{}) {
-	//查询是否有分发
-	res := IC.MainMysql.FindOne("entniche_user_rule", map[string]interface{}{"user_id": uid}, "rule_id", "rule_id desc")
-	if res == nil || len(*res) == 0 {
-		return
-	}
-	ruleId := common.ObjToString((*res)["rule_id"])
-	if ruleId == "" {
-		return
-	}
+func getEntDistribute(ruleId string, entId, uid int64) (rData map[string]interface{}) {
 	//查询分发内容
 	ruleRes, _ := IC.Mgo.FindById("entniche_distribute", ruleId, `{"i_deptid":1,"o_area":1,"a_buyerclass":1,"a_items":1}`)
 	if ruleRes == nil || len(*ruleRes) == 0 {

+ 110 - 109
jyBXSubscribe/rpc/type/bxsubscribe/bxsubscribe.pb.go

@@ -3639,8 +3639,8 @@ type StaffSubscribe struct {
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	Name    string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
-	Id      int64  `protobuf:"varint,2,opt,name=id,proto3" json:"id,omitempty"`
+	Token   string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"`
+	Name    string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
 	Phone   string `protobuf:"bytes,3,opt,name=phone,proto3" json:"phone,omitempty"`
 	EStatus int64  `protobuf:"varint,4,opt,name=eStatus,proto3" json:"eStatus,omitempty"`
 	PStatus int64  `protobuf:"varint,5,opt,name=pStatus,proto3" json:"pStatus,omitempty"`
@@ -3678,18 +3678,18 @@ func (*StaffSubscribe) Descriptor() ([]byte, []int) {
 	return file_bxsubscribe_proto_rawDescGZIP(), []int{41}
 }
 
-func (x *StaffSubscribe) GetName() string {
+func (x *StaffSubscribe) GetToken() string {
 	if x != nil {
-		return x.Name
+		return x.Token
 	}
 	return ""
 }
 
-func (x *StaffSubscribe) GetId() int64 {
+func (x *StaffSubscribe) GetName() string {
 	if x != nil {
-		return x.Id
+		return x.Name
 	}
-	return 0
+	return ""
 }
 
 func (x *StaffSubscribe) GetPhone() string {
@@ -3718,9 +3718,9 @@ type StaffSubscribeDetailReq struct {
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	EntId     int64 `protobuf:"varint,1,opt,name=entId,proto3" json:"entId,omitempty"`
-	EntUserId int64 `protobuf:"varint,2,opt,name=entUserId,proto3" json:"entUserId,omitempty"`
-	StaffId   int64 `protobuf:"varint,3,opt,name=staffId,proto3" json:"staffId,omitempty"`
+	EntId     int64  `protobuf:"varint,1,opt,name=entId,proto3" json:"entId,omitempty"`
+	EntUserId int64  `protobuf:"varint,2,opt,name=entUserId,proto3" json:"entUserId,omitempty"`
+	Token     string `protobuf:"bytes,3,opt,name=token,proto3" json:"token,omitempty"`
 }
 
 func (x *StaffSubscribeDetailReq) Reset() {
@@ -3769,11 +3769,11 @@ func (x *StaffSubscribeDetailReq) GetEntUserId() int64 {
 	return 0
 }
 
-func (x *StaffSubscribeDetailReq) GetStaffId() int64 {
+func (x *StaffSubscribeDetailReq) GetToken() string {
 	if x != nil {
-		return x.StaffId
+		return x.Token
 	}
-	return 0
+	return ""
 }
 
 type StaffSubscribeDetail struct {
@@ -4346,104 +4346,105 @@ var file_bxsubscribe_proto_rawDesc = []byte{
 	0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x62, 0x78,
 	0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x66, 0x66, 0x53,
 	0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22,
-	0x7e, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x66, 0x66, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62,
-	0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
-	0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28,
-	0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x18, 0x03,
-	0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65,
-	0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x65, 0x53,
-	0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73,
-	0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22,
-	0x67, 0x0a, 0x17, 0x53, 0x74, 0x61, 0x66, 0x66, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62,
-	0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x71, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e,
-	0x74, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x65, 0x6e, 0x74, 0x49, 0x64,
-	0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x74, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x02, 0x20,
-	0x01, 0x28, 0x03, 0x52, 0x09, 0x65, 0x6e, 0x74, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x18,
-	0x0a, 0x07, 0x73, 0x74, 0x61, 0x66, 0x66, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52,
-	0x07, 0x73, 0x74, 0x61, 0x66, 0x66, 0x49, 0x64, 0x22, 0x5e, 0x0a, 0x14, 0x53, 0x74, 0x61, 0x66,
-	0x66, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c,
-	0x12, 0x19, 0x0a, 0x08, 0x65, 0x72, 0x72, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01,
-	0x28, 0x03, 0x52, 0x07, 0x65, 0x72, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x65,
-	0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72,
-	0x72, 0x4d, 0x73, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01,
-	0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0xbb, 0x09, 0x0a, 0x0b, 0x42, 0x78, 0x73,
-	0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x4d, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x53,
-	0x75, 0x62, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1e, 0x2e, 0x62, 0x78, 0x73, 0x75, 0x62, 0x73, 0x63,
-	0x72, 0x69, 0x62, 0x65, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x49, 0x6e,
-	0x66, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x1f, 0x2e, 0x62, 0x78, 0x73, 0x75, 0x62, 0x73, 0x63,
-	0x72, 0x69, 0x62, 0x65, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x49, 0x6e,
-	0x66, 0x6f, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x45, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x53, 0x75,
-	0x62, 0x53, 0x6f, 0x6d, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x18, 0x2e, 0x62, 0x78, 0x73, 0x75,
-	0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x2e, 0x53, 0x6f, 0x6d, 0x65, 0x49, 0x6e, 0x66, 0x6f,
-	0x52, 0x65, 0x71, 0x1a, 0x19, 0x2e, 0x62, 0x78, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62,
-	0x65, 0x2e, 0x53, 0x6f, 0x6d, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x12, 0x53,
-	0x0a, 0x13, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x53, 0x63, 0x72, 0x69, 0x62,
-	0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x23, 0x2e, 0x62, 0x78, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72,
-	0x69, 0x62, 0x65, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x53, 0x63, 0x72,
-	0x69, 0x62, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x62, 0x78, 0x73,
-	0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52,
-	0x65, 0x73, 0x70, 0x12, 0x4f, 0x0a, 0x0d, 0x42, 0x79, 0x50, 0x75, 0x73, 0x68, 0x48, 0x69, 0x73,
-	0x74, 0x6f, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x62, 0x78, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69,
-	0x62, 0x65, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x49, 0x6e, 0x66, 0x6f,
-	0x73, 0x52, 0x65, 0x71, 0x1a, 0x1e, 0x2e, 0x62, 0x78, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69,
-	0x62, 0x65, 0x2e, 0x42, 0x79, 0x50, 0x75, 0x73, 0x68, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79,
-	0x52, 0x65, 0x73, 0x70, 0x12, 0x3b, 0x0a, 0x07, 0x53, 0x65, 0x74, 0x52, 0x65, 0x61, 0x64, 0x12,
-	0x17, 0x2e, 0x62, 0x78, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x2e, 0x53, 0x65,
-	0x74, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x62, 0x78, 0x73, 0x75, 0x62,
-	0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73,
-	0x70, 0x12, 0x36, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x16, 0x2e, 0x62, 0x78,
-	0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79,
-	0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x62, 0x78, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62,
-	0x65, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x12, 0x3f, 0x0a, 0x10, 0x47, 0x65, 0x74,
-	0x53, 0x75, 0x62, 0x53, 0x63, 0x72, 0x69, 0x62, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x14, 0x2e,
-	0x62, 0x78, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72,
-	0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x62, 0x78, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62,
-	0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x71, 0x12, 0x49, 0x0a, 0x0e, 0x4d, 0x73,
-	0x67, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x6f, 0x72, 0x12, 0x1e, 0x2e, 0x62,
-	0x78, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x2e, 0x4d, 0x73, 0x67, 0x44, 0x69,
-	0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x62,
-	0x78, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75,
-	0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x4e, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x44, 0x69, 0x73, 0x74,
-	0x72, 0x69, 0x62, 0x75, 0x74, 0x6f, 0x72, 0x12, 0x1e, 0x2e, 0x62, 0x78, 0x73, 0x75, 0x62, 0x73,
-	0x63, 0x72, 0x69, 0x62, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62,
-	0x75, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x1c, 0x2e, 0x62, 0x78, 0x73, 0x75, 0x62, 0x73,
-	0x63, 0x72, 0x69, 0x62, 0x65, 0x2e, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x6f,
-	0x72, 0x52, 0x65, 0x73, 0x70, 0x12, 0x4b, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x56, 0x69, 0x65, 0x77,
-	0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1d, 0x2e, 0x62, 0x78, 0x73, 0x75, 0x62, 0x73, 0x63,
-	0x72, 0x69, 0x62, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x69, 0x65, 0x77, 0x53, 0x74, 0x61, 0x74,
-	0x75, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x62, 0x78, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72,
-	0x69, 0x62, 0x65, 0x2e, 0x56, 0x69, 0x65, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65,
-	0x73, 0x70, 0x12, 0x45, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1b,
-	0x2e, 0x62, 0x78, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x2e, 0x47, 0x65, 0x74,
-	0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x1a, 0x1c, 0x2e, 0x62, 0x78,
-	0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65,
-	0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x71, 0x12, 0x3f, 0x0a, 0x07, 0x73, 0x65, 0x74,
-	0x55, 0x73, 0x65, 0x72, 0x12, 0x1b, 0x2e, 0x62, 0x78, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69,
-	0x62, 0x65, 0x2e, 0x53, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65,
-	0x71, 0x1a, 0x17, 0x2e, 0x62, 0x78, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x2e,
-	0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x45, 0x0a, 0x0a, 0x67, 0x65,
-	0x74, 0x50, 0x75, 0x73, 0x68, 0x53, 0x65, 0x74, 0x12, 0x1a, 0x2e, 0x62, 0x78, 0x73, 0x75, 0x62,
-	0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x75, 0x73, 0x68, 0x53, 0x65,
-	0x74, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x62, 0x78, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69,
-	0x62, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x75, 0x73, 0x68, 0x53, 0x65, 0x74, 0x52, 0x65, 0x73,
-	0x70, 0x12, 0x41, 0x0a, 0x0a, 0x73, 0x65, 0x74, 0x50, 0x75, 0x73, 0x68, 0x53, 0x65, 0x74, 0x12,
-	0x1a, 0x2e, 0x62, 0x78, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x2e, 0x53, 0x65,
-	0x74, 0x50, 0x75, 0x73, 0x68, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x62, 0x78,
+	0x84, 0x01, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x66, 0x66, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69,
+	0x62, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65,
+	0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05,
+	0x70, 0x68, 0x6f, 0x6e, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x68, 0x6f,
+	0x6e, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20,
+	0x01, 0x28, 0x03, 0x52, 0x07, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07,
+	0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x70,
+	0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x63, 0x0a, 0x17, 0x53, 0x74, 0x61, 0x66, 0x66, 0x53,
+	0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x65,
+	0x71, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03,
+	0x52, 0x05, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x74, 0x55, 0x73,
+	0x65, 0x72, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x65, 0x6e, 0x74, 0x55,
+	0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x5e, 0x0a, 0x14, 0x53,
+	0x74, 0x61, 0x66, 0x66, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x44, 0x65, 0x74,
+	0x61, 0x69, 0x6c, 0x12, 0x19, 0x0a, 0x08, 0x65, 0x72, 0x72, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x65, 0x72, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x17,
+	0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18,
+	0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0xbb, 0x09, 0x0a, 0x0b,
+	0x42, 0x78, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x4d, 0x0a, 0x0a, 0x47,
+	0x65, 0x74, 0x53, 0x75, 0x62, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1e, 0x2e, 0x62, 0x78, 0x73, 0x75,
+	0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62,
+	0x65, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x1f, 0x2e, 0x62, 0x78, 0x73, 0x75,
+	0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62,
+	0x65, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x45, 0x0a, 0x0e, 0x47, 0x65,
+	0x74, 0x53, 0x75, 0x62, 0x53, 0x6f, 0x6d, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x18, 0x2e, 0x62,
+	0x78, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x2e, 0x53, 0x6f, 0x6d, 0x65, 0x49,
+	0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x1a, 0x19, 0x2e, 0x62, 0x78, 0x73, 0x75, 0x62, 0x73, 0x63,
+	0x72, 0x69, 0x62, 0x65, 0x2e, 0x53, 0x6f, 0x6d, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73,
+	0x70, 0x12, 0x53, 0x0a, 0x13, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x53, 0x63,
+	0x72, 0x69, 0x62, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x23, 0x2e, 0x62, 0x78, 0x73, 0x75, 0x62,
+	0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62,
+	0x53, 0x63, 0x72, 0x69, 0x62, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e,
+	0x62, 0x78, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74,
+	0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x4f, 0x0a, 0x0d, 0x42, 0x79, 0x50, 0x75, 0x73, 0x68,
+	0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x62, 0x78, 0x73, 0x75, 0x62, 0x73,
+	0x63, 0x72, 0x69, 0x62, 0x65, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x49,
+	0x6e, 0x66, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x1e, 0x2e, 0x62, 0x78, 0x73, 0x75, 0x62, 0x73,
+	0x63, 0x72, 0x69, 0x62, 0x65, 0x2e, 0x42, 0x79, 0x50, 0x75, 0x73, 0x68, 0x48, 0x69, 0x73, 0x74,
+	0x6f, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x12, 0x3b, 0x0a, 0x07, 0x53, 0x65, 0x74, 0x52, 0x65,
+	0x61, 0x64, 0x12, 0x17, 0x2e, 0x62, 0x78, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65,
+	0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x62, 0x78,
 	0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73,
-	0x52, 0x65, 0x73, 0x70, 0x12, 0x5c, 0x0a, 0x15, 0x67, 0x65, 0x74, 0x53, 0x74, 0x61, 0x66, 0x66,
-	0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1e, 0x2e,
-	0x62, 0x78, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x66,
-	0x66, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x23, 0x2e,
-	0x62, 0x78, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x66,
-	0x66, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65,
-	0x73, 0x70, 0x12, 0x62, 0x0a, 0x17, 0x67, 0x65, 0x74, 0x53, 0x74, 0x61, 0x66, 0x66, 0x53, 0x75,
-	0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x24, 0x2e,
-	0x62, 0x78, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x66,
+	0x52, 0x65, 0x73, 0x70, 0x12, 0x36, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x16,
+	0x2e, 0x62, 0x78, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x2e, 0x47, 0x65, 0x74,
+	0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x62, 0x78, 0x73, 0x75, 0x62, 0x73, 0x63,
+	0x72, 0x69, 0x62, 0x65, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x12, 0x3f, 0x0a, 0x10,
+	0x47, 0x65, 0x74, 0x53, 0x75, 0x62, 0x53, 0x63, 0x72, 0x69, 0x62, 0x65, 0x49, 0x6e, 0x66, 0x6f,
+	0x12, 0x14, 0x2e, 0x62, 0x78, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x2e, 0x55,
+	0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x62, 0x78, 0x73, 0x75, 0x62, 0x73, 0x63,
+	0x72, 0x69, 0x62, 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x71, 0x12, 0x49, 0x0a,
+	0x0e, 0x4d, 0x73, 0x67, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x6f, 0x72, 0x12,
+	0x1e, 0x2e, 0x62, 0x78, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x2e, 0x4d, 0x73,
+	0x67, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x1a,
+	0x17, 0x2e, 0x62, 0x78, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x2e, 0x53, 0x74,
+	0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x4e, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x44,
+	0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x6f, 0x72, 0x12, 0x1e, 0x2e, 0x62, 0x78, 0x73,
+	0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x69, 0x73, 0x74,
+	0x72, 0x69, 0x62, 0x75, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x1c, 0x2e, 0x62, 0x78, 0x73,
+	0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x2e, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62,
+	0x75, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x12, 0x4b, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x56,
+	0x69, 0x65, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1d, 0x2e, 0x62, 0x78, 0x73, 0x75,
+	0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x69, 0x65, 0x77, 0x53,
+	0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x62, 0x78, 0x73, 0x75, 0x62,
+	0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x2e, 0x56, 0x69, 0x65, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75,
+	0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x45, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x66,
+	0x6f, 0x12, 0x1b, 0x2e, 0x62, 0x78, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x2e,
+	0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x1a, 0x1c,
+	0x2e, 0x62, 0x78, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x2e, 0x47, 0x65, 0x74,
+	0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x71, 0x12, 0x3f, 0x0a, 0x07,
+	0x73, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x12, 0x1b, 0x2e, 0x62, 0x78, 0x73, 0x75, 0x62, 0x73,
+	0x63, 0x72, 0x69, 0x62, 0x65, 0x2e, 0x53, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x66,
+	0x6f, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x62, 0x78, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69,
+	0x62, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x45, 0x0a,
+	0x0a, 0x67, 0x65, 0x74, 0x50, 0x75, 0x73, 0x68, 0x53, 0x65, 0x74, 0x12, 0x1a, 0x2e, 0x62, 0x78,
+	0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x75, 0x73,
+	0x68, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x62, 0x78, 0x73, 0x75, 0x62, 0x73,
+	0x63, 0x72, 0x69, 0x62, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x75, 0x73, 0x68, 0x53, 0x65, 0x74,
+	0x52, 0x65, 0x73, 0x70, 0x12, 0x41, 0x0a, 0x0a, 0x73, 0x65, 0x74, 0x50, 0x75, 0x73, 0x68, 0x53,
+	0x65, 0x74, 0x12, 0x1a, 0x2e, 0x62, 0x78, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65,
+	0x2e, 0x53, 0x65, 0x74, 0x50, 0x75, 0x73, 0x68, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x17,
+	0x2e, 0x62, 0x78, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x2e, 0x53, 0x74, 0x61,
+	0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x5c, 0x0a, 0x15, 0x67, 0x65, 0x74, 0x53, 0x74,
+	0x61, 0x66, 0x66, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4c, 0x69, 0x73, 0x74,
+	0x12, 0x1e, 0x2e, 0x62, 0x78, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x2e, 0x53,
+	0x74, 0x61, 0x66, 0x66, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71,
+	0x1a, 0x23, 0x2e, 0x62, 0x78, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x2e, 0x53,
+	0x74, 0x61, 0x66, 0x66, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4c, 0x69, 0x73,
+	0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x62, 0x0a, 0x17, 0x67, 0x65, 0x74, 0x53, 0x74, 0x61, 0x66,
 	0x66, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c,
-	0x52, 0x65, 0x71, 0x1a, 0x21, 0x2e, 0x62, 0x78, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62,
-	0x65, 0x2e, 0x53, 0x74, 0x61, 0x66, 0x66, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65,
-	0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x42, 0x0f, 0x5a, 0x0d, 0x2e, 0x2f, 0x62, 0x78, 0x73, 0x75,
-	0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x12, 0x24, 0x2e, 0x62, 0x78, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x2e, 0x53,
+	0x74, 0x61, 0x66, 0x66, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x44, 0x65, 0x74,
+	0x61, 0x69, 0x6c, 0x52, 0x65, 0x71, 0x1a, 0x21, 0x2e, 0x62, 0x78, 0x73, 0x75, 0x62, 0x73, 0x63,
+	0x72, 0x69, 0x62, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x66, 0x66, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72,
+	0x69, 0x62, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x42, 0x0f, 0x5a, 0x0d, 0x2e, 0x2f, 0x62,
+	0x78, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x33,
 }
 
 var (