diff --git a/Makefile b/Makefile index ec0922b2510e0af473750d6efe9f698ef3d38f37..22f5ddd0d5e206944bcc8be412ad319b894cce00 100644 --- a/Makefile +++ b/Makefile @@ -369,6 +369,7 @@ generate-mockery: getdeps $(PWD)/bin/mockery --name=Manager --dir=$(PWD)/internal/querynodev2/cluster --output=$(PWD)/internal/querynodev2/cluster --filename=mock_manager.go --with-expecter --outpkg=cluster --structname=MockManager --inpackage $(PWD)/bin/mockery --name=Loader --dir=$(PWD)/internal/querynodev2/segments --output=$(PWD)/internal/querynodev2/segments --filename=mock_loader.go --with-expecter --outpkg=segments --structname=MockLoader --inpackage $(PWD)/bin/mockery --name=Worker --dir=$(PWD)/internal/querynodev2/cluster --output=$(PWD)/internal/querynodev2/cluster --filename=mock_worker.go --with-expecter --outpkg=worker --structname=MockWorker --inpackage + $(PWD)/bin/mockery --name=ShardDelegator --dir=$(PWD)/internal/querynodev2/delegator/ --output=$(PWD)/internal/querynodev2/delegator/ --filename=mock_delegator.go --with-expecter --outpkg=delegator --structname=MockShardDelegator --inpackage ci-ut: build-cpp-with-coverage generated-proto-go-without-cpp codecov-cpp codecov-go diff --git a/internal/proto/query_coord.proto b/internal/proto/query_coord.proto index b6d318a0598d244b23d9edbd45cb00e0d03d69e7..12f12756d1d1ac594b96c8388c4fb2cf64b93732 100644 --- a/internal/proto/query_coord.proto +++ b/internal/proto/query_coord.proto @@ -555,6 +555,10 @@ message SyncDistributionRequest { int64 collectionID = 2; string channel = 3; repeated SyncAction actions = 4; + schema.CollectionSchema schema = 5; + LoadMetaInfo load_meta = 6; + int64 replicaID = 7; + int64 version = 8; } message ResourceGroup { diff --git a/internal/proto/querypb/query_coord.pb.go b/internal/proto/querypb/query_coord.pb.go index b8fe7bee3ad22d3126b848aa5ee5a4b513c01e01..155b6597cf03fa66b681fdf76918a4cbbe7cb13b 100644 --- a/internal/proto/querypb/query_coord.pb.go +++ b/internal/proto/querypb/query_coord.pb.go @@ -3896,13 +3896,17 @@ func (m *SyncAction) GetInfo() *SegmentLoadInfo { } type SyncDistributionRequest struct { - Base *commonpb.MsgBase `protobuf:"bytes,1,opt,name=base,proto3" json:"base,omitempty"` - CollectionID int64 `protobuf:"varint,2,opt,name=collectionID,proto3" json:"collectionID,omitempty"` - Channel string `protobuf:"bytes,3,opt,name=channel,proto3" json:"channel,omitempty"` - Actions []*SyncAction `protobuf:"bytes,4,rep,name=actions,proto3" json:"actions,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Base *commonpb.MsgBase `protobuf:"bytes,1,opt,name=base,proto3" json:"base,omitempty"` + CollectionID int64 `protobuf:"varint,2,opt,name=collectionID,proto3" json:"collectionID,omitempty"` + Channel string `protobuf:"bytes,3,opt,name=channel,proto3" json:"channel,omitempty"` + Actions []*SyncAction `protobuf:"bytes,4,rep,name=actions,proto3" json:"actions,omitempty"` + Schema *schemapb.CollectionSchema `protobuf:"bytes,5,opt,name=schema,proto3" json:"schema,omitempty"` + LoadMeta *LoadMetaInfo `protobuf:"bytes,6,opt,name=load_meta,json=loadMeta,proto3" json:"load_meta,omitempty"` + ReplicaID int64 `protobuf:"varint,7,opt,name=replicaID,proto3" json:"replicaID,omitempty"` + Version int64 `protobuf:"varint,8,opt,name=version,proto3" json:"version,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *SyncDistributionRequest) Reset() { *m = SyncDistributionRequest{} } @@ -3958,6 +3962,34 @@ func (m *SyncDistributionRequest) GetActions() []*SyncAction { return nil } +func (m *SyncDistributionRequest) GetSchema() *schemapb.CollectionSchema { + if m != nil { + return m.Schema + } + return nil +} + +func (m *SyncDistributionRequest) GetLoadMeta() *LoadMetaInfo { + if m != nil { + return m.LoadMeta + } + return nil +} + +func (m *SyncDistributionRequest) GetReplicaID() int64 { + if m != nil { + return m.ReplicaID + } + return 0 +} + +func (m *SyncDistributionRequest) GetVersion() int64 { + if m != nil { + return m.Version + } + return 0 +} + type ResourceGroup struct { Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` Capacity int32 `protobuf:"varint,2,opt,name=capacity,proto3" json:"capacity,omitempty"` @@ -4430,290 +4462,291 @@ func init() { func init() { proto.RegisterFile("query_coord.proto", fileDescriptor_aab7cc9a69ed26e8) } var fileDescriptor_aab7cc9a69ed26e8 = []byte{ - // 4517 bytes of a gzipped FileDescriptorProto + // 4534 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x3c, 0x4b, 0x6c, 0x24, 0x49, 0x56, 0x9d, 0xf5, 0xb1, 0xab, 0x5e, 0x7d, 0x5c, 0x0e, 0xdb, 0xdd, 0xb5, 0xb5, 0xdd, 0x3d, 0x9e, 0xec, 0xf9, 0x18, 0xcf, 0x8c, 0x3d, 0xeb, 0xde, 0x9d, 0xed, 0xdd, 0x99, 0xd5, 0x6c, 0xb7, 0xbd, 0xdd, 0xe3, 0x9d, 0x1e, 0x4f, 0x93, 0xee, 0xee, 0x45, 0xa3, 0xd9, 0xad, 0x4d, 0x57, 0x86, 0xcb, 0xa9, 0xce, 0x4f, 0x75, 0x66, 0x96, 0x3d, 0x1e, 0x24, 0x4e, 0x5c, 0x40, 0x80, 0xe0, 0x04, 0x07, - 0xc4, 0x81, 0x8f, 0xb4, 0x20, 0xb8, 0xc1, 0x8d, 0x03, 0x12, 0x12, 0x20, 0x21, 0x10, 0x17, 0xc4, - 0x91, 0x0b, 0x1c, 0x90, 0x40, 0x88, 0xc3, 0x0a, 0xed, 0x0d, 0xc5, 0x2f, 0x33, 0x23, 0x33, 0xca, - 0x95, 0x76, 0x75, 0xef, 0xcc, 0xa0, 0xbd, 0x55, 0xbe, 0xf8, 0xbc, 0x17, 0xf1, 0xfe, 0x2f, 0x22, - 0x0a, 0x16, 0x9f, 0x8e, 0x71, 0x70, 0xda, 0x1f, 0xf8, 0x7e, 0x60, 0x6d, 0x8c, 0x02, 0x3f, 0xf2, - 0x11, 0x72, 0x6d, 0xe7, 0x78, 0x1c, 0xb2, 0xaf, 0x0d, 0xda, 0xde, 0x6b, 0x0e, 0x7c, 0xd7, 0xf5, - 0x3d, 0x06, 0xeb, 0x35, 0xd3, 0x3d, 0x7a, 0x6d, 0xdb, 0x8b, 0x70, 0xe0, 0x99, 0x8e, 0x68, 0x0d, - 0x07, 0x47, 0xd8, 0x35, 0xf9, 0x57, 0xdd, 0x0d, 0x87, 0xfc, 0x67, 0xc7, 0x32, 0x23, 0x33, 0x8d, - 0x4a, 0xff, 0x65, 0x0d, 0x2e, 0xef, 0x1f, 0xf9, 0x27, 0xdb, 0xbe, 0xe3, 0xe0, 0x41, 0x64, 0xfb, - 0x5e, 0x68, 0xe0, 0xa7, 0x63, 0x1c, 0x46, 0xe8, 0x4d, 0xa8, 0x1c, 0x98, 0x21, 0xee, 0x6a, 0xab, - 0xda, 0x5a, 0x63, 0xeb, 0xea, 0x86, 0x44, 0x14, 0xa7, 0xe6, 0x83, 0x70, 0x78, 0xc7, 0x0c, 0xb1, - 0x41, 0x7b, 0x22, 0x04, 0x15, 0xeb, 0x60, 0x77, 0xa7, 0x5b, 0x5a, 0xd5, 0xd6, 0xca, 0x06, 0xfd, - 0x8d, 0x5e, 0x82, 0xd6, 0x20, 0x9e, 0x7b, 0x77, 0x27, 0xec, 0x96, 0x57, 0xcb, 0x6b, 0x65, 0x43, - 0x06, 0xea, 0xff, 0xaa, 0xc1, 0x95, 0x1c, 0x19, 0xe1, 0xc8, 0xf7, 0x42, 0x8c, 0x6e, 0xc2, 0x5c, - 0x18, 0x99, 0xd1, 0x38, 0xe4, 0x94, 0x7c, 0x59, 0x49, 0xc9, 0x3e, 0xed, 0x62, 0xf0, 0xae, 0x79, - 0xb4, 0x25, 0x05, 0x5a, 0xf4, 0x15, 0x58, 0xb6, 0xbd, 0x0f, 0xb0, 0xeb, 0x07, 0xa7, 0xfd, 0x11, - 0x0e, 0x06, 0xd8, 0x8b, 0xcc, 0x21, 0x16, 0x34, 0x2e, 0x89, 0xb6, 0x07, 0x49, 0x13, 0x7a, 0x0b, - 0xae, 0x30, 0x86, 0x85, 0x38, 0x38, 0xb6, 0x07, 0xb8, 0x6f, 0x1e, 0x9b, 0xb6, 0x63, 0x1e, 0x38, - 0xb8, 0x5b, 0x59, 0x2d, 0xaf, 0xd5, 0x8c, 0x15, 0xda, 0xbc, 0xcf, 0x5a, 0x6f, 0x8b, 0x46, 0xfd, - 0x8f, 0x34, 0x58, 0x21, 0x2b, 0x7c, 0x60, 0x06, 0x91, 0xfd, 0x1c, 0xf6, 0x59, 0x87, 0x66, 0x7a, - 0x6d, 0xdd, 0x32, 0x6d, 0x93, 0x60, 0xa4, 0xcf, 0x48, 0xa0, 0x27, 0x7b, 0x52, 0xa1, 0xcb, 0x94, - 0x60, 0xfa, 0x1f, 0x72, 0x81, 0x48, 0xd3, 0x39, 0x0b, 0x23, 0xb2, 0x38, 0x4b, 0x79, 0x9c, 0x17, - 0x60, 0x83, 0xfe, 0x0f, 0x65, 0x58, 0xb9, 0xef, 0x9b, 0x56, 0x22, 0x30, 0x3f, 0xfd, 0xed, 0xfc, - 0x16, 0xcc, 0x31, 0x45, 0xeb, 0x56, 0x28, 0xae, 0x97, 0x65, 0x5c, 0x5c, 0x09, 0x13, 0x0a, 0xf7, - 0x29, 0xc0, 0xe0, 0x83, 0xd0, 0xcb, 0xd0, 0x0e, 0xf0, 0xc8, 0xb1, 0x07, 0x66, 0xdf, 0x1b, 0xbb, - 0x07, 0x38, 0xe8, 0x56, 0x57, 0xb5, 0xb5, 0xaa, 0xd1, 0xe2, 0xd0, 0x3d, 0x0a, 0x44, 0x3f, 0x84, - 0xd6, 0xa1, 0x8d, 0x1d, 0xab, 0x6f, 0x7b, 0x16, 0xfe, 0x64, 0x77, 0xa7, 0x3b, 0xb7, 0x5a, 0x5e, - 0x6b, 0x6c, 0xbd, 0xbd, 0x91, 0x37, 0x12, 0x1b, 0xca, 0x1d, 0xd9, 0xb8, 0x4b, 0x86, 0xef, 0xb2, - 0xd1, 0xdf, 0xf1, 0xa2, 0xe0, 0xd4, 0x68, 0x1e, 0xa6, 0x40, 0xa8, 0x0b, 0xf3, 0x01, 0x3e, 0x0c, - 0x70, 0x78, 0xd4, 0x9d, 0x5f, 0xd5, 0xd6, 0x6a, 0x86, 0xf8, 0x44, 0xaf, 0xc2, 0x42, 0x80, 0x43, - 0x7f, 0x1c, 0x0c, 0x70, 0x7f, 0x18, 0xf8, 0xe3, 0x51, 0xd8, 0xad, 0xad, 0x96, 0xd7, 0xea, 0x46, - 0x5b, 0x80, 0xef, 0x51, 0x68, 0xef, 0x5d, 0x58, 0xcc, 0x61, 0x41, 0x1d, 0x28, 0x3f, 0xc1, 0xa7, - 0x94, 0x11, 0x65, 0x83, 0xfc, 0x44, 0xcb, 0x50, 0x3d, 0x36, 0x9d, 0x31, 0xe6, 0x5b, 0xcd, 0x3e, - 0xbe, 0x59, 0xba, 0xa5, 0xe9, 0xbf, 0xab, 0x41, 0xd7, 0xc0, 0x0e, 0x36, 0x43, 0xfc, 0x59, 0xb2, - 0xf4, 0x32, 0xcc, 0x79, 0xbe, 0x85, 0x77, 0x77, 0x28, 0x4b, 0xcb, 0x06, 0xff, 0xd2, 0x7f, 0xa2, - 0xc1, 0xf2, 0x3d, 0x1c, 0x11, 0xd9, 0xb6, 0xc3, 0xc8, 0x1e, 0xc4, 0xca, 0xfb, 0x2d, 0x28, 0x07, - 0xf8, 0x29, 0xa7, 0xec, 0x35, 0x99, 0xb2, 0xd8, 0x2a, 0xab, 0x46, 0x1a, 0x64, 0x1c, 0x7a, 0x11, - 0x9a, 0x96, 0xeb, 0xf4, 0x07, 0x47, 0xa6, 0xe7, 0x61, 0x87, 0x69, 0x47, 0xdd, 0x68, 0x58, 0xae, - 0xb3, 0xcd, 0x41, 0xe8, 0x3a, 0x40, 0x88, 0x87, 0x2e, 0xf6, 0xa2, 0xc4, 0x7a, 0xa6, 0x20, 0x68, - 0x1d, 0x16, 0x0f, 0x03, 0xdf, 0xed, 0x87, 0x47, 0x66, 0x60, 0xf5, 0x1d, 0x6c, 0x5a, 0x38, 0xa0, - 0xd4, 0xd7, 0x8c, 0x05, 0xd2, 0xb0, 0x4f, 0xe0, 0xf7, 0x29, 0x18, 0xdd, 0x84, 0x6a, 0x38, 0xf0, - 0x47, 0x98, 0x4a, 0x5a, 0x7b, 0xeb, 0x9a, 0x4a, 0x86, 0x76, 0xcc, 0xc8, 0xdc, 0x27, 0x9d, 0x0c, - 0xd6, 0x57, 0xff, 0x1f, 0xae, 0x6a, 0x9f, 0x73, 0xcb, 0x95, 0x52, 0xc7, 0xea, 0xb3, 0x51, 0xc7, - 0xb9, 0x42, 0xea, 0x38, 0x7f, 0xb6, 0x3a, 0xe6, 0x76, 0xed, 0x3c, 0xea, 0x58, 0x9b, 0xaa, 0x8e, - 0xf5, 0xe7, 0xa3, 0x8e, 0x7f, 0x95, 0xa8, 0xe3, 0xe7, 0x9d, 0xed, 0x89, 0xca, 0x56, 0x25, 0x95, - 0xfd, 0x63, 0x0d, 0xbe, 0x74, 0x0f, 0x47, 0x31, 0xf9, 0x44, 0x03, 0xf1, 0xe7, 0xd4, 0xe9, 0xfe, - 0x99, 0x06, 0x3d, 0x15, 0xad, 0xb3, 0x38, 0xde, 0x8f, 0xe0, 0x72, 0x8c, 0xa3, 0x6f, 0xe1, 0x70, - 0x10, 0xd8, 0x23, 0xca, 0x46, 0x6a, 0x64, 0x1a, 0x5b, 0x37, 0x54, 0x12, 0x9b, 0xa5, 0x60, 0x25, - 0x9e, 0x62, 0x27, 0x35, 0x83, 0xfe, 0xeb, 0x1a, 0xac, 0x10, 0xa3, 0xc6, 0xad, 0x90, 0x77, 0xe8, - 0x5f, 0x7c, 0x5f, 0x65, 0xfb, 0x56, 0xca, 0xd9, 0xb7, 0x02, 0x7b, 0x4c, 0xa3, 0xd8, 0x2c, 0x3d, - 0xb3, 0xec, 0xdd, 0xd7, 0xa0, 0x6a, 0x7b, 0x87, 0xbe, 0xd8, 0xaa, 0x17, 0x54, 0x5b, 0x95, 0x46, - 0xc6, 0x7a, 0xeb, 0x1e, 0xa3, 0x22, 0x31, 0xb8, 0x33, 0x88, 0x5b, 0x76, 0xd9, 0x25, 0xc5, 0xb2, - 0x7f, 0x4d, 0x83, 0x2b, 0x39, 0x84, 0xb3, 0xac, 0xfb, 0x1d, 0x98, 0xa3, 0x6e, 0x44, 0x2c, 0xfc, - 0x25, 0xe5, 0xc2, 0x53, 0xe8, 0xee, 0xdb, 0x61, 0x64, 0xf0, 0x31, 0xba, 0x0f, 0x9d, 0x6c, 0x1b, - 0x71, 0x70, 0xdc, 0xb9, 0xf5, 0x3d, 0xd3, 0x65, 0x1b, 0x50, 0x37, 0x1a, 0x1c, 0xb6, 0x67, 0xba, - 0x18, 0x7d, 0x09, 0x6a, 0x44, 0x65, 0xfb, 0xb6, 0x25, 0xd8, 0x3f, 0x4f, 0x55, 0xd8, 0x0a, 0xd1, - 0x35, 0x00, 0xda, 0x64, 0x5a, 0x56, 0xc0, 0x7c, 0x5f, 0xdd, 0xa8, 0x13, 0xc8, 0x6d, 0x02, 0xd0, - 0x7f, 0x47, 0x83, 0xeb, 0xfb, 0xa7, 0xde, 0x60, 0x0f, 0x9f, 0x6c, 0x07, 0xd8, 0x8c, 0x70, 0x62, - 0x6d, 0x9f, 0xeb, 0xc6, 0xa3, 0x55, 0x68, 0xa4, 0xf4, 0x97, 0x8b, 0x64, 0x1a, 0xa4, 0xff, 0x96, - 0x06, 0x4d, 0x62, 0xfe, 0x3f, 0xc0, 0x91, 0x49, 0x44, 0x04, 0x7d, 0x03, 0xea, 0x8e, 0x6f, 0x5a, - 0xfd, 0xe8, 0x74, 0xc4, 0xa8, 0x69, 0x67, 0xa9, 0x49, 0x7c, 0xc6, 0xc3, 0xd3, 0x11, 0x36, 0x6a, - 0x0e, 0xff, 0x55, 0x88, 0xa2, 0xac, 0x95, 0x29, 0x2b, 0xac, 0xcc, 0xdf, 0x54, 0xe1, 0xf2, 0xf7, - 0xcc, 0x68, 0x70, 0xb4, 0xe3, 0x8a, 0xe8, 0xe2, 0xe2, 0xdb, 0x94, 0x98, 0xdd, 0x52, 0xda, 0xec, - 0x3e, 0x33, 0xb3, 0x1e, 0xab, 0x60, 0x55, 0xa5, 0x82, 0x24, 0x8f, 0xdd, 0x78, 0xcc, 0xa5, 0x28, - 0xa5, 0x82, 0xa9, 0x20, 0x60, 0xee, 0x22, 0x41, 0xc0, 0x36, 0xb4, 0xf0, 0x27, 0x03, 0x67, 0x4c, - 0xc4, 0x91, 0x62, 0x67, 0xde, 0xfd, 0xba, 0x02, 0x7b, 0x5a, 0xff, 0x9b, 0x7c, 0xd0, 0x2e, 0xa7, - 0x81, 0xb1, 0xda, 0xc5, 0x91, 0x49, 0x5d, 0x78, 0x63, 0x6b, 0x75, 0x12, 0xab, 0x85, 0x7c, 0x30, - 0x76, 0x93, 0x2f, 0x74, 0x15, 0xea, 0x3c, 0xe4, 0xd8, 0xdd, 0xe9, 0xd6, 0xe9, 0xf6, 0x25, 0x00, - 0x64, 0x42, 0x8b, 0x1b, 0x47, 0x4e, 0x21, 0x50, 0x0a, 0xdf, 0x51, 0x21, 0x50, 0x33, 0x3b, 0x4d, - 0x79, 0xc8, 0x03, 0x90, 0x30, 0x05, 0x22, 0xb9, 0xb3, 0x7f, 0x78, 0xe8, 0xd8, 0x1e, 0xde, 0x63, - 0x1c, 0x6e, 0x50, 0x22, 0x64, 0x20, 0x09, 0x53, 0x8e, 0x71, 0x10, 0xda, 0xbe, 0xd7, 0x6d, 0xd2, - 0x76, 0xf1, 0xd9, 0xeb, 0xc3, 0x62, 0x0e, 0x85, 0x22, 0xfa, 0xf8, 0x6a, 0x3a, 0xfa, 0x98, 0xbe, - 0xc7, 0xa9, 0xe8, 0xe4, 0x47, 0x1a, 0xac, 0x3c, 0xf2, 0xc2, 0xf1, 0x41, 0xbc, 0xb6, 0xcf, 0x46, - 0x8e, 0xb3, 0xc6, 0xad, 0x92, 0x33, 0x6e, 0x44, 0xe7, 0x16, 0xf8, 0x2a, 0x08, 0xbb, 0xa9, 0x29, - 0xb8, 0x0a, 0xf5, 0xd8, 0xbf, 0xf1, 0x0d, 0x49, 0x00, 0x59, 0xdb, 0x52, 0xca, 0xd9, 0x96, 0x42, - 0xa4, 0x89, 0x68, 0xa5, 0x92, 0x8a, 0x56, 0xae, 0x01, 0x1c, 0x3a, 0xe3, 0xf0, 0xa8, 0x1f, 0xd9, - 0x2e, 0xe6, 0xd1, 0x52, 0x9d, 0x42, 0x1e, 0xda, 0x2e, 0x46, 0xb7, 0xa1, 0x79, 0x60, 0x7b, 0x8e, - 0x3f, 0xec, 0x8f, 0xcc, 0xe8, 0x28, 0xe4, 0x79, 0xa6, 0x8a, 0x2d, 0x34, 0xb6, 0xbc, 0x43, 0xfb, - 0x1a, 0x0d, 0x36, 0xe6, 0x01, 0x19, 0x82, 0xae, 0x43, 0xc3, 0x1b, 0xbb, 0x7d, 0xff, 0xb0, 0x1f, - 0xf8, 0x27, 0x21, 0xcd, 0x26, 0xcb, 0x46, 0xdd, 0x1b, 0xbb, 0x1f, 0x1e, 0x1a, 0xfe, 0x09, 0xf1, - 0x2f, 0x75, 0xe2, 0x69, 0x42, 0xc7, 0x1f, 0xb2, 0x4c, 0x72, 0xfa, 0xfc, 0xc9, 0x00, 0x32, 0xda, - 0xc2, 0x4e, 0x64, 0xd2, 0xd1, 0xf5, 0x62, 0xa3, 0xe3, 0x01, 0xe8, 0x15, 0x68, 0x0f, 0x7c, 0x77, - 0x64, 0xd2, 0x1d, 0xba, 0x1b, 0xf8, 0x2e, 0xd5, 0x9c, 0xb2, 0x91, 0x81, 0xa2, 0x6d, 0x68, 0xd0, - 0xd0, 0x9e, 0xab, 0x57, 0x83, 0xe2, 0xd1, 0x55, 0xea, 0x95, 0x0a, 0xb1, 0x89, 0x80, 0x82, 0x2d, - 0x7e, 0x86, 0x44, 0x32, 0x84, 0x96, 0x86, 0xf6, 0xa7, 0x98, 0x6b, 0x48, 0x83, 0xc3, 0xf6, 0xed, - 0x4f, 0x31, 0xc9, 0x37, 0x6c, 0x2f, 0xc4, 0x41, 0x24, 0xb2, 0xbf, 0x6e, 0x8b, 0x8a, 0x4f, 0x8b, - 0x41, 0xb9, 0x60, 0xa3, 0x1d, 0x68, 0x87, 0x91, 0x19, 0x44, 0xfd, 0x91, 0x1f, 0x52, 0x01, 0xe8, - 0xb6, 0xa9, 0x6c, 0x67, 0x72, 0x37, 0x37, 0x1c, 0x12, 0xc1, 0x7e, 0xc0, 0x3b, 0x19, 0x2d, 0x3a, - 0x48, 0x7c, 0xa2, 0x6f, 0x43, 0x13, 0x7b, 0x56, 0x32, 0xc7, 0x42, 0x91, 0x39, 0x1a, 0xd8, 0xb3, - 0xc4, 0x87, 0xfe, 0xdf, 0x25, 0x68, 0xcb, 0x0b, 0x26, 0x16, 0x80, 0x25, 0x2e, 0x42, 0x8a, 0xc5, - 0x27, 0x59, 0x3e, 0xf6, 0xcc, 0x03, 0x07, 0xb3, 0x2c, 0x89, 0x0a, 0x71, 0x8d, 0xcc, 0x47, 0x60, - 0x74, 0x02, 0x22, 0x8c, 0x6c, 0x9b, 0xa9, 0xe6, 0x94, 0xe9, 0xd2, 0xeb, 0x14, 0x42, 0x83, 0x82, - 0x2e, 0xcc, 0x8b, 0x04, 0x8b, 0x89, 0xb0, 0xf8, 0x24, 0x2d, 0x07, 0x63, 0x9b, 0x62, 0x65, 0x22, - 0x2c, 0x3e, 0xd1, 0x0e, 0x34, 0xd9, 0x94, 0x23, 0x33, 0x30, 0x5d, 0x21, 0xc0, 0x2f, 0x2a, 0x8d, - 0xc0, 0xfb, 0xf8, 0xf4, 0x31, 0xb1, 0x27, 0x0f, 0x4c, 0x3b, 0x30, 0x18, 0xc3, 0x1f, 0xd0, 0x51, - 0x68, 0x0d, 0x3a, 0x6c, 0x96, 0x43, 0xdb, 0xc1, 0x5c, 0x15, 0xe6, 0x59, 0x96, 0x45, 0xe1, 0x77, - 0x6d, 0x07, 0x33, 0x69, 0x8f, 0x97, 0x40, 0x59, 0x5c, 0x63, 0xc2, 0x4e, 0x21, 0x94, 0xc1, 0x37, - 0xa0, 0xc5, 0x9a, 0x85, 0x99, 0x64, 0xb6, 0x9c, 0xd1, 0xf8, 0x98, 0xc1, 0x68, 0xf0, 0x33, 0x76, - 0x99, 0xba, 0x00, 0x5b, 0x8e, 0x37, 0x76, 0x89, 0xb2, 0xe8, 0x7f, 0x5f, 0x81, 0x25, 0x62, 0x33, - 0xb8, 0xf9, 0x98, 0xc1, 0x57, 0x5f, 0x03, 0xb0, 0xc2, 0xa8, 0x2f, 0xd9, 0xb9, 0xba, 0x15, 0x46, - 0xdc, 0x92, 0x7f, 0x43, 0xb8, 0xda, 0xf2, 0xe4, 0xc4, 0x20, 0x63, 0xc3, 0xf2, 0xee, 0xf6, 0x42, - 0x25, 0xb0, 0x1b, 0xd0, 0xe2, 0xe9, 0xac, 0x94, 0xc2, 0x35, 0x19, 0x70, 0x4f, 0x6d, 0x89, 0xe7, - 0x94, 0xa5, 0xb8, 0x94, 0xcb, 0x9d, 0x9f, 0xcd, 0xe5, 0xd6, 0xb2, 0x2e, 0xf7, 0x2e, 0x2c, 0x50, - 0x33, 0x12, 0xab, 0x8f, 0xb0, 0x3e, 0x53, 0xf4, 0xa7, 0x4d, 0x47, 0x89, 0xcf, 0x30, 0xed, 0x31, - 0x41, 0xf2, 0x98, 0x64, 0x1f, 0x3c, 0x8c, 0xad, 0x7e, 0x14, 0x98, 0x5e, 0x78, 0x88, 0x03, 0xea, - 0x71, 0x6b, 0x46, 0x93, 0x00, 0x1f, 0x72, 0x18, 0x7a, 0x07, 0x80, 0xae, 0x91, 0x55, 0x70, 0x9a, - 0x93, 0x2b, 0x38, 0x54, 0x68, 0x68, 0x05, 0x87, 0x6e, 0x0a, 0xfd, 0xa9, 0xff, 0x63, 0x09, 0x2e, - 0xf3, 0x8c, 0x7e, 0x76, 0x81, 0x9a, 0xe4, 0x34, 0x85, 0xd7, 0x29, 0x9f, 0x91, 0x23, 0x57, 0x0a, - 0x04, 0x84, 0x55, 0x45, 0x40, 0x28, 0xe7, 0x89, 0x73, 0xb9, 0x3c, 0x31, 0xae, 0x6d, 0xcd, 0x17, - 0xaf, 0x6d, 0xa1, 0x65, 0xa8, 0xd2, 0xe4, 0x85, 0x32, 0xbd, 0x6e, 0xb0, 0x8f, 0x42, 0xec, 0xd0, - 0x7f, 0xbb, 0x04, 0xad, 0x7d, 0x6c, 0x06, 0x83, 0x23, 0xb1, 0x8f, 0x6f, 0xa5, 0x6b, 0x81, 0x2f, - 0x4d, 0xa8, 0x05, 0x4a, 0x43, 0xbe, 0x30, 0x45, 0x40, 0x82, 0x20, 0xf2, 0x23, 0x33, 0xa6, 0xb2, - 0xef, 0x8d, 0x5d, 0x5e, 0x20, 0x5b, 0xa0, 0x0d, 0x9c, 0xd4, 0xbd, 0xb1, 0xab, 0xff, 0xa7, 0x06, - 0xcd, 0x9f, 0x27, 0xd3, 0x88, 0x8d, 0xb9, 0x95, 0xde, 0x98, 0x57, 0x26, 0x6c, 0x8c, 0x81, 0xa3, - 0xc0, 0xc6, 0xc7, 0xf8, 0x0b, 0x57, 0x1f, 0xfd, 0x5b, 0x0d, 0x7a, 0x24, 0x0b, 0x35, 0x98, 0xc1, - 0x98, 0x5d, 0xbb, 0x6e, 0x40, 0xeb, 0x58, 0x8a, 0x2b, 0x4b, 0x54, 0x38, 0x9b, 0xc7, 0xe9, 0xac, - 0xd9, 0x80, 0x8e, 0x28, 0x57, 0xf2, 0xc5, 0x0a, 0xfb, 0xfd, 0xaa, 0x8a, 0xea, 0x0c, 0x71, 0xd4, - 0xfe, 0x2d, 0x04, 0x32, 0x50, 0xff, 0x0d, 0x0d, 0x96, 0x14, 0x1d, 0xd1, 0x15, 0x98, 0xe7, 0x19, - 0x3a, 0x77, 0xf4, 0x4c, 0xdf, 0x2d, 0xc2, 0x9e, 0xa4, 0xc6, 0x64, 0x5b, 0xf9, 0x60, 0xd5, 0x42, - 0x2f, 0x40, 0x23, 0xce, 0x57, 0xac, 0x1c, 0x7f, 0xac, 0x10, 0xf5, 0xa0, 0xc6, 0xcd, 0xa0, 0x48, - 0x04, 0xe3, 0x6f, 0xfd, 0x09, 0xa0, 0x7b, 0x38, 0x71, 0x3a, 0xb3, 0xec, 0x68, 0x62, 0x6f, 0x12, - 0x42, 0xd3, 0x46, 0xc8, 0xd2, 0xff, 0x4d, 0x83, 0x25, 0x09, 0xdb, 0x2c, 0x95, 0x94, 0xc4, 0x31, - 0x96, 0x2e, 0xe2, 0x18, 0xa5, 0x6a, 0x41, 0xf9, 0x5c, 0xd5, 0x82, 0xeb, 0x00, 0xf1, 0xfe, 0x8b, - 0x1d, 0x4d, 0x41, 0xf4, 0xbf, 0xd4, 0xe0, 0xf2, 0x7b, 0xa6, 0x67, 0xf9, 0x87, 0x87, 0xb3, 0x8b, - 0xea, 0x36, 0x48, 0xa9, 0x63, 0xd1, 0x7a, 0x99, 0x9c, 0x6f, 0xbe, 0x06, 0x8b, 0x01, 0xf3, 0x4c, - 0x96, 0x2c, 0xcb, 0x65, 0xa3, 0x23, 0x1a, 0x62, 0x19, 0xfd, 0xd3, 0x12, 0x20, 0xb2, 0xea, 0x3b, - 0xa6, 0x63, 0x7a, 0x03, 0x7c, 0x71, 0xd2, 0x5f, 0x86, 0xb6, 0x14, 0x7b, 0xc4, 0x47, 0xc4, 0xe9, - 0xe0, 0x23, 0x44, 0xef, 0x43, 0xfb, 0x80, 0xa1, 0xea, 0x07, 0xd8, 0x0c, 0x7d, 0x8f, 0xb3, 0x43, - 0x59, 0x1a, 0x7b, 0x18, 0xd8, 0xc3, 0x21, 0x0e, 0xb6, 0x7d, 0xcf, 0xe2, 0x61, 0xf8, 0x81, 0x20, - 0x93, 0x0c, 0x25, 0xca, 0x90, 0x04, 0x62, 0x31, 0x73, 0xe2, 0x48, 0x8c, 0x6e, 0x45, 0x88, 0x4d, - 0x27, 0xd9, 0x88, 0xc4, 0x1b, 0x76, 0x58, 0xc3, 0xfe, 0xe4, 0xca, 0xa8, 0x22, 0x30, 0xd2, 0xff, - 0x5c, 0x03, 0x14, 0x67, 0xc9, 0xb4, 0x1e, 0x40, 0x35, 0x3a, 0x3b, 0x54, 0x53, 0x38, 0xe5, 0xab, - 0x50, 0xb7, 0xc4, 0x48, 0x6e, 0x82, 0x12, 0x00, 0xf5, 0x91, 0x94, 0xe8, 0x3e, 0x91, 0x3c, 0x6c, - 0x89, 0x2c, 0x94, 0x01, 0xef, 0x53, 0x98, 0x1c, 0x57, 0x55, 0xb2, 0x71, 0x55, 0xba, 0xf0, 0x57, - 0x95, 0x0a, 0x7f, 0xfa, 0x8f, 0x4a, 0xd0, 0xa1, 0x2e, 0x64, 0x3b, 0x29, 0xf1, 0x14, 0x22, 0xfa, - 0x06, 0xb4, 0xf8, 0x7d, 0x0a, 0x89, 0xf0, 0xe6, 0xd3, 0xd4, 0x64, 0xe8, 0x4d, 0x58, 0x66, 0x9d, - 0x02, 0x1c, 0x8e, 0x9d, 0x24, 0x01, 0x63, 0x59, 0x08, 0x7a, 0xca, 0x7c, 0x17, 0x69, 0x12, 0x23, - 0x1e, 0xc1, 0xe5, 0xa1, 0xe3, 0x1f, 0x98, 0x4e, 0x5f, 0x66, 0x0f, 0xe3, 0x61, 0x01, 0x89, 0x5f, - 0x66, 0xc3, 0xf7, 0xd3, 0x3c, 0x0c, 0xd1, 0x1d, 0x68, 0x85, 0x18, 0x3f, 0x49, 0xf2, 0xb2, 0x6a, - 0x91, 0xbc, 0xac, 0x49, 0xc6, 0xc4, 0x89, 0xd9, 0xef, 0x69, 0xb0, 0x90, 0x29, 0xdb, 0x67, 0x6b, - 0x08, 0x5a, 0xbe, 0x86, 0x70, 0x0b, 0xaa, 0xc4, 0x52, 0x31, 0xdf, 0xd2, 0x56, 0xe7, 0xb7, 0xf2, - 0xac, 0x06, 0x1b, 0x80, 0x36, 0x61, 0x49, 0x71, 0x58, 0xcf, 0xd9, 0x8f, 0xf2, 0x67, 0xf5, 0xfa, - 0x8f, 0x2b, 0xd0, 0x48, 0x6d, 0xc5, 0x94, 0xf2, 0xc7, 0x33, 0x29, 0xbf, 0x4e, 0x3a, 0xc7, 0x25, - 0x22, 0xe7, 0x62, 0x97, 0x25, 0x6c, 0x3c, 0x7b, 0x74, 0xb1, 0x4b, 0xd3, 0xb5, 0x74, 0x26, 0x36, - 0x27, 0x65, 0x62, 0x99, 0x5c, 0x75, 0xfe, 0x8c, 0x5c, 0xb5, 0x26, 0xe7, 0xaa, 0x92, 0x0a, 0xd5, - 0xb3, 0x2a, 0x54, 0xb4, 0x22, 0xf1, 0x26, 0x2c, 0x0d, 0x58, 0x79, 0xfb, 0xce, 0xe9, 0x76, 0xdc, - 0xc4, 0x83, 0x52, 0x55, 0x13, 0xba, 0x9b, 0x14, 0x09, 0x19, 0x97, 0x59, 0xb6, 0xa0, 0x4e, 0x85, - 0x39, 0x6f, 0x18, 0x93, 0x85, 0x65, 0xa6, 0x5f, 0xd9, 0x5a, 0x48, 0xeb, 0x42, 0xb5, 0x90, 0x17, - 0xa0, 0x21, 0x22, 0x15, 0xa2, 0xe9, 0x6d, 0x66, 0xf4, 0x84, 0x19, 0xb0, 0x42, 0xc9, 0x0e, 0x2c, - 0xc8, 0x07, 0x00, 0xd9, 0x42, 0x42, 0x27, 0x5f, 0x48, 0xb8, 0x02, 0xf3, 0x76, 0xd8, 0x3f, 0x34, - 0x9f, 0xe0, 0xee, 0x22, 0x6d, 0x9d, 0xb3, 0xc3, 0xbb, 0xe6, 0x13, 0xac, 0xff, 0x53, 0x19, 0xda, - 0x89, 0x83, 0x2d, 0x6c, 0x41, 0x8a, 0x5c, 0x58, 0xd9, 0x83, 0x4e, 0x12, 0xf7, 0xd0, 0x1d, 0x3e, - 0x33, 0x79, 0xce, 0x9e, 0xaa, 0x2d, 0x8c, 0x32, 0xfa, 0x2a, 0xb9, 0xfb, 0xca, 0xb9, 0xdc, 0xfd, - 0x8c, 0xa7, 0xde, 0x37, 0x61, 0x25, 0xf6, 0xbd, 0xd2, 0xb2, 0x59, 0x82, 0xb5, 0x2c, 0x1a, 0x1f, - 0xa4, 0x97, 0x3f, 0xc1, 0x04, 0xcc, 0x4f, 0x32, 0x01, 0x59, 0x11, 0xa8, 0xe5, 0x44, 0x20, 0x7f, - 0xf8, 0x5e, 0x57, 0x1c, 0xbe, 0xeb, 0x8f, 0x60, 0x89, 0xd6, 0x7d, 0xc3, 0x41, 0x60, 0x1f, 0xe0, - 0x38, 0x05, 0x28, 0xc2, 0xd6, 0x1e, 0xd4, 0x32, 0x59, 0x44, 0xfc, 0xad, 0xff, 0xaa, 0x06, 0x97, - 0xf3, 0xf3, 0x52, 0x89, 0x49, 0x0c, 0x89, 0x26, 0x19, 0x92, 0x5f, 0x80, 0xa5, 0x54, 0x44, 0x29, - 0xcd, 0x3c, 0x21, 0x02, 0x57, 0x10, 0x6e, 0xa0, 0x64, 0x0e, 0x01, 0xd3, 0x7f, 0xac, 0xc5, 0xe5, - 0x73, 0x02, 0x1b, 0xd2, 0x43, 0x05, 0xe2, 0xd7, 0x7c, 0xcf, 0xb1, 0xbd, 0xb8, 0x52, 0xc2, 0xd7, - 0xc8, 0x80, 0xbc, 0x52, 0xf2, 0x1e, 0x2c, 0xf0, 0x4e, 0xb1, 0x7b, 0x2a, 0x18, 0x90, 0xb5, 0xd9, - 0xb8, 0xd8, 0x31, 0xbd, 0x0c, 0x6d, 0x5e, 0xed, 0x17, 0xf8, 0xca, 0xaa, 0x33, 0x80, 0xef, 0x42, - 0x47, 0x74, 0x3b, 0xaf, 0x43, 0x5c, 0xe0, 0x03, 0xe3, 0xc0, 0xee, 0x57, 0x34, 0xe8, 0xca, 0xee, - 0x31, 0xb5, 0xfc, 0xf3, 0x87, 0x77, 0x6f, 0xcb, 0x47, 0xb8, 0x2f, 0x9f, 0x41, 0x4f, 0x82, 0x47, - 0x1c, 0xe4, 0xfe, 0x66, 0x89, 0x9e, 0xc7, 0x93, 0x54, 0x6f, 0xc7, 0x0e, 0xa3, 0xc0, 0x3e, 0x18, - 0xcf, 0x76, 0xa8, 0x68, 0x42, 0x63, 0x70, 0x84, 0x07, 0x4f, 0x46, 0xbe, 0x9d, 0x70, 0xe5, 0x5d, - 0x15, 0x4d, 0x93, 0xd1, 0x6e, 0x6c, 0x27, 0x33, 0xb0, 0x63, 0x9b, 0xf4, 0x9c, 0xbd, 0xef, 0x43, - 0x27, 0xdb, 0x21, 0x7d, 0xe8, 0x52, 0x67, 0x87, 0x2e, 0x37, 0xe5, 0x43, 0x97, 0x29, 0x91, 0x46, - 0xea, 0xcc, 0xe5, 0x2f, 0x4a, 0xf0, 0x65, 0x25, 0x6d, 0xb3, 0x64, 0x49, 0x93, 0xea, 0x48, 0x77, - 0xa0, 0x96, 0x49, 0x6a, 0x5f, 0x39, 0x83, 0x7f, 0xbc, 0x96, 0xca, 0x6a, 0x7a, 0x61, 0x12, 0x5b, - 0x25, 0x0a, 0x5f, 0x99, 0x3c, 0x07, 0xd7, 0x3b, 0x69, 0x0e, 0x31, 0x0e, 0xdd, 0x86, 0x26, 0x2b, - 0x18, 0xf4, 0x8f, 0x6d, 0x7c, 0x22, 0xce, 0x22, 0xaf, 0x2b, 0x4d, 0x33, 0xed, 0xf7, 0xd8, 0xc6, - 0x27, 0x46, 0xc3, 0x89, 0x7f, 0x87, 0xfa, 0x7f, 0x95, 0x01, 0x92, 0x36, 0x92, 0x9d, 0x25, 0x3a, - 0xcf, 0x95, 0x38, 0x05, 0x21, 0xb1, 0x84, 0x1c, 0xb9, 0x8a, 0x4f, 0x64, 0x24, 0x47, 0x0a, 0x96, - 0x1d, 0x46, 0x7c, 0x5f, 0x36, 0xcf, 0xa6, 0x45, 0x6c, 0x11, 0x61, 0x19, 0x97, 0x99, 0x30, 0x81, - 0xa0, 0x37, 0x00, 0x0d, 0x03, 0xff, 0xc4, 0xf6, 0x86, 0xe9, 0x7c, 0x83, 0xa5, 0x25, 0x8b, 0xbc, - 0x25, 0x95, 0x70, 0xfc, 0x00, 0x3a, 0x99, 0xee, 0x62, 0x4b, 0x6e, 0x4e, 0x21, 0xe3, 0x9e, 0x34, - 0x17, 0x17, 0xdf, 0x05, 0x19, 0x43, 0xd8, 0xeb, 0x43, 0x27, 0x4b, 0xaf, 0xe2, 0xdc, 0xf0, 0x6b, - 0xb2, 0x08, 0x9f, 0x65, 0x69, 0xc8, 0x34, 0x29, 0x21, 0xee, 0x99, 0xb0, 0xac, 0xa2, 0x44, 0x81, - 0xe4, 0xc2, 0x7a, 0xf2, 0x6e, 0x1c, 0xec, 0xd2, 0x1d, 0x9e, 0xe4, 0x3f, 0x52, 0xb5, 0xe0, 0x92, - 0x54, 0x0b, 0xd6, 0xff, 0x4e, 0x03, 0x94, 0x17, 0x6c, 0xd4, 0x86, 0x52, 0x3c, 0x49, 0x69, 0x77, - 0x27, 0x23, 0x48, 0xa5, 0x9c, 0x20, 0x5d, 0x85, 0x7a, 0xec, 0xcf, 0xb9, 0xf1, 0x4e, 0x00, 0x69, - 0x31, 0xab, 0xc8, 0x62, 0x96, 0x22, 0xac, 0x2a, 0x17, 0xa9, 0xdf, 0x84, 0x65, 0xc7, 0x0c, 0xa3, - 0x3e, 0xab, 0x85, 0x47, 0xb6, 0x8b, 0xc3, 0xc8, 0x74, 0x47, 0x34, 0x58, 0xae, 0x18, 0x88, 0xb4, - 0xed, 0x90, 0xa6, 0x87, 0xa2, 0x45, 0x3f, 0x02, 0x94, 0x57, 0xaf, 0x34, 0x6e, 0x4d, 0xc6, 0x3d, - 0x6d, 0x4d, 0x29, 0xda, 0xca, 0xf2, 0xa6, 0xfd, 0x41, 0x19, 0x50, 0x12, 0xe3, 0xc4, 0x27, 0xad, - 0x45, 0x02, 0x83, 0x4d, 0x58, 0xca, 0x47, 0x40, 0x22, 0xec, 0x43, 0xb9, 0xf8, 0x47, 0x15, 0xab, - 0x94, 0x55, 0x17, 0x05, 0xdf, 0x8a, 0x0d, 0x22, 0x0b, 0xe8, 0xae, 0x4f, 0x2c, 0xd5, 0xcb, 0x36, - 0xf1, 0xfb, 0xd9, 0x0b, 0x86, 0x4c, 0xc3, 0x6e, 0x29, 0x8d, 0x57, 0x6e, 0xc9, 0x53, 0x6f, 0x17, - 0x4a, 0xa1, 0xe6, 0xdc, 0x79, 0x42, 0xcd, 0xd9, 0x6f, 0x15, 0xfe, 0x4b, 0x09, 0x16, 0xe3, 0x8d, - 0x3c, 0x17, 0x93, 0xa6, 0x1f, 0x8a, 0x3f, 0x67, 0xae, 0x7c, 0xac, 0xe6, 0xca, 0xd7, 0xcf, 0x0c, - 0xf7, 0x8b, 0x32, 0x65, 0xf6, 0x9d, 0xfd, 0x14, 0xe6, 0x79, 0xe1, 0x36, 0x67, 0x28, 0x8a, 0x24, - 0xd4, 0xcb, 0x50, 0x25, 0x76, 0x49, 0x54, 0xdd, 0xd8, 0x07, 0xdb, 0xd2, 0xf4, 0x75, 0x53, 0x6e, - 0x2b, 0x5a, 0xd2, 0x6d, 0x53, 0xfd, 0x3f, 0x34, 0x80, 0xfd, 0x53, 0x6f, 0x70, 0x9b, 0x29, 0xe9, - 0x9b, 0x50, 0x99, 0x76, 0xc7, 0x89, 0xf4, 0xa6, 0xb2, 0x45, 0x7b, 0x16, 0x60, 0xae, 0x54, 0x32, - 0x28, 0x67, 0x4b, 0x06, 0x93, 0x92, 0xfd, 0xc9, 0xa6, 0xec, 0xeb, 0x50, 0x21, 0x81, 0x1e, 0xbf, - 0x23, 0x54, 0xe8, 0xc0, 0x93, 0x0e, 0xd0, 0xff, 0x5a, 0x83, 0x2b, 0x84, 0xfa, 0x67, 0x13, 0x15, - 0x16, 0x61, 0x4d, 0xca, 0x5a, 0x96, 0x65, 0x6b, 0x79, 0x0b, 0xe6, 0x59, 0xba, 0x2f, 0xe2, 0x9b, - 0xeb, 0x93, 0xf6, 0x9a, 0x71, 0xc6, 0x10, 0xdd, 0xf5, 0x47, 0xd0, 0x32, 0xd2, 0x2c, 0x44, 0x08, - 0x2a, 0xa9, 0xdb, 0x79, 0xf4, 0x37, 0x4d, 0x98, 0xcc, 0x91, 0x39, 0xb0, 0xa3, 0x53, 0x4a, 0x58, - 0xd5, 0x88, 0xbf, 0xd5, 0xf2, 0xa2, 0xff, 0xaf, 0x06, 0x97, 0xc5, 0xf1, 0x18, 0x97, 0xc6, 0x8b, - 0xef, 0xcd, 0x16, 0xac, 0x70, 0xd1, 0xcb, 0xc8, 0x20, 0x0b, 0x8b, 0x96, 0x18, 0x4c, 0x5e, 0xc6, - 0x16, 0xac, 0x44, 0x66, 0x30, 0xc4, 0x51, 0x76, 0x0c, 0xdb, 0xb9, 0x25, 0xd6, 0x28, 0x8f, 0x29, - 0x72, 0x3c, 0xf9, 0x02, 0xbb, 0xd6, 0xc2, 0x2d, 0x09, 0x17, 0x26, 0xf0, 0xc6, 0x2e, 0x5f, 0xa5, - 0x7e, 0x02, 0x57, 0xd9, 0xfd, 0xd8, 0x03, 0x99, 0xa2, 0x99, 0xaa, 0xd3, 0xca, 0x75, 0x67, 0x74, - 0xef, 0xf7, 0x35, 0xb8, 0x36, 0x01, 0xf3, 0x2c, 0x71, 0xf9, 0x7d, 0x25, 0xf6, 0x09, 0x59, 0x94, - 0x84, 0x97, 0xea, 0x4a, 0x86, 0xc8, 0x9f, 0x54, 0x60, 0x31, 0xd7, 0xe9, 0xdc, 0x32, 0xf7, 0x3a, - 0x20, 0xc2, 0x84, 0xf8, 0xb9, 0x15, 0x4d, 0x4c, 0xb9, 0x91, 0xef, 0x78, 0x63, 0x37, 0x7e, 0x6a, - 0x45, 0x72, 0x53, 0x64, 0xb3, 0xde, 0xac, 0x36, 0x1d, 0x73, 0xae, 0x32, 0xf9, 0xae, 0x7e, 0x8e, - 0xc0, 0x8d, 0xbd, 0xb1, 0xcb, 0xca, 0xd8, 0x9c, 0xcb, 0xcc, 0x70, 0x13, 0x54, 0x12, 0x18, 0x1d, - 0xc2, 0x22, 0xbd, 0xf4, 0x34, 0x8e, 0x86, 0x3e, 0x09, 0x8d, 0x29, 0x5d, 0xcc, 0x3d, 0x7c, 0xb3, - 0x30, 0xa6, 0x0f, 0xf9, 0x68, 0x42, 0x3c, 0x8f, 0x8e, 0x3d, 0x19, 0x2a, 0xf0, 0xd8, 0xde, 0xc0, - 0x77, 0x63, 0x3c, 0x73, 0xe7, 0xc4, 0xb3, 0xcb, 0x47, 0xcb, 0x78, 0xd2, 0xd0, 0xde, 0x36, 0xac, - 0x28, 0x97, 0x3e, 0xcd, 0x21, 0x55, 0xd3, 0x91, 0xf6, 0x1d, 0x58, 0x56, 0xad, 0xea, 0x02, 0x73, - 0xe4, 0x28, 0x3e, 0xcf, 0x1c, 0xfa, 0x9f, 0x94, 0xa0, 0xb5, 0x83, 0x1d, 0x1c, 0xe1, 0xe7, 0x7b, - 0x7a, 0x98, 0x3b, 0x0a, 0x2d, 0xe7, 0x8f, 0x42, 0x73, 0xe7, 0xba, 0x15, 0xc5, 0xb9, 0xee, 0xb5, - 0xf8, 0x38, 0x9b, 0xcc, 0x52, 0x95, 0x7d, 0x9d, 0x85, 0xde, 0x86, 0xe6, 0x28, 0xb0, 0x5d, 0x33, - 0x38, 0xed, 0x3f, 0xc1, 0xa7, 0x21, 0xf7, 0x60, 0x5d, 0x65, 0xd1, 0x6f, 0x77, 0x27, 0x34, 0x1a, - 0xbc, 0xf7, 0xfb, 0xf8, 0x94, 0x1e, 0x95, 0xc7, 0x61, 0x3b, 0xbb, 0xd4, 0x54, 0x31, 0x52, 0x90, - 0xf5, 0x55, 0xa8, 0xc7, 0x77, 0x47, 0x50, 0x0d, 0x2a, 0x77, 0xc7, 0x8e, 0xd3, 0xb9, 0x84, 0xea, - 0x50, 0xa5, 0x81, 0x7d, 0x47, 0x5b, 0xff, 0x36, 0xd4, 0xe3, 0xf3, 0x6f, 0xd4, 0x80, 0xf9, 0x47, - 0xde, 0xfb, 0x9e, 0x7f, 0xe2, 0x75, 0x2e, 0xa1, 0x79, 0x28, 0xdf, 0x76, 0x9c, 0x8e, 0x86, 0x5a, - 0x50, 0xdf, 0x8f, 0x02, 0x6c, 0x12, 0x9e, 0x75, 0x4a, 0xa8, 0x0d, 0xf0, 0x9e, 0x1d, 0x46, 0x7e, - 0x60, 0x0f, 0x4c, 0xa7, 0x53, 0x5e, 0xff, 0x14, 0xda, 0x72, 0x39, 0x14, 0x35, 0xa1, 0xb6, 0xe7, - 0x47, 0xdf, 0xf9, 0xc4, 0x0e, 0xa3, 0xce, 0x25, 0xd2, 0x7f, 0xcf, 0x8f, 0x1e, 0x04, 0x38, 0xc4, - 0x5e, 0xd4, 0xd1, 0x10, 0xc0, 0xdc, 0x87, 0xde, 0x8e, 0x1d, 0x3e, 0xe9, 0x94, 0xd0, 0x12, 0x3f, - 0xe9, 0x30, 0x9d, 0x5d, 0x5e, 0x63, 0xec, 0x94, 0xc9, 0xf0, 0xf8, 0xab, 0x82, 0x3a, 0xd0, 0x8c, - 0xbb, 0xdc, 0x7b, 0xf0, 0xa8, 0x53, 0x25, 0xd4, 0xb3, 0x9f, 0x73, 0xeb, 0x16, 0x74, 0xb2, 0x27, - 0x74, 0x64, 0x4e, 0xb6, 0x88, 0x18, 0xd4, 0xb9, 0x44, 0x56, 0xc6, 0x8f, 0x48, 0x3b, 0x1a, 0x5a, - 0x80, 0x46, 0xea, 0xc0, 0xb1, 0x53, 0x22, 0x80, 0x7b, 0xc1, 0x68, 0xc0, 0x05, 0x8a, 0x91, 0x40, - 0xa4, 0x73, 0x87, 0xec, 0x44, 0x65, 0xfd, 0x0e, 0xd4, 0x44, 0xf0, 0x4c, 0xba, 0xf2, 0x2d, 0x22, - 0x9f, 0x9d, 0x4b, 0x68, 0x11, 0x5a, 0xd2, 0xab, 0xa0, 0x8e, 0x86, 0x10, 0xb4, 0xe5, 0x77, 0x7b, - 0x9d, 0xd2, 0xfa, 0x16, 0x40, 0x12, 0x84, 0x12, 0x72, 0x76, 0xbd, 0x63, 0xd3, 0xb1, 0x2d, 0x46, - 0x1b, 0x69, 0x22, 0xbb, 0x4b, 0x77, 0x87, 0x29, 0x6a, 0xa7, 0xb4, 0xbe, 0x0e, 0x35, 0x11, 0x58, - 0x11, 0xb8, 0x81, 0x5d, 0xff, 0x18, 0x33, 0xce, 0xec, 0x63, 0xb2, 0x95, 0x75, 0xa8, 0xde, 0x76, - 0xb1, 0x67, 0x75, 0x4a, 0x5b, 0xff, 0xbe, 0x04, 0xc0, 0xce, 0xd7, 0x7c, 0x3f, 0xb0, 0x90, 0x43, - 0xcf, 0xd9, 0xb7, 0x7d, 0x77, 0xe4, 0x7b, 0xa2, 0xf8, 0x1f, 0xa2, 0x8d, 0x4c, 0xd2, 0xcb, 0x3e, - 0xf2, 0x1d, 0xf9, 0x46, 0xf4, 0x5e, 0x52, 0xf6, 0xcf, 0x74, 0xd6, 0x2f, 0x21, 0x97, 0x62, 0x23, - 0x69, 0xe2, 0x43, 0x7b, 0xf0, 0x24, 0x3e, 0x94, 0x9b, 0xfc, 0x78, 0x2e, 0xd3, 0x55, 0xe0, 0xbb, - 0xa1, 0xc4, 0xb7, 0x1f, 0x05, 0xb6, 0x37, 0x14, 0xfe, 0x4f, 0xbf, 0x84, 0x9e, 0x66, 0x9e, 0xee, - 0x09, 0x84, 0x5b, 0x45, 0x5e, 0xeb, 0x5d, 0x0c, 0xa5, 0x03, 0x0b, 0x99, 0xd7, 0xcc, 0x68, 0x5d, - 0xfd, 0x94, 0x42, 0xf5, 0xf2, 0xba, 0xf7, 0x5a, 0xa1, 0xbe, 0x31, 0x36, 0x1b, 0xda, 0xf2, 0x8b, - 0x5d, 0xf4, 0x73, 0x93, 0x26, 0xc8, 0x3d, 0xe6, 0xea, 0xad, 0x17, 0xe9, 0x1a, 0xa3, 0xfa, 0x88, - 0xc9, 0xea, 0x34, 0x54, 0xca, 0x87, 0x6f, 0xbd, 0xb3, 0x42, 0x0f, 0xfd, 0x12, 0xfa, 0x21, 0x89, - 0x12, 0x32, 0x4f, 0xce, 0xd0, 0xeb, 0x6a, 0xcf, 0xa6, 0x7e, 0x99, 0x36, 0x0d, 0xc3, 0x47, 0x59, - 0x4d, 0x9b, 0x4c, 0x7d, 0xee, 0x11, 0x6a, 0x71, 0xea, 0x53, 0xd3, 0x9f, 0x45, 0xfd, 0xb9, 0x31, - 0x38, 0x2c, 0xf5, 0x50, 0x3c, 0x76, 0xc9, 0x8a, 0x72, 0x12, 0xf9, 0x4f, 0x7e, 0x19, 0x33, 0x0d, - 0xdb, 0x98, 0x2a, 0x69, 0xf6, 0x60, 0xf9, 0x8d, 0x09, 0x25, 0x6b, 0xf5, 0x2b, 0xbb, 0xde, 0x46, - 0xd1, 0xee, 0x69, 0x59, 0x96, 0x1f, 0x72, 0xa9, 0x59, 0xa4, 0x7c, 0x7c, 0xa6, 0x96, 0x65, 0xf5, - 0xbb, 0x30, 0xfd, 0x12, 0x7a, 0x28, 0xd9, 0x75, 0xf4, 0xca, 0x24, 0x51, 0x90, 0x6f, 0x9a, 0x4c, - 0xdb, 0xb7, 0x5f, 0x04, 0xc4, 0x34, 0xd5, 0x3b, 0xb4, 0x87, 0xe3, 0xc0, 0x64, 0x62, 0x3c, 0xc9, - 0xb8, 0xe5, 0xbb, 0x0a, 0x34, 0x5f, 0x39, 0xc7, 0x88, 0x78, 0x49, 0x7d, 0x80, 0x7b, 0x38, 0xfa, - 0x00, 0x47, 0x81, 0x3d, 0x08, 0xb3, 0x2b, 0x4a, 0xec, 0x37, 0xef, 0x20, 0x50, 0xbd, 0x3a, 0xb5, - 0x5f, 0x8c, 0xe0, 0x00, 0x1a, 0xf7, 0x48, 0x06, 0x45, 0xa3, 0xc2, 0x10, 0x4d, 0x1c, 0x29, 0x7a, - 0x08, 0x14, 0x6b, 0xd3, 0x3b, 0xa6, 0x8d, 0x67, 0xe6, 0x51, 0x1b, 0x9a, 0xc8, 0xd8, 0xfc, 0x53, - 0x3b, 0xb5, 0xf1, 0x9c, 0xf0, 0x4a, 0x8e, 0xad, 0x88, 0x1e, 0x9b, 0xbc, 0x87, 0x4d, 0x27, 0x3a, - 0x9a, 0xb0, 0xa2, 0x54, 0x8f, 0xb3, 0x57, 0x24, 0x75, 0x8c, 0x71, 0x60, 0x58, 0x62, 0x5a, 0x28, - 0xa7, 0x9e, 0x9b, 0xea, 0x29, 0xf2, 0x3d, 0x0b, 0x8a, 0x9e, 0x09, 0x8b, 0x3b, 0x81, 0x3f, 0x92, - 0x91, 0xbc, 0xa1, 0x44, 0x92, 0xeb, 0x57, 0x10, 0xc5, 0xf7, 0xa0, 0x29, 0x32, 0x7c, 0x9a, 0x93, - 0xa8, 0x77, 0x21, 0xdd, 0xa5, 0xe0, 0xc4, 0x1f, 0xc3, 0x42, 0xa6, 0x74, 0xa0, 0x66, 0xba, 0xba, - 0xbe, 0x30, 0x6d, 0xf6, 0x13, 0x40, 0xf4, 0xa5, 0xa2, 0xf4, 0x4a, 0x7a, 0x42, 0x7c, 0x93, 0xef, - 0x28, 0x90, 0x6c, 0x16, 0xee, 0x1f, 0x73, 0xfe, 0x97, 0x60, 0x45, 0x99, 0x9e, 0x67, 0x0d, 0x02, - 0xbf, 0x5a, 0x7a, 0x46, 0x0d, 0x21, 0x6b, 0x10, 0xce, 0x1c, 0x21, 0xf0, 0x6f, 0xfd, 0xf3, 0x02, - 0xd4, 0x69, 0x9c, 0x47, 0xb9, 0xf5, 0xb3, 0x30, 0xef, 0xd9, 0x86, 0x79, 0x1f, 0xc3, 0x42, 0xe6, - 0x89, 0x9d, 0x5a, 0x68, 0xd5, 0xef, 0xf0, 0x0a, 0x44, 0x2b, 0xf2, 0x23, 0x37, 0xb5, 0x2b, 0x54, - 0x3e, 0x84, 0x9b, 0x36, 0xf7, 0x63, 0xf6, 0x3a, 0x35, 0x3e, 0xef, 0x7f, 0x75, 0x62, 0x19, 0x5c, - 0xbe, 0x22, 0xfa, 0xd9, 0x47, 0x41, 0x5f, 0xec, 0x08, 0xf4, 0x63, 0x58, 0xc8, 0x3c, 0xc2, 0x50, - 0x4b, 0x8c, 0xfa, 0xa5, 0xc6, 0xb4, 0xd9, 0x7f, 0x8a, 0xc1, 0x93, 0x05, 0x4b, 0x8a, 0x3b, 0xef, - 0x68, 0x63, 0x52, 0x20, 0xaa, 0xbe, 0x1c, 0x3f, 0x7d, 0x41, 0x2d, 0x49, 0x4d, 0xb3, 0xfe, 0x26, - 0x21, 0x32, 0xfb, 0xf7, 0x2a, 0xbd, 0xd7, 0x8b, 0xfd, 0x17, 0x4b, 0xbc, 0xa0, 0x7d, 0x98, 0x63, - 0x4f, 0x33, 0xd0, 0x8b, 0xea, 0xe3, 0x80, 0xd4, 0xb3, 0x8d, 0xde, 0xb4, 0xc7, 0x1d, 0xe1, 0xd8, - 0x89, 0x42, 0x3a, 0x69, 0x95, 0x5a, 0x5f, 0xa4, 0x7c, 0x8c, 0x94, 0x7e, 0x23, 0xd1, 0x9b, 0xfe, - 0x2c, 0x42, 0x4c, 0xfa, 0xff, 0x3b, 0xc2, 0xfc, 0x84, 0x5e, 0xc2, 0xcf, 0x5e, 0x33, 0x41, 0x1b, - 0xe7, 0xbb, 0x2b, 0xd3, 0xdb, 0x2c, 0xdc, 0x3f, 0xc6, 0xfc, 0x03, 0xe8, 0x64, 0x8f, 0x76, 0xd0, - 0x6b, 0x93, 0xe4, 0x59, 0x85, 0x73, 0x8a, 0x30, 0x7f, 0x17, 0xe6, 0x58, 0x25, 0x52, 0x2d, 0x61, - 0x52, 0x95, 0x72, 0xca, 0x5c, 0x77, 0xbe, 0xfa, 0xd1, 0xd6, 0xd0, 0x8e, 0x8e, 0xc6, 0x07, 0xa4, - 0x65, 0x93, 0x75, 0x7d, 0xc3, 0xf6, 0xf9, 0xaf, 0x4d, 0xc1, 0xcb, 0x4d, 0x3a, 0x7a, 0x93, 0x22, - 0x18, 0x1d, 0x1c, 0xcc, 0xd1, 0xcf, 0x9b, 0xff, 0x17, 0x00, 0x00, 0xff, 0xff, 0xb3, 0x8a, 0x4d, - 0xc4, 0x73, 0x4e, 0x00, 0x00, + 0xc4, 0x81, 0x8f, 0xb4, 0x20, 0xb8, 0xc1, 0x8d, 0x03, 0x27, 0x40, 0x42, 0x20, 0x2e, 0x88, 0x23, + 0x17, 0x38, 0x20, 0x81, 0x10, 0x87, 0x15, 0x9a, 0x1b, 0x8a, 0x5f, 0x66, 0x46, 0x66, 0x94, 0x2b, + 0xed, 0xea, 0xde, 0x99, 0x41, 0xdc, 0x2a, 0x5f, 0x7c, 0xde, 0x8b, 0x78, 0xff, 0x17, 0x11, 0x05, + 0x8b, 0x4f, 0xc7, 0x38, 0x38, 0xed, 0x0f, 0x7c, 0x3f, 0xb0, 0x36, 0x46, 0x81, 0x1f, 0xf9, 0x08, + 0xb9, 0xb6, 0x73, 0x3c, 0x0e, 0xd9, 0xd7, 0x06, 0x6d, 0xef, 0x35, 0x07, 0xbe, 0xeb, 0xfa, 0x1e, + 0x83, 0xf5, 0x9a, 0xe9, 0x1e, 0xbd, 0xb6, 0xed, 0x45, 0x38, 0xf0, 0x4c, 0x47, 0xb4, 0x86, 0x83, + 0x23, 0xec, 0x9a, 0xfc, 0xab, 0xee, 0x86, 0x43, 0xfe, 0xb3, 0x63, 0x99, 0x91, 0x99, 0x46, 0xa5, + 0xff, 0xb2, 0x06, 0x97, 0xf7, 0x8f, 0xfc, 0x93, 0x6d, 0xdf, 0x71, 0xf0, 0x20, 0xb2, 0x7d, 0x2f, + 0x34, 0xf0, 0xd3, 0x31, 0x0e, 0x23, 0xf4, 0x26, 0x54, 0x0e, 0xcc, 0x10, 0x77, 0xb5, 0x55, 0x6d, + 0xad, 0xb1, 0x75, 0x75, 0x43, 0x22, 0x8a, 0x53, 0xf3, 0x41, 0x38, 0xbc, 0x63, 0x86, 0xd8, 0xa0, + 0x3d, 0x11, 0x82, 0x8a, 0x75, 0xb0, 0xbb, 0xd3, 0x2d, 0xad, 0x6a, 0x6b, 0x65, 0x83, 0xfe, 0x46, + 0x2f, 0x41, 0x6b, 0x10, 0xcf, 0xbd, 0xbb, 0x13, 0x76, 0xcb, 0xab, 0xe5, 0xb5, 0xb2, 0x21, 0x03, + 0xf5, 0x7f, 0xd1, 0xe0, 0x4a, 0x8e, 0x8c, 0x70, 0xe4, 0x7b, 0x21, 0x46, 0x37, 0x61, 0x2e, 0x8c, + 0xcc, 0x68, 0x1c, 0x72, 0x4a, 0xbe, 0xaa, 0xa4, 0x64, 0x9f, 0x76, 0x31, 0x78, 0xd7, 0x3c, 0xda, + 0x92, 0x02, 0x2d, 0xfa, 0x1a, 0x2c, 0xdb, 0xde, 0x07, 0xd8, 0xf5, 0x83, 0xd3, 0xfe, 0x08, 0x07, + 0x03, 0xec, 0x45, 0xe6, 0x10, 0x0b, 0x1a, 0x97, 0x44, 0xdb, 0x83, 0xa4, 0x09, 0xbd, 0x05, 0x57, + 0x18, 0xc3, 0x42, 0x1c, 0x1c, 0xdb, 0x03, 0xdc, 0x37, 0x8f, 0x4d, 0xdb, 0x31, 0x0f, 0x1c, 0xdc, + 0xad, 0xac, 0x96, 0xd7, 0x6a, 0xc6, 0x0a, 0x6d, 0xde, 0x67, 0xad, 0xb7, 0x45, 0xa3, 0xfe, 0x47, + 0x1a, 0xac, 0x90, 0x15, 0x3e, 0x30, 0x83, 0xc8, 0x7e, 0x0e, 0xfb, 0xac, 0x43, 0x33, 0xbd, 0xb6, + 0x6e, 0x99, 0xb6, 0x49, 0x30, 0xd2, 0x67, 0x24, 0xd0, 0x93, 0x3d, 0xa9, 0xd0, 0x65, 0x4a, 0x30, + 0xfd, 0x0f, 0xb9, 0x40, 0xa4, 0xe9, 0x9c, 0x85, 0x11, 0x59, 0x9c, 0xa5, 0x3c, 0xce, 0x0b, 0xb0, + 0x41, 0xff, 0xfb, 0x32, 0xac, 0xdc, 0xf7, 0x4d, 0x2b, 0x11, 0x98, 0x9f, 0xfd, 0x76, 0x7e, 0x07, + 0xe6, 0x98, 0xa2, 0x75, 0x2b, 0x14, 0xd7, 0xcb, 0x32, 0x2e, 0xae, 0x84, 0x09, 0x85, 0xfb, 0x14, + 0x60, 0xf0, 0x41, 0xe8, 0x65, 0x68, 0x07, 0x78, 0xe4, 0xd8, 0x03, 0xb3, 0xef, 0x8d, 0xdd, 0x03, + 0x1c, 0x74, 0xab, 0xab, 0xda, 0x5a, 0xd5, 0x68, 0x71, 0xe8, 0x1e, 0x05, 0xa2, 0x1f, 0x43, 0xeb, + 0xd0, 0xc6, 0x8e, 0xd5, 0xb7, 0x3d, 0x0b, 0x7f, 0xb2, 0xbb, 0xd3, 0x9d, 0x5b, 0x2d, 0xaf, 0x35, + 0xb6, 0xde, 0xde, 0xc8, 0x1b, 0x89, 0x0d, 0xe5, 0x8e, 0x6c, 0xdc, 0x25, 0xc3, 0x77, 0xd9, 0xe8, + 0xef, 0x79, 0x51, 0x70, 0x6a, 0x34, 0x0f, 0x53, 0x20, 0xd4, 0x85, 0xf9, 0x00, 0x1f, 0x06, 0x38, + 0x3c, 0xea, 0xce, 0xaf, 0x6a, 0x6b, 0x35, 0x43, 0x7c, 0xa2, 0x57, 0x61, 0x21, 0xc0, 0xa1, 0x3f, + 0x0e, 0x06, 0xb8, 0x3f, 0x0c, 0xfc, 0xf1, 0x28, 0xec, 0xd6, 0x56, 0xcb, 0x6b, 0x75, 0xa3, 0x2d, + 0xc0, 0xf7, 0x28, 0xb4, 0xf7, 0x2e, 0x2c, 0xe6, 0xb0, 0xa0, 0x0e, 0x94, 0x9f, 0xe0, 0x53, 0xca, + 0x88, 0xb2, 0x41, 0x7e, 0xa2, 0x65, 0xa8, 0x1e, 0x9b, 0xce, 0x18, 0xf3, 0xad, 0x66, 0x1f, 0xdf, + 0x2e, 0xdd, 0xd2, 0xf4, 0xdf, 0xd5, 0xa0, 0x6b, 0x60, 0x07, 0x9b, 0x21, 0xfe, 0x3c, 0x59, 0x7a, + 0x19, 0xe6, 0x3c, 0xdf, 0xc2, 0xbb, 0x3b, 0x94, 0xa5, 0x65, 0x83, 0x7f, 0xe9, 0x9f, 0x69, 0xb0, + 0x7c, 0x0f, 0x47, 0x44, 0xb6, 0xed, 0x30, 0xb2, 0x07, 0xb1, 0xf2, 0x7e, 0x07, 0xca, 0x01, 0x7e, + 0xca, 0x29, 0x7b, 0x4d, 0xa6, 0x2c, 0xb6, 0xca, 0xaa, 0x91, 0x06, 0x19, 0x87, 0x5e, 0x84, 0xa6, + 0xe5, 0x3a, 0xfd, 0xc1, 0x91, 0xe9, 0x79, 0xd8, 0x61, 0xda, 0x51, 0x37, 0x1a, 0x96, 0xeb, 0x6c, + 0x73, 0x10, 0xba, 0x0e, 0x10, 0xe2, 0xa1, 0x8b, 0xbd, 0x28, 0xb1, 0x9e, 0x29, 0x08, 0x5a, 0x87, + 0xc5, 0xc3, 0xc0, 0x77, 0xfb, 0xe1, 0x91, 0x19, 0x58, 0x7d, 0x07, 0x9b, 0x16, 0x0e, 0x28, 0xf5, + 0x35, 0x63, 0x81, 0x34, 0xec, 0x13, 0xf8, 0x7d, 0x0a, 0x46, 0x37, 0xa1, 0x1a, 0x0e, 0xfc, 0x11, + 0xa6, 0x92, 0xd6, 0xde, 0xba, 0xa6, 0x92, 0xa1, 0x1d, 0x33, 0x32, 0xf7, 0x49, 0x27, 0x83, 0xf5, + 0xd5, 0xff, 0x9b, 0xab, 0xda, 0x17, 0xdc, 0x72, 0xa5, 0xd4, 0xb1, 0xfa, 0x6c, 0xd4, 0x71, 0xae, + 0x90, 0x3a, 0xce, 0x9f, 0xad, 0x8e, 0xb9, 0x5d, 0x3b, 0x8f, 0x3a, 0xd6, 0xa6, 0xaa, 0x63, 0xfd, + 0xf9, 0xa8, 0xe3, 0x5f, 0x25, 0xea, 0xf8, 0x45, 0x67, 0x7b, 0xa2, 0xb2, 0x55, 0x49, 0x65, 0xff, + 0x58, 0x83, 0xaf, 0xdc, 0xc3, 0x51, 0x4c, 0x3e, 0xd1, 0x40, 0xfc, 0x05, 0x75, 0xba, 0x7f, 0xa6, + 0x41, 0x4f, 0x45, 0xeb, 0x2c, 0x8e, 0xf7, 0x23, 0xb8, 0x1c, 0xe3, 0xe8, 0x5b, 0x38, 0x1c, 0x04, + 0xf6, 0x88, 0xb2, 0x91, 0x1a, 0x99, 0xc6, 0xd6, 0x0d, 0x95, 0xc4, 0x66, 0x29, 0x58, 0x89, 0xa7, + 0xd8, 0x49, 0xcd, 0xa0, 0xff, 0xba, 0x06, 0x2b, 0xc4, 0xa8, 0x71, 0x2b, 0xe4, 0x1d, 0xfa, 0x17, + 0xdf, 0x57, 0xd9, 0xbe, 0x95, 0x72, 0xf6, 0xad, 0xc0, 0x1e, 0xd3, 0x28, 0x36, 0x4b, 0xcf, 0x2c, + 0x7b, 0xf7, 0x0d, 0xa8, 0xda, 0xde, 0xa1, 0x2f, 0xb6, 0xea, 0x05, 0xd5, 0x56, 0xa5, 0x91, 0xb1, + 0xde, 0xba, 0xc7, 0xa8, 0x48, 0x0c, 0xee, 0x0c, 0xe2, 0x96, 0x5d, 0x76, 0x49, 0xb1, 0xec, 0x5f, + 0xd3, 0xe0, 0x4a, 0x0e, 0xe1, 0x2c, 0xeb, 0x7e, 0x07, 0xe6, 0xa8, 0x1b, 0x11, 0x0b, 0x7f, 0x49, + 0xb9, 0xf0, 0x14, 0xba, 0xfb, 0x76, 0x18, 0x19, 0x7c, 0x8c, 0xee, 0x43, 0x27, 0xdb, 0x46, 0x1c, + 0x1c, 0x77, 0x6e, 0x7d, 0xcf, 0x74, 0xd9, 0x06, 0xd4, 0x8d, 0x06, 0x87, 0xed, 0x99, 0x2e, 0x46, + 0x5f, 0x81, 0x1a, 0x51, 0xd9, 0xbe, 0x6d, 0x09, 0xf6, 0xcf, 0x53, 0x15, 0xb6, 0x42, 0x74, 0x0d, + 0x80, 0x36, 0x99, 0x96, 0x15, 0x30, 0xdf, 0x57, 0x37, 0xea, 0x04, 0x72, 0x9b, 0x00, 0xf4, 0xdf, + 0xd1, 0xe0, 0xfa, 0xfe, 0xa9, 0x37, 0xd8, 0xc3, 0x27, 0xdb, 0x01, 0x36, 0x23, 0x9c, 0x58, 0xdb, + 0xe7, 0xba, 0xf1, 0x68, 0x15, 0x1a, 0x29, 0xfd, 0xe5, 0x22, 0x99, 0x06, 0xe9, 0xbf, 0xa5, 0x41, + 0x93, 0x98, 0xff, 0x0f, 0x70, 0x64, 0x12, 0x11, 0x41, 0xdf, 0x82, 0xba, 0xe3, 0x9b, 0x56, 0x3f, + 0x3a, 0x1d, 0x31, 0x6a, 0xda, 0x59, 0x6a, 0x12, 0x9f, 0xf1, 0xf0, 0x74, 0x84, 0x8d, 0x9a, 0xc3, + 0x7f, 0x15, 0xa2, 0x28, 0x6b, 0x65, 0xca, 0x0a, 0x2b, 0xf3, 0xd7, 0x55, 0xb8, 0xfc, 0x03, 0x33, + 0x1a, 0x1c, 0xed, 0xb8, 0x22, 0xba, 0xb8, 0xf8, 0x36, 0x25, 0x66, 0xb7, 0x94, 0x36, 0xbb, 0xcf, + 0xcc, 0xac, 0xc7, 0x2a, 0x58, 0x55, 0xa9, 0x20, 0xc9, 0x63, 0x37, 0x1e, 0x73, 0x29, 0x4a, 0xa9, + 0x60, 0x2a, 0x08, 0x98, 0xbb, 0x48, 0x10, 0xb0, 0x0d, 0x2d, 0xfc, 0xc9, 0xc0, 0x19, 0x13, 0x71, + 0xa4, 0xd8, 0x99, 0x77, 0xbf, 0xae, 0xc0, 0x9e, 0xd6, 0xff, 0x26, 0x1f, 0xb4, 0xcb, 0x69, 0x60, + 0xac, 0x76, 0x71, 0x64, 0x52, 0x17, 0xde, 0xd8, 0x5a, 0x9d, 0xc4, 0x6a, 0x21, 0x1f, 0x8c, 0xdd, + 0xe4, 0x0b, 0x5d, 0x85, 0x3a, 0x0f, 0x39, 0x76, 0x77, 0xba, 0x75, 0xba, 0x7d, 0x09, 0x00, 0x99, + 0xd0, 0xe2, 0xc6, 0x91, 0x53, 0x08, 0x94, 0xc2, 0x77, 0x54, 0x08, 0xd4, 0xcc, 0x4e, 0x53, 0x1e, + 0xf2, 0x00, 0x24, 0x4c, 0x81, 0x48, 0xee, 0xec, 0x1f, 0x1e, 0x3a, 0xb6, 0x87, 0xf7, 0x18, 0x87, + 0x1b, 0x94, 0x08, 0x19, 0x48, 0xc2, 0x94, 0x63, 0x1c, 0x84, 0xb6, 0xef, 0x75, 0x9b, 0xb4, 0x5d, + 0x7c, 0xf6, 0xfa, 0xb0, 0x98, 0x43, 0xa1, 0x88, 0x3e, 0xbe, 0x9e, 0x8e, 0x3e, 0xa6, 0xef, 0x71, + 0x2a, 0x3a, 0xf9, 0x89, 0x06, 0x2b, 0x8f, 0xbc, 0x70, 0x7c, 0x10, 0xaf, 0xed, 0xf3, 0x91, 0xe3, + 0xac, 0x71, 0xab, 0xe4, 0x8c, 0x1b, 0xd1, 0xb9, 0x05, 0xbe, 0x0a, 0xc2, 0x6e, 0x6a, 0x0a, 0xae, + 0x42, 0x3d, 0xf6, 0x6f, 0x7c, 0x43, 0x12, 0x40, 0xd6, 0xb6, 0x94, 0x72, 0xb6, 0xa5, 0x10, 0x69, + 0x22, 0x5a, 0xa9, 0xa4, 0xa2, 0x95, 0x6b, 0x00, 0x87, 0xce, 0x38, 0x3c, 0xea, 0x47, 0xb6, 0x8b, + 0x79, 0xb4, 0x54, 0xa7, 0x90, 0x87, 0xb6, 0x8b, 0xd1, 0x6d, 0x68, 0x1e, 0xd8, 0x9e, 0xe3, 0x0f, + 0xfb, 0x23, 0x33, 0x3a, 0x0a, 0x79, 0x9e, 0xa9, 0x62, 0x0b, 0x8d, 0x2d, 0xef, 0xd0, 0xbe, 0x46, + 0x83, 0x8d, 0x79, 0x40, 0x86, 0xa0, 0xeb, 0xd0, 0xf0, 0xc6, 0x6e, 0xdf, 0x3f, 0xec, 0x07, 0xfe, + 0x49, 0x48, 0xb3, 0xc9, 0xb2, 0x51, 0xf7, 0xc6, 0xee, 0x87, 0x87, 0x86, 0x7f, 0x42, 0xfc, 0x4b, + 0x9d, 0x78, 0x9a, 0xd0, 0xf1, 0x87, 0x2c, 0x93, 0x9c, 0x3e, 0x7f, 0x32, 0x80, 0x8c, 0xb6, 0xb0, + 0x13, 0x99, 0x74, 0x74, 0xbd, 0xd8, 0xe8, 0x78, 0x00, 0x7a, 0x05, 0xda, 0x03, 0xdf, 0x1d, 0x99, + 0x74, 0x87, 0xee, 0x06, 0xbe, 0x4b, 0x35, 0xa7, 0x6c, 0x64, 0xa0, 0x68, 0x1b, 0x1a, 0x34, 0xb4, + 0xe7, 0xea, 0xd5, 0xa0, 0x78, 0x74, 0x95, 0x7a, 0xa5, 0x42, 0x6c, 0x22, 0xa0, 0x60, 0x8b, 0x9f, + 0x21, 0x91, 0x0c, 0xa1, 0xa5, 0xa1, 0xfd, 0x29, 0xe6, 0x1a, 0xd2, 0xe0, 0xb0, 0x7d, 0xfb, 0x53, + 0x4c, 0xf2, 0x0d, 0xdb, 0x0b, 0x71, 0x10, 0x89, 0xec, 0xaf, 0xdb, 0xa2, 0xe2, 0xd3, 0x62, 0x50, + 0x2e, 0xd8, 0x68, 0x07, 0xda, 0x61, 0x64, 0x06, 0x51, 0x7f, 0xe4, 0x87, 0x54, 0x00, 0xba, 0x6d, + 0x2a, 0xdb, 0x99, 0xdc, 0xcd, 0x0d, 0x87, 0x44, 0xb0, 0x1f, 0xf0, 0x4e, 0x46, 0x8b, 0x0e, 0x12, + 0x9f, 0xe8, 0xbb, 0xd0, 0xc4, 0x9e, 0x95, 0xcc, 0xb1, 0x50, 0x64, 0x8e, 0x06, 0xf6, 0x2c, 0xf1, + 0xa1, 0xff, 0x57, 0x09, 0xda, 0xf2, 0x82, 0x89, 0x05, 0x60, 0x89, 0x8b, 0x90, 0x62, 0xf1, 0x49, + 0x96, 0x8f, 0x3d, 0xf3, 0xc0, 0xc1, 0x2c, 0x4b, 0xa2, 0x42, 0x5c, 0x23, 0xf3, 0x11, 0x18, 0x9d, + 0x80, 0x08, 0x23, 0xdb, 0x66, 0xaa, 0x39, 0x65, 0xba, 0xf4, 0x3a, 0x85, 0xd0, 0xa0, 0xa0, 0x0b, + 0xf3, 0x22, 0xc1, 0x62, 0x22, 0x2c, 0x3e, 0x49, 0xcb, 0xc1, 0xd8, 0xa6, 0x58, 0x99, 0x08, 0x8b, + 0x4f, 0xb4, 0x03, 0x4d, 0x36, 0xe5, 0xc8, 0x0c, 0x4c, 0x57, 0x08, 0xf0, 0x8b, 0x4a, 0x23, 0xf0, + 0x3e, 0x3e, 0x7d, 0x4c, 0xec, 0xc9, 0x03, 0xd3, 0x0e, 0x0c, 0xc6, 0xf0, 0x07, 0x74, 0x14, 0x5a, + 0x83, 0x0e, 0x9b, 0xe5, 0xd0, 0x76, 0x30, 0x57, 0x85, 0x79, 0x96, 0x65, 0x51, 0xf8, 0x5d, 0xdb, + 0xc1, 0x4c, 0xda, 0xe3, 0x25, 0x50, 0x16, 0xd7, 0x98, 0xb0, 0x53, 0x08, 0x65, 0xf0, 0x0d, 0x68, + 0xb1, 0x66, 0x61, 0x26, 0x99, 0x2d, 0x67, 0x34, 0x3e, 0x66, 0x30, 0x1a, 0xfc, 0x8c, 0x5d, 0xa6, + 0x2e, 0xc0, 0x96, 0xe3, 0x8d, 0x5d, 0xa2, 0x2c, 0xfa, 0xdf, 0x55, 0x60, 0x89, 0xd8, 0x0c, 0x6e, + 0x3e, 0x66, 0xf0, 0xd5, 0xd7, 0x00, 0xac, 0x30, 0xea, 0x4b, 0x76, 0xae, 0x6e, 0x85, 0x11, 0xb7, + 0xe4, 0xdf, 0x12, 0xae, 0xb6, 0x3c, 0x39, 0x31, 0xc8, 0xd8, 0xb0, 0xbc, 0xbb, 0xbd, 0x50, 0x09, + 0xec, 0x06, 0xb4, 0x78, 0x3a, 0x2b, 0xa5, 0x70, 0x4d, 0x06, 0xdc, 0x53, 0x5b, 0xe2, 0x39, 0x65, + 0x29, 0x2e, 0xe5, 0x72, 0xe7, 0x67, 0x73, 0xb9, 0xb5, 0xac, 0xcb, 0xbd, 0x0b, 0x0b, 0xd4, 0x8c, + 0xc4, 0xea, 0x23, 0xac, 0xcf, 0x14, 0xfd, 0x69, 0xd3, 0x51, 0xe2, 0x33, 0x4c, 0x7b, 0x4c, 0x90, + 0x3c, 0x26, 0xd9, 0x07, 0x0f, 0x63, 0xab, 0x1f, 0x05, 0xa6, 0x17, 0x1e, 0xe2, 0x80, 0x7a, 0xdc, + 0x9a, 0xd1, 0x24, 0xc0, 0x87, 0x1c, 0x86, 0xde, 0x01, 0xa0, 0x6b, 0x64, 0x15, 0x9c, 0xe6, 0xe4, + 0x0a, 0x0e, 0x15, 0x1a, 0x5a, 0xc1, 0xa1, 0x9b, 0x42, 0x7f, 0xea, 0xff, 0x50, 0x82, 0xcb, 0x3c, + 0xa3, 0x9f, 0x5d, 0xa0, 0x26, 0x39, 0x4d, 0xe1, 0x75, 0xca, 0x67, 0xe4, 0xc8, 0x95, 0x02, 0x01, + 0x61, 0x55, 0x11, 0x10, 0xca, 0x79, 0xe2, 0x5c, 0x2e, 0x4f, 0x8c, 0x6b, 0x5b, 0xf3, 0xc5, 0x6b, + 0x5b, 0x68, 0x19, 0xaa, 0x34, 0x79, 0xa1, 0x4c, 0xaf, 0x1b, 0xec, 0xa3, 0x10, 0x3b, 0xf4, 0xdf, + 0x2e, 0x41, 0x6b, 0x1f, 0x9b, 0xc1, 0xe0, 0x48, 0xec, 0xe3, 0x5b, 0xe9, 0x5a, 0xe0, 0x4b, 0x13, + 0x6a, 0x81, 0xd2, 0x90, 0x2f, 0x4d, 0x11, 0x90, 0x20, 0x88, 0xfc, 0xc8, 0x8c, 0xa9, 0xec, 0x7b, + 0x63, 0x97, 0x17, 0xc8, 0x16, 0x68, 0x03, 0x27, 0x75, 0x6f, 0xec, 0xea, 0xff, 0xa1, 0x41, 0xf3, + 0xe7, 0xc9, 0x34, 0x62, 0x63, 0x6e, 0xa5, 0x37, 0xe6, 0x95, 0x09, 0x1b, 0x63, 0xe0, 0x28, 0xb0, + 0xf1, 0x31, 0xfe, 0xd2, 0xd5, 0x47, 0xff, 0x46, 0x83, 0x1e, 0xc9, 0x42, 0x0d, 0x66, 0x30, 0x66, + 0xd7, 0xae, 0x1b, 0xd0, 0x3a, 0x96, 0xe2, 0xca, 0x12, 0x15, 0xce, 0xe6, 0x71, 0x3a, 0x6b, 0x36, + 0xa0, 0x23, 0xca, 0x95, 0x7c, 0xb1, 0xc2, 0x7e, 0xbf, 0xaa, 0xa2, 0x3a, 0x43, 0x1c, 0xb5, 0x7f, + 0x0b, 0x81, 0x0c, 0xd4, 0x7f, 0x43, 0x83, 0x25, 0x45, 0x47, 0x74, 0x05, 0xe6, 0x79, 0x86, 0xce, + 0x1d, 0x3d, 0xd3, 0x77, 0x8b, 0xb0, 0x27, 0xa9, 0x31, 0xd9, 0x56, 0x3e, 0x58, 0xb5, 0xd0, 0x0b, + 0xd0, 0x88, 0xf3, 0x15, 0x2b, 0xc7, 0x1f, 0x2b, 0x44, 0x3d, 0xa8, 0x71, 0x33, 0x28, 0x12, 0xc1, + 0xf8, 0x5b, 0x7f, 0x02, 0xe8, 0x1e, 0x4e, 0x9c, 0xce, 0x2c, 0x3b, 0x9a, 0xd8, 0x9b, 0x84, 0xd0, + 0xb4, 0x11, 0xb2, 0xf4, 0x7f, 0xd5, 0x60, 0x49, 0xc2, 0x36, 0x4b, 0x25, 0x25, 0x71, 0x8c, 0xa5, + 0x8b, 0x38, 0x46, 0xa9, 0x5a, 0x50, 0x3e, 0x57, 0xb5, 0xe0, 0x3a, 0x40, 0xbc, 0xff, 0x62, 0x47, + 0x53, 0x10, 0xfd, 0x2f, 0x35, 0xb8, 0xfc, 0x9e, 0xe9, 0x59, 0xfe, 0xe1, 0xe1, 0xec, 0xa2, 0xba, + 0x0d, 0x52, 0xea, 0x58, 0xb4, 0x5e, 0x26, 0xe7, 0x9b, 0xaf, 0xc1, 0x62, 0xc0, 0x3c, 0x93, 0x25, + 0xcb, 0x72, 0xd9, 0xe8, 0x88, 0x86, 0x58, 0x46, 0xff, 0xb4, 0x04, 0x88, 0xac, 0xfa, 0x8e, 0xe9, + 0x98, 0xde, 0x00, 0x5f, 0x9c, 0xf4, 0x97, 0xa1, 0x2d, 0xc5, 0x1e, 0xf1, 0x11, 0x71, 0x3a, 0xf8, + 0x08, 0xd1, 0xfb, 0xd0, 0x3e, 0x60, 0xa8, 0xfa, 0x01, 0x36, 0x43, 0xdf, 0xe3, 0xec, 0x50, 0x96, + 0xc6, 0x1e, 0x06, 0xf6, 0x70, 0x88, 0x83, 0x6d, 0xdf, 0xb3, 0x78, 0x18, 0x7e, 0x20, 0xc8, 0x24, + 0x43, 0x89, 0x32, 0x24, 0x81, 0x58, 0xcc, 0x9c, 0x38, 0x12, 0xa3, 0x5b, 0x11, 0x62, 0xd3, 0x49, + 0x36, 0x22, 0xf1, 0x86, 0x1d, 0xd6, 0xb0, 0x3f, 0xb9, 0x32, 0xaa, 0x08, 0x8c, 0xf4, 0x3f, 0xd7, + 0x00, 0xc5, 0x59, 0x32, 0xad, 0x07, 0x50, 0x8d, 0xce, 0x0e, 0xd5, 0x14, 0x4e, 0xf9, 0x2a, 0xd4, + 0x2d, 0x31, 0x92, 0x9b, 0xa0, 0x04, 0x40, 0x7d, 0x24, 0x25, 0xba, 0x4f, 0x24, 0x0f, 0x5b, 0x22, + 0x0b, 0x65, 0xc0, 0xfb, 0x14, 0x26, 0xc7, 0x55, 0x95, 0x6c, 0x5c, 0x95, 0x2e, 0xfc, 0x55, 0xa5, + 0xc2, 0x9f, 0xfe, 0x93, 0x12, 0x74, 0xa8, 0x0b, 0xd9, 0x4e, 0x4a, 0x3c, 0x85, 0x88, 0xbe, 0x01, + 0x2d, 0x7e, 0x9f, 0x42, 0x22, 0xbc, 0xf9, 0x34, 0x35, 0x19, 0x7a, 0x13, 0x96, 0x59, 0xa7, 0x00, + 0x87, 0x63, 0x27, 0x49, 0xc0, 0x58, 0x16, 0x82, 0x9e, 0x32, 0xdf, 0x45, 0x9a, 0xc4, 0x88, 0x47, + 0x70, 0x79, 0xe8, 0xf8, 0x07, 0xa6, 0xd3, 0x97, 0xd9, 0xc3, 0x78, 0x58, 0x40, 0xe2, 0x97, 0xd9, + 0xf0, 0xfd, 0x34, 0x0f, 0x43, 0x74, 0x07, 0x5a, 0x21, 0xc6, 0x4f, 0x92, 0xbc, 0xac, 0x5a, 0x24, + 0x2f, 0x6b, 0x92, 0x31, 0x71, 0x62, 0xf6, 0x7b, 0x1a, 0x2c, 0x64, 0xca, 0xf6, 0xd9, 0x1a, 0x82, + 0x96, 0xaf, 0x21, 0xdc, 0x82, 0x2a, 0xb1, 0x54, 0xcc, 0xb7, 0xb4, 0xd5, 0xf9, 0xad, 0x3c, 0xab, + 0xc1, 0x06, 0xa0, 0x4d, 0x58, 0x52, 0x1c, 0xd6, 0x73, 0xf6, 0xa3, 0xfc, 0x59, 0xbd, 0xfe, 0xd3, + 0x0a, 0x34, 0x52, 0x5b, 0x31, 0xa5, 0xfc, 0xf1, 0x4c, 0xca, 0xaf, 0x93, 0xce, 0x71, 0x89, 0xc8, + 0xb9, 0xd8, 0x65, 0x09, 0x1b, 0xcf, 0x1e, 0x5d, 0xec, 0xd2, 0x74, 0x2d, 0x9d, 0x89, 0xcd, 0x49, + 0x99, 0x58, 0x26, 0x57, 0x9d, 0x3f, 0x23, 0x57, 0xad, 0xc9, 0xb9, 0xaa, 0xa4, 0x42, 0xf5, 0xac, + 0x0a, 0x15, 0xad, 0x48, 0xbc, 0x09, 0x4b, 0x03, 0x56, 0xde, 0xbe, 0x73, 0xba, 0x1d, 0x37, 0xf1, + 0xa0, 0x54, 0xd5, 0x84, 0xee, 0x26, 0x45, 0x42, 0xc6, 0x65, 0x96, 0x2d, 0xa8, 0x53, 0x61, 0xce, + 0x1b, 0xc6, 0x64, 0x61, 0x99, 0xe9, 0x57, 0xb6, 0x16, 0xd2, 0xba, 0x50, 0x2d, 0xe4, 0x05, 0x68, + 0x88, 0x48, 0x85, 0x68, 0x7a, 0x9b, 0x19, 0x3d, 0x61, 0x06, 0xac, 0x50, 0xb2, 0x03, 0x0b, 0xf2, + 0x01, 0x40, 0xb6, 0x90, 0xd0, 0xc9, 0x17, 0x12, 0xae, 0xc0, 0xbc, 0x1d, 0xf6, 0x0f, 0xcd, 0x27, + 0xb8, 0xbb, 0x48, 0x5b, 0xe7, 0xec, 0xf0, 0xae, 0xf9, 0x04, 0xeb, 0xff, 0x58, 0x86, 0x76, 0xe2, + 0x60, 0x0b, 0x5b, 0x90, 0x22, 0x17, 0x56, 0xf6, 0xa0, 0x93, 0xc4, 0x3d, 0x74, 0x87, 0xcf, 0x4c, + 0x9e, 0xb3, 0xa7, 0x6a, 0x0b, 0xa3, 0x8c, 0xbe, 0x4a, 0xee, 0xbe, 0x72, 0x2e, 0x77, 0x3f, 0xe3, + 0xa9, 0xf7, 0x4d, 0x58, 0x89, 0x7d, 0xaf, 0xb4, 0x6c, 0x96, 0x60, 0x2d, 0x8b, 0xc6, 0x07, 0xe9, + 0xe5, 0x4f, 0x30, 0x01, 0xf3, 0x93, 0x4c, 0x40, 0x56, 0x04, 0x6a, 0x39, 0x11, 0xc8, 0x1f, 0xbe, + 0xd7, 0x15, 0x87, 0xef, 0xfa, 0x23, 0x58, 0xa2, 0x75, 0xdf, 0x70, 0x10, 0xd8, 0x07, 0x38, 0x4e, + 0x01, 0x8a, 0xb0, 0xb5, 0x07, 0xb5, 0x4c, 0x16, 0x11, 0x7f, 0xeb, 0xbf, 0xaa, 0xc1, 0xe5, 0xfc, + 0xbc, 0x54, 0x62, 0x12, 0x43, 0xa2, 0x49, 0x86, 0xe4, 0x17, 0x60, 0x29, 0x15, 0x51, 0x4a, 0x33, + 0x4f, 0x88, 0xc0, 0x15, 0x84, 0x1b, 0x28, 0x99, 0x43, 0xc0, 0xf4, 0x9f, 0x6a, 0x71, 0xf9, 0x9c, + 0xc0, 0x86, 0xf4, 0x50, 0x81, 0xf8, 0x35, 0xdf, 0x73, 0x6c, 0x2f, 0xae, 0x94, 0xf0, 0x35, 0x32, + 0x20, 0xaf, 0x94, 0xbc, 0x07, 0x0b, 0xbc, 0x53, 0xec, 0x9e, 0x0a, 0x06, 0x64, 0x6d, 0x36, 0x2e, + 0x76, 0x4c, 0x2f, 0x43, 0x9b, 0x57, 0xfb, 0x05, 0xbe, 0xb2, 0xea, 0x0c, 0xe0, 0xfb, 0xd0, 0x11, + 0xdd, 0xce, 0xeb, 0x10, 0x17, 0xf8, 0xc0, 0x38, 0xb0, 0xfb, 0x15, 0x0d, 0xba, 0xb2, 0x7b, 0x4c, + 0x2d, 0xff, 0xfc, 0xe1, 0xdd, 0xdb, 0xf2, 0x11, 0xee, 0xcb, 0x67, 0xd0, 0x93, 0xe0, 0x11, 0x07, + 0xb9, 0xbf, 0x59, 0xa2, 0xe7, 0xf1, 0x24, 0xd5, 0xdb, 0xb1, 0xc3, 0x28, 0xb0, 0x0f, 0xc6, 0xb3, + 0x1d, 0x2a, 0x9a, 0xd0, 0x18, 0x1c, 0xe1, 0xc1, 0x93, 0x91, 0x6f, 0x27, 0x5c, 0x79, 0x57, 0x45, + 0xd3, 0x64, 0xb4, 0x1b, 0xdb, 0xc9, 0x0c, 0xec, 0xd8, 0x26, 0x3d, 0x67, 0xef, 0x87, 0xd0, 0xc9, + 0x76, 0x48, 0x1f, 0xba, 0xd4, 0xd9, 0xa1, 0xcb, 0x4d, 0xf9, 0xd0, 0x65, 0x4a, 0xa4, 0x91, 0x3a, + 0x73, 0xf9, 0x8b, 0x12, 0x7c, 0x55, 0x49, 0xdb, 0x2c, 0x59, 0xd2, 0xa4, 0x3a, 0xd2, 0x1d, 0xa8, + 0x65, 0x92, 0xda, 0x57, 0xce, 0xe0, 0x1f, 0xaf, 0xa5, 0xb2, 0x9a, 0x5e, 0x98, 0xc4, 0x56, 0x89, + 0xc2, 0x57, 0x26, 0xcf, 0xc1, 0xf5, 0x4e, 0x9a, 0x43, 0x8c, 0x43, 0xb7, 0xa1, 0xc9, 0x0a, 0x06, + 0xfd, 0x63, 0x1b, 0x9f, 0x88, 0xb3, 0xc8, 0xeb, 0x4a, 0xd3, 0x4c, 0xfb, 0x3d, 0xb6, 0xf1, 0x89, + 0xd1, 0x70, 0xe2, 0xdf, 0xa1, 0xfe, 0x9f, 0x65, 0x80, 0xa4, 0x8d, 0x64, 0x67, 0x89, 0xce, 0x73, + 0x25, 0x4e, 0x41, 0x48, 0x2c, 0x21, 0x47, 0xae, 0xe2, 0x13, 0x19, 0xc9, 0x91, 0x82, 0x65, 0x87, + 0x11, 0xdf, 0x97, 0xcd, 0xb3, 0x69, 0x11, 0x5b, 0x44, 0x58, 0xc6, 0x65, 0x26, 0x4c, 0x20, 0xe8, + 0x0d, 0x40, 0xc3, 0xc0, 0x3f, 0xb1, 0xbd, 0x61, 0x3a, 0xdf, 0x60, 0x69, 0xc9, 0x22, 0x6f, 0x49, + 0x25, 0x1c, 0x3f, 0x82, 0x4e, 0xa6, 0xbb, 0xd8, 0x92, 0x9b, 0x53, 0xc8, 0xb8, 0x27, 0xcd, 0xc5, + 0xc5, 0x77, 0x41, 0xc6, 0x10, 0xf6, 0xfa, 0xd0, 0xc9, 0xd2, 0xab, 0x38, 0x37, 0xfc, 0x86, 0x2c, + 0xc2, 0x67, 0x59, 0x1a, 0x32, 0x4d, 0x4a, 0x88, 0x7b, 0x26, 0x2c, 0xab, 0x28, 0x51, 0x20, 0xb9, + 0xb0, 0x9e, 0xbc, 0x1b, 0x07, 0xbb, 0x74, 0x87, 0x27, 0xf9, 0x8f, 0x54, 0x2d, 0xb8, 0x24, 0xd5, + 0x82, 0xf5, 0xbf, 0xd5, 0x00, 0xe5, 0x05, 0x1b, 0xb5, 0xa1, 0x14, 0x4f, 0x52, 0xda, 0xdd, 0xc9, + 0x08, 0x52, 0x29, 0x27, 0x48, 0x57, 0xa1, 0x1e, 0xfb, 0x73, 0x6e, 0xbc, 0x13, 0x40, 0x5a, 0xcc, + 0x2a, 0xb2, 0x98, 0xa5, 0x08, 0xab, 0xca, 0x45, 0xea, 0x37, 0x61, 0xd9, 0x31, 0xc3, 0xa8, 0xcf, + 0x6a, 0xe1, 0x91, 0xed, 0xe2, 0x30, 0x32, 0xdd, 0x11, 0x0d, 0x96, 0x2b, 0x06, 0x22, 0x6d, 0x3b, + 0xa4, 0xe9, 0xa1, 0x68, 0xd1, 0x8f, 0x00, 0xe5, 0xd5, 0x2b, 0x8d, 0x5b, 0x93, 0x71, 0x4f, 0x5b, + 0x53, 0x8a, 0xb6, 0xb2, 0xbc, 0x69, 0x7f, 0x50, 0x06, 0x94, 0xc4, 0x38, 0xf1, 0x49, 0x6b, 0x91, + 0xc0, 0x60, 0x13, 0x96, 0xf2, 0x11, 0x90, 0x08, 0xfb, 0x50, 0x2e, 0xfe, 0x51, 0xc5, 0x2a, 0x65, + 0xd5, 0x45, 0xc1, 0xb7, 0x62, 0x83, 0xc8, 0x02, 0xba, 0xeb, 0x13, 0x4b, 0xf5, 0xb2, 0x4d, 0xfc, + 0x61, 0xf6, 0x82, 0x21, 0xd3, 0xb0, 0x5b, 0x4a, 0xe3, 0x95, 0x5b, 0xf2, 0xd4, 0xdb, 0x85, 0x52, + 0xa8, 0x39, 0x77, 0x9e, 0x50, 0x73, 0xf6, 0x5b, 0x85, 0xff, 0x5c, 0x82, 0xc5, 0x78, 0x23, 0xcf, + 0xc5, 0xa4, 0xe9, 0x87, 0xe2, 0xcf, 0x99, 0x2b, 0x1f, 0xab, 0xb9, 0xf2, 0xcd, 0x33, 0xc3, 0xfd, + 0xa2, 0x4c, 0x99, 0x7d, 0x67, 0x3f, 0x85, 0x79, 0x5e, 0xb8, 0xcd, 0x19, 0x8a, 0x22, 0x09, 0xf5, + 0x32, 0x54, 0x89, 0x5d, 0x12, 0x55, 0x37, 0xf6, 0xc1, 0xb6, 0x34, 0x7d, 0xdd, 0x94, 0xdb, 0x8a, + 0x96, 0x74, 0xdb, 0x54, 0xff, 0x77, 0x0d, 0x60, 0xff, 0xd4, 0x1b, 0xdc, 0x66, 0x4a, 0xfa, 0x26, + 0x54, 0xa6, 0xdd, 0x71, 0x22, 0xbd, 0xa9, 0x6c, 0xd1, 0x9e, 0x05, 0x98, 0x2b, 0x95, 0x0c, 0xca, + 0xd9, 0x92, 0xc1, 0xa4, 0x64, 0x7f, 0xb2, 0x29, 0xfb, 0x26, 0x54, 0x48, 0xa0, 0xc7, 0xef, 0x08, + 0x15, 0x3a, 0xf0, 0xa4, 0x03, 0xf4, 0xcf, 0x4a, 0x70, 0x85, 0x50, 0xff, 0x6c, 0xa2, 0xc2, 0x22, + 0xac, 0x49, 0x59, 0xcb, 0xb2, 0x6c, 0x2d, 0x6f, 0xc1, 0x3c, 0x4b, 0xf7, 0x45, 0x7c, 0x73, 0x7d, + 0xd2, 0x5e, 0x33, 0xce, 0x18, 0xa2, 0xfb, 0xac, 0x39, 0xa3, 0x74, 0xd8, 0x3a, 0x37, 0xdb, 0x61, + 0xeb, 0x7c, 0xb6, 0x28, 0x98, 0x62, 0x5a, 0x4d, 0xb6, 0xf1, 0x8f, 0xa0, 0x65, 0xa4, 0x05, 0x0f, + 0x21, 0xa8, 0xa4, 0xee, 0x14, 0xd2, 0xdf, 0x34, 0xcd, 0x33, 0x47, 0xe6, 0xc0, 0x8e, 0x4e, 0xe9, + 0x76, 0x56, 0x8d, 0xf8, 0x5b, 0x2d, 0xe5, 0xfa, 0xff, 0x68, 0x70, 0x59, 0x1c, 0xea, 0x71, 0x1d, + 0xba, 0x38, 0x47, 0xb7, 0x60, 0x85, 0x2b, 0x4c, 0x46, 0x73, 0x58, 0x30, 0xb7, 0xc4, 0x60, 0xf2, + 0x32, 0xb6, 0x60, 0x25, 0x32, 0x83, 0x21, 0x8e, 0xb2, 0x63, 0x18, 0xbf, 0x97, 0x58, 0xa3, 0x3c, + 0xa6, 0xc8, 0xa1, 0xea, 0x0b, 0xec, 0x32, 0x0e, 0xdf, 0x5a, 0xae, 0x02, 0xe0, 0x8d, 0x5d, 0xbe, + 0x4a, 0xfd, 0x04, 0xae, 0xb2, 0x5b, 0xbd, 0x07, 0x32, 0x45, 0x33, 0xd5, 0xd4, 0x95, 0xeb, 0xce, + 0x58, 0x8c, 0xdf, 0xd7, 0xe0, 0xda, 0x04, 0xcc, 0xb3, 0x64, 0x13, 0xf7, 0x95, 0xd8, 0x27, 0xe4, + 0x7e, 0x12, 0x5e, 0x2a, 0xa1, 0x19, 0x22, 0x3f, 0xab, 0xc0, 0x62, 0xae, 0xd3, 0xb9, 0x65, 0xee, + 0x75, 0x40, 0x84, 0x09, 0xf1, 0x23, 0x31, 0x9a, 0x4e, 0x73, 0xd7, 0xd4, 0xf1, 0xc6, 0x6e, 0xfc, + 0x40, 0x8c, 0x64, 0xd4, 0xc8, 0x66, 0xbd, 0x59, 0x45, 0x3d, 0xe6, 0x5c, 0x65, 0xf2, 0x0b, 0x83, + 0x1c, 0x81, 0x1b, 0x7b, 0x63, 0x97, 0x15, 0xdf, 0x39, 0x97, 0x99, 0xbb, 0x21, 0xa8, 0x24, 0x30, + 0x3a, 0x84, 0x45, 0x7a, 0x55, 0x6b, 0x1c, 0x0d, 0x7d, 0x12, 0xd0, 0x53, 0xba, 0x98, 0x53, 0xfb, + 0x76, 0x61, 0x4c, 0x1f, 0xf2, 0xd1, 0x84, 0x78, 0x1e, 0xd3, 0x7b, 0x32, 0x54, 0xe0, 0xb1, 0xbd, + 0x81, 0xef, 0xc6, 0x78, 0xe6, 0xce, 0x89, 0x67, 0x97, 0x8f, 0x96, 0xf1, 0xa4, 0xa1, 0xbd, 0x6d, + 0x58, 0x51, 0x2e, 0x7d, 0x9a, 0x1b, 0xad, 0xa6, 0xf3, 0x83, 0x3b, 0xb0, 0xac, 0x5a, 0xd5, 0x05, + 0xe6, 0xc8, 0x51, 0x7c, 0x9e, 0x39, 0xf4, 0x3f, 0x29, 0x41, 0x6b, 0x07, 0x3b, 0x38, 0xc2, 0xcf, + 0xf7, 0xcc, 0x33, 0x77, 0x80, 0x5b, 0xce, 0x1f, 0xe0, 0xe6, 0x4e, 0xa3, 0x2b, 0x8a, 0xd3, 0xe8, + 0x6b, 0xf1, 0x21, 0x3c, 0x99, 0xa5, 0x2a, 0x7b, 0x68, 0x0b, 0xbd, 0x0d, 0xcd, 0x51, 0x60, 0xbb, + 0x66, 0x70, 0xda, 0x7f, 0x82, 0x4f, 0x43, 0xee, 0x34, 0xba, 0x4a, 0xb7, 0xb3, 0xbb, 0x13, 0x1a, + 0x0d, 0xde, 0xfb, 0x7d, 0x7c, 0x4a, 0x0f, 0xf8, 0xe3, 0x64, 0x83, 0x5d, 0xc5, 0xaa, 0x18, 0x29, + 0xc8, 0xfa, 0x2a, 0xd4, 0xe3, 0x1b, 0x2f, 0xa8, 0x06, 0x95, 0xbb, 0x63, 0xc7, 0xe9, 0x5c, 0x42, + 0x75, 0xa8, 0xd2, 0x74, 0xa4, 0xa3, 0xad, 0x7f, 0x17, 0xea, 0xf1, 0xa9, 0x3d, 0x6a, 0xc0, 0xfc, + 0x23, 0xef, 0x7d, 0xcf, 0x3f, 0xf1, 0x3a, 0x97, 0xd0, 0x3c, 0x94, 0x6f, 0x3b, 0x4e, 0x47, 0x43, + 0x2d, 0xa8, 0xef, 0x47, 0x01, 0x36, 0x09, 0xcf, 0x3a, 0x25, 0xd4, 0x06, 0x78, 0xcf, 0x0e, 0x23, + 0x3f, 0xb0, 0x07, 0xa6, 0xd3, 0x29, 0xaf, 0x7f, 0x0a, 0x6d, 0xb9, 0x88, 0x8b, 0x9a, 0x50, 0xdb, + 0xf3, 0xa3, 0xef, 0x7d, 0x62, 0x87, 0x51, 0xe7, 0x12, 0xe9, 0xbf, 0xe7, 0x47, 0x0f, 0x02, 0x1c, + 0x62, 0x2f, 0xea, 0x68, 0x08, 0x60, 0xee, 0x43, 0x6f, 0xc7, 0x0e, 0x9f, 0x74, 0x4a, 0x68, 0x89, + 0x9f, 0xcf, 0x98, 0xce, 0x2e, 0xaf, 0x8c, 0x76, 0xca, 0x64, 0x78, 0xfc, 0x55, 0x41, 0x1d, 0x68, + 0xc6, 0x5d, 0xee, 0x3d, 0x78, 0xd4, 0xa9, 0x12, 0xea, 0xd9, 0xcf, 0xb9, 0x75, 0x0b, 0x3a, 0xd9, + 0x73, 0x45, 0x32, 0x27, 0x5b, 0x44, 0x0c, 0xea, 0x5c, 0x22, 0x2b, 0xe3, 0x07, 0xbb, 0x1d, 0x0d, + 0x2d, 0x40, 0x23, 0x75, 0x4c, 0xda, 0x29, 0x11, 0xc0, 0xbd, 0x60, 0x34, 0xe0, 0x02, 0xc5, 0x48, + 0x20, 0xd2, 0xb9, 0x43, 0x76, 0xa2, 0xb2, 0x7e, 0x07, 0x6a, 0x22, 0xe4, 0x27, 0x5d, 0xf9, 0x16, + 0x91, 0xcf, 0xce, 0x25, 0xb4, 0x08, 0x2d, 0xe9, 0x2d, 0x53, 0x47, 0x43, 0x08, 0xda, 0xf2, 0x6b, + 0xc3, 0x4e, 0x69, 0x7d, 0x0b, 0x20, 0x09, 0x9d, 0x09, 0x39, 0xbb, 0xde, 0xb1, 0xe9, 0xd8, 0x16, + 0xa3, 0x8d, 0x34, 0x91, 0xdd, 0xa5, 0xbb, 0xc3, 0x14, 0xb5, 0x53, 0x5a, 0x5f, 0x87, 0x9a, 0x08, + 0x07, 0x09, 0xdc, 0xc0, 0xae, 0x7f, 0x8c, 0x19, 0x67, 0xf6, 0x31, 0xd9, 0xca, 0x3a, 0x54, 0x6f, + 0xbb, 0xd8, 0xb3, 0x3a, 0xa5, 0xad, 0x7f, 0x5b, 0x02, 0x60, 0xa7, 0x82, 0xbe, 0x1f, 0x58, 0xc8, + 0xa1, 0xb7, 0x03, 0xb6, 0x7d, 0x77, 0xe4, 0x7b, 0xe2, 0xc8, 0x22, 0x44, 0x1b, 0x99, 0x54, 0x9d, + 0x7d, 0xe4, 0x3b, 0xf2, 0x8d, 0xe8, 0xbd, 0xa4, 0xec, 0x9f, 0xe9, 0xac, 0x5f, 0x42, 0x2e, 0xc5, + 0x46, 0x92, 0xdb, 0x87, 0xf6, 0xe0, 0x49, 0x7c, 0x94, 0x38, 0xf9, 0xc9, 0x5f, 0xa6, 0xab, 0xc0, + 0x77, 0x43, 0x89, 0x6f, 0x3f, 0x0a, 0x6c, 0x6f, 0x28, 0xfc, 0x9f, 0x7e, 0x09, 0x3d, 0xcd, 0x3c, + 0x38, 0x14, 0x08, 0xb7, 0x8a, 0xbc, 0x31, 0xbc, 0x18, 0x4a, 0x07, 0x16, 0x32, 0x6f, 0xb0, 0xd1, + 0xba, 0xfa, 0x01, 0x88, 0xea, 0xbd, 0x78, 0xef, 0xb5, 0x42, 0x7d, 0x63, 0x6c, 0x36, 0xb4, 0xe5, + 0x77, 0xc6, 0xe8, 0xe7, 0x26, 0x4d, 0x90, 0x7b, 0x82, 0xd6, 0x5b, 0x2f, 0xd2, 0x35, 0x46, 0xf5, + 0x11, 0x93, 0xd5, 0x69, 0xa8, 0x94, 0xcf, 0xf5, 0x7a, 0x67, 0x85, 0x1e, 0xfa, 0x25, 0xf4, 0x63, + 0x12, 0x25, 0x64, 0x1e, 0xca, 0xa1, 0xd7, 0xd5, 0x9e, 0x4d, 0xfd, 0x9e, 0x6e, 0x1a, 0x86, 0x8f, + 0xb2, 0x9a, 0x36, 0x99, 0xfa, 0xdc, 0xd3, 0xd9, 0xe2, 0xd4, 0xa7, 0xa6, 0x3f, 0x8b, 0xfa, 0x73, + 0x63, 0x70, 0x58, 0xc2, 0xa4, 0x78, 0xa2, 0x93, 0x15, 0xe5, 0x24, 0x5f, 0x99, 0xfc, 0x9e, 0x67, + 0x1a, 0xb6, 0x31, 0x55, 0xd2, 0xec, 0x71, 0xf8, 0x1b, 0x13, 0x0a, 0xed, 0xea, 0xb7, 0x81, 0xbd, + 0x8d, 0xa2, 0xdd, 0xd3, 0xb2, 0x2c, 0x3f, 0x3f, 0x53, 0xb3, 0x48, 0xf9, 0x64, 0x4e, 0x2d, 0xcb, + 0xea, 0xd7, 0x6c, 0xfa, 0x25, 0xf4, 0x50, 0xb2, 0xeb, 0xe8, 0x95, 0x49, 0xa2, 0x20, 0xdf, 0x8f, + 0x99, 0xb6, 0x6f, 0xbf, 0x08, 0x88, 0x69, 0xaa, 0x77, 0x68, 0x0f, 0xc7, 0x81, 0xc9, 0xc4, 0x78, + 0x92, 0x71, 0xcb, 0x77, 0x15, 0x68, 0xbe, 0x76, 0x8e, 0x11, 0xf1, 0x92, 0xfa, 0x00, 0xf7, 0x70, + 0xf4, 0x01, 0x8e, 0x02, 0x7b, 0x10, 0x66, 0x57, 0x94, 0xd8, 0x6f, 0xde, 0x41, 0xa0, 0x7a, 0x75, + 0x6a, 0xbf, 0x18, 0xc1, 0x01, 0x34, 0xee, 0x91, 0x0c, 0x8a, 0x46, 0x85, 0x21, 0x9a, 0x38, 0x52, + 0xf4, 0x10, 0x28, 0xd6, 0xa6, 0x77, 0x4c, 0x1b, 0xcf, 0xcc, 0x53, 0x3c, 0x34, 0x91, 0xb1, 0xf9, + 0x07, 0x82, 0x6a, 0xe3, 0x39, 0xe1, 0x6d, 0x1f, 0x5b, 0x11, 0x3d, 0xec, 0x79, 0x0f, 0x9b, 0x4e, + 0x74, 0x34, 0x61, 0x45, 0xa9, 0x1e, 0x67, 0xaf, 0x48, 0xea, 0x18, 0xe3, 0xc0, 0xb0, 0xc4, 0xb4, + 0x50, 0x4e, 0x3d, 0x37, 0xd5, 0x53, 0xe4, 0x7b, 0x16, 0x14, 0x3d, 0x13, 0x16, 0x77, 0x02, 0x7f, + 0x24, 0x23, 0x79, 0x43, 0x89, 0x24, 0xd7, 0xaf, 0x20, 0x8a, 0x1f, 0x40, 0x53, 0x64, 0xf8, 0x34, + 0x27, 0x51, 0xef, 0x42, 0xba, 0x4b, 0xc1, 0x89, 0x3f, 0x86, 0x85, 0x4c, 0xe9, 0x40, 0xcd, 0x74, + 0x75, 0x7d, 0x61, 0xda, 0xec, 0x27, 0x80, 0xe8, 0xfb, 0x4a, 0xe9, 0x6d, 0xf7, 0x84, 0xf8, 0x26, + 0xdf, 0x51, 0x20, 0xd9, 0x2c, 0xdc, 0x3f, 0xe6, 0xfc, 0x2f, 0xc1, 0x8a, 0x32, 0x3d, 0xcf, 0x1a, + 0x04, 0x7e, 0x21, 0xf6, 0x8c, 0x1a, 0x42, 0xd6, 0x20, 0x9c, 0x39, 0x42, 0xe0, 0xdf, 0xfa, 0xa7, + 0x05, 0xa8, 0xd3, 0x38, 0x8f, 0x72, 0xeb, 0xff, 0xc3, 0xbc, 0x67, 0x1b, 0xe6, 0x7d, 0x0c, 0x0b, + 0x99, 0x87, 0x81, 0x6a, 0xa1, 0x55, 0xbf, 0x1e, 0x2c, 0x10, 0xad, 0xc8, 0x4f, 0xf3, 0xd4, 0xae, + 0x50, 0xf9, 0x7c, 0x6f, 0xda, 0xdc, 0x8f, 0xd9, 0x9b, 0xda, 0xf8, 0x96, 0xc2, 0xab, 0x13, 0x8b, + 0xf7, 0xf2, 0xc5, 0xd6, 0xcf, 0x3f, 0x0a, 0xfa, 0x72, 0x47, 0xa0, 0x1f, 0xc3, 0x42, 0xe6, 0xe9, + 0x88, 0x5a, 0x62, 0xd4, 0xef, 0x4b, 0xa6, 0xcd, 0xfe, 0x33, 0x0c, 0x9e, 0x2c, 0x58, 0x52, 0xdc, + 0xd4, 0x47, 0x1b, 0x93, 0x02, 0x51, 0xf5, 0x95, 0xfe, 0xe9, 0x0b, 0x6a, 0x49, 0x6a, 0x9a, 0xf5, + 0x37, 0x09, 0x91, 0xd9, 0x3f, 0x85, 0xe9, 0xbd, 0x5e, 0xec, 0x1f, 0x64, 0xe2, 0x05, 0xed, 0xc3, + 0x1c, 0x7b, 0x50, 0x82, 0x5e, 0x54, 0x1f, 0x62, 0xa4, 0x1e, 0x9b, 0xf4, 0xa6, 0x3d, 0x49, 0x09, + 0xc7, 0x4e, 0x14, 0xd2, 0x49, 0xab, 0xd4, 0xfa, 0x22, 0x65, 0x55, 0x3f, 0xfd, 0xb2, 0xa3, 0x37, + 0xfd, 0x31, 0x87, 0x98, 0xf4, 0xff, 0x76, 0x84, 0xf9, 0x09, 0x7d, 0x3a, 0x90, 0xbd, 0x1c, 0x83, + 0x36, 0xce, 0x77, 0xc3, 0xa7, 0xb7, 0x59, 0xb8, 0x7f, 0x8c, 0xf9, 0x47, 0xd0, 0xc9, 0x1e, 0x48, + 0xa1, 0xd7, 0x26, 0xc9, 0xb3, 0x0a, 0xe7, 0x14, 0x61, 0xfe, 0x3e, 0xcc, 0xb1, 0x4a, 0xa4, 0x5a, + 0xc2, 0xa4, 0x2a, 0xe5, 0x94, 0xb9, 0xee, 0x7c, 0xfd, 0xa3, 0xad, 0xa1, 0x1d, 0x1d, 0x8d, 0x0f, + 0x48, 0xcb, 0x26, 0xeb, 0xfa, 0x86, 0xed, 0xf3, 0x5f, 0x9b, 0x82, 0x97, 0x9b, 0x74, 0xf4, 0x26, + 0x45, 0x30, 0x3a, 0x38, 0x98, 0xa3, 0x9f, 0x37, 0xff, 0x37, 0x00, 0x00, 0xff, 0xff, 0x19, 0xe2, + 0x54, 0xd8, 0x29, 0x4f, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/internal/querycoordv2/observers/leader_observer.go b/internal/querycoordv2/observers/leader_observer.go index 6a0048a3e2c04163aca0a667e7de578e56ea1c9e..3d27fceecf4dc26d127478b73282a25b0a7692ab 100644 --- a/internal/querycoordv2/observers/leader_observer.go +++ b/internal/querycoordv2/observers/leader_observer.go @@ -101,7 +101,7 @@ func (o *LeaderObserver) observeCollection(ctx context.Context, collection int64 dists := o.dist.SegmentDistManager.GetByShardWithReplica(ch, replica) needLoaded, needRemoved := o.findNeedLoadedSegments(leaderView, dists), o.findNeedRemovedSegments(leaderView, dists) - o.sync(ctx, leaderView, append(needLoaded, needRemoved...)) + o.sync(ctx, replica.GetID(), leaderView, append(needLoaded, needRemoved...)) } } } @@ -129,27 +129,6 @@ func (o *LeaderObserver) findNeedLoadedSegments(leaderView *meta.LeaderView, dis segment := resp.GetInfos()[0] loadInfo := utils.PackSegmentLoadInfo(segment, nil) - // Fix the leader view with lacks of delta logs - if existInCurrentTarget && s.LastDeltaTimestamp < currentTarget.GetDmlPosition().GetTimestamp() { - log.Info("Fix QueryNode delta logs lag", - zap.Int64("nodeID", s.Node), - zap.Int64("collectionID", s.GetCollectionID()), - zap.Int64("partitionID", s.GetPartitionID()), - zap.Int64("segmentID", s.GetID()), - zap.Uint64("segmentDeltaTimestamp", s.LastDeltaTimestamp), - zap.Uint64("channelTimestamp", currentTarget.GetDmlPosition().GetTimestamp()), - ) - - ret = append(ret, &querypb.SyncAction{ - Type: querypb.SyncType_Amend, - PartitionID: s.GetPartitionID(), - SegmentID: s.GetID(), - NodeID: s.Node, - Version: s.Version, - Info: loadInfo, - }) - } - ret = append(ret, &querypb.SyncAction{ Type: querypb.SyncType_Set, PartitionID: s.GetPartitionID(), @@ -190,7 +169,7 @@ func (o *LeaderObserver) findNeedRemovedSegments(leaderView *meta.LeaderView, di return ret } -func (o *LeaderObserver) sync(ctx context.Context, leaderView *meta.LeaderView, diffs []*querypb.SyncAction) { +func (o *LeaderObserver) sync(ctx context.Context, replicaID int64, leaderView *meta.LeaderView, diffs []*querypb.SyncAction) { if len(diffs) == 0 { return } @@ -200,13 +179,33 @@ func (o *LeaderObserver) sync(ctx context.Context, leaderView *meta.LeaderView, zap.Int64("collectionID", leaderView.CollectionID), zap.String("channel", leaderView.Channel), ) + + schema, err := o.broker.GetCollectionSchema(ctx, leaderView.CollectionID) + if err != nil { + log.Error("sync distribution failed, cannot get schema of collection", zap.Error(err)) + return + } + partitions, err := utils.GetPartitions(o.meta.CollectionManager, leaderView.CollectionID) + if err != nil { + log.Error("sync distribution failed, cannot get partitions of collection", zap.Error(err)) + return + } + req := &querypb.SyncDistributionRequest{ Base: commonpbutil.NewMsgBase( commonpbutil.WithMsgType(commonpb.MsgType_SyncDistribution), ), CollectionID: leaderView.CollectionID, + ReplicaID: replicaID, Channel: leaderView.Channel, Actions: diffs, + Schema: schema, + LoadMeta: &querypb.LoadMetaInfo{ + LoadType: o.meta.GetLoadType(leaderView.CollectionID), + CollectionID: leaderView.CollectionID, + PartitionIDs: partitions, + }, + Version: time.Now().UnixNano(), } resp, err := o.cluster.SyncDistribution(ctx, leaderView.ID, req) if err != nil { diff --git a/internal/querycoordv2/observers/leader_observer_test.go b/internal/querycoordv2/observers/leader_observer_test.go index 2f87c96c005fe717ecc1f44851dc1484d8604505..53b417ea4fb9c45321f4ff1ead44c32c01fa34f8 100644 --- a/internal/querycoordv2/observers/leader_observer_test.go +++ b/internal/querycoordv2/observers/leader_observer_test.go @@ -21,6 +21,7 @@ import ( "testing" "time" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/suite" "go.uber.org/atomic" @@ -105,6 +106,8 @@ func (suite *LeaderObserverTestSuite) TestSyncLoadedSegments() { InsertChannel: "test-insert-channel", } loadInfo := utils.PackSegmentLoadInfo(info, nil) + schema := utils.CreateTestSchema() + suite.broker.EXPECT().GetCollectionSchema(mock.Anything, int64(1)).Return(schema, nil) suite.broker.EXPECT().GetSegmentInfo(mock.Anything, int64(1)).Return( &datapb.GetSegmentInfoResponse{Infos: []*datapb.SegmentInfo{info}}, nil) suite.broker.EXPECT().GetRecoveryInfo(mock.Anything, int64(1), int64(1)).Return( @@ -114,26 +117,43 @@ func (suite *LeaderObserverTestSuite) TestSyncLoadedSegments() { observer.dist.SegmentDistManager.Update(1, utils.CreateTestSegment(1, 1, 1, 2, 1, "test-insert-channel")) observer.dist.ChannelDistManager.Update(2, utils.CreateTestChannel(1, 2, 1, "test-insert-channel")) observer.dist.LeaderViewManager.Update(2, utils.CreateTestLeaderView(2, 1, "test-insert-channel", map[int64]int64{}, map[int64]*meta.Segment{})) - expectReq := &querypb.SyncDistributionRequest{ - Base: &commonpb.MsgBase{ - MsgType: commonpb.MsgType_SyncDistribution, - }, - CollectionID: 1, - Channel: "test-insert-channel", - Actions: []*querypb.SyncAction{ - { - Type: querypb.SyncType_Set, - PartitionID: 1, - SegmentID: 1, - NodeID: 1, - Version: 1, - Info: loadInfo, + + expectReqeustFunc := func(version int64) *querypb.SyncDistributionRequest { + return &querypb.SyncDistributionRequest{ + Base: &commonpb.MsgBase{ + MsgType: commonpb.MsgType_SyncDistribution, }, - }, + CollectionID: 1, + ReplicaID: 1, + Channel: "test-insert-channel", + Actions: []*querypb.SyncAction{ + { + Type: querypb.SyncType_Set, + PartitionID: 1, + SegmentID: 1, + NodeID: 1, + Version: 1, + Info: loadInfo, + }, + }, + Schema: schema, + LoadMeta: &querypb.LoadMetaInfo{ + CollectionID: 1, + PartitionIDs: []int64{}, + }, + Version: version, + } } + called := atomic.NewBool(false) - suite.mockCluster.EXPECT().SyncDistribution(context.TODO(), int64(2), expectReq).Once(). - Run(func(args mock.Arguments) { called.Store(true) }). + suite.mockCluster.EXPECT().SyncDistribution(context.TODO(), int64(2), + mock.AnythingOfType("*querypb.SyncDistributionRequest")).Once(). + Run(func(args mock.Arguments) { + inputReq := (args[2]).(*querypb.SyncDistributionRequest) + assert.ElementsMatch(suite.T(), []*querypb.SyncDistributionRequest{inputReq}, + []*querypb.SyncDistributionRequest{expectReqeustFunc(inputReq.GetVersion())}) + called.Store(true) + }). Return(&commonpb.Status{}, nil) observer.Start(context.TODO()) @@ -163,6 +183,8 @@ func (suite *LeaderObserverTestSuite) TestIgnoreSyncLoadedSegments() { ChannelName: "test-insert-channel", }, } + schema := utils.CreateTestSchema() + suite.broker.EXPECT().GetCollectionSchema(mock.Anything, int64(1)).Return(schema, nil) suite.broker.EXPECT().GetPartitions(mock.Anything, int64(1)).Return([]int64{1}, nil) info := &datapb.SegmentInfo{ ID: 1, @@ -182,26 +204,40 @@ func (suite *LeaderObserverTestSuite) TestIgnoreSyncLoadedSegments() { observer.dist.ChannelDistManager.Update(2, utils.CreateTestChannel(1, 2, 1, "test-insert-channel")) observer.dist.LeaderViewManager.Update(2, utils.CreateTestLeaderView(2, 1, "test-insert-channel", map[int64]int64{}, map[int64]*meta.Segment{})) - expectReq := &querypb.SyncDistributionRequest{ - Base: &commonpb.MsgBase{ - MsgType: commonpb.MsgType_SyncDistribution, - }, - CollectionID: 1, - Channel: "test-insert-channel", - Actions: []*querypb.SyncAction{ - { - Type: querypb.SyncType_Set, - PartitionID: 1, - SegmentID: 1, - NodeID: 1, - Version: 1, - Info: loadInfo, + expectReqeustFunc := func(version int64) *querypb.SyncDistributionRequest { + return &querypb.SyncDistributionRequest{ + Base: &commonpb.MsgBase{ + MsgType: commonpb.MsgType_SyncDistribution, }, - }, + CollectionID: 1, + ReplicaID: 1, + Channel: "test-insert-channel", + Actions: []*querypb.SyncAction{ + { + Type: querypb.SyncType_Set, + PartitionID: 1, + SegmentID: 1, + NodeID: 1, + Version: 1, + Info: loadInfo, + }, + }, + Schema: schema, + LoadMeta: &querypb.LoadMetaInfo{ + CollectionID: 1, + PartitionIDs: []int64{}, + }, + Version: version, + } } called := atomic.NewBool(false) - suite.mockCluster.EXPECT().SyncDistribution(context.TODO(), int64(2), expectReq).Once(). - Run(func(args mock.Arguments) { called.Store(true) }). + suite.mockCluster.EXPECT().SyncDistribution(context.TODO(), int64(2), mock.AnythingOfType("*querypb.SyncDistributionRequest")).Once(). + Run(func(args mock.Arguments) { + inputReq := (args[2]).(*querypb.SyncDistributionRequest) + assert.ElementsMatch(suite.T(), []*querypb.SyncDistributionRequest{inputReq}, + []*querypb.SyncDistributionRequest{expectReqeustFunc(inputReq.GetVersion())}) + called.Store(true) + }). Return(&commonpb.Status{}, nil) observer.Start(context.TODO()) @@ -279,10 +315,12 @@ func (suite *LeaderObserverTestSuite) TestSyncLoadedSegmentsWithReplicas() { InsertChannel: "test-insert-channel", } loadInfo := utils.PackSegmentLoadInfo(info, nil) + schema := utils.CreateTestSchema() suite.broker.EXPECT().GetSegmentInfo(mock.Anything, int64(1)).Return( &datapb.GetSegmentInfoResponse{Infos: []*datapb.SegmentInfo{info}}, nil) suite.broker.EXPECT().GetRecoveryInfo(mock.Anything, int64(1), int64(1)).Return( channels, segments, nil) + suite.broker.EXPECT().GetCollectionSchema(mock.Anything, int64(1)).Return(schema, nil) observer.target.UpdateCollectionNextTargetWithPartitions(int64(1), int64(1)) observer.target.UpdateCollectionCurrentTarget(1) observer.dist.SegmentDistManager.Update(1, utils.CreateTestSegment(1, 1, 1, 1, 1, "test-insert-channel")) @@ -290,26 +328,42 @@ func (suite *LeaderObserverTestSuite) TestSyncLoadedSegmentsWithReplicas() { observer.dist.ChannelDistManager.Update(2, utils.CreateTestChannel(1, 2, 1, "test-insert-channel")) observer.dist.LeaderViewManager.Update(2, utils.CreateTestLeaderView(2, 1, "test-insert-channel", map[int64]int64{}, map[int64]*meta.Segment{})) observer.dist.LeaderViewManager.Update(4, utils.CreateTestLeaderView(4, 1, "test-insert-channel", map[int64]int64{1: 4}, map[int64]*meta.Segment{})) - expectReq := &querypb.SyncDistributionRequest{ - Base: &commonpb.MsgBase{ - MsgType: commonpb.MsgType_SyncDistribution, - }, - CollectionID: 1, - Channel: "test-insert-channel", - Actions: []*querypb.SyncAction{ - { - Type: querypb.SyncType_Set, - PartitionID: 1, - SegmentID: 1, - NodeID: 1, - Version: 1, - Info: loadInfo, + + expectReqeustFunc := func(version int64) *querypb.SyncDistributionRequest { + return &querypb.SyncDistributionRequest{ + Base: &commonpb.MsgBase{ + MsgType: commonpb.MsgType_SyncDistribution, }, - }, + CollectionID: 1, + ReplicaID: 1, + Channel: "test-insert-channel", + Actions: []*querypb.SyncAction{ + { + Type: querypb.SyncType_Set, + PartitionID: 1, + SegmentID: 1, + NodeID: 1, + Version: 1, + Info: loadInfo, + }, + }, + Schema: schema, + LoadMeta: &querypb.LoadMetaInfo{ + CollectionID: 1, + PartitionIDs: []int64{}, + }, + Version: version, + } } called := atomic.NewBool(false) - suite.mockCluster.EXPECT().SyncDistribution(context.TODO(), int64(2), expectReq).Once(). - Run(func(args mock.Arguments) { called.Store(true) }). + suite.mockCluster.EXPECT().SyncDistribution(context.TODO(), int64(2), + mock.AnythingOfType("*querypb.SyncDistributionRequest")).Once(). + Run(func(args mock.Arguments) { + inputReq := (args[2]).(*querypb.SyncDistributionRequest) + assert.ElementsMatch(suite.T(), []*querypb.SyncDistributionRequest{inputReq}, + []*querypb.SyncDistributionRequest{expectReqeustFunc(inputReq.GetVersion())}) + called.Store(true) + }). Return(&commonpb.Status{}, nil) observer.Start(context.TODO()) @@ -331,23 +385,41 @@ func (suite *LeaderObserverTestSuite) TestSyncRemovedSegments() { observer.dist.ChannelDistManager.Update(2, utils.CreateTestChannel(1, 2, 1, "test-insert-channel")) observer.dist.LeaderViewManager.Update(2, utils.CreateTestLeaderView(2, 1, "test-insert-channel", map[int64]int64{3: 2}, map[int64]*meta.Segment{})) - expectReq := &querypb.SyncDistributionRequest{ - Base: &commonpb.MsgBase{ - MsgType: commonpb.MsgType_SyncDistribution, - }, - CollectionID: 1, - Channel: "test-insert-channel", - Actions: []*querypb.SyncAction{ - { - Type: querypb.SyncType_Remove, - SegmentID: 3, - NodeID: 2, + schema := utils.CreateTestSchema() + suite.broker.EXPECT().GetCollectionSchema(mock.Anything, int64(1)).Return(schema, nil) + + expectReqeustFunc := func(version int64) *querypb.SyncDistributionRequest { + return &querypb.SyncDistributionRequest{ + Base: &commonpb.MsgBase{ + MsgType: commonpb.MsgType_SyncDistribution, }, - }, + CollectionID: 1, + ReplicaID: 1, + Channel: "test-insert-channel", + Actions: []*querypb.SyncAction{ + { + Type: querypb.SyncType_Remove, + SegmentID: 3, + NodeID: 2, + }, + }, + Schema: schema, + LoadMeta: &querypb.LoadMetaInfo{ + CollectionID: 1, + PartitionIDs: []int64{}, + }, + Version: version, + } } ch := make(chan struct{}) - suite.mockCluster.EXPECT().SyncDistribution(context.TODO(), int64(2), expectReq).Once(). - Run(func(args mock.Arguments) { close(ch) }). + suite.mockCluster.EXPECT().SyncDistribution(context.TODO(), int64(2), + mock.AnythingOfType("*querypb.SyncDistributionRequest")).Once(). + Run(func(args mock.Arguments) { + inputReq := (args[2]).(*querypb.SyncDistributionRequest) + assert.ElementsMatch(suite.T(), []*querypb.SyncDistributionRequest{inputReq}, + []*querypb.SyncDistributionRequest{expectReqeustFunc(inputReq.GetVersion())}) + close(ch) + }). Return(&commonpb.Status{}, nil) observer.Start(context.TODO()) @@ -376,6 +448,8 @@ func (suite *LeaderObserverTestSuite) TestIgnoreSyncRemovedSegments() { ChannelName: "test-insert-channel", }, } + schema := utils.CreateTestSchema() + suite.broker.EXPECT().GetCollectionSchema(mock.Anything, int64(1)).Return(schema, nil) suite.broker.EXPECT().GetPartitions(mock.Anything, int64(1)).Return([]int64{1}, nil) suite.broker.EXPECT().GetRecoveryInfo(mock.Anything, int64(1), int64(1)).Return( channels, segments, nil) @@ -384,23 +458,37 @@ func (suite *LeaderObserverTestSuite) TestIgnoreSyncRemovedSegments() { observer.dist.ChannelDistManager.Update(2, utils.CreateTestChannel(1, 2, 1, "test-insert-channel")) observer.dist.LeaderViewManager.Update(2, utils.CreateTestLeaderView(2, 1, "test-insert-channel", map[int64]int64{3: 2, 2: 2}, map[int64]*meta.Segment{})) - expectReq := &querypb.SyncDistributionRequest{ - Base: &commonpb.MsgBase{ - MsgType: commonpb.MsgType_SyncDistribution, - }, - CollectionID: 1, - Channel: "test-insert-channel", - Actions: []*querypb.SyncAction{ - { - Type: querypb.SyncType_Remove, - SegmentID: 3, - NodeID: 2, + expectReqeustFunc := func(version int64) *querypb.SyncDistributionRequest { + return &querypb.SyncDistributionRequest{ + Base: &commonpb.MsgBase{ + MsgType: commonpb.MsgType_SyncDistribution, }, - }, + CollectionID: 1, + ReplicaID: 1, + Channel: "test-insert-channel", + Actions: []*querypb.SyncAction{ + { + Type: querypb.SyncType_Remove, + SegmentID: 3, + NodeID: 2, + }, + }, + Schema: schema, + LoadMeta: &querypb.LoadMetaInfo{ + CollectionID: 1, + PartitionIDs: []int64{}, + }, + Version: version, + } } called := atomic.NewBool(false) - suite.mockCluster.EXPECT().SyncDistribution(context.TODO(), int64(2), expectReq).Once(). - Run(func(args mock.Arguments) { called.Store(true) }). + suite.mockCluster.EXPECT().SyncDistribution(context.TODO(), int64(2), mock.AnythingOfType("*querypb.SyncDistributionRequest")).Once(). + Run(func(args mock.Arguments) { + inputReq := (args[2]).(*querypb.SyncDistributionRequest) + assert.ElementsMatch(suite.T(), []*querypb.SyncDistributionRequest{inputReq}, + []*querypb.SyncDistributionRequest{expectReqeustFunc(inputReq.GetVersion())}) + called.Store(true) + }). Return(&commonpb.Status{}, nil) observer.Start(context.TODO()) diff --git a/internal/querycoordv2/utils/test.go b/internal/querycoordv2/utils/test.go index 249867e8d60691dbdddb16f60e8a1800ebcbbfb7..a526d406a1b1b79b19fea0e609d60d338dbfe090 100644 --- a/internal/querycoordv2/utils/test.go +++ b/internal/querycoordv2/utils/test.go @@ -17,6 +17,7 @@ package utils import ( + "github.com/milvus-io/milvus-proto/go-api/schemapb" "github.com/milvus-io/milvus/internal/proto/datapb" "github.com/milvus-io/milvus/internal/proto/querypb" "github.com/milvus-io/milvus/internal/querycoordv2/meta" @@ -63,6 +64,22 @@ func CreateTestReplica(id, collectionID int64, nodes []int64) *meta.Replica { ) } +func CreateTestSchema() *schemapb.CollectionSchema { + return &schemapb.CollectionSchema{ + Name: "schema", + Description: "schema", + AutoID: true, + Fields: []*schemapb.FieldSchema{ + { + FieldID: 101, + Name: "id", + IsPrimaryKey: false, + DataType: schemapb.DataType_Int64, + }, + }, + } +} + func CreateTestCollection(collection int64, replica int32) *meta.Collection { return &meta.Collection{ CollectionLoadInfo: &querypb.CollectionLoadInfo{ diff --git a/internal/querynodev2/delegator/delegator_data.go b/internal/querynodev2/delegator/delegator_data.go index c2beef624adcc99b0e3ad2b3a4fb44f120f325a5..e77f2007f7f16c3afe96fb1a889ff501361907cb 100644 --- a/internal/querynodev2/delegator/delegator_data.go +++ b/internal/querynodev2/delegator/delegator_data.go @@ -362,7 +362,7 @@ func (sd *shardDelegator) LoadSegments(ctx context.Context, req *querypb.LoadSeg }) removed := sd.distribution.AddDistributions(entries...) - // call worker release async + // release possible matched growing segments async if len(removed) > 0 { go func() { worker, err := sd.workerManager.GetWorker(paramtable.GetNodeID()) @@ -537,7 +537,7 @@ func (sd *shardDelegator) readDeleteFromMsgstream(ctx context.Context, position return result, nil } -// ReleaseSegments releases segments local or remotely depends ont the target node. +// ReleaseSegments releases segments local or remotely depending on the target node. func (sd *shardDelegator) ReleaseSegments(ctx context.Context, req *querypb.ReleaseSegmentsRequest, force bool) error { log := sd.getLogger(ctx) diff --git a/internal/querynodev2/delegator/distribution.go b/internal/querynodev2/delegator/distribution.go index b8f841bbc3c10b8b17ad7f2cda4145862f6ea35e..7bb2e4cf788a519f34572adbbcd4cd42cc8c78f8 100644 --- a/internal/querynodev2/delegator/distribution.go +++ b/internal/querynodev2/delegator/distribution.go @@ -200,7 +200,7 @@ func (d *distribution) RemoveDistributions(sealedSegments []SegmentEntry, growin } // getSnapshot converts current distribution to snapshot format. -// in which, user could juse found nodeID=>segmentID list. +// in which, user could use found nodeID=>segmentID list. // mutex RLock is required before calling this method. func (d *distribution) genSnapshot() chan struct{} { diff --git a/internal/querynodev2/services.go b/internal/querynodev2/services.go index 77ed4ad8294dc430f3330265b62f6c4b72f4f5a5..73b71f005efeab2b91e19d4bac5304e6074dcdc1 100644 --- a/internal/querynodev2/services.go +++ b/internal/querynodev2/services.go @@ -963,6 +963,8 @@ func (node *QueryNode) SyncDistribution(ctx context.Context, req *querypb.SyncDi } return status, nil } + + // get shard delegator shardDelegator, ok := node.delegators.Get(req.GetChannel()) if !ok { log.Warn("failed to find shard cluster when sync ", zap.String("channel", req.GetChannel())) @@ -972,6 +974,7 @@ func (node *QueryNode) SyncDistribution(ctx context.Context, req *querypb.SyncDi }, nil } + //translate segment action removeActions := make([]*querypb.SyncAction, 0) addSegments := make(map[int64][]*querypb.SegmentLoadInfo) for _, action := range req.GetActions() { @@ -985,22 +988,6 @@ func (node *QueryNode) SyncDistribution(ctx context.Context, req *querypb.SyncDi removeActions = append(removeActions, action) case querypb.SyncType_Set: addSegments[action.GetNodeID()] = append(addSegments[action.GetNodeID()], action.GetInfo()) - case querypb.SyncType_Amend: - err := shardDelegator.LoadSegments(ctx, &querypb.LoadSegmentsRequest{ - Base: commonpbutil.NewMsgBase(), - DstNodeID: action.GetNodeID(), - CollectionID: action.GetInfo().GetCollectionID(), - Version: action.GetVersion(), - Infos: []*querypb.SegmentLoadInfo{action.GetInfo()}, - LoadScope: querypb.LoadScope_Delta, - }) - if err != nil { - log.Warn("failed to ament segment", - zap.Int64("segmentID", action.SegmentID), - zap.Error(err), - ) - return util.WrapStatus(commonpb.ErrorCode_UnexpectedError, "failed to amend segment", err), nil - } default: return &commonpb.Status{ ErrorCode: commonpb.ErrorCode_UnexpectedError, @@ -1011,10 +998,18 @@ func (node *QueryNode) SyncDistribution(ctx context.Context, req *querypb.SyncDi for nodeID, infos := range addSegments { err := shardDelegator.LoadSegments(ctx, &querypb.LoadSegmentsRequest{ - Base: req.GetBase(), - DstNodeID: nodeID, + Base: commonpbutil.NewMsgBase( + commonpbutil.WithMsgType(commonpb.MsgType_LoadSegments), + commonpbutil.WithMsgID(req.Base.GetMsgID()), + ), Infos: infos, + Schema: req.GetSchema(), + LoadMeta: req.GetLoadMeta(), CollectionID: req.GetCollectionID(), + ReplicaID: req.GetReplicaID(), + DstNodeID: nodeID, + Version: req.GetVersion(), + NeedTransfer: false, }) if err != nil { return util.WrapStatus(commonpb.ErrorCode_UnexpectedError, "failed to sync(load) segment", err), nil diff --git a/internal/querynodev2/services_test.go b/internal/querynodev2/services_test.go index c705745adce4ee17c25c61885b2609fbabc23730..9043f1c788416e27fa8c148ed6cbe49e3a2a6c94 100644 --- a/internal/querynodev2/services_test.go +++ b/internal/querynodev2/services_test.go @@ -1168,15 +1168,7 @@ func (suite *ServiceSuite) TestSyncDistribution_Normal() { PartitionID: suite.partitionIDs[0], } - amendAction := &querypb.SyncAction{ - Type: querypb.SyncType_Amend, - Info: &querypb.SegmentLoadInfo{ - SegmentID: suite.validSegmentIDs[0], - PartitionID: suite.partitionIDs[0], - CollectionID: suite.collectionID, - }, - } - req.Actions = []*querypb.SyncAction{releaseAction, setAction, amendAction} + req.Actions = []*querypb.SyncAction{releaseAction, setAction} status, err := suite.node.SyncDistribution(ctx, req) suite.NoError(err) suite.Equal(commonpb.ErrorCode_UnexpectedError, status.ErrorCode)