Repository: matrixorigin/matrixone
Pull request #10641 (2023-07-13 08:50:56)

[feature] logservice: add API to delete CN store from HAKeeper.
MO cloud operator will call the APIs to delete CN store.

## What type of PR is this?

- [ ] API-change
- [ ] BUG
- [ ] Improvement
- [ ] Documentation
- [x] Feature
- [ ] Test and CI
- [ ] Code Refactoring

## Which issue(s) this PR fixes:

issue #10640 

## What this PR does / why we need it:


Patch:
diff --git a/pkg/hakeeper/rsm.go b/pkg/hakeeper/rsm.go
index 6e7b477e5..e362b2456 100644
--- a/pkg/hakeeper/rsm.go
+++ b/pkg/hakeeper/rsm.go
@@ -185,6 +185,18 @@ func parsePatchCNStoreCmd(cmd []byte) pb.CNStateLabel {
 	return result
 }
 
+func parseDeleteCNStoreCmd(cmd []byte) pb.DeleteCNStore {
+	if parseCmdTag(cmd) != pb.RemoveCNStore {
+		panic("not a RemoveCNStore cmd")
+	}
+	payload := cmd[headerSize:]
+	var result pb.DeleteCNStore
+	if err := result.Unmarshal(payload); err != nil {
+		panic(err)
+	}
+	return result
+}
+
 func GetSetStateCmd(state pb.HAKeeperState) []byte {
 	cmd := make([]byte, headerSize+4)
 	binaryEnc.PutUint32(cmd, uint32(pb.SetStateUpdate))
@@ -269,6 +281,15 @@ func GetPatchCNStoreCmd(stateLabel pb.CNStateLabel) []byte {
 	return cmd
 }
 
+func GetDeleteCNStoreCmd(cnStore pb.DeleteCNStore) []byte {
+	cmd := make([]byte, headerSize+cnStore.Size())
+	binaryEnc.PutUint32(cmd, uint32(pb.RemoveCNStore))
+	if _, err := cnStore.MarshalTo(cmd[headerSize:]); err != nil {
+		panic(err)
+	}
+	return cmd
+}
+
 func NewStateMachine(shardID uint64, replicaID uint64) sm.IStateMachine {
 	if shardID != DefaultHAKeeperShardID {
 		panic(moerr.NewInvalidInputNoCtx("HAKeeper shard ID %d does not match DefaultHAKeeperShardID %d", shardID, DefaultHAKeeperShardID))
@@ -587,6 +608,8 @@ func (s *stateMachine) Update(e sm.Entry) (sm.Result, error) {
 		return s.handleUpdateCNWorkState(cmd), nil
 	case pb.PatchCNStore:
 		return s.handlePatchCNStore(cmd), nil
+	case pb.RemoveCNStore:
+		return s.handleDeleteCNCmd(parseDeleteCNStoreCmd(cmd).StoreID), nil
 	default:
 		panic(moerr.NewInvalidInputNoCtx("unknown haKeeper cmd '%v'", cmd))
 	}
diff --git a/pkg/logservice/hakeeper_client.go b/pkg/logservice/hakeeper_client.go
index b72e7f202..4b382b468 100644
--- a/pkg/logservice/hakeeper_client.go
+++ b/pkg/logservice/hakeeper_client.go
@@ -87,6 +87,8 @@ type ProxyHAKeeperClient interface {
 	UpdateCNWorkState(ctx context.Context, state pb.CNWorkState) error
 	// PatchCNStore updates the work state and labels of CN.
 	PatchCNStore(ctx context.Context, stateLabel pb.CNStateLabel) error
+	// DeleteCNStore deletes a CN store from HAKeeper.
+	DeleteCNStore(ctx context.Context, cnStore pb.DeleteCNStore) error
 }
 
 // TODO: HAKeeper discovery to be implemented
@@ -416,6 +418,23 @@ func (c *managedHAKeeperClient) PatchCNStore(ctx context.Context, stateLabel pb.
 	}
 }
 
+// DeleteCNStore implements the ProxyHAKeeperClient interface.
+func (c *managedHAKeeperClient) DeleteCNStore(ctx context.Context, cnStore pb.DeleteCNStore) error {
+	for {
+		if err := c.prepareClient(ctx); err != nil {
+			return err
+		}
+		err := c.getClient().deleteCNStore(ctx, cnStore)
+		if err != nil {
+			c.resetClient()
+		}
+		if c.isRetryableError(err) {
+			continue
+		}
+		return err
+	}
+}
+
 func (c *managedHAKeeperClient) isRetryableError(err error) bool {
 	return moerr.IsMoErrCode(err, moerr.ErrNoHAKeeper)
 }
@@ -688,6 +707,18 @@ func (c *hakeeperClient) patchCNStore(ctx context.Context, stateLabel pb.CNState
 	return nil
 }
 
+func (c *hakeeperClient) deleteCNStore(ctx context.Context, cnStore pb.DeleteCNStore) error {
+	req := pb.Request{
+		Method:        pb.DELETE_CN_STORE,
+		DeleteCNStore: &cnStore,
+	}
+	_, err := c.request(ctx, req)
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
 func (c *hakeeperClient) checkIsHAKeeper(ctx context.Context) (bool, error) {
 	req := pb.Request{
 		Method: pb.CHECK_HAKEEPER,
diff --git a/pkg/logservice/service.go b/pkg/logservice/service.go
index 533c80585..453e83728 100644
--- a/pkg/logservice/service.go
+++ b/pkg/logservice/service.go
@@ -279,6 +279,8 @@ func (s *Service) handle(ctx context.Context, req pb.Request,
 		return s.handleUpdateCNWorkState(ctx, req), pb.LogRecordResponse{}
 	case pb.PATCH_CN_STORE:
 		return s.handlePatchCNStore(ctx, req), pb.LogRecordResponse{}
+	case pb.DELETE_CN_STORE:
+		return s.handleDeleteCNStore(ctx, req), pb.LogRecordResponse{}
 	default:
 		panic("unknown log service method type")
 	}
@@ -482,6 +484,16 @@ func (s *Service) handlePatchCNStore(ctx context.Context, req pb.Request) pb.Res
 	return resp
 }
 
+func (s *Service) handleDeleteCNStore(ctx context.Context, req pb.Request) pb.Response {
+	cnStore := req.DeleteCNStore
+	resp := getResponse(req)
+	if err := s.store.deleteCNStore(ctx, *cnStore); err != nil {
+		resp.ErrorCode, resp.ErrorMessage = toErrorCode(err)
+		return resp
+	}
+	return resp
+}
+
 func (s *Service) getBackendOptions() []morpc.BackendOption {
 	return []morpc.BackendOption{
 		morpc.WithBackendFilter(func(msg morpc.Message, backendAddr string) bool {
diff --git a/pkg/logservice/store.go b/pkg/logservice/store.go
index 4a4386e26..3c619b61b 100644
--- a/pkg/logservice/store.go
+++ b/pkg/logservice/store.go
@@ -583,7 +583,29 @@ func (l *store) patchCNStore(ctx context.Context, stateLabel pb.CNStateLabel) er
 	cmd := hakeeper.GetPatchCNStoreCmd(stateLabel)
 	session := l.nh.GetNoOPSession(hakeeper.DefaultHAKeeperShardID)
 	if result, err := l.propose(ctx, session, cmd); err != nil {
-		l.runtime.Logger().Error("failed to propose CN work state",
+		l.runtime.Logger().Error("failed to propose CN patch store",
+			zap.String("state", state.String()),
+			zap.Error(err))
+		return handleNotHAKeeperError(ctx, err)
+	} else {
+		var cb pb.CommandBatch
+		MustUnmarshal(&cb, result.Data)
+		return nil
+	}
+}
+
+func (l *store) deleteCNStore(ctx context.Context, cnStore pb.DeleteCNStore) error {
+	state, err := l.getCheckerState()
+	if err != nil {
+		return err
+	}
+	if _, ok := state.CNState.Stores[cnStore.StoreID]; !ok {
+		return nil
+	}
+	cmd := hakeeper.GetDeleteCNStoreCmd(cnStore)
+	session := l.nh.GetNoOPSession(hakeeper.DefaultHAKeeperShardID)
+	if result, err := l.propose(ctx, session, cmd); err != nil {
+		l.runtime.Logger().Error("failed to propose delete CN store",
 			zap.String("state", state.String()),
 			zap.Error(err))
 		return handleNotHAKeeperError(ctx, err)
diff --git a/pkg/pb/logservice/logservice.pb.go b/pkg/pb/logservice/logservice.pb.go
index 6dc794648..cc4aba3d8 100644
--- a/pkg/pb/logservice/logservice.pb.go
+++ b/pkg/pb/logservice/logservice.pb.go
@@ -102,6 +102,7 @@ const (
 	UPDATE_CN_LABEL      MethodType = 15
 	UPDATE_CN_WORK_STATE MethodType = 16
 	PATCH_CN_STORE       MethodType = 17
+	DELETE_CN_STORE      MethodType = 18
 )
 
 var MethodType_name = map[int32]string{
@@ -123,6 +124,7 @@ var MethodType_name = map[int32]string{
 	15: "UPDATE_CN_LABEL",
 	16: "UPDATE_CN_WORK_STATE",
 	17: "PATCH_CN_STORE",
+	18: "DELETE_CN_STORE",
 }
 
 var MethodType_value = map[string]int32{
@@ -144,6 +146,7 @@ var MethodType_value = map[string]int32{
 	"UPDATE_CN_LABEL":      15,
 	"UPDATE_CN_WORK_STATE": 16,
 	"PATCH_CN_STORE":       17,
+	"DELETE_CN_STORE":      18,
 }
 
 func (x MethodType) String() string {
@@ -226,6 +229,7 @@ const (
 	UpdateCNLabel               HAKeeperUpdateType = 10
 	UpdateCNWorkState           HAKeeperUpdateType = 11
 	PatchCNStore                HAKeeperUpdateType = 12
+	RemoveCNStore               HAKeeperUpdateType = 13
 )
 
 var HAKeeperUpdateType_name = map[int32]string{
@@ -242,6 +246,7 @@ var HAKeeperUpdateType_name = map[int32]string{
 	10: "UpdateCNLabel",
 	11: "UpdateCNWorkState",
 	12: "PatchCNStore",
+	13: "RemoveCNStore",
 }
 
 var HAKeeperUpdateType_value = map[string]int32{
@@ -258,6 +263,7 @@ var HAKeeperUpdateType_value = map[string]int32{
 	"UpdateCNLabel":               10,
 	"UpdateCNWorkState":           11,
 	"PatchCNStore":                12,
+	"RemoveCNStore":               13,
 }
 
 func (x HAKeeperUpdateType) String() string {
@@ -1751,6 +1757,7 @@ type Request struct {
 	CNStoreLabel         *CNStoreLabel      `protobuf:"bytes,9,opt,name=CNStoreLabel,proto3" json:"CNStoreLabel,omitempty"`
 	CNWorkState          *CNWorkState       `protobuf:"bytes,10,opt,name=CNWorkState,proto3" json:"CNWorkState,omitempty"`
 	CNStateLabel         *CNStateLabel      `protobuf:"bytes,11,opt,name=CNStateLabel,proto3" json:"CNStateLabel,omitempty"`
+	DeleteCNStore        *DeleteCNStore     `protobuf:"bytes,12,opt,name=DeleteCNStore,proto3" json:"DeleteCNStore,omitempty"`
 	XXX_NoUnkeyedLiteral struct{}           `json:"-"`
 	XXX_unrecognized     []byte             `json:"-"`
 	XXX_sizecache        int32              `json:"-"`
@@ -1866,6 +1873,13 @@ func (m *Request) GetCNStateLabel() *CNStateLabel {
 	return nil
 }
 
+func (m *Request) GetDeleteCNStore() *DeleteCNStore {
+	if m != nil {
+		return m.DeleteCNStore
+	}
+	return nil
+}
+
 type LogResponse struct {
 	ShardID              uint64   `protobuf:"varint,1,opt,name=ShardID,proto3" json:"ShardID,omitempty"`
 	Lsn                  uint64   `protobuf:"varint,2,opt,name=Lsn,proto3" json:"Lsn,omitempty"`
@@ -3835,203 +3849,205 @@ func init() {
 func init() { proto.RegisterFile("logservice.proto", fileDescriptor_fd1040c5381ab5a7) }
 
 var fileDescriptor_fd1040c5381ab5a7 = []byte{
-	// 3131 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x1a, 0x4d, 0x6f, 0x1b, 0xc7,
-	0x55, 0xbb, 0xa4, 0x44, 0xf2, 0x51, 0x92, 0x57, 0x23, 0xd9, 0x66, 0x94, 0x54, 0x56, 0x37, 0x6e,
-	0xe0, 0x28, 0x0d, 0x8d, 0x4a, 0x48, 0x90, 0x34, 0x8a, 0x0d, 0x8a, 0x4b, 0x5b, 0x8c, 0x68, 0x4a,
-	0x19, 0x52, 0x0d, 0x10, 0x20, 0x50, 0x57, 0xe4, 0x98, 0x62, 0x45, 0x72, 0xd9, 0xdd, 0xa5, 0x63,
-	0xf5, 0xd4, 0x4b, 0x0a, 0x14, 0x3d, 0x15, 0xed, 0x21, 0x28, 0x8a, 0xfe, 0x8a, 0x1c, 0xda, 0x43,
-	0x0f, 0x3d, 0x14, 0xc8, 0x31, 0x97, 0x5c, 0x83, 0x26, 0x40, 0x4f, 0x3d, 0x14, 0xe8, 0xa1, 0xe7,
-	0x62, 0xbe, 0x76, 0x67, 0xc8, 0xa5, 0x24, 0x27, 0x6e, 0x5a, 0x24, 0x27, 0xee, 0xbc, 0xaf, 0x79,
-	0xf3, 0xe6, 0xbd, 0x37, 0x6f, 0xde, 0x10, 0xac, 0x9e, 0xd7, 0x09, 0x88, 0xff, 0xa8, 0xdb, 0x22,
-	0xc5, 0xa1, 0xef, 0x85, 0x1e, 0x82, 0x18, 0xb2, 0xfa, 0x72, 0xa7, 0x1b, 0x9e, 0x8c, 0x8e, 0x8b,
-	0x2d, 0xaf, 0x7f, 0xbb, 0xe3, 0x75, 0xbc, 0xdb, 0x8c, 0xe4, 0x78, 0xf4, 0x90, 0x8d, 0xd8, 0x80,
-	0x7d, 0x71, 0xd6, 0xd5, 0xc5, 0x3e, 0x09, 0xdd, 0xb6, 0x1b, 0xba, 0x7c, 0x6c, 0x7f, 0x96, 0x82,
-	0x4c, 0xb9, 0xde, 0x08, 0x3d, 0x9f, 0x20, 0x04, 0xe9, 0xc3, 0xc3, 0xaa, 0x53, 0x30, 0xd6, 0x8d,
-	0x5b, 0x39, 0xcc, 0xbe, 0xd1, 0x0b, 0xb0, 0xd8, 0xe0, 0x33, 0x95, 0xda, 0x6d, 0x9f, 0x04, 0x41,
-	0xc1, 0x64, 0xd8, 0x31, 0x28, 0x5a, 0x03, 0x68, 0xbc, 0x5d, 0x93, 0x34, 0x29, 0x46, 0xa3, 0x40,
-	0x50, 0x11, 0x50, 0xcd, 0x6b, 0x9d, 0x8e, 0xc9, 0x4a, 0x33, 0xba, 0x04, 0x0c, 0x95, 0x57, 0x0e,
-	0x7b, 0x92, 0x6e, 0x96, 0xcb, 0x8b, 0x21, 0xe8, 0x26, 0xa4, 0xb1, 0xd7, 0x23, 0x85, 0xb9, 0x75,
-	0xe3, 0xd6, 0xe2, 0xa6, 0x55, 0x8c, 0x96, 0x55, 0xae, 0x53, 0x38, 0x66, 0x58, 0xba, 0xa2, 0x66,
-	0xb7, 0x75, 0x5a, 0xc8, 0xac, 0x1b, 0xb7, 0xd2, 0x98, 0x7d, 0xa3, 0x97, 0x60, 0xb6, 0x11, 0xba,
-	0x21, 0x29, 0x64, 0x19, 0xeb, 0xd5, 0xa2, 0x62, 0xde, 0xba, 0xd7, 0x26, 0x0c, 0x89, 0x39, 0x0d,
-	0xfa, 0x01, 0xe4, 0xde, 0xf1, 0xfc, 0x53, 0xce, 0x90, 0x63, 0x0c, 0xcb, 0xf1, 0x5c, 0x11, 0x0a,
-	0xc7, 0x54, 0xe8, 0x4d, 0x98, 0xab, 0xb9, 0xc7, 0xa4, 0x17, 0x14, 0x60, 0x3d, 0x75, 0x2b, 0xbf,
-	0x79, 0x43, 0x9d, 0x40, 0x98, 0xba, 0xc8, 0x29, 0x2a, 0x83, 0xd0, 0x3f, 0xdb, 0x49, 0x7f, 0xfc,
-	0xd9, 0x8d, 0x19, 0x2c, 0x98, 0x56, 0xeb, 0x90, 0x57, 0x90, 0xc8, 0x82, 0xd4, 0x29, 0x39, 0x13,
-	0x5b, 0x42, 0x3f, 0xd1, 0x8b, 0x30, 0xfb, 0xc8, 0xed, 0x8d, 0x08, 0xdb, 0x88, 0xbc, 0xaa, 0x0e,
-	0xe3, 0xab, 0x75, 0x83, 0x10, 0x73, 0x8a, 0x1f, 0x9a, 0xaf, 0x19, 0xf6, 0x5f, 0x4c, 0xc8, 0x38,
-	0x4f, 0x61, 0x83, 0xa5, 0x29, 0x53, 0x49, 0xa6, 0x4c, 0x5f, 0xc2, 0x94, 0xaf, 0xc0, 0x5c, 0xe3,
-	0xc4, 0xf5, 0xdb, 0x74, 0x37, 0xa9, 0x5d, 0xae, 0xab, 0xd4, 0x4e, 0x9d, 0xe1, 0xaa, 0x83, 0x87,
-	0x9e, 0xb4, 0x07, 0x27, 0x46, 0x9b, 0xb0, 0x52, 0xf3, 0x3a, 0xa1, 0xdb, 0xed, 0x51, 0x85, 0x88,
-	0x2f, 0xb5, 0x9c, 0x63, 0x5a, 0x26, 0xe2, 0xa6, 0x38, 0x5b, 0xe6, 0x92, 0xce, 0x96, 0x1d, 0x77,
-	0x36, 0xfb, 0xaf, 0x06, 0x64, 0x6b, 0x5e, 0xe7, 0xff, 0xc0, 0x88, 0xdb, 0x90, 0xc5, 0x64, 0xd8,
-	0xeb, 0xb6, 0x5c, 0x69, 0xc6, 0x55, 0x95, 0xbe, 0xe6, 0x75, 0x04, 0x5a, 0xb1, 0x64, 0xc4, 0x61,
-	0xff, 0xd3, 0x80, 0x79, 0xba, 0x0e, 0x69, 0x6a, 0x54, 0x80, 0x0c, 0x1f, 0xf0, 0xe5, 0xa4, 0xb1,
-	0x1c, 0xa2, 0x1d, 0x65, 0x22, 0x93, 0x4d, 0xf4, 0xc2, 0xd8, 0x44, 0x91, 0x94, 0xa2, 0x24, 0x64,
-	0x1e, 0x1b, 0x4f, 0x87, 0x56, 0x60, 0xb6, 0x32, 0xf4, 0x5a, 0x27, 0x62, 0xb9, 0x7c, 0x80, 0x56,
-	0x21, 0x5b, 0x23, 0x6e, 0x9b, 0xf8, 0x55, 0x87, 0x2d, 0x39, 0x8d, 0xa3, 0x31, 0xb3, 0x0f, 0xf1,
-	0xfb, 0x2c, 0xde, 0xa9, 0x7d, 0x88, 0xdf, 0x5f, 0x7d, 0x03, 0x16, 0xb4, 0x09, 0xd4, 0x90, 0x48,
-	0xf3, 0x90, 0x58, 0x51, 0x43, 0x22, 0xa7, 0x7a, 0xff, 0x23, 0x58, 0xd4, 0x6d, 0x82, 0xee, 0xe9,
-	0x26, 0x60, 0x62, 0xf2, 0x9b, 0x85, 0x69, 0x8b, 0xdb, 0xc9, 0x52, 0x1b, 0x7e, 0xf2, 0xd9, 0x0d,
-	0x03, 0xeb, 0xa6, 0x7b, 0x0e, 0x72, 0x52, 0xac, 0xc3, 0xe6, 0x4d, 0xe3, 0x18, 0x60, 0xff, 0xd6,
-	0x04, 0x4b, 0xc4, 0xfa, 0x2e, 0x71, 0xfd, 0xf0, 0x98, 0xb8, 0xe1, 0x37, 0x30, 0xbf, 0x16, 0x01,
-	0x35, 0xdd, 0x40, 0xca, 0x2e, 0xfb, 0xc4, 0x0d, 0x49, 0x9b, 0x05, 0x5a, 0x16, 0x27, 0x60, 0xec,
-	0x57, 0x61, 0xbe, 0x5c, 0x2f, 0xf5, 0x7a, 0x5e, 0xcb, 0x0d, 0x49, 0xd5, 0x49, 0xc8, 0x6e, 0x2b,
-	0x30, 0xbb, 0xe3, 0x86, 0xad, 0x13, 0x61, 0x52, 0x3e, 0xb0, 0x3f, 0x30, 0x61, 0x49, 0x06, 0xe0,
-	0xf9, 0xf6, 0x5c, 0x87, 0x3c, 0x76, 0x1f, 0x86, 0xba, 0x31, 0x55, 0x50, 0x82, 0xc5, 0x53, 0x89,
-	0x16, 0xbf, 0x09, 0x0b, 0xf7, 0xbd, 0x20, 0xe8, 0x0e, 0x75, 0x63, 0xea, 0xc0, 0xaf, 0x16, 0x90,
-	0x53, 0xec, 0x37, 0x37, 0xd5, 0x7e, 0x15, 0xc8, 0x2b, 0x99, 0xf2, 0x9c, 0xf0, 0x3d, 0xdf, 0x3b,
-	0xff, 0x64, 0x82, 0xe5, 0x3c, 0x4d, 0xef, 0x8c, 0x73, 0x7b, 0xea, 0x49, 0x72, 0x7b, 0xf2, 0xf2,
-	0xd3, 0xd3, 0x96, 0x3f, 0xf5, 0x2c, 0x98, 0x7d, 0xe2, 0xb3, 0x60, 0xee, 0x92, 0x81, 0x91, 0x99,
-	0x38, 0x0b, 0x7e, 0x69, 0x42, 0x16, 0x37, 0x1e, 0xf0, 0x74, 0x6c, 0x41, 0xaa, 0x19, 0x78, 0x32,
-	0x15, 0x35, 0x03, 0x8f, 0xfa, 0x6f, 0x75, 0xd0, 0x26, 0x8f, 0xa5, 0xff, 0xb2, 0x01, 0xf5, 0xa5,
-	0x1a, 0x71, 0x03, 0xb2, 0xeb, 0xf5, 0x78, 0xe2, 0xe3, 0x19, 0x51, 0x07, 0x22, 0x1b, 0xe6, 0x9b,
-	0xfe, 0x68, 0x40, 0x63, 0xa3, 0x5d, 0x0b, 0x06, 0x22, 0x3b, 0x6a, 0x30, 0xf4, 0x16, 0xcc, 0x73,
-	0xa6, 0x6e, 0x10, 0x7a, 0xfe, 0x99, 0xf0, 0x39, 0x2d, 0x37, 0x4b, 0xed, 0x8a, 0x2a, 0x21, 0xcf,
-	0xcd, 0x1a, 0xef, 0xea, 0x5d, 0x58, 0x9a, 0x20, 0xb9, 0x28, 0xbb, 0xa6, 0xd5, 0xec, 0xfa, 0x1e,
-	0xe4, 0x98, 0x83, 0xb7, 0x3c, 0xbf, 0x4d, 0x19, 0xa9, 0xd2, 0x82, 0x91, 0xea, 0xba, 0x01, 0xe9,
-	0xe6, 0xd9, 0x90, 0xf3, 0x2d, 0x6e, 0x5e, 0xd3, 0x74, 0x64, 0x3c, 0x14, 0x8b, 0x19, 0x0d, 0xf5,
-	0x3e, 0xc7, 0x0d, 0x5d, 0x66, 0x98, 0x79, 0xcc, 0xbe, 0xed, 0x0f, 0x0d, 0x00, 0x26, 0xff, 0xa7,
-	0x23, 0x12, 0x30, 0x07, 0xad, 0xbb, 0x7d, 0x22, 0x1d, 0x94, 0x7e, 0xab, 0x11, 0x60, 0xea, 0x11,
-	0x20, 0xd4, 0x49, 0xc5, 0xea, 0x14, 0x20, 0xf3, 0xc0, 0x7d, 0xdc, 0xe8, 0xfe, 0x8c, 0x08, 0xcb,
-	0xca, 0x21, 0x8d, 0x16, 0xe9, 0xa4, 0x8e, 0x38, 0x7b, 0x62, 0x00, 0x53, 0xad, 0x5e, 0x75, 0x98,
-	0xcf, 0xa4, 0x31, 0xfb, 0xb6, 0x6d, 0x80, 0x66, 0xe0, 0x49, 0xcd, 0x56, 0x60, 0xb6, 0xec, 0x8d,
-	0x06, 0xa1, 0x58, 0x3c, 0x1f, 0xd8, 0xff, 0x30, 0x68, 0xb6, 0x63, 0x51, 0xc6, 0x2a, 0xb3, 0xc4,
-	0x08, 0xdb, 0x82, 0xdc, 0xfe, 0x90, 0xf8, 0x6e, 0xd8, 0xf5, 0x06, 0xc2, 0x50, 0x57, 0xf5, 0x82,
-	0x91, 0xf1, 0xee, 0x0f, 0x71, 0x4c, 0x87, 0x76, 0xa2, 0x12, 0x93, 0x87, 0xdb, 0xcd, 0x84, 0x12,
-	0x93, 0x11, 0x7c, 0x8d, 0x75, 0x66, 0x0d, 0xf2, 0xe5, 0x7a, 0x5c, 0x05, 0x27, 0xad, 0xf5, 0x45,
-	0x59, 0xe9, 0x98, 0xd3, 0x0b, 0x69, 0x4e, 0x61, 0x7f, 0x2e, 0x6c, 0xe7, 0x86, 0xe7, 0xd8, 0xee,
-	0xf2, 0xf2, 0x2e, 0xb6, 0x98, 0x9c, 0xe8, 0x6b, 0xb4, 0xd8, 0x07, 0xb3, 0x90, 0x91, 0x1e, 0xc4,
-	0xf2, 0x35, 0xfb, 0x8c, 0x72, 0x79, 0x0c, 0x40, 0x45, 0x98, 0x7b, 0x40, 0xc2, 0x13, 0xaf, 0x9d,
-	0x14, 0x4a, 0x1c, 0xc3, 0x42, 0x49, 0x50, 0xa1, 0x6d, 0x35, 0x6e, 0x58, 0x08, 0xe4, 0x75, 0x9e,
-	0x18, 0x2b, 0xd6, 0xa8, 0xc6, 0x59, 0x89, 0x55, 0x48, 0xd1, 0xc1, 0xc0, 0x82, 0x25, 0xbf, 0xf9,
-	0x9d, 0xf1, 0x0a, 0x49, 0x3b, 0x3d, 0xb0, 0xc6, 0x82, 0xee, 0x50, 0x67, 0x88, 0x25, 0xcc, 0x32,
-	0x09, 0xcf, 0x25, 0x78, 0x69, 0x2c, 0x40, 0x65, 0xa0, 0xfc, 0x8e, 0xc2, 0x3f, 0x37, 0xc9, 0xef,
-	0x4c, 0xf0, 0x2b, 0x0c, 0xe8, 0x55, 0x35, 0x3c, 0x59, 0x12, 0x1f, 0x33, 0x40, 0x8c, 0xc5, 0x6a,
-	0x20, 0x6f, 0xeb, 0xf5, 0x09, 0xbb, 0x0a, 0x8c, 0x15, 0x87, 0x2a, 0x1e, 0xeb, 0xd5, 0xcc, 0xb6,
-	0x1e, 0xef, 0xec, 0xbe, 0x38, 0xc1, 0x1d, 0xe3, 0xb1, 0x9e, 0x1d, 0x5e, 0xd7, 0x02, 0xa8, 0x00,
-	0x8c, 0xf9, 0xba, 0xce, 0x1c, 0xfb, 0xb5, 0x16, 0x6c, 0xdb, 0x7a, 0xb0, 0x14, 0xf2, 0xc9, 0x13,
-	0x4b, 0x3c, 0xd6, 0xa8, 0xed, 0x06, 0xe4, 0xd9, 0xee, 0x07, 0x43, 0x6f, 0x10, 0x90, 0x73, 0x8a,
-	0x0a, 0x91, 0x52, 0x4d, 0x2d, 0xa5, 0xd6, 0xdc, 0x20, 0x8c, 0x13, 0xad, 0x1c, 0xda, 0x45, 0x40,
-	0x8a, 0x9d, 0x14, 0xd9, 0xf7, 0xba, 0xbe, 0xe2, 0xe4, 0x72, 0x68, 0xff, 0x3b, 0x4d, 0x0b, 0x29,
-	0x41, 0xf6, 0x74, 0xa3, 0xe1, 0x39, 0xc8, 0x55, 0x7c, 0xdf, 0xf3, 0xcb, 0x5e, 0x9b, 0x30, 0x35,
-	0x17, 0x70, 0x0c, 0xa0, 0x87, 0x2e, 0x1b, 0x3c, 0x20, 0x41, 0xe0, 0x76, 0x88, 0xa8, 0xf2, 0x34,
-	0x18, 0xad, 0x09, 0xaa, 0xc1, 0x6e, 0x69, 0x8f, 0x90, 0x21, 0xf1, 0x99, 0x37, 0x67, 0xb1, 0x02,
-	0x41, 0x77, 0x35, 0x0b, 0x0a, 0x77, 0xbd, 0x3e, 0x11, 0x70, 0x1c, 0x2d, 0x22, 0x4e, 0xb3, 0x39,
-	0xdd, 0x40, 0xaf, 0xdf, 0x77, 0x07, 0x6d, 0x5e, 0xfc, 0x66, 0x12, 0x36, 0x50, 0xc1, 0x63, 0x8d,
-	0x9a, 0x7a, 0x0e, 0xf3, 0x61, 0x31, 0x7d, 0x76, 0x72, 0x7a, 0x05, 0x8d, 0x55, 0x5a, 0xb4, 0x03,
-	0x8b, 0xe5, 0xde, 0x28, 0x08, 0x89, 0xef, 0x10, 0x5a, 0x3b, 0x05, 0xc2, 0x69, 0xb5, 0x22, 0x56,
-	0xa7, 0xc0, 0x63, 0x1c, 0xe8, 0x0e, 0xe4, 0xe2, 0xeb, 0x14, 0x77, 0xdb, 0x75, 0x95, 0x3d, 0x42,
-	0xbe, 0x3d, 0x22, 0xfe, 0x19, 0x26, 0xc1, 0xa8, 0x17, 0xe2, 0x98, 0x05, 0xdd, 0x01, 0x50, 0x42,
-	0x8e, 0xfb, 0xee, 0x9a, 0x2a, 0x60, 0xd2, 0x91, 0x30, 0x8c, 0x85, 0xdd, 0x09, 0x69, 0x9d, 0x12,
-	0x9f, 0x47, 0xce, 0x7c, 0x82, 0xf1, 0x14, 0x3c, 0xd6, 0xa8, 0xed, 0xb7, 0xd8, 0xcd, 0x82, 0xd7,
-	0x23, 0x91, 0x59, 0x5e, 0xa1, 0x99, 0x99, 0x42, 0x82, 0x82, 0xc1, 0xce, 0x8b, 0xab, 0x13, 0x9b,
-	0x49, 0xb1, 0x62, 0x2b, 0x25, 0xad, 0xfd, 0xbc, 0xb6, 0x11, 0xb4, 0x2c, 0xf8, 0x11, 0x3b, 0x0f,
-	0x44, 0x59, 0xc0, 0x06, 0xf6, 0x7d, 0x58, 0xa0, 0xa5, 0x6d, 0xd3, 0x3d, 0xee, 0x91, 0xc3, 0x80,
-	0xf8, 0xf4, 0x42, 0x4c, 0x7f, 0x07, 0x71, 0x6d, 0x13, 0x8d, 0x29, 0xee, 0xc0, 0x0d, 0x82, 0xf7,
-	0x3d, 0xbf, 0x2d, 0x4a, 0xef, 0x68, 0x6c, 0xff, 0xca, 0xa0, 0x5a, 0xb2, 0x9a, 0x3e, 0xf1, 0x78,
-	0x9c, 0x5e, 0x1b, 0x69, 0xb7, 0x83, 0xd4, 0xd8, 0xed, 0x20, 0xbe, 0xb6, 0xa7, 0xd5, 0x6b, 0xfb,
-	0x1a, 0x3b, 0x53, 0xf4, 0x22, 0x49, 0x81, 0xd8, 0xbf, 0x33, 0xa9, 0x0f, 0x0f, 0x1e, 0x76, 0x3b,
-	0xe5, 0x13, 0x77, 0xd0, 0x21, 0x68, 0x2b, 0xd2, 0x4e, 0xdc, 0xb1, 0x97, 0xf5, 0x02, 0x90, 0xa1,
-	0x62, 0x0b, 0xf2, 0x75, 0x6c, 0x03, 0x70, 0x76, 0xa5, 0x70, 0xd4, 0xcf, 0x0d, 0x65, 0x0a, 0x16,
-	0xe5, 0x0a, 0x3d, 0x6a, 0xc2, 0x62, 0x75, 0xd0, 0x0d, 0xbb, 0x6e, 0xef, 0x01, 0xe9, 0x1f, 0x13,
-	0x5f, 0x9e, 0xf6, 0xdf, 0x9f, 0x26, 0xa1, 0xa8, 0x93, 0xf3, 0x22, 0x79, 0x4c, 0xc6, 0x6a, 0x09,
-	0x96, 0x13, 0xc8, 0x9e, 0xa8, 0x0d, 0xf1, 0x22, 0x2c, 0x34, 0x4e, 0x46, 0x61, 0xdb, 0x7b, 0x7f,
-	0xc0, 0x9b, 0x48, 0x74, 0x6f, 0xe8, 0x47, 0xb4, 0x65, 0x72, 0x68, 0xff, 0x26, 0x05, 0x57, 0x1a,
-	0xad, 0x13, 0xd2, 0x1e, 0xf5, 0x88, 0x88, 0xf2, 0xc4, 0xdd, 0xbd, 0x09, 0x0b, 0x3b, 0x9e, 0x17,
-	0x06, 0xa1, 0xef, 0x0e, 0x87, 0xdd, 0x41, 0x87, 0x4d, 0x9a, 0xc5, 0x3a, 0x90, 0xa6, 0x06, 0x71,
-	0xbf, 0x61, 0x06, 0x4d, 0x31, 0x83, 0x6a, 0xa9, 0x41, 0x41, 0x63, 0x95, 0x96, 0xe7, 0xa4, 0xd8,
-	0x54, 0xa2, 0x0c, 0x28, 0x4c, 0x33, 0x25, 0xd6, 0x77, 0xff, 0xee, 0xd8, 0x8a, 0x45, 0x0d, 0xf0,
-	0x8c, 0x9e, 0x18, 0x14, 0x02, 0x3c, 0x66, 0xa1, 0x3d, 0x58, 0xe2, 0xd7, 0x3e, 0xe5, 0x1e, 0x28,
-	0x32, 0xab, 0x56, 0x8a, 0x4c, 0x10, 0xe1, 0x49, 0x3e, 0xaa, 0x8d, 0x43, 0x7a, 0x24, 0x24, 0xe2,
-	0xc4, 0x15, 0x09, 0x56, 0xd3, 0x46, 0x23, 0xc0, 0x3a, 0xbd, 0xdd, 0x4b, 0xd0, 0x06, 0x6d, 0x41,
-	0x9a, 0x06, 0xaa, 0x70, 0x6f, 0x4d, 0x98, 0x16, 0xe1, 0xc2, 0xc9, 0x19, 0x31, 0xbb, 0xe4, 0xb9,
-	0xc1, 0x29, 0xbd, 0xe0, 0x1c, 0xbb, 0x81, 0xf4, 0x15, 0x0d, 0x46, 0xdd, 0x45, 0x9b, 0xfe, 0x1c,
-	0x77, 0x71, 0xf5, 0x93, 0x23, 0xea, 0xa0, 0x19, 0x71, 0x07, 0x0d, 0xbd, 0x09, 0x59, 0x41, 0x23,
-	0x7b, 0x79, 0xcf, 0x6a, 0xdb, 0xa0, 0x7b, 0x9b, 0x6c, 0x52, 0x48, 0x16, 0xfb, 0xd3, 0x14, 0xad,
-	0x4c, 0xf8, 0x84, 0x34, 0x5f, 0xcb, 0x26, 0xa6, 0xa1, 0x34, 0x31, 0xbf, 0x55, 0x6d, 0x2c, 0xfd,
-	0x55, 0x20, 0x7b, 0xa9, 0x57, 0x81, 0x52, 0x74, 0x01, 0xc9, 0xb1, 0x1d, 0x78, 0x3e, 0xa1, 0x2a,
-	0x64, 0xcd, 0xd4, 0xaf, 0xef, 0xfe, 0xf1, 0x7b, 0x83, 0x3f, 0xfd, 0x88, 0x47, 0x0b, 0xa6, 0x82,
-	0x3c, 0xef, 0x6e, 0x24, 0xd4, 0x8e, 0x45, 0x4e, 0xa1, 0xa9, 0xc6, 0x41, 0xab, 0x18, 0xf2, 0x0a,
-	0x32, 0x41, 0xb5, 0x97, 0x75, 0xd5, 0xae, 0x4f, 0x59, 0xbd, 0xaa, 0xde, 0x47, 0x26, 0x6b, 0x76,
-	0x3d, 0x15, 0xb7, 0xfb, 0x16, 0xf5, 0xa7, 0xe8, 0xae, 0x3a, 0x97, 0xd9, 0x55, 0xe7, 0xbf, 0xbb,
-	0xab, 0x4e, 0xf2, 0xae, 0xfe, 0xd1, 0x18, 0xaf, 0x38, 0xd1, 0x2b, 0x90, 0x15, 0xc4, 0x52, 0xcf,
-	0xe5, 0x04, 0x41, 0x32, 0x2d, 0x49, 0x52, 0xca, 0x56, 0x96, 0x6c, 0xe6, 0x24, 0x5b, 0x59, 0x67,
-	0x93, 0xa4, 0xe8, 0x35, 0xd6, 0xb3, 0x12, 0x7c, 0xdc, 0x1b, 0x56, 0x92, 0xae, 0xb6, 0x82, 0x31,
-	0x26, 0xb6, 0x7f, 0x61, 0x40, 0x5e, 0xa8, 0xce, 0x1c, 0xf2, 0x75, 0xa6, 0x37, 0x77, 0x2b, 0x43,
-	0xb8, 0x55, 0x14, 0x71, 0x02, 0xa3, 0xd5, 0x89, 0x11, 0x39, 0xda, 0xe6, 0x4a, 0x70, 0x5e, 0xae,
-	0x7c, 0x41, 0x89, 0x56, 0x81, 0xd2, 0x98, 0x63, 0x06, 0xfb, 0xd7, 0x06, 0x5c, 0x15, 0x15, 0x89,
-	0xd0, 0x47, 0xde, 0x5f, 0x5f, 0x80, 0xc5, 0xfa, 0xa8, 0xbf, 0xff, 0x30, 0x16, 0xce, 0xa3, 0x65,
-	0x0c, 0x4a, 0x8b, 0x07, 0x06, 0x89, 0xf4, 0xe7, 0x05, 0xa2, 0x0e, 0x44, 0x1b, 0x60, 0x49, 0xbe,
-	0xa8, 0xc7, 0xcd, 0xab, 0xc5, 0x09, 0xb8, 0xfd, 0x73, 0x93, 0xbf, 0xab, 0x9c, 0x1b, 0xae, 0xdf,
-	0xec, 0xe6, 0xfc, 0x47, 0xa6, 0x78, 0x25, 0xa4, 0xa1, 0x77, 0x27, 0xca, 0x38, 0xdc, 0x35, 0xd6,
-	0x27, 0x7c, 0x8c, 0xc5, 0x1e, 0x23, 0xd1, 0x63, 0x8f, 0xdb, 0xfe, 0x4e, 0x14, 0xba, 0xe6, 0x79,
-	0xfc, 0x53, 0x63, 0xb7, 0x01, 0x79, 0x45, 0x78, 0x42, 0xb1, 0x5a, 0xd4, 0x63, 0x77, 0xea, 0x03,
-	0x98, 0x12, 0xbc, 0x4c, 0xe8, 0xb9, 0x09, 0xe1, 0x22, 0xa1, 0x49, 0x19, 0xe1, 0xef, 0x29, 0xfd,
-	0xfe, 0x96, 0xe8, 0x39, 0x77, 0xb5, 0xd0, 0x4b, 0x3c, 0x45, 0x62, 0xb4, 0xbc, 0x61, 0xab, 0xc1,
-	0xba, 0x15, 0x65, 0x45, 0xd1, 0x0f, 0x5b, 0x4e, 0xc8, 0x85, 0xf2, 0x36, 0x22, 0xf3, 0xe7, 0xab,
-	0xf1, 0x86, 0x8a, 0xf2, 0x77, 0x25, 0x69, 0x1b, 0xa4, 0xe7, 0x44, 0x9b, 0xbf, 0x15, 0x1d, 0xac,
-	0xa2, 0xec, 0x5d, 0x4e, 0x38, 0x4e, 0xe5, 0x64, 0xf2, 0x08, 0xbe, 0x2d, 0xbb, 0x99, 0xbc, 0x56,
-	0xd1, 0xca, 0x49, 0xd9, 0x69, 0xd0, 0x7a, 0x9a, 0x75, 0xe1, 0x9f, 0xa2, 0x7c, 0x13, 0xb7, 0xdf,
-	0x0c, 0xe3, 0x5e, 0x1b, 0x2f, 0x46, 0x75, 0x2a, 0x9c, 0xc0, 0x89, 0x2a, 0x63, 0x17, 0x53, 0xd1,
-	0x48, 0xb8, 0xb0, 0xae, 0x1d, 0xbb, 0xce, 0x5e, 0x83, 0xb9, 0x3a, 0x79, 0x1c, 0x56, 0xdb, 0xac,
-	0x95, 0x90, 0xc6, 0x62, 0x64, 0xff, 0x2b, 0x03, 0x96, 0x5c, 0x47, 0xf4, 0x80, 0x12, 0x3d, 0x97,
-	0x18, 0xea, 0x73, 0x89, 0xf4, 0x00, 0x53, 0xf1, 0x00, 0x29, 0x56, 0x5e, 0x58, 0xc5, 0x08, 0xed,
-	0x43, 0x9e, 0x7f, 0xed, 0x9c, 0xed, 0x91, 0xb3, 0x42, 0x9a, 0x45, 0xcb, 0xcb, 0x49, 0xc6, 0x8b,
-	0xde, 0x45, 0x14, 0x7a, 0x7e, 0xe3, 0x53, 0x25, 0x24, 0xbd, 0x41, 0xff, 0xef, 0xf7, 0xa6, 0x0d,
-	0xd6, 0x58, 0x99, 0x1e, 0x14, 0xb2, 0x6c, 0xa9, 0x9b, 0xe7, 0x2e, 0x75, 0x9c, 0x49, 0x4d, 0x15,
-	0x13, 0x12, 0x51, 0x55, 0x3d, 0x96, 0x78, 0x9d, 0xfa, 0xd2, 0xb9, 0xe2, 0x23, 0x6a, 0x6e, 0xc7,
-	0x98, 0x5b, 0x0d, 0x01, 0xb8, 0x74, 0x08, 0x28, 0x41, 0x9a, 0xff, 0x52, 0x41, 0x3a, 0xff, 0x04,
-	0x41, 0x3a, 0x96, 0x52, 0x16, 0x9e, 0x38, 0xa5, 0x4c, 0xc4, 0xcb, 0xe2, 0x97, 0x89, 0x97, 0xd5,
-	0x3b, 0x60, 0x8d, 0x3b, 0x64, 0xf2, 0xbb, 0x78, 0xf2, 0x23, 0xdc, 0xea, 0x7b, 0x70, 0x35, 0x71,
-	0x97, 0x9f, 0x30, 0x3d, 0x6b, 0xfd, 0x45, 0x45, 0xfc, 0x36, 0xfb, 0x07, 0xc5, 0x94, 0xb3, 0xe4,
-	0x22, 0xe5, 0xec, 0x2a, 0xe4, 0xd5, 0x3f, 0x5f, 0x7c, 0x85, 0x37, 0x66, 0xfb, 0x0f, 0x26, 0xac,
-	0x24, 0xb5, 0x12, 0xcf, 0x69, 0x58, 0x1f, 0x4c, 0xfc, 0x89, 0xa5, 0x78, 0x51, 0x63, 0x52, 0xff,
-	0x33, 0xcb, 0x44, 0x4d, 0xf0, 0x74, 0xfe, 0xd2, 0xd2, 0xbc, 0xf8, 0x2f, 0x2d, 0xe7, 0x95, 0xd6,
-	0x8a, 0x45, 0x15, 0x5b, 0x6f, 0xfc, 0x18, 0xe0, 0x70, 0xd8, 0x76, 0x43, 0xde, 0xbe, 0xb9, 0x0e,
-	0xcb, 0xda, 0xeb, 0x32, 0x47, 0x59, 0x33, 0xe8, 0x2a, 0x2c, 0xc9, 0x17, 0xe5, 0x5a, 0xa3, 0x2e,
-	0xc0, 0x06, 0x5a, 0x86, 0x2b, 0xd4, 0x1d, 0x99, 0x3e, 0x02, 0x68, 0xa2, 0x05, 0xc8, 0x35, 0x1b,
-	0xfb, 0x62, 0x98, 0xda, 0x28, 0x42, 0x2e, 0xfa, 0x47, 0x12, 0xba, 0x02, 0xf9, 0xba, 0xe7, 0xf7,
-	0xdd, 0x1e, 0x1b, 0x5a, 0x33, 0xc8, 0x82, 0xf9, 0x66, 0xb7, 0x4f, 0xbc, 0x51, 0xc8, 0x21, 0xc6,
-	0xc6, 0xa7, 0x26, 0x40, 0xdc, 0x90, 0x47, 0x8b, 0x00, 0xcd, 0xc6, 0xfe, 0xd1, 0xe1, 0x81, 0x53,
-	0x6a, 0x56, 0xac, 0x19, 0x04, 0x30, 0x57, 0x3a, 0x38, 0xa8, 0xd4, 0x1d, 0xcb, 0x40, 0x59, 0x48,
-	0xe3, 0x4a, 0xc9, 0xb1, 0x4c, 0x34, 0x0f, 0xd9, 0x26, 0x3e, 0xac, 0x97, 0x29, 0x4d, 0x8a, 0x0a,
-	0xbd, 0x5f, 0x69, 0x1e, 0x45, 0x90, 0x34, 0xca, 0x43, 0xa6, 0xbc, 0x5f, 0xaf, 0x57, 0xca, 0x4d,
-	0x6b, 0x96, 0x8a, 0x14, 0x83, 0x23, 0xbc, 0x6f, 0xcd, 0xa1, 0x25, 0x58, 0xa8, 0xed, 0xdf, 0x3f,
-	0xda, 0xad, 0x94, 0x70, 0x73, 0xa7, 0x52, 0x6a, 0x5a, 0x19, 0x2a, 0xa1, 0x5c, 0x57, 0x20, 0x59,
-	0x0a, 0x71, 0x54, 0x48, 0x0e, 0x21, 0x58, 0x2c, 0xef, 0x56, 0xca, 0x7b, 0x47, 0xbb, 0xa5, 0xbd,
-	0x4a, 0xe5, 0xa0, 0x82, 0x2d, 0xa0, 0x06, 0xa4, 0x33, 0x97, 0x6b, 0x87, 0x8d, 0x66, 0x05, 0x1f,
-	0x39, 0x95, 0x66, 0xa9, 0x5a, 0x6b, 0x58, 0x79, 0x4a, 0x4c, 0x11, 0x8d, 0xdd, 0x12, 0x76, 0x8e,
-	0xaa, 0xf5, 0x7b, 0xfb, 0xd6, 0x3c, 0x13, 0x50, 0x3f, 0x2a, 0xd5, 0x6a, 0xfb, 0x54, 0xcb, 0xa3,
-	0xaa, 0x63, 0x2d, 0x50, 0x43, 0xab, 0x02, 0x1a, 0x4d, 0xaa, 0xff, 0x22, 0x33, 0x34, 0xb3, 0xc0,
-	0x51, 0xb9, 0x7e, 0x54, 0x2b, 0xed, 0x54, 0x6a, 0xd6, 0x15, 0x54, 0x80, 0x95, 0x18, 0xf8, 0xce,
-	0x3e, 0xde, 0x13, 0xe4, 0x16, 0x95, 0x7c, 0x50, 0x6a, 0x96, 0x77, 0x29, 0xa2, 0xd1, 0xdc, 0xc7,
-	0x15, 0x6b, 0x69, 0xa3, 0x0e, 0x10, 0x3f, 0xa0, 0x53, 0x1b, 0xd0, 0x9d, 0xe3, 0x10, 0x6b, 0x86,
-	0x1a, 0xb0, 0x3a, 0x08, 0x89, 0x3f, 0x70, 0x7b, 0x96, 0x41, 0xb7, 0x89, 0xf9, 0x41, 0xb4, 0xa7,
-	0x4b, 0xe2, 0xbf, 0x08, 0x98, 0xfc, 0x84, 0xb4, 0x42, 0xd2, 0xb6, 0x52, 0x1b, 0x1b, 0x90, 0x8b,
-	0xde, 0x99, 0x29, 0x7b, 0x83, 0x84, 0x6c, 0x64, 0xcd, 0x50, 0x76, 0xde, 0x8a, 0xe2, 0x00, 0x63,
-	0xe3, 0xcf, 0x26, 0x20, 0x79, 0x0e, 0x28, 0xee, 0x46, 0xf7, 0xb6, 0xdb, 0x3a, 0x55, 0xbd, 0x4c,
-	0x79, 0xd0, 0x8b, 0xbc, 0xec, 0x2a, 0x2c, 0x39, 0x13, 0x60, 0x13, 0x5d, 0xa3, 0x97, 0xe0, 0xce,
-	0x38, 0x3c, 0x45, 0x67, 0xbf, 0x4f, 0xc2, 0xc8, 0x79, 0xd3, 0xe8, 0x99, 0x89, 0x64, 0x27, 0x50,
-	0xb3, 0xd4, 0x50, 0x0d, 0xc2, 0x5d, 0x4f, 0xc0, 0xe6, 0xa8, 0x59, 0xf5, 0x8b, 0x92, 0xc0, 0x64,
-	0xd0, 0x0d, 0x78, 0xb6, 0x41, 0xc2, 0xc9, 0x93, 0x56, 0x10, 0x64, 0xd1, 0x2a, 0x5c, 0x13, 0x04,
-	0x51, 0xaa, 0x16, 0xb8, 0x1c, 0x35, 0x21, 0xff, 0x16, 0x56, 0xb3, 0x80, 0x2e, 0x4c, 0x82, 0xa2,
-	0xa6, 0x8f, 0x95, 0xa7, 0xae, 0x76, 0x40, 0x33, 0xaa, 0xb8, 0x7e, 0x5a, 0xf3, 0x1b, 0x1f, 0x1a,
-	0xb0, 0xa0, 0x95, 0x0c, 0xd4, 0x21, 0x24, 0x40, 0x5c, 0x25, 0xac, 0x19, 0xba, 0x50, 0x09, 0xd4,
-	0x3a, 0xba, 0x96, 0x81, 0xbe, 0x07, 0xdf, 0x9d, 0x40, 0xc9, 0xcc, 0x8f, 0x49, 0x8b, 0x74, 0x1f,
-	0x91, 0xb6, 0x65, 0xa2, 0x67, 0xe1, 0xfa, 0x04, 0xd9, 0x3d, 0xb7, 0xdb, 0xa3, 0x3b, 0xae, 0xce,
-	0x89, 0x47, 0x83, 0x01, 0x15, 0x9c, 0xde, 0x38, 0x4e, 0x2a, 0x5a, 0xa8, 0x0d, 0x35, 0x68, 0xac,
-	0xe3, 0x38, 0x46, 0x4a, 0x32, 0x26, 0x30, 0x8d, 0xd0, 0x1b, 0x0e, 0xa9, 0x56, 0x1b, 0x27, 0x60,
-	0x8d, 0xb7, 0xf0, 0xa9, 0xef, 0x94, 0xda, 0x6d, 0x91, 0xd5, 0xac, 0x19, 0x6a, 0x5e, 0x4c, 0xfa,
-	0xde, 0x23, 0x22, 0x41, 0x06, 0xb5, 0x63, 0x23, 0x74, 0xfd, 0x50, 0x42, 0x4c, 0xea, 0x1a, 0x54,
-	0xaa, 0x04, 0xa4, 0xa8, 0x94, 0xbd, 0x6e, 0xaf, 0xf7, 0xae, 0xd7, 0x3f, 0xee, 0x12, 0x2b, 0xbd,
-	0xf1, 0x86, 0xd6, 0xfa, 0xa6, 0x68, 0x7a, 0x8e, 0x71, 0x88, 0x35, 0x43, 0x53, 0x9b, 0x53, 0x97,
-	0x43, 0x83, 0x0e, 0xcb, 0xd1, 0xd0, 0xdc, 0xa9, 0x7c, 0xf2, 0xf9, 0xda, 0xcc, 0xc7, 0x5f, 0xac,
-	0x19, 0x9f, 0x7c, 0xb1, 0x66, 0xfc, 0xed, 0x8b, 0x35, 0xe3, 0xdd, 0x2d, 0xe5, 0x7f, 0xd6, 0x7d,
-	0x37, 0xf4, 0xbb, 0x8f, 0x3d, 0xbf, 0xdb, 0xe9, 0x0e, 0xe4, 0x60, 0x40, 0x6e, 0x0f, 0x4f, 0x3b,
-	0xb7, 0x87, 0xc7, 0xb7, 0xe3, 0x4c, 0x7d, 0x3c, 0xc7, 0xfe, 0x64, 0xbd, 0xf5, 0x9f, 0x00, 0x00,
-	0x00, 0xff, 0xff, 0xe0, 0x67, 0xf3, 0x53, 0xc3, 0x2d, 0x00, 0x00,
+	// 3155 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x3a, 0xcd, 0x6f, 0x1b, 0xc7,
+	0xf5, 0xda, 0x25, 0x25, 0x92, 0x8f, 0x92, 0xbc, 0x1a, 0xc9, 0x36, 0xa3, 0xe4, 0x27, 0xfb, 0xb7,
+	0x71, 0x03, 0x47, 0x69, 0x68, 0x54, 0x42, 0x82, 0xa4, 0x51, 0x6c, 0x50, 0x5c, 0xda, 0x62, 0x44,
+	0x53, 0xca, 0x90, 0x6a, 0x80, 0x00, 0x81, 0xba, 0x22, 0xc7, 0x14, 0x2b, 0x92, 0xcb, 0xee, 0x2e,
+	0x1d, 0xab, 0xa7, 0x5e, 0x5a, 0xa0, 0xe8, 0xa9, 0x68, 0x0f, 0x41, 0x51, 0xf4, 0xaf, 0xc8, 0xa1,
+	0x3d, 0xf6, 0xd0, 0x22, 0x47, 0x5f, 0x7a, 0x0d, 0x9a, 0x00, 0xbd, 0xb4, 0x87, 0x02, 0x3d, 0xf4,
+	0x5c, 0xcc, 0xd7, 0xee, 0x0c, 0xb9, 0xd4, 0x47, 0xe2, 0xa6, 0x45, 0x72, 0xe2, 0xce, 0xfb, 0x9a,
+	0x37, 0x6f, 0xde, 0x7b, 0xf3, 0xe6, 0x0d, 0xc1, 0xea, 0x79, 0x9d, 0x80, 0xf8, 0x8f, 0xbb, 0x2d,
+	0x52, 0x1c, 0xfa, 0x5e, 0xe8, 0x21, 0x88, 0x21, 0xab, 0xaf, 0x76, 0xba, 0xe1, 0xf1, 0xe8, 0xa8,
+	0xd8, 0xf2, 0xfa, 0x77, 0x3a, 0x5e, 0xc7, 0xbb, 0xc3, 0x48, 0x8e, 0x46, 0x8f, 0xd8, 0x88, 0x0d,
+	0xd8, 0x17, 0x67, 0x5d, 0x5d, 0xec, 0x93, 0xd0, 0x6d, 0xbb, 0xa1, 0xcb, 0xc7, 0xf6, 0xa7, 0x29,
+	0xc8, 0x94, 0xeb, 0x8d, 0xd0, 0xf3, 0x09, 0x42, 0x90, 0x3e, 0x38, 0xa8, 0x3a, 0x05, 0xe3, 0xa6,
+	0x71, 0x3b, 0x87, 0xd9, 0x37, 0x7a, 0x09, 0x16, 0x1b, 0x7c, 0xa6, 0x52, 0xbb, 0xed, 0x93, 0x20,
+	0x28, 0x98, 0x0c, 0x3b, 0x06, 0x45, 0x6b, 0x00, 0x8d, 0x77, 0x6b, 0x92, 0x26, 0xc5, 0x68, 0x14,
+	0x08, 0x2a, 0x02, 0xaa, 0x79, 0xad, 0x93, 0x31, 0x59, 0x69, 0x46, 0x97, 0x80, 0xa1, 0xf2, 0xca,
+	0x61, 0x4f, 0xd2, 0xcd, 0x72, 0x79, 0x31, 0x04, 0xdd, 0x82, 0x34, 0xf6, 0x7a, 0xa4, 0x30, 0x77,
+	0xd3, 0xb8, 0xbd, 0xb8, 0x61, 0x15, 0xa3, 0x65, 0x95, 0xeb, 0x14, 0x8e, 0x19, 0x96, 0xae, 0xa8,
+	0xd9, 0x6d, 0x9d, 0x14, 0x32, 0x37, 0x8d, 0xdb, 0x69, 0xcc, 0xbe, 0xd1, 0x2b, 0x30, 0xdb, 0x08,
+	0xdd, 0x90, 0x14, 0xb2, 0x8c, 0xf5, 0x6a, 0x51, 0x31, 0x6f, 0xdd, 0x6b, 0x13, 0x86, 0xc4, 0x9c,
+	0x06, 0x7d, 0x07, 0x72, 0xef, 0x79, 0xfe, 0x09, 0x67, 0xc8, 0x31, 0x86, 0xe5, 0x78, 0xae, 0x08,
+	0x85, 0x63, 0x2a, 0xf4, 0x36, 0xcc, 0xd5, 0xdc, 0x23, 0xd2, 0x0b, 0x0a, 0x70, 0x33, 0x75, 0x3b,
+	0xbf, 0x71, 0x43, 0x9d, 0x40, 0x98, 0xba, 0xc8, 0x29, 0x2a, 0x83, 0xd0, 0x3f, 0xdd, 0x4e, 0x7f,
+	0xf2, 0xe9, 0x8d, 0x19, 0x2c, 0x98, 0x56, 0xeb, 0x90, 0x57, 0x90, 0xc8, 0x82, 0xd4, 0x09, 0x39,
+	0x15, 0x5b, 0x42, 0x3f, 0xd1, 0xcb, 0x30, 0xfb, 0xd8, 0xed, 0x8d, 0x08, 0xdb, 0x88, 0xbc, 0xaa,
+	0x0e, 0xe3, 0xab, 0x75, 0x83, 0x10, 0x73, 0x8a, 0xef, 0x9a, 0x6f, 0x18, 0xf6, 0x1f, 0x4c, 0xc8,
+	0x38, 0xcf, 0x60, 0x83, 0xa5, 0x29, 0x53, 0x49, 0xa6, 0x4c, 0x5f, 0xc0, 0x94, 0xaf, 0xc1, 0x5c,
+	0xe3, 0xd8, 0xf5, 0xdb, 0x74, 0x37, 0xa9, 0x5d, 0xae, 0xab, 0xd4, 0x4e, 0x9d, 0xe1, 0xaa, 0x83,
+	0x47, 0x9e, 0xb4, 0x07, 0x27, 0x46, 0x1b, 0xb0, 0x52, 0xf3, 0x3a, 0xa1, 0xdb, 0xed, 0x51, 0x85,
+	0x88, 0x2f, 0xb5, 0x9c, 0x63, 0x5a, 0x26, 0xe2, 0xa6, 0x38, 0x5b, 0xe6, 0x82, 0xce, 0x96, 0x1d,
+	0x77, 0x36, 0xfb, 0x8f, 0x06, 0x64, 0x6b, 0x5e, 0xe7, 0x7f, 0xc0, 0x88, 0x5b, 0x90, 0xc5, 0x64,
+	0xd8, 0xeb, 0xb6, 0x5c, 0x69, 0xc6, 0x55, 0x95, 0xbe, 0xe6, 0x75, 0x04, 0x5a, 0xb1, 0x64, 0xc4,
+	0x61, 0xff, 0xc3, 0x80, 0x79, 0xba, 0x0e, 0x69, 0x6a, 0x54, 0x80, 0x0c, 0x1f, 0xf0, 0xe5, 0xa4,
+	0xb1, 0x1c, 0xa2, 0x6d, 0x65, 0x22, 0x93, 0x4d, 0xf4, 0xd2, 0xd8, 0x44, 0x91, 0x94, 0xa2, 0x24,
+	0x64, 0x1e, 0x1b, 0x4f, 0x87, 0x56, 0x60, 0xb6, 0x32, 0xf4, 0x5a, 0xc7, 0x62, 0xb9, 0x7c, 0x80,
+	0x56, 0x21, 0x5b, 0x23, 0x6e, 0x9b, 0xf8, 0x55, 0x87, 0x2d, 0x39, 0x8d, 0xa3, 0x31, 0xb3, 0x0f,
+	0xf1, 0xfb, 0x2c, 0xde, 0xa9, 0x7d, 0x88, 0xdf, 0x5f, 0x7d, 0x0b, 0x16, 0xb4, 0x09, 0xd4, 0x90,
+	0x48, 0xf3, 0x90, 0x58, 0x51, 0x43, 0x22, 0xa7, 0x7a, 0xff, 0x63, 0x58, 0xd4, 0x6d, 0x82, 0xee,
+	0xeb, 0x26, 0x60, 0x62, 0xf2, 0x1b, 0x85, 0x69, 0x8b, 0xdb, 0xce, 0x52, 0x1b, 0x3e, 0xfd, 0xf4,
+	0x86, 0x81, 0x75, 0xd3, 0xbd, 0x00, 0x39, 0x29, 0xd6, 0x61, 0xf3, 0xa6, 0x71, 0x0c, 0xb0, 0x7f,
+	0x65, 0x82, 0x25, 0x62, 0x7d, 0x87, 0xb8, 0x7e, 0x78, 0x44, 0xdc, 0xf0, 0x6b, 0x98, 0x5f, 0x8b,
+	0x80, 0x9a, 0x6e, 0x20, 0x65, 0x97, 0x7d, 0xe2, 0x86, 0xa4, 0xcd, 0x02, 0x2d, 0x8b, 0x13, 0x30,
+	0xf6, 0xeb, 0x30, 0x5f, 0xae, 0x97, 0x7a, 0x3d, 0xaf, 0xe5, 0x86, 0xa4, 0xea, 0x24, 0x64, 0xb7,
+	0x15, 0x98, 0xdd, 0x76, 0xc3, 0xd6, 0xb1, 0x30, 0x29, 0x1f, 0xd8, 0x3f, 0x31, 0x61, 0x49, 0x06,
+	0xe0, 0xd9, 0xf6, 0xbc, 0x09, 0x79, 0xec, 0x3e, 0x0a, 0x75, 0x63, 0xaa, 0xa0, 0x04, 0x8b, 0xa7,
+	0x12, 0x2d, 0x7e, 0x0b, 0x16, 0x1e, 0x78, 0x41, 0xd0, 0x1d, 0xea, 0xc6, 0xd4, 0x81, 0x5f, 0x2e,
+	0x20, 0xa7, 0xd8, 0x6f, 0x6e, 0xaa, 0xfd, 0x2a, 0x90, 0x57, 0x32, 0xe5, 0x19, 0xe1, 0x7b, 0xb6,
+	0x77, 0xfe, 0xde, 0x04, 0xcb, 0x79, 0x96, 0xde, 0x19, 0xe7, 0xf6, 0xd4, 0x65, 0x72, 0x7b, 0xf2,
+	0xf2, 0xd3, 0xd3, 0x96, 0x3f, 0xf5, 0x2c, 0x98, 0xbd, 0xf4, 0x59, 0x30, 0x77, 0xc1, 0xc0, 0xc8,
+	0x4c, 0x9c, 0x05, 0x3f, 0x33, 0x21, 0x8b, 0x1b, 0x0f, 0x79, 0x3a, 0xb6, 0x20, 0xd5, 0x0c, 0x3c,
+	0x99, 0x8a, 0x9a, 0x81, 0x47, 0xfd, 0xb7, 0x3a, 0x68, 0x93, 0x27, 0xd2, 0x7f, 0xd9, 0x80, 0xfa,
+	0x52, 0x8d, 0xb8, 0x01, 0xd9, 0xf1, 0x7a, 0x3c, 0xf1, 0xf1, 0x8c, 0xa8, 0x03, 0x91, 0x0d, 0xf3,
+	0x4d, 0x7f, 0x34, 0xa0, 0xb1, 0xd1, 0xae, 0x05, 0x03, 0x91, 0x1d, 0x35, 0x18, 0x7a, 0x07, 0xe6,
+	0x39, 0x53, 0x37, 0x08, 0x3d, 0xff, 0x54, 0xf8, 0x9c, 0x96, 0x9b, 0xa5, 0x76, 0x45, 0x95, 0x90,
+	0xe7, 0x66, 0x8d, 0x77, 0xf5, 0x1e, 0x2c, 0x4d, 0x90, 0x9c, 0x97, 0x5d, 0xd3, 0x6a, 0x76, 0xfd,
+	0x00, 0x72, 0xcc, 0xc1, 0x5b, 0x9e, 0xdf, 0xa6, 0x8c, 0x54, 0x69, 0xc1, 0x48, 0x75, 0x5d, 0x87,
+	0x74, 0xf3, 0x74, 0xc8, 0xf9, 0x16, 0x37, 0xae, 0x69, 0x3a, 0x32, 0x1e, 0x8a, 0xc5, 0x8c, 0x86,
+	0x7a, 0x9f, 0xe3, 0x86, 0x2e, 0x33, 0xcc, 0x3c, 0x66, 0xdf, 0xf6, 0x47, 0x06, 0x00, 0x93, 0xff,
+	0xc3, 0x11, 0x09, 0x98, 0x83, 0xd6, 0xdd, 0x3e, 0x91, 0x0e, 0x4a, 0xbf, 0xd5, 0x08, 0x30, 0xf5,
+	0x08, 0x10, 0xea, 0xa4, 0x62, 0x75, 0x0a, 0x90, 0x79, 0xe8, 0x3e, 0x69, 0x74, 0x7f, 0x44, 0x84,
+	0x65, 0xe5, 0x90, 0x46, 0x8b, 0x74, 0x52, 0x47, 0x9c, 0x3d, 0x31, 0x80, 0xa9, 0x56, 0xaf, 0x3a,
+	0xcc, 0x67, 0xd2, 0x98, 0x7d, 0xdb, 0x36, 0x40, 0x33, 0xf0, 0xa4, 0x66, 0x2b, 0x30, 0x5b, 0xf6,
+	0x46, 0x83, 0x50, 0x2c, 0x9e, 0x0f, 0xec, 0xbf, 0x1b, 0x34, 0xdb, 0xb1, 0x28, 0x63, 0x95, 0x59,
+	0x62, 0x84, 0x6d, 0x42, 0x6e, 0x6f, 0x48, 0x7c, 0x37, 0xec, 0x7a, 0x03, 0x61, 0xa8, 0xab, 0x7a,
+	0xc1, 0xc8, 0x78, 0xf7, 0x86, 0x38, 0xa6, 0x43, 0xdb, 0x51, 0x89, 0xc9, 0xc3, 0xed, 0x56, 0x42,
+	0x89, 0xc9, 0x08, 0xbe, 0xc2, 0x3a, 0xb3, 0x06, 0xf9, 0x72, 0x3d, 0xae, 0x82, 0x93, 0xd6, 0xfa,
+	0xb2, 0xac, 0x74, 0xcc, 0xe9, 0x85, 0x34, 0xa7, 0xb0, 0x3f, 0x13, 0xb6, 0x73, 0xc3, 0x33, 0x6c,
+	0x77, 0x71, 0x79, 0xe7, 0x5b, 0x4c, 0x4e, 0xf4, 0x15, 0x5a, 0xec, 0x4f, 0xb3, 0x90, 0x91, 0x1e,
+	0xc4, 0xf2, 0x35, 0xfb, 0x8c, 0x72, 0x79, 0x0c, 0x40, 0x45, 0x98, 0x7b, 0x48, 0xc2, 0x63, 0xaf,
+	0x9d, 0x14, 0x4a, 0x1c, 0xc3, 0x42, 0x49, 0x50, 0xa1, 0x2d, 0x35, 0x6e, 0x58, 0x08, 0xe4, 0x75,
+	0x9e, 0x18, 0x2b, 0xd6, 0xa8, 0xc6, 0x59, 0x89, 0x55, 0x48, 0xd1, 0xc1, 0xc0, 0x82, 0x25, 0xbf,
+	0xf1, 0x7f, 0xe3, 0x15, 0x92, 0x76, 0x7a, 0x60, 0x8d, 0x05, 0xdd, 0xa5, 0xce, 0x10, 0x4b, 0x98,
+	0x65, 0x12, 0x5e, 0x48, 0xf0, 0xd2, 0x58, 0x80, 0xca, 0x40, 0xf9, 0x1d, 0x85, 0x7f, 0x6e, 0x92,
+	0xdf, 0x99, 0xe0, 0x57, 0x18, 0xd0, 0xeb, 0x6a, 0x78, 0xb2, 0x24, 0x3e, 0x66, 0x80, 0x18, 0x8b,
+	0xd5, 0x40, 0xde, 0xd2, 0xeb, 0x13, 0x76, 0x15, 0x18, 0x2b, 0x0e, 0x55, 0x3c, 0xd6, 0xab, 0x99,
+	0x2d, 0x3d, 0xde, 0xd9, 0x7d, 0x71, 0x82, 0x3b, 0xc6, 0x63, 0x3d, 0x3b, 0xbc, 0xa9, 0x05, 0x50,
+	0x01, 0x18, 0xf3, 0x75, 0x9d, 0x39, 0xf6, 0x6b, 0x2d, 0xd8, 0xb6, 0xf4, 0x60, 0x29, 0xe4, 0x93,
+	0x27, 0x96, 0x78, 0xac, 0x87, 0xd6, 0x3d, 0x58, 0x70, 0x48, 0x8f, 0x84, 0x44, 0xa8, 0x53, 0x98,
+	0x67, 0xec, 0xcf, 0x69, 0xe6, 0x56, 0x09, 0xb0, 0x4e, 0x6f, 0x37, 0x20, 0xcf, 0xdc, 0x27, 0x18,
+	0x7a, 0x83, 0x80, 0x9c, 0x51, 0x95, 0x88, 0x9c, 0x6c, 0x6a, 0x39, 0xb9, 0xe6, 0x06, 0x61, 0x9c,
+	0xa9, 0xe5, 0xd0, 0x2e, 0x02, 0x52, 0x0c, 0xad, 0xc8, 0xbe, 0xdf, 0xf5, 0x95, 0x28, 0x91, 0x43,
+	0xfb, 0x5f, 0x69, 0x5a, 0x89, 0x09, 0xb2, 0x67, 0x1b, 0x4e, 0x2f, 0x40, 0xae, 0xe2, 0xfb, 0x9e,
+	0x5f, 0xf6, 0xda, 0x84, 0xa9, 0xb9, 0x80, 0x63, 0x00, 0x3d, 0xb5, 0xd9, 0xe0, 0x21, 0x09, 0x02,
+	0xb7, 0x43, 0x44, 0x99, 0xa8, 0xc1, 0x68, 0x51, 0x51, 0x0d, 0x76, 0x4a, 0xbb, 0x84, 0x0c, 0x89,
+	0xcf, 0xc2, 0x21, 0x8b, 0x15, 0x08, 0xba, 0xa7, 0x59, 0x50, 0xf8, 0xfb, 0xf5, 0x89, 0x88, 0xe5,
+	0x68, 0x11, 0xb2, 0x9a, 0xcd, 0xa9, 0x07, 0x78, 0xfd, 0xbe, 0x3b, 0x68, 0xf3, 0xea, 0x39, 0x93,
+	0xe0, 0x01, 0x0a, 0x1e, 0x6b, 0xd4, 0xd4, 0xf5, 0x58, 0x10, 0x88, 0xe9, 0xb3, 0x93, 0xd3, 0x2b,
+	0x68, 0xac, 0xd2, 0xa2, 0x6d, 0x58, 0x2c, 0xf7, 0x46, 0x41, 0x48, 0x7c, 0x87, 0xd0, 0xe2, 0x2b,
+	0x10, 0x5e, 0xaf, 0x55, 0xc1, 0x3a, 0x05, 0x1e, 0xe3, 0x40, 0x77, 0x21, 0x17, 0xdf, 0xc7, 0xb8,
+	0xdf, 0xdf, 0x54, 0xd9, 0x23, 0xe4, 0xbb, 0x23, 0xe2, 0x9f, 0x62, 0x12, 0x8c, 0x7a, 0x21, 0x8e,
+	0x59, 0xd0, 0x5d, 0x00, 0x25, 0x66, 0xb9, 0xf3, 0xaf, 0xa9, 0x02, 0x26, 0x1d, 0x09, 0xc3, 0x58,
+	0xdc, 0x1e, 0x93, 0xd6, 0x09, 0xf1, 0x79, 0xe8, 0xcd, 0x27, 0x18, 0x4f, 0xc1, 0x63, 0x8d, 0xda,
+	0x7e, 0x87, 0x5d, 0x4d, 0x78, 0x41, 0x13, 0x99, 0xe5, 0x35, 0x9a, 0xda, 0x29, 0x24, 0x28, 0x18,
+	0xec, 0xc0, 0xb9, 0x3a, 0xb1, 0x99, 0x14, 0x2b, 0xb6, 0x52, 0xd2, 0xda, 0x2f, 0x6a, 0x1b, 0x41,
+	0xeb, 0x8a, 0xef, 0xb1, 0x03, 0x45, 0xd4, 0x15, 0x6c, 0x60, 0x3f, 0x80, 0x05, 0x5a, 0x1b, 0x37,
+	0xdd, 0xa3, 0x1e, 0x39, 0x08, 0x88, 0x4f, 0x6f, 0xd4, 0xf4, 0x77, 0x10, 0x17, 0x47, 0xd1, 0x98,
+	0xe2, 0xf6, 0xdd, 0x20, 0xf8, 0xd0, 0xf3, 0xdb, 0xa2, 0x76, 0x8f, 0xc6, 0xf6, 0xcf, 0x0d, 0xaa,
+	0x25, 0xbb, 0x14, 0x24, 0x9e, 0xaf, 0xd3, 0x8b, 0x2b, 0xed, 0x7a, 0x91, 0x1a, 0xbb, 0x5e, 0xc4,
+	0xf7, 0xfe, 0xb4, 0x7a, 0xef, 0x5f, 0x63, 0x87, 0x92, 0x5e, 0x65, 0x29, 0x10, 0xfb, 0xd7, 0x26,
+	0xf5, 0xe1, 0xc1, 0xa3, 0x6e, 0xa7, 0x7c, 0xec, 0x0e, 0x3a, 0x04, 0x6d, 0x46, 0xda, 0x89, 0x4b,
+	0xfa, 0xb2, 0x5e, 0x41, 0x32, 0x54, 0x6c, 0x41, 0xbe, 0x8e, 0x2d, 0x00, 0xce, 0xae, 0x54, 0x9e,
+	0xfa, 0xc1, 0xa3, 0x4c, 0xc1, 0xa2, 0x5c, 0xa1, 0x47, 0x4d, 0x58, 0xac, 0x0e, 0xba, 0x61, 0xd7,
+	0xed, 0x3d, 0x24, 0xfd, 0x23, 0xe2, 0xcb, 0x72, 0xe1, 0xdb, 0xd3, 0x24, 0x14, 0x75, 0x72, 0x5e,
+	0x65, 0x8f, 0xc9, 0x58, 0x2d, 0xc1, 0x72, 0x02, 0xd9, 0xa5, 0xfa, 0x18, 0x2f, 0xc3, 0x42, 0xe3,
+	0x78, 0x14, 0xb6, 0xbd, 0x0f, 0x07, 0xbc, 0x0b, 0x45, 0xf7, 0x86, 0x7e, 0x44, 0x5b, 0x26, 0x87,
+	0xf6, 0x2f, 0x53, 0x70, 0xa5, 0xd1, 0x3a, 0x26, 0xed, 0x51, 0x8f, 0x88, 0x28, 0x4f, 0xdc, 0xdd,
+	0x5b, 0xb0, 0xb0, 0xed, 0x79, 0x61, 0x10, 0xfa, 0xee, 0x70, 0xd8, 0x1d, 0x74, 0xd8, 0xa4, 0x59,
+	0xac, 0x03, 0x69, 0x6a, 0x10, 0x17, 0x24, 0x66, 0xd0, 0x14, 0x33, 0xa8, 0x96, 0x1a, 0x14, 0x34,
+	0x56, 0x69, 0x79, 0x4e, 0x8a, 0x4d, 0x25, 0xea, 0x88, 0xc2, 0x34, 0x53, 0x62, 0x7d, 0xf7, 0xef,
+	0x8d, 0xad, 0x58, 0x14, 0x11, 0xcf, 0xe9, 0x89, 0x41, 0x21, 0xc0, 0x63, 0x16, 0xda, 0x85, 0x25,
+	0x7e, 0x6f, 0x54, 0x2e, 0x92, 0x22, 0xb3, 0x6a, 0xb5, 0xcc, 0x04, 0x11, 0x9e, 0xe4, 0x9b, 0x3c,
+	0x23, 0x33, 0x97, 0x3c, 0x23, 0x7b, 0x09, 0xda, 0xa0, 0x4d, 0x48, 0xd3, 0x40, 0x15, 0xee, 0xad,
+	0x09, 0xd3, 0x22, 0x5c, 0x38, 0x39, 0x23, 0x66, 0xb7, 0x44, 0x37, 0x38, 0xa1, 0x37, 0xa4, 0x23,
+	0x37, 0x90, 0xbe, 0xa2, 0xc1, 0xa8, 0xbb, 0x68, 0xd3, 0x9f, 0xe1, 0x2e, 0xae, 0x7e, 0x72, 0x44,
+	0x2d, 0x38, 0x23, 0x6e, 0xc1, 0xa1, 0xb7, 0x21, 0x2b, 0x68, 0x64, 0x33, 0xf0, 0x79, 0x6d, 0x1b,
+	0x74, 0x6f, 0x93, 0x5d, 0x0e, 0xc9, 0x62, 0xff, 0x39, 0x45, 0x4b, 0x1b, 0x3e, 0x21, 0xcd, 0xd7,
+	0xb2, 0x0b, 0x6a, 0x28, 0x5d, 0xd0, 0x6f, 0x54, 0x1f, 0x4c, 0x7f, 0x56, 0xc8, 0x5e, 0xe8, 0x59,
+	0xa1, 0x14, 0xdd, 0x60, 0x72, 0x6c, 0x07, 0x5e, 0x4c, 0x28, 0x2b, 0x59, 0x37, 0xf6, 0xab, 0xbb,
+	0xc0, 0xfc, 0xc6, 0xe0, 0x6f, 0x47, 0xe2, 0xd5, 0x83, 0xa9, 0x20, 0xcf, 0xbb, 0x1b, 0x09, 0xc5,
+	0x67, 0x91, 0x53, 0x68, 0xaa, 0x71, 0xd0, 0x2a, 0x86, 0xbc, 0x82, 0x4c, 0x50, 0xed, 0x55, 0x5d,
+	0xb5, 0xeb, 0x53, 0x56, 0xaf, 0xaa, 0xf7, 0xb1, 0xc9, 0xba, 0x65, 0xcf, 0xc4, 0xed, 0xbe, 0x41,
+	0x0d, 0x2e, 0xba, 0xab, 0xce, 0x45, 0x76, 0xd5, 0xf9, 0xcf, 0xee, 0xaa, 0x93, 0xbc, 0xab, 0xbf,
+	0x33, 0xc6, 0x2b, 0x4e, 0xf4, 0x1a, 0x64, 0x05, 0xb1, 0xd4, 0x73, 0x39, 0x41, 0x90, 0x4c, 0x4b,
+	0x92, 0x94, 0xb2, 0x95, 0x25, 0x9b, 0x39, 0xc9, 0x56, 0xd6, 0xd9, 0x24, 0x29, 0x7a, 0x83, 0x35,
+	0xbd, 0x04, 0x1f, 0xf7, 0x86, 0x95, 0xa4, 0xbb, 0xb1, 0x60, 0x8c, 0x89, 0xed, 0x9f, 0x1a, 0x90,
+	0x17, 0xaa, 0x33, 0x87, 0x7c, 0x93, 0xe9, 0xcd, 0xdd, 0xca, 0x10, 0x6e, 0x15, 0x45, 0x9c, 0xc0,
+	0x68, 0x75, 0x62, 0x44, 0x8e, 0xb6, 0xb8, 0x12, 0x9c, 0x97, 0x2b, 0x5f, 0x50, 0xa2, 0x55, 0xa0,
+	0x34, 0xe6, 0x98, 0xc1, 0xfe, 0x85, 0x01, 0x57, 0x45, 0x45, 0x22, 0xf4, 0x91, 0x17, 0xe0, 0x97,
+	0x60, 0xb1, 0x3e, 0xea, 0xef, 0x3d, 0x8a, 0x85, 0xf3, 0x68, 0x19, 0x83, 0xd2, 0xe2, 0x81, 0x41,
+	0x22, 0xfd, 0x79, 0x81, 0xa8, 0x03, 0xd1, 0x3a, 0x58, 0x92, 0x2f, 0x6a, 0x92, 0xf3, 0x6a, 0x71,
+	0x02, 0x6e, 0xff, 0xd8, 0xe4, 0x0f, 0x33, 0x67, 0x86, 0xeb, 0xd7, 0xbb, 0xbb, 0xff, 0xb1, 0x29,
+	0x9e, 0x19, 0x69, 0xe8, 0xdd, 0x8d, 0x32, 0x0e, 0x77, 0x8d, 0x9b, 0x13, 0x3e, 0xc6, 0x62, 0x8f,
+	0x91, 0xe8, 0xb1, 0xc7, 0x6d, 0x7f, 0x37, 0x0a, 0x5d, 0xf3, 0x2c, 0xfe, 0xa9, 0xb1, 0xdb, 0x80,
+	0xbc, 0x22, 0x3c, 0xa1, 0x58, 0x2d, 0xea, 0xb1, 0x3b, 0xf5, 0x05, 0x4d, 0x09, 0x5e, 0x26, 0xf4,
+	0xcc, 0x84, 0x70, 0x9e, 0xd0, 0xa4, 0x8c, 0xf0, 0xd7, 0x94, 0x7e, 0x7f, 0x4b, 0xf4, 0x9c, 0x7b,
+	0x5a, 0xe8, 0x25, 0x9e, 0x22, 0x31, 0x5a, 0xde, 0xb0, 0xd5, 0x60, 0xdd, 0x8c, 0xb2, 0xa2, 0x68,
+	0xa8, 0x2d, 0x27, 0xe4, 0x42, 0x79, 0x1b, 0x91, 0xf9, 0xf3, 0xf5, 0x78, 0x43, 0x45, 0xf9, 0xbb,
+	0x92, 0xb4, 0x0d, 0xd2, 0x73, 0xa2, 0xcd, 0xdf, 0x8c, 0x0e, 0x56, 0x51, 0xf6, 0x2e, 0x27, 0x1c,
+	0xa7, 0x72, 0x32, 0x79, 0x04, 0xdf, 0x91, 0xed, 0x50, 0x5e, 0xab, 0x68, 0xe5, 0xa4, 0xec, 0x34,
+	0x68, 0x4d, 0xd1, 0xba, 0xf0, 0x4f, 0x51, 0xbe, 0x89, 0xdb, 0x6f, 0x86, 0x71, 0xaf, 0x8d, 0x17,
+	0xa3, 0x3a, 0x15, 0x4e, 0xe0, 0x44, 0x95, 0xb1, 0x8b, 0xa9, 0x68, 0x24, 0x9c, 0x5b, 0xd7, 0x8e,
+	0x5d, 0x67, 0xaf, 0xc1, 0x5c, 0x9d, 0x3c, 0x09, 0xab, 0x6d, 0xd6, 0x4a, 0x48, 0x63, 0x31, 0xb2,
+	0xff, 0x99, 0x01, 0x4b, 0xae, 0x23, 0x7a, 0x81, 0x89, 0xde, 0x5b, 0x0c, 0xf5, 0xbd, 0x45, 0x7a,
+	0x80, 0xa9, 0x78, 0x80, 0x14, 0x2b, 0x2f, 0xac, 0x62, 0x84, 0xf6, 0x20, 0xcf, 0xbf, 0xb6, 0x4f,
+	0x77, 0xc9, 0x69, 0x21, 0xcd, 0xa2, 0xe5, 0xd5, 0x24, 0xe3, 0x45, 0x0f, 0x2b, 0x0a, 0x3d, 0xbf,
+	0xf1, 0xa9, 0x12, 0x92, 0x1e, 0xb1, 0xff, 0xfb, 0x7b, 0xd3, 0x06, 0x6b, 0xac, 0x4c, 0x0f, 0x0a,
+	0x59, 0xb6, 0xd4, 0x8d, 0x33, 0x97, 0x3a, 0xce, 0xa4, 0xa6, 0x8a, 0x09, 0x89, 0xa8, 0xaa, 0x1e,
+	0x4b, 0xbc, 0x4e, 0x7d, 0xe5, 0x4c, 0xf1, 0x11, 0x35, 0xb7, 0x63, 0xcc, 0xad, 0x86, 0x00, 0x5c,
+	0x38, 0x04, 0x94, 0x20, 0xcd, 0x7f, 0xa1, 0x20, 0x9d, 0xbf, 0x44, 0x90, 0x8e, 0xa5, 0x94, 0x85,
+	0x4b, 0xa7, 0x94, 0x89, 0x78, 0x59, 0xfc, 0x22, 0xf1, 0xb2, 0x7a, 0x17, 0xac, 0x71, 0x87, 0x4c,
+	0x7e, 0x58, 0x4f, 0x7e, 0xc5, 0x5b, 0xfd, 0x00, 0xae, 0x26, 0xee, 0xf2, 0x25, 0xd3, 0xb3, 0xd6,
+	0x5f, 0x54, 0xc4, 0x6f, 0xb1, 0xbf, 0x60, 0x4c, 0x39, 0x4b, 0xce, 0x53, 0xce, 0xae, 0x42, 0x5e,
+	0xfd, 0xf7, 0xc6, 0x97, 0x78, 0xa4, 0xb6, 0x7f, 0x6b, 0xc2, 0x4a, 0x52, 0x2b, 0xf1, 0x8c, 0x86,
+	0xf5, 0xfe, 0xc4, 0xbf, 0x60, 0x8a, 0xe7, 0x35, 0x26, 0xf5, 0x7f, 0xc3, 0x4c, 0xd4, 0x04, 0xcf,
+	0xe6, 0x3f, 0x31, 0xcd, 0xf3, 0xff, 0x13, 0x73, 0x56, 0x69, 0xad, 0x58, 0x54, 0xb1, 0xf5, 0xfa,
+	0xf7, 0x01, 0x0e, 0x86, 0x6d, 0x37, 0xe4, 0xed, 0x9b, 0xeb, 0xb0, 0xac, 0x3d, 0x4f, 0x73, 0x94,
+	0x35, 0x83, 0xae, 0xc2, 0x92, 0x7c, 0x92, 0xae, 0x35, 0xea, 0x02, 0x6c, 0xa0, 0x65, 0xb8, 0x42,
+	0xdd, 0x91, 0xe9, 0x23, 0x80, 0x26, 0x5a, 0x80, 0x5c, 0xb3, 0xb1, 0x27, 0x86, 0xa9, 0xf5, 0x22,
+	0xe4, 0xa2, 0xbf, 0x34, 0xa1, 0x2b, 0x90, 0xaf, 0x7b, 0x7e, 0xdf, 0xed, 0xb1, 0xa1, 0x35, 0x83,
+	0x2c, 0x98, 0x6f, 0x76, 0xfb, 0xc4, 0x1b, 0x85, 0x1c, 0x62, 0xac, 0xff, 0xcd, 0x04, 0x88, 0x1b,
+	0xf2, 0x68, 0x11, 0xa0, 0xd9, 0xd8, 0x3b, 0x3c, 0xd8, 0x77, 0x4a, 0xcd, 0x8a, 0x35, 0x83, 0x00,
+	0xe6, 0x4a, 0xfb, 0xfb, 0x95, 0xba, 0x63, 0x19, 0x28, 0x0b, 0x69, 0x5c, 0x29, 0x39, 0x96, 0x89,
+	0xe6, 0x21, 0xdb, 0xc4, 0x07, 0xf5, 0x32, 0xa5, 0x49, 0x51, 0xa1, 0x0f, 0x2a, 0xcd, 0xc3, 0x08,
+	0x92, 0x46, 0x79, 0xc8, 0x94, 0xf7, 0xea, 0xf5, 0x4a, 0xb9, 0x69, 0xcd, 0x52, 0x91, 0x62, 0x70,
+	0x88, 0xf7, 0xac, 0x39, 0xb4, 0x04, 0x0b, 0xb5, 0xbd, 0x07, 0x87, 0x3b, 0x95, 0x12, 0x6e, 0x6e,
+	0x57, 0x4a, 0x4d, 0x2b, 0x43, 0x25, 0x94, 0xeb, 0x0a, 0x24, 0x4b, 0x21, 0x8e, 0x0a, 0xc9, 0x21,
+	0x04, 0x8b, 0xe5, 0x9d, 0x4a, 0x79, 0xf7, 0x70, 0xa7, 0xb4, 0x5b, 0xa9, 0xec, 0x57, 0xb0, 0x05,
+	0xd4, 0x80, 0x74, 0xe6, 0x72, 0xed, 0xa0, 0xd1, 0xac, 0xe0, 0x43, 0xa7, 0xd2, 0x2c, 0x55, 0x6b,
+	0x0d, 0x2b, 0x4f, 0x89, 0x29, 0xa2, 0xb1, 0x53, 0xc2, 0xce, 0x61, 0xb5, 0x7e, 0x7f, 0xcf, 0x9a,
+	0x67, 0x02, 0xea, 0x87, 0xa5, 0x5a, 0x6d, 0x8f, 0x6a, 0x79, 0x58, 0x75, 0xac, 0x05, 0x6a, 0x68,
+	0x55, 0x40, 0xa3, 0x49, 0xf5, 0x5f, 0x64, 0x86, 0x66, 0x16, 0x38, 0x2c, 0xd7, 0x0f, 0x6b, 0xa5,
+	0xed, 0x4a, 0xcd, 0xba, 0x82, 0x0a, 0xb0, 0x12, 0x03, 0xdf, 0xdb, 0xc3, 0xbb, 0x82, 0xdc, 0xa2,
+	0x92, 0xf7, 0x4b, 0xcd, 0xf2, 0x0e, 0x45, 0x34, 0x9a, 0x7b, 0xb8, 0x62, 0x2d, 0x51, 0x11, 0x4e,
+	0xa5, 0x56, 0xe1, 0xd4, 0x1c, 0x88, 0xd6, 0xeb, 0x00, 0xf1, 0xb3, 0x3c, 0x35, 0x0c, 0xdd, 0x4e,
+	0x0e, 0xb1, 0x66, 0xa8, 0x55, 0xab, 0x83, 0x90, 0xf8, 0x03, 0xb7, 0x67, 0x19, 0x74, 0xef, 0x98,
+	0x73, 0x44, 0x1b, 0xbd, 0x24, 0xfe, 0xe1, 0x80, 0xc9, 0x0f, 0x48, 0x2b, 0x24, 0x6d, 0x2b, 0xb5,
+	0xbe, 0x0e, 0xb9, 0xe8, 0xf5, 0x9a, 0xb2, 0x37, 0x48, 0xc8, 0x46, 0xd6, 0x0c, 0x65, 0xe7, 0xfd,
+	0x29, 0x0e, 0x30, 0xd6, 0x9f, 0x9a, 0x80, 0xe4, 0xe1, 0xa0, 0xf8, 0x20, 0xdd, 0xf0, 0x6e, 0xeb,
+	0x44, 0x75, 0x3d, 0xe5, 0x99, 0x30, 0x72, 0xbd, 0xab, 0xb0, 0xe4, 0x4c, 0x80, 0x4d, 0x74, 0x8d,
+	0xde, 0x8c, 0x3b, 0xe3, 0xf0, 0x14, 0x9d, 0xfd, 0x01, 0x09, 0x23, 0x8f, 0x4e, 0xa3, 0xe7, 0x26,
+	0x32, 0xa0, 0x40, 0xcd, 0x52, 0xeb, 0x35, 0x08, 0xf7, 0x47, 0x01, 0x9b, 0xa3, 0xb6, 0xd6, 0x6f,
+	0x4f, 0x02, 0x93, 0x41, 0x37, 0xe0, 0xf9, 0x06, 0x09, 0x27, 0x8f, 0x5f, 0x41, 0x90, 0x45, 0xab,
+	0x70, 0x4d, 0x10, 0x44, 0xf9, 0x5b, 0xe0, 0x72, 0xd4, 0x84, 0xfc, 0x5b, 0x58, 0xcd, 0x02, 0xba,
+	0x30, 0x09, 0x8a, 0x3a, 0x41, 0x56, 0x9e, 0xfa, 0xdf, 0x3e, 0x4d, 0xb3, 0xe2, 0x4e, 0x6a, 0xcd,
+	0x53, 0x5e, 0x4c, 0xfa, 0xde, 0x63, 0xd9, 0xf0, 0xb3, 0x16, 0xd6, 0x3f, 0x32, 0x60, 0x41, 0x2b,
+	0x2d, 0xe8, 0xae, 0x4b, 0x80, 0xb8, 0x72, 0x58, 0x33, 0x74, 0xed, 0x12, 0xa8, 0x75, 0x7e, 0x2d,
+	0x03, 0x7d, 0x0b, 0xfe, 0x7f, 0x02, 0x25, 0x4f, 0x08, 0x4c, 0x5a, 0xa4, 0xfb, 0x98, 0xb4, 0x2d,
+	0x13, 0x3d, 0x0f, 0xd7, 0x27, 0xc8, 0xee, 0xbb, 0xdd, 0x1e, 0x75, 0x02, 0x75, 0x4e, 0x3c, 0x1a,
+	0x0c, 0xa8, 0xe0, 0xf4, 0xfa, 0x51, 0x52, 0x71, 0x43, 0xcd, 0xaa, 0x41, 0x63, 0x1d, 0xc7, 0x31,
+	0x52, 0x92, 0x31, 0x81, 0x69, 0x84, 0xde, 0x70, 0x48, 0xb5, 0x5a, 0x3f, 0x06, 0x6b, 0xbc, 0xd5,
+	0x4f, 0xdd, 0xa9, 0xd4, 0x6e, 0x8b, 0xec, 0x67, 0xcd, 0xc4, 0x56, 0x93, 0x20, 0x83, 0x9a, 0xb6,
+	0x11, 0xba, 0x7e, 0x28, 0x21, 0x26, 0xf5, 0x16, 0x2a, 0x55, 0x02, 0x52, 0x54, 0xca, 0x6e, 0xb7,
+	0xd7, 0x7b, 0xdf, 0xeb, 0x1f, 0x75, 0x89, 0x95, 0x5e, 0x7f, 0x4b, 0x6b, 0x91, 0x53, 0x34, 0x3d,
+	0xef, 0x38, 0xc4, 0x9a, 0xa1, 0x29, 0xd0, 0xa9, 0xcb, 0xa1, 0x41, 0x87, 0xe5, 0x68, 0x68, 0x6e,
+	0x57, 0x9e, 0x7e, 0xb6, 0x36, 0xf3, 0xc9, 0xe7, 0x6b, 0xc6, 0xd3, 0xcf, 0xd7, 0x8c, 0xbf, 0x7c,
+	0xbe, 0x66, 0xbc, 0xbf, 0xa9, 0xfc, 0xa1, 0xbb, 0xef, 0x86, 0x7e, 0xf7, 0x89, 0xe7, 0x77, 0x3b,
+	0xdd, 0x81, 0x1c, 0x0c, 0xc8, 0x9d, 0xe1, 0x49, 0xe7, 0xce, 0xf0, 0xe8, 0x4e, 0x9c, 0xd1, 0x8f,
+	0xe6, 0xd8, 0xbf, 0xb9, 0x37, 0xff, 0x1d, 0x00, 0x00, 0xff, 0xff, 0x52, 0x67, 0x94, 0xce, 0x2c,
+	0x2e, 0x00, 0x00,
 }
 
 func (m *CNStore) Marshal() (dAtA []byte, err error) {
@@ -5101,6 +5117,18 @@ func (m *Request) MarshalToSizedBuffer(dAtA []byte) (int, error) {
 		i -= len(m.XXX_unrecognized)
 		copy(dAtA[i:], m.XXX_unrecognized)
 	}
+	if m.DeleteCNStore != nil {
+		{
+			size, err := m.DeleteCNStore.MarshalToSizedBuffer(dAtA[:i])
+			if err != nil {
+				return 0, err
+			}
+			i -= size
+			i = encodeVarintLogservice(dAtA, i, uint64(size))
+		}
+		i--
+		dAtA[i] = 0x62
+	}
 	if m.CNStateLabel != nil {
 		{
 			size, err := m.CNStateLabel.MarshalToSizedBuffer(dAtA[:i])
@@ -7458,6 +7486,10 @@ func (m *Request) Size() (n int) {
 		l = m.CNStateLabel.Size()
 		n += 1 + l + sovLogservice(uint64(l))
 	}
+	if m.DeleteCNStore != nil {
+		l = m.DeleteCNStore.Size()
+		n += 1 + l + sovLogservice(uint64(l))
+	}
 	if m.XXX_unrecognized != nil {
 		n += len(m.XXX_unrecognized)
 	}
@@ -11916,6 +11948,42 @@ func (m *Request) Unmarshal(dAtA []byte) error {
 				return err
 			}
 			iNdEx = postIndex
+		case 12:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field DeleteCNStore", wireType)
+			}
+			var msglen int
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowLogservice
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				msglen |= int(b&0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			if msglen < 0 {
+				return ErrInvalidLengthLogservice
+			}
+			postIndex := iNdEx + msglen
+			if postIndex < 0 {
+				return ErrInvalidLengthLogservice
+			}
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			if m.DeleteCNStore == nil {
+				m.DeleteCNStore = &DeleteCNStore{}
+			}
+			if err := m.DeleteCNStore.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+				return err
+			}
+			iNdEx = postIndex
 		default:
 			iNdEx = preIndex
 			skippy, err := skipLogservice(dAtA[iNdEx:])
diff --git a/proto/logservice.proto b/proto/logservice.proto
index 3ca83fba8..df7ad3945 100644
--- a/proto/logservice.proto
+++ b/proto/logservice.proto
@@ -191,6 +191,7 @@ enum MethodType {
   UPDATE_CN_LABEL = 15;
   UPDATE_CN_WORK_STATE = 16;
   PATCH_CN_STORE = 17;
+  DELETE_CN_STORE = 18;
 };
 
 enum RecordType {
@@ -263,6 +264,7 @@ message Request {
   CNStoreLabel CNStoreLabel      = 9;
   CNWorkState CNWorkState        = 10;
   CNStateLabel CNStateLabel      = 11;
+  DeleteCNStore DeleteCNStore    = 12;
 };
 
 message LogResponse {
@@ -316,6 +318,7 @@ enum HAKeeperUpdateType {
   UpdateCNLabel = 10;
   UpdateCNWorkState = 11;
   PatchCNStore = 12;
+  RemoveCNStore = 13;
 }
 
 // HAKeeperState state transition diagram


Test patch:
diff --git a/pkg/hakeeper/rsm_test.go b/pkg/hakeeper/rsm_test.go
index 8abab2078..6eb9f8c15 100644
--- a/pkg/hakeeper/rsm_test.go
+++ b/pkg/hakeeper/rsm_test.go
@@ -907,3 +907,32 @@ func TestHandlePatchCNStore(t *testing.T) {
 	assert.True(t, ok)
 	assert.Equal(t, labels.Labels, []string{"1", "2"})
 }
+
+func TestHandleDeleteCNStore(t *testing.T) {
+	uuid := "uuid1"
+	tsm1 := NewStateMachine(0, 1).(*stateMachine)
+
+	cmd := GetTickCmd()
+	_, err := tsm1.Update(sm.Entry{Cmd: cmd})
+	assert.NoError(t, err)
+
+	hb := pb.CNStoreHeartbeat{
+		UUID: uuid,
+	}
+	data, err := hb.Marshal()
+	require.NoError(t, err)
+	cmd = GetCNStoreHeartbeatCmd(data)
+	_, err = tsm1.Update(sm.Entry{Cmd: cmd})
+	assert.NoError(t, err)
+	s := tsm1.state.CNState
+	assert.Equal(t, 1, len(s.Stores))
+
+	cnStore := pb.DeleteCNStore{
+		StoreID: uuid,
+	}
+	cmd = GetDeleteCNStoreCmd(cnStore)
+	_, err = tsm1.Update(sm.Entry{Cmd: cmd})
+	assert.NoError(t, err)
+	s = tsm1.state.CNState
+	assert.Equal(t, 0, len(s.Stores))
+}
diff --git a/pkg/logservice/hakeeper_client_test.go b/pkg/logservice/hakeeper_client_test.go
index 81821228d..0724180d0 100644
--- a/pkg/logservice/hakeeper_client_test.go
+++ b/pkg/logservice/hakeeper_client_test.go
@@ -657,3 +657,44 @@ func TestHAKeeperClientPatchCNStore(t *testing.T) {
 	}
 	runServiceTest(t, true, true, fn)
 }
+
+func TestHAKeeperClientDeleteCNStore(t *testing.T) {
+	fn := func(t *testing.T, s *Service) {
+		cfg := HAKeeperClientConfig{
+			ServiceAddresses: []string{testServiceAddress},
+		}
+		ctx, cancel := context.WithTimeout(context.Background(), time.Second)
+		defer cancel()
+		c1, err := NewProxyHAKeeperClient(ctx, cfg)
+		require.NoError(t, err)
+		c2, err := NewCNHAKeeperClient(ctx, cfg)
+		require.NoError(t, err)
+		defer func() {
+			assert.NoError(t, c1.Close())
+			assert.NoError(t, c2.Close())
+		}()
+
+		hb := pb.CNStoreHeartbeat{
+			UUID:           s.ID(),
+			ServiceAddress: "addr1",
+		}
+		_, err = c2.SendCNHeartbeat(ctx, hb)
+		require.NoError(t, err)
+		state, err := c1.GetClusterState(ctx)
+		require.NoError(t, err)
+		_, ok := state.CNState.Stores[s.ID()]
+		assert.True(t, ok)
+
+		cnStore := pb.DeleteCNStore{
+			StoreID: s.ID(),
+		}
+		err = c1.DeleteCNStore(ctx, cnStore)
+		require.NoError(t, err)
+
+		state, err = c1.GetClusterState(ctx)
+		require.NoError(t, err)
+		_, ok = state.CNState.Stores[s.ID()]
+		assert.False(t, ok)
+	}
+	runServiceTest(t, true, true, fn)
+}
diff --git a/pkg/logservice/service_test.go b/pkg/logservice/service_test.go
index 8245b4e9f..3f44779a7 100644
--- a/pkg/logservice/service_test.go
+++ b/pkg/logservice/service_test.go
@@ -1083,3 +1083,54 @@ func TestServiceHandleCNPatchStore(t *testing.T) {
 	}
 	runServiceTest(t, true, true, fn)
 }
+
+func TestServiceHandleCNDeleteStore(t *testing.T) {
+	fn := func(t *testing.T, s *Service) {
+		uuid := "uuid1"
+		ctx0, cancel0 := context.WithTimeout(context.Background(), time.Second)
+		defer cancel0()
+		req := pb.Request{
+			Method: pb.CN_HEARTBEAT,
+			CNHeartbeat: &pb.CNStoreHeartbeat{
+				UUID: uuid,
+			},
+		}
+		resp := s.handleCNHeartbeat(ctx0, req)
+		assert.Equal(t, &pb.CommandBatch{}, resp.CommandBatch)
+		assert.Equal(t, uint32(moerr.Ok), resp.ErrorCode)
+
+		ctx1, cancel1 := context.WithTimeout(context.Background(), time.Second)
+		defer cancel1()
+		req = pb.Request{
+			Method: pb.GET_CLUSTER_STATE,
+		}
+		resp = s.handleGetCheckerState(ctx1, req)
+		assert.Equal(t, uint32(moerr.Ok), resp.ErrorCode)
+		assert.NotEmpty(t, resp.CheckerState)
+		_, ok := resp.CheckerState.CNState.Stores[uuid]
+		assert.True(t, ok)
+
+		ctx2, cancel2 := context.WithTimeout(context.Background(), time.Second)
+		defer cancel2()
+		req = pb.Request{
+			Method: pb.DELETE_CN_STORE,
+			DeleteCNStore: &pb.DeleteCNStore{
+				StoreID: uuid,
+			},
+		}
+		resp = s.handleDeleteCNStore(ctx2, req)
+		assert.Equal(t, uint32(moerr.Ok), resp.ErrorCode)
+
+		ctx3, cancel3 := context.WithTimeout(context.Background(), time.Second)
+		defer cancel3()
+		req = pb.Request{
+			Method: pb.GET_CLUSTER_STATE,
+		}
+		resp = s.handleGetCheckerState(ctx3, req)
+		assert.Equal(t, uint32(moerr.Ok), resp.ErrorCode)
+		assert.NotEmpty(t, resp.CheckerState)
+		_, ok = resp.CheckerState.CNState.Stores[uuid]
+		assert.False(t, ok)
+	}
+	runServiceTest(t, true, true, fn)
+}
diff --git a/pkg/logservice/store_test.go b/pkg/logservice/store_test.go
index a89278418..975f36713 100644
--- a/pkg/logservice/store_test.go
+++ b/pkg/logservice/store_test.go
@@ -881,3 +881,41 @@ func TestPatchCNStore(t *testing.T) {
 	}
 	runStoreTest(t, fn)
 }
+
+func TestDeleteCNStore(t *testing.T) {
+	fn := func(t *testing.T, store *store) {
+		peers := make(map[uint64]dragonboat.Target)
+		peers[1] = store.id()
+		assert.NoError(t, store.startHAKeeperReplica(1, peers, false))
+
+		ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
+		defer cancel()
+
+		uuid := "uuid1"
+		hb := pb.CNStoreHeartbeat{
+			UUID: uuid,
+		}
+		_, err := store.addCNStoreHeartbeat(ctx, hb)
+		assert.NoError(t, err)
+		state, err := store.getCheckerState()
+		assert.NoError(t, err)
+		assert.NotEmpty(t, state)
+		assert.Equal(t, 1, len(state.CNState.Stores))
+		_, ok := state.CNState.Stores[uuid]
+		assert.Equal(t, true, ok)
+
+		cnStore := pb.DeleteCNStore{
+			StoreID: uuid,
+		}
+		err = store.deleteCNStore(ctx, cnStore)
+		assert.NoError(t, err)
+
+		state, err = store.getCheckerState()
+		assert.NoError(t, err)
+		assert.NotEmpty(t, state)
+		assert.NoError(t, err)
+		assert.NotEmpty(t, state)
+		assert.Equal(t, 0, len(state.CNState.Stores))
+	}
+	runStoreTest(t, fn)
+}