1
0
Fork 0
mirror of https://github.com/anyproto/anytype-heart.git synced 2025-06-09 17:44:59 +09:00

GO-3811 Merge branch 'main' into go-3811-lib-declattering

This commit is contained in:
kirillston 2024-08-29 11:10:35 +03:00
commit 697b82ed91
No known key found for this signature in database
GPG key ID: 88218A7F1109754B
75 changed files with 6124 additions and 2665 deletions

View file

@ -82,7 +82,7 @@ jobs:
${{ runner.os }}-go-${{ matrix.go-version }}-
- name: Install old MacOS SDK (for backward compatibility of CGO)
run: source .github/install_macos_sdk.sh 10.15
if: github.event.inputs.run-on-runner != 'ARM64'
if: github.event.inputs.run-on-runner != 'ARM64' && github.event_name != 'schedule'
- name: Set env vars
env:
UNSPLASH_KEY: ${{ secrets.UNSPLASH_KEY }}
@ -233,6 +233,9 @@ jobs:
go install go.uber.org/mock/mockgen@v0.3.0
make test-deps
gomobile bind -tags "envproduction nogrpcserver gomobile nowatchdog nosigar nomutexdeadlockdetector timetzdata" -ldflags "$FLAGS" -v -target=ios -o Lib.xcframework github.com/anyproto/anytype-heart/clientlibrary/service github.com/anyproto/anytype-heart/core || true
mkdir -p dist/ios/ && mv Lib.xcframework dist/ios/
go run cmd/iosrepack/main.go
mv dist/ios/Lib.xcframework .
gtar --exclude ".*" -czvf ios_framework.tar.gz Lib.xcframework protobuf json
gradle publish
mv ios_framework.tar.gz .release/ios_framework_${VERSION}.tar.gz

View file

@ -84,6 +84,9 @@ packages:
github.com/anyproto/anytype-heart/core/block/object/objectcache:
interfaces:
Cache:
github.com/anyproto/anytype-heart/core/block/object/objectcreator:
interfaces:
Service:
github.com/anyproto/anytype-heart/metrics/anymetry:
interfaces:
Service:

View file

@ -135,6 +135,8 @@ endif
@cp pkg/lib/bundle/relations.json dist/ios/json/
@cp pkg/lib/bundle/internal*.json dist/ios/json/
@go mod tidy
@echo 'Repacking iOS framework...'
@go run cmd/iosrepack/main.go
install-dev-ios: setup-go build-ios protos-swift
@echo 'Installing iOS framework locally at $(CLIENT_IOS_PATH)...'
@ -337,7 +339,7 @@ endif
### Tantivy Section
REPO := anyproto/tantivy-go
VERSION := v0.0.7
VERSION := v0.0.9
OUTPUT_DIR := deps/libs
SHA_FILE = tantivity_sha256.txt
@ -349,6 +351,7 @@ TANTIVY_LIBS := android-386.tar.gz \
darwin-arm64.tar.gz \
ios-amd64.tar.gz \
ios-arm64.tar.gz \
ios-arm64-sim.tar.gz \
linux-amd64-musl.tar.gz \
windows-amd64.tar.gz
@ -376,10 +379,12 @@ download-tantivy-all-force: download-tantivy
@echo "SHA256 checksums generated."
download-tantivy-all: download-tantivy
@rm -rf /deps/libs/*
@echo "Validating SHA256 checksums..."
@shasum -a 256 -c $(SHA_FILE) --status || { echo "Hash mismatch detected."; exit 1; }
@echo "All files are valid."
download-tantivy-local:
@rm -rf /deps/libs/*
@mkdir -p $(OUTPUT_DIR)
@cp -r $(TANTIVY_GO_PATH)/libs/ $(OUTPUT_DIR)

View file

@ -25,314 +25,316 @@ const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package
func init() { proto.RegisterFile("pb/protos/service/service.proto", fileDescriptor_93a29dc403579097) }
var fileDescriptor_93a29dc403579097 = []byte{
// 4904 bytes of a gzipped FileDescriptorProto
// 4931 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x9d, 0xdd, 0x6f, 0x24, 0x49,
0x52, 0xc0, 0xb7, 0x5f, 0x58, 0xa8, 0xe3, 0x16, 0xe8, 0x85, 0x65, 0x6f, 0xb9, 0x9b, 0xef, 0x6f,
0x8f, 0xdb, 0xde, 0x99, 0xfd, 0x38, 0xf6, 0x90, 0x90, 0xc7, 0x1e, 0x7b, 0xcd, 0xd9, 0x1e, 0xe3,
0x6e, 0xcf, 0x48, 0x2b, 0x21, 0x51, 0xae, 0x0e, 0xb7, 0x0b, 0x57, 0x57, 0xd6, 0x55, 0x65, 0xb7,
0xa7, 0x0f, 0x81, 0x40, 0x20, 0x10, 0x08, 0xc4, 0x89, 0xaf, 0x17, 0x1e, 0x90, 0xf8, 0x6b, 0xe0,
0xed, 0x1e, 0xef, 0x11, 0xed, 0xfe, 0x23, 0xa7, 0xca, 0xcc, 0xca, 0x8f, 0xa8, 0x8c, 0xac, 0xf2,
0x3e, 0xcd, 0xa8, 0xe3, 0x17, 0x11, 0x99, 0x95, 0x91, 0x99, 0x91, 0x1f, 0x55, 0x8e, 0x6e, 0x16,
0x67, 0x1b, 0x45, 0xc9, 0x38, 0xab, 0x36, 0x2a, 0x28, 0x97, 0x69, 0x02, 0xcd, 0xbf, 0x23, 0xf1,
0xf3, 0xf0, 0xdd, 0x38, 0x5f, 0xf1, 0x55, 0x01, 0x1f, 0x7d, 0x68, 0xc8, 0x84, 0xcd, 0xe7, 0x71,
0x3e, 0xad, 0x24, 0xf2, 0xd1, 0x07, 0x46, 0x02, 0x4b, 0xc8, 0xb9, 0xfa, 0xfd, 0xd9, 0xff, 0xfd,
0x62, 0x10, 0xbd, 0xb7, 0x9d, 0xa5, 0x90, 0xf3, 0x6d, 0xa5, 0x31, 0xfc, 0x2a, 0xfa, 0xee, 0x56,
0x51, 0xec, 0x01, 0x7f, 0x0d, 0x65, 0x95, 0xb2, 0x7c, 0x78, 0x77, 0xa4, 0x1c, 0x8c, 0x4e, 0x8a,
0x64, 0xb4, 0x55, 0x14, 0x23, 0x23, 0x1c, 0x9d, 0xc0, 0x4f, 0x16, 0x50, 0xf1, 0x8f, 0xee, 0x85,
0xa1, 0xaa, 0x60, 0x79, 0x05, 0xc3, 0xf3, 0xe8, 0xb7, 0xb6, 0x8a, 0x62, 0x0c, 0x7c, 0x07, 0xea,
0x0a, 0x8c, 0x79, 0xcc, 0x61, 0xf8, 0xb0, 0xa5, 0xea, 0x02, 0xda, 0xc7, 0xa3, 0x6e, 0x50, 0xf9,
0x99, 0x44, 0xdf, 0xa9, 0xfd, 0x5c, 0x2c, 0xf8, 0x94, 0x5d, 0xe5, 0xc3, 0xdb, 0x6d, 0x45, 0x25,
0xd2, 0xb6, 0xef, 0x84, 0x10, 0x65, 0xf5, 0x4d, 0xf4, 0xeb, 0x6f, 0xe2, 0x2c, 0x03, 0xbe, 0x5d,
0x42, 0x5d, 0x70, 0x57, 0x47, 0x8a, 0x46, 0x52, 0xa6, 0xed, 0xde, 0x0d, 0x32, 0xca, 0xf0, 0x57,
0xd1, 0x77, 0xa5, 0xe4, 0x04, 0x12, 0xb6, 0x84, 0x72, 0xe8, 0xd5, 0x52, 0x42, 0xe2, 0x91, 0xb7,
0x20, 0x6c, 0x7b, 0x9b, 0xe5, 0x4b, 0x28, 0xb9, 0xdf, 0xb6, 0x12, 0x86, 0x6d, 0x1b, 0x48, 0xd9,
0xfe, 0x87, 0x41, 0xf4, 0xfd, 0xad, 0x24, 0x61, 0x8b, 0x9c, 0x1f, 0xb0, 0x24, 0xce, 0x0e, 0xd2,
0xfc, 0xf2, 0x08, 0xae, 0xb6, 0x2f, 0x6a, 0x3e, 0x9f, 0xc1, 0xf0, 0xb9, 0xfb, 0x54, 0x25, 0x3a,
0xd2, 0xec, 0xc8, 0x86, 0xb5, 0xef, 0x4f, 0xae, 0xa7, 0xa4, 0xca, 0xf2, 0x2f, 0x83, 0xe8, 0x06,
0x2e, 0xcb, 0x98, 0x65, 0x4b, 0x30, 0xa5, 0xf9, 0xb4, 0xc3, 0xb0, 0x8b, 0xeb, 0xf2, 0x7c, 0x76,
0x5d, 0x35, 0x55, 0xa2, 0x2c, 0x7a, 0xdf, 0x0e, 0x97, 0x31, 0x54, 0xa2, 0x3b, 0x3d, 0xa6, 0x23,
0x42, 0x21, 0xda, 0xf3, 0x93, 0x3e, 0xa8, 0xf2, 0x96, 0x46, 0x43, 0xe5, 0x2d, 0x63, 0x95, 0x76,
0xf6, 0xc8, 0x6b, 0xc1, 0x22, 0xb4, 0xaf, 0xc7, 0x3d, 0x48, 0xe5, 0xea, 0x4f, 0xa3, 0xdf, 0x78,
0xc3, 0xca, 0xcb, 0xaa, 0x88, 0x13, 0x50, 0x5d, 0xe1, 0xbe, 0xab, 0xdd, 0x48, 0x71, 0x6f, 0x78,
0xd0, 0x85, 0x59, 0x41, 0xdb, 0x08, 0x5f, 0x15, 0x80, 0xc7, 0x20, 0xa3, 0x58, 0x0b, 0xa9, 0xa0,
0xc5, 0x90, 0xb2, 0x7d, 0x19, 0x0d, 0x8d, 0xed, 0xb3, 0x3f, 0x83, 0x84, 0x6f, 0x4d, 0xa7, 0xb8,
0x55, 0x8c, 0xae, 0x20, 0x46, 0x5b, 0xd3, 0x29, 0xd5, 0x2a, 0x7e, 0x54, 0x39, 0xbb, 0x8a, 0x3e,
0x40, 0xce, 0x0e, 0xd2, 0x4a, 0x38, 0x5c, 0x0f, 0x5b, 0x51, 0x98, 0x76, 0x3a, 0xea, 0x8b, 0x2b,
0xc7, 0x7f, 0x35, 0x88, 0xbe, 0xe7, 0xf1, 0x7c, 0x02, 0x73, 0xb6, 0x84, 0xe1, 0x66, 0xb7, 0x35,
0x49, 0x6a, 0xff, 0x1f, 0x5f, 0x43, 0xc3, 0x13, 0x26, 0x63, 0xc8, 0x20, 0xe1, 0x64, 0x98, 0x48,
0x71, 0x67, 0x98, 0x68, 0xcc, 0xea, 0x61, 0x8d, 0x70, 0x0f, 0xf8, 0xf6, 0xa2, 0x2c, 0x21, 0xe7,
0x64, 0x5b, 0x1a, 0xa4, 0xb3, 0x2d, 0x1d, 0xd4, 0x53, 0x9f, 0x3d, 0xe0, 0x5b, 0x59, 0x46, 0xd6,
0x47, 0x8a, 0x3b, 0xeb, 0xa3, 0x31, 0xe5, 0x21, 0x89, 0x7e, 0xd3, 0x7a, 0x62, 0x7c, 0x3f, 0x3f,
0x67, 0x43, 0xfa, 0x59, 0x08, 0xb9, 0xf6, 0xf1, 0xb0, 0x93, 0xf3, 0x54, 0xe3, 0xe5, 0xdb, 0x82,
0x95, 0x74, 0xb3, 0x48, 0x71, 0x67, 0x35, 0x34, 0xa6, 0x3c, 0xfc, 0x49, 0xf4, 0x9e, 0x1a, 0x25,
0x9b, 0xf9, 0xec, 0x9e, 0x77, 0x08, 0xc5, 0x13, 0xda, 0xfd, 0x0e, 0xca, 0x0c, 0x0e, 0x4a, 0xa6,
0x06, 0x9f, 0xbb, 0x5e, 0x3d, 0x34, 0xf4, 0xdc, 0x0b, 0x43, 0x2d, 0xdb, 0x3b, 0x90, 0x01, 0x69,
0x5b, 0x0a, 0x3b, 0x6c, 0x6b, 0x48, 0xd9, 0x2e, 0xa3, 0xdf, 0xd1, 0x8f, 0xa5, 0x9e, 0x47, 0x85,
0xbc, 0x1e, 0xa4, 0xd7, 0x88, 0x7a, 0xdb, 0x90, 0xf6, 0xf5, 0xb4, 0x1f, 0xdc, 0xaa, 0x8f, 0xea,
0x81, 0xfe, 0xfa, 0xa0, 0xfe, 0x77, 0x2f, 0x0c, 0x29, 0xdb, 0xff, 0x38, 0x88, 0x7e, 0xa0, 0x64,
0x2f, 0xf3, 0xf8, 0x2c, 0x03, 0x31, 0x25, 0x1e, 0x01, 0xbf, 0x62, 0xe5, 0xe5, 0x78, 0x95, 0x27,
0xc4, 0xf4, 0xef, 0x87, 0x3b, 0xa6, 0x7f, 0x52, 0xc9, 0xca, 0xf8, 0x54, 0x45, 0x39, 0x2b, 0x70,
0xc6, 0xd7, 0xd4, 0x80, 0xb3, 0x82, 0xca, 0xf8, 0x5c, 0xa4, 0x65, 0xf5, 0xb0, 0x1e, 0x36, 0xfd,
0x56, 0x0f, 0xed, 0x71, 0xf2, 0x4e, 0x08, 0x31, 0xc3, 0x56, 0x13, 0xc0, 0x2c, 0x3f, 0x4f, 0x67,
0xa7, 0xc5, 0xb4, 0x0e, 0xe3, 0xc7, 0xfe, 0x08, 0xb5, 0x10, 0x62, 0xd8, 0x22, 0x50, 0xe5, 0xed,
0x9f, 0x4d, 0x62, 0xa4, 0xba, 0xd2, 0x6e, 0xc9, 0xe6, 0x07, 0x30, 0x8b, 0x93, 0x95, 0xea, 0xff,
0x9f, 0x84, 0x3a, 0x1e, 0xa6, 0x75, 0x21, 0x3e, 0xbd, 0xa6, 0x96, 0x2a, 0xcf, 0x7f, 0x0f, 0xa2,
0x7b, 0x4d, 0xf5, 0x2f, 0xe2, 0x7c, 0x06, 0xaa, 0x3d, 0x65, 0xe9, 0xb7, 0xf2, 0xe9, 0x09, 0x54,
0x3c, 0x2e, 0xf9, 0xf0, 0x0b, 0x7f, 0x25, 0x43, 0x3a, 0xba, 0x6c, 0x3f, 0xfa, 0x56, 0xba, 0xa6,
0xd5, 0xc7, 0xf5, 0xc0, 0xa6, 0x86, 0x00, 0xb7, 0xd5, 0x85, 0x04, 0x0f, 0x00, 0x77, 0x42, 0x88,
0x69, 0x75, 0x21, 0xd8, 0xcf, 0x97, 0x29, 0x87, 0x3d, 0xc8, 0xa1, 0x6c, 0xb7, 0xba, 0x54, 0x75,
0x11, 0xa2, 0xd5, 0x09, 0xd4, 0x0c, 0x36, 0x8e, 0x37, 0x3d, 0x39, 0xae, 0x05, 0x8c, 0xb4, 0xa6,
0xc7, 0xa7, 0xfd, 0x60, 0xb3, 0xba, 0xb3, 0x7c, 0x9e, 0xc0, 0x92, 0x5d, 0xe2, 0xd5, 0x9d, 0x6d,
0x42, 0x02, 0xc4, 0xea, 0xce, 0x0b, 0x9a, 0x19, 0xcc, 0xf2, 0xf3, 0x3a, 0x85, 0x2b, 0x34, 0x83,
0xd9, 0xca, 0xb5, 0x98, 0x98, 0xc1, 0x3c, 0x98, 0xf2, 0x70, 0x14, 0xfd, 0x9a, 0x10, 0xfe, 0x11,
0x4b, 0xf3, 0xe1, 0x4d, 0x8f, 0x52, 0x2d, 0xd0, 0x56, 0x6f, 0xd1, 0x00, 0x2a, 0x71, 0xfd, 0xeb,
0x76, 0x9c, 0x27, 0x90, 0x79, 0x4b, 0x6c, 0xc4, 0xc1, 0x12, 0x3b, 0x98, 0x49, 0x1d, 0x84, 0xb0,
0x1e, 0xbf, 0xc6, 0x17, 0x71, 0x99, 0xe6, 0xb3, 0xa1, 0x4f, 0xd7, 0x92, 0x13, 0xa9, 0x83, 0x8f,
0x43, 0x21, 0xac, 0x14, 0xb7, 0x8a, 0xa2, 0xac, 0x87, 0x45, 0x5f, 0x08, 0xbb, 0x48, 0x30, 0x84,
0x5b, 0xa8, 0xdf, 0xdb, 0x0e, 0x24, 0x59, 0x9a, 0x07, 0xbd, 0x29, 0xa4, 0x8f, 0x37, 0x83, 0xa2,
0xe0, 0x3d, 0x80, 0x78, 0x09, 0x4d, 0xcd, 0x7c, 0x4f, 0xc6, 0x06, 0x82, 0xc1, 0x8b, 0x40, 0xb3,
0x4e, 0x13, 0xe2, 0xc3, 0xf8, 0x12, 0xea, 0x07, 0x0c, 0xf5, 0xbc, 0x36, 0xf4, 0xe9, 0x3b, 0x04,
0xb1, 0x4e, 0xf3, 0x93, 0xca, 0xd5, 0x22, 0xfa, 0x40, 0xc8, 0x8f, 0xe3, 0x92, 0xa7, 0x49, 0x5a,
0xc4, 0x79, 0x93, 0xff, 0xfb, 0xfa, 0x75, 0x8b, 0xd2, 0x2e, 0xd7, 0x7b, 0xd2, 0xca, 0xed, 0x7f,
0x0e, 0xa2, 0xdb, 0xd8, 0xef, 0x31, 0x94, 0xf3, 0x54, 0x2c, 0x23, 0x2b, 0x39, 0x08, 0x0f, 0x3f,
0x0f, 0x1b, 0x6d, 0x29, 0xe8, 0xd2, 0xfc, 0xf0, 0xfa, 0x8a, 0xaa, 0x60, 0x7f, 0x1c, 0x45, 0x72,
0xb9, 0x22, 0x96, 0x94, 0x6e, 0xaf, 0x55, 0xeb, 0x18, 0x67, 0x3d, 0x79, 0x3b, 0x40, 0x98, 0xa9,
0x42, 0xfe, 0x2e, 0x56, 0xca, 0x43, 0xaf, 0x86, 0x10, 0x11, 0x53, 0x05, 0x42, 0x70, 0x41, 0xc7,
0x17, 0xec, 0xca, 0x5f, 0xd0, 0x5a, 0x12, 0x2e, 0xa8, 0x22, 0xcc, 0xde, 0x95, 0x2a, 0xa8, 0x6f,
0xef, 0xaa, 0x29, 0x46, 0x68, 0xef, 0x0a, 0x33, 0xca, 0x30, 0x8b, 0x7e, 0xdb, 0x36, 0xfc, 0x82,
0xb1, 0xcb, 0x79, 0x5c, 0x5e, 0x0e, 0x9f, 0xd0, 0xca, 0x0d, 0xa3, 0x1d, 0xad, 0xf5, 0x62, 0xcd,
0xb0, 0x60, 0x3b, 0xac, 0x13, 0x8d, 0xd3, 0x32, 0x43, 0xc3, 0x82, 0x63, 0x43, 0x21, 0xc4, 0xb0,
0x40, 0xa0, 0x66, 0xe4, 0xb6, 0xbd, 0x8d, 0x01, 0xaf, 0x96, 0x1c, 0xf5, 0x31, 0x50, 0xab, 0x25,
0x0f, 0x86, 0x43, 0x68, 0xaf, 0x8c, 0x8b, 0x0b, 0x7f, 0x08, 0x09, 0x51, 0x38, 0x84, 0x1a, 0x04,
0xb7, 0xf7, 0x18, 0xe2, 0x32, 0xb9, 0xf0, 0xb7, 0xb7, 0x94, 0x85, 0xdb, 0x5b, 0x33, 0xb8, 0xbd,
0xa5, 0xe0, 0x4d, 0xca, 0x2f, 0x0e, 0x81, 0xc7, 0xfe, 0xf6, 0x76, 0x99, 0x70, 0x7b, 0xb7, 0x58,
0x93, 0xc9, 0xd8, 0x0e, 0xc7, 0x8b, 0xb3, 0x2a, 0x29, 0xd3, 0x33, 0x18, 0x06, 0xac, 0x68, 0x88,
0xc8, 0x64, 0x48, 0xd8, 0x0c, 0xd2, 0xca, 0x67, 0x23, 0xdb, 0x9f, 0x56, 0x68, 0x90, 0x6e, 0x6c,
0x58, 0x04, 0x31, 0x48, 0xfb, 0x49, 0x5c, 0xbd, 0xbd, 0x92, 0x2d, 0x8a, 0xaa, 0xa3, 0x7a, 0x08,
0x0a, 0x57, 0xaf, 0x0d, 0x2b, 0x9f, 0x6f, 0xa3, 0xdf, 0xb5, 0x1f, 0xe9, 0x69, 0x5e, 0x69, 0xaf,
0xeb, 0xf4, 0x73, 0xb2, 0x30, 0x62, 0x5b, 0x2a, 0x80, 0x9b, 0x34, 0xa5, 0xf1, 0xcc, 0x77, 0x80,
0xc7, 0x69, 0x56, 0x0d, 0x1f, 0xf8, 0x6d, 0x34, 0x72, 0x22, 0x4d, 0xf1, 0x71, 0xb8, 0xcf, 0xee,
0x2c, 0x8a, 0x2c, 0x4d, 0xda, 0xfb, 0x93, 0x4a, 0x57, 0x8b, 0xc3, 0x7d, 0xd6, 0xc6, 0xf0, 0x18,
0x34, 0x06, 0x2e, 0xff, 0x33, 0x59, 0x15, 0xe0, 0x1f, 0x83, 0x1c, 0x24, 0x3c, 0x06, 0x61, 0x14,
0xd7, 0x67, 0x0c, 0xfc, 0x20, 0x5e, 0xb1, 0x05, 0x31, 0x06, 0x69, 0x71, 0xb8, 0x3e, 0x36, 0x66,
0x32, 0x05, 0xed, 0x61, 0x3f, 0xe7, 0x50, 0xe6, 0x71, 0xb6, 0x9b, 0xc5, 0xb3, 0x6a, 0x48, 0xf4,
0x1b, 0x97, 0x22, 0x32, 0x05, 0x9a, 0xf6, 0x3c, 0xc6, 0xfd, 0x6a, 0x37, 0x5e, 0xb2, 0x32, 0xe5,
0xf4, 0x63, 0x34, 0x48, 0xe7, 0x63, 0x74, 0x50, 0xaf, 0xb7, 0xad, 0x32, 0xb9, 0x48, 0x97, 0x30,
0x0d, 0x78, 0x6b, 0x90, 0x1e, 0xde, 0x2c, 0xd4, 0xd3, 0x68, 0x63, 0xb6, 0x28, 0x13, 0x20, 0x1b,
0x4d, 0x8a, 0x3b, 0x1b, 0x4d, 0x63, 0xca, 0xc3, 0xdf, 0x0e, 0xa2, 0xdf, 0x93, 0x52, 0x7b, 0xd3,
0x70, 0x27, 0xae, 0x2e, 0xce, 0x58, 0x5c, 0x4e, 0x87, 0x1f, 0xfb, 0xec, 0x78, 0x51, 0xed, 0xfa,
0xd9, 0x75, 0x54, 0xf0, 0x63, 0x3d, 0x48, 0x2b, 0xab, 0xc7, 0x79, 0x1f, 0xab, 0x83, 0x84, 0x1f,
0x2b, 0x46, 0xf1, 0x00, 0x22, 0xe4, 0x72, 0x81, 0xfe, 0x80, 0xd4, 0x77, 0x57, 0xe9, 0x0f, 0x3b,
0x39, 0x3c, 0x3e, 0xd6, 0x42, 0x37, 0x5a, 0xd6, 0x29, 0x1b, 0xfe, 0x88, 0x19, 0xf5, 0xc5, 0x49,
0xcf, 0xba, 0x57, 0x84, 0x3d, 0xb7, 0x7a, 0xc6, 0xa8, 0x2f, 0x4e, 0x78, 0xb6, 0x86, 0xb5, 0x90,
0x67, 0xcf, 0xd0, 0x36, 0xea, 0x8b, 0xe3, 0x8c, 0x42, 0x31, 0xcd, 0xbc, 0xf0, 0x24, 0x60, 0x07,
0xcf, 0x0d, 0x6b, 0xbd, 0x58, 0x1c, 0xb1, 0x5b, 0x45, 0x91, 0xad, 0x26, 0x30, 0x2f, 0x32, 0x32,
0x62, 0x1d, 0x24, 0x1c, 0xb1, 0x18, 0xc5, 0xf9, 0xdd, 0x84, 0xd5, 0xd9, 0xa3, 0x37, 0xbf, 0x13,
0xa2, 0x70, 0x7e, 0xd7, 0x20, 0x38, 0x43, 0x99, 0xb0, 0x6d, 0x96, 0x65, 0x90, 0xf0, 0xf6, 0x71,
0x9f, 0xd6, 0x34, 0x44, 0x38, 0x43, 0x41, 0xa4, 0x59, 0x19, 0x37, 0xab, 0x91, 0xb8, 0x84, 0x17,
0xab, 0x83, 0x34, 0xbf, 0x1c, 0xfa, 0x27, 0x63, 0x03, 0x10, 0x2b, 0x63, 0x2f, 0x88, 0x57, 0x3d,
0xa7, 0xf9, 0x94, 0xf9, 0x57, 0x3d, 0xb5, 0x24, 0xbc, 0xea, 0x51, 0x04, 0x36, 0x79, 0x02, 0x94,
0xc9, 0x5a, 0x12, 0x36, 0xa9, 0x08, 0xdf, 0x00, 0xa4, 0xf6, 0x4f, 0xc9, 0x01, 0x08, 0xed, 0x98,
0x3e, 0xec, 0xe4, 0x70, 0x84, 0x36, 0xcb, 0x9f, 0x5d, 0xe0, 0xc9, 0x85, 0x3f, 0x42, 0x1d, 0x24,
0x1c, 0xa1, 0x18, 0xc5, 0x55, 0x9a, 0x30, 0xbd, 0x7c, 0x7b, 0xe0, 0x8f, 0x8f, 0xd6, 0xd2, 0xed,
0x61, 0x27, 0x87, 0x17, 0x24, 0xfb, 0x73, 0xf1, 0xcc, 0xbc, 0x41, 0x2e, 0x65, 0xe1, 0x05, 0x89,
0x66, 0x70, 0xe9, 0xa5, 0xa0, 0x7e, 0x9c, 0xfe, 0xd2, 0x1b, 0x79, 0xb8, 0xf4, 0x0e, 0xa7, 0x9c,
0xfc, 0xfb, 0x20, 0xba, 0x69, 0x7b, 0x39, 0x62, 0x75, 0x1f, 0x79, 0x1d, 0x67, 0xe9, 0x34, 0xe6,
0x30, 0x61, 0x97, 0x90, 0xa3, 0x1d, 0x0d, 0xb7, 0xb4, 0x92, 0x1f, 0x39, 0x0a, 0xc4, 0x8e, 0x46,
0x2f, 0x45, 0x1c, 0x27, 0x92, 0x3e, 0xad, 0x60, 0x3b, 0xae, 0x88, 0x91, 0xcc, 0x41, 0xc2, 0x71,
0x82, 0x51, 0x9c, 0x25, 0x4a, 0xf9, 0xcb, 0xb7, 0x05, 0x94, 0x29, 0xe4, 0x09, 0xf8, 0xb3, 0x44,
0x4c, 0x85, 0xb3, 0x44, 0x0f, 0xdd, 0x5a, 0xf0, 0xeb, 0xc1, 0xa9, 0x7d, 0x62, 0x8f, 0x89, 0xc0,
0x89, 0x3d, 0x81, 0xe2, 0x4a, 0x1a, 0xc0, 0xbb, 0x69, 0xd6, 0xb2, 0x12, 0xdc, 0x34, 0xa3, 0xe9,
0xd6, 0x36, 0x8a, 0x66, 0xc6, 0x75, 0x37, 0xe9, 0x28, 0xfa, 0xd8, 0xee, 0x2e, 0x6b, 0xbd, 0x58,
0xff, 0xbe, 0xcd, 0x09, 0x64, 0xb1, 0x98, 0x42, 0x02, 0x9b, 0x23, 0x0d, 0xd3, 0x67, 0xdf, 0xc6,
0x62, 0x95, 0xc3, 0xbf, 0x1e, 0x44, 0x1f, 0xf9, 0x3c, 0xbe, 0x2a, 0x84, 0xdf, 0xcd, 0x6e, 0x5b,
0x92, 0x24, 0xae, 0x24, 0x84, 0x35, 0x54, 0x19, 0xfe, 0x3c, 0xfa, 0xb0, 0x11, 0x99, 0x1b, 0x0b,
0xaa, 0x00, 0x6e, 0xda, 0xa2, 0xcb, 0x8f, 0x39, 0xed, 0x7e, 0xa3, 0x37, 0x6f, 0x56, 0x04, 0x6e,
0xb9, 0x2a, 0xb4, 0x22, 0xd0, 0x36, 0x94, 0x98, 0x58, 0x11, 0x78, 0x30, 0x3c, 0x53, 0x37, 0x48,
0xdd, 0x4f, 0x7c, 0x63, 0x9c, 0x36, 0x61, 0xf7, 0x92, 0x47, 0xdd, 0x20, 0x8e, 0x9d, 0x46, 0xac,
0x12, 0xf1, 0x27, 0x21, 0x0b, 0x28, 0x19, 0x5f, 0xeb, 0xc5, 0x2a, 0x87, 0x7f, 0x19, 0x7d, 0xaf,
0x55, 0xb1, 0x5d, 0x88, 0xf9, 0xa2, 0x84, 0xe9, 0x70, 0xa3, 0xa3, 0xdc, 0x0d, 0xa8, 0x5d, 0x6f,
0xf6, 0x57, 0x50, 0xfe, 0xff, 0x7e, 0x10, 0x7d, 0xdf, 0xe5, 0x64, 0x13, 0xeb, 0x32, 0x3c, 0x0b,
0x99, 0x74, 0x59, 0x5d, 0x8c, 0xe7, 0xd7, 0xd2, 0x69, 0x2d, 0xfa, 0xec, 0x40, 0xde, 0x5a, 0xc6,
0x69, 0x26, 0x0e, 0x12, 0x3e, 0x0e, 0x19, 0x75, 0xd0, 0xe0, 0xa2, 0x8f, 0x54, 0x69, 0x8d, 0x92,
0xa2, 0xbf, 0x59, 0x8b, 0x85, 0xa7, 0x74, 0xaf, 0xf4, 0xac, 0x15, 0xd6, 0x7b, 0xd2, 0xca, 0x2d,
0x6f, 0x36, 0xcb, 0xea, 0x9f, 0xed, 0x20, 0xf7, 0x79, 0x55, 0xaa, 0x9e, 0x48, 0x5f, 0xef, 0x49,
0x2b, 0xaf, 0x7f, 0x11, 0x7d, 0xd8, 0xf6, 0xaa, 0x26, 0x85, 0x8d, 0x4e, 0x53, 0x68, 0x5e, 0xd8,
0xec, 0xaf, 0x60, 0x52, 0xfd, 0x2f, 0xd3, 0x8a, 0xb3, 0x72, 0x35, 0xbe, 0x60, 0x57, 0xcd, 0xad,
0x5c, 0xb7, 0xb7, 0x2a, 0x60, 0x64, 0x11, 0x44, 0xaa, 0xef, 0x27, 0x5b, 0xae, 0xcc, 0xed, 0xdd,
0x8a, 0x70, 0x65, 0x11, 0x1d, 0xae, 0x5c, 0xd2, 0x8c, 0x55, 0x4d, 0xad, 0xcc, 0x55, 0xe3, 0x87,
0xfe, 0xa2, 0xb6, 0xaf, 0x1b, 0x3f, 0xea, 0x06, 0x4d, 0xf6, 0xa0, 0xc4, 0x3b, 0xe9, 0xf9, 0xb9,
0xae, 0x93, 0xbf, 0xa4, 0x36, 0x42, 0x64, 0x0f, 0x04, 0x6a, 0x92, 0xd1, 0xdd, 0x34, 0x03, 0x71,
0x2a, 0xf5, 0xea, 0xfc, 0x3c, 0x63, 0xf1, 0x14, 0x25, 0xa3, 0xb5, 0x78, 0x64, 0xcb, 0x89, 0x64,
0xd4, 0xc7, 0x99, 0x4b, 0x3d, 0xb5, 0xf4, 0x04, 0x12, 0x96, 0x27, 0x69, 0x86, 0x2f, 0x29, 0x09,
0x4d, 0x2d, 0x24, 0x2e, 0xf5, 0xb4, 0x20, 0x33, 0x49, 0xd5, 0xa2, 0xba, 0xdb, 0x37, 0xe5, 0xbf,
0xdf, 0x56, 0xb4, 0xc4, 0xc4, 0x24, 0xe5, 0xc1, 0xcc, 0x9a, 0xac, 0x16, 0x9e, 0x16, 0xc2, 0xf8,
0xad, 0xb6, 0x96, 0x94, 0x10, 0x6b, 0x32, 0x97, 0x30, 0x6b, 0x8b, 0xfa, 0xf7, 0x1d, 0x76, 0x95,
0x0b, 0xa3, 0x77, 0xda, 0x2a, 0x8d, 0x8c, 0x58, 0x5b, 0x60, 0x46, 0x19, 0xfe, 0x71, 0xf4, 0xab,
0xc2, 0x70, 0xc9, 0x8a, 0xe1, 0x0d, 0x8f, 0x42, 0x69, 0xdd, 0x27, 0xba, 0x49, 0xca, 0xcd, 0xb5,
0x38, 0x1d, 0x1b, 0xa7, 0x55, 0x3c, 0x83, 0xe1, 0x3d, 0xa2, 0xc5, 0x85, 0x94, 0xb8, 0x16, 0xd7,
0xa6, 0xdc, 0xa8, 0x38, 0x62, 0x53, 0x65, 0xdd, 0x53, 0x43, 0x2d, 0x0c, 0x45, 0x85, 0x0d, 0x99,
0x43, 0x8a, 0xa3, 0x78, 0x99, 0xce, 0xf4, 0x84, 0x23, 0xc7, 0xad, 0x0a, 0x1d, 0x52, 0x18, 0x66,
0x64, 0x41, 0xc4, 0x21, 0x05, 0x09, 0x2b, 0x9f, 0xff, 0x36, 0x88, 0x6e, 0x19, 0x66, 0xaf, 0xd9,
0x3b, 0xda, 0xcf, 0xcf, 0xd9, 0x9b, 0x94, 0x5f, 0x1c, 0xa4, 0xf9, 0x65, 0x35, 0xfc, 0x8c, 0x32,
0xe9, 0xe7, 0x75, 0x51, 0x3e, 0xbf, 0xb6, 0x9e, 0xc9, 0x20, 0x9b, 0x2d, 0x1e, 0x73, 0x62, 0x28,
0x35, 0x50, 0x06, 0xa9, 0x77, 0x82, 0x30, 0x47, 0x64, 0x90, 0x21, 0xde, 0x34, 0xb1, 0x76, 0x9e,
0xb1, 0x1c, 0x37, 0xb1, 0xb1, 0x50, 0x0b, 0x89, 0x26, 0x6e, 0x41, 0x66, 0x3c, 0x6e, 0x44, 0x72,
0x37, 0x62, 0x2b, 0xcb, 0xd0, 0x78, 0xac, 0x55, 0x35, 0x40, 0x8c, 0xc7, 0x5e, 0x50, 0xf9, 0x39,
0x89, 0xbe, 0x53, 0x3f, 0xd2, 0xe3, 0x12, 0x96, 0x29, 0xe0, 0xc3, 0x6d, 0x4b, 0x42, 0xf4, 0x7f,
0x97, 0x30, 0x3d, 0xeb, 0x34, 0xaf, 0x8a, 0x2c, 0xae, 0x2e, 0xd4, 0x71, 0xa7, 0x5b, 0xe7, 0x46,
0x88, 0x0f, 0x3c, 0xef, 0x77, 0x50, 0x66, 0x50, 0x6f, 0x64, 0x7a, 0x88, 0x79, 0xe0, 0x57, 0x6d,
0x0d, 0x33, 0x0f, 0x3b, 0x39, 0xb3, 0xff, 0xba, 0x17, 0x67, 0x19, 0x94, 0xab, 0x46, 0x76, 0x18,
0xe7, 0xe9, 0x39, 0x54, 0x1c, 0xed, 0xbf, 0x2a, 0x6a, 0x84, 0x31, 0x62, 0xff, 0x35, 0x80, 0x9b,
0x6c, 0x1e, 0x79, 0xde, 0xcf, 0xa7, 0xf0, 0x16, 0x65, 0xf3, 0xd8, 0x8e, 0x60, 0x88, 0x6c, 0x9e,
0x62, 0xcd, 0x8e, 0xe8, 0x8b, 0x8c, 0x25, 0x97, 0x6a, 0x0a, 0x70, 0x1b, 0x58, 0x48, 0xf0, 0x1c,
0x70, 0x27, 0x84, 0x98, 0x49, 0x40, 0x08, 0x4e, 0xa0, 0xc8, 0xe2, 0x04, 0xdf, 0x70, 0x90, 0x3a,
0x4a, 0x46, 0x4c, 0x02, 0x98, 0x41, 0xc5, 0x55, 0x37, 0x27, 0x7c, 0xc5, 0x45, 0x17, 0x27, 0xee,
0x84, 0x10, 0x33, 0x0d, 0x0a, 0xc1, 0xb8, 0xc8, 0x52, 0x8e, 0xba, 0x81, 0xd4, 0x10, 0x12, 0xa2,
0x1b, 0xb8, 0x04, 0x32, 0x79, 0x08, 0xe5, 0x0c, 0xbc, 0x26, 0x85, 0x24, 0x68, 0xb2, 0x21, 0xcc,
0x45, 0x38, 0x59, 0x77, 0x56, 0xac, 0xd0, 0x45, 0x38, 0x55, 0x2d, 0x56, 0xac, 0x88, 0x8b, 0x70,
0x0e, 0x80, 0x8a, 0x78, 0x1c, 0x57, 0xdc, 0x5f, 0x44, 0x21, 0x09, 0x16, 0xb1, 0x21, 0xcc, 0x1c,
0x2d, 0x8b, 0xb8, 0xe0, 0x68, 0x8e, 0x56, 0x05, 0xb0, 0xce, 0x43, 0x6f, 0x92, 0x72, 0x33, 0x92,
0xc8, 0x56, 0x01, 0xbe, 0x9b, 0x42, 0x36, 0xad, 0xd0, 0x48, 0xa2, 0x9e, 0x7b, 0x23, 0x25, 0x46,
0x92, 0x36, 0x85, 0x42, 0x49, 0xed, 0x1b, 0xfb, 0x6a, 0x87, 0xb6, 0x8c, 0xef, 0x84, 0x10, 0x33,
0x3e, 0x35, 0x85, 0xde, 0x8e, 0xcb, 0x32, 0xad, 0x27, 0xff, 0x07, 0xfe, 0x02, 0x35, 0x72, 0x62,
0x7c, 0xf2, 0x71, 0xa8, 0x7b, 0x35, 0x03, 0xb7, 0xaf, 0x60, 0x78, 0xe8, 0xbe, 0x1b, 0x64, 0x4c,
0xc6, 0x29, 0x24, 0xd6, 0x81, 0x9e, 0xef, 0x69, 0x7a, 0xce, 0xf3, 0x1e, 0x74, 0x61, 0xd6, 0x45,
0x75, 0xed, 0xe2, 0x90, 0x2d, 0x61, 0xc2, 0x5e, 0xbe, 0x4d, 0x2b, 0x9e, 0xe6, 0x33, 0x35, 0x73,
0x3f, 0x27, 0x2c, 0xf9, 0x60, 0xe2, 0xa2, 0x7a, 0xa7, 0x92, 0x49, 0x20, 0x50, 0x59, 0x8e, 0xe0,
0xca, 0x9b, 0x40, 0x60, 0x8b, 0x9a, 0x23, 0x12, 0x88, 0x10, 0x6f, 0xf6, 0x51, 0xb4, 0x73, 0xf5,
0x36, 0xdf, 0x84, 0x35, 0xb9, 0x1c, 0x65, 0x0d, 0x83, 0xc4, 0x52, 0x36, 0xa8, 0x60, 0xd6, 0x97,
0xda, 0xbf, 0xe9, 0x62, 0x8f, 0x08, 0x3b, 0xed, 0x6e, 0xf6, 0xb8, 0x07, 0xe9, 0x71, 0x65, 0x4e,
0xa5, 0x29, 0x57, 0xed, 0x43, 0xe9, 0xc7, 0x3d, 0x48, 0x6b, 0x4f, 0xc6, 0xae, 0xd6, 0x8b, 0x38,
0xb9, 0x9c, 0x95, 0x6c, 0x91, 0x4f, 0xb7, 0x59, 0xc6, 0x4a, 0xb4, 0x27, 0xe3, 0x94, 0x1a, 0xa1,
0xc4, 0x9e, 0x4c, 0x87, 0x8a, 0xc9, 0xe0, 0xec, 0x52, 0x6c, 0x65, 0xe9, 0x0c, 0xaf, 0xa8, 0x1d,
0x43, 0x02, 0x20, 0x32, 0x38, 0x2f, 0xe8, 0x09, 0x22, 0xb9, 0xe2, 0xe6, 0x69, 0x12, 0x67, 0xd2,
0xdf, 0x06, 0x6d, 0xc6, 0x01, 0x3b, 0x83, 0xc8, 0xa3, 0xe0, 0xa9, 0xe7, 0x64, 0x51, 0xe6, 0xfb,
0x39, 0x67, 0x64, 0x3d, 0x1b, 0xa0, 0xb3, 0x9e, 0x16, 0x88, 0x86, 0xd5, 0x09, 0xbc, 0xad, 0x4b,
0x53, 0xff, 0xe3, 0x1b, 0x56, 0xeb, 0xdf, 0x47, 0x4a, 0x1e, 0x1a, 0x56, 0x11, 0x87, 0x2a, 0xa3,
0x9c, 0xc8, 0x80, 0x09, 0x68, 0xbb, 0x61, 0xf2, 0xa8, 0x1b, 0xf4, 0xfb, 0x19, 0xf3, 0x55, 0x06,
0x21, 0x3f, 0x02, 0xe8, 0xe3, 0xa7, 0x01, 0xcd, 0x76, 0x8b, 0x53, 0x9f, 0x0b, 0x48, 0x2e, 0x5b,
0x97, 0x6c, 0xdc, 0x82, 0x4a, 0x84, 0xd8, 0x6e, 0x21, 0x50, 0x7f, 0x13, 0xed, 0x27, 0x2c, 0x0f,
0x35, 0x51, 0x2d, 0xef, 0xd3, 0x44, 0x8a, 0x33, 0x8b, 0x5f, 0x2d, 0x55, 0x91, 0x29, 0x9b, 0x69,
0x8d, 0xb0, 0x60, 0x43, 0xc4, 0xe2, 0x97, 0x84, 0x4d, 0x4e, 0x8e, 0x7d, 0x1e, 0xb6, 0x6f, 0xd5,
0xb6, 0xac, 0x1c, 0xd2, 0xb7, 0x6a, 0x29, 0x96, 0xae, 0xa4, 0x8c, 0x91, 0x0e, 0x2b, 0x6e, 0x9c,
0x3c, 0xed, 0x07, 0x9b, 0x25, 0x8f, 0xe3, 0x73, 0x3b, 0x83, 0xb8, 0x94, 0x5e, 0xd7, 0x03, 0x86,
0x0c, 0x46, 0x2c, 0x79, 0x02, 0x38, 0x1a, 0xc2, 0x1c, 0xcf, 0xdb, 0x2c, 0xe7, 0x90, 0x73, 0xdf,
0x10, 0xe6, 0x1a, 0x53, 0x60, 0x68, 0x08, 0xa3, 0x14, 0x50, 0xdc, 0x8a, 0xfd, 0x20, 0xe0, 0x47,
0xf1, 0xdc, 0x9b, 0xb1, 0xc9, 0xbd, 0x1e, 0x29, 0x0f, 0xc5, 0x2d, 0xe2, 0xac, 0x03, 0x37, 0xdb,
0xcb, 0x24, 0x2e, 0x67, 0x7a, 0x77, 0x63, 0x3a, 0xdc, 0xa4, 0xed, 0xb8, 0x24, 0x71, 0xe0, 0x16,
0xd6, 0x40, 0xc3, 0xce, 0xfe, 0x3c, 0x9e, 0xe9, 0x9a, 0x7a, 0x6a, 0x20, 0xe4, 0xad, 0xaa, 0x3e,
0xea, 0x06, 0x91, 0x9f, 0xd7, 0xe9, 0x14, 0x58, 0xc0, 0x8f, 0x90, 0xf7, 0xf1, 0x83, 0x41, 0x94,
0xbd, 0xd5, 0xf5, 0x96, 0x2b, 0xba, 0xad, 0x7c, 0xaa, 0xd6, 0xb1, 0x23, 0xe2, 0xf1, 0x20, 0x2e,
0x94, 0xbd, 0x11, 0x3c, 0xea, 0xa3, 0xcd, 0x06, 0x6d, 0xa8, 0x8f, 0xea, 0xfd, 0xd7, 0x3e, 0x7d,
0xd4, 0x07, 0x2b, 0x9f, 0x3f, 0x55, 0x7d, 0x74, 0x27, 0xe6, 0x71, 0x9d, 0xb7, 0xbf, 0x4e, 0xe1,
0x4a, 0x2d, 0x84, 0x3d, 0xf5, 0x6d, 0xa8, 0x91, 0x78, 0x9d, 0x0a, 0xad, 0x8a, 0x37, 0x7a, 0xf3,
0x01, 0xdf, 0x6a, 0x85, 0xd0, 0xe9, 0x1b, 0x2d, 0x15, 0x36, 0x7a, 0xf3, 0x01, 0xdf, 0xea, 0x3d,
0xcd, 0x4e, 0xdf, 0xe8, 0x65, 0xcd, 0x8d, 0xde, 0xbc, 0xf2, 0xfd, 0x37, 0x4d, 0xc7, 0xb5, 0x9d,
0xd7, 0x79, 0x58, 0xc2, 0xd3, 0x25, 0xf8, 0xd2, 0x49, 0xd7, 0x9e, 0x46, 0x43, 0xe9, 0x24, 0xad,
0x62, 0x7d, 0xdc, 0xc3, 0x57, 0x8a, 0x63, 0x56, 0xa5, 0xe2, 0xc0, 0xfc, 0x79, 0x0f, 0xa3, 0x0d,
0x1c, 0x5a, 0x34, 0x85, 0x94, 0xcc, 0x71, 0xa3, 0x83, 0x9a, 0x3b, 0xb5, 0x4f, 0x03, 0xf6, 0xda,
0x57, 0x6b, 0xd7, 0x7b, 0xd2, 0xe6, 0xe0, 0xcf, 0x61, 0xec, 0x13, 0xc7, 0x50, 0xab, 0x7a, 0x0f,
0x1d, 0x37, 0xfb, 0x2b, 0x28, 0xf7, 0x7f, 0xd7, 0xac, 0x2b, 0xb0, 0x7f, 0xd5, 0x09, 0x9e, 0xf5,
0xb1, 0x88, 0x3a, 0xc2, 0xf3, 0x6b, 0xe9, 0xa8, 0x82, 0xfc, 0xd7, 0x20, 0xba, 0xe3, 0x2d, 0x88,
0x7b, 0xf6, 0xfc, 0xfb, 0x7d, 0x6c, 0xfb, 0xcf, 0xa0, 0xbf, 0xf8, 0x36, 0xaa, 0xaa, 0x74, 0xff,
0xd4, 0x2c, 0xef, 0x1b, 0x0d, 0xf1, 0xde, 0xc3, 0xab, 0x72, 0x0a, 0xa5, 0xea, 0xb1, 0xa1, 0xa0,
0x33, 0x30, 0xee, 0xb7, 0x9f, 0x5e, 0x53, 0xcb, 0xfa, 0x10, 0x8d, 0x03, 0xab, 0x77, 0xce, 0xac,
0xf2, 0x84, 0x2c, 0x5b, 0x34, 0x2e, 0xd0, 0x67, 0xd7, 0x55, 0xa3, 0x7a, 0xb2, 0x05, 0x8b, 0xf7,
0xda, 0x9f, 0xf7, 0x34, 0xec, 0xbc, 0xe9, 0xfe, 0xc9, 0xf5, 0x94, 0x54, 0x59, 0xfe, 0x67, 0x10,
0xdd, 0x77, 0x58, 0x73, 0xda, 0x81, 0xf6, 0x64, 0x7e, 0x14, 0xb0, 0x4f, 0x29, 0xe9, 0xc2, 0xfd,
0xc1, 0xb7, 0x53, 0x36, 0x5f, 0x6d, 0x71, 0x54, 0x76, 0xd3, 0x8c, 0x43, 0xd9, 0xfe, 0x6a, 0x8b,
0x6b, 0x57, 0x52, 0x23, 0xfa, 0xab, 0x2d, 0x01, 0xdc, 0xfa, 0x6a, 0x8b, 0xc7, 0xb3, 0xf7, 0xab,
0x2d, 0x5e, 0x6b, 0xc1, 0xaf, 0xb6, 0x84, 0x35, 0xa8, 0xc9, 0xa7, 0x29, 0x82, 0xdc, 0x55, 0xef,
0x65, 0xd1, 0xdd, 0x64, 0x7f, 0x76, 0x1d, 0x15, 0x62, 0xfa, 0x95, 0x9c, 0xb8, 0x11, 0xd7, 0xe3,
0x99, 0x3a, 0xb7, 0xe2, 0x36, 0x7a, 0xf3, 0xca, 0xf7, 0x4f, 0xd4, 0xda, 0x4b, 0x4f, 0x36, 0xac,
0x14, 0x5f, 0xec, 0x59, 0x0b, 0x4d, 0x1e, 0xb5, 0x05, 0xbb, 0xe5, 0x9f, 0xf6, 0x83, 0x89, 0xea,
0xd6, 0x84, 0x6a, 0xf4, 0x51, 0x97, 0x21, 0xd4, 0xe4, 0x1b, 0xbd, 0x79, 0x62, 0x92, 0x93, 0xbe,
0x65, 0x6b, 0xf7, 0x30, 0xe6, 0xb6, 0xf5, 0x66, 0x7f, 0x05, 0xe5, 0x7e, 0xa9, 0x92, 0x5a, 0xdb,
0xbd, 0x68, 0xe7, 0xf5, 0x2e, 0x53, 0x63, 0xa7, 0x99, 0x47, 0x7d, 0xf1, 0x50, 0x7a, 0x63, 0x4f,
0xf0, 0x5d, 0xe9, 0x8d, 0x77, 0x92, 0xff, 0xe4, 0x7a, 0x4a, 0xaa, 0x2c, 0xff, 0x3a, 0x88, 0x6e,
0x92, 0x65, 0x51, 0x71, 0xf0, 0x59, 0x5f, 0xcb, 0x28, 0x1e, 0x3e, 0xbf, 0xb6, 0x9e, 0x2a, 0xd4,
0x7f, 0x0c, 0xa2, 0x5b, 0x81, 0x42, 0xc9, 0x00, 0xb9, 0x86, 0x75, 0x37, 0x50, 0x7e, 0x78, 0x7d,
0x45, 0x6a, 0xba, 0xb7, 0xf1, 0x71, 0xfb, 0x73, 0x26, 0x01, 0xdb, 0x63, 0xfa, 0x73, 0x26, 0xdd,
0x5a, 0x78, 0x0b, 0xaa, 0x4e, 0x4a, 0xd4, 0xca, 0xc8, 0xb7, 0x05, 0x25, 0x72, 0x16, 0xb4, 0x22,
0x7a, 0xd8, 0xc9, 0xf9, 0x9c, 0xbc, 0x7c, 0x5b, 0xc4, 0xf9, 0x94, 0x76, 0x22, 0xe5, 0xdd, 0x4e,
0x34, 0x87, 0xb7, 0xee, 0x6a, 0xe9, 0x09, 0x6b, 0x96, 0x79, 0x8f, 0x29, 0x7d, 0x8d, 0x04, 0xb7,
0xee, 0x5a, 0x28, 0xe1, 0x4d, 0xe5, 0xb4, 0x21, 0x6f, 0x28, 0x95, 0x7d, 0xd2, 0x07, 0x45, 0x0b,
0x08, 0xed, 0x4d, 0x9f, 0x08, 0x3c, 0x0d, 0x59, 0x69, 0x9d, 0x0a, 0xac, 0xf7, 0xa4, 0x09, 0xb7,
0x63, 0xe0, 0x5f, 0x42, 0x3c, 0x85, 0x32, 0xe8, 0x56, 0x53, 0xbd, 0xdc, 0xda, 0xb4, 0xcf, 0xed,
0x36, 0xcb, 0x16, 0xf3, 0x5c, 0x35, 0x26, 0xe9, 0xd6, 0xa6, 0xba, 0xdd, 0x22, 0x1a, 0x6f, 0x5a,
0x1a, 0xb7, 0x22, 0xbd, 0x7c, 0x12, 0x36, 0xe3, 0x64, 0x95, 0x6b, 0xbd, 0x58, 0xba, 0x9e, 0x2a,
0x8c, 0x3a, 0xea, 0x89, 0x22, 0x69, 0xbd, 0x27, 0x8d, 0x77, 0x0f, 0x2d, 0xb7, 0x3a, 0x9e, 0x36,
0x3a, 0x6c, 0xb5, 0x42, 0x6a, 0xb3, 0xbf, 0x02, 0xde, 0xab, 0x55, 0x51, 0x55, 0xaf, 0x8b, 0x76,
0xd3, 0x2c, 0x1b, 0xae, 0x05, 0xc2, 0xa4, 0x81, 0x82, 0x7b, 0xb5, 0x1e, 0x98, 0x88, 0xe4, 0x66,
0x6f, 0x33, 0x1f, 0x76, 0xd9, 0x11, 0x54, 0xaf, 0x48, 0xb6, 0x69, 0xb4, 0xdf, 0x66, 0x3d, 0x6a,
0x5d, 0xdb, 0x51, 0xf8, 0xc1, 0xb5, 0x2a, 0xbc, 0xd1, 0x9b, 0x47, 0x97, 0x01, 0x04, 0x25, 0x66,
0x96, 0x7b, 0x94, 0x09, 0x67, 0x26, 0xb9, 0xdf, 0x41, 0xa1, 0x3d, 0x4b, 0xd9, 0x8d, 0xde, 0xa4,
0xd3, 0x19, 0x70, 0xef, 0x39, 0x96, 0x0d, 0x04, 0xcf, 0xb1, 0x10, 0x88, 0x9a, 0x4e, 0xfe, 0xae,
0x37, 0x6b, 0xf7, 0xa7, 0xbe, 0xa6, 0x53, 0xca, 0x16, 0x15, 0x6a, 0x3a, 0x2f, 0x8d, 0x46, 0x03,
0xed, 0x56, 0xbd, 0xba, 0xfe, 0x24, 0x64, 0x06, 0xbd, 0xbf, 0xbe, 0xd6, 0x8b, 0x45, 0x33, 0x8a,
0x71, 0x98, 0xce, 0x53, 0xee, 0x9b, 0x51, 0x2c, 0x1b, 0x35, 0x12, 0x9a, 0x51, 0xda, 0x28, 0x55,
0xbd, 0x3a, 0x47, 0xd8, 0x9f, 0x86, 0xab, 0x27, 0x99, 0x7e, 0xd5, 0xd3, 0x6c, 0xeb, 0xd8, 0x35,
0xd7, 0x21, 0xc3, 0x2f, 0xd4, 0x62, 0xd9, 0x13, 0xdb, 0xe2, 0xe5, 0x4a, 0x0c, 0x86, 0x46, 0x1d,
0x4a, 0x01, 0x1f, 0x27, 0xd4, 0x5c, 0x73, 0x32, 0x5c, 0x14, 0x10, 0x97, 0x71, 0x9e, 0x78, 0x17,
0xa7, 0xc2, 0x60, 0x8b, 0x0c, 0x2d, 0x4e, 0x49, 0x0d, 0x74, 0xa8, 0xef, 0xbe, 0x16, 0xe9, 0xe9,
0x0a, 0xfa, 0xfd, 0x43, 0xf7, 0xad, 0xc8, 0xc7, 0x3d, 0x48, 0x7c, 0xa8, 0xdf, 0x00, 0x7a, 0x5b,
0x5e, 0x3a, 0xfd, 0x38, 0x60, 0xca, 0x45, 0x43, 0x0b, 0x61, 0x5a, 0x05, 0x05, 0xb5, 0x4e, 0x70,
0x81, 0xff, 0x18, 0x56, 0xbe, 0xa0, 0x36, 0xf9, 0xa9, 0x40, 0x42, 0x41, 0xdd, 0x46, 0x51, 0x9e,
0x69, 0xaf, 0x83, 0x1e, 0x04, 0xf4, 0xed, 0xa5, 0xcf, 0xc3, 0x4e, 0x0e, 0xf5, 0x9c, 0x9d, 0x74,
0xe9, 0x9c, 0x62, 0x78, 0x0a, 0xba, 0x93, 0x2e, 0xfd, 0x87, 0x18, 0x6b, 0xbd, 0x58, 0x7c, 0x61,
0x20, 0xe6, 0xf0, 0xb6, 0x39, 0xc9, 0xf7, 0x14, 0x57, 0xc8, 0x5b, 0x47, 0xf9, 0x8f, 0xba, 0x41,
0x73, 0x3d, 0xf7, 0xb8, 0x64, 0x09, 0x54, 0x95, 0xfa, 0xc6, 0x9b, 0x7b, 0xff, 0x49, 0xc9, 0x46,
0xe8, 0x0b, 0x6f, 0xf7, 0xc2, 0x90, 0xb2, 0xfd, 0x65, 0xf4, 0xee, 0x01, 0x9b, 0x8d, 0x21, 0x9f,
0x0e, 0x7f, 0xe0, 0x5e, 0x88, 0x65, 0xb3, 0x51, 0xfd, 0xb3, 0xb6, 0x77, 0x83, 0x12, 0x9b, 0x2b,
0x7d, 0x3b, 0x70, 0xb6, 0x98, 0x8d, 0x79, 0xcc, 0xd1, 0x95, 0x3e, 0xf1, 0xfb, 0xa8, 0x16, 0x10,
0x57, 0xfa, 0x1c, 0x00, 0xd9, 0x9b, 0x94, 0x00, 0x5e, 0x7b, 0xb5, 0x20, 0x68, 0x4f, 0x01, 0x66,
0xd6, 0xd5, 0xf6, 0xea, 0xc4, 0x16, 0x5f, 0xc1, 0x33, 0x3a, 0x42, 0x4a, 0xcc, 0xba, 0x6d, 0xca,
0x04, 0x83, 0xac, 0xbe, 0xf8, 0xa2, 0xc5, 0x62, 0x3e, 0x8f, 0xcb, 0x15, 0x0a, 0x06, 0x55, 0x4b,
0x0b, 0x20, 0x82, 0xc1, 0x0b, 0x9a, 0x28, 0x6f, 0x1e, 0x73, 0x72, 0xb9, 0xc7, 0x4a, 0xb6, 0xe0,
0x69, 0x0e, 0xf8, 0xab, 0x06, 0xfa, 0x81, 0xda, 0x0c, 0x11, 0xe5, 0x14, 0x6b, 0xb2, 0x42, 0x41,
0xc8, 0xdb, 0x81, 0xe2, 0x4b, 0xa9, 0x15, 0x67, 0x25, 0x3e, 0x1d, 0x94, 0x56, 0x30, 0x44, 0x64,
0x85, 0x24, 0x8c, 0xda, 0xfe, 0x38, 0xcd, 0x67, 0xde, 0xb6, 0x3f, 0xb6, 0xbf, 0x33, 0x78, 0x8b,
0x06, 0xcc, 0xf8, 0x2e, 0x1f, 0x9a, 0xfc, 0x72, 0x90, 0x7a, 0x4b, 0xd2, 0xfb, 0xd0, 0x6d, 0x82,
0x18, 0xdf, 0xfd, 0x24, 0x72, 0xf5, 0xaa, 0x80, 0x1c, 0xa6, 0xcd, 0x1d, 0x38, 0x9f, 0x2b, 0x87,
0x08, 0xba, 0xc2, 0xa4, 0x19, 0x55, 0x85, 0xfc, 0x64, 0x91, 0x1f, 0x97, 0xec, 0x3c, 0xcd, 0xa0,
0x44, 0xa3, 0xaa, 0x54, 0xb7, 0xe4, 0xc4, 0xa8, 0xea, 0xe3, 0xcc, 0x65, 0x0a, 0x21, 0x75, 0x3e,
0xf7, 0x3b, 0x29, 0xe3, 0x04, 0x5f, 0xa6, 0x90, 0x36, 0xda, 0x18, 0xb1, 0x93, 0x16, 0xc0, 0x4d,
0xa4, 0x1f, 0x02, 0x2f, 0xd3, 0xa4, 0x1a, 0x03, 0x3f, 0x8e, 0xcb, 0x78, 0x0e, 0x1c, 0x4a, 0x1c,
0xe9, 0x0a, 0x19, 0x39, 0x0c, 0x11, 0xe9, 0x14, 0xab, 0x1c, 0xfe, 0x61, 0xf4, 0x7e, 0x3d, 0xd0,
0x43, 0xae, 0xbe, 0x4c, 0xff, 0x52, 0xfc, 0x49, 0x8b, 0xe1, 0x07, 0xda, 0xc6, 0x98, 0x97, 0x10,
0xcf, 0x1b, 0xdb, 0xef, 0xe9, 0xdf, 0x05, 0xb8, 0x39, 0xa8, 0x1b, 0xe4, 0x88, 0xf1, 0xf4, 0xbc,
0x5e, 0x57, 0xa9, 0x53, 0x2c, 0xd4, 0x20, 0xb6, 0x78, 0x14, 0xf8, 0x64, 0x80, 0x8f, 0x33, 0x03,
0x8d, 0x2d, 0x3d, 0x81, 0x22, 0xc3, 0x03, 0x8d, 0xa3, 0x2d, 0x00, 0x62, 0xa0, 0xf1, 0x82, 0x26,
0xba, 0x6c, 0xf1, 0x04, 0xc2, 0x95, 0x99, 0x40, 0xbf, 0xca, 0x4c, 0x9c, 0x77, 0x04, 0xb2, 0xe8,
0xfd, 0x43, 0x98, 0x9f, 0x41, 0x59, 0x5d, 0xa4, 0xc5, 0x5e, 0x3d, 0xc3, 0xc6, 0x7c, 0x81, 0xdf,
0xa2, 0x33, 0xc4, 0x48, 0x23, 0x44, 0x1a, 0x42, 0xa0, 0x66, 0x28, 0x33, 0xc0, 0x7e, 0x75, 0x14,
0xcf, 0x41, 0x7c, 0x00, 0x61, 0xb8, 0x46, 0x19, 0xb1, 0x20, 0x62, 0x28, 0x23, 0x61, 0xeb, 0x75,
0x23, 0xc3, 0x9c, 0xc0, 0xac, 0x8e, 0xb0, 0xf2, 0x38, 0x5e, 0xcd, 0x21, 0xe7, 0xca, 0x24, 0xda,
0x84, 0xb5, 0x4c, 0xfa, 0x79, 0x62, 0x13, 0xb6, 0x8f, 0x9e, 0x95, 0x74, 0x3b, 0x0f, 0xfe, 0x98,
0x95, 0x5c, 0xfe, 0xdd, 0x89, 0xd3, 0x32, 0x43, 0x49, 0xb7, 0xfb, 0x50, 0x1d, 0x92, 0x48, 0xba,
0xc3, 0x1a, 0xd6, 0x07, 0x9b, 0x9d, 0x32, 0xbc, 0x86, 0x52, 0xc7, 0xc9, 0xcb, 0x79, 0x9c, 0x66,
0x2a, 0x1a, 0xbe, 0x08, 0xd8, 0x26, 0x74, 0x88, 0x0f, 0x36, 0xf7, 0xd5, 0xb5, 0x3e, 0x71, 0x1d,
0x2e, 0x21, 0xda, 0x13, 0xee, 0xb0, 0x4f, 0xec, 0x09, 0x77, 0x6b, 0x99, 0xa5, 0x9a, 0x61, 0x05,
0xb7, 0x12, 0xc4, 0x36, 0x9b, 0xe2, 0x0d, 0x22, 0xcb, 0x26, 0x02, 0x89, 0xa5, 0x5a, 0x50, 0xc1,
0xcc, 0x6d, 0x06, 0xdb, 0x4d, 0xf3, 0x38, 0x4b, 0x7f, 0x8a, 0xef, 0x3e, 0x5b, 0x76, 0x1a, 0x82,
0x98, 0xdb, 0xfc, 0xa4, 0xcf, 0xd5, 0x1e, 0xf0, 0x49, 0x5a, 0x0f, 0xfd, 0x8f, 0x02, 0xcf, 0x4d,
0x10, 0xdd, 0xae, 0x2c, 0x52, 0xb9, 0xfa, 0xd9, 0x20, 0xba, 0x89, 0x1f, 0xeb, 0x56, 0x51, 0x8c,
0xeb, 0x94, 0xe4, 0x04, 0x12, 0x48, 0x0b, 0x3e, 0xfc, 0x34, 0xfc, 0xac, 0x10, 0x4e, 0x9c, 0xac,
0xf7, 0x50, 0xb3, 0xce, 0x6b, 0xeb, 0xb1, 0x64, 0x2c, 0xff, 0x20, 0xd3, 0x69, 0x05, 0xa5, 0x9a,
0x29, 0xf7, 0x80, 0xa3, 0xde, 0x69, 0x71, 0x23, 0x0b, 0xac, 0x2b, 0x4a, 0xf4, 0xce, 0xb0, 0x86,
0xd9, 0xdd, 0xb1, 0xb8, 0x13, 0xa8, 0x58, 0xb6, 0x04, 0x71, 0xfd, 0xed, 0x29, 0x69, 0xcc, 0xa2,
0x88, 0xdd, 0x1d, 0x9a, 0x36, 0xe9, 0x46, 0xdb, 0xed, 0x56, 0xbe, 0xda, 0xc7, 0x67, 0xe4, 0x1e,
0x4b, 0x02, 0x23, 0xd2, 0x8d, 0x00, 0x6e, 0xed, 0x7e, 0x96, 0x2c, 0x9e, 0x26, 0x71, 0xc5, 0x8f,
0xe3, 0x55, 0xc6, 0xe2, 0xa9, 0x98, 0xd7, 0xf1, 0xee, 0x67, 0xc3, 0x8c, 0x6c, 0x88, 0xda, 0xfd,
0xa4, 0x60, 0xb3, 0xb2, 0x53, 0x7f, 0x67, 0x4a, 0x5d, 0x2d, 0xbc, 0x8b, 0x72, 0x24, 0x51, 0x5e,
0x7c, 0xad, 0xf0, 0x5e, 0x18, 0x32, 0xaf, 0x44, 0x49, 0x91, 0x48, 0x43, 0x6e, 0xf9, 0x74, 0x9c,
0x04, 0xe4, 0x76, 0x80, 0x30, 0x9f, 0x49, 0x90, 0xbf, 0x37, 0x7f, 0x2a, 0x81, 0xab, 0x4f, 0xd7,
0x3e, 0xf5, 0xe9, 0xda, 0xd0, 0xc8, 0xfe, 0x0e, 0xd9, 0x7a, 0x4f, 0x5a, 0x7a, 0x7d, 0x71, 0xfb,
0x7f, 0xbf, 0xbe, 0x31, 0xf8, 0xf9, 0xd7, 0x37, 0x06, 0xff, 0xff, 0xf5, 0x8d, 0xc1, 0xcf, 0xbe,
0xb9, 0xf1, 0xce, 0xcf, 0xbf, 0xb9, 0xf1, 0xce, 0x2f, 0xbe, 0xb9, 0xf1, 0xce, 0x57, 0xef, 0xaa,
0x3f, 0x58, 0x76, 0xf6, 0x2b, 0xe2, 0xcf, 0x8e, 0x3d, 0xff, 0x65, 0x00, 0x00, 0x00, 0xff, 0xff,
0xf5, 0x3b, 0x43, 0x25, 0xd4, 0x6c, 0x00, 0x00,
0x52, 0xc0, 0xb7, 0x5f, 0x58, 0xa8, 0xe3, 0x16, 0xa8, 0x85, 0x65, 0x6f, 0xb9, 0x9b, 0xef, 0x6f,
0x8f, 0xdb, 0xb3, 0x33, 0xfb, 0x71, 0xec, 0x21, 0x21, 0x8f, 0x3d, 0xf6, 0x9a, 0xb3, 0x3d, 0xc6,
0x6d, 0xcf, 0x48, 0x2b, 0x21, 0x51, 0x53, 0x1d, 0x6e, 0x17, 0xae, 0xae, 0xac, 0xab, 0xca, 0x6e,
0x4f, 0x1f, 0x02, 0x81, 0x40, 0x20, 0x10, 0x88, 0x13, 0x5f, 0x2f, 0x3c, 0x20, 0xf1, 0xd7, 0xf0,
0x78, 0x12, 0x2f, 0xf0, 0x86, 0x76, 0xff, 0x91, 0x53, 0x65, 0x66, 0xe5, 0x47, 0x54, 0x46, 0x56,
0x79, 0x9f, 0x66, 0xd4, 0xf1, 0x8b, 0x88, 0xcc, 0xca, 0xcc, 0xc8, 0xc8, 0x8f, 0x2a, 0x47, 0xd7,
0xcb, 0x37, 0x1b, 0x65, 0xc5, 0x38, 0xab, 0x37, 0x6a, 0xa8, 0x96, 0x59, 0x0a, 0xed, 0xbf, 0x63,
0xf1, 0x73, 0xfc, 0x6e, 0x52, 0xac, 0xf8, 0xaa, 0x84, 0x8f, 0x3e, 0x34, 0x64, 0xca, 0xe6, 0xf3,
0xa4, 0x98, 0xd6, 0x12, 0xf9, 0xe8, 0x03, 0x23, 0x81, 0x25, 0x14, 0x5c, 0xfd, 0xfe, 0xf4, 0x7f,
0xfe, 0x6f, 0x14, 0xbd, 0xb7, 0x95, 0x67, 0x50, 0xf0, 0x2d, 0xa5, 0x11, 0x7f, 0x15, 0x7d, 0x77,
0xb3, 0x2c, 0x77, 0x81, 0xbf, 0x82, 0xaa, 0xce, 0x58, 0x11, 0xdf, 0x1e, 0x2b, 0x07, 0xe3, 0xe3,
0x32, 0x1d, 0x6f, 0x96, 0xe5, 0xd8, 0x08, 0xc7, 0xc7, 0xf0, 0x93, 0x05, 0xd4, 0xfc, 0xa3, 0x3b,
0x61, 0xa8, 0x2e, 0x59, 0x51, 0x43, 0x7c, 0x16, 0xfd, 0xc6, 0x66, 0x59, 0x4e, 0x80, 0x6f, 0x43,
0x53, 0x81, 0x09, 0x4f, 0x38, 0xc4, 0xf7, 0x3b, 0xaa, 0x2e, 0xa0, 0x7d, 0x3c, 0xe8, 0x07, 0x95,
0x9f, 0x93, 0xe8, 0x3b, 0x8d, 0x9f, 0xf3, 0x05, 0x9f, 0xb2, 0xcb, 0x22, 0xbe, 0xd9, 0x55, 0x54,
0x22, 0x6d, 0xfb, 0x56, 0x08, 0x51, 0x56, 0x5f, 0x47, 0xbf, 0xfa, 0x3a, 0xc9, 0x73, 0xe0, 0x5b,
0x15, 0x34, 0x05, 0x77, 0x75, 0xa4, 0x68, 0x2c, 0x65, 0xda, 0xee, 0xed, 0x20, 0xa3, 0x0c, 0x7f,
0x15, 0x7d, 0x57, 0x4a, 0x8e, 0x21, 0x65, 0x4b, 0xa8, 0x62, 0xaf, 0x96, 0x12, 0x12, 0x8f, 0xbc,
0x03, 0x61, 0xdb, 0x5b, 0xac, 0x58, 0x42, 0xc5, 0xfd, 0xb6, 0x95, 0x30, 0x6c, 0xdb, 0x40, 0xca,
0xf6, 0xdf, 0x8d, 0xa2, 0xef, 0x6f, 0xa6, 0x29, 0x5b, 0x14, 0x7c, 0x9f, 0xa5, 0x49, 0xbe, 0x9f,
0x15, 0x17, 0x87, 0x70, 0xb9, 0x75, 0xde, 0xf0, 0xc5, 0x0c, 0xe2, 0x67, 0xee, 0x53, 0x95, 0xe8,
0x58, 0xb3, 0x63, 0x1b, 0xd6, 0xbe, 0x3f, 0xb9, 0x9a, 0x92, 0x2a, 0xcb, 0x3f, 0x8d, 0xa2, 0x6b,
0xb8, 0x2c, 0x13, 0x96, 0x2f, 0xc1, 0x94, 0xe6, 0xd3, 0x1e, 0xc3, 0x2e, 0xae, 0xcb, 0xf3, 0xd9,
0x55, 0xd5, 0x54, 0x89, 0xf2, 0xe8, 0x7d, 0xbb, 0xbb, 0x4c, 0xa0, 0x16, 0xc3, 0xe9, 0x21, 0xdd,
0x23, 0x14, 0xa2, 0x3d, 0x3f, 0x1a, 0x82, 0x2a, 0x6f, 0x59, 0x14, 0x2b, 0x6f, 0x39, 0xab, 0xb5,
0xb3, 0x07, 0x5e, 0x0b, 0x16, 0xa1, 0x7d, 0x3d, 0x1c, 0x40, 0x2a, 0x57, 0x7f, 0x1c, 0xfd, 0xda,
0x6b, 0x56, 0x5d, 0xd4, 0x65, 0x92, 0x82, 0x1a, 0x0a, 0x77, 0x5d, 0xed, 0x56, 0x8a, 0x47, 0xc3,
0xbd, 0x3e, 0xcc, 0xea, 0xb4, 0xad, 0xf0, 0x65, 0x09, 0x38, 0x06, 0x19, 0xc5, 0x46, 0x48, 0x75,
0x5a, 0x0c, 0x29, 0xdb, 0x17, 0x51, 0x6c, 0x6c, 0xbf, 0xf9, 0x13, 0x48, 0xf9, 0xe6, 0x74, 0x8a,
0x5b, 0xc5, 0xe8, 0x0a, 0x62, 0xbc, 0x39, 0x9d, 0x52, 0xad, 0xe2, 0x47, 0x95, 0xb3, 0xcb, 0xe8,
0x03, 0xe4, 0x6c, 0x3f, 0xab, 0x85, 0xc3, 0xf5, 0xb0, 0x15, 0x85, 0x69, 0xa7, 0xe3, 0xa1, 0xb8,
0x72, 0xfc, 0x17, 0xa3, 0xe8, 0x7b, 0x1e, 0xcf, 0xc7, 0x30, 0x67, 0x4b, 0x88, 0x9f, 0xf4, 0x5b,
0x93, 0xa4, 0xf6, 0xff, 0xf1, 0x15, 0x34, 0x3c, 0xdd, 0x64, 0x02, 0x39, 0xa4, 0x9c, 0xec, 0x26,
0x52, 0xdc, 0xdb, 0x4d, 0x34, 0x66, 0x8d, 0xb0, 0x56, 0xb8, 0x0b, 0x7c, 0x6b, 0x51, 0x55, 0x50,
0x70, 0xb2, 0x2d, 0x0d, 0xd2, 0xdb, 0x96, 0x0e, 0xea, 0xa9, 0xcf, 0x2e, 0xf0, 0xcd, 0x3c, 0x27,
0xeb, 0x23, 0xc5, 0xbd, 0xf5, 0xd1, 0x98, 0xf2, 0x90, 0x46, 0xbf, 0x6e, 0x3d, 0x31, 0xbe, 0x57,
0x9c, 0xb1, 0x98, 0x7e, 0x16, 0x42, 0xae, 0x7d, 0xdc, 0xef, 0xe5, 0x3c, 0xd5, 0x78, 0xf1, 0xb6,
0x64, 0x15, 0xdd, 0x2c, 0x52, 0xdc, 0x5b, 0x0d, 0x8d, 0x29, 0x0f, 0x7f, 0x14, 0xbd, 0xa7, 0xa2,
0x64, 0x3b, 0x9f, 0xdd, 0xf1, 0x86, 0x50, 0x3c, 0xa1, 0xdd, 0xed, 0xa1, 0x4c, 0x70, 0x50, 0x32,
0x15, 0x7c, 0x6e, 0x7b, 0xf5, 0x50, 0xe8, 0xb9, 0x13, 0x86, 0x3a, 0xb6, 0xb7, 0x21, 0x07, 0xd2,
0xb6, 0x14, 0xf6, 0xd8, 0xd6, 0x90, 0xb2, 0x5d, 0x45, 0xbf, 0xa5, 0x1f, 0x4b, 0x33, 0x8f, 0x0a,
0x79, 0x13, 0xa4, 0xd7, 0x88, 0x7a, 0xdb, 0x90, 0xf6, 0xf5, 0x78, 0x18, 0xdc, 0xa9, 0x8f, 0x1a,
0x81, 0xfe, 0xfa, 0xa0, 0xf1, 0x77, 0x27, 0x0c, 0x29, 0xdb, 0x7f, 0x3f, 0x8a, 0x7e, 0xa0, 0x64,
0x2f, 0x8a, 0xe4, 0x4d, 0x0e, 0x62, 0x4a, 0x3c, 0x04, 0x7e, 0xc9, 0xaa, 0x8b, 0xc9, 0xaa, 0x48,
0x89, 0xe9, 0xdf, 0x0f, 0xf7, 0x4c, 0xff, 0xa4, 0x92, 0x95, 0xf1, 0xa9, 0x8a, 0x72, 0x56, 0xe2,
0x8c, 0xaf, 0xad, 0x01, 0x67, 0x25, 0x95, 0xf1, 0xb9, 0x48, 0xc7, 0xea, 0x41, 0x13, 0x36, 0xfd,
0x56, 0x0f, 0xec, 0x38, 0x79, 0x2b, 0x84, 0x98, 0xb0, 0xd5, 0x76, 0x60, 0x56, 0x9c, 0x65, 0xb3,
0xd3, 0x72, 0xda, 0x74, 0xe3, 0x87, 0xfe, 0x1e, 0x6a, 0x21, 0x44, 0xd8, 0x22, 0x50, 0xe5, 0xed,
0x1f, 0x4d, 0x62, 0xa4, 0x86, 0xd2, 0x4e, 0xc5, 0xe6, 0xfb, 0x30, 0x4b, 0xd2, 0x95, 0x1a, 0xff,
0x9f, 0x84, 0x06, 0x1e, 0xa6, 0x75, 0x21, 0x3e, 0xbd, 0xa2, 0x96, 0x2a, 0xcf, 0x7f, 0x8e, 0xa2,
0x3b, 0x6d, 0xf5, 0xcf, 0x93, 0x62, 0x06, 0xaa, 0x3d, 0x65, 0xe9, 0x37, 0x8b, 0xe9, 0x31, 0xd4,
0x3c, 0xa9, 0x78, 0xfc, 0x85, 0xbf, 0x92, 0x21, 0x1d, 0x5d, 0xb6, 0x1f, 0x7d, 0x2b, 0x5d, 0xd3,
0xea, 0x93, 0x26, 0xb0, 0xa9, 0x10, 0xe0, 0xb6, 0xba, 0x90, 0xe0, 0x00, 0x70, 0x2b, 0x84, 0x98,
0x56, 0x17, 0x82, 0xbd, 0x62, 0x99, 0x71, 0xd8, 0x85, 0x02, 0xaa, 0x6e, 0xab, 0x4b, 0x55, 0x17,
0x21, 0x5a, 0x9d, 0x40, 0x4d, 0xb0, 0x71, 0xbc, 0xe9, 0xc9, 0x71, 0x2d, 0x60, 0xa4, 0x33, 0x3d,
0x3e, 0x1e, 0x06, 0x9b, 0xd5, 0x9d, 0xe5, 0xf3, 0x18, 0x96, 0xec, 0x02, 0xaf, 0xee, 0x6c, 0x13,
0x12, 0x20, 0x56, 0x77, 0x5e, 0xd0, 0xcc, 0x60, 0x96, 0x9f, 0x57, 0x19, 0x5c, 0xa2, 0x19, 0xcc,
0x56, 0x6e, 0xc4, 0xc4, 0x0c, 0xe6, 0xc1, 0x94, 0x87, 0xc3, 0xe8, 0x57, 0x84, 0xf0, 0x0f, 0x58,
0x56, 0xc4, 0xd7, 0x3d, 0x4a, 0x8d, 0x40, 0x5b, 0xbd, 0x41, 0x03, 0xa8, 0xc4, 0xcd, 0xaf, 0x5b,
0x49, 0x91, 0x42, 0xee, 0x2d, 0xb1, 0x11, 0x07, 0x4b, 0xec, 0x60, 0x26, 0x75, 0x10, 0xc2, 0x26,
0x7e, 0x4d, 0xce, 0x93, 0x2a, 0x2b, 0x66, 0xb1, 0x4f, 0xd7, 0x92, 0x13, 0xa9, 0x83, 0x8f, 0x43,
0x5d, 0x58, 0x29, 0x6e, 0x96, 0x65, 0xd5, 0x84, 0x45, 0x5f, 0x17, 0x76, 0x91, 0x60, 0x17, 0xee,
0xa0, 0x7e, 0x6f, 0xdb, 0x90, 0xe6, 0x59, 0x11, 0xf4, 0xa6, 0x90, 0x21, 0xde, 0x0c, 0x8a, 0x3a,
0xef, 0x3e, 0x24, 0x4b, 0x68, 0x6b, 0xe6, 0x7b, 0x32, 0x36, 0x10, 0xec, 0xbc, 0x08, 0x34, 0xeb,
0x34, 0x21, 0x3e, 0x48, 0x2e, 0xa0, 0x79, 0xc0, 0xd0, 0xcc, 0x6b, 0xb1, 0x4f, 0xdf, 0x21, 0x88,
0x75, 0x9a, 0x9f, 0x54, 0xae, 0x16, 0xd1, 0x07, 0x42, 0x7e, 0x94, 0x54, 0x3c, 0x4b, 0xb3, 0x32,
0x29, 0xda, 0xfc, 0xdf, 0x37, 0xae, 0x3b, 0x94, 0x76, 0xb9, 0x3e, 0x90, 0x56, 0x6e, 0xff, 0x7d,
0x14, 0xdd, 0xc4, 0x7e, 0x8f, 0xa0, 0x9a, 0x67, 0x62, 0x19, 0x59, 0xcb, 0x20, 0x1c, 0x7f, 0x1e,
0x36, 0xda, 0x51, 0xd0, 0xa5, 0xf9, 0xe1, 0xd5, 0x15, 0x55, 0xc1, 0xfe, 0x30, 0x8a, 0xe4, 0x72,
0x45, 0x2c, 0x29, 0xdd, 0x51, 0xab, 0xd6, 0x31, 0xce, 0x7a, 0xf2, 0x66, 0x80, 0x30, 0x53, 0x85,
0xfc, 0x5d, 0xac, 0x94, 0x63, 0xaf, 0x86, 0x10, 0x11, 0x53, 0x05, 0x42, 0x70, 0x41, 0x27, 0xe7,
0xec, 0xd2, 0x5f, 0xd0, 0x46, 0x12, 0x2e, 0xa8, 0x22, 0xcc, 0xde, 0x95, 0x2a, 0xa8, 0x6f, 0xef,
0xaa, 0x2d, 0x46, 0x68, 0xef, 0x0a, 0x33, 0xca, 0x30, 0x8b, 0x7e, 0xd3, 0x36, 0xfc, 0x9c, 0xb1,
0x8b, 0x79, 0x52, 0x5d, 0xc4, 0x8f, 0x68, 0xe5, 0x96, 0xd1, 0x8e, 0xd6, 0x06, 0xb1, 0x26, 0x2c,
0xd8, 0x0e, 0x9b, 0x44, 0xe3, 0xb4, 0xca, 0x51, 0x58, 0x70, 0x6c, 0x28, 0x84, 0x08, 0x0b, 0x04,
0x6a, 0x22, 0xb7, 0xed, 0x6d, 0x02, 0x78, 0xb5, 0xe4, 0xa8, 0x4f, 0x80, 0x5a, 0x2d, 0x79, 0x30,
0xdc, 0x85, 0x76, 0xab, 0xa4, 0x3c, 0xf7, 0x77, 0x21, 0x21, 0x0a, 0x77, 0xa1, 0x16, 0xc1, 0xed,
0x3d, 0x81, 0xa4, 0x4a, 0xcf, 0xfd, 0xed, 0x2d, 0x65, 0xe1, 0xf6, 0xd6, 0x0c, 0x6e, 0x6f, 0x29,
0x78, 0x9d, 0xf1, 0xf3, 0x03, 0xe0, 0x89, 0xbf, 0xbd, 0x5d, 0x26, 0xdc, 0xde, 0x1d, 0xd6, 0x64,
0x32, 0xb6, 0xc3, 0xc9, 0xe2, 0x4d, 0x9d, 0x56, 0xd9, 0x1b, 0x88, 0x03, 0x56, 0x34, 0x44, 0x64,
0x32, 0x24, 0x6c, 0x82, 0xb4, 0xf2, 0xd9, 0xca, 0xf6, 0xa6, 0x35, 0x0a, 0xd2, 0xad, 0x0d, 0x8b,
0x20, 0x82, 0xb4, 0x9f, 0xc4, 0xd5, 0xdb, 0xad, 0xd8, 0xa2, 0xac, 0x7b, 0xaa, 0x87, 0xa0, 0x70,
0xf5, 0xba, 0xb0, 0xf2, 0xf9, 0x36, 0xfa, 0x6d, 0xfb, 0x91, 0x9e, 0x16, 0xb5, 0xf6, 0xba, 0x4e,
0x3f, 0x27, 0x0b, 0x23, 0xb6, 0xa5, 0x02, 0xb8, 0x49, 0x53, 0x5a, 0xcf, 0x7c, 0x1b, 0x78, 0x92,
0xe5, 0x75, 0x7c, 0xcf, 0x6f, 0xa3, 0x95, 0x13, 0x69, 0x8a, 0x8f, 0xc3, 0x63, 0x76, 0x7b, 0x51,
0xe6, 0x59, 0xda, 0xdd, 0x9f, 0x54, 0xba, 0x5a, 0x1c, 0x1e, 0xb3, 0x36, 0x86, 0x63, 0xd0, 0x04,
0xb8, 0xfc, 0xcf, 0xc9, 0xaa, 0x04, 0x7f, 0x0c, 0x72, 0x90, 0x70, 0x0c, 0xc2, 0x28, 0xae, 0xcf,
0x04, 0xf8, 0x7e, 0xb2, 0x62, 0x0b, 0x22, 0x06, 0x69, 0x71, 0xb8, 0x3e, 0x36, 0x66, 0x32, 0x05,
0xed, 0x61, 0xaf, 0xe0, 0x50, 0x15, 0x49, 0xbe, 0x93, 0x27, 0xb3, 0x3a, 0x26, 0xc6, 0x8d, 0x4b,
0x11, 0x99, 0x02, 0x4d, 0x7b, 0x1e, 0xe3, 0x5e, 0xbd, 0x93, 0x2c, 0x59, 0x95, 0x71, 0xfa, 0x31,
0x1a, 0xa4, 0xf7, 0x31, 0x3a, 0xa8, 0xd7, 0xdb, 0x66, 0x95, 0x9e, 0x67, 0x4b, 0x98, 0x06, 0xbc,
0xb5, 0xc8, 0x00, 0x6f, 0x16, 0xea, 0x69, 0xb4, 0x09, 0x5b, 0x54, 0x29, 0x90, 0x8d, 0x26, 0xc5,
0xbd, 0x8d, 0xa6, 0x31, 0xe5, 0xe1, 0xaf, 0x47, 0xd1, 0xef, 0x48, 0xa9, 0xbd, 0x69, 0xb8, 0x9d,
0xd4, 0xe7, 0x6f, 0x58, 0x52, 0x4d, 0xe3, 0x8f, 0x7d, 0x76, 0xbc, 0xa8, 0x76, 0xfd, 0xf4, 0x2a,
0x2a, 0xf8, 0xb1, 0xee, 0x67, 0xb5, 0x35, 0xe2, 0xbc, 0x8f, 0xd5, 0x41, 0xc2, 0x8f, 0x15, 0xa3,
0x38, 0x80, 0x08, 0xb9, 0x5c, 0xa0, 0xdf, 0x23, 0xf5, 0xdd, 0x55, 0xfa, 0xfd, 0x5e, 0x0e, 0xc7,
0xc7, 0x46, 0xe8, 0xf6, 0x96, 0x75, 0xca, 0x86, 0xbf, 0xc7, 0x8c, 0x87, 0xe2, 0xa4, 0x67, 0x3d,
0x2a, 0xc2, 0x9e, 0x3b, 0x23, 0x63, 0x3c, 0x14, 0x27, 0x3c, 0x5b, 0x61, 0x2d, 0xe4, 0xd9, 0x13,
0xda, 0xc6, 0x43, 0x71, 0x9c, 0x51, 0x28, 0xa6, 0x9d, 0x17, 0x1e, 0x05, 0xec, 0xe0, 0xb9, 0x61,
0x6d, 0x10, 0xab, 0x1c, 0xfe, 0xed, 0x28, 0xfa, 0xbe, 0xf1, 0x78, 0xc0, 0xa6, 0xd9, 0xd9, 0x4a,
0x42, 0xaf, 0x92, 0x7c, 0x01, 0x75, 0xfc, 0x94, 0xb2, 0xd6, 0x65, 0x75, 0x09, 0x9e, 0x5d, 0x49,
0x07, 0x8f, 0x9d, 0xcd, 0xb2, 0xcc, 0x57, 0x27, 0x30, 0x2f, 0x73, 0x72, 0xec, 0x38, 0x48, 0x78,
0xec, 0x60, 0x14, 0x67, 0x9a, 0x27, 0xac, 0xc9, 0x63, 0xbd, 0x99, 0xa6, 0x10, 0x85, 0x33, 0xcd,
0x16, 0xc1, 0xb9, 0xd2, 0x09, 0xdb, 0x62, 0x79, 0x0e, 0x29, 0xef, 0x1e, 0x3c, 0x6a, 0x4d, 0x43,
0x84, 0x73, 0x25, 0x44, 0x9a, 0x35, 0x7a, 0xbb, 0x2e, 0x4a, 0x2a, 0x78, 0xbe, 0xda, 0xcf, 0x8a,
0x8b, 0xd8, 0x9f, 0x16, 0x18, 0x80, 0x58, 0xa3, 0x7b, 0x41, 0xbc, 0xfe, 0x3a, 0x2d, 0xa6, 0xcc,
0xbf, 0xfe, 0x6a, 0x24, 0xe1, 0xf5, 0x97, 0x22, 0xb0, 0xc9, 0x63, 0xa0, 0x4c, 0x36, 0x92, 0xb0,
0x49, 0x45, 0xf8, 0x42, 0xa1, 0xda, 0xc9, 0x25, 0x43, 0x21, 0xda, 0xbb, 0xbd, 0xdf, 0xcb, 0xe1,
0x1e, 0xda, 0x2e, 0xc4, 0x76, 0x80, 0xa7, 0xe7, 0xfe, 0x1e, 0xea, 0x20, 0xe1, 0x1e, 0x8a, 0x51,
0x5c, 0xa5, 0x13, 0xa6, 0x17, 0x92, 0xf7, 0xfc, 0xfd, 0xa3, 0xb3, 0x88, 0xbc, 0xdf, 0xcb, 0xe1,
0xa5, 0xd1, 0xde, 0x5c, 0x3c, 0x33, 0x6f, 0x27, 0x97, 0xb2, 0xf0, 0xd2, 0x48, 0x33, 0xb8, 0xf4,
0x52, 0xd0, 0x3c, 0x4e, 0x7f, 0xe9, 0x8d, 0x3c, 0x5c, 0x7a, 0x87, 0x53, 0x4e, 0xfe, 0x75, 0x14,
0x5d, 0xb7, 0xbd, 0x1c, 0xb2, 0x66, 0x8c, 0xbc, 0x4a, 0xf2, 0x6c, 0x9a, 0x70, 0x38, 0x61, 0x17,
0x50, 0xa0, 0xbd, 0x15, 0xb7, 0xb4, 0x92, 0x1f, 0x3b, 0x0a, 0xc4, 0xde, 0xca, 0x20, 0x45, 0xdc,
0x4f, 0x24, 0x7d, 0x5a, 0xc3, 0x56, 0x52, 0x13, 0x91, 0xcc, 0x41, 0xc2, 0xfd, 0x04, 0xa3, 0x38,
0x5f, 0x95, 0xf2, 0x17, 0x6f, 0x4b, 0xa8, 0x32, 0x28, 0x52, 0xf0, 0xe7, 0xab, 0x98, 0x0a, 0xe7,
0xab, 0x1e, 0xba, 0xb3, 0xf5, 0xa0, 0x83, 0x53, 0xf7, 0xee, 0x00, 0x26, 0x02, 0x77, 0x07, 0x08,
0x14, 0x57, 0xd2, 0x00, 0xde, 0xed, 0xbb, 0x8e, 0x95, 0xe0, 0xf6, 0x1d, 0x4d, 0x77, 0x36, 0x74,
0x34, 0x33, 0x69, 0x86, 0x49, 0x4f, 0xd1, 0x27, 0xf6, 0x70, 0x59, 0x1b, 0xc4, 0xfa, 0x77, 0x90,
0x8e, 0x21, 0x4f, 0xc4, 0x14, 0x12, 0xd8, 0xa6, 0x69, 0x99, 0x21, 0x3b, 0x48, 0x16, 0xab, 0x1c,
0xfe, 0xe5, 0x28, 0xfa, 0xc8, 0xe7, 0xf1, 0x65, 0x29, 0xfc, 0x3e, 0xe9, 0xb7, 0x25, 0x49, 0xe2,
0x72, 0x44, 0x58, 0x43, 0x95, 0xe1, 0x4f, 0xa3, 0x0f, 0x5b, 0x91, 0xb9, 0x3b, 0xa1, 0x0a, 0xe0,
0x26, 0x50, 0xba, 0xfc, 0x98, 0xd3, 0xee, 0x37, 0x06, 0xf3, 0x66, 0x6d, 0xe2, 0x96, 0xab, 0x46,
0x6b, 0x13, 0x6d, 0x43, 0x89, 0x89, 0xb5, 0x89, 0x07, 0xc3, 0x33, 0x75, 0x8b, 0x34, 0xe3, 0xc4,
0x17, 0xe3, 0xb4, 0x09, 0x7b, 0x94, 0x3c, 0xe8, 0x07, 0x71, 0xdf, 0x69, 0xc5, 0x6a, 0x49, 0xf0,
0x28, 0x64, 0x01, 0x2d, 0x0b, 0xd6, 0x06, 0xb1, 0xca, 0xe1, 0x9f, 0x47, 0xdf, 0xeb, 0x54, 0x6c,
0x07, 0x12, 0xbe, 0xa8, 0x60, 0x1a, 0x6f, 0xf4, 0x94, 0xbb, 0x05, 0xb5, 0xeb, 0x27, 0xc3, 0x15,
0x3a, 0xb9, 0x6b, 0xcb, 0xc9, 0x26, 0xd6, 0x65, 0x78, 0x1a, 0x32, 0xe9, 0xb2, 0xc1, 0xdc, 0x95,
0xd6, 0xe9, 0x2c, 0x3f, 0xed, 0x8e, 0xbc, 0xb9, 0x4c, 0xb2, 0x5c, 0x1c, 0x69, 0x7c, 0x1c, 0x32,
0xea, 0xa0, 0xc1, 0xe5, 0x27, 0xa9, 0xd2, 0x89, 0x92, 0x62, 0xbc, 0x59, 0xcb, 0x96, 0xc7, 0xf4,
0xa8, 0xf4, 0xac, 0x5a, 0xd6, 0x07, 0xd2, 0xca, 0x2d, 0x6f, 0xb7, 0xed, 0x9a, 0x9f, 0xed, 0x4e,
0xee, 0xf3, 0xaa, 0x54, 0x3d, 0x3d, 0x7d, 0x7d, 0x20, 0xad, 0xbc, 0xfe, 0x59, 0xf4, 0x61, 0xd7,
0xab, 0x9a, 0x14, 0x36, 0x7a, 0x4d, 0xa1, 0x79, 0xe1, 0xc9, 0x70, 0x05, 0x93, 0xea, 0x7f, 0x99,
0xd5, 0x9c, 0x55, 0xab, 0xc9, 0x39, 0xbb, 0x6c, 0xef, 0x07, 0xbb, 0xa3, 0x55, 0x01, 0x63, 0x8b,
0x20, 0x52, 0x7d, 0x3f, 0xd9, 0x71, 0x65, 0xee, 0x11, 0xd7, 0x84, 0x2b, 0x8b, 0xe8, 0x71, 0xe5,
0x92, 0x26, 0x56, 0xb5, 0xb5, 0x32, 0x97, 0x9e, 0xef, 0xfb, 0x8b, 0xda, 0xbd, 0xf8, 0xfc, 0xa0,
0x1f, 0x34, 0xd9, 0x83, 0x12, 0x6f, 0x67, 0x67, 0x67, 0xba, 0x4e, 0xfe, 0x92, 0xda, 0x08, 0x91,
0x3d, 0x10, 0xa8, 0x49, 0x46, 0x77, 0xb2, 0x1c, 0xc4, 0xf9, 0xd8, 0xcb, 0xb3, 0xb3, 0x9c, 0x25,
0x53, 0x94, 0x8c, 0x36, 0xe2, 0xb1, 0x2d, 0x27, 0x92, 0x51, 0x1f, 0x67, 0xae, 0x17, 0x35, 0xd2,
0x63, 0x48, 0x59, 0x91, 0x66, 0x39, 0xbe, 0x2e, 0x25, 0x34, 0xb5, 0x90, 0xb8, 0x5e, 0xd4, 0x81,
0xcc, 0x24, 0xd5, 0x88, 0x9a, 0x61, 0xdf, 0x96, 0xff, 0x6e, 0x57, 0xd1, 0x12, 0x13, 0x93, 0x94,
0x07, 0x33, 0x6b, 0xb2, 0x46, 0x78, 0x5a, 0x0a, 0xe3, 0x37, 0xba, 0x5a, 0x52, 0x42, 0xac, 0xc9,
0x5c, 0xc2, 0xac, 0x2d, 0x9a, 0xdf, 0xb7, 0xd9, 0x65, 0x21, 0x8c, 0xde, 0xea, 0xaa, 0xb4, 0x32,
0x62, 0x6d, 0x81, 0x19, 0x65, 0xf8, 0xc7, 0xd1, 0x2f, 0x0b, 0xc3, 0x15, 0x2b, 0xe3, 0x6b, 0x1e,
0x85, 0xca, 0xba, 0xd9, 0x74, 0x9d, 0x94, 0x9b, 0x0b, 0x7a, 0xba, 0x6f, 0x9c, 0xd6, 0xc9, 0x0c,
0xe2, 0x3b, 0x44, 0x8b, 0x0b, 0x29, 0x71, 0x41, 0xaf, 0x4b, 0xb9, 0xbd, 0xe2, 0x90, 0x4d, 0x95,
0x75, 0x4f, 0x0d, 0xb5, 0x30, 0xd4, 0x2b, 0x6c, 0xc8, 0x1c, 0x97, 0x1c, 0x26, 0xcb, 0x6c, 0xa6,
0x27, 0x1c, 0x19, 0xb7, 0x6a, 0x74, 0x5c, 0x62, 0x98, 0xb1, 0x05, 0x11, 0xc7, 0x25, 0x24, 0xac,
0x7c, 0xfe, 0xcb, 0x28, 0xba, 0x61, 0x98, 0xdd, 0x76, 0x17, 0x6b, 0xaf, 0x38, 0x63, 0xaf, 0x33,
0x7e, 0xbe, 0x9f, 0x15, 0x17, 0x75, 0xfc, 0x19, 0x65, 0xd2, 0xcf, 0xeb, 0xa2, 0x7c, 0x7e, 0x65,
0x3d, 0x93, 0x41, 0xb6, 0x5b, 0x3c, 0xe6, 0xec, 0x52, 0x6a, 0xa0, 0x0c, 0x52, 0xef, 0x04, 0x61,
0x8e, 0xc8, 0x20, 0x43, 0xbc, 0x69, 0x62, 0xed, 0x3c, 0x67, 0x05, 0x6e, 0x62, 0x63, 0xa1, 0x11,
0x12, 0x4d, 0xdc, 0x81, 0x4c, 0x3c, 0x6e, 0x45, 0x72, 0x37, 0x62, 0x33, 0xcf, 0x51, 0x3c, 0xd6,
0xaa, 0x1a, 0x20, 0xe2, 0xb1, 0x17, 0x54, 0x7e, 0x8e, 0xa3, 0xef, 0x34, 0x8f, 0xf4, 0xa8, 0x82,
0x65, 0x06, 0xf8, 0x98, 0xdd, 0x92, 0x10, 0xe3, 0xdf, 0x25, 0xcc, 0xc8, 0x3a, 0x2d, 0xea, 0x32,
0x4f, 0xea, 0x73, 0x75, 0xf0, 0xea, 0xd6, 0xb9, 0x15, 0xe2, 0xa3, 0xd7, 0xbb, 0x3d, 0x94, 0x09,
0xea, 0xad, 0x4c, 0x87, 0x98, 0x7b, 0x7e, 0xd5, 0x4e, 0x98, 0xb9, 0xdf, 0xcb, 0x99, 0x9d, 0xe0,
0xdd, 0x24, 0xcf, 0xa1, 0x5a, 0xb5, 0xb2, 0x83, 0xa4, 0xc8, 0xce, 0xa0, 0xe6, 0x68, 0x27, 0x58,
0x51, 0x63, 0x8c, 0x11, 0x3b, 0xc1, 0x01, 0xdc, 0x64, 0xf3, 0xc8, 0xf3, 0x5e, 0x31, 0x85, 0xb7,
0x28, 0x9b, 0xc7, 0x76, 0x04, 0x43, 0x64, 0xf3, 0x14, 0x6b, 0x76, 0x44, 0x9f, 0xe7, 0x2c, 0xbd,
0x50, 0x53, 0x80, 0xdb, 0xc0, 0x42, 0x82, 0xe7, 0x80, 0x5b, 0x21, 0xc4, 0x4c, 0x02, 0x42, 0x70,
0x0c, 0x65, 0x9e, 0xa4, 0xf8, 0xae, 0x85, 0xd4, 0x51, 0x32, 0x62, 0x12, 0xc0, 0x0c, 0x2a, 0xae,
0xba, 0xc3, 0xe1, 0x2b, 0x2e, 0xba, 0xc2, 0x71, 0x2b, 0x84, 0x98, 0x69, 0x50, 0x08, 0x26, 0x65,
0x9e, 0x71, 0x34, 0x0c, 0xa4, 0x86, 0x90, 0x10, 0xc3, 0xc0, 0x25, 0x90, 0xc9, 0x03, 0xa8, 0x66,
0xe0, 0x35, 0x29, 0x24, 0x41, 0x93, 0x2d, 0x61, 0xae, 0xe4, 0xc9, 0xba, 0xb3, 0x72, 0x85, 0xae,
0xe4, 0xa9, 0x6a, 0xb1, 0x72, 0x45, 0x5c, 0xc9, 0x73, 0x00, 0x54, 0xc4, 0xa3, 0xa4, 0xe6, 0xfe,
0x22, 0x0a, 0x49, 0xb0, 0x88, 0x2d, 0x61, 0xe6, 0x68, 0x59, 0xc4, 0x05, 0x47, 0x73, 0xb4, 0x2a,
0x80, 0x75, 0x32, 0x7b, 0x9d, 0x94, 0x9b, 0x48, 0x22, 0x5b, 0x05, 0xf8, 0x4e, 0x06, 0xf9, 0xb4,
0x46, 0x91, 0x44, 0x3d, 0xf7, 0x56, 0x4a, 0x44, 0x92, 0x2e, 0x85, 0xba, 0x92, 0xda, 0x37, 0xf6,
0xd5, 0x0e, 0x6d, 0x19, 0xdf, 0x0a, 0x21, 0x26, 0x3e, 0xb5, 0x85, 0xde, 0x4a, 0xaa, 0x2a, 0x6b,
0x26, 0xff, 0x7b, 0xfe, 0x02, 0xb5, 0x72, 0x22, 0x3e, 0xf9, 0x38, 0x34, 0xbc, 0xda, 0xc0, 0xed,
0x2b, 0x18, 0x0e, 0xdd, 0xb7, 0x83, 0x8c, 0xc9, 0x38, 0x85, 0xc4, 0x3a, 0x5a, 0xf4, 0x3d, 0x4d,
0xcf, 0xc9, 0xe2, 0xbd, 0x3e, 0xcc, 0xba, 0x32, 0xaf, 0x5d, 0x1c, 0xb0, 0x25, 0x9c, 0xb0, 0x17,
0x6f, 0xb3, 0x9a, 0x67, 0xc5, 0x4c, 0xcd, 0xdc, 0xcf, 0x08, 0x4b, 0x3e, 0x98, 0xb8, 0x32, 0xdf,
0xab, 0x64, 0x12, 0x08, 0x54, 0x96, 0x43, 0xb8, 0xf4, 0x26, 0x10, 0xd8, 0xa2, 0xe6, 0x88, 0x04,
0x22, 0xc4, 0x9b, 0x7d, 0x14, 0xed, 0x5c, 0xbd, 0x57, 0x78, 0xc2, 0xda, 0x5c, 0x8e, 0xb2, 0x86,
0x41, 0x62, 0x29, 0x1b, 0x54, 0x30, 0xeb, 0x4b, 0xed, 0xdf, 0x0c, 0xb1, 0x07, 0x84, 0x9d, 0xee,
0x30, 0x7b, 0x38, 0x80, 0xf4, 0xb8, 0x32, 0xe7, 0xe3, 0x94, 0xab, 0xee, 0xf1, 0xf8, 0xc3, 0x01,
0xa4, 0xb5, 0x27, 0x63, 0x57, 0xeb, 0x79, 0x92, 0x5e, 0xcc, 0x2a, 0xb6, 0x28, 0xa6, 0x5b, 0x2c,
0x67, 0x15, 0xda, 0x93, 0x71, 0x4a, 0x8d, 0x50, 0x62, 0x4f, 0xa6, 0x47, 0xc5, 0x64, 0x70, 0x76,
0x29, 0x36, 0xf3, 0x6c, 0x86, 0x57, 0xd4, 0x8e, 0x21, 0x01, 0x10, 0x19, 0x9c, 0x17, 0xf4, 0x74,
0x22, 0xb9, 0xe2, 0xe6, 0x59, 0x9a, 0xe4, 0xd2, 0xdf, 0x06, 0x6d, 0xc6, 0x01, 0x7b, 0x3b, 0x91,
0x47, 0xc1, 0x53, 0xcf, 0x93, 0x45, 0x55, 0xec, 0x15, 0x9c, 0x91, 0xf5, 0x6c, 0x81, 0xde, 0x7a,
0x5a, 0x20, 0x0a, 0xab, 0x27, 0xf0, 0xb6, 0x29, 0x4d, 0xf3, 0x8f, 0x2f, 0xac, 0x36, 0xbf, 0x8f,
0x95, 0x3c, 0x14, 0x56, 0x11, 0x87, 0x2a, 0xa3, 0x9c, 0xc8, 0x0e, 0x13, 0xd0, 0x76, 0xbb, 0xc9,
0x83, 0x7e, 0xd0, 0xef, 0x67, 0xc2, 0x57, 0x39, 0x84, 0xfc, 0x08, 0x60, 0x88, 0x9f, 0x16, 0x34,
0xdb, 0x2d, 0x4e, 0x7d, 0xce, 0x21, 0xbd, 0xe8, 0x5c, 0xf7, 0x71, 0x0b, 0x2a, 0x11, 0x62, 0xbb,
0x85, 0x40, 0xfd, 0x4d, 0xb4, 0x97, 0xb2, 0x22, 0xd4, 0x44, 0x8d, 0x7c, 0x48, 0x13, 0x29, 0xce,
0x2c, 0x7e, 0xb5, 0x54, 0xf5, 0x4c, 0xd9, 0x4c, 0x6b, 0x84, 0x05, 0x1b, 0x22, 0x16, 0xbf, 0x24,
0x6c, 0x72, 0x72, 0xec, 0xf3, 0xa0, 0x7b, 0xbf, 0xb7, 0x63, 0xe5, 0x80, 0xbe, 0xdf, 0x4b, 0xb1,
0x74, 0x25, 0x65, 0x1f, 0xe9, 0xb1, 0xe2, 0xf6, 0x93, 0xc7, 0xc3, 0x60, 0xb3, 0xe4, 0x71, 0x7c,
0x6e, 0xe5, 0x90, 0x54, 0xd2, 0xeb, 0x7a, 0xc0, 0x90, 0xc1, 0x88, 0x25, 0x4f, 0x00, 0x47, 0x21,
0xcc, 0xf1, 0xbc, 0xc5, 0x0a, 0x0e, 0x05, 0xf7, 0x85, 0x30, 0xd7, 0x98, 0x02, 0x43, 0x21, 0x8c,
0x52, 0x40, 0xfd, 0x56, 0xec, 0x07, 0x01, 0x3f, 0x4c, 0xe6, 0xde, 0x8c, 0x4d, 0xee, 0xf5, 0x48,
0x79, 0xa8, 0xdf, 0x22, 0xce, 0x3a, 0x70, 0xb3, 0xbd, 0x9c, 0x24, 0xd5, 0x4c, 0xef, 0x6e, 0x4c,
0xe3, 0x27, 0xb4, 0x1d, 0x97, 0x24, 0x0e, 0xdc, 0xc2, 0x1a, 0x28, 0xec, 0xec, 0xcd, 0x93, 0x99,
0xae, 0xa9, 0xa7, 0x06, 0x42, 0xde, 0xa9, 0xea, 0x83, 0x7e, 0x10, 0xf9, 0x79, 0x95, 0x4d, 0x81,
0x05, 0xfc, 0x08, 0xf9, 0x10, 0x3f, 0x18, 0x44, 0xd9, 0x5b, 0x53, 0x6f, 0xb9, 0xa2, 0xdb, 0x2c,
0xa6, 0x6a, 0x1d, 0x3b, 0x26, 0x1e, 0x0f, 0xe2, 0x42, 0xd9, 0x1b, 0xc1, 0xa3, 0x31, 0xda, 0x6e,
0xd0, 0x86, 0xc6, 0xa8, 0xde, 0x7f, 0x1d, 0x32, 0x46, 0x7d, 0xb0, 0xf2, 0xf9, 0x53, 0x35, 0x46,
0xb7, 0x13, 0x9e, 0x34, 0x79, 0xfb, 0xab, 0x0c, 0x2e, 0xd5, 0x42, 0xd8, 0x53, 0xdf, 0x96, 0x1a,
0x8b, 0x17, 0xbb, 0xd0, 0xaa, 0x78, 0x63, 0x30, 0x1f, 0xf0, 0xad, 0x56, 0x08, 0xbd, 0xbe, 0xd1,
0x52, 0x61, 0x63, 0x30, 0x1f, 0xf0, 0xad, 0xde, 0x18, 0xed, 0xf5, 0x8d, 0x5e, 0x1b, 0xdd, 0x18,
0xcc, 0x2b, 0xdf, 0x7f, 0xd5, 0x0e, 0x5c, 0xdb, 0x79, 0x93, 0x87, 0xa5, 0x3c, 0x5b, 0x82, 0x2f,
0x9d, 0x74, 0xed, 0x69, 0x34, 0x94, 0x4e, 0xd2, 0x2a, 0xd6, 0x67, 0x46, 0x7c, 0xa5, 0x38, 0x62,
0x75, 0x26, 0x0e, 0xcc, 0x9f, 0x0d, 0x30, 0xda, 0xc2, 0xa1, 0x45, 0x53, 0x48, 0xc9, 0x1c, 0x37,
0x3a, 0xa8, 0xb9, 0xdd, 0xfb, 0x38, 0x60, 0xaf, 0x7b, 0xc9, 0x77, 0x7d, 0x20, 0x6d, 0x0e, 0xfe,
0x1c, 0xc6, 0x3e, 0x71, 0x0c, 0xb5, 0xaa, 0xf7, 0xd0, 0xf1, 0xc9, 0x70, 0x05, 0xe5, 0xfe, 0x6f,
0xda, 0x75, 0x05, 0xf6, 0xaf, 0x06, 0xc1, 0xd3, 0x21, 0x16, 0xd1, 0x40, 0x78, 0x76, 0x25, 0x1d,
0x55, 0x90, 0xff, 0x18, 0x45, 0xb7, 0xbc, 0x05, 0x71, 0xcf, 0x9e, 0x7f, 0x77, 0x88, 0x6d, 0xff,
0x19, 0xf4, 0x17, 0xdf, 0x46, 0x55, 0x95, 0xee, 0x1f, 0xda, 0xe5, 0x7d, 0xab, 0x21, 0xde, 0xc0,
0x78, 0x59, 0x4d, 0xa1, 0x52, 0x23, 0x36, 0xd4, 0xe9, 0x0c, 0x8c, 0xc7, 0xed, 0xa7, 0x57, 0xd4,
0xb2, 0x3e, 0x89, 0xe3, 0xc0, 0xea, 0xed, 0x37, 0xab, 0x3c, 0x21, 0xcb, 0x16, 0x8d, 0x0b, 0xf4,
0xd9, 0x55, 0xd5, 0xa8, 0x91, 0x6c, 0xc1, 0xe2, 0x0d, 0xfb, 0x67, 0x03, 0x0d, 0x3b, 0xef, 0xdc,
0x7f, 0x72, 0x35, 0x25, 0x55, 0x96, 0xff, 0x1a, 0x45, 0x77, 0x1d, 0xd6, 0x9c, 0x76, 0xa0, 0x3d,
0x99, 0x1f, 0x05, 0xec, 0x53, 0x4a, 0xba, 0x70, 0xbf, 0xf7, 0xed, 0x94, 0xcd, 0xf7, 0x63, 0x1c,
0x95, 0x9d, 0x2c, 0xe7, 0x50, 0x75, 0xbf, 0x1f, 0xe3, 0xda, 0x95, 0xd4, 0x98, 0xfe, 0x7e, 0x4c,
0x00, 0xb7, 0xbe, 0x1f, 0xe3, 0xf1, 0xec, 0xfd, 0x7e, 0x8c, 0xd7, 0x5a, 0xf0, 0xfb, 0x31, 0x61,
0x0d, 0x6a, 0xf2, 0x69, 0x8b, 0x20, 0x77, 0xd5, 0x07, 0x59, 0x74, 0x37, 0xd9, 0x9f, 0x5e, 0x45,
0x85, 0x98, 0x7e, 0x25, 0x27, 0x6e, 0xc4, 0x0d, 0x78, 0xa6, 0xce, 0xad, 0xb8, 0x8d, 0xc1, 0xbc,
0xf2, 0xfd, 0x13, 0xb5, 0xf6, 0xd2, 0x93, 0x0d, 0xab, 0xc4, 0xb7, 0x83, 0xd6, 0x42, 0x93, 0x47,
0x63, 0xc1, 0x6e, 0xf9, 0xc7, 0xc3, 0x60, 0xa2, 0xba, 0x0d, 0xa1, 0x1a, 0x7d, 0xdc, 0x67, 0x08,
0x35, 0xf9, 0xc6, 0x60, 0x9e, 0x98, 0xe4, 0xa4, 0x6f, 0xd9, 0xda, 0x03, 0x8c, 0xb9, 0x6d, 0xfd,
0x64, 0xb8, 0x82, 0x72, 0xbf, 0x54, 0x49, 0xad, 0xed, 0x5e, 0xb4, 0xf3, 0x7a, 0x9f, 0xa9, 0x89,
0xd3, 0xcc, 0xe3, 0xa1, 0x78, 0x28, 0xbd, 0xb1, 0x27, 0xf8, 0xbe, 0xf4, 0xc6, 0x3b, 0xc9, 0x7f,
0x72, 0x35, 0x25, 0x55, 0x96, 0x7f, 0x1e, 0x45, 0xd7, 0xc9, 0xb2, 0xa8, 0x7e, 0xf0, 0xd9, 0x50,
0xcb, 0xa8, 0x3f, 0x7c, 0x7e, 0x65, 0x3d, 0x55, 0xa8, 0x7f, 0x1b, 0x45, 0x37, 0x02, 0x85, 0x92,
0x1d, 0xe4, 0x0a, 0xd6, 0xdd, 0x8e, 0xf2, 0xc3, 0xab, 0x2b, 0x52, 0xd3, 0xbd, 0x8d, 0x4f, 0xba,
0x1f, 0x56, 0x09, 0xd8, 0x9e, 0xd0, 0x1f, 0x56, 0xe9, 0xd7, 0xc2, 0x5b, 0x50, 0x4d, 0x52, 0xa2,
0x56, 0x46, 0xbe, 0x2d, 0x28, 0x91, 0xb3, 0xa0, 0x15, 0xd1, 0xfd, 0x5e, 0xce, 0xe7, 0xe4, 0xc5,
0xdb, 0x32, 0x29, 0xa6, 0xb4, 0x13, 0x29, 0xef, 0x77, 0xa2, 0x39, 0xbc, 0x75, 0xd7, 0x48, 0x8f,
0x59, 0xbb, 0xcc, 0x7b, 0x48, 0xe9, 0x6b, 0x24, 0xb8, 0x75, 0xd7, 0x41, 0x09, 0x6f, 0x2a, 0xa7,
0x0d, 0x79, 0x43, 0xa9, 0xec, 0xa3, 0x21, 0x28, 0x5a, 0x40, 0x68, 0x6f, 0xfa, 0x44, 0xe0, 0x71,
0xc8, 0x4a, 0xe7, 0x54, 0x60, 0x7d, 0x20, 0x4d, 0xb8, 0x9d, 0x00, 0xff, 0x12, 0x92, 0x29, 0x54,
0x41, 0xb7, 0x9a, 0x1a, 0xe4, 0xd6, 0xa6, 0x7d, 0x6e, 0xb7, 0x58, 0xbe, 0x98, 0x17, 0xaa, 0x31,
0x49, 0xb7, 0x36, 0xd5, 0xef, 0x16, 0xd1, 0x78, 0xd3, 0xd2, 0xb8, 0x15, 0xe9, 0xe5, 0xa3, 0xb0,
0x19, 0x27, 0xab, 0x5c, 0x1b, 0xc4, 0xd2, 0xf5, 0x54, 0xdd, 0xa8, 0xa7, 0x9e, 0xa8, 0x27, 0xad,
0x0f, 0xa4, 0xf1, 0xee, 0xa1, 0xe5, 0x56, 0xf7, 0xa7, 0x8d, 0x1e, 0x5b, 0x9d, 0x2e, 0xf5, 0x64,
0xb8, 0x02, 0xde, 0xab, 0x55, 0xbd, 0xaa, 0x59, 0x17, 0xed, 0x64, 0x79, 0x1e, 0xaf, 0x05, 0xba,
0x49, 0x0b, 0x05, 0xf7, 0x6a, 0x3d, 0x30, 0xd1, 0x93, 0xdb, 0xbd, 0xcd, 0x22, 0xee, 0xb3, 0x23,
0xa8, 0x41, 0x3d, 0xd9, 0xa6, 0xd1, 0x7e, 0x9b, 0xf5, 0xa8, 0x75, 0x6d, 0xc7, 0xe1, 0x07, 0xd7,
0xa9, 0xf0, 0xc6, 0x60, 0x1e, 0x5d, 0x06, 0x10, 0x94, 0x98, 0x59, 0xee, 0x50, 0x26, 0x9c, 0x99,
0xe4, 0x6e, 0x0f, 0x85, 0xf6, 0x2c, 0xe5, 0x30, 0x7a, 0x9d, 0x4d, 0x67, 0xc0, 0xbd, 0xe7, 0x58,
0x36, 0x10, 0x3c, 0xc7, 0x42, 0x20, 0x6a, 0x3a, 0xf9, 0xbb, 0xde, 0xac, 0xdd, 0x9b, 0xfa, 0x9a,
0x4e, 0x29, 0x5b, 0x54, 0xa8, 0xe9, 0xbc, 0x34, 0x8a, 0x06, 0xda, 0xad, 0x7a, 0x89, 0xfe, 0x51,
0xc8, 0x0c, 0x7a, 0x93, 0x7e, 0x6d, 0x10, 0x8b, 0x66, 0x14, 0xe3, 0x30, 0x9b, 0x67, 0xdc, 0x37,
0xa3, 0x58, 0x36, 0x1a, 0x24, 0x34, 0xa3, 0x74, 0x51, 0xaa, 0x7a, 0x4d, 0x8e, 0xb0, 0x37, 0x0d,
0x57, 0x4f, 0x32, 0xc3, 0xaa, 0xa7, 0xd9, 0xce, 0xb1, 0x6b, 0xa1, 0xbb, 0x0c, 0x3f, 0x57, 0x8b,
0x65, 0x4f, 0xdf, 0x16, 0x2f, 0x57, 0x62, 0x30, 0x14, 0x75, 0x28, 0x05, 0x7c, 0x9c, 0xd0, 0x70,
0xed, 0xc9, 0x70, 0x59, 0x42, 0x52, 0x25, 0x45, 0xea, 0x5d, 0x9c, 0x0a, 0x83, 0x1d, 0x32, 0xb4,
0x38, 0x25, 0x35, 0xd0, 0xa1, 0xbe, 0xfb, 0x5a, 0xa4, 0x67, 0x28, 0xe8, 0xf7, 0x0f, 0xdd, 0xb7,
0x22, 0x1f, 0x0e, 0x20, 0xf1, 0xa1, 0x7e, 0x0b, 0xe8, 0x6d, 0x79, 0xe9, 0xf4, 0xe3, 0x80, 0x29,
0x17, 0x0d, 0x2d, 0x84, 0x69, 0x15, 0xd4, 0xa9, 0x75, 0x82, 0x0b, 0xfc, 0xc7, 0xb0, 0xf2, 0x75,
0x6a, 0x93, 0x9f, 0x0a, 0x24, 0xd4, 0xa9, 0xbb, 0x28, 0xca, 0x33, 0xed, 0x75, 0xd0, 0xbd, 0x80,
0xbe, 0xbd, 0xf4, 0xb9, 0xdf, 0xcb, 0xa1, 0x91, 0xb3, 0x9d, 0x2d, 0x9d, 0x53, 0x0c, 0x4f, 0x41,
0xb7, 0xb3, 0xa5, 0xff, 0x10, 0x63, 0x6d, 0x10, 0x8b, 0x2f, 0x0c, 0x24, 0x1c, 0xde, 0xb6, 0x27,
0xf9, 0x9e, 0xe2, 0x0a, 0x79, 0xe7, 0x28, 0xff, 0x41, 0x3f, 0x68, 0xae, 0xe7, 0x1e, 0x55, 0x2c,
0x85, 0xba, 0x56, 0x5f, 0x9b, 0x73, 0xef, 0x3f, 0x29, 0xd9, 0x18, 0x7d, 0x6b, 0xee, 0x4e, 0x18,
0x52, 0xb6, 0xbf, 0x8c, 0xde, 0xdd, 0x67, 0xb3, 0x09, 0x14, 0xd3, 0xf8, 0x07, 0xee, 0x85, 0x58,
0x36, 0x1b, 0x37, 0x3f, 0x6b, 0x7b, 0xd7, 0x28, 0xb1, 0xb9, 0xd2, 0xb7, 0x0d, 0x6f, 0x16, 0xb3,
0x09, 0x4f, 0x38, 0xba, 0xd2, 0x27, 0x7e, 0x1f, 0x37, 0x02, 0xe2, 0x4a, 0x9f, 0x03, 0x20, 0x7b,
0x27, 0x15, 0x80, 0xd7, 0x5e, 0x23, 0x08, 0xda, 0x53, 0x80, 0x99, 0x75, 0xb5, 0xbd, 0x26, 0xb1,
0xc5, 0x57, 0xf0, 0x8c, 0x8e, 0x90, 0x12, 0xb3, 0x6e, 0x97, 0x32, 0x9d, 0x41, 0x56, 0x5f, 0x7c,
0x5b, 0x63, 0x31, 0x9f, 0x27, 0xd5, 0x0a, 0x75, 0x06, 0x55, 0x4b, 0x0b, 0x20, 0x3a, 0x83, 0x17,
0x34, 0xbd, 0xbc, 0x7d, 0xcc, 0xe9, 0xc5, 0x2e, 0xab, 0xd8, 0x82, 0x67, 0x05, 0xe0, 0xef, 0x2b,
0xe8, 0x07, 0x6a, 0x33, 0x44, 0x2f, 0xa7, 0x58, 0x93, 0x15, 0x0a, 0x42, 0xde, 0x0e, 0x14, 0xdf,
0x6c, 0xad, 0x39, 0xab, 0xf0, 0xe9, 0xa0, 0xb4, 0x82, 0x21, 0x22, 0x2b, 0x24, 0x61, 0xd4, 0xf6,
0x47, 0x59, 0x31, 0xf3, 0xb6, 0xfd, 0x91, 0xfd, 0xc5, 0xc3, 0x1b, 0x34, 0x60, 0xe2, 0xbb, 0x7c,
0x68, 0xf2, 0x1b, 0x46, 0xea, 0x2d, 0x49, 0xef, 0x43, 0xb7, 0x09, 0x22, 0xbe, 0xfb, 0x49, 0xe4,
0xea, 0x65, 0x09, 0x05, 0x4c, 0xdb, 0x3b, 0x70, 0x3e, 0x57, 0x0e, 0x11, 0x74, 0x85, 0x49, 0x13,
0x55, 0x85, 0xfc, 0x78, 0x51, 0x1c, 0x55, 0xec, 0x2c, 0xcb, 0xa1, 0x42, 0x51, 0x55, 0xaa, 0x5b,
0x72, 0x22, 0xaa, 0xfa, 0x38, 0x73, 0x99, 0x42, 0x48, 0x9d, 0x0f, 0x0f, 0x9f, 0x54, 0x49, 0x8a,
0x2f, 0x53, 0x48, 0x1b, 0x5d, 0x8c, 0xd8, 0x49, 0x0b, 0xe0, 0xa6, 0xa7, 0x1f, 0x00, 0xaf, 0xb2,
0xb4, 0x9e, 0x00, 0x3f, 0x4a, 0xaa, 0x64, 0x0e, 0x1c, 0x2a, 0xdc, 0xd3, 0x15, 0x32, 0x76, 0x18,
0xa2, 0xa7, 0x53, 0xac, 0x72, 0xf8, 0xfb, 0xd1, 0xfb, 0x4d, 0xa0, 0x87, 0x42, 0x7d, 0x23, 0xff,
0x85, 0xf8, 0xe3, 0x1a, 0xf1, 0x07, 0xda, 0xc6, 0x84, 0x57, 0x90, 0xcc, 0x5b, 0xdb, 0xef, 0xe9,
0xdf, 0x05, 0xf8, 0x64, 0xd4, 0x34, 0xc8, 0x21, 0xe3, 0xd9, 0x59, 0xb3, 0xae, 0x52, 0xa7, 0x58,
0xa8, 0x41, 0x6c, 0xf1, 0x38, 0xf0, 0xc9, 0x00, 0x1f, 0x67, 0x02, 0x8d, 0x2d, 0x3d, 0x86, 0x32,
0xc7, 0x81, 0xc6, 0xd1, 0x16, 0x00, 0x11, 0x68, 0xbc, 0xa0, 0xe9, 0x5d, 0xb6, 0xf8, 0x04, 0xc2,
0x95, 0x39, 0x81, 0x61, 0x95, 0x39, 0x71, 0xde, 0x11, 0xc8, 0xa3, 0xf7, 0x0f, 0x60, 0xfe, 0x06,
0xaa, 0xfa, 0x3c, 0x2b, 0x77, 0x9b, 0x19, 0x36, 0xe1, 0x0b, 0xfc, 0x16, 0x9d, 0x21, 0xc6, 0x1a,
0x21, 0xd2, 0x10, 0x02, 0x35, 0xa1, 0xcc, 0x00, 0x7b, 0xf5, 0x61, 0x32, 0x07, 0xf1, 0x01, 0x84,
0x78, 0x8d, 0x32, 0x62, 0x41, 0x44, 0x28, 0x23, 0x61, 0xeb, 0x75, 0x23, 0xc3, 0x1c, 0xc3, 0xac,
0xe9, 0x61, 0xd5, 0x51, 0xb2, 0x9a, 0x43, 0xc1, 0x95, 0x49, 0xb4, 0x09, 0x6b, 0x99, 0xf4, 0xf3,
0xc4, 0x26, 0xec, 0x10, 0x3d, 0x2b, 0xe9, 0x76, 0x1e, 0xfc, 0x11, 0xab, 0xb8, 0xfc, 0x0b, 0x18,
0xa7, 0x55, 0x8e, 0x92, 0x6e, 0xf7, 0xa1, 0x3a, 0x24, 0x91, 0x74, 0x87, 0x35, 0xac, 0x4f, 0x47,
0x3b, 0x65, 0x78, 0x05, 0x95, 0xee, 0x27, 0x2f, 0xe6, 0x49, 0x96, 0xab, 0xde, 0xf0, 0x45, 0xc0,
0x36, 0xa1, 0x43, 0x7c, 0x3a, 0x7a, 0xa8, 0xae, 0xf5, 0xb1, 0xed, 0x70, 0x09, 0xd1, 0x9e, 0x70,
0x8f, 0x7d, 0x62, 0x4f, 0xb8, 0x5f, 0xcb, 0x2c, 0xd5, 0x0c, 0x2b, 0xb8, 0x95, 0x20, 0xb6, 0xd8,
0x14, 0x6f, 0x10, 0x59, 0x36, 0x11, 0x48, 0x2c, 0xd5, 0x82, 0x0a, 0x66, 0x6e, 0x33, 0xd8, 0x4e,
0x56, 0x24, 0x79, 0xf6, 0x53, 0x7c, 0xf7, 0xd9, 0xb2, 0xd3, 0x12, 0xc4, 0xdc, 0xe6, 0x27, 0x7d,
0xae, 0x76, 0x81, 0x9f, 0x64, 0x4d, 0xe8, 0x7f, 0x10, 0x78, 0x6e, 0x82, 0xe8, 0x77, 0x65, 0x91,
0xca, 0xd5, 0xcf, 0x46, 0xd1, 0x75, 0xfc, 0x58, 0x37, 0xcb, 0x72, 0xd2, 0xa4, 0x24, 0xc7, 0x90,
0x42, 0x56, 0xf2, 0xf8, 0xd3, 0xf0, 0xb3, 0x42, 0x38, 0x71, 0xb2, 0x3e, 0x40, 0xcd, 0x3a, 0xaf,
0x6d, 0x62, 0xc9, 0x44, 0xfe, 0x69, 0xa8, 0xd3, 0x1a, 0x2a, 0x35, 0x53, 0xee, 0x02, 0x47, 0xa3,
0xd3, 0xe2, 0xc6, 0x16, 0xd8, 0x54, 0x94, 0x18, 0x9d, 0x61, 0x0d, 0xb3, 0xbb, 0x63, 0x71, 0xc7,
0x50, 0xb3, 0x7c, 0x09, 0xe2, 0xfa, 0xdb, 0x63, 0xd2, 0x98, 0x45, 0x11, 0xbb, 0x3b, 0x34, 0x6d,
0xd2, 0x8d, 0xae, 0xdb, 0xcd, 0x62, 0xb5, 0x87, 0xcf, 0xc8, 0x3d, 0x96, 0x04, 0x46, 0xa4, 0x1b,
0x01, 0xdc, 0xda, 0xfd, 0xac, 0x58, 0x32, 0x4d, 0x93, 0x9a, 0x1f, 0x25, 0xab, 0x9c, 0x25, 0x53,
0x31, 0xaf, 0xe3, 0xdd, 0xcf, 0x96, 0x19, 0xdb, 0x10, 0xb5, 0xfb, 0x49, 0xc1, 0x66, 0x65, 0xa7,
0xfe, 0xe2, 0x95, 0xba, 0x5a, 0x78, 0x1b, 0xe5, 0x48, 0xa2, 0xbc, 0xf8, 0x5a, 0xe1, 0x9d, 0x30,
0x64, 0x5e, 0x89, 0x92, 0x22, 0x91, 0x86, 0xdc, 0xf0, 0xe9, 0x38, 0x09, 0xc8, 0xcd, 0x00, 0x61,
0x3e, 0x93, 0x20, 0x7f, 0x6f, 0xff, 0x68, 0x03, 0x57, 0x1f, 0xd1, 0x7d, 0xec, 0xd3, 0xb5, 0xa1,
0xb1, 0xfd, 0x1d, 0xb2, 0xf5, 0x81, 0xb4, 0xf4, 0xfa, 0xfc, 0xe6, 0x7f, 0x7f, 0x7d, 0x6d, 0xf4,
0xf3, 0xaf, 0xaf, 0x8d, 0xfe, 0xff, 0xeb, 0x6b, 0xa3, 0x9f, 0x7d, 0x73, 0xed, 0x9d, 0x9f, 0x7f,
0x73, 0xed, 0x9d, 0xff, 0xfd, 0xe6, 0xda, 0x3b, 0x5f, 0xbd, 0xab, 0xfe, 0x74, 0xda, 0x9b, 0x5f,
0x12, 0x7f, 0x00, 0xed, 0xd9, 0x2f, 0x02, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2e, 0xe4, 0x86, 0x5e,
0x6d, 0x00, 0x00,
}
// This is a compile-time assertion to ensure that this generated file
@ -429,6 +431,7 @@ type ClientCommandsHandler interface {
ObjectListSetIsFavorite(context.Context, *pb.RpcObjectListSetIsFavoriteRequest) *pb.RpcObjectListSetIsFavoriteResponse
ObjectListSetObjectType(context.Context, *pb.RpcObjectListSetObjectTypeRequest) *pb.RpcObjectListSetObjectTypeResponse
ObjectListSetDetails(context.Context, *pb.RpcObjectListSetDetailsRequest) *pb.RpcObjectListSetDetailsResponse
ObjectListModifyDetailValues(context.Context, *pb.RpcObjectListModifyDetailValuesRequest) *pb.RpcObjectListModifyDetailValuesResponse
ObjectApplyTemplate(context.Context, *pb.RpcObjectApplyTemplateRequest) *pb.RpcObjectApplyTemplateResponse
// ObjectToSet creates new set from given object and removes object
ObjectToSet(context.Context, *pb.RpcObjectToSetRequest) *pb.RpcObjectToSetResponse
@ -2138,6 +2141,26 @@ func ObjectListSetDetails(b []byte) (resp []byte) {
return resp
}
func ObjectListModifyDetailValues(b []byte) (resp []byte) {
defer func() {
if PanicHandler != nil {
if r := recover(); r != nil {
resp, _ = (&pb.RpcObjectListModifyDetailValuesResponse{Error: &pb.RpcObjectListModifyDetailValuesResponseError{Code: pb.RpcObjectListModifyDetailValuesResponseError_UNKNOWN_ERROR, Description: "panic recovered"}}).Marshal()
PanicHandler(r)
}
}
}()
in := new(pb.RpcObjectListModifyDetailValuesRequest)
if err := in.Unmarshal(b); err != nil {
resp, _ = (&pb.RpcObjectListModifyDetailValuesResponse{Error: &pb.RpcObjectListModifyDetailValuesResponseError{Code: pb.RpcObjectListModifyDetailValuesResponseError_BAD_INPUT, Description: err.Error()}}).Marshal()
return resp
}
resp, _ = clientCommandsHandler.ObjectListModifyDetailValues(context.Background(), in).Marshal()
return resp
}
func ObjectApplyTemplate(b []byte) (resp []byte) {
defer func() {
if PanicHandler != nil {
@ -5792,6 +5815,8 @@ func CommandAsync(cmd string, data []byte, callback func(data []byte)) {
cd = ObjectListSetObjectType(data)
case "ObjectListSetDetails":
cd = ObjectListSetDetails(data)
case "ObjectListModifyDetailValues":
cd = ObjectListModifyDetailValues(data)
case "ObjectApplyTemplate":
cd = ObjectApplyTemplate(data)
case "ObjectToSet":
@ -7200,6 +7225,20 @@ func (h *ClientCommandsHandlerProxy) ObjectListSetDetails(ctx context.Context, r
call, _ := actualCall(ctx, req)
return call.(*pb.RpcObjectListSetDetailsResponse)
}
func (h *ClientCommandsHandlerProxy) ObjectListModifyDetailValues(ctx context.Context, req *pb.RpcObjectListModifyDetailValuesRequest) *pb.RpcObjectListModifyDetailValuesResponse {
actualCall := func(ctx context.Context, req any) (any, error) {
return h.client.ObjectListModifyDetailValues(ctx, req.(*pb.RpcObjectListModifyDetailValuesRequest)), nil
}
for _, interceptor := range h.interceptors {
toCall := actualCall
currentInterceptor := interceptor
actualCall = func(ctx context.Context, req any) (any, error) {
return currentInterceptor(ctx, req, "ObjectListModifyDetailValues", toCall)
}
}
call, _ := actualCall(ctx, req)
return call.(*pb.RpcObjectListModifyDetailValuesResponse)
}
func (h *ClientCommandsHandlerProxy) ObjectApplyTemplate(ctx context.Context, req *pb.RpcObjectApplyTemplateRequest) *pb.RpcObjectApplyTemplateResponse {
actualCall := func(ctx context.Context, req any) (any, error) {
return h.client.ObjectApplyTemplate(ctx, req.(*pb.RpcObjectApplyTemplateRequest)), nil

214
cmd/iosrepack/main.go Normal file
View file

@ -0,0 +1,214 @@
package main
import (
"fmt"
"os"
"os/exec"
"path/filepath"
)
const (
repack = "repack"
iosArm64 = "ios_arm64.a"
iosArm64Sim = "ios_arm64_sim.a"
iosX86Sim = "ios_x86_sim.a"
iosArm64Repack = "iosArm64"
iosArm64SimRepack = "iosArm64Sim"
iosX86SimRepack = "iosX86Sim"
combined = "libcombined.a"
)
type iosContext struct {
tantivyArm64 string
tantivyArm64Sim string
tantivyX86Sim string
iosLib string
}
func main() {
err := delegateMain()
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
}
func delegateMain() error {
ctx := new(iosContext)
ctx.tantivyArm64 = "deps/libs/ios-arm64/libtantivy_go.a"
ctx.tantivyArm64Sim = "deps/libs/ios-arm64-sim/libtantivy_go.a"
ctx.tantivyX86Sim = "deps/libs/ios-amd64/libtantivy_go.a"
ctx.iosLib = "dist/ios/Lib.xcframework"
iosArm64Lib, iosSimLib, err := thinIosLibs(ctx)
if err != nil {
return err
}
err = repackIosLibsWithTantivy(ctx)
if err != nil {
return err
}
err = removeOldIosLibs(iosArm64Lib, iosSimLib)
if err != nil {
return err
}
err = createNewIosLibs(iosArm64Lib, iosSimLib)
if err != nil {
return err
}
return nil
}
func createNewIosLibs(iosArm64Lib string, iosSimLib string) error {
defer func() {
_ = execute("Cleanup:", "rm", "-rf", repack)
_ = execute("Cleanup:", "rm", iosArm64)
_ = execute("Cleanup:", "rm", iosArm64Sim)
_ = execute("Cleanup:", "rm", iosX86Sim)
}()
err := execute("Error creating lib:", "lipo", "-create",
filepath.Join(repack, iosArm64Repack, combined), "-output", "Lib")
if err != nil {
return err
}
err = execute("Move created lib:", "mv", "Lib", iosArm64Lib)
if err != nil {
return err
}
err = execute("Error creating lib:", "lipo", "-create",
filepath.Join(repack, iosArm64SimRepack, combined),
filepath.Join(repack, iosX86SimRepack, combined), "-output", "Lib")
if err != nil {
return err
}
err = execute("Move created lib:", "mv", "Lib", iosSimLib)
if err != nil {
return err
}
return nil
}
func removeOldIosLibs(iosArm64Lib string, iosSimLib string) error {
err := execute("Error removing lib:", "rm", iosArm64Lib)
if err != nil {
return err
}
err = execute("Error removing lib:", "rm", iosSimLib)
if err != nil {
return err
}
return nil
}
func thinIosLibs(ctx *iosContext) (string, string, error) {
iosArm64Lib := filepath.Join(ctx.iosLib, "ios-arm64", "Lib.framework", "Lib")
err := execute("Error extracting lib:", "lipo", iosArm64Lib, "-thin", "arm64", "-output", iosArm64)
if err != nil {
return "", "", err
}
iosSimLib := filepath.Join(ctx.iosLib, "ios-arm64_x86_64-simulator", "Lib.framework", "Lib")
err = execute("Error extracting lib:", "lipo", iosSimLib, "-thin", "arm64", "-output", iosArm64Sim)
if err != nil {
return "", "", err
}
err = execute("Error extracting lib:", "lipo", iosSimLib, "-thin", "x86_64", "-output", iosX86Sim)
if err != nil {
return "", "", err
}
return iosArm64Lib, iosSimLib, nil
}
func repackIosLibsWithTantivy(ctx *iosContext) error {
err := os.MkdirAll(repack, os.ModePerm)
if err != nil {
return err
}
err = os.Chdir(repack)
if err != nil {
return err
}
err = repackLib(iosArm64Repack, ctx.tantivyArm64, iosArm64)
if err != nil {
return err
}
err = repackLib(iosArm64SimRepack, ctx.tantivyArm64Sim, iosArm64Sim)
if err != nil {
return err
}
err = repackLib(iosX86SimRepack, ctx.tantivyX86Sim, iosX86Sim)
if err != nil {
return err
}
err = os.Chdir("..")
if err != nil {
return err
}
return nil
}
func repackLib(dir string, tantivyLib string, iosLib string) error {
err := os.MkdirAll(dir, os.ModePerm)
if err != nil {
return err
}
err = os.Chdir(dir)
if err != nil {
return err
}
err = execute("Error extracting lib:", "ar", "-x", filepath.Join("..", "..", tantivyLib))
if err != nil {
return err
}
err = execute("Error extracting lib:", "ar", "-x", filepath.Join("..", "..", iosLib))
if err != nil {
return err
}
oFiles, err := filepath.Glob("*.o")
if err != nil {
return err
}
err = execute("Error combine lib:", "ar", append([]string{"-qc", combined}, oFiles...)...)
if err != nil {
return err
}
err = os.Chdir("..")
if err != nil {
return err
}
return nil
}
func execute(errText string, name string, arg ...string) error {
cmd := exec.Command(name, arg...)
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
err := cmd.Run()
if err != nil {
fmt.Println(errText, err)
return err
}
return nil
}

View file

@ -436,6 +436,9 @@ func validate(snapshot *pb.SnapshotWithType, info *useCaseInfo) (err error) {
}
func insertAnalyticsData(s *pb.ChangeSnapshot, info *useCaseInfo) {
if s == nil || s.Data == nil || len(s.Data.Blocks) == 0 {
return
}
root := s.Data.Blocks[0]
id := pbtypes.GetString(s.Data.Details, bundle.RelationKeyId.String())
f := root.GetFields().GetFields()

View file

@ -17,6 +17,7 @@ import (
"github.com/anyproto/any-sync/commonspace/spacesyncproto"
"github.com/anyproto/any-sync/coordinator/coordinatorclient/mock_coordinatorclient"
"github.com/anyproto/any-sync/coordinator/coordinatorproto"
"github.com/anyproto/any-sync/net/peer"
"github.com/anyproto/any-sync/nodeconf"
"github.com/anyproto/any-sync/util/cidutil"
"github.com/anyproto/any-sync/util/crypto"
@ -114,6 +115,14 @@ type mockSyncAcl struct {
list.AclList
}
func (m mockSyncAcl) HandleMessage(ctx context.Context, senderId string, protoVersion uint32, message *spacesyncproto.ObjectSyncMessage) (err error) {
return
}
func (m mockSyncAcl) SyncWithPeer(ctx context.Context, p peer.Peer) (err error) {
return
}
func (m mockSyncAcl) Init(a *app.App) (err error) {
return nil
}
@ -126,10 +135,6 @@ func (m mockSyncAcl) Run(ctx context.Context) (err error) {
return nil
}
func (m mockSyncAcl) HandleMessage(ctx context.Context, senderId string, message *spacesyncproto.ObjectSyncMessage) (err error) {
return nil
}
func (m mockSyncAcl) HandleRequest(ctx context.Context, senderId string, request *spacesyncproto.ObjectSyncMessage) (response *spacesyncproto.ObjectSyncMessage, err error) {
return nil, nil
}
@ -137,10 +142,6 @@ func (m mockSyncAcl) HandleRequest(ctx context.Context, senderId string, request
func (m mockSyncAcl) SetHeadUpdater(updater headupdater.HeadUpdater) {
}
func (m mockSyncAcl) SyncWithPeer(ctx context.Context, peerId string) (err error) {
return nil
}
func (m mockSyncAcl) SetAclUpdater(updater headupdater.AclUpdater) {
}

View file

@ -23,7 +23,6 @@ import (
"github.com/anyproto/anytype-heart/core/domain/objectorigin"
"github.com/anyproto/anytype-heart/core/files/fileuploader"
"github.com/anyproto/anytype-heart/core/session"
"github.com/anyproto/anytype-heart/pb"
"github.com/anyproto/anytype-heart/pkg/lib/bundle"
"github.com/anyproto/anytype-heart/pkg/lib/core"
"github.com/anyproto/anytype-heart/pkg/lib/database"
@ -42,8 +41,8 @@ const CName = "bookmark"
type ContentFuture func() *bookmark.ObjectContent
type Service interface {
CreateObjectAndFetch(ctx context.Context, spaceId string, req *pb.RpcObjectCreateBookmarkRequest) (objectID string, newDetails *types.Struct, err error)
CreateBookmarkObject(ctx context.Context, spaceID string, details *types.Struct, getContent ContentFuture) (objectId string, newDetails *types.Struct, err error)
CreateObjectAndFetch(ctx context.Context, spaceId string, details *types.Struct) (objectID string, newDetails *types.Struct, err error)
CreateBookmarkObject(ctx context.Context, spaceId string, details *types.Struct, getContent ContentFuture) (objectId string, newDetails *types.Struct, err error)
UpdateObject(objectId string, getContent *bookmark.ObjectContent) error
// TODO Maybe Fetch and FetchBookmarkContent do the same thing differently?
FetchAsync(spaceID string, blockID string, params bookmark.FetchParams)
@ -92,24 +91,28 @@ func (s *service) Name() (name string) {
var log = logging.Logger("anytype-mw-bookmark")
func (s *service) CreateObjectAndFetch(ctx context.Context, spaceId string, req *pb.RpcObjectCreateBookmarkRequest) (objectID string, newDetails *types.Struct, err error) {
source := pbtypes.GetString(req.Details, bundle.RelationKeySource.String())
func (s *service) CreateObjectAndFetch(
ctx context.Context, spaceId string, details *types.Struct,
) (objectID string, newDetails *types.Struct, err error) {
source := pbtypes.GetString(details, bundle.RelationKeySource.String())
var res ContentFuture
if source != "" {
u, err := uri.NormalizeURI(source)
if err != nil {
return "", nil, fmt.Errorf("process uri: %w", err)
}
res = s.FetchBookmarkContent(req.SpaceId, u, false)
res = s.FetchBookmarkContent(spaceId, u, false)
} else {
res = func() *bookmark.ObjectContent {
return nil
}
}
return s.CreateBookmarkObject(ctx, spaceId, req.Details, res)
return s.CreateBookmarkObject(ctx, spaceId, details, res)
}
func (s *service) CreateBookmarkObject(ctx context.Context, spaceID string, details *types.Struct, getContent ContentFuture) (objectId string, objectDetails *types.Struct, err error) {
func (s *service) CreateBookmarkObject(
ctx context.Context, spaceID string, details *types.Struct, getContent ContentFuture,
) (objectId string, objectDetails *types.Struct, err error) {
if details == nil || details.Fields == nil {
return "", nil, fmt.Errorf("empty details")
}

View file

@ -1,15 +1,118 @@
package bookmark
import (
"context"
"testing"
"github.com/gogo/protobuf/types"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/mock"
"github.com/anyproto/anytype-heart/core/block/editor/state"
"github.com/anyproto/anytype-heart/core/block/object/objectcreator/mock_objectcreator"
"github.com/anyproto/anytype-heart/core/block/simple/bookmark"
"github.com/anyproto/anytype-heart/core/domain"
"github.com/anyproto/anytype-heart/core/session"
"github.com/anyproto/anytype-heart/pkg/lib/bundle"
"github.com/anyproto/anytype-heart/pkg/lib/localstore/objectstore"
"github.com/anyproto/anytype-heart/pkg/lib/pb/model"
"github.com/anyproto/anytype-heart/space/clientspace/mock_clientspace"
"github.com/anyproto/anytype-heart/space/mock_space"
"github.com/anyproto/anytype-heart/util/linkpreview/mock_linkpreview"
"github.com/anyproto/anytype-heart/util/pbtypes"
)
const (
spaceId = "space1"
bookmarkId = "ot-bookmark"
)
type detailsSetter struct{}
func (ds *detailsSetter) SetDetails(session.Context, string, []*model.Detail) error {
return nil
}
type fixture struct {
s *service
creator *mock_objectcreator.MockService
space *mock_clientspace.MockSpace
spaceService *mock_space.MockService
store *objectstore.StoreFixture
}
func newFixture(t *testing.T) *fixture {
spc := mock_clientspace.NewMockSpace(t)
spc.EXPECT().GetTypeIdByKey(mock.Anything, bundle.TypeKeyBookmark).Return(bookmarkId, nil).Once()
spaceSvc := mock_space.NewMockService(t)
spaceSvc.EXPECT().Get(mock.Anything, spaceId).Return(spc, nil).Once()
store := objectstore.NewStoreFixture(t)
creator := mock_objectcreator.NewMockService(t)
s := &service{
detailsSetter: &detailsSetter{},
creator: creator,
store: store,
spaceService: spaceSvc,
}
return &fixture{
s: s,
creator: creator,
space: spc,
spaceService: spaceSvc,
store: store,
}
}
func TestService_CreateBookmarkObject(t *testing.T) {
t.Run("new bookmark object creation", func(t *testing.T) {
// given
fx := newFixture(t)
details := &types.Struct{Fields: map[string]*types.Value{}}
fx.creator.EXPECT().CreateSmartBlockFromState(mock.Anything, mock.Anything, mock.Anything, mock.Anything).RunAndReturn(
func(_ context.Context, spcId string, keys []domain.TypeKey, state *state.State) (string, *types.Struct, error) {
assert.Equal(t, spaceId, spcId)
assert.Equal(t, []domain.TypeKey{bundle.TypeKeyBookmark}, keys)
assert.Equal(t, details, state.Details())
return "some_id", nil, nil
},
).Once()
// when
_, _, err := fx.s.CreateBookmarkObject(nil, spaceId, details, func() *bookmark.ObjectContent { return nil })
// then
assert.NoError(t, err)
})
t.Run("bookmark with existing url is created", func(t *testing.T) {
// given
fx := newFixture(t)
url := "https://url.com"
details := &types.Struct{Fields: map[string]*types.Value{
bundle.RelationKeySource.String(): pbtypes.String(url),
}}
fx.store.AddObjects(t, []objectstore.TestObject{{
bundle.RelationKeyId: pbtypes.String("bk"),
bundle.RelationKeySource: pbtypes.String(url),
bundle.RelationKeyType: pbtypes.String(bookmarkId),
}})
// when
id, _, err := fx.s.CreateBookmarkObject(nil, spaceId, details, func() *bookmark.ObjectContent {
return &bookmark.ObjectContent{BookmarkContent: &model.BlockContentBookmark{}}
})
// then
assert.NoError(t, err)
assert.Equal(t, "bk", id)
})
}
func TestService_FetchBookmarkContent(t *testing.T) {
t.Run("link to html page - create blocks", func(t *testing.T) {
// given

View file

@ -101,7 +101,7 @@ func (s *Service) updateCollection(ctx session.Context, contextID string, modifi
s.UpdateStoreSlice(template.CollectionStoreKey, lst)
internalflag.Set{}.AddToState(s)
return nil
})
}, smartblock.KeepInternalFlags)
}
func (s *Service) collectionAddHookOnce(sb smartblock.SmartBlock) {

125
core/block/details.go Normal file
View file

@ -0,0 +1,125 @@
package block
import (
"errors"
"slices"
"github.com/gogo/protobuf/types"
"github.com/samber/lo"
"github.com/anyproto/anytype-heart/core/block/cache"
"github.com/anyproto/anytype-heart/core/block/editor/basic"
"github.com/anyproto/anytype-heart/core/session"
"github.com/anyproto/anytype-heart/pb"
"github.com/anyproto/anytype-heart/pkg/lib/pb/model"
"github.com/anyproto/anytype-heart/util/pbtypes"
"github.com/anyproto/anytype-heart/util/slice"
)
func (s *Service) SetDetails(ctx session.Context, objectId string, details []*model.Detail) (err error) {
return cache.Do(s, objectId, func(b basic.DetailsSettable) error {
return b.SetDetails(ctx, details, true)
})
}
func (s *Service) SetDetailsList(ctx session.Context, objectIds []string, details []*model.Detail) (err error) {
var (
resultError error
anySucceed bool
)
for _, objectId := range objectIds {
err := s.SetDetails(ctx, objectId, details)
if err != nil {
resultError = errors.Join(resultError, err)
} else {
anySucceed = true
}
}
if resultError != nil {
log.Warnf("SetDetailsList: %v", resultError)
}
if anySucceed {
return nil
}
return resultError
}
// ModifyDetails performs details get and update under the sb lock to make sure no modifications are done in the middle
func (s *Service) ModifyDetails(objectId string, modifier func(current *types.Struct) (*types.Struct, error)) (err error) {
return cache.Do(s, objectId, func(du basic.DetailsUpdatable) error {
return du.UpdateDetails(modifier)
})
}
func (s *Service) ModifyDetailsList(req *pb.RpcObjectListModifyDetailValuesRequest) (resultError error) {
var anySucceed bool
for _, objectId := range req.ObjectIds {
err := s.ModifyDetails(objectId, func(current *types.Struct) (*types.Struct, error) {
for _, op := range req.Operations {
if !pbtypes.IsEmptyValue(op.Set) {
// Set operation has higher priority than Add and Remove, because it modifies full value
current.Fields[op.RelationKey] = op.Set
continue
}
addValueToListDetail(current, op.RelationKey, op.Add)
removeValueFromListDetail(current, op.RelationKey, op.Remove)
}
return current, nil
})
if err != nil {
resultError = errors.Join(resultError, err)
} else {
anySucceed = true
}
}
if resultError != nil {
log.Warnf("ModifyDetailsList: %v", resultError)
}
if anySucceed {
return nil
}
return resultError
}
// addValueToListDetail adds values to int lists and string lists
func addValueToListDetail(s *types.Struct, key string, v *types.Value) {
if pbtypes.IsStructEmpty(s) || v == nil {
return
}
toAdd := pbtypes.GetList(v)
oldValues := pbtypes.GetValueList(s, key)
newValues := slice.MergeUniqBy(oldValues, toAdd, func(this *types.Value, that *types.Value) bool {
return this.Equal(that)
})
s.Fields[key] = &types.Value{
Kind: &types.Value_ListValue{ListValue: &types.ListValue{Values: newValues}},
}
}
// removeValueFromListDetail removes values from int lists and string lists
func removeValueFromListDetail(s *types.Struct, key string, v *types.Value) {
if pbtypes.IsStructEmpty(s) || v == nil {
return
}
value := pbtypes.Get(s, key)
if value == nil {
return
}
if value.Equal(v) {
delete(s.Fields, key)
return
}
oldValues := pbtypes.GetList(value)
if len(oldValues) == 0 {
return
}
toDelete := pbtypes.GetList(v)
newValues := lo.Filter(oldValues, func(oldValue *types.Value, _ int) bool {
return !slices.ContainsFunc(toDelete, func(valueToDelete *types.Value) bool {
return oldValue.Equal(valueToDelete)
})
})
s.Fields[key] = &types.Value{
Kind: &types.Value_ListValue{ListValue: &types.ListValue{Values: newValues}},
}
}

View file

@ -0,0 +1,71 @@
package block
import (
"testing"
"github.com/gogo/protobuf/types"
"github.com/stretchr/testify/assert"
"github.com/anyproto/anytype-heart/util/pbtypes"
)
func newStruct() *types.Struct {
return &types.Struct{Fields: map[string]*types.Value{
"tag": pbtypes.StringList([]string{"red", "black"}),
"author": pbtypes.String("William Shakespeare"),
"haters": pbtypes.StringList([]string{}),
"year": pbtypes.Int64(1564),
"numbers": pbtypes.IntList(8, 13, 21, 34),
}}
}
func TestAddValueToListDetail(t *testing.T) {
for _, tc := range []struct {
name string
key string
s *types.Struct
toAdd *types.Value
expected *types.Value
}{
{"string list + string list", "tag", newStruct(), pbtypes.StringList([]string{"blue", "green"}), pbtypes.StringList([]string{"red", "black", "blue", "green"})},
{"string list + string list (intersect)", "tag", newStruct(), pbtypes.StringList([]string{"blue", "black"}), pbtypes.StringList([]string{"red", "black", "blue"})},
{"string + string list", "author", newStruct(), pbtypes.StringList([]string{"Victor Hugo"}), pbtypes.StringList([]string{"William Shakespeare", "Victor Hugo"})},
{"string list + string", "tag", newStruct(), pbtypes.String("orange"), pbtypes.StringList([]string{"red", "black", "orange"})},
{"int list + int list", "numbers", newStruct(), pbtypes.IntList(55, 89), pbtypes.IntList(8, 13, 21, 34, 55, 89)},
{"int list + int list (intersect)", "numbers", newStruct(), pbtypes.IntList(13, 8, 55), pbtypes.IntList(8, 13, 21, 34, 55)},
{"int + int list", "year", newStruct(), pbtypes.IntList(1666, 2025), pbtypes.IntList(1564, 1666, 2025)},
{"int list + int", "numbers", newStruct(), pbtypes.Int64(55), pbtypes.IntList(8, 13, 21, 34, 55)},
{"string list + empty", "haters", newStruct(), pbtypes.StringList([]string{"Tomas River", "Leo Tolstoy"}), pbtypes.StringList([]string{"Tomas River", "Leo Tolstoy"})},
{"string list + no such key", "plays", newStruct(), pbtypes.StringList([]string{"Falstaff", "Romeo and Juliet", "Macbeth"}), pbtypes.StringList([]string{"Falstaff", "Romeo and Juliet", "Macbeth"})},
} {
t.Run(tc.name, func(t *testing.T) {
addValueToListDetail(tc.s, tc.key, tc.toAdd)
assert.True(t, pbtypes.Get(tc.s, tc.key).Equal(tc.expected))
})
}
}
func TestRemoveValueFromListDetail(t *testing.T) {
for _, tc := range []struct {
name string
key string
s *types.Struct
toRemove *types.Value
expected *types.Value
}{
{"string list - string list", "tag", newStruct(), pbtypes.StringList([]string{"red", "black"}), nil},
{"string list - string list (some are not presented)", "tag", newStruct(), pbtypes.StringList([]string{"blue", "black"}), pbtypes.StringList([]string{"red"})},
{"string list - string", "tag", newStruct(), pbtypes.String("red"), pbtypes.StringList([]string{"black"})},
{"string - string list", "author", newStruct(), pbtypes.StringList([]string{"William Shakespeare"}), pbtypes.StringList([]string{})},
{"int list - int list", "numbers", newStruct(), pbtypes.IntList(13, 34), pbtypes.IntList(8, 21)},
{"int list - int list (some are not presented)", "numbers", newStruct(), pbtypes.IntList(2020, 5), pbtypes.IntList(8, 13, 21, 34)},
{"int - int list", "year", newStruct(), pbtypes.IntList(1380, 1564), pbtypes.IntList()},
{"int list - int", "numbers", newStruct(), pbtypes.Int64(21), pbtypes.IntList(8, 13, 34)},
{"empty - string list", "haters", newStruct(), pbtypes.StringList([]string{"Tomas River", "Leo Tolstoy"}), pbtypes.StringList([]string{})},
} {
t.Run(tc.name, func(t *testing.T) {
removeValueFromListDetail(tc.s, tc.key, tc.toRemove)
assert.True(t, pbtypes.Get(tc.s, tc.key).Equal(tc.expected))
})
}
}

View file

@ -2,7 +2,6 @@ package block
import (
"context"
"errors"
"fmt"
"github.com/gogo/protobuf/types"
@ -144,34 +143,6 @@ func (s *Service) SetFields(ctx session.Context, req pb.RpcBlockSetFieldsRequest
})
}
func (s *Service) SetDetails(ctx session.Context, objectId string, details []*model.Detail) (err error) {
return cache.Do(s, objectId, func(b basic.DetailsSettable) error {
return b.SetDetails(ctx, details, true)
})
}
func (s *Service) SetDetailsList(ctx session.Context, objectIds []string, details []*model.Detail) (err error) {
var (
resultError error
anySucceed bool
)
for _, objectId := range objectIds {
err := s.SetDetails(ctx, objectId, details)
if err != nil {
resultError = errors.Join(resultError, err)
} else {
anySucceed = true
}
}
if resultError != nil {
log.Warnf("SetDetailsList: %v", resultError)
}
if anySucceed {
return nil
}
return resultError
}
func (s *Service) SetFieldsList(ctx session.Context, req pb.RpcBlockListSetFieldsRequest) (err error) {
return cache.Do(s, req.ContextId, func(b basic.CommonOperations) error {
return b.SetFields(ctx, req.BlockFields...)
@ -632,13 +603,6 @@ func (s *Service) GetRelations(ctx session.Context, objectId string) (relations
return
}
// ModifyDetails performs details get and update under the sb lock to make sure no modifications are done in the middle
func (s *Service) ModifyDetails(objectId string, modifier func(current *types.Struct) (*types.Struct, error)) (err error) {
return cache.Do(s, objectId, func(du basic.DetailsUpdatable) error {
return du.UpdateDetails(modifier)
})
}
func (s *Service) AddExtraRelations(ctx session.Context, objectId string, relationIds []string) (err error) {
if len(relationIds) == 0 {
return nil

View file

@ -23,6 +23,7 @@ import (
"github.com/anyproto/anytype-heart/pkg/lib/localstore/objectstore"
"github.com/anyproto/anytype-heart/pkg/lib/logging"
"github.com/anyproto/anytype-heart/pkg/lib/pb/model"
"github.com/anyproto/anytype-heart/util/internalflag"
"github.com/anyproto/anytype-heart/util/pbtypes"
"github.com/anyproto/anytype-heart/util/slice"
)
@ -84,10 +85,15 @@ func (d *sdataview) SetSource(ctx session.Context, blockId string, source []stri
return
}
flags := internalflag.NewFromState(s)
// set with source is no longer empty
flags.Remove(model.InternalFlag_editorDeleteEmpty)
flags.AddToState(s)
if len(source) == 0 {
s.Unlink(blockId)
s.SetLocalDetail(bundle.RelationKeySetOf.String(), pbtypes.StringList(source))
return d.Apply(s, smartblock.NoRestrictions)
return d.Apply(s, smartblock.NoRestrictions, smartblock.KeepInternalFlags)
}
dvContent, err := BlockBySource(d.objectStore, source)
@ -105,7 +111,7 @@ func (d *sdataview) SetSource(ctx session.Context, blockId string, source []stri
}
s.SetLocalDetail(bundle.RelationKeySetOf.String(), pbtypes.StringList(source))
return d.Apply(s, smartblock.NoRestrictions)
return d.Apply(s, smartblock.NoRestrictions, smartblock.KeepInternalFlags)
}
func (d *sdataview) AddRelations(ctx session.Context, blockId string, relationKeys []string, showEvent bool) error {

View file

@ -86,12 +86,13 @@ func (f *File) Init(ctx *smartblock.InitContext) error {
f.SmartBlock.AddHook(f.reconciler.FileObjectHook(domain.FullID{SpaceID: f.SpaceID(), ObjectID: f.Id()}), smartblock.HookBeforeApply)
if !ctx.IsNewObject {
err = f.fileObjectService.EnsureFileAddedToSyncQueue(domain.FullID{ObjectID: f.Id(), SpaceID: f.SpaceID()}, ctx.State.Details())
fullId := domain.FullID{ObjectID: f.Id(), SpaceID: f.SpaceID()}
err = f.fileObjectService.EnsureFileAddedToSyncQueue(fullId, ctx.State.Details())
if err != nil {
log.Errorf("failed to ensure file added to sync queue: %v", err)
}
f.AddHook(func(applyInfo smartblock.ApplyInfo) error {
return f.fileObjectService.EnsureFileAddedToSyncQueue(domain.FullID{ObjectID: f.Id(), SpaceID: f.SpaceID()}, applyInfo.State.Details())
return f.fileObjectService.EnsureFileAddedToSyncQueue(fullId, applyInfo.State.Details())
}, smartblock.HookOnStateRebuild)
}
return nil

View file

@ -1,14 +1,9 @@
package smartblock
import (
"context"
"github.com/samber/lo"
"github.com/anyproto/anytype-heart/core/block/editor/state"
"github.com/anyproto/anytype-heart/core/block/editor/template"
"github.com/anyproto/anytype-heart/core/block/object/objectlink"
"github.com/anyproto/anytype-heart/core/block/simple"
"github.com/anyproto/anytype-heart/core/domain"
"github.com/anyproto/anytype-heart/pb"
"github.com/anyproto/anytype-heart/pkg/lib/bundle"
"github.com/anyproto/anytype-heart/pkg/lib/pb/model"
@ -27,86 +22,21 @@ func (sb *smartBlock) updateBackLinks(s *state.State) {
}
func (sb *smartBlock) injectLinksDetails(s *state.State) {
links := sb.navigationalLinks(s)
links := objectlink.DependentObjectIDs(s, sb.Space(), objectlink.Flags{
Blocks: true,
Details: true,
Relations: sb.includeRelationObjectsAsDependents,
Types: false,
Collection: !internalflag.NewFromState(s).Has(model.InternalFlag_collectionDontIndexLinks),
DataviewBlockOnlyTarget: true,
NoSystemRelations: true,
NoHiddenBundledRelations: true,
NoImages: true,
})
links = slice.RemoveMut(links, sb.Id())
s.SetLocalDetail(bundle.RelationKeyLinks.String(), pbtypes.StringList(links))
}
func (sb *smartBlock) navigationalLinks(s *state.State) (ids []string) {
if !internalflag.NewFromState(s).Has(model.InternalFlag_collectionDontIndexLinks) {
// flag used when importing a large set of objects
ids = append(ids, s.GetStoreSlice(template.CollectionStoreKey)...)
}
ids = append(ids, collectBlockLinks(s)...)
ids = append(ids, sb.collectRelationLinks(s)...)
return lo.Uniq(ids)
}
func collectBlockLinks(s *state.State) (ids []string) {
err := s.Iterate(func(b simple.Block) (isContinue bool) {
if f := b.Model().GetFile(); f != nil {
if f.TargetObjectId != "" && f.Type != model.BlockContentFile_Image {
ids = append(ids, f.TargetObjectId)
}
return true
}
// Include only link to target object
if dv := b.Model().GetDataview(); dv != nil {
if dv.TargetObjectId != "" {
ids = append(ids, dv.TargetObjectId)
}
return true
}
if ls, ok := b.(linkSource); ok {
ids = ls.FillSmartIds(ids)
}
return true
})
if err != nil {
log.With("objectID", s.RootId()).Errorf("failed to iterate over simple blocks: %s", err)
}
return
}
func (sb *smartBlock) collectRelationLinks(s *state.State) (ids []string) {
det := s.CombinedDetails()
includeRelations := sb.includeRelationObjectsAsDependents
for _, rel := range s.GetRelationLinks() {
if includeRelations {
relId, err := sb.space.GetRelationIdByKey(context.TODO(), domain.RelationKey(rel.Key))
if err != nil {
log.With("objectID", s.RootId()).Errorf("failed to derive object id for relation: %s", err)
continue
}
ids = append(ids, relId)
}
// handle corner cases: first for specific formats and system relations
if rel.Format != model.RelationFormat_object || bundle.IsSystemRelation(domain.RelationKey(rel.Key)) {
continue
}
// Do not include hidden relations. Only bundled relations can be hidden, so we don't need
// to request relations from object store.
if r, err := bundle.GetRelation(domain.RelationKey(rel.Key)); err == nil && r.Hidden {
continue
}
// Add all object relation values as dependents
for _, targetID := range pbtypes.GetStringList(det, rel.Key) {
if targetID != "" {
ids = append(ids, targetID)
}
}
}
return
}
func isBacklinksChanged(msgs []simple.EventMessage) bool {
for _, msg := range msgs {
if amend, ok := msg.Msg.Value.(*pb.EventMessageValueOfObjectDetailsAmend); ok {

View file

@ -543,7 +543,13 @@ func (sb *smartBlock) onMetaChange(details *types.Struct) {
// dependentSmartIds returns list of dependent objects in this order: Simple blocks(Link, mentions in Text), Relations. Both of them are returned in the order of original blocks/relations
func (sb *smartBlock) dependentSmartIds(includeRelations, includeObjTypes, includeCreatorModifier bool) (ids []string) {
return objectlink.DependentObjectIDs(sb.Doc.(*state.State), sb.Space(), true, true, includeRelations, includeObjTypes, includeCreatorModifier)
return objectlink.DependentObjectIDs(sb.Doc.(*state.State), sb.Space(), objectlink.Flags{
Blocks: true,
Details: true,
Relations: includeRelations,
Types: includeObjTypes,
CreatorModifierWorkspace: includeCreatorModifier,
})
}
func (sb *smartBlock) RegisterSession(ctx session.Context) {

View file

@ -87,11 +87,15 @@ func handleDataviewBlock(block simple.Block, oldIDtoNew map[string]string, st *s
for _, view := range dataView.GetViews() {
for _, filter := range view.GetFilters() {
updateObjectIDsInFilter(filter, oldIDtoNew)
updateRelationKeyInFilter(oldIDtoNew, filter)
}
if view.DefaultTemplateId != "" {
view.DefaultTemplateId = oldIDtoNew[view.DefaultTemplateId]
}
updateRelationsInView(view, oldIDtoNew)
updateSortsInView(view, oldIDtoNew)
}
for _, group := range dataView.GetGroupOrders() {
for _, vg := range group.ViewGroups {
@ -107,6 +111,37 @@ func handleDataviewBlock(block simple.Block, oldIDtoNew map[string]string, st *s
}
}
}
updateRelationsLinksInView(dataView, oldIDtoNew)
}
func updateSortsInView(view *model.BlockContentDataviewView, oldIDtoNew map[string]string) {
for _, sort := range view.GetSorts() {
if newKey, ok := oldIDtoNew[sort.RelationKey]; ok && sort.RelationKey != newKey {
sort.RelationKey = newKey
}
}
}
func updateRelationsLinksInView(dataView *model.BlockContentDataview, oldIDtoNew map[string]string) {
for _, relationLink := range dataView.GetRelationLinks() {
if newKey, ok := oldIDtoNew[relationLink.Key]; ok && relationLink.Key != newKey {
relationLink.Key = newKey
}
}
}
func updateRelationsInView(view *model.BlockContentDataviewView, oldIDtoNew map[string]string) {
for _, relation := range view.Relations {
if newKey, ok := oldIDtoNew[relation.Key]; ok && relation.Key != newKey {
relation.Key = newKey
}
}
}
func updateRelationKeyInFilter(oldIDtoNew map[string]string, filter *model.BlockContentDataviewFilter) {
if newKey, ok := oldIDtoNew[filter.RelationKey]; ok && filter.RelationKey != newKey {
filter.RelationKey = newKey
}
}
func updateObjectIDsInFilter(filter *model.BlockContentDataviewFilter, oldIDtoNew map[string]string) {

View file

@ -10,6 +10,7 @@ import (
"github.com/anyproto/anytype-heart/core/block/simple"
"github.com/anyproto/anytype-heart/pkg/lib/localstore/addr"
"github.com/anyproto/anytype-heart/pkg/lib/pb/model"
"github.com/anyproto/anytype-heart/util/pbtypes"
)
func TestReplaceChunks(t *testing.T) {
@ -165,4 +166,192 @@ func TestUpdateLinksToObjects(t *testing.T) {
assert.Nil(t, err)
assert.Equal(t, "url", st.Get("test").Model().GetText().GetIconImage())
})
t.Run("update data view filters relations", func(t *testing.T) {
// given
block := &model.Block{
Id: "test",
Content: &model.BlockContentOfDataview{Dataview: &model.BlockContentDataview{
Views: []*model.BlockContentDataviewView{
{
Id: "id",
Filters: []*model.BlockContentDataviewFilter{
{
Id: "id1",
RelationKey: "key",
Value: pbtypes.String("test"),
},
{
Id: "id1",
RelationKey: "key1",
Value: pbtypes.String("test"),
},
},
},
},
}},
}
rootBlock := &model.Block{
Id: "root",
ChildrenIds: []string{"test"},
Content: &model.BlockContentOfSmartblock{Smartblock: &model.BlockContentSmartblock{}},
}
simpleBlock := simple.New(block)
rootSimpleBlock := simple.New(rootBlock)
st := state.NewDoc("root", map[string]simple.Block{"test": simpleBlock, "root": rootSimpleBlock}).(*state.State)
// when
err := UpdateLinksToObjects(st, map[string]string{"key": "newKey"})
// then
assert.Nil(t, err)
assert.Equal(t, "newKey", st.Get("test").Model().GetDataview().GetViews()[0].GetFilters()[0].RelationKey)
assert.Equal(t, "key1", st.Get("test").Model().GetDataview().GetViews()[0].GetFilters()[1].RelationKey)
})
t.Run("update data view filters relations", func(t *testing.T) {
// given
block := &model.Block{
Id: "test",
Content: &model.BlockContentOfDataview{Dataview: &model.BlockContentDataview{
Views: []*model.BlockContentDataviewView{
{
Id: "id",
Filters: []*model.BlockContentDataviewFilter{
{
Id: "id1",
RelationKey: "key",
Value: pbtypes.String("test"),
},
{
Id: "id1",
RelationKey: "key1",
Value: pbtypes.String("test"),
},
},
},
},
}},
}
rootBlock := &model.Block{
Id: "root",
ChildrenIds: []string{"test"},
Content: &model.BlockContentOfSmartblock{Smartblock: &model.BlockContentSmartblock{}},
}
simpleBlock := simple.New(block)
rootSimpleBlock := simple.New(rootBlock)
st := state.NewDoc("root", map[string]simple.Block{"test": simpleBlock, "root": rootSimpleBlock}).(*state.State)
// when
err := UpdateLinksToObjects(st, map[string]string{"key": "newKey"})
// then
assert.Nil(t, err)
assert.Equal(t, "newKey", st.Get("test").Model().GetDataview().GetViews()[0].GetFilters()[0].RelationKey)
assert.Equal(t, "key1", st.Get("test").Model().GetDataview().GetViews()[0].GetFilters()[1].RelationKey)
})
t.Run("update data view relations", func(t *testing.T) {
// given
block := &model.Block{
Id: "test",
Content: &model.BlockContentOfDataview{Dataview: &model.BlockContentDataview{
Views: []*model.BlockContentDataviewView{
{
Id: "id",
Relations: []*model.BlockContentDataviewRelation{
{
Key: "key",
},
{
Key: "key1",
},
},
},
},
}},
}
rootBlock := &model.Block{
Id: "root",
ChildrenIds: []string{"test"},
Content: &model.BlockContentOfSmartblock{Smartblock: &model.BlockContentSmartblock{}},
}
simpleBlock := simple.New(block)
rootSimpleBlock := simple.New(rootBlock)
st := state.NewDoc("root", map[string]simple.Block{"test": simpleBlock, "root": rootSimpleBlock}).(*state.State)
// when
err := UpdateLinksToObjects(st, map[string]string{"key": "newKey"})
// then
assert.Nil(t, err)
assert.Equal(t, "newKey", st.Get("test").Model().GetDataview().GetViews()[0].GetRelations()[0].Key)
assert.Equal(t, "key1", st.Get("test").Model().GetDataview().GetViews()[0].GetRelations()[1].Key)
})
t.Run("update data view relations links", func(t *testing.T) {
// given
block := &model.Block{
Id: "test",
Content: &model.BlockContentOfDataview{Dataview: &model.BlockContentDataview{
RelationLinks: []*model.RelationLink{
{
Key: "key",
},
{
Key: "key1",
},
},
}},
}
rootBlock := &model.Block{
Id: "root",
ChildrenIds: []string{"test"},
Content: &model.BlockContentOfSmartblock{Smartblock: &model.BlockContentSmartblock{}},
}
simpleBlock := simple.New(block)
rootSimpleBlock := simple.New(rootBlock)
st := state.NewDoc("root", map[string]simple.Block{"test": simpleBlock, "root": rootSimpleBlock}).(*state.State)
// when
err := UpdateLinksToObjects(st, map[string]string{"key": "newKey"})
// then
assert.Nil(t, err)
assert.Equal(t, "newKey", st.Get("test").Model().GetDataview().GetRelationLinks()[0].Key)
assert.Equal(t, "key1", st.Get("test").Model().GetDataview().GetRelationLinks()[1].Key)
})
t.Run("update data view sort", func(t *testing.T) {
// given
block := &model.Block{
Id: "test",
Content: &model.BlockContentOfDataview{Dataview: &model.BlockContentDataview{
Views: []*model.BlockContentDataviewView{
{
Id: "id",
Sorts: []*model.BlockContentDataviewSort{
{
RelationKey: "key",
},
{
RelationKey: "key1",
},
},
},
},
}},
}
rootBlock := &model.Block{
Id: "root",
ChildrenIds: []string{"test"},
Content: &model.BlockContentOfSmartblock{Smartblock: &model.BlockContentSmartblock{}},
}
simpleBlock := simple.New(block)
rootSimpleBlock := simple.New(rootBlock)
st := state.NewDoc("root", map[string]simple.Block{"test": simpleBlock, "root": rootSimpleBlock}).(*state.State)
// when
err := UpdateLinksToObjects(st, map[string]string{"key": "newKey"})
// then
assert.Nil(t, err)
assert.Equal(t, "newKey", st.Get("test").Model().GetDataview().GetViews()[0].GetSorts()[0].RelationKey)
assert.Equal(t, "key1", st.Get("test").Model().GetDataview().GetViews()[0].GetSorts()[1].RelationKey)
})
}

View file

@ -37,7 +37,7 @@ import (
var log = logging.Logger("import")
// Service incapsulate logic with creation of given smartblocks
// Service encapsulate logic with creation of given smartblocks
type Service interface {
//nolint:lll
Create(dataObject *DataObject, sn *common.Snapshot) (*types.Struct, string, error)
@ -85,7 +85,6 @@ func (oc *ObjectCreator) Create(dataObject *DataObject, sn *common.Snapshot) (*t
origin := dataObject.origin
spaceID := dataObject.spaceID
var err error
newID := oldIDtoNew[sn.Id]
if sn.SbType == coresb.SmartBlockTypeFile {
@ -98,7 +97,10 @@ func (oc *ObjectCreator) Create(dataObject *DataObject, sn *common.Snapshot) (*t
st := state.NewDocFromSnapshot(newID, sn.Snapshot, state.WithUniqueKeyMigration(sn.SbType)).(*state.State)
st.SetLocalDetail(bundle.RelationKeyLastModifiedDate.String(), pbtypes.Int64(pbtypes.GetInt64(snapshot.Details, bundle.RelationKeyLastModifiedDate.String())))
var filesToDelete []string
var (
filesToDelete []string
err error
)
defer func() {
// delete file in ipfs if there is error after creation
oc.onFinish(err, st, filesToDelete)
@ -540,9 +542,8 @@ func (oc *ObjectCreator) getExistingWidgetsTargetIDs(oldState *state.State) (map
func (oc *ObjectCreator) updateKeys(st *state.State, oldIDtoNew map[string]string) {
for key, value := range st.Details().GetFields() {
if newKey, ok := oldIDtoNew[key]; ok {
st.SetDetail(newKey, value)
st.RemoveRelation(key)
if newKey, ok := oldIDtoNew[key]; ok && newKey != key {
oc.updateDetails(st, newKey, value, key)
}
}
@ -550,3 +551,24 @@ func (oc *ObjectCreator) updateKeys(st *state.State, oldIDtoNew map[string]strin
st.SetObjectTypeKey(domain.TypeKey(newKey))
}
}
func (oc *ObjectCreator) updateDetails(st *state.State, newKey string, value *types.Value, key string) {
st.SetDetail(newKey, value)
link := oc.findRelationLinkByKey(st, key)
if link != nil {
link.Key = newKey
st.AddRelationLinks(link)
}
st.RemoveRelation(key)
}
func (oc *ObjectCreator) findRelationLinkByKey(st *state.State, key string) *model.RelationLink {
relationLinks := st.GetRelationLinks()
var link *model.RelationLink
for _, link = range relationLinks {
if link.Key == key {
break
}
}
return link
}

View file

@ -95,12 +95,16 @@ func TestObjectCreator_updateKeys(t *testing.T) {
doc.SetDetails(&types.Struct{Fields: map[string]*types.Value{
"oldKey": pbtypes.String("test"),
}})
doc.AddRelationLinks(&model.RelationLink{
Key: "oldKey",
})
// when
oc.updateKeys(doc, oldToNew)
// then
assert.Nil(t, doc.Details().GetFields()["oldKey"])
assert.Equal(t, pbtypes.String("test"), doc.Details().GetFields()["newKey"])
assert.True(t, doc.HasRelation("newKey"))
})
t.Run("updateKeys - update object type key", func(t *testing.T) {
// given
@ -128,4 +132,22 @@ func TestObjectCreator_updateKeys(t *testing.T) {
assert.Nil(t, doc.Details().GetFields()["newKey"])
assert.Equal(t, domain.TypeKey(""), doc.ObjectTypeKey())
})
t.Run("keys are the same", func(t *testing.T) {
// given
oc := ObjectCreator{}
oldToNew := map[string]string{"oldId": "newId", "key": "key"}
doc := state.NewDoc("oldId", nil).(*state.State)
doc.SetDetails(&types.Struct{Fields: map[string]*types.Value{
"key": pbtypes.String("test"),
}})
doc.AddRelationLinks(&model.RelationLink{
Key: "key",
})
// when
oc.updateKeys(doc, oldToNew)
// then
assert.Equal(t, pbtypes.String("test"), doc.Details().GetFields()["key"])
assert.True(t, doc.HasRelation("key"))
})
}

View file

@ -33,11 +33,15 @@ func newDerivedObject(existingObject *existingObject, spaceService space.Service
}
func (d *derivedObject) GetIDAndPayload(ctx context.Context, spaceID string, sn *common.Snapshot, _ time.Time, getExisting bool, _ objectorigin.ObjectOrigin) (string, treestorage.TreeStorageCreatePayload, error) {
id, payload, err := d.existingObject.GetIDAndPayload(ctx, spaceID, sn, getExisting)
id, payload, err := d.existingObject.GetIDAndPayload(ctx, spaceID, sn, true)
if err != nil {
return "", treestorage.TreeStorageCreatePayload{}, err
}
if id != "" {
d.internalKey, err = d.getInternalKey(spaceID, id)
if err != nil {
return "", treestorage.TreeStorageCreatePayload{}, err
}
return id, payload, nil
}
rawUniqueKey := pbtypes.GetString(sn.Snapshot.Data.Details, bundle.RelationKeyUniqueKey.String())
@ -96,3 +100,29 @@ func (d *derivedObject) isDeletedObject(spaceId string, uniqueKey string) bool {
})
return err == nil && len(ids) > 0
}
func (d *derivedObject) getInternalKey(spaceID, objectId string) (string, error) {
ids, err := d.objectStore.Query(database.Query{
Filters: []*model.BlockContentDataviewFilter{
{
Condition: model.BlockContentDataviewFilter_Equal,
RelationKey: bundle.RelationKeyId.String(),
Value: pbtypes.String(objectId),
},
{
Condition: model.BlockContentDataviewFilter_Equal,
RelationKey: bundle.RelationKeySpaceId.String(),
Value: pbtypes.String(spaceID),
},
},
})
if err == nil && len(ids) > 0 {
uniqueKey := pbtypes.GetString(ids[0].Details, bundle.RelationKeyUniqueKey.String())
key, err := domain.UnmarshalUniqueKey(uniqueKey)
if err != nil {
return "", nil
}
return key.InternalKey(), err
}
return "", nil
}

View file

@ -66,4 +66,42 @@ func TestDerivedObject_GetIDAndPayload(t *testing.T) {
assert.NotEqual(t, deriveObject.GetInternalKey(sn.SbType), "key")
assert.Equal(t, "newId", id)
})
t.Run("existing object", func(t *testing.T) {
// given
sf := objectstore.NewStoreFixture(t)
service := mock_space.NewMockService(t)
deriveObject := newDerivedObject(newExistingObject(sf), service, sf)
sn := &common.Snapshot{
Id: "oldId",
Snapshot: &pb.ChangeSnapshot{
Data: &model.SmartBlockSnapshotBase{
Details: &types.Struct{Fields: map[string]*types.Value{
bundle.RelationKeyName.String(): pbtypes.String("name"),
bundle.RelationKeyRelationFormat.String(): pbtypes.Int64(int64(model.RelationFormat_number)),
}},
},
},
SbType: coresb.SmartBlockTypeRelation,
}
uniqueKey, err := domain.NewUniqueKey(coresb.SmartBlockTypeRelation, "oldKey")
assert.Nil(t, err)
sf.AddObjects(t, []objectstore.TestObject{
{
bundle.RelationKeyUniqueKey: pbtypes.String(uniqueKey.Marshal()),
bundle.RelationKeyId: pbtypes.String("oldId"),
bundle.RelationKeyName: pbtypes.String("name"),
bundle.RelationKeyRelationFormat: pbtypes.Int64(int64(model.RelationFormat_number)),
bundle.RelationKeyLayout: pbtypes.Int64(int64(model.ObjectType_relation)),
bundle.RelationKeySpaceId: pbtypes.String("spaceId"),
},
})
// when
id, _, err := deriveObject.GetIDAndPayload(context.Background(), "spaceId", sn, time.Now(), false, objectorigin.Import(model.Import_Pb))
// then
assert.Nil(t, err)
assert.Equal(t, "oldId", id)
})
}

View file

@ -8,6 +8,7 @@ import (
"github.com/anyproto/anytype-heart/core/block/import/common"
"github.com/anyproto/anytype-heart/pkg/lib/bundle"
sb "github.com/anyproto/anytype-heart/pkg/lib/core/smartblock"
"github.com/anyproto/anytype-heart/pkg/lib/database"
"github.com/anyproto/anytype-heart/pkg/lib/localstore/objectstore"
"github.com/anyproto/anytype-heart/pkg/lib/pb/model"
@ -36,8 +37,13 @@ func (e *existingObject) GetIDAndPayload(_ context.Context, spaceID string, sn *
return id, treestorage.TreeStorageCreatePayload{}, nil
}
}
relationOption := e.getExistingRelationOption(sn)
return relationOption, treestorage.TreeStorageCreatePayload{}, nil
if sn.SbType == sb.SmartBlockTypeRelationOption {
return e.getExistingRelationOption(sn, spaceID), treestorage.TreeStorageCreatePayload{}, nil
}
if sn.SbType == sb.SmartBlockTypeRelation {
return e.getExistingRelation(sn, spaceID), treestorage.TreeStorageCreatePayload{}, nil
}
return "", treestorage.TreeStorageCreatePayload{}, nil
}
func (e *existingObject) getObjectByOldAnytypeID(spaceID string, sn *common.Snapshot) (string, error) {
@ -106,7 +112,7 @@ func (e *existingObject) getExistingObject(spaceID string, sn *common.Snapshot)
return ""
}
func (e *existingObject) getExistingRelationOption(snapshot *common.Snapshot) string {
func (e *existingObject) getExistingRelationOption(snapshot *common.Snapshot, spaceID string) string {
name := pbtypes.GetString(snapshot.Snapshot.Data.Details, bundle.RelationKeyName.String())
key := pbtypes.GetString(snapshot.Snapshot.Data.Details, bundle.RelationKeyRelationKey.String())
ids, _, err := e.objectStore.QueryObjectIDs(database.Query{
@ -123,8 +129,46 @@ func (e *existingObject) getExistingRelationOption(snapshot *common.Snapshot) st
},
{
Condition: model.BlockContentDataviewFilter_Equal,
RelationKey: bundle.RelationKeyType.String(),
Value: pbtypes.String(bundle.TypeKeyRelationOption.URL()),
RelationKey: bundle.RelationKeyLayout.String(),
Value: pbtypes.Int64(int64(model.ObjectType_relationOption)),
},
{
Condition: model.BlockContentDataviewFilter_Equal,
RelationKey: bundle.RelationKeySpaceId.String(),
Value: pbtypes.String(spaceID),
},
},
})
if err == nil && len(ids) > 0 {
return ids[0]
}
return ""
}
func (e *existingObject) getExistingRelation(snapshot *common.Snapshot, spaceID string) string {
name := pbtypes.GetString(snapshot.Snapshot.Data.Details, bundle.RelationKeyName.String())
format := pbtypes.GetFloat64(snapshot.Snapshot.Data.Details, bundle.RelationKeyRelationFormat.String())
ids, _, err := e.objectStore.QueryObjectIDs(database.Query{
Filters: []*model.BlockContentDataviewFilter{
{
Condition: model.BlockContentDataviewFilter_Equal,
RelationKey: bundle.RelationKeyName.String(),
Value: pbtypes.String(name),
},
{
Condition: model.BlockContentDataviewFilter_Equal,
RelationKey: bundle.RelationKeyRelationFormat.String(),
Value: pbtypes.Float64(format),
},
{
Condition: model.BlockContentDataviewFilter_Equal,
RelationKey: bundle.RelationKeyLayout.String(),
Value: pbtypes.Int64(int64(model.ObjectType_relation)),
},
{
Condition: model.BlockContentDataviewFilter_Equal,
RelationKey: bundle.RelationKeySpaceId.String(),
Value: pbtypes.String(spaceID),
},
},
})

View file

@ -111,19 +111,21 @@ func getDetailsFromCSVTable(csvTable [][]string, useFirstRowForRelations bool) (
if !useFirstRowForRelations {
relationName = getDefaultRelationName(i)
}
id := bson.NewObjectId().Hex()
key := bson.NewObjectId().Hex()
relations = append(relations, &model.Relation{
Format: model.RelationFormat_longtext,
Name: relationName,
Key: id,
Key: key,
})
details := getRelationDetails(relationName, key, float64(model.RelationFormat_longtext))
id := pbtypes.GetString(details, bundle.RelationKeyId.String())
relationsSnapshots = append(relationsSnapshots, &common.Snapshot{
Id: id,
SbType: smartblock.SmartBlockTypeRelation,
Snapshot: &pb.ChangeSnapshot{Data: &model.SmartBlockSnapshotBase{
Details: getRelationDetails(relationName, id, float64(model.RelationFormat_longtext)),
Details: details,
ObjectTypes: []string{bundle.TypeKeyRelation.String()},
Key: id,
Key: key,
}},
})
}
@ -177,7 +179,7 @@ func getRelationDetails(name, key string, format float64) *types.Struct {
details.Fields[bundle.RelationKeyName.String()] = pbtypes.String(name)
details.Fields[bundle.RelationKeyRelationKey.String()] = pbtypes.String(key)
details.Fields[bundle.RelationKeyLayout.String()] = pbtypes.Float64(float64(model.ObjectType_relation))
uniqueKey, err := domain.NewUniqueKey(smartblock.SmartBlockTypeRelationOption, key)
uniqueKey, err := domain.NewUniqueKey(smartblock.SmartBlockTypeRelation, key)
if err != nil {
log.Warnf("failed to create unique key for Notion relation: %v", err)
return details

View file

@ -24,14 +24,18 @@ import (
)
type (
CollectionService interface {
collectionService interface {
CreateCollection(details *types.Struct, flags []*model.InternalFlag) (coresb.SmartBlockType, *types.Struct, *state.State, error)
}
TemplateService interface {
templateService interface {
CreateTemplateStateWithDetails(templateId string, details *types.Struct) (st *state.State, err error)
TemplateCloneInSpace(space clientspace.Space, id string) (templateId string, err error)
}
bookmarkService interface {
CreateObjectAndFetch(ctx context.Context, spaceId string, details *types.Struct) (objectID string, newDetails *types.Struct, err error)
}
)
const CName = "objectCreator"
@ -49,16 +53,12 @@ type Service interface {
app.Component
}
type bookmarkService interface {
CreateObjectAndFetch(ctx context.Context, spaceId string, req *pb.RpcObjectCreateBookmarkRequest) (objectID string, newDetails *types.Struct, err error)
}
type service struct {
objectStore objectstore.ObjectStore
collectionService CollectionService
collectionService collectionService
bookmarkService bookmarkService
spaceService space.Service
templateService TemplateService
templateService templateService
}
func NewCreator() Service {
@ -68,9 +68,9 @@ func NewCreator() Service {
func (s *service) Init(a *app.App) (err error) {
s.objectStore = a.MustComponent(objectstore.CName).(objectstore.ObjectStore)
s.bookmarkService = app.MustComponent[bookmarkService](a)
s.collectionService = app.MustComponent[CollectionService](a)
s.collectionService = app.MustComponent[collectionService](a)
s.spaceService = app.MustComponent[space.Service](a)
s.templateService = app.MustComponent[TemplateService](a)
s.templateService = app.MustComponent[templateService](a)
return nil
}
@ -124,9 +124,7 @@ func (s *service) createObjectInSpace(
}
switch req.ObjectTypeKey {
case bundle.TypeKeyBookmark:
return s.bookmarkService.CreateObjectAndFetch(ctx, space.Id(), &pb.RpcObjectCreateBookmarkRequest{
Details: details,
})
return s.bookmarkService.CreateObjectAndFetch(ctx, space.Id(), details)
case bundle.TypeKeySet:
details.Fields[bundle.RelationKeyLayout.String()] = pbtypes.Float64(float64(model.ObjectType_set))
return s.createSet(ctx, space, &pb.RpcObjectCreateSetRequest{

View file

@ -0,0 +1,479 @@
// Code generated by mockery. DO NOT EDIT.
package mock_objectcreator
import (
context "context"
app "github.com/anyproto/any-sync/app"
clientspace "github.com/anyproto/anytype-heart/space/clientspace"
domain "github.com/anyproto/anytype-heart/core/domain"
mock "github.com/stretchr/testify/mock"
objectcreator "github.com/anyproto/anytype-heart/core/block/object/objectcreator"
state "github.com/anyproto/anytype-heart/core/block/editor/state"
types "github.com/gogo/protobuf/types"
)
// MockService is an autogenerated mock type for the Service type
type MockService struct {
mock.Mock
}
type MockService_Expecter struct {
mock *mock.Mock
}
func (_m *MockService) EXPECT() *MockService_Expecter {
return &MockService_Expecter{mock: &_m.Mock}
}
// CreateObject provides a mock function with given fields: ctx, spaceID, req
func (_m *MockService) CreateObject(ctx context.Context, spaceID string, req objectcreator.CreateObjectRequest) (string, *types.Struct, error) {
ret := _m.Called(ctx, spaceID, req)
if len(ret) == 0 {
panic("no return value specified for CreateObject")
}
var r0 string
var r1 *types.Struct
var r2 error
if rf, ok := ret.Get(0).(func(context.Context, string, objectcreator.CreateObjectRequest) (string, *types.Struct, error)); ok {
return rf(ctx, spaceID, req)
}
if rf, ok := ret.Get(0).(func(context.Context, string, objectcreator.CreateObjectRequest) string); ok {
r0 = rf(ctx, spaceID, req)
} else {
r0 = ret.Get(0).(string)
}
if rf, ok := ret.Get(1).(func(context.Context, string, objectcreator.CreateObjectRequest) *types.Struct); ok {
r1 = rf(ctx, spaceID, req)
} else {
if ret.Get(1) != nil {
r1 = ret.Get(1).(*types.Struct)
}
}
if rf, ok := ret.Get(2).(func(context.Context, string, objectcreator.CreateObjectRequest) error); ok {
r2 = rf(ctx, spaceID, req)
} else {
r2 = ret.Error(2)
}
return r0, r1, r2
}
// MockService_CreateObject_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'CreateObject'
type MockService_CreateObject_Call struct {
*mock.Call
}
// CreateObject is a helper method to define mock.On call
// - ctx context.Context
// - spaceID string
// - req objectcreator.CreateObjectRequest
func (_e *MockService_Expecter) CreateObject(ctx interface{}, spaceID interface{}, req interface{}) *MockService_CreateObject_Call {
return &MockService_CreateObject_Call{Call: _e.mock.On("CreateObject", ctx, spaceID, req)}
}
func (_c *MockService_CreateObject_Call) Run(run func(ctx context.Context, spaceID string, req objectcreator.CreateObjectRequest)) *MockService_CreateObject_Call {
_c.Call.Run(func(args mock.Arguments) {
run(args[0].(context.Context), args[1].(string), args[2].(objectcreator.CreateObjectRequest))
})
return _c
}
func (_c *MockService_CreateObject_Call) Return(id string, details *types.Struct, err error) *MockService_CreateObject_Call {
_c.Call.Return(id, details, err)
return _c
}
func (_c *MockService_CreateObject_Call) RunAndReturn(run func(context.Context, string, objectcreator.CreateObjectRequest) (string, *types.Struct, error)) *MockService_CreateObject_Call {
_c.Call.Return(run)
return _c
}
// CreateObjectUsingObjectUniqueTypeKey provides a mock function with given fields: ctx, spaceID, objectUniqueTypeKey, req
func (_m *MockService) CreateObjectUsingObjectUniqueTypeKey(ctx context.Context, spaceID string, objectUniqueTypeKey string, req objectcreator.CreateObjectRequest) (string, *types.Struct, error) {
ret := _m.Called(ctx, spaceID, objectUniqueTypeKey, req)
if len(ret) == 0 {
panic("no return value specified for CreateObjectUsingObjectUniqueTypeKey")
}
var r0 string
var r1 *types.Struct
var r2 error
if rf, ok := ret.Get(0).(func(context.Context, string, string, objectcreator.CreateObjectRequest) (string, *types.Struct, error)); ok {
return rf(ctx, spaceID, objectUniqueTypeKey, req)
}
if rf, ok := ret.Get(0).(func(context.Context, string, string, objectcreator.CreateObjectRequest) string); ok {
r0 = rf(ctx, spaceID, objectUniqueTypeKey, req)
} else {
r0 = ret.Get(0).(string)
}
if rf, ok := ret.Get(1).(func(context.Context, string, string, objectcreator.CreateObjectRequest) *types.Struct); ok {
r1 = rf(ctx, spaceID, objectUniqueTypeKey, req)
} else {
if ret.Get(1) != nil {
r1 = ret.Get(1).(*types.Struct)
}
}
if rf, ok := ret.Get(2).(func(context.Context, string, string, objectcreator.CreateObjectRequest) error); ok {
r2 = rf(ctx, spaceID, objectUniqueTypeKey, req)
} else {
r2 = ret.Error(2)
}
return r0, r1, r2
}
// MockService_CreateObjectUsingObjectUniqueTypeKey_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'CreateObjectUsingObjectUniqueTypeKey'
type MockService_CreateObjectUsingObjectUniqueTypeKey_Call struct {
*mock.Call
}
// CreateObjectUsingObjectUniqueTypeKey is a helper method to define mock.On call
// - ctx context.Context
// - spaceID string
// - objectUniqueTypeKey string
// - req objectcreator.CreateObjectRequest
func (_e *MockService_Expecter) CreateObjectUsingObjectUniqueTypeKey(ctx interface{}, spaceID interface{}, objectUniqueTypeKey interface{}, req interface{}) *MockService_CreateObjectUsingObjectUniqueTypeKey_Call {
return &MockService_CreateObjectUsingObjectUniqueTypeKey_Call{Call: _e.mock.On("CreateObjectUsingObjectUniqueTypeKey", ctx, spaceID, objectUniqueTypeKey, req)}
}
func (_c *MockService_CreateObjectUsingObjectUniqueTypeKey_Call) Run(run func(ctx context.Context, spaceID string, objectUniqueTypeKey string, req objectcreator.CreateObjectRequest)) *MockService_CreateObjectUsingObjectUniqueTypeKey_Call {
_c.Call.Run(func(args mock.Arguments) {
run(args[0].(context.Context), args[1].(string), args[2].(string), args[3].(objectcreator.CreateObjectRequest))
})
return _c
}
func (_c *MockService_CreateObjectUsingObjectUniqueTypeKey_Call) Return(id string, details *types.Struct, err error) *MockService_CreateObjectUsingObjectUniqueTypeKey_Call {
_c.Call.Return(id, details, err)
return _c
}
func (_c *MockService_CreateObjectUsingObjectUniqueTypeKey_Call) RunAndReturn(run func(context.Context, string, string, objectcreator.CreateObjectRequest) (string, *types.Struct, error)) *MockService_CreateObjectUsingObjectUniqueTypeKey_Call {
_c.Call.Return(run)
return _c
}
// CreateSmartBlockFromState provides a mock function with given fields: ctx, spaceID, objectTypeKeys, createState
func (_m *MockService) CreateSmartBlockFromState(ctx context.Context, spaceID string, objectTypeKeys []domain.TypeKey, createState *state.State) (string, *types.Struct, error) {
ret := _m.Called(ctx, spaceID, objectTypeKeys, createState)
if len(ret) == 0 {
panic("no return value specified for CreateSmartBlockFromState")
}
var r0 string
var r1 *types.Struct
var r2 error
if rf, ok := ret.Get(0).(func(context.Context, string, []domain.TypeKey, *state.State) (string, *types.Struct, error)); ok {
return rf(ctx, spaceID, objectTypeKeys, createState)
}
if rf, ok := ret.Get(0).(func(context.Context, string, []domain.TypeKey, *state.State) string); ok {
r0 = rf(ctx, spaceID, objectTypeKeys, createState)
} else {
r0 = ret.Get(0).(string)
}
if rf, ok := ret.Get(1).(func(context.Context, string, []domain.TypeKey, *state.State) *types.Struct); ok {
r1 = rf(ctx, spaceID, objectTypeKeys, createState)
} else {
if ret.Get(1) != nil {
r1 = ret.Get(1).(*types.Struct)
}
}
if rf, ok := ret.Get(2).(func(context.Context, string, []domain.TypeKey, *state.State) error); ok {
r2 = rf(ctx, spaceID, objectTypeKeys, createState)
} else {
r2 = ret.Error(2)
}
return r0, r1, r2
}
// MockService_CreateSmartBlockFromState_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'CreateSmartBlockFromState'
type MockService_CreateSmartBlockFromState_Call struct {
*mock.Call
}
// CreateSmartBlockFromState is a helper method to define mock.On call
// - ctx context.Context
// - spaceID string
// - objectTypeKeys []domain.TypeKey
// - createState *state.State
func (_e *MockService_Expecter) CreateSmartBlockFromState(ctx interface{}, spaceID interface{}, objectTypeKeys interface{}, createState interface{}) *MockService_CreateSmartBlockFromState_Call {
return &MockService_CreateSmartBlockFromState_Call{Call: _e.mock.On("CreateSmartBlockFromState", ctx, spaceID, objectTypeKeys, createState)}
}
func (_c *MockService_CreateSmartBlockFromState_Call) Run(run func(ctx context.Context, spaceID string, objectTypeKeys []domain.TypeKey, createState *state.State)) *MockService_CreateSmartBlockFromState_Call {
_c.Call.Run(func(args mock.Arguments) {
run(args[0].(context.Context), args[1].(string), args[2].([]domain.TypeKey), args[3].(*state.State))
})
return _c
}
func (_c *MockService_CreateSmartBlockFromState_Call) Return(id string, newDetails *types.Struct, err error) *MockService_CreateSmartBlockFromState_Call {
_c.Call.Return(id, newDetails, err)
return _c
}
func (_c *MockService_CreateSmartBlockFromState_Call) RunAndReturn(run func(context.Context, string, []domain.TypeKey, *state.State) (string, *types.Struct, error)) *MockService_CreateSmartBlockFromState_Call {
_c.Call.Return(run)
return _c
}
// CreateSmartBlockFromStateInSpace provides a mock function with given fields: ctx, space, objectTypeKeys, createState
func (_m *MockService) CreateSmartBlockFromStateInSpace(ctx context.Context, space clientspace.Space, objectTypeKeys []domain.TypeKey, createState *state.State) (string, *types.Struct, error) {
ret := _m.Called(ctx, space, objectTypeKeys, createState)
if len(ret) == 0 {
panic("no return value specified for CreateSmartBlockFromStateInSpace")
}
var r0 string
var r1 *types.Struct
var r2 error
if rf, ok := ret.Get(0).(func(context.Context, clientspace.Space, []domain.TypeKey, *state.State) (string, *types.Struct, error)); ok {
return rf(ctx, space, objectTypeKeys, createState)
}
if rf, ok := ret.Get(0).(func(context.Context, clientspace.Space, []domain.TypeKey, *state.State) string); ok {
r0 = rf(ctx, space, objectTypeKeys, createState)
} else {
r0 = ret.Get(0).(string)
}
if rf, ok := ret.Get(1).(func(context.Context, clientspace.Space, []domain.TypeKey, *state.State) *types.Struct); ok {
r1 = rf(ctx, space, objectTypeKeys, createState)
} else {
if ret.Get(1) != nil {
r1 = ret.Get(1).(*types.Struct)
}
}
if rf, ok := ret.Get(2).(func(context.Context, clientspace.Space, []domain.TypeKey, *state.State) error); ok {
r2 = rf(ctx, space, objectTypeKeys, createState)
} else {
r2 = ret.Error(2)
}
return r0, r1, r2
}
// MockService_CreateSmartBlockFromStateInSpace_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'CreateSmartBlockFromStateInSpace'
type MockService_CreateSmartBlockFromStateInSpace_Call struct {
*mock.Call
}
// CreateSmartBlockFromStateInSpace is a helper method to define mock.On call
// - ctx context.Context
// - space clientspace.Space
// - objectTypeKeys []domain.TypeKey
// - createState *state.State
func (_e *MockService_Expecter) CreateSmartBlockFromStateInSpace(ctx interface{}, space interface{}, objectTypeKeys interface{}, createState interface{}) *MockService_CreateSmartBlockFromStateInSpace_Call {
return &MockService_CreateSmartBlockFromStateInSpace_Call{Call: _e.mock.On("CreateSmartBlockFromStateInSpace", ctx, space, objectTypeKeys, createState)}
}
func (_c *MockService_CreateSmartBlockFromStateInSpace_Call) Run(run func(ctx context.Context, space clientspace.Space, objectTypeKeys []domain.TypeKey, createState *state.State)) *MockService_CreateSmartBlockFromStateInSpace_Call {
_c.Call.Run(func(args mock.Arguments) {
run(args[0].(context.Context), args[1].(clientspace.Space), args[2].([]domain.TypeKey), args[3].(*state.State))
})
return _c
}
func (_c *MockService_CreateSmartBlockFromStateInSpace_Call) Return(id string, newDetails *types.Struct, err error) *MockService_CreateSmartBlockFromStateInSpace_Call {
_c.Call.Return(id, newDetails, err)
return _c
}
func (_c *MockService_CreateSmartBlockFromStateInSpace_Call) RunAndReturn(run func(context.Context, clientspace.Space, []domain.TypeKey, *state.State) (string, *types.Struct, error)) *MockService_CreateSmartBlockFromStateInSpace_Call {
_c.Call.Return(run)
return _c
}
// Init provides a mock function with given fields: a
func (_m *MockService) Init(a *app.App) error {
ret := _m.Called(a)
if len(ret) == 0 {
panic("no return value specified for Init")
}
var r0 error
if rf, ok := ret.Get(0).(func(*app.App) error); ok {
r0 = rf(a)
} else {
r0 = ret.Error(0)
}
return r0
}
// MockService_Init_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Init'
type MockService_Init_Call struct {
*mock.Call
}
// Init is a helper method to define mock.On call
// - a *app.App
func (_e *MockService_Expecter) Init(a interface{}) *MockService_Init_Call {
return &MockService_Init_Call{Call: _e.mock.On("Init", a)}
}
func (_c *MockService_Init_Call) Run(run func(a *app.App)) *MockService_Init_Call {
_c.Call.Run(func(args mock.Arguments) {
run(args[0].(*app.App))
})
return _c
}
func (_c *MockService_Init_Call) Return(err error) *MockService_Init_Call {
_c.Call.Return(err)
return _c
}
func (_c *MockService_Init_Call) RunAndReturn(run func(*app.App) error) *MockService_Init_Call {
_c.Call.Return(run)
return _c
}
// InstallBundledObjects provides a mock function with given fields: ctx, space, sourceObjectIds, isNewSpace
func (_m *MockService) InstallBundledObjects(ctx context.Context, space clientspace.Space, sourceObjectIds []string, isNewSpace bool) ([]string, []*types.Struct, error) {
ret := _m.Called(ctx, space, sourceObjectIds, isNewSpace)
if len(ret) == 0 {
panic("no return value specified for InstallBundledObjects")
}
var r0 []string
var r1 []*types.Struct
var r2 error
if rf, ok := ret.Get(0).(func(context.Context, clientspace.Space, []string, bool) ([]string, []*types.Struct, error)); ok {
return rf(ctx, space, sourceObjectIds, isNewSpace)
}
if rf, ok := ret.Get(0).(func(context.Context, clientspace.Space, []string, bool) []string); ok {
r0 = rf(ctx, space, sourceObjectIds, isNewSpace)
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).([]string)
}
}
if rf, ok := ret.Get(1).(func(context.Context, clientspace.Space, []string, bool) []*types.Struct); ok {
r1 = rf(ctx, space, sourceObjectIds, isNewSpace)
} else {
if ret.Get(1) != nil {
r1 = ret.Get(1).([]*types.Struct)
}
}
if rf, ok := ret.Get(2).(func(context.Context, clientspace.Space, []string, bool) error); ok {
r2 = rf(ctx, space, sourceObjectIds, isNewSpace)
} else {
r2 = ret.Error(2)
}
return r0, r1, r2
}
// MockService_InstallBundledObjects_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'InstallBundledObjects'
type MockService_InstallBundledObjects_Call struct {
*mock.Call
}
// InstallBundledObjects is a helper method to define mock.On call
// - ctx context.Context
// - space clientspace.Space
// - sourceObjectIds []string
// - isNewSpace bool
func (_e *MockService_Expecter) InstallBundledObjects(ctx interface{}, space interface{}, sourceObjectIds interface{}, isNewSpace interface{}) *MockService_InstallBundledObjects_Call {
return &MockService_InstallBundledObjects_Call{Call: _e.mock.On("InstallBundledObjects", ctx, space, sourceObjectIds, isNewSpace)}
}
func (_c *MockService_InstallBundledObjects_Call) Run(run func(ctx context.Context, space clientspace.Space, sourceObjectIds []string, isNewSpace bool)) *MockService_InstallBundledObjects_Call {
_c.Call.Run(func(args mock.Arguments) {
run(args[0].(context.Context), args[1].(clientspace.Space), args[2].([]string), args[3].(bool))
})
return _c
}
func (_c *MockService_InstallBundledObjects_Call) Return(ids []string, objects []*types.Struct, err error) *MockService_InstallBundledObjects_Call {
_c.Call.Return(ids, objects, err)
return _c
}
func (_c *MockService_InstallBundledObjects_Call) RunAndReturn(run func(context.Context, clientspace.Space, []string, bool) ([]string, []*types.Struct, error)) *MockService_InstallBundledObjects_Call {
_c.Call.Return(run)
return _c
}
// Name provides a mock function with given fields:
func (_m *MockService) Name() string {
ret := _m.Called()
if len(ret) == 0 {
panic("no return value specified for Name")
}
var r0 string
if rf, ok := ret.Get(0).(func() string); ok {
r0 = rf()
} else {
r0 = ret.Get(0).(string)
}
return r0
}
// MockService_Name_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Name'
type MockService_Name_Call struct {
*mock.Call
}
// Name is a helper method to define mock.On call
func (_e *MockService_Expecter) Name() *MockService_Name_Call {
return &MockService_Name_Call{Call: _e.mock.On("Name")}
}
func (_c *MockService_Name_Call) Run(run func()) *MockService_Name_Call {
_c.Call.Run(func(args mock.Arguments) {
run()
})
return _c
}
func (_c *MockService_Name_Call) Return(name string) *MockService_Name_Call {
_c.Call.Return(name)
return _c
}
func (_c *MockService_Name_Call) RunAndReturn(run func() string) *MockService_Name_Call {
_c.Call.Return(run)
return _c
}
// NewMockService creates a new instance of MockService. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
// The first argument is typically a *testing.T value.
func NewMockService(t interface {
mock.TestingT
Cleanup(func())
}) *MockService {
mock := &MockService{}
mock.Mock.Test(t)
t.Cleanup(func() { mock.AssertExpectations(t) })
return mock
}

View file

@ -9,6 +9,7 @@ import (
"github.com/samber/lo"
"github.com/anyproto/anytype-heart/core/block/editor/state"
"github.com/anyproto/anytype-heart/core/block/editor/template"
"github.com/anyproto/anytype-heart/core/block/simple"
"github.com/anyproto/anytype-heart/core/domain"
"github.com/anyproto/anytype-heart/pkg/lib/bundle"
@ -30,42 +31,35 @@ type linkSource interface {
HasSmartIds() bool
}
func DependentObjectIDs(s *state.State, converter KeyToIDConverter, blocks, details, relations, objTypes, creatorModifierWorkspace bool) (ids []string) {
if blocks {
err := s.Iterate(func(b simple.Block) (isContinue bool) {
if ls, ok := b.(linkSource); ok {
ids = ls.FillSmartIds(ids)
}
return true
})
if err != nil {
log.With("objectID", s.RootId()).Errorf("failed to iterate over simple blocks: %s", err)
}
type Flags struct {
Blocks,
Details,
Relations,
Types,
Collection,
CreatorModifierWorkspace,
DataviewBlockOnlyTarget,
NoSystemRelations,
NoHiddenBundledRelations,
NoImages bool
}
func DependentObjectIDs(s *state.State, converter KeyToIDConverter, flags Flags) (ids []string) {
if flags.Blocks {
ids = collectIdsFromBlocks(s, flags)
}
if objTypes {
for _, objectTypeKey := range s.ObjectTypeKeys() {
if objectTypeKey == "" { // TODO is it possible?
log.Errorf("sb %s has empty ot", s.RootId())
continue
}
id, err := converter.GetTypeIdByKey(context.Background(), objectTypeKey)
if err != nil {
log.With("objectID", s.RootId()).Errorf("failed to get object type id by key %s: %s", objectTypeKey, err)
continue
}
ids = append(ids, id)
}
if flags.Types {
ids = append(ids, collectIdsFromTypes(s, converter)...)
}
var det *types.Struct
if details {
if flags.Details {
det = s.CombinedDetails()
}
for _, rel := range s.GetRelationLinks() {
// do not index local dates such as lastOpened/lastModified
if relations {
if flags.Relations {
id, err := converter.GetRelationIdByKey(context.Background(), domain.RelationKey(rel.Key))
if err != nil {
log.With("objectID", s.RootId()).Errorf("failed to get relation id by key %s: %s", rel.Key, err)
@ -74,65 +68,134 @@ func DependentObjectIDs(s *state.State, converter KeyToIDConverter, blocks, deta
ids = append(ids, id)
}
if !details {
if !flags.Details {
continue
}
// handle corner cases first for specific formats
if rel.Format == model.RelationFormat_date &&
!lo.Contains(bundle.LocalAndDerivedRelationKeys, rel.Key) {
relInt := pbtypes.GetInt64(det, rel.Key)
if relInt > 0 {
t := time.Unix(relInt, 0)
t = t.In(time.Local)
ids = append(ids, addr.TimeToID(t))
}
continue
}
ids = append(ids, collectIdsFromDetail(rel, det, flags)...)
}
if rel.Key == bundle.RelationKeyCreator.String() ||
rel.Key == bundle.RelationKeyLastModifiedBy.String() {
if creatorModifierWorkspace {
v := pbtypes.GetString(det, rel.Key)
ids = append(ids, v)
}
continue
}
if rel.Key == bundle.RelationKeyId.String() ||
rel.Key == bundle.RelationKeyLinks.String() ||
rel.Key == bundle.RelationKeyType.String() || // always skip type because it was proceed above
rel.Key == bundle.RelationKeyFeaturedRelations.String() {
continue
}
if rel.Key == bundle.RelationKeyCoverId.String() {
v := pbtypes.GetString(det, rel.Key)
_, err := cid.Decode(v)
if err != nil {
// this is an exception cause coverId can contains not a file hash but color
continue
}
ids = append(ids, v)
}
if rel.Format != model.RelationFormat_object &&
rel.Format != model.RelationFormat_file &&
rel.Format != model.RelationFormat_status &&
rel.Format != model.RelationFormat_tag {
continue
}
// add all object relation values as dependents
for _, targetID := range pbtypes.GetStringList(det, rel.Key) {
if targetID == "" {
continue
}
ids = append(ids, targetID)
}
if flags.Collection {
ids = append(ids, s.GetStoreSlice(template.CollectionStoreKey)...)
}
ids = lo.Uniq(ids)
return
}
func collectIdsFromBlocks(s *state.State, flags Flags) (ids []string) {
err := s.Iterate(func(b simple.Block) (isContinue bool) {
if flags.DataviewBlockOnlyTarget {
if dv := b.Model().GetDataview(); dv != nil {
if dv.TargetObjectId != "" {
ids = append(ids, dv.TargetObjectId)
}
return true
}
}
// if NoImages == false, then file block will be processed with FillSmartIds
if flags.NoImages {
if f := b.Model().GetFile(); f != nil {
if f.TargetObjectId != "" && f.Type != model.BlockContentFile_Image {
ids = append(ids, f.TargetObjectId)
}
return true
}
}
if ls, ok := b.(linkSource); ok {
ids = ls.FillSmartIds(ids)
}
return true
})
if err != nil {
log.With("objectID", s.RootId()).Errorf("failed to iterate over simple blocks: %s", err)
}
return ids
}
func collectIdsFromTypes(s *state.State, converter KeyToIDConverter) (ids []string) {
for _, objectTypeKey := range s.ObjectTypeKeys() {
if objectTypeKey == "" { // TODO is it possible?
log.Errorf("sb %s has empty ot", s.RootId())
continue
}
id, err := converter.GetTypeIdByKey(context.Background(), objectTypeKey)
if err != nil {
log.With("objectID", s.RootId()).Errorf("failed to get object type id by key %s: %s", objectTypeKey, err)
continue
}
ids = append(ids, id)
}
return ids
}
func collectIdsFromDetail(rel *model.RelationLink, det *types.Struct, flags Flags) (ids []string) {
if flags.NoSystemRelations {
if rel.Format != model.RelationFormat_object || bundle.IsSystemRelation(domain.RelationKey(rel.Key)) {
return
}
}
if flags.NoHiddenBundledRelations {
// Only bundled relations can be hidden, so we don't need to request relations from object store.
if r, err := bundle.GetRelation(domain.RelationKey(rel.Key)); err == nil && r.Hidden {
return
}
}
// handle corner cases first for specific formats
if rel.Format == model.RelationFormat_date &&
!lo.Contains(bundle.LocalAndDerivedRelationKeys, rel.Key) {
relInt := pbtypes.GetInt64(det, rel.Key)
if relInt > 0 {
t := time.Unix(relInt, 0)
t = t.In(time.Local)
ids = append(ids, addr.TimeToID(t))
}
return
}
if rel.Key == bundle.RelationKeyCreator.String() ||
rel.Key == bundle.RelationKeyLastModifiedBy.String() {
if flags.CreatorModifierWorkspace {
v := pbtypes.GetString(det, rel.Key)
ids = append(ids, v)
}
return
}
if rel.Key == bundle.RelationKeyId.String() ||
rel.Key == bundle.RelationKeyLinks.String() ||
rel.Key == bundle.RelationKeyType.String() || // always skip type because it was processed before
rel.Key == bundle.RelationKeyFeaturedRelations.String() {
return
}
if rel.Key == bundle.RelationKeyCoverId.String() {
v := pbtypes.GetString(det, rel.Key)
_, err := cid.Decode(v)
if err != nil {
// this is an exception cause coverId can contain not a file hash but color
return
}
ids = append(ids, v)
}
if rel.Format != model.RelationFormat_object &&
rel.Format != model.RelationFormat_file &&
rel.Format != model.RelationFormat_status &&
rel.Format != model.RelationFormat_tag {
return
}
// add all object relation values as dependents
for _, targetID := range pbtypes.GetStringList(det, rel.Key) {
if targetID != "" {
ids = append(ids, targetID)
}
}
return ids
}

View file

@ -76,13 +76,13 @@ func TestState_DepSmartIdsLinks(t *testing.T) {
}).(*state.State)
converter := &fakeConverter{}
t.Run("all options are turned off", func(t *testing.T) {
objectIDs := DependentObjectIDs(stateWithLinks, converter, true, false, false, false, false)
t.Run("block option is turned on: get ids from blocks", func(t *testing.T) {
objectIDs := DependentObjectIDs(stateWithLinks, converter, Flags{Blocks: true})
assert.Len(t, objectIDs, 4)
})
t.Run("block option is turned on: get ids from blocks", func(t *testing.T) {
objectIDs := DependentObjectIDs(stateWithLinks, converter, false, false, false, false, false)
t.Run("all options are turned off", func(t *testing.T) {
objectIDs := DependentObjectIDs(stateWithLinks, converter, Flags{})
assert.Len(t, objectIDs, 0)
})
}
@ -92,7 +92,7 @@ func TestState_DepSmartIdsLinksAndRelations(t *testing.T) {
stateWithLinks := state.NewDoc("root", map[string]simple.Block{
"root": simple.New(&model.Block{
Id: "root",
ChildrenIds: []string{"childBlock", "childBlock2", "childBlock3"},
ChildrenIds: []string{"childBlock", "childBlock2", "childBlock3", "dataview", "image", "song"},
}),
"childBlock": simple.New(&model.Block{Id: "childBlock",
Content: &model.BlockContentOfText{
@ -129,6 +129,31 @@ func TestState_DepSmartIdsLinksAndRelations(t *testing.T) {
TargetBlockId: "objectID4",
},
}}),
"dataview": simple.New(&model.Block{Id: "dataview",
Content: &model.BlockContentOfDataview{
Dataview: &model.BlockContentDataview{
Views: []*model.BlockContentDataviewView{{
Id: "Today's tasks",
DefaultObjectTypeId: "task",
DefaultTemplateId: "Task with a picture",
}},
TargetObjectId: "taskTracker",
},
}}),
"image": simple.New(&model.Block{Id: "image",
Content: &model.BlockContentOfFile{
File: &model.BlockContentFile{
TargetObjectId: "image with cute kitten",
Type: model.BlockContentFile_Image,
},
}}),
"song": simple.New(&model.Block{Id: "song",
Content: &model.BlockContentOfFile{
File: &model.BlockContentFile{
TargetObjectId: "Let it be",
Type: model.BlockContentFile_Audio,
},
}}),
}).(*state.State)
converter := &fakeConverter{}
@ -153,13 +178,23 @@ func TestState_DepSmartIdsLinksAndRelations(t *testing.T) {
stateWithLinks.AddRelationLinks(relations...)
t.Run("blocks option is turned on: get ids from blocks", func(t *testing.T) {
objectIDs := DependentObjectIDs(stateWithLinks, converter, true, false, false, false, false)
assert.Len(t, objectIDs, 4)
objectIDs := DependentObjectIDs(stateWithLinks, converter, Flags{Blocks: true})
assert.Len(t, objectIDs, 9)
})
t.Run("dataview only target option is turned on: get only target from blocks", func(t *testing.T) {
objectIDs := DependentObjectIDs(stateWithLinks, converter, Flags{Blocks: true, DataviewBlockOnlyTarget: true})
assert.Len(t, objectIDs, 7)
})
t.Run("no images option is turned on: get ids from blocks except images", func(t *testing.T) {
objectIDs := DependentObjectIDs(stateWithLinks, converter, Flags{Blocks: true, NoImages: true})
assert.Len(t, objectIDs, 8)
})
t.Run("blocks option and relations options are turned on: get ids from blocks and relations", func(t *testing.T) {
objectIDs := DependentObjectIDs(stateWithLinks, converter, true, false, true, false, false)
assert.Len(t, objectIDs, 8) // 4 links + 4 relations
objectIDs := DependentObjectIDs(stateWithLinks, converter, Flags{Blocks: true, Relations: true})
assert.Len(t, objectIDs, 13) // 9 links + 4 relations
})
}
@ -238,15 +273,15 @@ func TestState_DepSmartIdsLinksDetailsAndRelations(t *testing.T) {
stateWithLinks.SetDetail("relation5", pbtypes.Int64(time.Now().Unix()))
t.Run("blocks option is turned on: get ids from blocks", func(t *testing.T) {
objectIDs := DependentObjectIDs(stateWithLinks, converter, true, false, false, false, false)
objectIDs := DependentObjectIDs(stateWithLinks, converter, Flags{Blocks: true})
assert.Len(t, objectIDs, 4) // links
})
t.Run("blocks option and relations option are turned on: get ids from blocks and relations", func(t *testing.T) {
objectIDs := DependentObjectIDs(stateWithLinks, converter, true, false, true, false, false)
objectIDs := DependentObjectIDs(stateWithLinks, converter, Flags{Blocks: true, Relations: true})
assert.Len(t, objectIDs, 9) // 4 links + 5 relations
})
t.Run("blocks, relations and details option are turned on: get ids from blocks, relations and details", func(t *testing.T) {
objectIDs := DependentObjectIDs(stateWithLinks, converter, true, true, true, false, false)
objectIDs := DependentObjectIDs(stateWithLinks, converter, Flags{Blocks: true, Relations: true, Details: true})
assert.Len(t, objectIDs, 14) // 4 links + 5 relations + 3 options + 1 fileID + 1 date
})
}
@ -280,12 +315,12 @@ func TestState_DepSmartIdsLinksCreatorModifierWorkspace(t *testing.T) {
converter := &fakeConverter{}
t.Run("details option is turned on: get ids only from details", func(t *testing.T) {
objectIDs := DependentObjectIDs(stateWithLinks, converter, false, true, false, false, true)
objectIDs := DependentObjectIDs(stateWithLinks, converter, Flags{Details: true, CreatorModifierWorkspace: true})
assert.Len(t, objectIDs, 3) // creator + lastModifiedBy + 1 date
})
t.Run("details and relations options are turned on: get ids from details and relations", func(t *testing.T) {
objectIDs := DependentObjectIDs(stateWithLinks, converter, false, true, true, false, true)
objectIDs := DependentObjectIDs(stateWithLinks, converter, Flags{Details: true, Relations: true, CreatorModifierWorkspace: true})
assert.Len(t, objectIDs, 7) // 4 relations + creator + lastModifiedBy + 1 date
})
}
@ -297,11 +332,11 @@ func TestState_DepSmartIdsObjectTypes(t *testing.T) {
converter := &fakeConverter{}
t.Run("all options are turned off", func(t *testing.T) {
objectIDs := DependentObjectIDs(stateWithLinks, converter, false, false, false, false, false)
objectIDs := DependentObjectIDs(stateWithLinks, converter, Flags{})
assert.Len(t, objectIDs, 0)
})
t.Run("objTypes option is turned on, get only object types id", func(t *testing.T) {
objectIDs := DependentObjectIDs(stateWithLinks, converter, false, false, false, true, false)
objectIDs := DependentObjectIDs(stateWithLinks, converter, Flags{Types: true})
assert.Equal(t, []string{
fakeDerivedID(bundle.TypeKeyPage.String()),
}, objectIDs)

View file

@ -152,9 +152,10 @@ func (t *treeSyncer) ShouldSync(peerId string) bool {
return t.isSyncing
}
func (t *treeSyncer) SyncAll(ctx context.Context, peerId string, existing, missing []string) (err error) {
func (t *treeSyncer) SyncAll(ctx context.Context, p peer.Peer, existing, missing []string) (err error) {
t.Lock()
defer t.Unlock()
peerId := p.Id()
isResponsible := slices.Contains(t.nodeConf.NodeIds(t.spaceId), peerId)
t.sendSyncEvents(existing, missing, isResponsible)
reqExec, exists := t.requestPools[peerId]
@ -176,7 +177,7 @@ func (t *treeSyncer) SyncAll(ctx context.Context, peerId string, existing, missi
for _, id := range existing {
idCopy := id
err = headExec.tryAdd(idCopy, func() {
t.updateTree(peerId, idCopy)
t.updateTree(p, idCopy)
})
if err != nil {
log.Error("failed to add to head queue", zap.Error(err))
@ -219,7 +220,8 @@ func (t *treeSyncer) requestTree(peerId, id string) {
}
}
func (t *treeSyncer) updateTree(peerId, id string) {
func (t *treeSyncer) updateTree(p peer.Peer, id string) {
peerId := p.Id()
log := log.With(zap.String("treeId", id), zap.String("spaceId", t.spaceId))
ctx := peer.CtxWithPeerId(t.mainCtx, peerId)
tr, err := t.treeManager.GetTree(ctx, t.spaceId, id)
@ -232,7 +234,7 @@ func (t *treeSyncer) updateTree(peerId, id string) {
log.Warn("not a sync tree")
return
}
if err = syncTree.SyncWithPeer(ctx, peerId); err != nil {
if err = syncTree.SyncWithPeer(ctx, p); err != nil {
log.Warn("synctree.SyncWithPeer error", zap.Error(err))
} else {
log.Debug("success synctree.SyncWithPeer")

View file

@ -11,6 +11,7 @@ import (
"github.com/anyproto/any-sync/commonspace/object/tree/objecttree/mock_objecttree"
"github.com/anyproto/any-sync/commonspace/object/tree/synctree/mock_synctree"
"github.com/anyproto/any-sync/commonspace/object/treemanager/mock_treemanager"
"github.com/anyproto/any-sync/net/rpc/rpctest"
"github.com/anyproto/any-sync/nodeconf/mock_nodeconf"
"github.com/stretchr/testify/require"
"go.uber.org/mock/gomock"
@ -66,16 +67,17 @@ func TestTreeSyncer(t *testing.T) {
peerId := "peerId"
existingId := "existing"
missingId := "missing"
pr := rpctest.MockPeer{}
t.Run("delayed sync", func(t *testing.T) {
ctx := context.Background()
fx := newFixture(t, spaceId)
fx.treeManager.EXPECT().GetTree(gomock.Any(), spaceId, existingId).Return(fx.existingMock, nil)
fx.existingMock.EXPECT().SyncWithPeer(gomock.Any(), peerId).Return(nil)
fx.existingMock.EXPECT().SyncWithPeer(gomock.Any(), pr).Return(nil)
fx.treeManager.EXPECT().GetTree(gomock.Any(), spaceId, missingId).Return(fx.missingMock, nil)
fx.nodeConf.EXPECT().NodeIds(spaceId).Return([]string{})
fx.syncStatus.EXPECT().RemoveAllExcept(peerId, []string{existingId}).Return()
err := fx.SyncAll(context.Background(), peerId, []string{existingId}, []string{missingId})
err := fx.SyncAll(context.Background(), pr, []string{existingId}, []string{missingId})
require.NoError(t, err)
require.NotNil(t, fx.requestPools[peerId])
require.NotNil(t, fx.headPools[peerId])
@ -89,12 +91,12 @@ func TestTreeSyncer(t *testing.T) {
ctx := context.Background()
fx := newFixture(t, spaceId)
fx.treeManager.EXPECT().GetTree(gomock.Any(), spaceId, existingId).Return(fx.existingMock, nil)
fx.existingMock.EXPECT().SyncWithPeer(gomock.Any(), peerId).Return(nil)
fx.existingMock.EXPECT().SyncWithPeer(gomock.Any(), pr).Return(nil)
fx.treeManager.EXPECT().GetTree(gomock.Any(), spaceId, missingId).Return(fx.missingMock, nil)
fx.nodeConf.EXPECT().NodeIds(spaceId).Return([]string{peerId})
fx.syncDetailsUpdater.EXPECT().UpdateSpaceDetails([]string{existingId}, []string{missingId}, spaceId)
fx.syncStatus.EXPECT().RemoveAllExcept(peerId, []string{existingId}).Return()
err := fx.SyncAll(context.Background(), peerId, []string{existingId}, []string{missingId})
err := fx.SyncAll(context.Background(), pr, []string{existingId}, []string{missingId})
require.NoError(t, err)
require.NotNil(t, fx.requestPools[peerId])
require.NotNil(t, fx.headPools[peerId])
@ -108,13 +110,13 @@ func TestTreeSyncer(t *testing.T) {
ctx := context.Background()
fx := newFixture(t, spaceId)
fx.treeManager.EXPECT().GetTree(gomock.Any(), spaceId, existingId).Return(fx.existingMock, nil)
fx.existingMock.EXPECT().SyncWithPeer(gomock.Any(), peerId).Return(nil)
fx.existingMock.EXPECT().SyncWithPeer(gomock.Any(), pr).Return(nil)
fx.treeManager.EXPECT().GetTree(gomock.Any(), spaceId, missingId).Return(fx.missingMock, nil)
fx.nodeConf.EXPECT().NodeIds(spaceId).Return([]string{})
fx.syncStatus.EXPECT().RemoveAllExcept(peerId, []string{existingId}).Return()
fx.StartSync()
err := fx.SyncAll(context.Background(), peerId, []string{existingId}, []string{missingId})
err := fx.SyncAll(context.Background(), pr, []string{existingId}, []string{missingId})
require.NoError(t, err)
require.NotNil(t, fx.requestPools[peerId])
require.NotNil(t, fx.headPools[peerId])
@ -127,13 +129,13 @@ func TestTreeSyncer(t *testing.T) {
ctx := context.Background()
fx := newFixture(t, spaceId)
fx.treeManager.EXPECT().GetTree(gomock.Any(), spaceId, existingId).Return(fx.existingMock, nil)
fx.existingMock.EXPECT().SyncWithPeer(gomock.Any(), peerId).Return(nil)
fx.existingMock.EXPECT().SyncWithPeer(gomock.Any(), pr).Return(nil)
fx.treeManager.EXPECT().GetTree(gomock.Any(), spaceId, missingId).Return(fx.missingMock, nil)
fx.nodeConf.EXPECT().NodeIds(spaceId).Return([]string{})
fx.syncStatus.EXPECT().RemoveAllExcept(peerId, []string{existingId, existingId}).Return()
fx.StartSync()
err := fx.SyncAll(context.Background(), peerId, []string{existingId, existingId}, []string{missingId, missingId, missingId})
err := fx.SyncAll(context.Background(), pr, []string{existingId, existingId}, []string{missingId, missingId, missingId})
require.NoError(t, err)
require.NotNil(t, fx.requestPools[peerId])
require.NotNil(t, fx.headPools[peerId])
@ -147,7 +149,7 @@ func TestTreeSyncer(t *testing.T) {
ch := make(chan struct{}, 2)
fx := newFixture(t, spaceId)
fx.treeManager.EXPECT().GetTree(gomock.Any(), spaceId, existingId).Return(fx.existingMock, nil)
fx.existingMock.EXPECT().SyncWithPeer(gomock.Any(), peerId).Return(nil)
fx.existingMock.EXPECT().SyncWithPeer(gomock.Any(), pr).Return(nil)
fx.treeManager.EXPECT().GetTree(gomock.Any(), spaceId, missingId+"1").DoAndReturn(func(ctx context.Context, spaceId, treeId string) (objecttree.ObjectTree, error) {
<-ch
return fx.missingMock, nil
@ -160,7 +162,7 @@ func TestTreeSyncer(t *testing.T) {
fx.syncStatus.EXPECT().RemoveAllExcept(peerId, []string{existingId}).Return()
fx.StartSync()
err := fx.SyncAll(context.Background(), peerId, []string{existingId}, []string{missingId + "1", missingId + "2"})
err := fx.SyncAll(context.Background(), pr, []string{existingId}, []string{missingId + "1", missingId + "2"})
require.NoError(t, err)
require.NotNil(t, fx.requestPools[peerId])
require.NotNil(t, fx.headPools[peerId])
@ -188,7 +190,7 @@ func TestTreeSyncer(t *testing.T) {
fx.syncStatus.EXPECT().RemoveAllExcept(peerId, existing).Return()
fx.StartSync()
err := fx.SyncAll(context.Background(), peerId, existing, []string{missingId})
err := fx.SyncAll(context.Background(), pr, existing, []string{missingId})
require.NoError(t, err)
require.NotNil(t, fx.requestPools[peerId])
require.NotNil(t, fx.headPools[peerId])

View file

@ -40,12 +40,12 @@ type accountService interface {
type Space interface {
Id() string
IsPersonal() bool
TreeBuilder() objecttreebuilder.TreeBuilder
GetRelationIdByKey(ctx context.Context, key domain.RelationKey) (id string, err error)
GetTypeIdByKey(ctx context.Context, key domain.TypeKey) (id string, err error)
DeriveObjectID(ctx context.Context, uniqueKey domain.UniqueKey) (id string, err error)
StoredIds() []string
IsPersonal() bool
}
type Service interface {

View file

@ -117,7 +117,12 @@ func (d *dot) Add(space smartblock.Space, st *state.State) error {
// TODO: add relations
dependentObjectIDs := objectlink.DependentObjectIDs(st, space, true, true, false, false, false)
dependentObjectIDs := objectlink.DependentObjectIDs(st, space, objectlink.Flags{
Blocks: true,
Details: true,
Relations: false,
Types: false,
})
for _, depID := range dependentObjectIDs {
t, err := d.sbtProvider.Type(st.SpaceID(), depID)
if err != nil {

View file

@ -93,7 +93,12 @@ func (g *graphjson) Add(space smartblock.Space, st *state.State) error {
g.nodes[st.RootId()] = &n
// TODO: add relations
dependentObjectIDs := objectlink.DependentObjectIDs(st, space, true, true, false, false, false)
dependentObjectIDs := objectlink.DependentObjectIDs(st, space, objectlink.Flags{
Blocks: true,
Details: true,
Relations: false,
Types: false,
})
for _, depID := range dependentObjectIDs {
t, err := g.sbtProvider.Type(st.SpaceID(), depID)
if err != nil {

View file

@ -165,7 +165,7 @@ func (d *debug) TreeHeads(ctx context.Context, id string) (info TreeInfo, err er
if err != nil {
return
}
tree, err := spc.TreeBuilder().BuildHistoryTree(ctx, id, objecttreebuilder.HistoryTreeOpts{})
tree, err := spc.TreeBuilder().BuildHistoryTree(ctx, id, objecttreebuilder.HistoryTreeOpts{Heads: []string{""}})
if err != nil {
return
}
@ -187,7 +187,7 @@ func (d *debug) DumpTree(ctx context.Context, objectID string, path string, anon
if err != nil {
return
}
tree, err := spc.TreeBuilder().BuildHistoryTree(ctx, objectID, objecttreebuilder.HistoryTreeOpts{BuildFullTree: true})
tree, err := spc.TreeBuilder().BuildHistoryTree(ctx, objectID, objecttreebuilder.HistoryTreeOpts{})
if err != nil {
return
}

View file

@ -88,12 +88,15 @@ func (t *treeImporter) Import(fullTree bool, beforeId string) (err error) {
if err != nil {
return
}
var heads []string
if !fullTree {
heads = []string{beforeId}
}
t.objectTree, err = objecttree.BuildNonVerifiableHistoryTree(objecttree.HistoryTreeParams{
TreeStorage: t.treeStorage,
AclList: aclList,
BeforeId: beforeId,
Heads: heads,
IncludeBeforeId: true,
BuildFullTree: fullTree,
})
return

View file

@ -24,6 +24,7 @@ import (
"github.com/anyproto/anytype-heart/core/files"
"github.com/anyproto/anytype-heart/core/files/fileoffloader"
"github.com/anyproto/anytype-heart/core/filestorage/filesync"
"github.com/anyproto/anytype-heart/core/session"
"github.com/anyproto/anytype-heart/core/syncstatus/filesyncstatus"
"github.com/anyproto/anytype-heart/pb"
"github.com/anyproto/anytype-heart/pkg/lib/bundle"
@ -81,6 +82,7 @@ type service struct {
objectStore objectstore.ObjectStore
spaceIdResolver idresolver.Resolver
migrationQueue *persistentqueue.Queue[*migrationItem]
objectArchiver objectArchiver
indexer *indexer
@ -120,6 +122,7 @@ func (s *service) Init(a *app.App) error {
s.fileStore = app.MustComponent[filestore.FileStore](a)
s.spaceIdResolver = app.MustComponent[idresolver.Resolver](a)
s.fileOffloader = app.MustComponent[fileoffloader.Service](a)
s.objectArchiver = app.MustComponent[objectArchiver](a)
cfg := app.MustComponent[configProvider](a)
s.indexer = s.newIndexer()
@ -148,7 +151,11 @@ func (s *service) Run(_ context.Context) error {
go func() {
defer s.closeWg.Done()
err := s.ensureNotSyncedFilesAddedToQueue()
err := s.deleteMigratedFilesInNonPersonalSpaces(context.Background())
if err != nil {
log.Errorf("delete migrated files in non personal spaces: %v", err)
}
err = s.ensureNotSyncedFilesAddedToQueue()
if err != nil {
log.Errorf("ensure not synced files added to queue: %v", err)
}
@ -158,6 +165,49 @@ func (s *service) Run(_ context.Context) error {
return nil
}
type objectArchiver interface {
SetPagesIsArchived(ctx session.Context, req pb.RpcObjectListSetIsArchivedRequest) error
}
func (s *service) deleteMigratedFilesInNonPersonalSpaces(ctx context.Context) error {
personalSpace, err := s.spaceService.GetPersonalSpace(ctx)
if err != nil {
return err
}
objectIds, _, err := s.objectStore.QueryObjectIDs(database.Query{
Filters: []*model.BlockContentDataviewFilter{
{
RelationKey: bundle.RelationKeyFileId.String(),
Condition: model.BlockContentDataviewFilter_NotEmpty,
},
{
RelationKey: bundle.RelationKeyUniqueKey.String(),
Condition: model.BlockContentDataviewFilter_NotEmpty,
},
{
RelationKey: bundle.RelationKeySpaceId.String(),
Condition: model.BlockContentDataviewFilter_NotEqual,
Value: pbtypes.String(personalSpace.Id()),
},
},
})
if err != nil {
return err
}
if len(objectIds) > 0 {
err = s.objectArchiver.SetPagesIsArchived(nil, pb.RpcObjectListSetIsArchivedRequest{
ObjectIds: objectIds,
IsArchived: true,
})
if err != nil {
return err
}
}
return nil
}
// After migrating to new sync queue we need to ensure that all not synced files are added to the queue
func (s *service) ensureNotSyncedFilesAddedToQueue() error {
records, err := s.objectStore.Query(database.Query{

View file

@ -29,6 +29,7 @@ import (
"github.com/anyproto/anytype-heart/core/filestorage"
"github.com/anyproto/anytype-heart/core/filestorage/filesync"
"github.com/anyproto/anytype-heart/core/filestorage/rpcstore"
"github.com/anyproto/anytype-heart/core/session"
wallet2 "github.com/anyproto/anytype-heart/core/wallet"
"github.com/anyproto/anytype-heart/core/wallet/mock_wallet"
"github.com/anyproto/anytype-heart/pb"
@ -68,6 +69,16 @@ func (c *dummyConfig) Name() string {
return "dummyConfig"
}
type dummyObjectArchiver struct{}
func (a *dummyObjectArchiver) SetPagesIsArchived(ctx session.Context, req pb.RpcObjectListSetIsArchivedRequest) error {
return nil
}
func (a *dummyObjectArchiver) Name() string { return "dummyObjectArchiver" }
func (a *dummyObjectArchiver) Init(_ *app.App) error { return nil }
const testResolveRetryDelay = 5 * time.Millisecond
func newFixture(t *testing.T) *fixture {
@ -85,6 +96,7 @@ func newFixture(t *testing.T) *fixture {
eventSender.EXPECT().Broadcast(mock.Anything).Return().Maybe()
fileService := files.New()
spaceService := mock_space.NewMockService(t)
spaceService.EXPECT().GetPersonalSpace(mock.Anything).Return(nil, fmt.Errorf("not needed")).Maybe()
spaceIdResolver := mock_idresolver.NewMockResolver(t)
svc := New(testResolveRetryDelay, testResolveRetryDelay)
@ -114,6 +126,7 @@ func newFixture(t *testing.T) *fixture {
a.Register(testutil.PrepareMock(ctx, a, mock_accountservice.NewMockService(ctrl)))
a.Register(testutil.PrepareMock(ctx, a, wallet))
a.Register(&config.Config{DisableFileConfig: true, NetworkMode: pb.RpcAccount_DefaultConfig, PeferYamuxTransport: true})
a.Register(&dummyObjectArchiver{})
err = a.Start(ctx)
require.NoError(t, err)

View file

@ -2,8 +2,11 @@ package history
import (
"context"
"encoding/hex"
"fmt"
"slices"
"strings"
"sync"
"time"
"github.com/anyproto/any-sync/app"
@ -11,6 +14,7 @@ import (
"github.com/anyproto/any-sync/commonspace/objecttreebuilder"
"github.com/gogo/protobuf/proto"
"github.com/samber/lo"
"github.com/zeebo/blake3"
"github.com/anyproto/anytype-heart/core/block/cache"
smartblock2 "github.com/anyproto/anytype-heart/core/block/editor/smartblock"
@ -37,8 +41,14 @@ const versionGroupInterval = time.Minute * 5
var log = logging.Logger("anytype-mw-history")
var hashersPool = &sync.Pool{
New: func() any {
return blake3.New()
},
}
func New() History {
return new(history)
return &history{heads: make(map[string]string, 0)}
}
type History interface {
@ -54,6 +64,7 @@ type history struct {
picker cache.ObjectGetter
objectStore objectstore.ObjectStore
spaceService space.Service
heads map[string]string
}
func (h *history) Init(a *app.App) (err error) {
@ -84,7 +95,12 @@ func (h *history) Show(id domain.FullID, versionID string) (bs *model.ObjectView
}
s.SetDetailAndBundledRelation(bundle.RelationKeyType, pbtypes.String(typeId))
dependentObjectIDs := objectlink.DependentObjectIDs(s, space, true, true, false, true, false)
dependentObjectIDs := objectlink.DependentObjectIDs(s, space, objectlink.Flags{
Blocks: true,
Details: true,
Relations: false,
Types: true,
})
// nolint:errcheck
meta, _ := h.objectStore.QueryByID(dependentObjectIDs)
@ -116,6 +132,8 @@ func (h *history) Show(id domain.FullID, versionID string) (bs *model.ObjectView
}
func (h *history) Versions(id domain.FullID, lastVersionId string, limit int) (resp []*pb.RpcHistoryVersion, err error) {
hasher := hashersPool.Get().(*blake3.Hasher)
defer hashersPool.Put(hasher)
if limit <= 0 {
limit = 100
}
@ -129,6 +147,7 @@ func (h *history) Versions(id domain.FullID, lastVersionId string, limit int) (r
}
for len(resp) < limit {
curHeads := make(map[string]struct{})
tree, _, e := h.treeWithId(id, lastVersionId, includeLastId)
if e != nil {
return nil, e
@ -137,12 +156,7 @@ func (h *history) Versions(id domain.FullID, lastVersionId string, limit int) (r
e = tree.IterateFrom(tree.Root().Id, source.UnmarshalChange, func(c *objecttree.Change) (isContinue bool) {
participantId := domain.NewParticipantId(id.SpaceID, c.Identity.Account())
data = append(data, &pb.RpcHistoryVersion{
Id: c.Id,
PreviousIds: c.PreviousIds,
AuthorId: participantId,
Time: c.Timestamp,
})
data = h.fillVersionData(c, curHeads, participantId, data, hasher)
return true
})
if e != nil {
@ -183,6 +197,40 @@ func (h *history) Versions(id domain.FullID, lastVersionId string, limit int) (r
return
}
func (h *history) retrieveHeads(versionId string) []string {
if heads, ok := h.heads[versionId]; ok {
return strings.Split(heads, " ")
}
return []string{versionId}
}
func (h *history) fillVersionData(change *objecttree.Change, curHeads map[string]struct{}, participantId string, data []*pb.RpcHistoryVersion, hasher *blake3.Hasher) []*pb.RpcHistoryVersion {
curHeads[change.Id] = struct{}{}
for _, previousId := range change.PreviousIds {
delete(curHeads, previousId)
}
version := &pb.RpcHistoryVersion{
Id: change.Id,
PreviousIds: change.PreviousIds,
AuthorId: participantId,
Time: change.Timestamp,
}
if len(curHeads) > 1 {
var combinedHeads string
for head := range curHeads {
combinedHeads += head + " "
}
combinedHeads = strings.TrimSpace(combinedHeads)
hasher.Reset()
// nolint: errcheck
hasher.Write([]byte(combinedHeads)) // it never returns an error
hashSum := hex.EncodeToString(hasher.Sum(nil))
h.heads[hashSum] = combinedHeads
version.Id = hashSum
}
return append(data, version)
}
func (h *history) DiffVersions(req *pb.RpcHistoryDiffVersionsRequest) ([]*pb.EventMessage, *model.ObjectView, error) {
id := domain.FullID{
ObjectID: req.ObjectId,
@ -209,7 +257,12 @@ func (h *history) DiffVersions(req *pb.RpcHistoryDiffVersionsRequest) ([]*pb.Eve
if err != nil {
return nil, nil, fmt.Errorf("get space: %w", err)
}
dependentObjectIDs := objectlink.DependentObjectIDs(currState, spc, true, true, false, true, false)
dependentObjectIDs := objectlink.DependentObjectIDs(currState, spc, objectlink.Flags{
Blocks: true,
Details: true,
Relations: false,
Types: true,
})
meta, err := h.objectStore.QueryByID(dependentObjectIDs)
if err != nil {
return nil, nil, fmt.Errorf("get dependencies: %w", err)
@ -458,14 +511,15 @@ func (h *history) SetVersion(id domain.FullID, versionId string) (err error) {
})
}
func (h *history) treeWithId(id domain.FullID, beforeId string, includeBeforeId bool) (ht objecttree.HistoryTree, sbt smartblock.SmartBlockType, err error) {
func (h *history) treeWithId(id domain.FullID, versionId string, includeBeforeId bool) (ht objecttree.HistoryTree, sbt smartblock.SmartBlockType, err error) {
heads := h.retrieveHeads(versionId)
spc, err := h.spaceService.Get(context.Background(), id.SpaceID)
if err != nil {
return
}
ht, err = spc.TreeBuilder().BuildHistoryTree(context.Background(), id.ObjectID, objecttreebuilder.HistoryTreeOpts{
BeforeId: beforeId,
Include: includeBeforeId,
Heads: heads,
Include: includeBeforeId,
})
if err != nil {
return

View file

@ -990,6 +990,111 @@ func TestHistory_Versions(t *testing.T) {
assert.Nil(t, err)
assert.Len(t, resp, 0)
})
t.Run("changes from parallel editing", func(t *testing.T) {
// given
objectId := "objectId"
spaceID := "spaceID"
versionId := "versionId"
accountKeys, _ := accountdata.NewRandom()
account := accountKeys.SignKey.GetPublic()
ch := &objecttree.Change{
Id: "id",
PreviousIds: []string{"id2"},
Identity: account,
Model: &pb.Change{
Content: []*pb.ChangeContent{
{
Value: &pb.ChangeContentValueOfBlockUpdate{
BlockUpdate: &pb.ChangeBlockUpdate{
Events: []*pb.EventMessage{
{
Value: &pb.EventMessageValueOfBlockSetText{
BlockSetText: &pb.EventBlockSetText{
Id: "blockId",
Text: &pb.EventBlockSetTextText{
Value: "new text",
},
},
},
},
},
},
},
},
},
},
}
ch1 := &objecttree.Change{
Identity: account,
Id: "id1",
PreviousIds: []string{"id2"},
Model: &pb.Change{
Content: []*pb.ChangeContent{
{
Value: &pb.ChangeContentValueOfBlockUpdate{
BlockUpdate: &pb.ChangeBlockUpdate{
Events: []*pb.EventMessage{
{
Value: &pb.EventMessageValueOfBlockSetText{
BlockSetText: &pb.EventBlockSetText{
Id: "blockId",
Text: &pb.EventBlockSetTextText{
Value: "some text",
},
},
},
},
},
},
},
},
},
},
}
ch2 := &objecttree.Change{
Id: "id2",
Identity: account,
Model: &pb.Change{
Content: []*pb.ChangeContent{
{
Value: &pb.ChangeContentValueOfBlockUpdate{
BlockUpdate: &pb.ChangeBlockUpdate{
Events: []*pb.EventMessage{
{
Value: &pb.EventMessageValueOfBlockSetText{
BlockSetText: &pb.EventBlockSetText{
Id: "blockId",
Text: &pb.EventBlockSetTextText{
Value: "new text some text",
},
},
},
},
},
},
},
},
},
},
}
currChange := []*objecttree.Change{
ch2, ch, ch1,
}
history := newFixture(t, currChange, objectId, spaceID, versionId)
// when
resp, err := history.Versions(domain.FullID{ObjectID: objectId, SpaceID: spaceID}, versionId, 10)
// then
assert.Nil(t, err)
assert.Len(t, resp, 3)
})
}
type historyFixture struct {
@ -1010,6 +1115,7 @@ func newFixture(t *testing.T, expectedChanges []*objecttree.Change, objectId, sp
history := &history{
objectStore: objectstore.NewStoreFixture(t),
spaceService: spaceService,
heads: map[string]string{},
}
return &historyFixture{
history: history,
@ -1035,6 +1141,7 @@ func newFixtureDiffVersions(t *testing.T,
history := &history{
objectStore: objectstore.NewStoreFixture(t),
spaceService: spaceService,
heads: map[string]string{},
}
return &historyFixture{
history: history,
@ -1050,8 +1157,8 @@ func configureTreeBuilder(treeBuilder *mock_objecttreebuilder.MockTreeBuilder,
spaceService *mock_space.MockService,
) {
treeBuilder.EXPECT().BuildHistoryTree(context.Background(), objectId, objecttreebuilder.HistoryTreeOpts{
BeforeId: currVersionId,
Include: true,
Heads: []string{currVersionId},
Include: true,
}).Return(&historyStub{
objectId: objectId,
changes: expectedChanges,

View file

@ -642,6 +642,23 @@ func (mw *Middleware) ObjectListSetDetails(cctx context.Context, req *pb.RpcObje
return response(pb.RpcObjectListSetDetailsResponseError_NULL, nil)
}
func (mw *Middleware) ObjectListModifyDetailValues(_ context.Context, req *pb.RpcObjectListModifyDetailValuesRequest) *pb.RpcObjectListModifyDetailValuesResponse {
response := func(code pb.RpcObjectListModifyDetailValuesResponseErrorCode, err error) *pb.RpcObjectListModifyDetailValuesResponse {
m := &pb.RpcObjectListModifyDetailValuesResponse{Error: &pb.RpcObjectListModifyDetailValuesResponseError{Code: code}}
if err != nil {
m.Error.Description = getErrorDescription(err)
}
return m
}
err := mw.doBlockService(func(bs *block.Service) (err error) {
return bs.ModifyDetailsList(req)
})
if err != nil {
return response(pb.RpcObjectListModifyDetailValuesResponseError_UNKNOWN_ERROR, err)
}
return response(pb.RpcObjectListModifyDetailValuesResponseError_NULL, nil)
}
func (mw *Middleware) ObjectSetLayout(cctx context.Context, req *pb.RpcObjectSetLayoutRequest) *pb.RpcObjectSetLayoutResponse {
ctx := mw.newContext(cctx)
response := func(code pb.RpcObjectSetLayoutResponseErrorCode, err error) *pb.RpcObjectSetLayoutResponse {

View file

@ -272,7 +272,7 @@ func (s *service) GetSubscriptionStatus(ctx context.Context, req *pb.RpcMembersh
log.Debug("subscription status", zap.Any("from server", status), zap.Any("cached", cachedStatus))
// 5 - Send all messages to the client if needed
if !isUpdateRequired(cacheErr, isCacheDisabled, isCacheExpired, cachedStatus, status) {
if !isUpdateRequired(cacheErr, isCacheExpired, cachedStatus, status) {
// no need to send events or enable/disable cache
return &out, nil
}
@ -323,7 +323,7 @@ func canReturnCachedStatus(s *pb.RpcMembershipGetStatusResponse) bool {
return s != nil && s.Data != nil && (s.Error == nil || s.Error.Code == pb.RpcMembershipGetStatusResponseError_NULL)
}
func isUpdateRequired(cacheErr error, isCacheDisabled bool, isCacheExpired bool, cachedStatus *pb.RpcMembershipGetStatusResponse, status *proto.GetSubscriptionResponse) bool {
func isUpdateRequired(cacheErr error, isCacheExpired bool, cachedStatus *pb.RpcMembershipGetStatusResponse, status *proto.GetSubscriptionResponse) bool {
// 1 - If cache was empty or expired
// -> treat at is if data was different
isCacheEmpty := cacheErr != nil || cachedStatus == nil || cachedStatus.Data == nil || isCacheExpired
@ -890,11 +890,12 @@ func (s *service) getAllTiers(ctx context.Context, req *pb.RpcMembershipGetTiers
// empty return or error
tiers, err := s.ppclient.GetAllTiers(ctx, &reqSigned)
if err != nil {
// if error here -> we do not create empty array
// with GetStatus above the logic is different
// there we create empty status and save it to cache
log.Error("can not get tiers from payment node", zap.Error(err))
return nil, err
// If PP node didn't answer -> create empty tiers response
log.Info("creating empty tiers in cache because can not get tiers from the payment node")
tiers = &proto.GetTiersResponse{
Tiers: make([]*proto.TierData, 0),
}
}
// 3 - return out

View file

@ -1134,7 +1134,7 @@ func TestFinalizeSubscription(t *testing.T) {
}
func TestGetTiers(t *testing.T) {
t.Run("fail if no cache, pp client returned error", func(t *testing.T) {
t.Run("do not fail if no cache, pp client returned error", func(t *testing.T) {
fx := newFixture(t)
defer fx.finish(t)
@ -1145,13 +1145,30 @@ func TestGetTiers(t *testing.T) {
fx.cache.EXPECT().IsCacheDisabled().Return(false)
fx.cache.EXPECT().IsCacheExpired().Return(false)
fx.cache.EXPECT().CacheGet().Return(nil, nil, nil)
fx.cache.EXPECT().CacheSet(mock.AnythingOfType("*pb.RpcMembershipGetStatusResponse"), mock.AnythingOfType("*pb.RpcMembershipGetTiersResponse")).RunAndReturn(func(in *pb.RpcMembershipGetStatusResponse, tiers *pb.RpcMembershipGetTiersResponse) (err error) {
return nil
})
fx.ppclient.EXPECT().GetSubscriptionStatus(gomock.Any(), gomock.Any()).DoAndReturn(func(ctx interface{}, in *psp.GetSubscriptionRequestSigned) (*psp.GetSubscriptionResponse, error) {
return &psp.GetSubscriptionResponse{
Tier: uint32(psp.SubscriptionTier_TierExplorer),
Status: psp.SubscriptionStatus_StatusActive,
DateStarted: uint64(timeNow.Unix()),
DateEnds: uint64(subsExpire.Unix()),
IsAutoRenew: true,
PaymentMethod: psp.PaymentMethod_MethodCrypto,
RequestedAnyName: "something.any",
}, nil
}).MinTimes(1)
fx.expectLimitsUpdated()
req := pb.RpcMembershipGetTiersRequest{
NoCache: false,
Locale: "en_US",
}
_, err := fx.GetTiers(ctx, &req)
assert.Error(t, err)
out, err := fx.GetTiers(ctx, &req)
assert.NoError(t, err)
assert.Equal(t, 0, len(out.Tiers))
})
t.Run("success if no cache, empty response", func(t *testing.T) {

View file

@ -287,6 +287,9 @@ func (s *spaceSyncStatus) makeSyncEvent(spaceId string, params syncParams) *pb.E
status = pb.EventSpace_Error
err = pb.EventSpace_IncompatibleVersion
}
if params.compatibility == nodeconf.NetworkCompatibilityStatusNeedsUpdate {
status = pb.EventSpace_NetworkNeedsUpdate
}
return &pb.EventSpaceSyncStatusUpdate{
Id: spaceId,
Status: status,

View file

@ -385,6 +385,33 @@ func Test(t *testing.T) {
time.Sleep(100 * time.Millisecond)
defer fx.ctrl.Finish()
})
t.Run("sync protocol compatibility", func(t *testing.T) {
fx := newFixture(t, func(fx *fixture) {
fx.networkConfig.EXPECT().GetNetworkMode().Return(pb.RpcAccount_DefaultConfig)
fx.spaceIdGetter.EXPECT().AllSpaceIds().Return([]string{"spaceId"})
fx.nodeStatus.EXPECT().GetNodeStatus("spaceId").Return(nodestatus.Online)
fx.nodeUsage.EXPECT().GetNodeUsage(mock.Anything).Return(&files.NodeUsageResponse{
Usage: filesync.NodeUsage{
BytesLeft: 1000,
AccountBytesLimit: 1000,
},
LocalUsageBytes: 0,
}, nil)
fx.nodeConf.EXPECT().NetworkCompatibilityStatus().Return(nodeconf.NetworkCompatibilityStatusNeedsUpdate)
fx.eventSender.EXPECT().Broadcast(&pb.Event{
Messages: []*pb.EventMessage{{
Value: &pb.EventMessageValueOfSpaceSyncStatusUpdate{
SpaceSyncStatusUpdate: &pb.EventSpaceSyncStatusUpdate{
Id: "spaceId",
Status: pb.EventSpace_NetworkNeedsUpdate,
Network: pb.EventSpace_Anytype,
},
},
}},
})
})
defer fx.ctrl.Finish()
})
t.Run("hook new session", func(t *testing.T) {
fx := newFixture(t, func(fx *fixture) {
objs := genSyncingObjects(10, 100, "spaceId")

View file

@ -847,6 +847,11 @@
- [Rpc.Object.ListExport.Request](#anytype-Rpc-Object-ListExport-Request)
- [Rpc.Object.ListExport.Response](#anytype-Rpc-Object-ListExport-Response)
- [Rpc.Object.ListExport.Response.Error](#anytype-Rpc-Object-ListExport-Response-Error)
- [Rpc.Object.ListModifyDetailValues](#anytype-Rpc-Object-ListModifyDetailValues)
- [Rpc.Object.ListModifyDetailValues.Request](#anytype-Rpc-Object-ListModifyDetailValues-Request)
- [Rpc.Object.ListModifyDetailValues.Request.Operation](#anytype-Rpc-Object-ListModifyDetailValues-Request-Operation)
- [Rpc.Object.ListModifyDetailValues.Response](#anytype-Rpc-Object-ListModifyDetailValues-Response)
- [Rpc.Object.ListModifyDetailValues.Response.Error](#anytype-Rpc-Object-ListModifyDetailValues-Response-Error)
- [Rpc.Object.ListSetDetails](#anytype-Rpc-Object-ListSetDetails)
- [Rpc.Object.ListSetDetails.Request](#anytype-Rpc-Object-ListSetDetails-Request)
- [Rpc.Object.ListSetDetails.Response](#anytype-Rpc-Object-ListSetDetails-Response)
@ -1357,6 +1362,7 @@
- [Rpc.Object.ListDelete.Response.Error.Code](#anytype-Rpc-Object-ListDelete-Response-Error-Code)
- [Rpc.Object.ListDuplicate.Response.Error.Code](#anytype-Rpc-Object-ListDuplicate-Response-Error-Code)
- [Rpc.Object.ListExport.Response.Error.Code](#anytype-Rpc-Object-ListExport-Response-Error-Code)
- [Rpc.Object.ListModifyDetailValues.Response.Error.Code](#anytype-Rpc-Object-ListModifyDetailValues-Response-Error-Code)
- [Rpc.Object.ListSetDetails.Response.Error.Code](#anytype-Rpc-Object-ListSetDetails-Response-Error-Code)
- [Rpc.Object.ListSetIsArchived.Response.Error.Code](#anytype-Rpc-Object-ListSetIsArchived-Response-Error-Code)
- [Rpc.Object.ListSetIsFavorite.Response.Error.Code](#anytype-Rpc-Object-ListSetIsFavorite-Response-Error-Code)
@ -1905,6 +1911,7 @@
| ObjectListSetIsFavorite | [Rpc.Object.ListSetIsFavorite.Request](#anytype-Rpc-Object-ListSetIsFavorite-Request) | [Rpc.Object.ListSetIsFavorite.Response](#anytype-Rpc-Object-ListSetIsFavorite-Response) | |
| ObjectListSetObjectType | [Rpc.Object.ListSetObjectType.Request](#anytype-Rpc-Object-ListSetObjectType-Request) | [Rpc.Object.ListSetObjectType.Response](#anytype-Rpc-Object-ListSetObjectType-Response) | |
| ObjectListSetDetails | [Rpc.Object.ListSetDetails.Request](#anytype-Rpc-Object-ListSetDetails-Request) | [Rpc.Object.ListSetDetails.Response](#anytype-Rpc-Object-ListSetDetails-Response) | |
| ObjectListModifyDetailValues | [Rpc.Object.ListModifyDetailValues.Request](#anytype-Rpc-Object-ListModifyDetailValues-Request) | [Rpc.Object.ListModifyDetailValues.Response](#anytype-Rpc-Object-ListModifyDetailValues-Response) | |
| ObjectApplyTemplate | [Rpc.Object.ApplyTemplate.Request](#anytype-Rpc-Object-ApplyTemplate-Request) | [Rpc.Object.ApplyTemplate.Response](#anytype-Rpc-Object-ApplyTemplate-Response) | |
| ObjectToSet | [Rpc.Object.ToSet.Request](#anytype-Rpc-Object-ToSet-Request) | [Rpc.Object.ToSet.Response](#anytype-Rpc-Object-ToSet-Response) | ObjectToSet creates new set from given object and removes object |
| ObjectToCollection | [Rpc.Object.ToCollection.Request](#anytype-Rpc-Object-ToCollection-Request) | [Rpc.Object.ToCollection.Response](#anytype-Rpc-Object-ToCollection-Response) | |
@ -14345,6 +14352,81 @@ Deletes the object, keys from the local store and unsubscribe from remote change
<a name="anytype-Rpc-Object-ListModifyDetailValues"></a>
### Rpc.Object.ListModifyDetailValues
<a name="anytype-Rpc-Object-ListModifyDetailValues-Request"></a>
### Rpc.Object.ListModifyDetailValues.Request
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| objectIds | [string](#string) | repeated | |
| operations | [Rpc.Object.ListModifyDetailValues.Request.Operation](#anytype-Rpc-Object-ListModifyDetailValues-Request-Operation) | repeated | |
<a name="anytype-Rpc-Object-ListModifyDetailValues-Request-Operation"></a>
### Rpc.Object.ListModifyDetailValues.Request.Operation
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| relationKey | [string](#string) | | |
| add | [google.protobuf.Value](#google-protobuf-Value) | | |
| set | [google.protobuf.Value](#google-protobuf-Value) | | |
| remove | [google.protobuf.Value](#google-protobuf-Value) | | |
<a name="anytype-Rpc-Object-ListModifyDetailValues-Response"></a>
### Rpc.Object.ListModifyDetailValues.Response
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| error | [Rpc.Object.ListModifyDetailValues.Response.Error](#anytype-Rpc-Object-ListModifyDetailValues-Response-Error) | | |
<a name="anytype-Rpc-Object-ListModifyDetailValues-Response-Error"></a>
### Rpc.Object.ListModifyDetailValues.Response.Error
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| code | [Rpc.Object.ListModifyDetailValues.Response.Error.Code](#anytype-Rpc-Object-ListModifyDetailValues-Response-Error-Code) | | |
| description | [string](#string) | | |
<a name="anytype-Rpc-Object-ListSetDetails"></a>
### Rpc.Object.ListSetDetails
@ -21569,6 +21651,19 @@ Middleware-to-front-end response, that can contain a NULL error or a non-NULL er
<a name="anytype-Rpc-Object-ListModifyDetailValues-Response-Error-Code"></a>
### Rpc.Object.ListModifyDetailValues.Response.Error.Code
| Name | Number | Description |
| ---- | ------ | ----------- |
| NULL | 0 | |
| UNKNOWN_ERROR | 1 | |
| BAD_INPUT | 2 | |
<a name="anytype-Rpc-Object-ListSetDetails-Response-Error-Code"></a>
### Rpc.Object.ListSetDetails.Response.Error.Code
@ -25832,6 +25927,7 @@ Precondition: user A and user B opened the same block
| Syncing | 1 | |
| Error | 2 | |
| Offline | 3 | |
| NetworkNeedsUpdate | 4 | |

53
go.mod
View file

@ -7,14 +7,14 @@ require (
github.com/PuerkitoBio/goquery v1.9.2
github.com/VividCortex/ewma v1.2.0
github.com/adrium/goheif v0.0.0-20230113233934-ca402e77a786
github.com/anyproto/any-store v0.0.1
github.com/anyproto/any-sync v0.4.22
github.com/anyproto/any-store v0.0.2-0.20240812125400-7f6f6d062ebf
github.com/anyproto/any-sync v0.4.30
github.com/anyproto/go-naturaldate/v2 v2.0.2-0.20230524105841-9829cfd13438
github.com/anyproto/tantivy-go v0.0.7
github.com/anyproto/tantivy-go v0.0.9
github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de
github.com/avast/retry-go/v4 v4.6.0
github.com/blevesearch/bleve/v2 v2.3.10
github.com/chai2010/webp v1.1.1
github.com/chai2010/webp v1.1.2-0.20240612091223-aa1b379218b7
github.com/cheggaaa/mb v1.0.3
github.com/cheggaaa/mb/v3 v3.0.2
github.com/dave/jennifer v1.7.0
@ -57,7 +57,7 @@ require (
github.com/joho/godotenv v1.5.1
github.com/jsummers/gobmp v0.0.0-20151104160322-e2ba15ffa76e
github.com/kelseyhightower/envconfig v1.4.0
github.com/klauspost/compress v1.17.8
github.com/klauspost/compress v1.17.9
github.com/libp2p/go-libp2p v0.35.1
github.com/libp2p/zeroconf/v2 v2.2.0
github.com/logrusorgru/aurora v2.0.3+incompatible
@ -71,15 +71,16 @@ require (
github.com/multiformats/go-multiaddr-dns v0.3.1
github.com/multiformats/go-multibase v0.2.0
github.com/multiformats/go-multihash v0.2.3
github.com/oov/psd v0.0.0-20220121172623-5db5eafcecbb
github.com/opentracing/opentracing-go v1.2.0
github.com/otiai10/copy v1.14.0
github.com/otiai10/opengraph/v2 v2.1.0
github.com/pkg/errors v0.9.1
github.com/prometheus/client_golang v1.19.1
github.com/prometheus/client_golang v1.20.2
github.com/pseudomuto/protoc-gen-doc v1.5.1
github.com/rwcarlsen/goexif v0.0.0-20190401172101-9e8deecbddbd
github.com/samber/lo v1.46.0
github.com/sasha-s/go-deadlock v0.3.1
github.com/samber/lo v1.47.0
github.com/sasha-s/go-deadlock v0.3.5
github.com/shirou/gopsutil/v3 v3.24.4
github.com/stretchr/testify v1.9.0
github.com/uber/jaeger-client-go v2.30.0+incompatible
@ -87,16 +88,17 @@ require (
github.com/vektra/mockery/v2 v2.42.2
github.com/xeipuuv/gojsonschema v1.2.0
github.com/yuin/goldmark v1.7.4
github.com/zeebo/blake3 v0.2.4
go.uber.org/atomic v1.11.0
go.uber.org/mock v0.4.0
go.uber.org/multierr v1.11.0
go.uber.org/zap v1.27.0
golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56
golang.org/x/image v0.18.0
golang.org/x/mobile v0.0.0-20240520174638-fa72addaaa1b
golang.org/x/net v0.27.0
golang.org/x/oauth2 v0.21.0
golang.org/x/text v0.16.0
golang.org/x/image v0.19.0
golang.org/x/mobile v0.0.0-20240806205939-81131f6468ab
golang.org/x/net v0.28.0
golang.org/x/oauth2 v0.22.0
golang.org/x/text v0.17.0
google.golang.org/grpc v1.65.0
gopkg.in/Graylog2/go-gelf.v2 v2.0.0-20180125164251-1832d8546a9f
gopkg.in/yaml.v3 v3.0.1
@ -173,6 +175,7 @@ require (
github.com/google/flatbuffers v1.12.1 // indirect
github.com/google/go-querystring v1.1.0 // indirect
github.com/google/pprof v0.0.0-20240402174815-29b9bb013b0f // indirect
github.com/gopherjs/gopherjs v0.0.0-20190430165422-3e4dfb77656c // indirect
github.com/gorilla/css v1.0.0 // indirect
github.com/gosimple/unidecode v1.0.1 // indirect
github.com/hashicorp/errwrap v1.1.0 // indirect
@ -216,18 +219,19 @@ require (
github.com/multiformats/go-multicodec v0.9.0 // indirect
github.com/multiformats/go-multistream v0.5.0 // indirect
github.com/multiformats/go-varint v0.0.7 // indirect
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
github.com/mwitkow/go-proto-validators v0.3.2 // indirect
github.com/onsi/ginkgo/v2 v2.17.1 // indirect
github.com/pelletier/go-toml/v2 v2.0.6 // indirect
github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5 // indirect
github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/polydawn/refmt v0.89.0 // indirect
github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect
github.com/prometheus/client_model v0.6.1 // indirect
github.com/prometheus/common v0.48.0 // indirect
github.com/prometheus/procfs v0.12.0 // indirect
github.com/prometheus/common v0.55.0 // indirect
github.com/prometheus/procfs v0.15.1 // indirect
github.com/pseudomuto/protokit v0.2.1 // indirect
github.com/quic-go/quic-go v0.44.0 // indirect
github.com/quic-go/quic-go v0.46.0 // indirect
github.com/rs/cors v1.7.0 // indirect
github.com/rs/zerolog v1.29.0 // indirect
github.com/shoenig/go-m1cpu v0.1.6 // indirect
@ -249,22 +253,21 @@ require (
github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f // indirect
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect
github.com/yusufpapurcu/wmi v1.2.4 // indirect
github.com/zeebo/blake3 v0.2.3 // indirect
github.com/zeebo/errs v1.3.0 // indirect
go.etcd.io/bbolt v1.3.7 // indirect
go.opencensus.io v0.24.0 // indirect
go.opentelemetry.io/otel v1.14.0 // indirect
go.opentelemetry.io/otel/trace v1.14.0 // indirect
golang.org/x/crypto v0.25.0 // indirect
golang.org/x/mod v0.19.0 // indirect
golang.org/x/sync v0.7.0 // indirect
golang.org/x/sys v0.22.0 // indirect
golang.org/x/term v0.22.0 // indirect
golang.org/x/crypto v0.26.0 // indirect
golang.org/x/mod v0.20.0 // indirect
golang.org/x/sync v0.8.0 // indirect
golang.org/x/sys v0.23.0 // indirect
golang.org/x/term v0.23.0 // indirect
golang.org/x/time v0.5.0 // indirect
golang.org/x/tools v0.23.0 // indirect
golang.org/x/tools v0.24.0 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20240528184218-531527333157 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20240528184218-531527333157 // indirect
google.golang.org/protobuf v1.34.1 // indirect
google.golang.org/protobuf v1.34.2 // indirect
gopkg.in/ini.v1 v1.67.0 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
lukechampine.com/blake3 v1.2.1 // indirect

116
go.sum
View file

@ -83,12 +83,10 @@ github.com/andybalholm/cascadia v1.2.0/go.mod h1:YCyR8vOZT9aZ1CHEd8ap0gMVm2aFgxB
github.com/andybalholm/cascadia v1.3.1/go.mod h1:R4bJ1UQfqADjvDa4P6HZHLh/3OxWWEqc0Sk8XGwHqvA=
github.com/andybalholm/cascadia v1.3.2 h1:3Xi6Dw5lHF15JtdcmAHD3i1+T8plmv7BQ/nsViSLyss=
github.com/andybalholm/cascadia v1.3.2/go.mod h1:7gtRlve5FxPPgIgX36uWBX58OdBsSS6lUvCFb+h7KvU=
github.com/anyproto/any-store v0.0.0-20240719163025-8a3657f8e01c h1:rRlF97BLA+4/jV82lMHEQGbNS4qgsed+HuoAJtYaLUM=
github.com/anyproto/any-store v0.0.0-20240719163025-8a3657f8e01c/go.mod h1:JV7dJ8+xF1VaCQgFQsD8SZSNlxxTGFbDiF8llkB2ILc=
github.com/anyproto/any-store v0.0.1 h1:RiZi3cHVSpIebcNeHYOUaDShH7E9Ahto33zdnqCaUHM=
github.com/anyproto/any-store v0.0.1/go.mod h1:JV7dJ8+xF1VaCQgFQsD8SZSNlxxTGFbDiF8llkB2ILc=
github.com/anyproto/any-sync v0.4.22 h1:f9iAbCv/clTzYtzOzkX1IOXahVM/Art1WkUtIgnwl8U=
github.com/anyproto/any-sync v0.4.22/go.mod h1:qHIG2zMvGIthEb2FmcjQN5YZZwV8kPHv7/T0ib7YSDg=
github.com/anyproto/any-store v0.0.2-0.20240812125400-7f6f6d062ebf h1:9VTQc/011fVyucu9bICmjF6+y/T9QdZv6MN7X4gM4S0=
github.com/anyproto/any-store v0.0.2-0.20240812125400-7f6f6d062ebf/go.mod h1:JV7dJ8+xF1VaCQgFQsD8SZSNlxxTGFbDiF8llkB2ILc=
github.com/anyproto/any-sync v0.4.30 h1:2nnoVQF9WiBIw8pzwuOubwqf7a+xvZPDkXHmykTPi0k=
github.com/anyproto/any-sync v0.4.30/go.mod h1:YjwTdTRL6b6GuutJNboJJ1M5D/kkdeSf9qF5xP6wG7Y=
github.com/anyproto/badger/v4 v4.2.1-0.20240110160636-80743fa3d580 h1:Ba80IlCCxkZ9H1GF+7vFu/TSpPvbpDCxXJ5ogc4euYc=
github.com/anyproto/badger/v4 v4.2.1-0.20240110160636-80743fa3d580/go.mod h1:T/uWAYxrXdaXw64ihI++9RMbKTCpKd/yE9+saARew7k=
github.com/anyproto/go-chash v0.1.0 h1:I9meTPjXFRfXZHRJzjOHC/XF7Q5vzysKkiT/grsogXY=
@ -111,8 +109,8 @@ github.com/anyproto/protobuf v1.3.3-0.20240201225420-6e325cf0ac38 h1:80jke82/c+b
github.com/anyproto/protobuf v1.3.3-0.20240201225420-6e325cf0ac38/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
github.com/anyproto/ristretto v0.1.2-0.20240221153107-2b23839cc50c h1:GicoaTUyB2mtCIl3YMrO0OzysqRT5GA4vuvDsqEkhSM=
github.com/anyproto/ristretto v0.1.2-0.20240221153107-2b23839cc50c/go.mod h1:S1GPSBCYCIhmVNfcth17y2zZtQT6wzkzgwUve0VDWWA=
github.com/anyproto/tantivy-go v0.0.7 h1:sw8wuXJKZYmoULTmoqJdhsK4PYBCdTkAdSD7F89aQiI=
github.com/anyproto/tantivy-go v0.0.7/go.mod h1:Pl0zaeEX7dkVDTDKROzlLlGCVjbZHjyPrZloFuVEASc=
github.com/anyproto/tantivy-go v0.0.9 h1:lbRBH5Nzs1nlSWKBlC9UuyOEqhM/KEs8P02Cvt58WP8=
github.com/anyproto/tantivy-go v0.0.9/go.mod h1:Pl0zaeEX7dkVDTDKROzlLlGCVjbZHjyPrZloFuVEASc=
github.com/anyproto/zeroconf/v2 v2.2.1-0.20240228113933-f90a5cc4439d h1:5bj7nX/AS8sxGpTIrapE7PC4oPlhkHMwMqXlJbUHBlg=
github.com/anyproto/zeroconf/v2 v2.2.1-0.20240228113933-f90a5cc4439d/go.mod h1:fuJqLnUwZTshS3U/bMRJ3+ow/v9oid1n0DmyYyNO1Xs=
github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
@ -204,8 +202,8 @@ github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghf
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/chai2010/webp v1.1.1 h1:jTRmEccAJ4MGrhFOrPMpNGIJ/eybIgwKpcACsrTEapk=
github.com/chai2010/webp v1.1.1/go.mod h1:0XVwvZWdjjdxpUEIf7b9g9VkHFnInUSYujwqTLEuldU=
github.com/chai2010/webp v1.1.2-0.20240612091223-aa1b379218b7 h1:EcFyQu4Hz/YC2lc3xWqn678e2FNfG0cgTr/EOA4ByWs=
github.com/chai2010/webp v1.1.2-0.20240612091223-aa1b379218b7/go.mod h1:0XVwvZWdjjdxpUEIf7b9g9VkHFnInUSYujwqTLEuldU=
github.com/cheggaaa/mb v1.0.3 h1:03ksWum+6kHclB+kjwKMaBtgl5gtNYUwNpxsHQciKe8=
github.com/cheggaaa/mb v1.0.3/go.mod h1:NUl0GBtFLlfg2o6iZwxzcG7Lslc2wV/ADTFbLXtVPE4=
github.com/cheggaaa/mb/v3 v3.0.2 h1:jd1Xx0zzihZlXL6HmnRXVCI1BHuXz/kY+VzX9WbvNDU=
@ -758,10 +756,9 @@ github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+o
github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4=
github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
github.com/klauspost/compress v1.17.8 h1:YcnTYrq7MikUT7k0Yb5eceMmALQPYBW/Xltxn0NAMnU=
github.com/klauspost/compress v1.17.8/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw=
github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA=
github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw=
github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
github.com/klauspost/cpuid/v2 v2.0.12/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c=
github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM=
github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
@ -781,6 +778,8 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y=
github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII=
github.com/libp2p/go-addr-util v0.0.1/go.mod h1:4ac6O7n9rIAKB1dnd+s8IbbMXkt+oBpzX4/+RACcnlQ=
@ -1092,6 +1091,8 @@ github.com/multiformats/go-varint v0.0.5/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXS
github.com/multiformats/go-varint v0.0.6/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE=
github.com/multiformats/go-varint v0.0.7 h1:sWSGR+f/eu5ABZA2ZpYKBILXTTs9JWpdEM/nEGOHFS8=
github.com/multiformats/go-varint v0.0.7/go.mod h1:r8PUYw/fD/SjBCiKOoDlGF6QawOELpZAu9eioSos/OU=
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU=
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
@ -1126,6 +1127,8 @@ github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7J
github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA=
github.com/onsi/gomega v1.30.0 h1:hvMK7xYz4D3HapigLTeGdId/NcfQx1VHMJc60ew99+8=
github.com/onsi/gomega v1.30.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ=
github.com/oov/psd v0.0.0-20220121172623-5db5eafcecbb h1:JF9kOhBBk4WPF7luXFu5yR+WgaFm9L/KiHJHhU9vDwA=
github.com/oov/psd v0.0.0-20220121172623-5db5eafcecbb/go.mod h1:GHI1bnmAcbp96z6LNfBJvtrjxhaXGkbsk967utPlvL8=
github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk=
github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis=
github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74=
@ -1156,8 +1159,8 @@ github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/9
github.com/pelletier/go-toml/v2 v2.0.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvIwycIU=
github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek=
github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac=
github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5 h1:q2e307iGHPdTGp0hoxKjt1H5pDo6utceo3dQVK3I5XQ=
github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5/go.mod h1:jvVRKCrJTQWu0XVbaOlby/2lO20uSCHEMzzplHXte1o=
github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7 h1:Dx7Ovyv/SFnMFw3fD4oEoeorXc6saIiQ23LrGLth0Gw=
github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4=
github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc=
github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
github.com/pion/datachannel v1.5.6 h1:1IxKJntfSlYkpUj8LlYRSWpYiTTC02nUrOE8T3DqGeg=
@ -1214,8 +1217,8 @@ github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDf
github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og=
github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE=
github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho=
github.com/prometheus/client_golang v1.20.2 h1:5ctymQzZlyOON1666svgwn3s6IKWgfbjsejTMiXIyjg=
github.com/prometheus/client_golang v1.20.2/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE=
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
@ -1231,8 +1234,8 @@ github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y8
github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA=
github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s=
github.com/prometheus/common v0.48.0 h1:QO8U2CdOzSn1BBsmXJXduaaW+dY/5QLjfB8svtSzKKE=
github.com/prometheus/common v0.48.0/go.mod h1:0/KsvlIEfPQCQ5I2iNSAWKPZziNCvRs5EC6ILDTlAPc=
github.com/prometheus/common v0.55.0 h1:KEi6DK7lXW/m7Ig5i47x0vRzuBsHuvJdi5ee6Y3G1dc=
github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65zxzNImwdc8=
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
@ -1240,8 +1243,8 @@ github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsT
github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=
github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
github.com/prometheus/procfs v0.3.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo=
github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo=
github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc=
github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk=
github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
github.com/pseudomuto/protoc-gen-doc v1.5.1 h1:Ah259kcrio7Ix1Rhb6u8FCaOkzf9qRBqXnvAufg061w=
github.com/pseudomuto/protoc-gen-doc v1.5.1/go.mod h1:XpMKYg6zkcpgfpCfQ8GcWBDRtRxOmMR5w7pz4Xo+dYM=
@ -1249,8 +1252,8 @@ github.com/pseudomuto/protokit v0.2.1 h1:kCYpE3thoR6Esm0CUvd5xbrDTOZPvQPTDeyXpZf
github.com/pseudomuto/protokit v0.2.1/go.mod h1:gt7N5Rz2flBzYafvaxyIxMZC0TTF5jDZfRnw25hAAyo=
github.com/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo=
github.com/quic-go/qpack v0.4.0/go.mod h1:UZVnYIfi5GRk+zI9UMaCPsmZ2xKJP7XBUvVyT1Knj9A=
github.com/quic-go/quic-go v0.44.0 h1:So5wOr7jyO4vzL2sd8/pD9Kesciv91zSk8BoFngItQ0=
github.com/quic-go/quic-go v0.44.0/go.mod h1:z4cx/9Ny9UtGITIPzmPTXh1ULfOyWh4qGQlpnPcWmek=
github.com/quic-go/quic-go v0.46.0 h1:uuwLClEEyk1DNvchH8uCByQVjo3yKL9opKulExNDs7Y=
github.com/quic-go/quic-go v0.46.0/go.mod h1:1dLehS7TIR64+vxGR70GDcatWTOtMX2PUtnKsjbTurI=
github.com/quic-go/webtransport-go v0.8.0 h1:HxSrwun11U+LlmwpgM1kEqIqH90IT4N8auv/cD7QFJg=
github.com/quic-go/webtransport-go v0.8.0/go.mod h1:N99tjprW432Ut5ONql/aUhSLT0YVSlwHohQsuac9WaM=
github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
@ -1270,11 +1273,11 @@ github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQD
github.com/rwcarlsen/goexif v0.0.0-20190401172101-9e8deecbddbd h1:CmH9+J6ZSsIjUK3dcGsnCnO41eRBOnY12zwkn5qVwgc=
github.com/rwcarlsen/goexif v0.0.0-20190401172101-9e8deecbddbd/go.mod h1:hPqNNc0+uJM6H+SuU8sEs5K5IQeKccPqeSjfgcKGgPk=
github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
github.com/samber/lo v1.46.0 h1:w8G+oaCPgz1PoCJztqymCFaKwXt+5cCXn51uPxExFfQ=
github.com/samber/lo v1.46.0/go.mod h1:RmDH9Ct32Qy3gduHQuKJ3gW1fMHAnE/fAzQuf6He5cU=
github.com/samber/lo v1.47.0 h1:z7RynLwP5nbyRscyvcD043DWYoOcYRv3mV8lBeqOCLc=
github.com/samber/lo v1.47.0/go.mod h1:RmDH9Ct32Qy3gduHQuKJ3gW1fMHAnE/fAzQuf6He5cU=
github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E=
github.com/sasha-s/go-deadlock v0.3.1 h1:sqv7fDNShgjcaxkO0JNcOAlr8B9+cV5Ey/OB71efZx0=
github.com/sasha-s/go-deadlock v0.3.1/go.mod h1:F73l+cr82YSh10GxyRI6qZiCgK64VaZjwesgfQ1/iLM=
github.com/sasha-s/go-deadlock v0.3.5 h1:tNCOEEDG6tBqrNDOX35j/7hL5FcFViG6awUGROb2NsU=
github.com/sasha-s/go-deadlock v0.3.5/go.mod h1:bugP6EGbdGYObIlx7pUZtWqlvo8k9H6vCBBsiChJQ5U=
github.com/scylladb/termtables v0.0.0-20191203121021-c4c0b6d42ff4/go.mod h1:C1a7PQSMz9NShzorzCiG2fk9+xuCgLkPeCvMHYR2OWg=
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
github.com/sebdah/goldie/v2 v2.5.3 h1:9ES/mNN+HNUbNWpVAlrzuZ7jE+Nrczbj8uFRjM7624Y=
@ -1426,11 +1429,10 @@ github.com/yuin/goldmark v1.7.4 h1:BDXOHExt+A7gwPCJgPIIq7ENvceR7we7rOS9TNoLZeg=
github.com/yuin/goldmark v1.7.4/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E=
github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0=
github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
github.com/zeebo/assert v1.1.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0=
github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ=
github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0=
github.com/zeebo/blake3 v0.2.3 h1:TFoLXsjeXqRNFxSbk35Dk4YtszE/MQQGK10BH4ptoTg=
github.com/zeebo/blake3 v0.2.3/go.mod h1:mjJjZpnsyIVtVgTOSpJ9vmRE4wgDeyt2HU3qXvvKCaQ=
github.com/zeebo/blake3 v0.2.4 h1:KYQPkhpRtcqh0ssGYcKLG1JYvddkEA8QwCM/yBqhaZI=
github.com/zeebo/blake3 v0.2.4/go.mod h1:7eeQ6d2iXWRGF6npfaxl2CU+xy2Fjo2gxeyZGCRUjcE=
github.com/zeebo/errs v1.3.0 h1:hmiaKqgYZzcVgRL1Vkc1Mn2914BbzB0IBxs+ebeutGs=
github.com/zeebo/errs v1.3.0/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4=
github.com/zeebo/pcg v1.0.1 h1:lyqfGeWiv4ahac6ttHs+I5hwtH/+1mrhlCtVNQM2kHo=
@ -1511,8 +1513,8 @@ golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw=
golang.org/x/crypto v0.25.0 h1:ypSNr+bnYL2YhwoMt2zPxHFmbAN1KZs/njMG3hxUp30=
golang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M=
golang.org/x/crypto v0.26.0 h1:RrRspgV4mU+YwB4FYnuBoKsUapNIL5cohGAmSH3azsw=
golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54=
golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
@ -1527,16 +1529,14 @@ golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u0
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw=
golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 h1:vr/HnozRka3pE4EsMEg1lgkXJkTFJCVUX+S/ZT6wYzM=
golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc=
golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8=
golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY=
golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/image v0.18.0 h1:jGzIakQa/ZXI1I0Fxvaa9W7yP25TqT6cHIHn+6CqvSQ=
golang.org/x/image v0.18.0/go.mod h1:4yyo5vMFQjVjUcVk4jEQcU9MGy/rulF5WvUILseCM2E=
golang.org/x/image v0.19.0 h1:D9FX4QWkLfkeqaC62SonffIIuYdOk/UE2XKUBgRIBIQ=
golang.org/x/image v0.19.0/go.mod h1:y0zrRqlQRWQ5PXaYCOMLTW2fpsxZ8Qh9I/ohnInJEys=
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
@ -1550,8 +1550,8 @@ golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPI
golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
golang.org/x/mobile v0.0.0-20240520174638-fa72addaaa1b h1:WX7nnnLfCEXg+FmdYZPai2XuP3VqCP1HZVMST0n9DF0=
golang.org/x/mobile v0.0.0-20240520174638-fa72addaaa1b/go.mod h1:EiXZlVfUTaAyySFVJb9rsODuiO+WXu8HrUuySb7nYFw=
golang.org/x/mobile v0.0.0-20240806205939-81131f6468ab h1:KONOFF8Uy3b60HEzOsGnNghORNhY4ImyOx0PGm73K9k=
golang.org/x/mobile v0.0.0-20240806205939-81131f6468ab/go.mod h1:udWezQGYjqrCxz5nV321pXQTx5oGbZx+khZvFjZNOPM=
golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
@ -1563,10 +1563,8 @@ golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA=
golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/mod v0.19.0 h1:fEdghXQSo20giMthA7cd28ZC+jts4amQ3YMXiP5oMQ8=
golang.org/x/mod v0.19.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/mod v0.20.0 h1:utOm6MM3R3dnawAiJgn0y+xvuYRsm1RKM/4giyfDgV0=
golang.org/x/mod v0.20.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@ -1630,8 +1628,8 @@ golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI=
golang.org/x/net v0.27.0 h1:5K3Njcw06/l2y9vpGCSdcxWOYHOUk3dVNGDXN+FvAys=
golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE=
golang.org/x/net v0.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE=
golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@ -1641,8 +1639,8 @@ golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ
golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/oauth2 v0.21.0 h1:tsimM75w1tF/uws5rbeHzIWxEqElMehnc+iW793zsZs=
golang.org/x/oauth2 v0.21.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
golang.org/x/oauth2 v0.22.0 h1:BzDx2FehcG7jJwgWLELCdmLuxk2i+x9UDpSiss2u0ZA=
golang.org/x/oauth2 v0.22.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@ -1656,8 +1654,8 @@ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJ
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M=
golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ=
golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@ -1751,8 +1749,8 @@ golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI=
golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.23.0 h1:YfKFowiIMvtgl1UERQoTPPToxltDeZfbj4H7dVUCwmM=
golang.org/x/sys v0.23.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
@ -1760,8 +1758,8 @@ golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY=
golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU=
golang.org/x/term v0.22.0 h1:BbsgPEJULsl2fV/AT3v15Mjva5yXKQDyKf+TbDz7QJk=
golang.org/x/term v0.22.0/go.mod h1:F3qCibpT5AMpCRfhfT53vVJwhLtIVHhB9XDjfFvnMI4=
golang.org/x/term v0.23.0 h1:F6D4vR+EHoL9/sWAWgAR1H2DcHr4PareCbAaCo1RpuU=
golang.org/x/term v0.23.0/go.mod h1:DgV24QBUrK6jhZXl+20l6UWznPlwAHm1Q1mGHtydmSk=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@ -1773,8 +1771,8 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4=
golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI=
golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc=
golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
@ -1843,10 +1841,8 @@ golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg=
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk=
golang.org/x/tools v0.23.0 h1:SGsXPZ+2l4JsgaCKkx+FQ9YZ5XEtA1GZYuoDjenLjvg=
golang.org/x/tools v0.23.0/go.mod h1:pnu6ufv6vQkll6szChhK3C3L/ruaIv5eBeztNG8wtsI=
golang.org/x/tools v0.24.0 h1:J1shsA93PJUEVaUSaay7UXAyE8aimq3GW0pjlolpa24=
golang.org/x/tools v0.24.0/go.mod h1:YhNqVBIfWHdzvTLs0d8LCuMhkKUgSUKldakyV7W/WDQ=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
@ -1966,8 +1962,8 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg=
google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=
google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=

File diff suppressed because it is too large Load diff

View file

@ -98,10 +98,11 @@ func (EventStatusThreadSyncStatus) EnumDescriptor() ([]byte, []int) {
type EventSpaceStatus int32
const (
EventSpace_Synced EventSpaceStatus = 0
EventSpace_Syncing EventSpaceStatus = 1
EventSpace_Error EventSpaceStatus = 2
EventSpace_Offline EventSpaceStatus = 3
EventSpace_Synced EventSpaceStatus = 0
EventSpace_Syncing EventSpaceStatus = 1
EventSpace_Error EventSpaceStatus = 2
EventSpace_Offline EventSpaceStatus = 3
EventSpace_NetworkNeedsUpdate EventSpaceStatus = 4
)
var EventSpaceStatus_name = map[int32]string{
@ -109,13 +110,15 @@ var EventSpaceStatus_name = map[int32]string{
1: "Syncing",
2: "Error",
3: "Offline",
4: "NetworkNeedsUpdate",
}
var EventSpaceStatus_value = map[string]int32{
"Synced": 0,
"Syncing": 1,
"Error": 2,
"Offline": 3,
"Synced": 0,
"Syncing": 1,
"Error": 2,
"Offline": 3,
"NetworkNeedsUpdate": 4,
}
func (x EventSpaceStatus) String() string {
@ -11706,376 +11709,377 @@ func init() {
func init() { proto.RegisterFile("pb/protos/events.proto", fileDescriptor_a966342d378ae5f5) }
var fileDescriptor_a966342d378ae5f5 = []byte{
// 5894 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5c, 0x59, 0x8c, 0x1d, 0xd9,
0x59, 0xbe, 0xfb, 0xf2, 0xf7, 0xe2, 0xeb, 0x33, 0x1e, 0x4f, 0x4d, 0xb9, 0xc7, 0xe3, 0x69, 0xaf,
0xf1, 0x78, 0xae, 0x3d, 0xde, 0xda, 0x71, 0x3c, 0xb6, 0x7b, 0xf3, 0xf4, 0xf5, 0xd2, 0x6e, 0x4e,
0xdb, 0xce, 0x64, 0x12, 0x45, 0xa9, 0xbe, 0x75, 0xfa, 0x76, 0xc5, 0xd5, 0x55, 0x37, 0x55, 0xd5,
0x6d, 0x77, 0x02, 0x21, 0x62, 0x11, 0x42, 0x02, 0x81, 0x04, 0x0a, 0x88, 0x17, 0x04, 0x02, 0x89,
0x07, 0x84, 0x40, 0x3c, 0x10, 0x5e, 0x10, 0x12, 0x42, 0x62, 0x95, 0x82, 0xc4, 0x03, 0x6f, 0x89,
0x26, 0x2f, 0xbc, 0xf0, 0x10, 0x90, 0x10, 0x4f, 0x08, 0x9d, 0xa5, 0xaa, 0xce, 0xa9, 0xe5, 0xd6,
0xbd, 0x99, 0x09, 0x8b, 0xc8, 0xd3, 0xbd, 0xe7, 0x3f, 0xff, 0xff, 0x9d, 0xe5, 0xff, 0xff, 0xb3,
0xfc, 0xe7, 0x9c, 0x82, 0xa3, 0xc3, 0xad, 0x8b, 0x43, 0xcf, 0x0d, 0x5c, 0xff, 0x22, 0xd9, 0x27,
0x4e, 0xe0, 0x77, 0x59, 0x0a, 0x35, 0x0d, 0xe7, 0x20, 0x38, 0x18, 0x12, 0xfd, 0xd4, 0xf0, 0xf9,
0xe0, 0xa2, 0x6d, 0x6d, 0x5d, 0x1c, 0x6e, 0x5d, 0xdc, 0x75, 0x4d, 0x62, 0x87, 0xec, 0x2c, 0x21,
0xd8, 0xf5, 0xb9, 0x81, 0xeb, 0x0e, 0x6c, 0xc2, 0xf3, 0xb6, 0xf6, 0xb6, 0x2f, 0xfa, 0x81, 0xb7,
0xd7, 0x0f, 0x78, 0xee, 0xfc, 0xaf, 0xfc, 0x69, 0x19, 0xea, 0xab, 0x14, 0x1e, 0x5d, 0x86, 0xd6,
0x2e, 0xf1, 0x7d, 0x63, 0x40, 0x7c, 0xad, 0x7c, 0xa2, 0x7a, 0x6e, 0xea, 0xf2, 0xd1, 0xae, 0x28,
0xaa, 0xcb, 0x38, 0xba, 0x8f, 0x78, 0x36, 0x8e, 0xf8, 0xd0, 0x1c, 0xb4, 0xfb, 0xae, 0x13, 0x90,
0x97, 0x41, 0xcf, 0xd4, 0x2a, 0x27, 0xca, 0xe7, 0xda, 0x38, 0x26, 0xa0, 0xab, 0xd0, 0xb6, 0x1c,
0x2b, 0xb0, 0x8c, 0xc0, 0xf5, 0xb4, 0xea, 0x89, 0xb2, 0x02, 0xc9, 0x2a, 0xd9, 0x5d, 0xec, 0xf7,
0xdd, 0x3d, 0x27, 0xc0, 0x31, 0x23, 0xd2, 0xa0, 0x19, 0x78, 0x46, 0x9f, 0xf4, 0x4c, 0xad, 0xc6,
0x10, 0xc3, 0xa4, 0xfe, 0x27, 0x5d, 0x68, 0x8a, 0x3a, 0xa0, 0x3b, 0x30, 0x65, 0x70, 0xd9, 0xcd,
0x1d, 0xf7, 0x85, 0x56, 0x66, 0xe8, 0xc7, 0x12, 0x15, 0x16, 0xe8, 0x5d, 0xca, 0xb2, 0x56, 0xc2,
0xb2, 0x04, 0xea, 0xc1, 0xac, 0x48, 0xae, 0x90, 0xc0, 0xb0, 0x6c, 0x5f, 0xfb, 0x6b, 0x0e, 0x72,
0x3c, 0x07, 0x44, 0xb0, 0xad, 0x95, 0x70, 0x42, 0x10, 0x7d, 0x0e, 0x5e, 0x11, 0x94, 0x65, 0xd7,
0xd9, 0xb6, 0x06, 0x4f, 0x87, 0xa6, 0x11, 0x10, 0xed, 0x6f, 0x38, 0xde, 0xa9, 0x1c, 0x3c, 0xce,
0xdb, 0xe5, 0xcc, 0x6b, 0x25, 0x9c, 0x85, 0x81, 0xee, 0xc1, 0x8c, 0x20, 0x0b, 0xd0, 0xbf, 0xe5,
0xa0, 0x6f, 0xe4, 0x80, 0x46, 0x68, 0xaa, 0x18, 0xfa, 0x3c, 0x1c, 0x11, 0x84, 0x87, 0x96, 0xf3,
0x7c, 0x79, 0xc7, 0xb0, 0x6d, 0xe2, 0x0c, 0x88, 0xf6, 0x77, 0xa3, 0xeb, 0xa8, 0x30, 0xaf, 0x95,
0x70, 0x26, 0x08, 0x7a, 0x0c, 0x1d, 0x77, 0xeb, 0xcb, 0xa4, 0x1f, 0x76, 0xc8, 0x26, 0x09, 0xb4,
0x0e, 0xc3, 0x7d, 0x2b, 0x81, 0xfb, 0x98, 0xb1, 0x85, 0x5d, 0xd9, 0xdd, 0x24, 0xc1, 0x5a, 0x09,
0xa7, 0x84, 0xd1, 0x53, 0x40, 0x0a, 0x6d, 0x71, 0x97, 0x38, 0xa6, 0x76, 0x99, 0x41, 0x9e, 0x1c,
0x0d, 0xc9, 0x58, 0xd7, 0x4a, 0x38, 0x03, 0x20, 0x05, 0xfb, 0xd4, 0xf1, 0x49, 0xa0, 0x5d, 0x19,
0x07, 0x96, 0xb1, 0xa6, 0x60, 0x19, 0x95, 0xf6, 0x2d, 0xa7, 0x62, 0x62, 0x1b, 0x81, 0xe5, 0x3a,
0xa2, 0xbe, 0x57, 0x19, 0xf0, 0xe9, 0x6c, 0xe0, 0x88, 0x37, 0xaa, 0x71, 0x26, 0x08, 0xfa, 0x22,
0xbc, 0x9a, 0xa0, 0x63, 0xb2, 0xeb, 0xee, 0x13, 0xed, 0x1a, 0x43, 0x3f, 0x53, 0x84, 0xce, 0xb9,
0xd7, 0x4a, 0x38, 0x1b, 0x06, 0x2d, 0xc1, 0x74, 0x98, 0xc1, 0x60, 0xaf, 0x33, 0xd8, 0xb9, 0x3c,
0x58, 0x01, 0xa6, 0xc8, 0x50, 0x5f, 0xe4, 0xe9, 0x65, 0xdb, 0xf5, 0x89, 0xb6, 0x98, 0xe9, 0x8b,
0x02, 0x82, 0xb1, 0x50, 0x5f, 0x94, 0x24, 0xe4, 0x46, 0xfa, 0x81, 0x67, 0xf5, 0x59, 0x05, 0xa9,
0x15, 0x2d, 0x8c, 0x6e, 0x64, 0xcc, 0x2c, 0x4c, 0x29, 0x1b, 0x06, 0x61, 0x38, 0xe4, 0xef, 0x6d,
0xf9, 0x7d, 0xcf, 0x1a, 0x52, 0xda, 0xa2, 0x69, 0x6a, 0xb7, 0x46, 0x21, 0x6f, 0x4a, 0xcc, 0xdd,
0x45, 0x93, 0x6a, 0x27, 0x09, 0x80, 0x3e, 0x0f, 0x48, 0x26, 0x89, 0xee, 0x7b, 0x8f, 0xc1, 0x7e,
0x6a, 0x0c, 0xd8, 0xa8, 0x2f, 0x33, 0x60, 0x90, 0x01, 0x47, 0x64, 0xea, 0x86, 0xeb, 0x5b, 0xf4,
0x57, 0xbb, 0xcd, 0xe0, 0xdf, 0x1e, 0x03, 0x3e, 0x14, 0xa1, 0x86, 0x95, 0x05, 0x95, 0x2c, 0x62,
0x99, 0xba, 0x35, 0xf1, 0x7c, 0xed, 0xce, 0xd8, 0x45, 0x84, 0x22, 0xc9, 0x22, 0x42, 0x7a, 0xb2,
0x8b, 0xde, 0xf7, 0xdc, 0xbd, 0xa1, 0xaf, 0xdd, 0x1d, 0xbb, 0x8b, 0xb8, 0x40, 0xb2, 0x8b, 0x38,
0x15, 0x5d, 0x87, 0xd6, 0x96, 0xed, 0xf6, 0x9f, 0x53, 0x65, 0x56, 0x18, 0xa4, 0x96, 0x80, 0x5c,
0xa2, 0xd9, 0x42, 0x7d, 0x11, 0x2f, 0x35, 0x56, 0xf6, 0x7f, 0x85, 0xd8, 0x24, 0x20, 0x62, 0x5a,
0x3a, 0x96, 0x29, 0xca, 0x59, 0xa8, 0xb1, 0x4a, 0x12, 0x68, 0x05, 0xa6, 0xb6, 0x2d, 0x9b, 0xf8,
0x4f, 0x87, 0xb6, 0x6b, 0xf0, 0x39, 0x6a, 0xea, 0xf2, 0x89, 0x4c, 0x80, 0x7b, 0x31, 0x1f, 0x45,
0x91, 0xc4, 0xd0, 0x6d, 0x68, 0xef, 0x1a, 0xde, 0x73, 0xbf, 0xe7, 0x6c, 0xbb, 0x5a, 0x3d, 0x73,
0xe2, 0xe1, 0x18, 0x8f, 0x42, 0xae, 0xb5, 0x12, 0x8e, 0x45, 0xe8, 0xf4, 0xc5, 0x2a, 0xb5, 0x49,
0x82, 0x7b, 0x16, 0xb1, 0x4d, 0x5f, 0x6b, 0x30, 0x90, 0x37, 0x33, 0x41, 0x36, 0x49, 0xd0, 0xe5,
0x6c, 0x74, 0xfa, 0x52, 0x05, 0xd1, 0x07, 0xf0, 0x4a, 0x48, 0x59, 0xde, 0xb1, 0x6c, 0xd3, 0x23,
0x4e, 0xcf, 0xf4, 0xb5, 0x66, 0xe6, 0xcc, 0x10, 0xe3, 0x49, 0xbc, 0x74, 0xf6, 0xca, 0x80, 0xa0,
0x23, 0x63, 0x48, 0x96, 0x5d, 0x52, 0x6b, 0x65, 0x8e, 0x8c, 0x31, 0xb4, 0xcc, 0x4c, 0xad, 0x2b,
0x0b, 0x04, 0x99, 0xf0, 0x5a, 0x48, 0x5f, 0x32, 0xfa, 0xcf, 0x07, 0x9e, 0xbb, 0xe7, 0x98, 0xcb,
0xae, 0xed, 0x7a, 0x5a, 0x9b, 0xe1, 0x9f, 0xcb, 0xc5, 0x4f, 0xf0, 0xaf, 0x95, 0x70, 0x1e, 0x14,
0x5a, 0x86, 0xe9, 0x30, 0xeb, 0x09, 0x79, 0x19, 0x68, 0x90, 0x39, 0xfd, 0xc6, 0xd0, 0x94, 0x89,
0x0e, 0x90, 0xb2, 0x90, 0x0c, 0x42, 0x4d, 0x42, 0x9b, 0x2a, 0x00, 0xa1, 0x4c, 0x32, 0x08, 0x4d,
0xcb, 0x20, 0x74, 0xfa, 0xd5, 0x66, 0x0a, 0x40, 0x28, 0x93, 0x0c, 0x42, 0xd3, 0x74, 0xaa, 0x8e,
0x5a, 0xea, 0xba, 0xcf, 0xa9, 0x3d, 0x69, 0xb3, 0x99, 0x53, 0xb5, 0xd4, 0x5b, 0x82, 0x91, 0x4e,
0xd5, 0x49, 0x61, 0xba, 0x40, 0x09, 0x69, 0x8b, 0xb6, 0x35, 0x70, 0xb4, 0x43, 0x23, 0x6c, 0x99,
0xa2, 0x31, 0x2e, 0xba, 0x40, 0x51, 0xc4, 0xd0, 0x5d, 0xe1, 0x96, 0x9b, 0x24, 0x58, 0xb1, 0xf6,
0xb5, 0xc3, 0x99, 0xd3, 0x50, 0x8c, 0xb2, 0x62, 0xed, 0x47, 0x7e, 0xc9, 0x45, 0xe4, 0xa6, 0x85,
0x93, 0x9c, 0xf6, 0x6a, 0x41, 0xd3, 0x42, 0x46, 0xb9, 0x69, 0x21, 0x4d, 0x6e, 0xda, 0x43, 0x23,
0x20, 0x2f, 0xb5, 0xd7, 0x0b, 0x9a, 0xc6, 0xb8, 0xe4, 0xa6, 0x31, 0x02, 0x9d, 0xdd, 0x42, 0xc2,
0x33, 0xe2, 0x05, 0x56, 0xdf, 0xb0, 0x79, 0x57, 0x9d, 0xca, 0x9c, 0x83, 0x62, 0x3c, 0x85, 0x9b,
0xce, 0x6e, 0x99, 0x30, 0x72, 0xc3, 0x9f, 0x18, 0x5b, 0x36, 0xc1, 0xee, 0x0b, 0xed, 0x74, 0x41,
0xc3, 0x43, 0x46, 0xb9, 0xe1, 0x21, 0x4d, 0x1e, 0x5b, 0x3e, 0x6b, 0x99, 0x03, 0x12, 0x68, 0xe7,
0x0a, 0xc6, 0x16, 0xce, 0x26, 0x8f, 0x2d, 0x9c, 0x12, 0x8d, 0x00, 0x2b, 0x46, 0x60, 0xec, 0x5b,
0xe4, 0xc5, 0x33, 0x8b, 0xbc, 0xa0, 0x13, 0xfb, 0x2b, 0x23, 0x46, 0x80, 0x90, 0xb7, 0x2b, 0x98,
0xa3, 0x11, 0x20, 0x01, 0x12, 0x8d, 0x00, 0x32, 0x5d, 0x0c, 0xeb, 0x47, 0x46, 0x8c, 0x00, 0x0a,
0x7e, 0x34, 0xc6, 0xe7, 0x41, 0x21, 0x03, 0x8e, 0xa6, 0xb2, 0x1e, 0x7b, 0x26, 0xf1, 0xb4, 0x37,
0x58, 0x21, 0x67, 0x8b, 0x0b, 0x61, 0xec, 0x6b, 0x25, 0x9c, 0x03, 0x94, 0x2a, 0x62, 0xd3, 0xdd,
0xf3, 0xfa, 0x84, 0xf6, 0xd3, 0xc9, 0x71, 0x8a, 0x88, 0xd8, 0x53, 0x45, 0x44, 0x39, 0x68, 0x1f,
0xde, 0x88, 0x72, 0x68, 0xc1, 0x6c, 0x16, 0x65, 0xa5, 0x8b, 0x8d, 0xc5, 0x19, 0x56, 0x52, 0x77,
0x74, 0x49, 0x49, 0xa9, 0xb5, 0x12, 0x1e, 0x0d, 0x8b, 0x0e, 0xe0, 0xb8, 0xc2, 0xc0, 0xe7, 0x79,
0xb9, 0xe0, 0xb3, 0xac, 0xe0, 0x8b, 0xa3, 0x0b, 0x4e, 0x89, 0xad, 0x95, 0x70, 0x01, 0x30, 0x1a,
0xc2, 0x31, 0xa5, 0x33, 0x42, 0xc7, 0x16, 0x26, 0xf2, 0xe3, 0xac, 0xdc, 0x0b, 0xa3, 0xcb, 0x55,
0x65, 0xd6, 0x4a, 0x78, 0x14, 0x24, 0x1a, 0x80, 0x96, 0x99, 0x4d, 0x35, 0xf9, 0xb5, 0xcc, 0x65,
0x4f, 0x4e, 0x71, 0x5c, 0x97, 0xb9, 0x60, 0x99, 0x96, 0x2f, 0xba, 0xf3, 0x27, 0xc6, 0xb5, 0xfc,
0xa8, 0x1f, 0xf3, 0xa0, 0x14, 0xdd, 0xd1, 0xac, 0x27, 0x86, 0x37, 0x20, 0x01, 0xef, 0xe8, 0x9e,
0x49, 0x1b, 0xf5, 0xf5, 0x71, 0x74, 0x97, 0x12, 0x53, 0x74, 0x97, 0x09, 0x8c, 0x7c, 0x98, 0x53,
0x38, 0x7a, 0xfe, 0xb2, 0x6b, 0xdb, 0xa4, 0x1f, 0xf6, 0xe6, 0x4f, 0xb2, 0x82, 0xdf, 0x19, 0x5d,
0x70, 0x42, 0x68, 0xad, 0x84, 0x47, 0x82, 0xa6, 0xda, 0xfb, 0xd8, 0x36, 0x13, 0x36, 0xa3, 0x8d,
0x65, 0xab, 0x49, 0xb1, 0x54, 0x7b, 0x53, 0x1c, 0x29, 0x5b, 0x95, 0x38, 0x68, 0x73, 0x5f, 0x1b,
0xc7, 0x56, 0x55, 0x99, 0x94, 0xad, 0xaa, 0xd9, 0x74, 0x76, 0xdb, 0xf3, 0x89, 0xc7, 0x30, 0xee,
0xbb, 0x96, 0xa3, 0xbd, 0x99, 0x39, 0xbb, 0x3d, 0xf5, 0x89, 0x27, 0x0a, 0xa2, 0x5c, 0x74, 0x76,
0x53, 0xc4, 0x14, 0x9c, 0x87, 0x64, 0x3b, 0xd0, 0x4e, 0x14, 0xe1, 0x50, 0x2e, 0x05, 0x87, 0x12,
0xe8, 0x4c, 0x11, 0x11, 0x36, 0x09, 0xd5, 0x0a, 0x36, 0x9c, 0x01, 0xd1, 0xde, 0xca, 0x9c, 0x29,
0x24, 0x38, 0x89, 0x99, 0xce, 0x14, 0x59, 0x20, 0x74, 0xe7, 0x1f, 0xd1, 0xe9, 0x8a, 0x8c, 0x43,
0xcf, 0x67, 0xee, 0xfc, 0x25, 0xe8, 0x88, 0x95, 0xee, 0x41, 0xd2, 0x00, 0xe8, 0x53, 0x50, 0x1b,
0x5a, 0xce, 0x40, 0x33, 0x19, 0xd0, 0x2b, 0x09, 0xa0, 0x0d, 0xcb, 0x19, 0xac, 0x95, 0x30, 0x63,
0x41, 0xb7, 0x00, 0x86, 0x9e, 0xdb, 0x27, 0xbe, 0xbf, 0x4e, 0x5e, 0x68, 0x84, 0x09, 0xe8, 0x49,
0x01, 0xce, 0xd0, 0x5d, 0x27, 0x74, 0x5e, 0x96, 0xf8, 0xd1, 0x2a, 0xcc, 0x88, 0x94, 0xf0, 0xf2,
0xed, 0xcc, 0xc5, 0x5f, 0x08, 0x10, 0x47, 0x81, 0x14, 0x29, 0xba, 0xf7, 0x11, 0x84, 0x15, 0xd7,
0x21, 0xda, 0x20, 0x73, 0xef, 0x13, 0x82, 0x50, 0x16, 0xba, 0xc6, 0x92, 0x24, 0xd0, 0x12, 0x4c,
0x07, 0x3b, 0x1e, 0x31, 0xcc, 0xcd, 0xc0, 0x08, 0xf6, 0x7c, 0xcd, 0xc9, 0x5c, 0xa6, 0xf1, 0xcc,
0xee, 0x13, 0xc6, 0x49, 0x97, 0xa0, 0xb2, 0x0c, 0x5a, 0x87, 0x0e, 0xdd, 0x08, 0x3d, 0xb4, 0x76,
0xad, 0x00, 0x13, 0xa3, 0xbf, 0x43, 0x4c, 0xcd, 0xcd, 0xdc, 0x44, 0xd1, 0x65, 0x6f, 0x57, 0xe6,
0xa3, 0xab, 0x95, 0xa4, 0x2c, 0x5a, 0x83, 0x59, 0x4a, 0xdb, 0x1c, 0x1a, 0x7d, 0xf2, 0xd4, 0x37,
0x06, 0x44, 0x1b, 0x66, 0x5a, 0x20, 0x43, 0x8b, 0xb9, 0xe8, 0x62, 0x45, 0x95, 0x0b, 0x91, 0x1e,
0xba, 0x7d, 0xc3, 0xe6, 0x48, 0x5f, 0xc9, 0x47, 0x8a, 0xb9, 0x42, 0xa4, 0x98, 0xa2, 0xb4, 0x91,
0xf7, 0xbd, 0xa9, 0xed, 0x17, 0xb4, 0x51, 0xf0, 0x29, 0x6d, 0x14, 0x34, 0x8a, 0xe7, 0xb8, 0x81,
0xb5, 0x6d, 0xf5, 0x85, 0xff, 0x3a, 0xa6, 0xe6, 0x65, 0xe2, 0xad, 0x4b, 0x6c, 0xdd, 0x4d, 0x1e,
0x59, 0x4a, 0xc9, 0xa2, 0x27, 0x80, 0x64, 0x9a, 0x30, 0x2a, 0x9f, 0x21, 0xce, 0x8f, 0x42, 0x8c,
0x2c, 0x2b, 0x43, 0x9e, 0xd6, 0x72, 0x68, 0x1c, 0xd0, 0xed, 0xed, 0x92, 0xe7, 0x1a, 0x66, 0xdf,
0xf0, 0x03, 0x2d, 0xc8, 0xac, 0xe5, 0x06, 0x67, 0xeb, 0x46, 0x7c, 0xb4, 0x96, 0x49, 0x59, 0x8a,
0xb7, 0x4b, 0x76, 0xb7, 0x88, 0xe7, 0xef, 0x58, 0x43, 0x51, 0xc7, 0xbd, 0x4c, 0xbc, 0x47, 0x11,
0x5b, 0x5c, 0xc3, 0x94, 0x2c, 0x5d, 0x88, 0xfb, 0x54, 0xdb, 0x9b, 0x07, 0x4e, 0x9f, 0x1b, 0xa3,
0x00, 0x7d, 0x91, 0xb9, 0x10, 0x67, 0x96, 0xd1, 0x8d, 0x99, 0x63, 0xe8, 0x6c, 0x18, 0xf4, 0x00,
0x0e, 0x0d, 0x2f, 0x0f, 0x15, 0xe4, 0x97, 0x99, 0x0b, 0xe7, 0x8d, 0xcb, 0x1b, 0x49, 0xc8, 0xa4,
0x24, 0x75, 0x35, 0x6b, 0x77, 0xe8, 0x7a, 0xc1, 0x3d, 0xcb, 0xb1, 0xfc, 0x1d, 0xed, 0x20, 0xd3,
0xd5, 0x7a, 0x8c, 0xa5, 0xcb, 0x79, 0xa8, 0xab, 0xc9, 0x32, 0x4b, 0x4d, 0xa8, 0xef, 0x1b, 0xf6,
0x1e, 0xd1, 0xff, 0xa8, 0x0e, 0x4d, 0x11, 0xd3, 0xd5, 0xd7, 0xa1, 0xc6, 0x02, 0xe0, 0x47, 0xa0,
0x6e, 0x39, 0x26, 0x79, 0xc9, 0x62, 0xe7, 0x75, 0xcc, 0x13, 0xe8, 0x12, 0x34, 0x45, 0x8c, 0x57,
0x44, 0x55, 0xf2, 0x22, 0xf6, 0x21, 0x9b, 0xfe, 0x21, 0x34, 0xc3, 0x40, 0xf8, 0x1c, 0xb4, 0x87,
0x9e, 0x4b, 0xad, 0xb7, 0x67, 0x32, 0xd8, 0x36, 0x8e, 0x09, 0xe8, 0x5d, 0x68, 0x9a, 0x22, 0xd4,
0xce, 0xa1, 0x5f, 0xeb, 0xf2, 0xb3, 0x89, 0x6e, 0x78, 0x36, 0xd1, 0xdd, 0x64, 0x67, 0x13, 0x38,
0xe4, 0xd3, 0xbf, 0x51, 0x86, 0x06, 0x8f, 0x87, 0xeb, 0xfb, 0xd0, 0x10, 0x3d, 0x73, 0x0d, 0x1a,
0x7d, 0x46, 0xd3, 0x92, 0xb1, 0x70, 0xa5, 0x86, 0x22, 0xc0, 0x8e, 0x05, 0x33, 0x15, 0xf3, 0xf9,
0xa8, 0x55, 0x19, 0x29, 0xc6, 0xb5, 0x80, 0x05, 0xf3, 0xff, 0x58, 0xb9, 0xff, 0x59, 0x86, 0x19,
0x35, 0xcc, 0x3e, 0x07, 0xed, 0x7e, 0x14, 0xb8, 0x17, 0xbd, 0xdb, 0x97, 0x82, 0xf0, 0xd0, 0xb7,
0x2d, 0xe2, 0x04, 0x2c, 0xa2, 0x54, 0xc9, 0x5c, 0xa8, 0x64, 0x86, 0xf5, 0xbb, 0xcb, 0x91, 0x18,
0x96, 0x20, 0xf4, 0xaf, 0x03, 0xc4, 0x39, 0xe8, 0x44, 0x34, 0x75, 0xac, 0x1b, 0xbb, 0x61, 0xf1,
0x32, 0x49, 0xe2, 0xd8, 0x30, 0x82, 0x1d, 0x71, 0x1a, 0x24, 0x93, 0xd0, 0x05, 0x38, 0xec, 0x5b,
0x03, 0xc7, 0x08, 0xf6, 0x3c, 0xf2, 0x8c, 0x78, 0xd6, 0xb6, 0x45, 0x4c, 0x16, 0x80, 0x6b, 0xe1,
0x74, 0x86, 0xfe, 0xf3, 0x6d, 0x68, 0xf0, 0x25, 0xa1, 0xfe, 0xef, 0x95, 0xc8, 0xc6, 0xf4, 0xbf,
0x28, 0x43, 0x9d, 0x87, 0xc6, 0x67, 0xa1, 0x62, 0x85, 0x66, 0x56, 0xb1, 0x4c, 0x74, 0x4f, 0xb6,
0xaf, 0x6a, 0xc6, 0x7a, 0x29, 0xeb, 0xa8, 0xa0, 0xfb, 0x80, 0x1c, 0x3c, 0xa3, 0x3e, 0x12, 0x19,
0x1d, 0x3a, 0x0a, 0x0d, 0x7f, 0x6f, 0xab, 0x67, 0xfa, 0x5a, 0xf5, 0x44, 0xf5, 0x5c, 0x1b, 0x8b,
0x94, 0x7e, 0x1f, 0x5a, 0x21, 0x33, 0xea, 0x40, 0xf5, 0x39, 0x39, 0x10, 0x85, 0xd3, 0xbf, 0xe8,
0x82, 0xf0, 0xb5, 0xc8, 0x6d, 0x92, 0xb6, 0xcd, 0x4b, 0x11, 0x0e, 0xf9, 0x25, 0xa8, 0xd2, 0x45,
0x58, 0xb2, 0x09, 0x93, 0xbb, 0x48, 0x6e, 0x6d, 0x97, 0xa1, 0xce, 0x8f, 0x27, 0x92, 0x65, 0x20,
0xa8, 0x3d, 0x27, 0x07, 0xbc, 0x8f, 0xda, 0x98, 0xfd, 0xcf, 0x05, 0xf9, 0xf3, 0x2a, 0x4c, 0xcb,
0x21, 0x59, 0x7d, 0x15, 0xaa, 0x8b, 0x66, 0xba, 0xeb, 0x35, 0x68, 0x1a, 0xdb, 0x01, 0xf1, 0xa2,
0x53, 0xc0, 0x30, 0x49, 0x47, 0x19, 0x86, 0xc5, 0xf4, 0xdc, 0xc6, 0x3c, 0xa1, 0x77, 0xa1, 0x21,
0x22, 0xdd, 0x49, 0xa4, 0x88, 0xbf, 0x22, 0xf3, 0xdf, 0x87, 0x56, 0x14, 0xb8, 0xfe, 0xb8, 0x65,
0x7b, 0xd0, 0x8a, 0x22, 0xd4, 0x47, 0xa0, 0x1e, 0xb8, 0x81, 0x61, 0x33, 0xb8, 0x2a, 0xe6, 0x09,
0xea, 0x68, 0x0e, 0x79, 0x19, 0x2c, 0x47, 0xa3, 0x60, 0x15, 0xc7, 0x04, 0x3e, 0xc8, 0x91, 0x7d,
0x9e, 0x5b, 0xe5, 0xb9, 0x11, 0x21, 0x2e, 0xb3, 0x26, 0x97, 0x79, 0x00, 0x0d, 0x11, 0xb6, 0x8e,
0xf2, 0xcb, 0x52, 0x3e, 0x5a, 0x84, 0xfa, 0x80, 0xe6, 0x0b, 0xad, 0xbf, 0x9d, 0x18, 0x22, 0xf8,
0x6a, 0x74, 0xd9, 0x75, 0x02, 0x6a, 0xc6, 0xea, 0x6e, 0x1c, 0x73, 0x49, 0xaa, 0x42, 0x8f, 0x9f,
0x41, 0x70, 0x8f, 0x12, 0x29, 0xfd, 0x77, 0xcb, 0xd0, 0x8e, 0x0e, 0x7d, 0xf4, 0x0f, 0xf3, 0x9c,
0x67, 0x11, 0x66, 0x3c, 0xc1, 0x45, 0x47, 0x87, 0xd0, 0x85, 0x8e, 0x25, 0x6a, 0x82, 0x25, 0x1e,
0xac, 0x4a, 0xe8, 0xb7, 0x72, 0x95, 0x3a, 0x0f, 0xd3, 0x21, 0xeb, 0x83, 0xd8, 0xf4, 0x14, 0x9a,
0xae, 0x47, 0xd2, 0x1d, 0xa8, 0x5a, 0x26, 0x3f, 0x83, 0x6e, 0x63, 0xfa, 0x57, 0xdf, 0x86, 0x69,
0x39, 0xf4, 0xab, 0x3f, 0xcb, 0xf6, 0x9e, 0x3b, 0xb4, 0x18, 0x29, 0xcc, 0x5c, 0x49, 0xac, 0x6f,
0xc3, 0x26, 0xc4, 0x2c, 0x58, 0x11, 0xd0, 0x5f, 0x83, 0x3a, 0x3f, 0x90, 0x4a, 0x20, 0xeb, 0xbf,
0xd1, 0x87, 0x3a, 0x53, 0x82, 0x7e, 0x85, 0x3b, 0xc0, 0x05, 0x68, 0xb0, 0xcd, 0x55, 0x78, 0x54,
0x7e, 0x24, 0x4b, 0x63, 0x58, 0xf0, 0xe8, 0xcb, 0x30, 0x25, 0x1d, 0x05, 0x50, 0x8b, 0x65, 0x19,
0x91, 0x15, 0x84, 0x49, 0xa4, 0x43, 0x8b, 0x4e, 0x96, 0x62, 0x00, 0xa5, 0xed, 0x8f, 0xd2, 0xfa,
0x29, 0x68, 0x88, 0xcd, 0xa2, 0x2e, 0x8e, 0x3e, 0x7a, 0x51, 0x2f, 0x45, 0x69, 0xfd, 0x0b, 0xd0,
0x8e, 0x4e, 0x0c, 0xd0, 0x63, 0x98, 0x16, 0x27, 0x06, 0x7c, 0xc3, 0x43, 0x99, 0x67, 0x0b, 0xac,
0x8b, 0xee, 0x6e, 0xd8, 0xa1, 0x43, 0xf7, 0xc9, 0xc1, 0x90, 0x60, 0x05, 0x40, 0xff, 0xd9, 0x73,
0xac, 0xe7, 0xf5, 0x21, 0xb4, 0xa2, 0x30, 0x69, 0x52, 0x0b, 0x0b, 0x7c, 0x68, 0xac, 0x14, 0xc6,
0xf8, 0xb9, 0x3c, 0x1d, 0x80, 0xd9, 0x08, 0xaa, 0x1f, 0x83, 0xea, 0x03, 0x72, 0x40, 0x3d, 0x84,
0x0f, 0xa4, 0xc2, 0x43, 0xf8, 0x80, 0xd9, 0x83, 0x86, 0x38, 0xae, 0x48, 0x96, 0x77, 0x11, 0x1a,
0xdb, 0xfc, 0x04, 0xa4, 0x60, 0xc8, 0x14, 0x6c, 0xfa, 0x1d, 0x98, 0x92, 0x0f, 0x29, 0x92, 0x78,
0x27, 0x60, 0xaa, 0x2f, 0x1d, 0x83, 0x70, 0x35, 0xc8, 0x24, 0x9d, 0xa8, 0xe6, 0x98, 0x42, 0x58,
0xcd, 0xb4, 0xc3, 0xb7, 0x32, 0xbb, 0x7d, 0x84, 0x35, 0x3e, 0x80, 0x43, 0xc9, 0xd3, 0x88, 0x64,
0x49, 0xe7, 0xe0, 0xd0, 0x56, 0xe2, 0xec, 0x83, 0x8f, 0x81, 0x49, 0xb2, 0xde, 0x83, 0x3a, 0x8f,
0x16, 0x27, 0x21, 0x2e, 0x41, 0xdd, 0x60, 0xd1, 0x68, 0x2a, 0x38, 0x2b, 0xed, 0x49, 0xe5, 0x5a,
0x32, 0x51, 0xcc, 0x19, 0x75, 0x0b, 0x66, 0xd4, 0x00, 0x74, 0x12, 0x72, 0x0d, 0x66, 0xf6, 0x95,
0x40, 0x37, 0x87, 0x9e, 0xcf, 0x84, 0x56, 0xa0, 0xb0, 0x2a, 0xa8, 0xff, 0x54, 0x03, 0x6a, 0xec,
0x04, 0x25, 0x59, 0xc4, 0x75, 0xa8, 0x05, 0xe4, 0x65, 0xb8, 0x46, 0x9d, 0x1f, 0x79, 0x1c, 0xc3,
0xb7, 0xf1, 0x8c, 0x1f, 0x7d, 0x1a, 0xea, 0x7e, 0x70, 0x60, 0x87, 0xe7, 0x7e, 0x27, 0x47, 0x0b,
0x6e, 0x52, 0x56, 0xcc, 0x25, 0xa8, 0x28, 0xf3, 0x05, 0x71, 0xe2, 0x57, 0x20, 0xca, 0x9c, 0x10,
0x73, 0x09, 0x74, 0x07, 0x9a, 0xfd, 0x1d, 0xd2, 0x7f, 0x4e, 0x4c, 0x71, 0xd4, 0x77, 0x7a, 0xb4,
0xf0, 0x32, 0x67, 0xc6, 0xa1, 0x14, 0x2d, 0xbb, 0xcf, 0xb4, 0xdb, 0x18, 0xa7, 0x6c, 0xa6, 0x71,
0xcc, 0x25, 0xd0, 0x2a, 0xb4, 0xad, 0xbe, 0xeb, 0xac, 0xee, 0xba, 0x5f, 0xb6, 0xc4, 0x99, 0xde,
0xd9, 0xd1, 0xe2, 0xbd, 0x90, 0x1d, 0xc7, 0x92, 0x21, 0x4c, 0x6f, 0x97, 0x6e, 0x8b, 0x5b, 0xe3,
0xc2, 0x30, 0x76, 0x1c, 0x4b, 0xea, 0x73, 0x42, 0x9f, 0xd9, 0x4e, 0x7e, 0x0f, 0xea, 0xac, 0xcb,
0xd1, 0x7b, 0x72, 0xf6, 0xac, 0x54, 0x52, 0xee, 0x88, 0x25, 0x54, 0x15, 0xe1, 0xb0, 0xfe, 0x57,
0x71, 0xa6, 0xc6, 0xc1, 0x11, 0x7a, 0xe3, 0x38, 0x6f, 0x42, 0x53, 0xa8, 0x42, 0xad, 0x70, 0x2b,
0x64, 0x78, 0x03, 0xea, 0xdc, 0x31, 0xb3, 0xdb, 0xf3, 0x16, 0xb4, 0xa3, 0xce, 0x1c, 0xcd, 0xc2,
0x7a, 0x27, 0x87, 0xe5, 0xe7, 0x2a, 0x50, 0xe7, 0x27, 0x49, 0xe9, 0xa1, 0x56, 0xf6, 0x82, 0x93,
0xa3, 0x0f, 0xa6, 0x64, 0x37, 0xb8, 0xc7, 0x36, 0x6a, 0x74, 0x61, 0x1e, 0xdd, 0xcc, 0x3a, 0x57,
0x20, 0xbd, 0x11, 0xf2, 0xe3, 0x58, 0xb4, 0x40, 0x9d, 0x8f, 0xa1, 0x1d, 0x49, 0xa1, 0x25, 0x55,
0xa5, 0x17, 0x46, 0xaa, 0x22, 0x59, 0xa4, 0x00, 0xfc, 0x66, 0x19, 0xaa, 0x2b, 0xd6, 0x7e, 0xaa,
0x1f, 0x6e, 0x84, 0x5e, 0x5d, 0x34, 0x1c, 0xac, 0x58, 0xfb, 0x8a, 0x53, 0xeb, 0xab, 0xa1, 0xc5,
0xdd, 0x52, 0xab, 0x77, 0x66, 0xf4, 0x0a, 0x2c, 0x86, 0xe1, 0x15, 0xfb, 0xa5, 0x26, 0xd4, 0xd8,
0x21, 0x6d, 0xd6, 0x38, 0x75, 0x30, 0x2c, 0xae, 0x18, 0x0b, 0x03, 0xb1, 0x09, 0x97, 0xf1, 0xf3,
0x71, 0xca, 0x08, 0x8a, 0xc7, 0x29, 0x1e, 0xd5, 0xa2, 0xac, 0x98, 0x4b, 0xd0, 0x22, 0x77, 0xad,
0x5d, 0x22, 0x86, 0xa9, 0x82, 0x22, 0x1f, 0x59, 0xbb, 0x04, 0x33, 0x7e, 0x2a, 0xb7, 0x63, 0xf8,
0x3b, 0x62, 0x84, 0x2a, 0x90, 0x5b, 0x33, 0xfc, 0x1d, 0xcc, 0xf8, 0xa9, 0x9c, 0x43, 0xb7, 0x84,
0x8d, 0x71, 0xe4, 0xe8, 0x4e, 0x11, 0x33, 0x7e, 0x2a, 0xe7, 0x5b, 0x5f, 0x25, 0x62, 0x4c, 0x2a,
0x90, 0xdb, 0xb4, 0xbe, 0x4a, 0x30, 0xe3, 0x8f, 0x87, 0xf0, 0xd6, 0x78, 0x5d, 0x23, 0x0d, 0xe1,
0x4f, 0x60, 0x36, 0x50, 0x8e, 0x1a, 0xc4, 0x4d, 0x81, 0x0b, 0x05, 0x7a, 0x51, 0x64, 0x70, 0x02,
0x83, 0x3a, 0x01, 0xdb, 0x00, 0x67, 0x3b, 0xc1, 0x1b, 0x50, 0xff, 0xac, 0x65, 0x06, 0x3b, 0x6a,
0x76, 0x5d, 0x19, 0xf2, 0xa8, 0xda, 0x26, 0x1a, 0xf2, 0x64, 0xad, 0x73, 0x9c, 0x15, 0xa8, 0x51,
0xf3, 0x99, 0xcc, 0x8e, 0x63, 0xab, 0xfb, 0x58, 0x03, 0xb0, 0xdc, 0xd1, 0x1c, 0x67, 0x0e, 0x6a,
0xd4, 0x42, 0x72, 0xba, 0x64, 0x0e, 0x6a, 0xd4, 0xee, 0xf2, 0x73, 0xa9, 0xb6, 0xd5, 0xdc, 0x6a,
0x98, 0x7b, 0x06, 0x66, 0x55, 0x75, 0xe4, 0xa0, 0xfc, 0x59, 0x13, 0x6a, 0xec, 0xc6, 0x43, 0xd2,
0x23, 0x7f, 0x0c, 0x66, 0xb8, 0xfe, 0x96, 0xc4, 0x12, 0xbc, 0x92, 0x79, 0xe1, 0x49, 0xbd, 0x47,
0x21, 0x4c, 0x40, 0x88, 0x60, 0x15, 0x61, 0xfc, 0x45, 0x05, 0x83, 0x52, 0x2c, 0xf2, 0x56, 0xb4,
0x78, 0xad, 0x15, 0x5c, 0xb7, 0x61, 0xb2, 0x7c, 0x09, 0x1c, 0xae, 0x64, 0xd1, 0x12, 0xb4, 0xe8,
0xd4, 0x4a, 0xbb, 0x4b, 0xb8, 0xed, 0x99, 0xd1, 0xf2, 0x3d, 0xc1, 0x8d, 0x23, 0x39, 0x3a, 0xb1,
0xf7, 0x0d, 0xcf, 0x64, 0xb5, 0x12, 0x3e, 0x7c, 0x76, 0x34, 0xc8, 0x72, 0xc8, 0x8e, 0x63, 0x49,
0xf4, 0x00, 0xa6, 0x4c, 0x12, 0xc5, 0x09, 0x84, 0x53, 0x7f, 0x6a, 0x34, 0xd0, 0x4a, 0x2c, 0x80,
0x65, 0x69, 0x5a, 0xa7, 0x70, 0x6f, 0xe8, 0x17, 0x2e, 0x36, 0x18, 0x54, 0x7c, 0xad, 0x31, 0x96,
0xd4, 0x4f, 0xc3, 0x8c, 0xa2, 0xb7, 0x4f, 0x74, 0xd5, 0x21, 0xeb, 0x92, 0xe3, 0x2c, 0x44, 0x5b,
0x94, 0x77, 0xd4, 0x65, 0x47, 0xee, 0x8e, 0x44, 0x08, 0x3e, 0x84, 0x56, 0xa8, 0x18, 0x74, 0x57,
0xad, 0xc3, 0xf9, 0xe2, 0x3a, 0x44, 0x3a, 0x15, 0x68, 0xeb, 0xd0, 0x8e, 0x34, 0x84, 0x16, 0x55,
0xb8, 0xb7, 0x8b, 0xe1, 0x62, 0xed, 0x0a, 0x3c, 0x0c, 0x53, 0x92, 0xa2, 0xd0, 0xb2, 0x8a, 0xf8,
0x4e, 0x31, 0xa2, 0xac, 0xe6, 0x78, 0xd5, 0x13, 0x69, 0x4c, 0xd6, 0x4a, 0x35, 0xd6, 0xca, 0x1f,
0x36, 0xa1, 0x15, 0xdd, 0x32, 0xca, 0xd8, 0x63, 0xee, 0x79, 0x76, 0xe1, 0x1e, 0x33, 0x94, 0xef,
0x3e, 0xf5, 0x6c, 0x4c, 0x25, 0xa8, 0x8a, 0x03, 0x2b, 0x88, 0x5c, 0xf5, 0x6c, 0xb1, 0xe8, 0x13,
0xca, 0x8e, 0xb9, 0x14, 0x7a, 0xac, 0x5a, 0x79, 0x6d, 0xc4, 0x29, 0xb4, 0x02, 0x92, 0x6b, 0xe9,
0x3d, 0x68, 0x5b, 0x74, 0xe9, 0xb7, 0x16, 0xcf, 0xbc, 0x6f, 0x17, 0xc3, 0xf5, 0x42, 0x11, 0x1c,
0x4b, 0xd3, 0xba, 0x6d, 0x1b, 0xfb, 0xd4, 0xaf, 0x19, 0x58, 0x63, 0xdc, 0xba, 0xdd, 0x8b, 0x85,
0xb0, 0x8c, 0x80, 0x6e, 0x8a, 0xb5, 0x4b, 0xb3, 0x60, 0x64, 0x89, 0xbb, 0x2a, 0x5e, 0xbf, 0x7c,
0x90, 0x9a, 0x69, 0xb9, 0x1b, 0x5f, 0x1a, 0x03, 0x65, 0xe4, 0x6c, 0x4b, 0x35, 0xc8, 0x57, 0x46,
0xed, 0x71, 0x35, 0x28, 0xaf, 0x8e, 0xf4, 0x63, 0x50, 0x7d, 0xea, 0xd9, 0xf9, 0x73, 0x35, 0x53,
0x77, 0x4e, 0xf6, 0x49, 0xd5, 0x13, 0xf2, 0x17, 0xf4, 0x91, 0x4e, 0x72, 0x71, 0xa4, 0x4e, 0xcf,
0x61, 0x7a, 0x4f, 0x4c, 0xe8, 0xd7, 0x54, 0x7f, 0x7b, 0x33, 0xe1, 0x6f, 0xd4, 0xc3, 0x36, 0x3c,
0xc2, 0x2f, 0x5a, 0x48, 0x33, 0xf9, 0xb8, 0xf3, 0xe4, 0xfd, 0x70, 0xfd, 0x31, 0xd1, 0x48, 0x91,
0xec, 0x5b, 0x8e, 0xf5, 0x33, 0x65, 0x68, 0x45, 0x97, 0xc8, 0xd2, 0xd1, 0xf9, 0x96, 0xe5, 0xaf,
0x11, 0xc3, 0x24, 0x9e, 0xf0, 0xdb, 0xf3, 0x85, 0xb7, 0xd3, 0xba, 0x3d, 0x21, 0x81, 0x23, 0x59,
0xfd, 0x04, 0xb4, 0x42, 0x6a, 0xce, 0xa6, 0xec, 0xbb, 0x15, 0x68, 0x88, 0xeb, 0x67, 0xc9, 0x4a,
0xdc, 0x86, 0x86, 0x6d, 0x1c, 0xb8, 0x7b, 0xe1, 0x96, 0xe9, 0x4c, 0xc1, 0x8d, 0xb6, 0xee, 0x43,
0xc6, 0x8d, 0x85, 0x14, 0xfa, 0x0c, 0xd4, 0x6d, 0x6b, 0xd7, 0x0a, 0xc4, 0xf0, 0x71, 0xba, 0x50,
0x9c, 0x1d, 0x54, 0x73, 0x19, 0x5a, 0x38, 0xbb, 0x75, 0x12, 0xde, 0x19, 0x2e, 0x2c, 0xfc, 0x19,
0xe3, 0xc6, 0x42, 0x4a, 0xbf, 0x0f, 0x0d, 0x5e, 0x9d, 0xc9, 0x26, 0x09, 0xb5, 0x25, 0xb1, 0xa5,
0xb3, 0xba, 0xe5, 0xac, 0x4a, 0x8f, 0x43, 0x83, 0x17, 0x9e, 0x63, 0x35, 0xdf, 0x79, 0x9d, 0xed,
0x77, 0x6c, 0xfd, 0x61, 0x7c, 0xf8, 0xf7, 0xf1, 0xcf, 0x32, 0xf4, 0x27, 0x70, 0x68, 0xc5, 0x08,
0x8c, 0x2d, 0xc3, 0x27, 0x98, 0xf4, 0x5d, 0xcf, 0xcc, 0x44, 0xf5, 0x78, 0x96, 0x88, 0x50, 0xe7,
0xa3, 0x0a, 0xbe, 0x1f, 0x85, 0x0e, 0xff, 0xf7, 0x84, 0x0e, 0xff, 0xb8, 0x96, 0x13, 0xcf, 0x1b,
0x27, 0x92, 0x41, 0x0d, 0x2e, 0x15, 0xd0, 0xbb, 0xa9, 0xae, 0xbd, 0x4f, 0x15, 0x48, 0x2a, 0x8b,
0xef, 0x9b, 0x6a, 0x44, 0xaf, 0x48, 0x56, 0x09, 0xe9, 0xdd, 0x4d, 0x86, 0xf4, 0xce, 0x14, 0x48,
0xa7, 0x62, 0x7a, 0x37, 0xd5, 0x98, 0x5e, 0x51, 0xe9, 0x72, 0x50, 0xef, 0xff, 0x59, 0x18, 0xed,
0xd7, 0x72, 0xc2, 0x3e, 0x9f, 0x56, 0xc3, 0x3e, 0x23, 0xac, 0xe6, 0x87, 0x15, 0xf7, 0xf9, 0xf5,
0x46, 0x4e, 0xdc, 0x67, 0x41, 0x89, 0xfb, 0x8c, 0xa8, 0x59, 0x32, 0xf0, 0x73, 0x53, 0x0d, 0xfc,
0x9c, 0x2a, 0x90, 0x54, 0x22, 0x3f, 0x0b, 0x4a, 0xe4, 0xa7, 0xa8, 0x50, 0x29, 0xf4, 0xb3, 0xa0,
0x84, 0x7e, 0x8a, 0x04, 0xa5, 0xd8, 0xcf, 0x82, 0x12, 0xfb, 0x29, 0x12, 0x94, 0x82, 0x3f, 0x0b,
0x4a, 0xf0, 0xa7, 0x48, 0x50, 0x8a, 0xfe, 0xdc, 0x54, 0xa3, 0x3f, 0xc5, 0xfd, 0x23, 0x29, 0xfd,
0x47, 0x81, 0x9a, 0xff, 0xc6, 0x40, 0xcd, 0x2f, 0x56, 0x73, 0x02, 0x30, 0x38, 0x3b, 0x00, 0x73,
0x21, 0x5f, 0x93, 0xc5, 0x11, 0x98, 0xf1, 0x67, 0x81, 0x74, 0x08, 0xe6, 0xbd, 0x44, 0x08, 0xe6,
0x74, 0x81, 0xb0, 0x1a, 0x83, 0xf9, 0x3f, 0x13, 0x64, 0xf8, 0xfd, 0xc6, 0x88, 0xfd, 0xf4, 0x0d,
0x79, 0x3f, 0x3d, 0x62, 0x26, 0x4b, 0x6f, 0xa8, 0x6f, 0xab, 0x1b, 0xea, 0x73, 0x63, 0xc8, 0x2a,
0x3b, 0xea, 0x8d, 0xac, 0x1d, 0x75, 0x77, 0x0c, 0x94, 0xdc, 0x2d, 0xf5, 0xfd, 0xf4, 0x96, 0xfa,
0xc2, 0x18, 0x78, 0x99, 0x7b, 0xea, 0x8d, 0xac, 0x3d, 0xf5, 0x38, 0xb5, 0xcb, 0xdd, 0x54, 0x7f,
0x46, 0xd9, 0x54, 0x9f, 0x1d, 0xa7, 0xbb, 0xe2, 0xc9, 0xe1, 0x73, 0x39, 0xbb, 0xea, 0x77, 0xc7,
0x81, 0x19, 0x1d, 0xc4, 0xfe, 0xd1, 0xbe, 0x58, 0x2d, 0xe6, 0xf7, 0xde, 0x84, 0x56, 0x78, 0xd1,
0x46, 0xff, 0x0a, 0x34, 0xc3, 0x37, 0x47, 0x49, 0xcf, 0x39, 0x1a, 0x6d, 0xea, 0xf8, 0xea, 0x59,
0xa4, 0xd0, 0x6d, 0xa8, 0xd1, 0x7f, 0xc2, 0x2d, 0xce, 0x8f, 0x77, 0xa1, 0x87, 0x16, 0x82, 0x99,
0x9c, 0xfe, 0x6f, 0x47, 0x00, 0xa4, 0xa7, 0x18, 0xe3, 0x16, 0xfb, 0x3e, 0x1d, 0xcc, 0xec, 0x80,
0x78, 0xec, 0x22, 0x57, 0xe1, 0x53, 0x85, 0xb8, 0x04, 0x6a, 0x2d, 0x01, 0xf1, 0xb0, 0x10, 0x47,
0x8f, 0xa0, 0x15, 0x06, 0x52, 0xb5, 0x1a, 0x83, 0x7a, 0x77, 0x6c, 0xa8, 0x30, 0xb4, 0x87, 0x23,
0x08, 0xb4, 0x08, 0x35, 0xdf, 0xf5, 0x02, 0xad, 0xce, 0xa0, 0xde, 0x19, 0x1b, 0x6a, 0xd3, 0xf5,
0x02, 0xcc, 0x44, 0x79, 0xd3, 0xa4, 0x97, 0xae, 0x93, 0x34, 0x4d, 0x19, 0xb1, 0xff, 0xb5, 0x1a,
0x8d, 0xa1, 0xcb, 0xc2, 0x1b, 0xb9, 0x0d, 0x5d, 0x1c, 0x5f, 0x4b, 0xb2, 0x57, 0x22, 0xb1, 0x08,
0xe2, 0x9a, 0xe0, 0xeb, 0x9b, 0xf3, 0xd0, 0xe9, 0xbb, 0xfb, 0xc4, 0xc3, 0xf1, 0x15, 0x27, 0x71,
0x0b, 0x2d, 0x45, 0x47, 0x3a, 0xb4, 0x76, 0x2c, 0x93, 0xf4, 0xfa, 0x62, 0xfc, 0x6b, 0xe1, 0x28,
0x8d, 0x1e, 0x40, 0x8b, 0xc5, 0xd8, 0xc3, 0x08, 0xff, 0x64, 0x95, 0xe4, 0xa1, 0xfe, 0x10, 0x80,
0x16, 0xc4, 0x0a, 0xbf, 0x67, 0x05, 0xac, 0x0f, 0x5b, 0x38, 0x4a, 0xd3, 0x0a, 0xb3, 0x7b, 0x64,
0x72, 0x85, 0x9b, 0xbc, 0xc2, 0x49, 0x3a, 0xba, 0x0a, 0xaf, 0x32, 0x5a, 0x62, 0x8b, 0xc9, 0x43,
0xf5, 0x2d, 0x9c, 0x9d, 0xc9, 0xee, 0xcd, 0x19, 0x03, 0x7e, 0xaf, 0x9d, 0x05, 0xef, 0xea, 0x38,
0x26, 0xa0, 0x0b, 0x70, 0xd8, 0x24, 0xdb, 0xc6, 0x9e, 0x1d, 0x3c, 0x21, 0xbb, 0x43, 0xdb, 0x08,
0x48, 0xcf, 0x64, 0x8f, 0x6d, 0xdb, 0x38, 0x9d, 0x81, 0x2e, 0xc1, 0x2b, 0x82, 0xc8, 0xdd, 0x98,
0x6a, 0xa3, 0x67, 0xb2, 0xb7, 0xa7, 0x6d, 0x9c, 0x95, 0xa5, 0x7f, 0xa7, 0x46, 0x95, 0xce, 0x4c,
0xfb, 0x7d, 0xa8, 0x1a, 0xa6, 0x29, 0xa6, 0xcd, 0x2b, 0x13, 0x3a, 0x88, 0x78, 0x4f, 0x4e, 0x11,
0xd0, 0x46, 0x74, 0xe5, 0x8e, 0x4f, 0x9c, 0xd7, 0x27, 0xc5, 0x8a, 0xbe, 0x01, 0x20, 0x70, 0x28,
0xe2, 0x1e, 0xbf, 0x38, 0x5e, 0xfd, 0xc1, 0x10, 0xa3, 0xfb, 0xe4, 0x02, 0x07, 0xdd, 0x87, 0x1a,
0xab, 0x21, 0x9f, 0x58, 0xaf, 0x4e, 0x8a, 0xf7, 0x88, 0xd7, 0x8f, 0x61, 0xe8, 0x7d, 0x7e, 0xf7,
0x4d, 0xba, 0x70, 0x59, 0x56, 0x2f, 0x5c, 0x2e, 0x41, 0xdd, 0x0a, 0xc8, 0x6e, 0xfa, 0xfe, 0xed,
0x48, 0x53, 0x15, 0x23, 0x0f, 0x17, 0x1d, 0x79, 0x0f, 0xf0, 0xc3, 0xe8, 0x2e, 0x76, 0x72, 0x3c,
0xbc, 0x0b, 0x35, 0x2a, 0x9e, 0x5a, 0x4b, 0x8e, 0x53, 0x30, 0x93, 0xd4, 0x2f, 0x43, 0x8d, 0x36,
0x76, 0x44, 0xeb, 0x44, 0x7d, 0x2a, 0x51, 0x7d, 0x96, 0xa6, 0xa0, 0xed, 0x0e, 0x89, 0xc7, 0x1c,
0x43, 0xff, 0x97, 0x9a, 0x74, 0x29, 0xae, 0x27, 0xdb, 0xd8, 0xb5, 0x89, 0x47, 0x4e, 0xd9, 0xca,
0x70, 0xc2, 0xca, 0x6e, 0x4c, 0x8e, 0x96, 0xb2, 0x33, 0x9c, 0xb0, 0xb3, 0x1f, 0x00, 0x33, 0x65,
0x69, 0x0f, 0x15, 0x4b, 0xbb, 0x3e, 0x39, 0xa2, 0x62, 0x6b, 0xa4, 0xc8, 0xd6, 0x56, 0x54, 0x5b,
0xeb, 0x8e, 0xa7, 0xf2, 0x68, 0x6a, 0x1a, 0xc3, 0xda, 0xbe, 0x90, 0x6b, 0x6d, 0x4b, 0x8a, 0xb5,
0x4d, 0x5a, 0xf4, 0x27, 0x64, 0x6f, 0xff, 0x50, 0x83, 0x1a, 0x9d, 0x1e, 0xd1, 0xaa, 0x6c, 0x6b,
0xef, 0x4e, 0x34, 0xb5, 0xca, 0x76, 0xb6, 0x9e, 0xb0, 0xb3, 0xab, 0x93, 0x21, 0xa5, 0x6c, 0x6c,
0x3d, 0x61, 0x63, 0x13, 0xe2, 0xa5, 0xec, 0x6b, 0x4d, 0xb1, 0xaf, 0xcb, 0x93, 0xa1, 0x29, 0xb6,
0x65, 0x14, 0xd9, 0xd6, 0x5d, 0xd5, 0xb6, 0xc6, 0x5c, 0xbd, 0xb1, 0xb5, 0xca, 0x18, 0x76, 0xf5,
0x41, 0xae, 0x5d, 0xdd, 0x56, 0xec, 0x6a, 0x92, 0x62, 0x3f, 0x21, 0x9b, 0xba, 0xca, 0x17, 0x9d,
0xe2, 0x9e, 0xf1, 0x98, 0x8b, 0x4e, 0xfd, 0x1a, 0xb4, 0xe3, 0xb7, 0xec, 0x19, 0xd7, 0xf3, 0x39,
0x5b, 0x58, 0x6a, 0x98, 0xd4, 0xaf, 0x40, 0x3b, 0x7e, 0x9f, 0x9e, 0x51, 0x96, 0xcf, 0x32, 0x85,
0x94, 0x48, 0xe9, 0xab, 0x70, 0x38, 0xfd, 0x7a, 0x36, 0x23, 0x0e, 0x2f, 0xdd, 0x2d, 0x0f, 0x9f,
0xa2, 0x48, 0x24, 0xfd, 0x05, 0xcc, 0x26, 0xde, 0xc3, 0x4e, 0x8c, 0x81, 0xae, 0x48, 0x4b, 0xe4,
0xaa, 0xd8, 0x83, 0x67, 0xdf, 0x96, 0x8f, 0x17, 0xc2, 0xfa, 0x0a, 0xcc, 0x16, 0x54, 0x7e, 0x9c,
0xcb, 0xf2, 0x5f, 0x82, 0xa9, 0x51, 0x75, 0xff, 0x04, 0x2e, 0xf3, 0x07, 0xd0, 0x49, 0xbd, 0xe5,
0x4f, 0x16, 0xb3, 0x01, 0x30, 0x88, 0x78, 0x84, 0xd1, 0x5e, 0x9a, 0xe0, 0xe9, 0x02, 0x93, 0xc3,
0x12, 0x86, 0xfe, 0x3b, 0x65, 0x38, 0x9c, 0x7e, 0xc8, 0x3f, 0xee, 0xe6, 0x47, 0x83, 0x26, 0xc3,
0x8a, 0x5e, 0x7c, 0x84, 0x49, 0xf4, 0x08, 0xa6, 0x7d, 0xdb, 0xea, 0x93, 0xe5, 0x1d, 0xc3, 0x19,
0x10, 0x5f, 0xec, 0x68, 0x0a, 0x1e, 0xe3, 0x6f, 0xc6, 0x12, 0x58, 0x11, 0xd7, 0x5f, 0xc0, 0x94,
0x94, 0x89, 0x6e, 0x41, 0xc5, 0x1d, 0xa6, 0xee, 0x35, 0xe6, 0x63, 0x3e, 0x0e, 0xfd, 0x0d, 0x57,
0xdc, 0x61, 0xda, 0x25, 0x65, 0xf7, 0xad, 0x2a, 0xee, 0xab, 0x3f, 0x80, 0xc3, 0xe9, 0xb7, 0xf2,
0xc9, 0xee, 0x39, 0x93, 0x8a, 0x12, 0xf0, 0x6e, 0x4a, 0x6e, 0xf9, 0x17, 0xe0, 0x50, 0xf2, 0x05,
0x7c, 0xc6, 0x6b, 0x9c, 0xf8, 0x51, 0x53, 0x18, 0xae, 0x9f, 0xff, 0x85, 0x32, 0xcc, 0xaa, 0x0d,
0x41, 0x47, 0x01, 0xa9, 0x94, 0x75, 0xd7, 0x21, 0x9d, 0x12, 0x7a, 0x15, 0x0e, 0xab, 0xf4, 0x45,
0xd3, 0xec, 0x94, 0xd3, 0xec, 0x74, 0xd8, 0xea, 0x54, 0x90, 0x06, 0x47, 0x12, 0x3d, 0xc4, 0x06,
0xd1, 0x4e, 0x15, 0xbd, 0x0e, 0xaf, 0x26, 0x73, 0x86, 0xb6, 0xd1, 0x27, 0x9d, 0x9a, 0xfe, 0xfd,
0x0a, 0xd4, 0x9e, 0xfa, 0xc4, 0xd3, 0xff, 0xb9, 0x12, 0xbe, 0xd2, 0xb8, 0x01, 0x35, 0xf6, 0x38,
0x5d, 0x7a, 0xcd, 0x58, 0x4e, 0xbc, 0x66, 0x54, 0x5e, 0xc4, 0xc5, 0xaf, 0x19, 0x6f, 0x40, 0x8d,
0x3d, 0x47, 0x9f, 0x5c, 0xf2, 0xa7, 0xcb, 0xd0, 0x8e, 0x9f, 0x86, 0x4f, 0x2c, 0x2f, 0xbf, 0x0a,
0xa9, 0xa8, 0xaf, 0x42, 0xce, 0x43, 0xdd, 0x63, 0xef, 0x37, 0xf8, 0x28, 0x93, 0x7c, 0x6b, 0xc2,
0x0a, 0xc4, 0x9c, 0x45, 0x27, 0x30, 0x25, 0x3f, 0x7c, 0x9f, 0xbc, 0x1a, 0xa7, 0xc4, 0x57, 0x6f,
0x7a, 0xa6, 0xbf, 0xe8, 0x79, 0xc6, 0x81, 0x30, 0x4c, 0x95, 0xa8, 0xcf, 0x41, 0x6d, 0xc3, 0x72,
0x06, 0xd9, 0x8f, 0x48, 0xf5, 0x6f, 0x95, 0xa1, 0x29, 0x2e, 0xef, 0xea, 0x0b, 0x50, 0x5d, 0x27,
0x2f, 0x68, 0x45, 0xc4, 0xb5, 0xe1, 0x54, 0x45, 0x1e, 0xb1, 0x56, 0x08, 0x7e, 0x1c, 0xb2, 0xe9,
0x37, 0xa3, 0x69, 0x72, 0x72, 0xd9, 0x1b, 0x50, 0x63, 0xef, 0xd5, 0x27, 0x97, 0xfc, 0xad, 0x16,
0x34, 0xf8, 0x4b, 0x4c, 0xfd, 0x9b, 0x2d, 0x68, 0xf0, 0x37, 0xec, 0xe8, 0x36, 0x34, 0xfd, 0xbd,
0xdd, 0x5d, 0xc3, 0x3b, 0xd0, 0xb2, 0x3f, 0x98, 0xa8, 0x3c, 0x79, 0xef, 0x6e, 0x72, 0x5e, 0x1c,
0x0a, 0xa1, 0x6b, 0x50, 0xeb, 0x1b, 0xdb, 0x24, 0x75, 0x9c, 0x9b, 0x25, 0xbc, 0x6c, 0x6c, 0x13,
0xcc, 0xd8, 0xd1, 0x5d, 0x68, 0x09, 0xb5, 0xf8, 0x22, 0x9e, 0x33, 0xba, 0xdc, 0x50, 0x99, 0x91,
0x94, 0x7e, 0x1f, 0x9a, 0xa2, 0x32, 0xe8, 0x4e, 0xf4, 0x0e, 0x35, 0x19, 0x79, 0xce, 0x6c, 0x42,
0xf4, 0xb8, 0x39, 0x7a, 0x91, 0xfa, 0x97, 0x15, 0xa8, 0xd1, 0xca, 0x7d, 0x6c, 0x24, 0x74, 0x1c,
0xc0, 0x36, 0xfc, 0x60, 0x63, 0xcf, 0xb6, 0x89, 0x29, 0x5e, 0xd8, 0x49, 0x14, 0x74, 0x0e, 0x0e,
0xf1, 0x94, 0xbf, 0xb3, 0xb9, 0xd7, 0xef, 0x93, 0xe8, 0x99, 0x68, 0x92, 0x8c, 0x16, 0xa1, 0xce,
0xbe, 0xaa, 0x26, 0x56, 0x85, 0x6f, 0x17, 0xf6, 0x6c, 0x77, 0xc3, 0x72, 0x44, 0x6d, 0xb8, 0xa4,
0xee, 0x42, 0x3b, 0xa2, 0x51, 0x27, 0x1c, 0x5a, 0x8e, 0x63, 0x39, 0x03, 0x61, 0xd1, 0x61, 0x92,
0x4e, 0x3a, 0xf4, 0xaf, 0xa8, 0x6f, 0x1d, 0x8b, 0x14, 0xa5, 0x6f, 0x1b, 0x96, 0x2d, 0xaa, 0x58,
0xc7, 0x22, 0x45, 0x91, 0xf6, 0xc4, 0xcb, 0xff, 0x1a, 0x6b, 0x60, 0x98, 0xd4, 0x3f, 0x2a, 0x47,
0x8f, 0xb1, 0xb3, 0x1e, 0x67, 0xa6, 0x62, 0x49, 0x73, 0x72, 0x40, 0x9b, 0x4f, 0x08, 0x52, 0x88,
0xfa, 0x28, 0x34, 0x5c, 0xc7, 0xb6, 0x1c, 0x22, 0x62, 0x47, 0x22, 0x95, 0xe8, 0xe3, 0x7a, 0xaa,
0x8f, 0x45, 0xfe, 0xaa, 0x69, 0xd1, 0x2a, 0x36, 0xe2, 0x7c, 0x4e, 0x41, 0xef, 0x41, 0xd3, 0x24,
0xfb, 0x56, 0x9f, 0xf8, 0x5a, 0x93, 0x99, 0xde, 0xc9, 0x91, 0x7d, 0xbb, 0xc2, 0x78, 0x71, 0x28,
0xa3, 0x07, 0xd0, 0xe0, 0xa4, 0xa8, 0x49, 0x65, 0xa9, 0x49, 0x71, 0xa5, 0x2b, 0x23, 0x2a, 0x5d,
0x2d, 0xa8, 0x74, 0x2d, 0x59, 0xe9, 0x79, 0x13, 0x20, 0x36, 0x37, 0x34, 0x05, 0xcd, 0xa7, 0xce,
0x73, 0xc7, 0x7d, 0xe1, 0x74, 0x4a, 0x34, 0xf1, 0x78, 0x7b, 0x9b, 0x96, 0xd2, 0x29, 0xd3, 0x04,
0xe5, 0xb3, 0x9c, 0x41, 0xa7, 0x82, 0x00, 0x1a, 0x34, 0x41, 0xcc, 0x4e, 0x95, 0xfe, 0xbf, 0xc7,
0xf4, 0xd7, 0xa9, 0xa1, 0xd7, 0xe0, 0x95, 0x9e, 0xd3, 0x77, 0x77, 0x87, 0x46, 0x60, 0x6d, 0xd9,
0xe4, 0x19, 0xf1, 0x7c, 0xcb, 0x75, 0x3a, 0x75, 0xfd, 0x3f, 0xca, 0xfc, 0xd4, 0x57, 0xbf, 0x0b,
0xd3, 0xca, 0xa7, 0x28, 0x34, 0x68, 0xb2, 0x2f, 0x03, 0xc4, 0xeb, 0x6e, 0x91, 0x64, 0x56, 0xc2,
0x9f, 0xc5, 0x8b, 0x25, 0x0b, 0x4f, 0xe9, 0xf7, 0x00, 0xa4, 0x0f, 0x50, 0x1c, 0x07, 0xd8, 0x3a,
0x08, 0x88, 0xcf, 0x3f, 0x3e, 0x41, 0x21, 0x6a, 0x58, 0xa2, 0xc8, 0xf8, 0x15, 0x05, 0x5f, 0xbf,
0x0e, 0x20, 0x7d, 0x7e, 0x82, 0xfa, 0x0f, 0x4d, 0x2d, 0x25, 0xc1, 0x92, 0x64, 0xbd, 0x2b, 0x5a,
0x10, 0x7e, 0x68, 0x22, 0xac, 0x01, 0x8f, 0xd2, 0xc9, 0x35, 0x60, 0x14, 0x7d, 0x15, 0x20, 0xfe,
0xd6, 0x82, 0xbe, 0x10, 0x0d, 0xd1, 0xef, 0x40, 0xcd, 0x34, 0x02, 0x43, 0x8c, 0x8e, 0xaf, 0x27,
0x66, 0xa8, 0x58, 0x04, 0x33, 0x36, 0xfd, 0xb7, 0xcb, 0x30, 0x2d, 0x7f, 0x57, 0x42, 0x7f, 0x1f,
0x6a, 0xec, 0xc3, 0x14, 0x77, 0x60, 0x5a, 0xfe, 0xb0, 0x44, 0xea, 0xbb, 0xbe, 0x1c, 0x4f, 0x16,
0xc5, 0x8a, 0x80, 0xde, 0x8b, 0xaa, 0xf4, 0xb1, 0xa1, 0x2e, 0x41, 0x53, 0x7c, 0xa7, 0x42, 0x3f,
0x0d, 0xed, 0xf8, 0xb3, 0x14, 0x74, 0x8c, 0xe0, 0xf4, 0x50, 0xcb, 0x22, 0xa9, 0xff, 0x63, 0x15,
0xea, 0x4c, 0x9d, 0xfa, 0x37, 0x2a, 0xb2, 0x25, 0xea, 0xdf, 0x2f, 0xe7, 0xee, 0xf9, 0xae, 0x28,
0x9f, 0x07, 0x98, 0x4d, 0x7d, 0x8e, 0x45, 0x7c, 0x85, 0x42, 0x1d, 0x40, 0xaf, 0x43, 0xd3, 0x21,
0xc1, 0x0b, 0xd7, 0x7b, 0xce, 0x9c, 0x64, 0x36, 0xfd, 0x09, 0x16, 0x26, 0xb5, 0xce, 0x79, 0x70,
0xc8, 0x8c, 0xae, 0x42, 0x9d, 0x78, 0x9e, 0xeb, 0x31, 0xd7, 0x99, 0x4d, 0x7d, 0xd8, 0x24, 0xfe,
0xe2, 0xc5, 0x2a, 0xe5, 0xc2, 0x9c, 0x19, 0x5d, 0x85, 0x57, 0x7d, 0xee, 0x2d, 0x7c, 0xed, 0xe8,
0x8b, 0xf7, 0xd3, 0x62, 0x54, 0xc9, 0xce, 0x9c, 0xff, 0x74, 0x38, 0x91, 0x4a, 0x0e, 0x56, 0x92,
0x3d, 0xaf, 0x8c, 0xda, 0x50, 0x67, 0x05, 0x75, 0x2a, 0xb2, 0x7b, 0x56, 0xe7, 0xaf, 0x40, 0x53,
0x54, 0x9d, 0xd2, 0x17, 0x79, 0x1d, 0x3b, 0x25, 0x34, 0x0d, 0xad, 0x4d, 0x62, 0x6f, 0xaf, 0xb9,
0x7e, 0xd0, 0x29, 0xa3, 0x19, 0x68, 0x33, 0x9b, 0x7f, 0xec, 0xd8, 0x07, 0x9d, 0xca, 0xfc, 0x07,
0xd0, 0x8e, 0x6a, 0x8e, 0x5a, 0x50, 0x5b, 0xdf, 0xb3, 0xed, 0x4e, 0x89, 0x2d, 0x35, 0x03, 0xd7,
0x0b, 0x03, 0xcd, 0xab, 0x2f, 0xe9, 0xbc, 0xd1, 0x29, 0xe7, 0x79, 0x77, 0x05, 0x75, 0x60, 0x5a,
0x14, 0xce, 0xeb, 0x56, 0xd5, 0xff, 0xbe, 0x0c, 0xed, 0xe8, 0x93, 0x1d, 0x74, 0x9d, 0x17, 0xea,
0x32, 0xdf, 0xdf, 0x17, 0x12, 0x5a, 0xcd, 0xff, 0x02, 0x48, 0x42, 0xb3, 0x67, 0x60, 0x56, 0x0c,
0xa1, 0x61, 0x27, 0xf3, 0x51, 0x30, 0x41, 0x9d, 0xbf, 0x19, 0xf5, 0x6e, 0x87, 0xb9, 0xd2, 0xb2,
0xeb, 0x38, 0xa4, 0x1f, 0xb0, 0x3e, 0x3e, 0x04, 0x53, 0xeb, 0x6e, 0xb0, 0xe1, 0xfa, 0x3e, 0x6d,
0x19, 0xef, 0xa9, 0x38, 0xbf, 0xa2, 0xff, 0x66, 0x19, 0x1a, 0xfc, 0xc3, 0x21, 0xfa, 0xaf, 0x96,
0xa1, 0xc1, 0x3f, 0x16, 0x82, 0xce, 0x43, 0xc7, 0x73, 0x29, 0x50, 0xb8, 0x21, 0xe8, 0xad, 0x88,
0x56, 0xa5, 0xe8, 0x74, 0x8f, 0xea, 0x4a, 0xda, 0x16, 0x53, 0xb8, 0x42, 0x43, 0x37, 0x01, 0xf8,
0xc7, 0x48, 0x9e, 0x1c, 0x0c, 0x89, 0x30, 0xd3, 0xe4, 0x15, 0x31, 0xf1, 0xf9, 0x12, 0x76, 0x98,
0x22, 0x71, 0xcf, 0x7f, 0x0d, 0x66, 0x30, 0xf1, 0x87, 0xae, 0xe3, 0x93, 0x1f, 0xd6, 0xc7, 0xc9,
0x73, 0x3f, 0x33, 0x3e, 0xff, 0xad, 0x2a, 0xd4, 0xd9, 0xea, 0x50, 0xff, 0x83, 0x6a, 0xb4, 0x8e,
0xcd, 0xb8, 0x3b, 0x18, 0xdf, 0xf0, 0x91, 0xbd, 0x56, 0x59, 0x57, 0xca, 0xc7, 0x44, 0x97, 0xe5,
0x9b, 0x3d, 0xb2, 0xc7, 0xaa, 0x12, 0xca, 0x8d, 0x9e, 0xcf, 0x40, 0x6b, 0xe8, 0xb9, 0x03, 0x8f,
0x2e, 0x60, 0x6b, 0x89, 0x4f, 0xc9, 0xa8, 0x62, 0x1b, 0x82, 0x0d, 0x47, 0x02, 0xfa, 0x3a, 0xb4,
0x42, 0x6a, 0xce, 0x87, 0x0e, 0x10, 0xd4, 0x4c, 0x57, 0x4c, 0xc2, 0x55, 0xcc, 0xfe, 0xd3, 0x7e,
0x11, 0x3d, 0x18, 0x6e, 0x3e, 0x45, 0x72, 0xfe, 0x8b, 0xe2, 0xe4, 0x75, 0x06, 0xda, 0x2b, 0x9e,
0x3b, 0x64, 0x2f, 0xda, 0x3b, 0x25, 0xea, 0xdd, 0x5c, 0x8d, 0x9d, 0x32, 0xfd, 0xbf, 0xfa, 0x92,
0xfd, 0xaf, 0x30, 0x67, 0x35, 0xf6, 0x09, 0x65, 0xeb, 0x54, 0x11, 0x82, 0x59, 0x4c, 0xd8, 0x69,
0x93, 0x58, 0xfa, 0x74, 0x6a, 0x14, 0xe8, 0x91, 0x35, 0xe0, 0xdb, 0xb9, 0x4e, 0x7d, 0x7e, 0x31,
0xbc, 0x61, 0x43, 0x9d, 0x97, 0x6f, 0x1f, 0xa7, 0xa0, 0x89, 0xf7, 0xd8, 0xfa, 0xab, 0x53, 0xa6,
0x64, 0xba, 0xa8, 0xe7, 0xd0, 0xcb, 0x86, 0xd3, 0x27, 0x36, 0x9b, 0xb3, 0xa3, 0x51, 0xa4, 0xb6,
0x34, 0xf7, 0x57, 0x1f, 0x1d, 0x2f, 0x7f, 0xfb, 0xa3, 0xe3, 0xe5, 0xef, 0x7e, 0x74, 0xbc, 0xfc,
0xcb, 0xdf, 0x3b, 0x5e, 0xfa, 0xf6, 0xf7, 0x8e, 0x97, 0xfe, 0xe9, 0x7b, 0xc7, 0x4b, 0x1f, 0x56,
0x86, 0x5b, 0x5b, 0x0d, 0x76, 0x35, 0xe2, 0xca, 0x7f, 0x05, 0x00, 0x00, 0xff, 0xff, 0x2a, 0x3c,
0x5f, 0xfa, 0x5a, 0x5f, 0x00, 0x00,
// 5908 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7c, 0x49, 0x8c, 0x1c, 0xc9,
0x75, 0x76, 0xed, 0xcb, 0xeb, 0x85, 0xc5, 0x18, 0x0e, 0x27, 0x27, 0xd9, 0xc3, 0xe1, 0x34, 0x57,
0x71, 0x38, 0x45, 0x0e, 0xb7, 0xa6, 0x28, 0x0e, 0xc9, 0xde, 0x38, 0x5d, 0x5c, 0x9a, 0xad, 0x68,
0x92, 0x1a, 0x8d, 0x04, 0x41, 0xd9, 0x95, 0xd1, 0xd5, 0x29, 0x66, 0x67, 0x96, 0x32, 0xb3, 0x9b,
0x6c, 0xe9, 0xff, 0x65, 0xc1, 0x0b, 0x0c, 0x03, 0x36, 0xec, 0x83, 0x21, 0x1b, 0xbe, 0x18, 0x36,
0x6c, 0xc0, 0x80, 0x0d, 0xc3, 0x86, 0x0f, 0x96, 0x2f, 0x86, 0x01, 0xc3, 0x80, 0x57, 0x40, 0xbe,
0xf9, 0x26, 0x61, 0x74, 0xf1, 0xc1, 0x3e, 0xc8, 0x06, 0x0c, 0x9f, 0x0c, 0x23, 0x96, 0xcc, 0x8c,
0xc8, 0xa5, 0xb2, 0x4a, 0x33, 0xf2, 0x02, 0xeb, 0x54, 0x15, 0x11, 0xef, 0x7d, 0xb1, 0xbc, 0xf7,
0x22, 0x5e, 0xbc, 0x88, 0x48, 0x38, 0x3a, 0xdc, 0xba, 0x38, 0xf4, 0xdc, 0xc0, 0xf5, 0x2f, 0x92,
0x7d, 0xe2, 0x04, 0x7e, 0x97, 0xa5, 0x50, 0xd3, 0x70, 0x0e, 0x82, 0x83, 0x21, 0xd1, 0x4f, 0x0d,
0x9f, 0x0f, 0x2e, 0xda, 0xd6, 0xd6, 0xc5, 0xe1, 0xd6, 0xc5, 0x5d, 0xd7, 0x24, 0x76, 0x48, 0xce,
0x12, 0x82, 0x5c, 0x9f, 0x1b, 0xb8, 0xee, 0xc0, 0x26, 0xbc, 0x6c, 0x6b, 0x6f, 0xfb, 0xa2, 0x1f,
0x78, 0x7b, 0xfd, 0x80, 0x97, 0xce, 0xff, 0xee, 0x9f, 0x94, 0xa1, 0xbe, 0x4a, 0xe1, 0xd1, 0x65,
0x68, 0xed, 0x12, 0xdf, 0x37, 0x06, 0xc4, 0xd7, 0xca, 0x27, 0xaa, 0xe7, 0xa6, 0x2e, 0x1f, 0xed,
0x8a, 0xaa, 0xba, 0x8c, 0xa2, 0xfb, 0x88, 0x17, 0xe3, 0x88, 0x0e, 0xcd, 0x41, 0xbb, 0xef, 0x3a,
0x01, 0x79, 0x19, 0xf4, 0x4c, 0xad, 0x72, 0xa2, 0x7c, 0xae, 0x8d, 0xe3, 0x0c, 0x74, 0x15, 0xda,
0x96, 0x63, 0x05, 0x96, 0x11, 0xb8, 0x9e, 0x56, 0x3d, 0x51, 0x56, 0x20, 0x59, 0x23, 0xbb, 0x8b,
0xfd, 0xbe, 0xbb, 0xe7, 0x04, 0x38, 0x26, 0x44, 0x1a, 0x34, 0x03, 0xcf, 0xe8, 0x93, 0x9e, 0xa9,
0xd5, 0x18, 0x62, 0x98, 0xd4, 0xff, 0xb8, 0x0b, 0x4d, 0xd1, 0x06, 0x74, 0x07, 0xa6, 0x0c, 0xce,
0xbb, 0xb9, 0xe3, 0xbe, 0xd0, 0xca, 0x0c, 0xfd, 0x58, 0xa2, 0xc1, 0x02, 0xbd, 0x4b, 0x49, 0xd6,
0x4a, 0x58, 0xe6, 0x40, 0x3d, 0x98, 0x15, 0xc9, 0x15, 0x12, 0x18, 0x96, 0xed, 0x6b, 0x7f, 0xc5,
0x41, 0x8e, 0xe7, 0x80, 0x08, 0xb2, 0xb5, 0x12, 0x4e, 0x30, 0xa2, 0xcf, 0xc3, 0x2b, 0x22, 0x67,
0xd9, 0x75, 0xb6, 0xad, 0xc1, 0xd3, 0xa1, 0x69, 0x04, 0x44, 0xfb, 0x6b, 0x8e, 0x77, 0x2a, 0x07,
0x8f, 0xd3, 0x76, 0x39, 0xf1, 0x5a, 0x09, 0x67, 0x61, 0xa0, 0x7b, 0x30, 0x23, 0xb2, 0x05, 0xe8,
0xdf, 0x70, 0xd0, 0x37, 0x72, 0x40, 0x23, 0x34, 0x95, 0x0d, 0x7d, 0x01, 0x8e, 0x88, 0x8c, 0x87,
0x96, 0xf3, 0x7c, 0x79, 0xc7, 0xb0, 0x6d, 0xe2, 0x0c, 0x88, 0xf6, 0xb7, 0xa3, 0xdb, 0xa8, 0x10,
0xaf, 0x95, 0x70, 0x26, 0x08, 0x7a, 0x0c, 0x1d, 0x77, 0xeb, 0x2b, 0xa4, 0x1f, 0x0e, 0xc8, 0x26,
0x09, 0xb4, 0x0e, 0xc3, 0x7d, 0x2b, 0x81, 0xfb, 0x98, 0x91, 0x85, 0x43, 0xd9, 0xdd, 0x24, 0xc1,
0x5a, 0x09, 0xa7, 0x98, 0xd1, 0x53, 0x40, 0x4a, 0xde, 0xe2, 0x2e, 0x71, 0x4c, 0xed, 0x32, 0x83,
0x3c, 0x39, 0x1a, 0x92, 0x91, 0xae, 0x95, 0x70, 0x06, 0x40, 0x0a, 0xf6, 0xa9, 0xe3, 0x93, 0x40,
0xbb, 0x32, 0x0e, 0x2c, 0x23, 0x4d, 0xc1, 0xb2, 0x5c, 0x3a, 0xb6, 0x3c, 0x17, 0x13, 0xdb, 0x08,
0x2c, 0xd7, 0x11, 0xed, 0xbd, 0xca, 0x80, 0x4f, 0x67, 0x03, 0x47, 0xb4, 0x51, 0x8b, 0x33, 0x41,
0xd0, 0x97, 0xe0, 0xd5, 0x44, 0x3e, 0x26, 0xbb, 0xee, 0x3e, 0xd1, 0xae, 0x31, 0xf4, 0x33, 0x45,
0xe8, 0x9c, 0x7a, 0xad, 0x84, 0xb3, 0x61, 0xd0, 0x12, 0x4c, 0x87, 0x05, 0x0c, 0xf6, 0x3a, 0x83,
0x9d, 0xcb, 0x83, 0x15, 0x60, 0x0a, 0x0f, 0xb5, 0x45, 0x9e, 0x5e, 0xb6, 0x5d, 0x9f, 0x68, 0x8b,
0x99, 0xb6, 0x28, 0x20, 0x18, 0x09, 0xb5, 0x45, 0x89, 0x43, 0xee, 0xa4, 0x1f, 0x78, 0x56, 0x9f,
0x35, 0x90, 0x6a, 0xd1, 0xc2, 0xe8, 0x4e, 0xc6, 0xc4, 0x42, 0x95, 0xb2, 0x61, 0x10, 0x86, 0x43,
0xfe, 0xde, 0x96, 0xdf, 0xf7, 0xac, 0x21, 0xcd, 0x5b, 0x34, 0x4d, 0xed, 0xd6, 0x28, 0xe4, 0x4d,
0x89, 0xb8, 0xbb, 0x68, 0x52, 0xe9, 0x24, 0x01, 0xd0, 0x17, 0x00, 0xc9, 0x59, 0x62, 0xf8, 0xde,
0x63, 0xb0, 0x9f, 0x1a, 0x03, 0x36, 0x1a, 0xcb, 0x0c, 0x18, 0x64, 0xc0, 0x11, 0x39, 0x77, 0xc3,
0xf5, 0x2d, 0xfa, 0xab, 0xdd, 0x66, 0xf0, 0x6f, 0x8f, 0x01, 0x1f, 0xb2, 0x50, 0xc5, 0xca, 0x82,
0x4a, 0x56, 0xb1, 0x4c, 0xcd, 0x9a, 0x78, 0xbe, 0x76, 0x67, 0xec, 0x2a, 0x42, 0x96, 0x64, 0x15,
0x61, 0x7e, 0x72, 0x88, 0xde, 0xf7, 0xdc, 0xbd, 0xa1, 0xaf, 0xdd, 0x1d, 0x7b, 0x88, 0x38, 0x43,
0x72, 0x88, 0x78, 0x2e, 0xba, 0x0e, 0xad, 0x2d, 0xdb, 0xed, 0x3f, 0xa7, 0xc2, 0xac, 0x30, 0x48,
0x2d, 0x01, 0xb9, 0x44, 0x8b, 0x85, 0xf8, 0x22, 0x5a, 0xaa, 0xac, 0xec, 0xff, 0x0a, 0xb1, 0x49,
0x40, 0xc4, 0xb2, 0x74, 0x2c, 0x93, 0x95, 0x93, 0x50, 0x65, 0x95, 0x38, 0xd0, 0x0a, 0x4c, 0x6d,
0x5b, 0x36, 0xf1, 0x9f, 0x0e, 0x6d, 0xd7, 0xe0, 0x6b, 0xd4, 0xd4, 0xe5, 0x13, 0x99, 0x00, 0xf7,
0x62, 0x3a, 0x8a, 0x22, 0xb1, 0xa1, 0xdb, 0xd0, 0xde, 0x35, 0xbc, 0xe7, 0x7e, 0xcf, 0xd9, 0x76,
0xb5, 0x7a, 0xe6, 0xc2, 0xc3, 0x31, 0x1e, 0x85, 0x54, 0x6b, 0x25, 0x1c, 0xb3, 0xd0, 0xe5, 0x8b,
0x35, 0x6a, 0x93, 0x04, 0xf7, 0x2c, 0x62, 0x9b, 0xbe, 0xd6, 0x60, 0x20, 0x6f, 0x66, 0x82, 0x6c,
0x92, 0xa0, 0xcb, 0xc9, 0xe8, 0xf2, 0xa5, 0x32, 0xa2, 0x0f, 0xe0, 0x95, 0x30, 0x67, 0x79, 0xc7,
0xb2, 0x4d, 0x8f, 0x38, 0x3d, 0xd3, 0xd7, 0x9a, 0x99, 0x2b, 0x43, 0x8c, 0x27, 0xd1, 0xd2, 0xd5,
0x2b, 0x03, 0x82, 0xce, 0x8c, 0x61, 0xb6, 0x6c, 0x92, 0x5a, 0x2b, 0x73, 0x66, 0x8c, 0xa1, 0x65,
0x62, 0xaa, 0x5d, 0x59, 0x20, 0xc8, 0x84, 0xd7, 0xc2, 0xfc, 0x25, 0xa3, 0xff, 0x7c, 0xe0, 0xb9,
0x7b, 0x8e, 0xb9, 0xec, 0xda, 0xae, 0xa7, 0xb5, 0x19, 0xfe, 0xb9, 0x5c, 0xfc, 0x04, 0xfd, 0x5a,
0x09, 0xe7, 0x41, 0xa1, 0x65, 0x98, 0x0e, 0x8b, 0x9e, 0x90, 0x97, 0x81, 0x06, 0x99, 0xcb, 0x6f,
0x0c, 0x4d, 0x89, 0xe8, 0x04, 0x29, 0x33, 0xc9, 0x20, 0x54, 0x25, 0xb4, 0xa9, 0x02, 0x10, 0x4a,
0x24, 0x83, 0xd0, 0xb4, 0x0c, 0x42, 0x97, 0x5f, 0x6d, 0xa6, 0x00, 0x84, 0x12, 0xc9, 0x20, 0x34,
0x4d, 0x97, 0xea, 0xa8, 0xa7, 0xae, 0xfb, 0x9c, 0xea, 0x93, 0x36, 0x9b, 0xb9, 0x54, 0x4b, 0xa3,
0x25, 0x08, 0xe9, 0x52, 0x9d, 0x64, 0xa6, 0x0e, 0x4a, 0x98, 0xb7, 0x68, 0x5b, 0x03, 0x47, 0x3b,
0x34, 0x42, 0x97, 0x29, 0x1a, 0xa3, 0xa2, 0x0e, 0x8a, 0xc2, 0x86, 0xee, 0x0a, 0xb3, 0xdc, 0x24,
0xc1, 0x8a, 0xb5, 0xaf, 0x1d, 0xce, 0x5c, 0x86, 0x62, 0x94, 0x15, 0x6b, 0x3f, 0xb2, 0x4b, 0xce,
0x22, 0x77, 0x2d, 0x5c, 0xe4, 0xb4, 0x57, 0x0b, 0xba, 0x16, 0x12, 0xca, 0x5d, 0x0b, 0xf3, 0xe4,
0xae, 0x3d, 0x34, 0x02, 0xf2, 0x52, 0x7b, 0xbd, 0xa0, 0x6b, 0x8c, 0x4a, 0xee, 0x1a, 0xcb, 0xa0,
0xab, 0x5b, 0x98, 0xf1, 0x8c, 0x78, 0x81, 0xd5, 0x37, 0x6c, 0x3e, 0x54, 0xa7, 0x32, 0xd7, 0xa0,
0x18, 0x4f, 0xa1, 0xa6, 0xab, 0x5b, 0x26, 0x8c, 0xdc, 0xf1, 0x27, 0xc6, 0x96, 0x4d, 0xb0, 0xfb,
0x42, 0x3b, 0x5d, 0xd0, 0xf1, 0x90, 0x50, 0xee, 0x78, 0x98, 0x27, 0xcf, 0x2d, 0x9f, 0xb3, 0xcc,
0x01, 0x09, 0xb4, 0x73, 0x05, 0x73, 0x0b, 0x27, 0x93, 0xe7, 0x16, 0x9e, 0x13, 0xcd, 0x00, 0x2b,
0x46, 0x60, 0xec, 0x5b, 0xe4, 0xc5, 0x33, 0x8b, 0xbc, 0xa0, 0x0b, 0xfb, 0x2b, 0x23, 0x66, 0x80,
0x90, 0xb6, 0x2b, 0x88, 0xa3, 0x19, 0x20, 0x01, 0x12, 0xcd, 0x00, 0x72, 0xbe, 0x98, 0xd6, 0x8f,
0x8c, 0x98, 0x01, 0x14, 0xfc, 0x68, 0x8e, 0xcf, 0x83, 0x42, 0x06, 0x1c, 0x4d, 0x15, 0x3d, 0xf6,
0x4c, 0xe2, 0x69, 0x6f, 0xb0, 0x4a, 0xce, 0x16, 0x57, 0xc2, 0xc8, 0xd7, 0x4a, 0x38, 0x07, 0x28,
0x55, 0xc5, 0xa6, 0xbb, 0xe7, 0xf5, 0x09, 0x1d, 0xa7, 0x93, 0xe3, 0x54, 0x11, 0x91, 0xa7, 0xaa,
0x88, 0x4a, 0xd0, 0x3e, 0xbc, 0x11, 0x95, 0xd0, 0x8a, 0xd9, 0x2a, 0xca, 0x6a, 0x17, 0x1b, 0x8b,
0x33, 0xac, 0xa6, 0xee, 0xe8, 0x9a, 0x92, 0x5c, 0x6b, 0x25, 0x3c, 0x1a, 0x16, 0x1d, 0xc0, 0x71,
0x85, 0x80, 0xaf, 0xf3, 0x72, 0xc5, 0x67, 0x59, 0xc5, 0x17, 0x47, 0x57, 0x9c, 0x62, 0x5b, 0x2b,
0xe1, 0x02, 0x60, 0x34, 0x84, 0x63, 0xca, 0x60, 0x84, 0x86, 0x2d, 0x54, 0xe4, 0xff, 0xb1, 0x7a,
0x2f, 0x8c, 0xae, 0x57, 0xe5, 0x59, 0x2b, 0xe1, 0x51, 0x90, 0x68, 0x00, 0x5a, 0x66, 0x31, 0x95,
0xe4, 0xd7, 0x33, 0xdd, 0x9e, 0x9c, 0xea, 0xb8, 0x2c, 0x73, 0xc1, 0x32, 0x35, 0x5f, 0x0c, 0xe7,
0xff, 0x1f, 0x57, 0xf3, 0xa3, 0x71, 0xcc, 0x83, 0x52, 0x64, 0x47, 0x8b, 0x9e, 0x18, 0xde, 0x80,
0x04, 0x7c, 0xa0, 0x7b, 0x26, 0xed, 0xd4, 0x37, 0xc6, 0x91, 0x5d, 0x8a, 0x4d, 0x91, 0x5d, 0x26,
0x30, 0xf2, 0x61, 0x4e, 0xa1, 0xe8, 0xf9, 0xcb, 0xae, 0x6d, 0x93, 0x7e, 0x38, 0x9a, 0x3f, 0xc1,
0x2a, 0x7e, 0x67, 0x74, 0xc5, 0x09, 0xa6, 0xb5, 0x12, 0x1e, 0x09, 0x9a, 0xea, 0xef, 0x63, 0xdb,
0x4c, 0xe8, 0x8c, 0x36, 0x96, 0xae, 0x26, 0xd9, 0x52, 0xfd, 0x4d, 0x51, 0xa4, 0x74, 0x55, 0xa2,
0xa0, 0xdd, 0x7d, 0x6d, 0x1c, 0x5d, 0x55, 0x79, 0x52, 0xba, 0xaa, 0x16, 0xd3, 0xd5, 0x6d, 0xcf,
0x27, 0x1e, 0xc3, 0xb8, 0xef, 0x5a, 0x8e, 0xf6, 0x66, 0xe6, 0xea, 0xf6, 0xd4, 0x27, 0x9e, 0xa8,
0x88, 0x52, 0xd1, 0xd5, 0x4d, 0x61, 0x53, 0x70, 0x1e, 0x92, 0xed, 0x40, 0x3b, 0x51, 0x84, 0x43,
0xa9, 0x14, 0x1c, 0x9a, 0x41, 0x57, 0x8a, 0x28, 0x63, 0x93, 0x50, 0xa9, 0x60, 0xc3, 0x19, 0x10,
0xed, 0xad, 0xcc, 0x95, 0x42, 0x82, 0x93, 0x88, 0xe9, 0x4a, 0x91, 0x05, 0x42, 0x77, 0xfe, 0x51,
0x3e, 0xf5, 0xc8, 0x38, 0xf4, 0x7c, 0xe6, 0xce, 0x5f, 0x82, 0x8e, 0x48, 0xe9, 0x1e, 0x24, 0x0d,
0x80, 0x3e, 0x05, 0xb5, 0xa1, 0xe5, 0x0c, 0x34, 0x93, 0x01, 0xbd, 0x92, 0x00, 0xda, 0xb0, 0x9c,
0xc1, 0x5a, 0x09, 0x33, 0x12, 0x74, 0x0b, 0x60, 0xe8, 0xb9, 0x7d, 0xe2, 0xfb, 0xeb, 0xe4, 0x85,
0x46, 0x18, 0x83, 0x9e, 0x64, 0xe0, 0x04, 0xdd, 0x75, 0x42, 0xd7, 0x65, 0x89, 0x1e, 0xad, 0xc2,
0x8c, 0x48, 0x09, 0x2b, 0xdf, 0xce, 0x74, 0xfe, 0x42, 0x80, 0x38, 0x0a, 0xa4, 0x70, 0xd1, 0xbd,
0x8f, 0xc8, 0x58, 0x71, 0x1d, 0xa2, 0x0d, 0x32, 0xf7, 0x3e, 0x21, 0x08, 0x25, 0xa1, 0x3e, 0x96,
0xc4, 0x81, 0x96, 0x60, 0x3a, 0xd8, 0xf1, 0x88, 0x61, 0x6e, 0x06, 0x46, 0xb0, 0xe7, 0x6b, 0x4e,
0xa6, 0x9b, 0xc6, 0x0b, 0xbb, 0x4f, 0x18, 0x25, 0x75, 0x41, 0x65, 0x1e, 0xb4, 0x0e, 0x1d, 0xba,
0x11, 0x7a, 0x68, 0xed, 0x5a, 0x01, 0x26, 0x46, 0x7f, 0x87, 0x98, 0x9a, 0x9b, 0xb9, 0x89, 0xa2,
0x6e, 0x6f, 0x57, 0xa6, 0xa3, 0xde, 0x4a, 0x92, 0x17, 0xad, 0xc1, 0x2c, 0xcd, 0xdb, 0x1c, 0x1a,
0x7d, 0xf2, 0xd4, 0x37, 0x06, 0x44, 0x1b, 0x66, 0x6a, 0x20, 0x43, 0x8b, 0xa9, 0xa8, 0xb3, 0xa2,
0xf2, 0x85, 0x48, 0x0f, 0xdd, 0xbe, 0x61, 0x73, 0xa4, 0xaf, 0xe6, 0x23, 0xc5, 0x54, 0x21, 0x52,
0x9c, 0xa3, 0xf4, 0x91, 0x8f, 0xbd, 0xa9, 0xed, 0x17, 0xf4, 0x51, 0xd0, 0x29, 0x7d, 0x14, 0x79,
0x14, 0xcf, 0x71, 0x03, 0x6b, 0xdb, 0xea, 0x0b, 0xfb, 0x75, 0x4c, 0xcd, 0xcb, 0xc4, 0x5b, 0x97,
0xc8, 0xba, 0x9b, 0x3c, 0xb2, 0x94, 0xe2, 0x45, 0x4f, 0x00, 0xc9, 0x79, 0x42, 0xa9, 0x7c, 0x86,
0x38, 0x3f, 0x0a, 0x31, 0xd2, 0xac, 0x0c, 0x7e, 0xda, 0xca, 0xa1, 0x71, 0x40, 0xb7, 0xb7, 0x4b,
0x9e, 0x6b, 0x98, 0x7d, 0xc3, 0x0f, 0xb4, 0x20, 0xb3, 0x95, 0x1b, 0x9c, 0xac, 0x1b, 0xd1, 0xd1,
0x56, 0x26, 0x79, 0x29, 0xde, 0x2e, 0xd9, 0xdd, 0x22, 0x9e, 0xbf, 0x63, 0x0d, 0x45, 0x1b, 0xf7,
0x32, 0xf1, 0x1e, 0x45, 0x64, 0x71, 0x0b, 0x53, 0xbc, 0xd4, 0x11, 0xf7, 0xa9, 0xb4, 0x37, 0x0f,
0x9c, 0x3e, 0x57, 0x46, 0x01, 0xfa, 0x22, 0xd3, 0x11, 0x67, 0x9a, 0xd1, 0x8d, 0x89, 0x63, 0xe8,
0x6c, 0x18, 0xf4, 0x00, 0x0e, 0x0d, 0x2f, 0x0f, 0x15, 0xe4, 0x97, 0x99, 0x8e, 0xf3, 0xc6, 0xe5,
0x8d, 0x24, 0x64, 0x92, 0x93, 0x9a, 0x9a, 0xb5, 0x3b, 0x74, 0xbd, 0xe0, 0x9e, 0xe5, 0x58, 0xfe,
0x8e, 0x76, 0x90, 0x69, 0x6a, 0x3d, 0x46, 0xd2, 0xe5, 0x34, 0xd4, 0xd4, 0x64, 0x9e, 0xa5, 0x26,
0xd4, 0xf7, 0x0d, 0x7b, 0x8f, 0xe8, 0x7f, 0x58, 0x87, 0xa6, 0x88, 0xe9, 0xea, 0xeb, 0x50, 0x63,
0x01, 0xf0, 0x23, 0x50, 0xb7, 0x1c, 0x93, 0xbc, 0x64, 0xb1, 0xf3, 0x3a, 0xe6, 0x09, 0x74, 0x09,
0x9a, 0x22, 0xc6, 0x2b, 0xa2, 0x2a, 0x79, 0x11, 0xfb, 0x90, 0x4c, 0xff, 0x10, 0x9a, 0x61, 0x20,
0x7c, 0x0e, 0xda, 0x43, 0xcf, 0xa5, 0xda, 0xdb, 0x33, 0x19, 0x6c, 0x1b, 0xc7, 0x19, 0xe8, 0x5d,
0x68, 0x9a, 0x22, 0xd4, 0xce, 0xa1, 0x5f, 0xeb, 0xf2, 0xb3, 0x89, 0x6e, 0x78, 0x36, 0xd1, 0xdd,
0x64, 0x67, 0x13, 0x38, 0xa4, 0xd3, 0xbf, 0x59, 0x86, 0x06, 0x8f, 0x87, 0xeb, 0xfb, 0xd0, 0x10,
0x23, 0x73, 0x0d, 0x1a, 0x7d, 0x96, 0xa7, 0x25, 0x63, 0xe1, 0x4a, 0x0b, 0x45, 0x80, 0x1d, 0x0b,
0x62, 0xca, 0xe6, 0xf3, 0x59, 0xab, 0x32, 0x92, 0x8d, 0x4b, 0x01, 0x0b, 0xe2, 0xff, 0xb6, 0x7a,
0xff, 0xa3, 0x0c, 0x33, 0x6a, 0x98, 0x7d, 0x0e, 0xda, 0xfd, 0x28, 0x70, 0x2f, 0x46, 0xb7, 0x2f,
0x05, 0xe1, 0xa1, 0x6f, 0x5b, 0xc4, 0x09, 0x58, 0x44, 0xa9, 0x92, 0xe9, 0xa8, 0x64, 0x86, 0xf5,
0xbb, 0xcb, 0x11, 0x1b, 0x96, 0x20, 0xf4, 0x6f, 0x00, 0xc4, 0x25, 0xe8, 0x44, 0xb4, 0x74, 0xac,
0x1b, 0xbb, 0x61, 0xf5, 0x72, 0x96, 0x44, 0xb1, 0x61, 0x04, 0x3b, 0xe2, 0x34, 0x48, 0xce, 0x42,
0x17, 0xe0, 0xb0, 0x6f, 0x0d, 0x1c, 0x23, 0xd8, 0xf3, 0xc8, 0x33, 0xe2, 0x59, 0xdb, 0x16, 0x31,
0x59, 0x00, 0xae, 0x85, 0xd3, 0x05, 0xfa, 0xcf, 0xb5, 0xa1, 0xc1, 0x5d, 0x42, 0xfd, 0xdf, 0x2a,
0x91, 0x8e, 0xe9, 0x7f, 0x5e, 0x86, 0x3a, 0x0f, 0x8d, 0xcf, 0x42, 0xc5, 0x0a, 0xd5, 0xac, 0x62,
0x99, 0xe8, 0x9e, 0xac, 0x5f, 0xd5, 0x0c, 0x7f, 0x29, 0xeb, 0xa8, 0xa0, 0xfb, 0x80, 0x1c, 0x3c,
0xa3, 0x36, 0x12, 0x29, 0x1d, 0x3a, 0x0a, 0x0d, 0x7f, 0x6f, 0xab, 0x67, 0xfa, 0x5a, 0xf5, 0x44,
0xf5, 0x5c, 0x1b, 0x8b, 0x94, 0x7e, 0x1f, 0x5a, 0x21, 0x31, 0xea, 0x40, 0xf5, 0x39, 0x39, 0x10,
0x95, 0xd3, 0xbf, 0xe8, 0x82, 0xb0, 0xb5, 0xc8, 0x6c, 0x92, 0xba, 0xcd, 0x6b, 0x11, 0x06, 0xf9,
0x65, 0xa8, 0x52, 0x27, 0x2c, 0xd9, 0x85, 0xc9, 0x4d, 0x24, 0xb7, 0xb5, 0xcb, 0x50, 0xe7, 0xc7,
0x13, 0xc9, 0x3a, 0x10, 0xd4, 0x9e, 0x93, 0x03, 0x3e, 0x46, 0x6d, 0xcc, 0xfe, 0xe7, 0x82, 0xfc,
0x59, 0x15, 0xa6, 0xe5, 0x90, 0xac, 0xbe, 0x0a, 0xd5, 0x45, 0x33, 0x3d, 0xf4, 0x1a, 0x34, 0x8d,
0xed, 0x80, 0x78, 0xd1, 0x29, 0x60, 0x98, 0xa4, 0xb3, 0x0c, 0xc3, 0x62, 0x72, 0x6e, 0x63, 0x9e,
0xd0, 0xbb, 0xd0, 0x10, 0x91, 0xee, 0x24, 0x52, 0x44, 0x5f, 0x91, 0xe9, 0xef, 0x43, 0x2b, 0x0a,
0x5c, 0x7f, 0xdc, 0xba, 0x3d, 0x68, 0x45, 0x11, 0xea, 0x23, 0x50, 0x0f, 0xdc, 0xc0, 0xb0, 0x19,
0x5c, 0x15, 0xf3, 0x04, 0x35, 0x34, 0x87, 0xbc, 0x0c, 0x96, 0xa3, 0x59, 0xb0, 0x8a, 0xe3, 0x0c,
0x3e, 0xc9, 0x91, 0x7d, 0x5e, 0x5a, 0xe5, 0xa5, 0x51, 0x46, 0x5c, 0x67, 0x4d, 0xae, 0xf3, 0x00,
0x1a, 0x22, 0x6c, 0x1d, 0x95, 0x97, 0xa5, 0x72, 0xb4, 0x08, 0xf5, 0x01, 0x2d, 0x17, 0x52, 0x7f,
0x3b, 0x31, 0x45, 0x70, 0x6f, 0x74, 0xd9, 0x75, 0x02, 0xaa, 0xc6, 0xea, 0x6e, 0x1c, 0x73, 0x4e,
0x2a, 0x42, 0x8f, 0x9f, 0x41, 0x70, 0x8b, 0x12, 0x29, 0xfd, 0xb7, 0xcb, 0xd0, 0x8e, 0x0e, 0x7d,
0xf4, 0x0f, 0xf3, 0x8c, 0x67, 0x11, 0x66, 0x3c, 0x41, 0x45, 0x67, 0x87, 0xd0, 0x84, 0x8e, 0x25,
0x5a, 0x82, 0x25, 0x1a, 0xac, 0x72, 0xe8, 0xb7, 0x72, 0x85, 0x3a, 0x0f, 0xd3, 0x21, 0xe9, 0x83,
0x58, 0xf5, 0x94, 0x3c, 0x5d, 0x8f, 0xb8, 0x3b, 0x50, 0xb5, 0x4c, 0x7e, 0x06, 0xdd, 0xc6, 0xf4,
0xaf, 0xbe, 0x0d, 0xd3, 0x72, 0xe8, 0x57, 0x7f, 0x96, 0x6d, 0x3d, 0x77, 0x68, 0x35, 0x52, 0x98,
0xb9, 0x92, 0xf0, 0x6f, 0xc3, 0x2e, 0xc4, 0x24, 0x58, 0x61, 0xd0, 0x5f, 0x83, 0x3a, 0x3f, 0x90,
0x4a, 0x20, 0xeb, 0xbf, 0xd6, 0x87, 0x3a, 0x13, 0x82, 0x7e, 0x85, 0x1b, 0xc0, 0x05, 0x68, 0xb0,
0xcd, 0x55, 0x78, 0x54, 0x7e, 0x24, 0x4b, 0x62, 0x58, 0xd0, 0xe8, 0xcb, 0x30, 0x25, 0x1d, 0x05,
0x50, 0x8d, 0x65, 0x05, 0x91, 0x16, 0x84, 0x49, 0xa4, 0x43, 0x8b, 0x2e, 0x96, 0x62, 0x02, 0xa5,
0xfd, 0x8f, 0xd2, 0xfa, 0x29, 0x68, 0x88, 0xcd, 0xa2, 0x2e, 0x8e, 0x3e, 0x7a, 0xd1, 0x28, 0x45,
0x69, 0xfd, 0x8b, 0xd0, 0x8e, 0x4e, 0x0c, 0xd0, 0x63, 0x98, 0x16, 0x27, 0x06, 0x7c, 0xc3, 0x43,
0x89, 0x67, 0x0b, 0xb4, 0x8b, 0xee, 0x6e, 0xd8, 0xa1, 0x43, 0xf7, 0xc9, 0xc1, 0x90, 0x60, 0x05,
0x40, 0xff, 0x99, 0x73, 0x6c, 0xe4, 0xf5, 0x21, 0xb4, 0xa2, 0x30, 0x69, 0x52, 0x0a, 0x0b, 0x7c,
0x6a, 0xac, 0x14, 0xc6, 0xf8, 0x39, 0x3f, 0x9d, 0x80, 0xd9, 0x0c, 0xaa, 0x1f, 0x83, 0xea, 0x03,
0x72, 0x40, 0x2d, 0x84, 0x4f, 0xa4, 0xc2, 0x42, 0xf8, 0x84, 0xd9, 0x83, 0x86, 0x38, 0xae, 0x48,
0xd6, 0x77, 0x11, 0x1a, 0xdb, 0xfc, 0x04, 0xa4, 0x60, 0xca, 0x14, 0x64, 0xfa, 0x1d, 0x98, 0x92,
0x0f, 0x29, 0x92, 0x78, 0x27, 0x60, 0xaa, 0x2f, 0x1d, 0x83, 0x70, 0x31, 0xc8, 0x59, 0x3a, 0x51,
0xd5, 0x31, 0x85, 0xb0, 0x9a, 0xa9, 0x87, 0x6f, 0x65, 0x0e, 0xfb, 0x08, 0x6d, 0x7c, 0x00, 0x87,
0x92, 0xa7, 0x11, 0xc9, 0x9a, 0xce, 0xc1, 0xa1, 0xad, 0xc4, 0xd9, 0x07, 0x9f, 0x03, 0x93, 0xd9,
0x7a, 0x0f, 0xea, 0x3c, 0x5a, 0x9c, 0x84, 0xb8, 0x04, 0x75, 0x83, 0x45, 0xa3, 0x29, 0xe3, 0xac,
0xb4, 0x27, 0x95, 0x5b, 0xc9, 0x58, 0x31, 0x27, 0xd4, 0x2d, 0x98, 0x51, 0x03, 0xd0, 0x49, 0xc8,
0x35, 0x98, 0xd9, 0x57, 0x02, 0xdd, 0x1c, 0x7a, 0x3e, 0x13, 0x5a, 0x81, 0xc2, 0x2a, 0xa3, 0xfe,
0x93, 0x0d, 0xa8, 0xb1, 0x13, 0x94, 0x64, 0x15, 0xd7, 0xa1, 0x16, 0x90, 0x97, 0xa1, 0x8f, 0x3a,
0x3f, 0xf2, 0x38, 0x86, 0x6f, 0xe3, 0x19, 0x3d, 0xfa, 0x34, 0xd4, 0xfd, 0xe0, 0xc0, 0x0e, 0xcf,
0xfd, 0x4e, 0x8e, 0x66, 0xdc, 0xa4, 0xa4, 0x98, 0x73, 0x50, 0x56, 0x66, 0x0b, 0xe2, 0xc4, 0xaf,
0x80, 0x95, 0x19, 0x21, 0xe6, 0x1c, 0xe8, 0x0e, 0x34, 0xfb, 0x3b, 0xa4, 0xff, 0x9c, 0x98, 0xe2,
0xa8, 0xef, 0xf4, 0x68, 0xe6, 0x65, 0x4e, 0x8c, 0x43, 0x2e, 0x5a, 0x77, 0x9f, 0x49, 0xb7, 0x31,
0x4e, 0xdd, 0x4c, 0xe2, 0x98, 0x73, 0xa0, 0x55, 0x68, 0x5b, 0x7d, 0xd7, 0x59, 0xdd, 0x75, 0xbf,
0x62, 0x89, 0x33, 0xbd, 0xb3, 0xa3, 0xd9, 0x7b, 0x21, 0x39, 0x8e, 0x39, 0x43, 0x98, 0xde, 0x2e,
0xdd, 0x16, 0xb7, 0xc6, 0x85, 0x61, 0xe4, 0x38, 0xe6, 0xd4, 0xe7, 0x84, 0x3c, 0xb3, 0x8d, 0xfc,
0x1e, 0xd4, 0xd9, 0x90, 0xa3, 0xf7, 0xe4, 0xe2, 0x59, 0xa9, 0xa6, 0xdc, 0x19, 0x4b, 0x88, 0x2a,
0xc2, 0x61, 0xe3, 0xaf, 0xe2, 0x4c, 0x8d, 0x83, 0x23, 0xe4, 0xc6, 0x71, 0xde, 0x84, 0xa6, 0x10,
0x85, 0xda, 0xe0, 0x56, 0x48, 0xf0, 0x06, 0xd4, 0xb9, 0x61, 0x66, 0xf7, 0xe7, 0x2d, 0x68, 0x47,
0x83, 0x39, 0x9a, 0x84, 0x8d, 0x4e, 0x0e, 0xc9, 0xcf, 0x56, 0xa0, 0xce, 0x4f, 0x92, 0xd2, 0x53,
0xad, 0x6c, 0x05, 0x27, 0x47, 0x1f, 0x4c, 0xc9, 0x66, 0x70, 0x8f, 0x6d, 0xd4, 0xa8, 0x63, 0x1e,
0xdd, 0xcc, 0x3a, 0x57, 0xc0, 0xbd, 0x11, 0xd2, 0xe3, 0x98, 0xb5, 0x40, 0x9c, 0x8f, 0xa1, 0x1d,
0x71, 0xa1, 0x25, 0x55, 0xa4, 0x17, 0x46, 0x8a, 0x22, 0x59, 0xa5, 0x00, 0xfc, 0x56, 0x19, 0xaa,
0x2b, 0xd6, 0x7e, 0x6a, 0x1c, 0x6e, 0x84, 0x56, 0x5d, 0x34, 0x1d, 0xac, 0x58, 0xfb, 0x8a, 0x51,
0xeb, 0xab, 0xa1, 0xc6, 0xdd, 0x52, 0x9b, 0x77, 0x66, 0xb4, 0x07, 0x16, 0xc3, 0xf0, 0x86, 0xfd,
0x62, 0x13, 0x6a, 0xec, 0x90, 0x36, 0x6b, 0x9e, 0x3a, 0x18, 0x16, 0x37, 0x8c, 0x85, 0x81, 0xd8,
0x82, 0xcb, 0xe8, 0xf9, 0x3c, 0x65, 0x04, 0xc5, 0xf3, 0x14, 0x8f, 0x6a, 0x51, 0x52, 0xcc, 0x39,
0x68, 0x95, 0xbb, 0xd6, 0x2e, 0x11, 0xd3, 0x54, 0x41, 0x95, 0x8f, 0xac, 0x5d, 0x82, 0x19, 0x3d,
0xe5, 0xdb, 0x31, 0xfc, 0x1d, 0x31, 0x43, 0x15, 0xf0, 0xad, 0x19, 0xfe, 0x0e, 0x66, 0xf4, 0x94,
0xcf, 0xa1, 0x5b, 0xc2, 0xc6, 0x38, 0x7c, 0x74, 0xa7, 0x88, 0x19, 0x3d, 0xe5, 0xf3, 0xad, 0xaf,
0x11, 0x31, 0x27, 0x15, 0xf0, 0x6d, 0x5a, 0x5f, 0x23, 0x98, 0xd1, 0xc7, 0x53, 0x78, 0x6b, 0xbc,
0xa1, 0x91, 0xa6, 0xf0, 0x27, 0x30, 0x1b, 0x28, 0x47, 0x0d, 0xe2, 0xa6, 0xc0, 0x85, 0x02, 0xb9,
0x28, 0x3c, 0x38, 0x81, 0x41, 0x8d, 0x80, 0x6d, 0x80, 0xb3, 0x8d, 0xe0, 0x0d, 0xa8, 0x7f, 0xce,
0x32, 0x83, 0x1d, 0xb5, 0xb8, 0xae, 0x4c, 0x79, 0x54, 0x6c, 0x13, 0x4d, 0x79, 0xb2, 0xd4, 0x39,
0xce, 0x0a, 0xd4, 0xa8, 0xfa, 0x4c, 0xa6, 0xc7, 0xb1, 0xd6, 0x7d, 0xac, 0x09, 0x58, 0x1e, 0x68,
0x8e, 0x33, 0x07, 0x35, 0xaa, 0x21, 0x39, 0x43, 0x32, 0x07, 0x35, 0xaa, 0x77, 0xf9, 0xa5, 0x54,
0xda, 0x6a, 0x69, 0x35, 0x2c, 0x3d, 0x03, 0xb3, 0xaa, 0x38, 0x72, 0x50, 0xfe, 0xb4, 0x09, 0x35,
0x76, 0xe3, 0x21, 0x69, 0x91, 0x9f, 0x85, 0x19, 0x2e, 0xbf, 0x25, 0xe1, 0x82, 0x57, 0x32, 0x2f,
0x3c, 0xa9, 0xf7, 0x28, 0x84, 0x0a, 0x08, 0x16, 0xac, 0x22, 0x8c, 0xef, 0x54, 0x30, 0x28, 0x45,
0x23, 0x6f, 0x45, 0xce, 0x6b, 0xad, 0xe0, 0xba, 0x0d, 0xe3, 0xe5, 0x2e, 0x70, 0xe8, 0xc9, 0xa2,
0x25, 0x68, 0xd1, 0xa5, 0x95, 0x0e, 0x97, 0x30, 0xdb, 0x33, 0xa3, 0xf9, 0x7b, 0x82, 0x1a, 0x47,
0x7c, 0x74, 0x61, 0xef, 0x1b, 0x9e, 0xc9, 0x5a, 0x25, 0x6c, 0xf8, 0xec, 0x68, 0x90, 0xe5, 0x90,
0x1c, 0xc7, 0x9c, 0xe8, 0x01, 0x4c, 0x99, 0x24, 0x8a, 0x13, 0x08, 0xa3, 0xfe, 0xd4, 0x68, 0xa0,
0x95, 0x98, 0x01, 0xcb, 0xdc, 0xb4, 0x4d, 0xe1, 0xde, 0xd0, 0x2f, 0x74, 0x36, 0x18, 0x54, 0x7c,
0xad, 0x31, 0xe6, 0xd4, 0x4f, 0xc3, 0x8c, 0x22, 0xb7, 0x4f, 0xd4, 0xeb, 0x90, 0x65, 0xc9, 0x71,
0x16, 0xa2, 0x2d, 0xca, 0x3b, 0xaa, 0xdb, 0x91, 0xbb, 0x23, 0x11, 0x8c, 0x0f, 0xa1, 0x15, 0x0a,
0x06, 0xdd, 0x55, 0xdb, 0x70, 0xbe, 0xb8, 0x0d, 0x91, 0x4c, 0x05, 0xda, 0x3a, 0xb4, 0x23, 0x09,
0xa1, 0x45, 0x15, 0xee, 0xed, 0x62, 0xb8, 0x58, 0xba, 0x02, 0x0f, 0xc3, 0x94, 0x24, 0x28, 0xb4,
0xac, 0x22, 0xbe, 0x53, 0x8c, 0x28, 0x8b, 0x39, 0xf6, 0x7a, 0x22, 0x89, 0xc9, 0x52, 0xa9, 0xc6,
0x52, 0xf9, 0x83, 0x26, 0xb4, 0xa2, 0x5b, 0x46, 0x19, 0x7b, 0xcc, 0x3d, 0xcf, 0x2e, 0xdc, 0x63,
0x86, 0xfc, 0xdd, 0xa7, 0x9e, 0x8d, 0x29, 0x07, 0x15, 0x71, 0x60, 0x05, 0x91, 0xa9, 0x9e, 0x2d,
0x66, 0x7d, 0x42, 0xc9, 0x31, 0xe7, 0x42, 0x8f, 0x55, 0x2d, 0xaf, 0x8d, 0x38, 0x85, 0x56, 0x40,
0x72, 0x35, 0xbd, 0x07, 0x6d, 0x8b, 0xba, 0x7e, 0x6b, 0xf1, 0xca, 0xfb, 0x76, 0x31, 0x5c, 0x2f,
0x64, 0xc1, 0x31, 0x37, 0x6d, 0xdb, 0xb6, 0xb1, 0x4f, 0xed, 0x9a, 0x81, 0x35, 0xc6, 0x6d, 0xdb,
0xbd, 0x98, 0x09, 0xcb, 0x08, 0xe8, 0xa6, 0xf0, 0x5d, 0x9a, 0x05, 0x33, 0x4b, 0x3c, 0x54, 0xb1,
0xff, 0xf2, 0x41, 0x6a, 0xa5, 0xe5, 0x66, 0x7c, 0x69, 0x0c, 0x94, 0x91, 0xab, 0x2d, 0x95, 0x20,
0xf7, 0x8c, 0xda, 0xe3, 0x4a, 0x50, 0xf6, 0x8e, 0xf4, 0x63, 0x50, 0x7d, 0xea, 0xd9, 0xf9, 0x6b,
0x35, 0x13, 0x77, 0x4e, 0xf1, 0x49, 0xd5, 0x12, 0xf2, 0x1d, 0xfa, 0x48, 0x26, 0xb9, 0x38, 0xd2,
0xa0, 0xe7, 0x10, 0xbd, 0x27, 0x16, 0xf4, 0x6b, 0xaa, 0xbd, 0xbd, 0x99, 0xb0, 0x37, 0x6a, 0x61,
0x1b, 0x1e, 0xe1, 0x17, 0x2d, 0xa4, 0x95, 0x7c, 0xdc, 0x75, 0xf2, 0x7e, 0xe8, 0x7f, 0x4c, 0x34,
0x53, 0x24, 0xc7, 0x96, 0x63, 0xfd, 0x74, 0x19, 0x5a, 0xd1, 0x25, 0xb2, 0x74, 0x74, 0xbe, 0x65,
0xf9, 0x6b, 0xc4, 0x30, 0x89, 0x27, 0xec, 0xf6, 0x7c, 0xe1, 0xed, 0xb4, 0x6e, 0x4f, 0x70, 0xe0,
0x88, 0x57, 0x3f, 0x01, 0xad, 0x30, 0x37, 0x67, 0x53, 0xf6, 0xbd, 0x0a, 0x34, 0xc4, 0xf5, 0xb3,
0x64, 0x23, 0x6e, 0x43, 0xc3, 0x36, 0x0e, 0xdc, 0xbd, 0x70, 0xcb, 0x74, 0xa6, 0xe0, 0x46, 0x5b,
0xf7, 0x21, 0xa3, 0xc6, 0x82, 0x0b, 0x7d, 0x06, 0xea, 0xb6, 0xb5, 0x6b, 0x05, 0x62, 0xfa, 0x38,
0x5d, 0xc8, 0xce, 0x0e, 0xaa, 0x39, 0x0f, 0xad, 0x9c, 0xdd, 0x3a, 0x09, 0xef, 0x0c, 0x17, 0x56,
0xfe, 0x8c, 0x51, 0x63, 0xc1, 0xa5, 0xdf, 0x87, 0x06, 0x6f, 0xce, 0x64, 0x8b, 0x84, 0xda, 0x93,
0x58, 0xd3, 0x59, 0xdb, 0x72, 0xbc, 0xd2, 0xe3, 0xd0, 0xe0, 0x95, 0xe7, 0x68, 0xcd, 0x77, 0x5f,
0x67, 0xfb, 0x1d, 0x5b, 0x7f, 0x18, 0x1f, 0xfe, 0x7d, 0xfc, 0xb3, 0x0c, 0xfd, 0x09, 0x1c, 0x5a,
0x31, 0x02, 0x63, 0xcb, 0xf0, 0x09, 0x26, 0x7d, 0xd7, 0x33, 0x33, 0x51, 0x3d, 0x5e, 0x24, 0x22,
0xd4, 0xf9, 0xa8, 0x82, 0xee, 0xc7, 0xa1, 0xc3, 0xff, 0x39, 0xa1, 0xc3, 0x3f, 0xaa, 0xe5, 0xc4,
0xf3, 0xc6, 0x89, 0x64, 0x50, 0x85, 0x4b, 0x05, 0xf4, 0x6e, 0xaa, 0xbe, 0xf7, 0xa9, 0x02, 0x4e,
0xc5, 0xf9, 0xbe, 0xa9, 0x46, 0xf4, 0x8a, 0x78, 0x95, 0x90, 0xde, 0xdd, 0x64, 0x48, 0xef, 0x4c,
0x01, 0x77, 0x2a, 0xa6, 0x77, 0x53, 0x8d, 0xe9, 0x15, 0xd5, 0x2e, 0x07, 0xf5, 0xfe, 0x8f, 0x85,
0xd1, 0x7e, 0x25, 0x27, 0xec, 0xf3, 0x69, 0x35, 0xec, 0x33, 0x42, 0x6b, 0x7e, 0x54, 0x71, 0x9f,
0x5f, 0x6d, 0xe4, 0xc4, 0x7d, 0x16, 0x94, 0xb8, 0xcf, 0x88, 0x96, 0x25, 0x03, 0x3f, 0x37, 0xd5,
0xc0, 0xcf, 0xa9, 0x02, 0x4e, 0x25, 0xf2, 0xb3, 0xa0, 0x44, 0x7e, 0x8a, 0x2a, 0x95, 0x42, 0x3f,
0x0b, 0x4a, 0xe8, 0xa7, 0x88, 0x51, 0x8a, 0xfd, 0x2c, 0x28, 0xb1, 0x9f, 0x22, 0x46, 0x29, 0xf8,
0xb3, 0xa0, 0x04, 0x7f, 0x8a, 0x18, 0xa5, 0xe8, 0xcf, 0x4d, 0x35, 0xfa, 0x53, 0x3c, 0x3e, 0x92,
0xd0, 0x7f, 0x1c, 0xa8, 0xf9, 0x2f, 0x0c, 0xd4, 0xfc, 0x42, 0x35, 0x27, 0x00, 0x83, 0xb3, 0x03,
0x30, 0x17, 0xf2, 0x25, 0x59, 0x1c, 0x81, 0x19, 0x7f, 0x15, 0x48, 0x87, 0x60, 0xde, 0x4b, 0x84,
0x60, 0x4e, 0x17, 0x30, 0xab, 0x31, 0x98, 0xff, 0x35, 0x41, 0x86, 0xdf, 0x6b, 0x8c, 0xd8, 0x4f,
0xdf, 0x90, 0xf7, 0xd3, 0x23, 0x56, 0xb2, 0xf4, 0x86, 0xfa, 0xb6, 0xba, 0xa1, 0x3e, 0x37, 0x06,
0xaf, 0xb2, 0xa3, 0xde, 0xc8, 0xda, 0x51, 0x77, 0xc7, 0x40, 0xc9, 0xdd, 0x52, 0xdf, 0x4f, 0x6f,
0xa9, 0x2f, 0x8c, 0x81, 0x97, 0xb9, 0xa7, 0xde, 0xc8, 0xda, 0x53, 0x8f, 0xd3, 0xba, 0xdc, 0x4d,
0xf5, 0x67, 0x94, 0x4d, 0xf5, 0xd9, 0x71, 0x86, 0x2b, 0x5e, 0x1c, 0x3e, 0x9f, 0xb3, 0xab, 0x7e,
0x77, 0x1c, 0x98, 0xd1, 0x41, 0xec, 0x1f, 0xef, 0x8b, 0xd5, 0x6a, 0x7e, 0xe7, 0x4d, 0x68, 0x85,
0x17, 0x6d, 0xf4, 0xaf, 0x42, 0x33, 0x7c, 0x73, 0x94, 0xb4, 0x9c, 0xa3, 0xd1, 0xa6, 0x8e, 0x7b,
0xcf, 0x22, 0x85, 0x6e, 0x43, 0x8d, 0xfe, 0x13, 0x66, 0x71, 0x7e, 0xbc, 0x0b, 0x3d, 0xb4, 0x12,
0xcc, 0xf8, 0xf4, 0x7f, 0x3d, 0x02, 0x20, 0x3d, 0xc5, 0x18, 0xb7, 0xda, 0xf7, 0xe9, 0x64, 0x66,
0x07, 0xc4, 0x63, 0x17, 0xb9, 0x0a, 0x9f, 0x2a, 0xc4, 0x35, 0x50, 0x6d, 0x09, 0x88, 0x87, 0x05,
0x3b, 0x7a, 0x04, 0xad, 0x30, 0x90, 0xaa, 0xd5, 0x18, 0xd4, 0xbb, 0x63, 0x43, 0x85, 0xa1, 0x3d,
0x1c, 0x41, 0xa0, 0x45, 0xa8, 0xf9, 0xae, 0x17, 0x68, 0x75, 0x06, 0xf5, 0xce, 0xd8, 0x50, 0x9b,
0xae, 0x17, 0x60, 0xc6, 0xca, 0xbb, 0x26, 0xbd, 0x74, 0x9d, 0xa4, 0x6b, 0xca, 0x8c, 0xfd, 0x2f,
0xd5, 0x68, 0x0e, 0x5d, 0x16, 0xd6, 0xc8, 0x75, 0xe8, 0xe2, 0xf8, 0x52, 0x92, 0xad, 0x12, 0x09,
0x27, 0x88, 0x4b, 0x82, 0xfb, 0x37, 0xe7, 0xa1, 0xd3, 0x77, 0xf7, 0x89, 0x87, 0xe3, 0x2b, 0x4e,
0xe2, 0x16, 0x5a, 0x2a, 0x1f, 0xe9, 0xd0, 0xda, 0xb1, 0x4c, 0xd2, 0xeb, 0x8b, 0xf9, 0xaf, 0x85,
0xa3, 0x34, 0x7a, 0x00, 0x2d, 0x16, 0x63, 0x0f, 0x23, 0xfc, 0x93, 0x35, 0x92, 0x87, 0xfa, 0x43,
0x00, 0x5a, 0x11, 0xab, 0xfc, 0x9e, 0x15, 0xb0, 0x31, 0x6c, 0xe1, 0x28, 0x4d, 0x1b, 0xcc, 0xee,
0x91, 0xc9, 0x0d, 0x6e, 0xf2, 0x06, 0x27, 0xf3, 0xd1, 0x55, 0x78, 0x95, 0xe5, 0x25, 0xb6, 0x98,
0x3c, 0x54, 0xdf, 0xc2, 0xd9, 0x85, 0xec, 0xde, 0x9c, 0x31, 0xe0, 0xf7, 0xda, 0x59, 0xf0, 0xae,
0x8e, 0xe3, 0x0c, 0x74, 0x01, 0x0e, 0x9b, 0x64, 0xdb, 0xd8, 0xb3, 0x83, 0x27, 0x64, 0x77, 0x68,
0x1b, 0x01, 0xe9, 0x99, 0xec, 0xb1, 0x6d, 0x1b, 0xa7, 0x0b, 0xd0, 0x25, 0x78, 0x45, 0x64, 0x72,
0x33, 0xa6, 0xd2, 0xe8, 0x99, 0xec, 0xed, 0x69, 0x1b, 0x67, 0x15, 0xe9, 0xdf, 0xad, 0x51, 0xa1,
0x33, 0xd5, 0x7e, 0x1f, 0xaa, 0x86, 0x69, 0x8a, 0x65, 0xf3, 0xca, 0x84, 0x06, 0x22, 0xde, 0x93,
0x53, 0x04, 0xb4, 0x11, 0x5d, 0xb9, 0xe3, 0x0b, 0xe7, 0xf5, 0x49, 0xb1, 0xa2, 0x6f, 0x00, 0x08,
0x1c, 0x8a, 0xb8, 0xc7, 0x2f, 0x8e, 0x57, 0x7f, 0x38, 0xc4, 0xe8, 0x3e, 0xb9, 0xc0, 0x41, 0xf7,
0xa1, 0xc6, 0x5a, 0xc8, 0x17, 0xd6, 0xab, 0x93, 0xe2, 0x3d, 0xe2, 0xed, 0x63, 0x18, 0x7a, 0x9f,
0xdf, 0x7d, 0x93, 0x2e, 0x5c, 0x96, 0xd5, 0x0b, 0x97, 0x4b, 0x50, 0xb7, 0x02, 0xb2, 0x9b, 0xbe,
0x7f, 0x3b, 0x52, 0x55, 0xc5, 0xcc, 0xc3, 0x59, 0x47, 0xde, 0x03, 0xfc, 0x30, 0xba, 0x8b, 0x9d,
0x9c, 0x0f, 0xef, 0x42, 0x8d, 0xb2, 0xa7, 0x7c, 0xc9, 0x71, 0x2a, 0x66, 0x9c, 0xfa, 0x65, 0xa8,
0xd1, 0xce, 0x8e, 0xe8, 0x9d, 0x68, 0x4f, 0x25, 0x6a, 0xcf, 0xd2, 0x14, 0xb4, 0xdd, 0x21, 0xf1,
0x98, 0x61, 0xe8, 0xff, 0x5c, 0x93, 0x2e, 0xc5, 0xf5, 0x64, 0x1d, 0xbb, 0x36, 0xf1, 0xcc, 0x29,
0x6b, 0x19, 0x4e, 0x68, 0xd9, 0x8d, 0xc9, 0xd1, 0x52, 0x7a, 0x86, 0x13, 0x7a, 0xf6, 0x43, 0x60,
0xa6, 0x34, 0xed, 0xa1, 0xa2, 0x69, 0xd7, 0x27, 0x47, 0x54, 0x74, 0x8d, 0x14, 0xe9, 0xda, 0x8a,
0xaa, 0x6b, 0xdd, 0xf1, 0x44, 0x1e, 0x2d, 0x4d, 0x63, 0x68, 0xdb, 0x17, 0x73, 0xb5, 0x6d, 0x49,
0xd1, 0xb6, 0x49, 0xab, 0xfe, 0x84, 0xf4, 0xed, 0xef, 0x6b, 0x50, 0xa3, 0xcb, 0x23, 0x5a, 0x95,
0x75, 0xed, 0xdd, 0x89, 0x96, 0x56, 0x59, 0xcf, 0xd6, 0x13, 0x7a, 0x76, 0x75, 0x32, 0xa4, 0x94,
0x8e, 0xad, 0x27, 0x74, 0x6c, 0x42, 0xbc, 0x94, 0x7e, 0xad, 0x29, 0xfa, 0x75, 0x79, 0x32, 0x34,
0x45, 0xb7, 0x8c, 0x22, 0xdd, 0xba, 0xab, 0xea, 0xd6, 0x98, 0xde, 0x1b, 0xf3, 0x55, 0xc6, 0xd0,
0xab, 0x0f, 0x72, 0xf5, 0xea, 0xb6, 0xa2, 0x57, 0x93, 0x54, 0xfb, 0x09, 0xe9, 0xd4, 0x55, 0xee,
0x74, 0x8a, 0x7b, 0xc6, 0x63, 0x3a, 0x9d, 0xfa, 0x35, 0x68, 0xc7, 0x6f, 0xd9, 0x33, 0xae, 0xe7,
0x73, 0xb2, 0xb0, 0xd6, 0x30, 0xa9, 0x5f, 0x81, 0x76, 0xfc, 0x3e, 0x3d, 0xa3, 0x2e, 0x9f, 0x15,
0x0a, 0x2e, 0x91, 0xd2, 0x57, 0xe1, 0x70, 0xfa, 0xf5, 0x6c, 0x46, 0x1c, 0x5e, 0xba, 0x5b, 0x1e,
0x3e, 0x45, 0x91, 0xb2, 0xf4, 0x17, 0x30, 0x9b, 0x78, 0x0f, 0x3b, 0x31, 0x06, 0xba, 0x22, 0xb9,
0xc8, 0x55, 0xb1, 0x07, 0xcf, 0xbe, 0x2d, 0x1f, 0x3b, 0xc2, 0xfa, 0x0a, 0xcc, 0x16, 0x34, 0x7e,
0x9c, 0xcb, 0xf2, 0x5f, 0x86, 0xa9, 0x51, 0x6d, 0xff, 0x04, 0x2e, 0xf3, 0x07, 0xd0, 0x49, 0xbd,
0xe5, 0x4f, 0x56, 0xb3, 0x01, 0x30, 0x88, 0x68, 0x84, 0xd2, 0x5e, 0x9a, 0xe0, 0xe9, 0x02, 0xe3,
0xc3, 0x12, 0x86, 0xfe, 0x5b, 0x65, 0x38, 0x9c, 0x7e, 0xc8, 0x3f, 0xee, 0xe6, 0x47, 0x83, 0x26,
0xc3, 0x8a, 0x5e, 0x7c, 0x84, 0x49, 0xf4, 0x08, 0xa6, 0x7d, 0xdb, 0xea, 0x93, 0xe5, 0x1d, 0xc3,
0x19, 0x10, 0x5f, 0xec, 0x68, 0x0a, 0x1e, 0xe3, 0x6f, 0xc6, 0x1c, 0x58, 0x61, 0xd7, 0x5f, 0xc0,
0x94, 0x54, 0x88, 0x6e, 0x41, 0xc5, 0x1d, 0xa6, 0xee, 0x35, 0xe6, 0x63, 0x3e, 0x0e, 0xed, 0x0d,
0x57, 0xdc, 0x61, 0xda, 0x24, 0x65, 0xf3, 0xad, 0x2a, 0xe6, 0xab, 0x3f, 0x80, 0xc3, 0xe9, 0xb7,
0xf2, 0xc9, 0xe1, 0x39, 0x93, 0x8a, 0x12, 0xf0, 0x61, 0x4a, 0x6e, 0xf9, 0x17, 0xe0, 0x50, 0xf2,
0x05, 0x7c, 0xc6, 0x6b, 0x9c, 0xf8, 0x51, 0x53, 0x18, 0xae, 0x9f, 0xff, 0xf9, 0x32, 0xcc, 0xaa,
0x1d, 0x41, 0x47, 0x01, 0xa9, 0x39, 0xeb, 0xae, 0x43, 0x3a, 0x25, 0xf4, 0x2a, 0x1c, 0x56, 0xf3,
0x17, 0x4d, 0xb3, 0x53, 0x4e, 0x93, 0xd3, 0x69, 0xab, 0x53, 0x41, 0x1a, 0x1c, 0x49, 0x8c, 0x10,
0x9b, 0x44, 0x3b, 0x55, 0xf4, 0x3a, 0xbc, 0x9a, 0x2c, 0x19, 0xda, 0x46, 0x9f, 0x74, 0x6a, 0xfa,
0x0f, 0x2a, 0x50, 0x7b, 0xea, 0x13, 0x4f, 0xff, 0xc7, 0x4a, 0xf8, 0x4a, 0xe3, 0x06, 0xd4, 0xd8,
0xe3, 0x74, 0xe9, 0x35, 0x63, 0x39, 0xf1, 0x9a, 0x51, 0x79, 0x11, 0x17, 0xbf, 0x66, 0xbc, 0x01,
0x35, 0xf6, 0x1c, 0x7d, 0x72, 0xce, 0x9f, 0x2a, 0x43, 0x3b, 0x7e, 0x1a, 0x3e, 0x31, 0xbf, 0xfc,
0x2a, 0xa4, 0xa2, 0xbe, 0x0a, 0x39, 0x0f, 0x75, 0x8f, 0xbd, 0xdf, 0xe0, 0xb3, 0x4c, 0xf2, 0xad,
0x09, 0xab, 0x10, 0x73, 0x12, 0x9d, 0xc0, 0x94, 0xfc, 0xf0, 0x7d, 0xf2, 0x66, 0x9c, 0x12, 0x5f,
0xbd, 0xe9, 0x99, 0xfe, 0xa2, 0xe7, 0x19, 0x07, 0x42, 0x31, 0xd5, 0x4c, 0x7d, 0x0e, 0x6a, 0x1b,
0x96, 0x33, 0xc8, 0x7e, 0x44, 0xaa, 0x7f, 0xbb, 0x0c, 0x4d, 0x71, 0x79, 0x57, 0x5f, 0x80, 0xea,
0x3a, 0x79, 0x41, 0x1b, 0x22, 0xae, 0x0d, 0xa7, 0x1a, 0xf2, 0x88, 0xf5, 0x42, 0xd0, 0xe3, 0x90,
0x4c, 0xbf, 0x19, 0x2d, 0x93, 0x93, 0xf3, 0xde, 0x80, 0x1a, 0x7b, 0xaf, 0x3e, 0x39, 0xe7, 0x6f,
0xb4, 0xa0, 0xc1, 0x5f, 0x62, 0xea, 0xdf, 0x6a, 0x41, 0x83, 0xbf, 0x61, 0x47, 0xb7, 0xa1, 0xe9,
0xef, 0xed, 0xee, 0x1a, 0xde, 0x81, 0x96, 0xfd, 0xc1, 0x44, 0xe5, 0xc9, 0x7b, 0x77, 0x93, 0xd3,
0xe2, 0x90, 0x09, 0x5d, 0x83, 0x5a, 0xdf, 0xd8, 0x26, 0xa9, 0xe3, 0xdc, 0x2c, 0xe6, 0x65, 0x63,
0x9b, 0x60, 0x46, 0x8e, 0xee, 0x42, 0x4b, 0x88, 0xc5, 0x17, 0xf1, 0x9c, 0xd1, 0xf5, 0x86, 0xc2,
0x8c, 0xb8, 0xf4, 0xfb, 0xd0, 0x14, 0x8d, 0x41, 0x77, 0xa2, 0x77, 0xa8, 0xc9, 0xc8, 0x73, 0x66,
0x17, 0xa2, 0xc7, 0xcd, 0xd1, 0x8b, 0xd4, 0xbf, 0xa8, 0x40, 0x8d, 0x36, 0xee, 0x63, 0x23, 0xa1,
0xe3, 0x00, 0xb6, 0xe1, 0x07, 0x1b, 0x7b, 0xb6, 0x4d, 0x4c, 0xf1, 0xc2, 0x4e, 0xca, 0x41, 0xe7,
0xe0, 0x10, 0x4f, 0xf9, 0x3b, 0x9b, 0x7b, 0xfd, 0x3e, 0x89, 0x9e, 0x89, 0x26, 0xb3, 0xd1, 0x22,
0xd4, 0xd9, 0x57, 0xd5, 0x84, 0x57, 0xf8, 0x76, 0xe1, 0xc8, 0x76, 0x37, 0x2c, 0x47, 0xb4, 0x86,
0x73, 0xea, 0x2e, 0xb4, 0xa3, 0x3c, 0x6a, 0x84, 0x43, 0xcb, 0x71, 0x2c, 0x67, 0x20, 0x34, 0x3a,
0x4c, 0xd2, 0x45, 0x87, 0xfe, 0x15, 0xed, 0xad, 0x63, 0x91, 0xa2, 0xf9, 0xdb, 0x86, 0x65, 0x8b,
0x26, 0xd6, 0xb1, 0x48, 0x51, 0xa4, 0x3d, 0xf1, 0xf2, 0xbf, 0xc6, 0x3a, 0x18, 0x26, 0xf5, 0x8f,
0xca, 0xd1, 0x63, 0xec, 0xac, 0xc7, 0x99, 0xa9, 0x58, 0xd2, 0x9c, 0x1c, 0xd0, 0xe6, 0x0b, 0x82,
0x14, 0xa2, 0x3e, 0x0a, 0x0d, 0xd7, 0xb1, 0x2d, 0x87, 0x88, 0xd8, 0x91, 0x48, 0x25, 0xc6, 0xb8,
0x9e, 0x1a, 0x63, 0x51, 0xbe, 0x6a, 0x5a, 0xb4, 0x89, 0x8d, 0xb8, 0x9c, 0xe7, 0xa0, 0xf7, 0xa0,
0x69, 0x92, 0x7d, 0xab, 0x4f, 0x7c, 0xad, 0xc9, 0x54, 0xef, 0xe4, 0xc8, 0xb1, 0x5d, 0x61, 0xb4,
0x38, 0xe4, 0xd1, 0x03, 0x68, 0xf0, 0xac, 0xa8, 0x4b, 0x65, 0xa9, 0x4b, 0x71, 0xa3, 0x2b, 0x23,
0x1a, 0x5d, 0x2d, 0x68, 0x74, 0x2d, 0xd9, 0xe8, 0x79, 0x13, 0x20, 0x56, 0x37, 0x34, 0x05, 0xcd,
0xa7, 0xce, 0x73, 0xc7, 0x7d, 0xe1, 0x74, 0x4a, 0x34, 0xf1, 0x78, 0x7b, 0x9b, 0xd6, 0xd2, 0x29,
0xd3, 0x04, 0xa5, 0xb3, 0x9c, 0x41, 0xa7, 0x82, 0x00, 0x1a, 0x34, 0x41, 0xcc, 0x4e, 0x95, 0xfe,
0xbf, 0xc7, 0xe4, 0xd7, 0xa9, 0xa1, 0xd7, 0xe0, 0x95, 0x9e, 0xd3, 0x77, 0x77, 0x87, 0x46, 0x60,
0x6d, 0xd9, 0xe4, 0x19, 0xf1, 0x7c, 0xcb, 0x75, 0x3a, 0x75, 0xfd, 0xdf, 0xcb, 0xfc, 0xd4, 0x57,
0xbf, 0x0b, 0xd3, 0xca, 0xa7, 0x28, 0x34, 0x68, 0xb2, 0x2f, 0x03, 0xc4, 0x7e, 0xb7, 0x48, 0x32,
0x2d, 0xe1, 0xcf, 0xe2, 0x85, 0xcb, 0xc2, 0x53, 0xfa, 0x3d, 0x00, 0xe9, 0x03, 0x14, 0xc7, 0x01,
0xb6, 0x0e, 0x02, 0xe2, 0xf3, 0x8f, 0x4f, 0x50, 0x88, 0x1a, 0x96, 0x72, 0x64, 0xfc, 0x8a, 0x82,
0xaf, 0x5f, 0x07, 0x90, 0x3e, 0x3f, 0x41, 0xed, 0x87, 0xa6, 0x96, 0x92, 0x60, 0xc9, 0x6c, 0xbd,
0x2b, 0x7a, 0x10, 0x7e, 0x68, 0x22, 0x6c, 0x01, 0x8f, 0xd2, 0xc9, 0x2d, 0x60, 0x39, 0xfa, 0x2a,
0x40, 0xfc, 0xad, 0x05, 0x7d, 0x21, 0x9a, 0xa2, 0xdf, 0x81, 0x9a, 0x69, 0x04, 0x86, 0x98, 0x1d,
0x5f, 0x4f, 0xac, 0x50, 0x31, 0x0b, 0x66, 0x64, 0xfa, 0x6f, 0x96, 0x61, 0x5a, 0xfe, 0xae, 0x84,
0xfe, 0x3e, 0xd4, 0xd8, 0x87, 0x29, 0xee, 0xc0, 0xb4, 0xfc, 0x61, 0x89, 0xd4, 0x77, 0x7d, 0x39,
0x9e, 0xcc, 0x8a, 0x15, 0x06, 0xbd, 0x17, 0x35, 0xe9, 0x63, 0x43, 0x5d, 0x82, 0xa6, 0xf8, 0x4e,
0x85, 0x7e, 0x1a, 0xda, 0xf1, 0x67, 0x29, 0xe8, 0x1c, 0xc1, 0xf3, 0x43, 0x29, 0x8b, 0xa4, 0xfe,
0x4f, 0x55, 0xa8, 0x33, 0x71, 0xea, 0xdf, 0xac, 0xc8, 0x9a, 0xa8, 0xff, 0xa0, 0x9c, 0xbb, 0xe7,
0xbb, 0xa2, 0x7c, 0x1e, 0x60, 0x36, 0xf5, 0x39, 0x16, 0xf1, 0x15, 0x0a, 0x75, 0x02, 0xbd, 0x0e,
0x4d, 0x87, 0x04, 0x2f, 0x5c, 0xef, 0x39, 0x33, 0x92, 0xd9, 0xf4, 0x27, 0x58, 0x18, 0xd7, 0x3a,
0xa7, 0xc1, 0x21, 0x31, 0xba, 0x0a, 0x75, 0xe2, 0x79, 0xae, 0xc7, 0x4c, 0x67, 0x36, 0xf5, 0x61,
0x93, 0xf8, 0x8b, 0x17, 0xab, 0x94, 0x0a, 0x73, 0x62, 0x74, 0x15, 0x5e, 0xf5, 0xb9, 0xb5, 0x70,
0xdf, 0xd1, 0x17, 0xef, 0xa7, 0xc5, 0xac, 0x92, 0x5d, 0x38, 0xff, 0xd9, 0x70, 0x21, 0x95, 0x0c,
0xac, 0x24, 0x5b, 0x5e, 0x19, 0xb5, 0xa1, 0xce, 0x2a, 0xea, 0x54, 0x64, 0xf3, 0xac, 0x52, 0xf7,
0x50, 0x34, 0x7d, 0x9d, 0x10, 0x53, 0x7c, 0x11, 0xa3, 0x53, 0x9b, 0xbf, 0x02, 0x4d, 0x91, 0x4f,
0xe9, 0x17, 0x79, 0xdb, 0x3b, 0x25, 0x34, 0x0d, 0xad, 0x4d, 0x62, 0x6f, 0xaf, 0xb9, 0x7e, 0xd0,
0x29, 0xa3, 0x19, 0x68, 0x33, 0x5b, 0x78, 0xec, 0xd8, 0x07, 0x9d, 0xca, 0xfc, 0x07, 0xd0, 0x8e,
0x7a, 0x84, 0x5a, 0x50, 0x5b, 0xdf, 0xb3, 0xed, 0x4e, 0x89, 0xb9, 0xa0, 0x81, 0xeb, 0x85, 0x01,
0xe8, 0xd5, 0x97, 0x74, 0x3d, 0xe9, 0x94, 0xf3, 0xac, 0xbe, 0x82, 0x3a, 0x30, 0x2d, 0x2a, 0xe7,
0x6d, 0xae, 0xea, 0x7f, 0x57, 0x86, 0x76, 0xf4, 0x29, 0x0f, 0xea, 0xff, 0x85, 0x32, 0xce, 0x9f,
0x07, 0x16, 0x12, 0xd2, 0xce, 0xff, 0x32, 0x48, 0x42, 0xe2, 0x67, 0x60, 0x56, 0x4c, 0xad, 0xe1,
0xe0, 0xf3, 0xd9, 0x31, 0x91, 0x3b, 0x7f, 0x33, 0x1a, 0xf5, 0x0e, 0x33, 0xb1, 0x65, 0xd7, 0x71,
0x48, 0x3f, 0x60, 0x63, 0x7f, 0x08, 0xa6, 0xd6, 0xdd, 0x60, 0xc3, 0xf5, 0x7d, 0xda, 0x33, 0x3e,
0x52, 0x71, 0x79, 0x45, 0xff, 0xf5, 0x32, 0x34, 0xf8, 0x07, 0x45, 0xf4, 0x5f, 0x2e, 0x43, 0x83,
0x7f, 0x44, 0x04, 0x9d, 0x87, 0x8e, 0xe7, 0x52, 0xa0, 0x70, 0xa3, 0xd0, 0x5b, 0x11, 0xbd, 0x4a,
0xe5, 0xd3, 0xbd, 0xab, 0x2b, 0x69, 0x81, 0x58, 0xda, 0x95, 0x3c, 0x74, 0x13, 0x80, 0x7f, 0xa4,
0xe4, 0xc9, 0xc1, 0x90, 0x08, 0xf5, 0x4d, 0x5e, 0x1d, 0x13, 0x9f, 0x35, 0x61, 0x87, 0x2c, 0x12,
0xf5, 0xfc, 0xd7, 0x61, 0x06, 0x13, 0x7f, 0xe8, 0x3a, 0x3e, 0xf9, 0x51, 0x7d, 0xb4, 0x3c, 0xf7,
0xf3, 0xe3, 0xf3, 0xdf, 0xae, 0x42, 0x9d, 0x79, 0x8d, 0xfa, 0xef, 0x57, 0x23, 0xff, 0x36, 0xe3,
0x4e, 0x61, 0x7c, 0xf3, 0x47, 0xb6, 0x66, 0xc5, 0xdf, 0x94, 0x8f, 0x8f, 0x2e, 0xcb, 0x37, 0x7e,
0x64, 0x4b, 0x56, 0x39, 0x94, 0x9b, 0x3e, 0x9f, 0x81, 0xd6, 0xd0, 0x73, 0x07, 0x1e, 0x75, 0x6c,
0x6b, 0x89, 0x4f, 0xcc, 0xa8, 0x6c, 0x1b, 0x82, 0x0c, 0x47, 0x0c, 0xfa, 0x3a, 0xb4, 0xc2, 0xdc,
0x9c, 0x0f, 0x20, 0x20, 0xa8, 0x99, 0xae, 0x58, 0x9c, 0xab, 0x98, 0xfd, 0xa7, 0xe3, 0x22, 0x46,
0x30, 0xdc, 0x94, 0x8a, 0xe4, 0xfc, 0x97, 0xc4, 0x89, 0xec, 0x0c, 0xb4, 0x57, 0x3c, 0x77, 0xc8,
0x5e, 0xba, 0x77, 0x4a, 0xd4, 0xea, 0xb9, 0x18, 0x3b, 0x65, 0xfa, 0x7f, 0xf5, 0x25, 0xfb, 0x5f,
0x61, 0xc6, 0x6a, 0xec, 0x13, 0x4a, 0xd6, 0xa9, 0x22, 0x04, 0xb3, 0x98, 0xb0, 0x53, 0x28, 0xe1,
0x12, 0x75, 0x6a, 0x14, 0xe8, 0x91, 0x35, 0xe0, 0xdb, 0xbc, 0x4e, 0x7d, 0x7e, 0x31, 0xbc, 0x79,
0x43, 0x8d, 0x97, 0x6f, 0x2b, 0xa7, 0xa0, 0x89, 0xf7, 0x98, 0x5f, 0xd6, 0x29, 0xd3, 0x6c, 0xea,
0xec, 0x73, 0xe8, 0x65, 0xc3, 0xe9, 0x13, 0x9b, 0xad, 0xe5, 0xd1, 0xec, 0x52, 0x5b, 0x9a, 0xfb,
0xcb, 0x8f, 0x8e, 0x97, 0xbf, 0xf3, 0xd1, 0xf1, 0xf2, 0xf7, 0x3e, 0x3a, 0x5e, 0xfe, 0xa5, 0xef,
0x1f, 0x2f, 0x7d, 0xe7, 0xfb, 0xc7, 0x4b, 0xff, 0xf0, 0xfd, 0xe3, 0xa5, 0x0f, 0x2b, 0xc3, 0xad,
0xad, 0x06, 0xbb, 0x32, 0x71, 0xe5, 0x3f, 0x03, 0x00, 0x00, 0xff, 0xff, 0x47, 0xc1, 0xf9, 0xb8,
0x72, 0x5f, 0x00, 0x00,
}
func (m *Event) Marshal() (dAtA []byte, err error) {

View file

@ -2417,6 +2417,35 @@ message Rpc {
}
}
message ListModifyDetailValues {
message Request {
repeated string objectIds = 1;
repeated Operation operations = 2;
message Operation {
string relationKey = 1;
google.protobuf.Value add = 2;
google.protobuf.Value set = 3;
google.protobuf.Value remove = 4;
}
}
message Response {
Error error = 1;
message Error {
Code code = 1;
string description = 2;
enum Code {
NULL = 0;
UNKNOWN_ERROR = 1;
BAD_INPUT = 2;
}
}
}
}
message ApplyTemplate {
message Request {
string contextId = 1;

View file

@ -1088,6 +1088,7 @@ message Event {
Syncing = 1;
Error = 2;
Offline = 3;
NetworkNeedsUpdate = 4;
}
enum Network {
Anytype = 0;

View file

@ -99,6 +99,7 @@ service ClientCommands {
rpc ObjectListSetIsFavorite (anytype.Rpc.Object.ListSetIsFavorite.Request) returns (anytype.Rpc.Object.ListSetIsFavorite.Response);
rpc ObjectListSetObjectType (anytype.Rpc.Object.ListSetObjectType.Request) returns (anytype.Rpc.Object.ListSetObjectType.Response);
rpc ObjectListSetDetails (anytype.Rpc.Object.ListSetDetails.Request) returns (anytype.Rpc.Object.ListSetDetails.Response);
rpc ObjectListModifyDetailValues (anytype.Rpc.Object.ListModifyDetailValues.Request) returns (anytype.Rpc.Object.ListModifyDetailValues.Response);
rpc ObjectApplyTemplate (anytype.Rpc.Object.ApplyTemplate.Request) returns (anytype.Rpc.Object.ApplyTemplate.Response);
// ObjectToSet creates new set from given object and removes object
rpc ObjectToSet (anytype.Rpc.Object.ToSet.Request) returns (anytype.Rpc.Object.ToSet.Response);

View file

@ -26,314 +26,316 @@ const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package
func init() { proto.RegisterFile("pb/protos/service/service.proto", fileDescriptor_93a29dc403579097) }
var fileDescriptor_93a29dc403579097 = []byte{
// 4904 bytes of a gzipped FileDescriptorProto
// 4931 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x9d, 0xdd, 0x6f, 0x24, 0x49,
0x52, 0xc0, 0xb7, 0x5f, 0x58, 0xa8, 0xe3, 0x16, 0xe8, 0x85, 0x65, 0x6f, 0xb9, 0x9b, 0xef, 0x6f,
0x8f, 0xdb, 0xde, 0x99, 0xfd, 0x38, 0xf6, 0x90, 0x90, 0xc7, 0x1e, 0x7b, 0xcd, 0xd9, 0x1e, 0xe3,
0x6e, 0xcf, 0x48, 0x2b, 0x21, 0x51, 0xae, 0x0e, 0xb7, 0x0b, 0x57, 0x57, 0xd6, 0x55, 0x65, 0xb7,
0xa7, 0x0f, 0x81, 0x40, 0x20, 0x10, 0x08, 0xc4, 0x89, 0xaf, 0x17, 0x1e, 0x90, 0xf8, 0x6b, 0xe0,
0xed, 0x1e, 0xef, 0x11, 0xed, 0xfe, 0x23, 0xa7, 0xca, 0xcc, 0xca, 0x8f, 0xa8, 0x8c, 0xac, 0xf2,
0x3e, 0xcd, 0xa8, 0xe3, 0x17, 0x11, 0x99, 0x95, 0x91, 0x99, 0x91, 0x1f, 0x55, 0x8e, 0x6e, 0x16,
0x67, 0x1b, 0x45, 0xc9, 0x38, 0xab, 0x36, 0x2a, 0x28, 0x97, 0x69, 0x02, 0xcd, 0xbf, 0x23, 0xf1,
0xf3, 0xf0, 0xdd, 0x38, 0x5f, 0xf1, 0x55, 0x01, 0x1f, 0x7d, 0x68, 0xc8, 0x84, 0xcd, 0xe7, 0x71,
0x3e, 0xad, 0x24, 0xf2, 0xd1, 0x07, 0x46, 0x02, 0x4b, 0xc8, 0xb9, 0xfa, 0xfd, 0xd9, 0xff, 0xfd,
0x62, 0x10, 0xbd, 0xb7, 0x9d, 0xa5, 0x90, 0xf3, 0x6d, 0xa5, 0x31, 0xfc, 0x2a, 0xfa, 0xee, 0x56,
0x51, 0xec, 0x01, 0x7f, 0x0d, 0x65, 0x95, 0xb2, 0x7c, 0x78, 0x77, 0xa4, 0x1c, 0x8c, 0x4e, 0x8a,
0x64, 0xb4, 0x55, 0x14, 0x23, 0x23, 0x1c, 0x9d, 0xc0, 0x4f, 0x16, 0x50, 0xf1, 0x8f, 0xee, 0x85,
0xa1, 0xaa, 0x60, 0x79, 0x05, 0xc3, 0xf3, 0xe8, 0xb7, 0xb6, 0x8a, 0x62, 0x0c, 0x7c, 0x07, 0xea,
0x0a, 0x8c, 0x79, 0xcc, 0x61, 0xf8, 0xb0, 0xa5, 0xea, 0x02, 0xda, 0xc7, 0xa3, 0x6e, 0x50, 0xf9,
0x99, 0x44, 0xdf, 0xa9, 0xfd, 0x5c, 0x2c, 0xf8, 0x94, 0x5d, 0xe5, 0xc3, 0xdb, 0x6d, 0x45, 0x25,
0xd2, 0xb6, 0xef, 0x84, 0x10, 0x65, 0xf5, 0x4d, 0xf4, 0xeb, 0x6f, 0xe2, 0x2c, 0x03, 0xbe, 0x5d,
0x42, 0x5d, 0x70, 0x57, 0x47, 0x8a, 0x46, 0x52, 0xa6, 0xed, 0xde, 0x0d, 0x32, 0xca, 0xf0, 0x57,
0xd1, 0x77, 0xa5, 0xe4, 0x04, 0x12, 0xb6, 0x84, 0x72, 0xe8, 0xd5, 0x52, 0x42, 0xe2, 0x91, 0xb7,
0x20, 0x6c, 0x7b, 0x9b, 0xe5, 0x4b, 0x28, 0xb9, 0xdf, 0xb6, 0x12, 0x86, 0x6d, 0x1b, 0x48, 0xd9,
0xfe, 0x87, 0x41, 0xf4, 0xfd, 0xad, 0x24, 0x61, 0x8b, 0x9c, 0x1f, 0xb0, 0x24, 0xce, 0x0e, 0xd2,
0xfc, 0xf2, 0x08, 0xae, 0xb6, 0x2f, 0x6a, 0x3e, 0x9f, 0xc1, 0xf0, 0xb9, 0xfb, 0x54, 0x25, 0x3a,
0xd2, 0xec, 0xc8, 0x86, 0xb5, 0xef, 0x4f, 0xae, 0xa7, 0xa4, 0xca, 0xf2, 0x2f, 0x83, 0xe8, 0x06,
0x2e, 0xcb, 0x98, 0x65, 0x4b, 0x30, 0xa5, 0xf9, 0xb4, 0xc3, 0xb0, 0x8b, 0xeb, 0xf2, 0x7c, 0x76,
0x5d, 0x35, 0x55, 0xa2, 0x2c, 0x7a, 0xdf, 0x0e, 0x97, 0x31, 0x54, 0xa2, 0x3b, 0x3d, 0xa6, 0x23,
0x42, 0x21, 0xda, 0xf3, 0x93, 0x3e, 0xa8, 0xf2, 0x96, 0x46, 0x43, 0xe5, 0x2d, 0x63, 0x95, 0x76,
0xf6, 0xc8, 0x6b, 0xc1, 0x22, 0xb4, 0xaf, 0xc7, 0x3d, 0x48, 0xe5, 0xea, 0x4f, 0xa3, 0xdf, 0x78,
0xc3, 0xca, 0xcb, 0xaa, 0x88, 0x13, 0x50, 0x5d, 0xe1, 0xbe, 0xab, 0xdd, 0x48, 0x71, 0x6f, 0x78,
0xd0, 0x85, 0x59, 0x41, 0xdb, 0x08, 0x5f, 0x15, 0x80, 0xc7, 0x20, 0xa3, 0x58, 0x0b, 0xa9, 0xa0,
0xc5, 0x90, 0xb2, 0x7d, 0x19, 0x0d, 0x8d, 0xed, 0xb3, 0x3f, 0x83, 0x84, 0x6f, 0x4d, 0xa7, 0xb8,
0x55, 0x8c, 0xae, 0x20, 0x46, 0x5b, 0xd3, 0x29, 0xd5, 0x2a, 0x7e, 0x54, 0x39, 0xbb, 0x8a, 0x3e,
0x40, 0xce, 0x0e, 0xd2, 0x4a, 0x38, 0x5c, 0x0f, 0x5b, 0x51, 0x98, 0x76, 0x3a, 0xea, 0x8b, 0x2b,
0xc7, 0x7f, 0x35, 0x88, 0xbe, 0xe7, 0xf1, 0x7c, 0x02, 0x73, 0xb6, 0x84, 0xe1, 0x66, 0xb7, 0x35,
0x49, 0x6a, 0xff, 0x1f, 0x5f, 0x43, 0xc3, 0x13, 0x26, 0x63, 0xc8, 0x20, 0xe1, 0x64, 0x98, 0x48,
0x71, 0x67, 0x98, 0x68, 0xcc, 0xea, 0x61, 0x8d, 0x70, 0x0f, 0xf8, 0xf6, 0xa2, 0x2c, 0x21, 0xe7,
0x64, 0x5b, 0x1a, 0xa4, 0xb3, 0x2d, 0x1d, 0xd4, 0x53, 0x9f, 0x3d, 0xe0, 0x5b, 0x59, 0x46, 0xd6,
0x47, 0x8a, 0x3b, 0xeb, 0xa3, 0x31, 0xe5, 0x21, 0x89, 0x7e, 0xd3, 0x7a, 0x62, 0x7c, 0x3f, 0x3f,
0x67, 0x43, 0xfa, 0x59, 0x08, 0xb9, 0xf6, 0xf1, 0xb0, 0x93, 0xf3, 0x54, 0xe3, 0xe5, 0xdb, 0x82,
0x95, 0x74, 0xb3, 0x48, 0x71, 0x67, 0x35, 0x34, 0xa6, 0x3c, 0xfc, 0x49, 0xf4, 0x9e, 0x1a, 0x25,
0x9b, 0xf9, 0xec, 0x9e, 0x77, 0x08, 0xc5, 0x13, 0xda, 0xfd, 0x0e, 0xca, 0x0c, 0x0e, 0x4a, 0xa6,
0x06, 0x9f, 0xbb, 0x5e, 0x3d, 0x34, 0xf4, 0xdc, 0x0b, 0x43, 0x2d, 0xdb, 0x3b, 0x90, 0x01, 0x69,
0x5b, 0x0a, 0x3b, 0x6c, 0x6b, 0x48, 0xd9, 0x2e, 0xa3, 0xdf, 0xd1, 0x8f, 0xa5, 0x9e, 0x47, 0x85,
0xbc, 0x1e, 0xa4, 0xd7, 0x88, 0x7a, 0xdb, 0x90, 0xf6, 0xf5, 0xb4, 0x1f, 0xdc, 0xaa, 0x8f, 0xea,
0x81, 0xfe, 0xfa, 0xa0, 0xfe, 0x77, 0x2f, 0x0c, 0x29, 0xdb, 0xff, 0x38, 0x88, 0x7e, 0xa0, 0x64,
0x2f, 0xf3, 0xf8, 0x2c, 0x03, 0x31, 0x25, 0x1e, 0x01, 0xbf, 0x62, 0xe5, 0xe5, 0x78, 0x95, 0x27,
0xc4, 0xf4, 0xef, 0x87, 0x3b, 0xa6, 0x7f, 0x52, 0xc9, 0xca, 0xf8, 0x54, 0x45, 0x39, 0x2b, 0x70,
0xc6, 0xd7, 0xd4, 0x80, 0xb3, 0x82, 0xca, 0xf8, 0x5c, 0xa4, 0x65, 0xf5, 0xb0, 0x1e, 0x36, 0xfd,
0x56, 0x0f, 0xed, 0x71, 0xf2, 0x4e, 0x08, 0x31, 0xc3, 0x56, 0x13, 0xc0, 0x2c, 0x3f, 0x4f, 0x67,
0xa7, 0xc5, 0xb4, 0x0e, 0xe3, 0xc7, 0xfe, 0x08, 0xb5, 0x10, 0x62, 0xd8, 0x22, 0x50, 0xe5, 0xed,
0x9f, 0x4d, 0x62, 0xa4, 0xba, 0xd2, 0x6e, 0xc9, 0xe6, 0x07, 0x30, 0x8b, 0x93, 0x95, 0xea, 0xff,
0x9f, 0x84, 0x3a, 0x1e, 0xa6, 0x75, 0x21, 0x3e, 0xbd, 0xa6, 0x96, 0x2a, 0xcf, 0x7f, 0x0f, 0xa2,
0x7b, 0x4d, 0xf5, 0x2f, 0xe2, 0x7c, 0x06, 0xaa, 0x3d, 0x65, 0xe9, 0xb7, 0xf2, 0xe9, 0x09, 0x54,
0x3c, 0x2e, 0xf9, 0xf0, 0x0b, 0x7f, 0x25, 0x43, 0x3a, 0xba, 0x6c, 0x3f, 0xfa, 0x56, 0xba, 0xa6,
0xd5, 0xc7, 0xf5, 0xc0, 0xa6, 0x86, 0x00, 0xb7, 0xd5, 0x85, 0x04, 0x0f, 0x00, 0x77, 0x42, 0x88,
0x69, 0x75, 0x21, 0xd8, 0xcf, 0x97, 0x29, 0x87, 0x3d, 0xc8, 0xa1, 0x6c, 0xb7, 0xba, 0x54, 0x75,
0x11, 0xa2, 0xd5, 0x09, 0xd4, 0x0c, 0x36, 0x8e, 0x37, 0x3d, 0x39, 0xae, 0x05, 0x8c, 0xb4, 0xa6,
0xc7, 0xa7, 0xfd, 0x60, 0xb3, 0xba, 0xb3, 0x7c, 0x9e, 0xc0, 0x92, 0x5d, 0xe2, 0xd5, 0x9d, 0x6d,
0x42, 0x02, 0xc4, 0xea, 0xce, 0x0b, 0x9a, 0x19, 0xcc, 0xf2, 0xf3, 0x3a, 0x85, 0x2b, 0x34, 0x83,
0xd9, 0xca, 0xb5, 0x98, 0x98, 0xc1, 0x3c, 0x98, 0xf2, 0x70, 0x14, 0xfd, 0x9a, 0x10, 0xfe, 0x11,
0x4b, 0xf3, 0xe1, 0x4d, 0x8f, 0x52, 0x2d, 0xd0, 0x56, 0x6f, 0xd1, 0x00, 0x2a, 0x71, 0xfd, 0xeb,
0x76, 0x9c, 0x27, 0x90, 0x79, 0x4b, 0x6c, 0xc4, 0xc1, 0x12, 0x3b, 0x98, 0x49, 0x1d, 0x84, 0xb0,
0x1e, 0xbf, 0xc6, 0x17, 0x71, 0x99, 0xe6, 0xb3, 0xa1, 0x4f, 0xd7, 0x92, 0x13, 0xa9, 0x83, 0x8f,
0x43, 0x21, 0xac, 0x14, 0xb7, 0x8a, 0xa2, 0xac, 0x87, 0x45, 0x5f, 0x08, 0xbb, 0x48, 0x30, 0x84,
0x5b, 0xa8, 0xdf, 0xdb, 0x0e, 0x24, 0x59, 0x9a, 0x07, 0xbd, 0x29, 0xa4, 0x8f, 0x37, 0x83, 0xa2,
0xe0, 0x3d, 0x80, 0x78, 0x09, 0x4d, 0xcd, 0x7c, 0x4f, 0xc6, 0x06, 0x82, 0xc1, 0x8b, 0x40, 0xb3,
0x4e, 0x13, 0xe2, 0xc3, 0xf8, 0x12, 0xea, 0x07, 0x0c, 0xf5, 0xbc, 0x36, 0xf4, 0xe9, 0x3b, 0x04,
0xb1, 0x4e, 0xf3, 0x93, 0xca, 0xd5, 0x22, 0xfa, 0x40, 0xc8, 0x8f, 0xe3, 0x92, 0xa7, 0x49, 0x5a,
0xc4, 0x79, 0x93, 0xff, 0xfb, 0xfa, 0x75, 0x8b, 0xd2, 0x2e, 0xd7, 0x7b, 0xd2, 0xca, 0xed, 0x7f,
0x0e, 0xa2, 0xdb, 0xd8, 0xef, 0x31, 0x94, 0xf3, 0x54, 0x2c, 0x23, 0x2b, 0x39, 0x08, 0x0f, 0x3f,
0x0f, 0x1b, 0x6d, 0x29, 0xe8, 0xd2, 0xfc, 0xf0, 0xfa, 0x8a, 0xaa, 0x60, 0x7f, 0x1c, 0x45, 0x72,
0xb9, 0x22, 0x96, 0x94, 0x6e, 0xaf, 0x55, 0xeb, 0x18, 0x67, 0x3d, 0x79, 0x3b, 0x40, 0x98, 0xa9,
0x42, 0xfe, 0x2e, 0x56, 0xca, 0x43, 0xaf, 0x86, 0x10, 0x11, 0x53, 0x05, 0x42, 0x70, 0x41, 0xc7,
0x17, 0xec, 0xca, 0x5f, 0xd0, 0x5a, 0x12, 0x2e, 0xa8, 0x22, 0xcc, 0xde, 0x95, 0x2a, 0xa8, 0x6f,
0xef, 0xaa, 0x29, 0x46, 0x68, 0xef, 0x0a, 0x33, 0xca, 0x30, 0x8b, 0x7e, 0xdb, 0x36, 0xfc, 0x82,
0xb1, 0xcb, 0x79, 0x5c, 0x5e, 0x0e, 0x9f, 0xd0, 0xca, 0x0d, 0xa3, 0x1d, 0xad, 0xf5, 0x62, 0xcd,
0xb0, 0x60, 0x3b, 0xac, 0x13, 0x8d, 0xd3, 0x32, 0x43, 0xc3, 0x82, 0x63, 0x43, 0x21, 0xc4, 0xb0,
0x40, 0xa0, 0x66, 0xe4, 0xb6, 0xbd, 0x8d, 0x01, 0xaf, 0x96, 0x1c, 0xf5, 0x31, 0x50, 0xab, 0x25,
0x0f, 0x86, 0x43, 0x68, 0xaf, 0x8c, 0x8b, 0x0b, 0x7f, 0x08, 0x09, 0x51, 0x38, 0x84, 0x1a, 0x04,
0xb7, 0xf7, 0x18, 0xe2, 0x32, 0xb9, 0xf0, 0xb7, 0xb7, 0x94, 0x85, 0xdb, 0x5b, 0x33, 0xb8, 0xbd,
0xa5, 0xe0, 0x4d, 0xca, 0x2f, 0x0e, 0x81, 0xc7, 0xfe, 0xf6, 0x76, 0x99, 0x70, 0x7b, 0xb7, 0x58,
0x93, 0xc9, 0xd8, 0x0e, 0xc7, 0x8b, 0xb3, 0x2a, 0x29, 0xd3, 0x33, 0x18, 0x06, 0xac, 0x68, 0x88,
0xc8, 0x64, 0x48, 0xd8, 0x0c, 0xd2, 0xca, 0x67, 0x23, 0xdb, 0x9f, 0x56, 0x68, 0x90, 0x6e, 0x6c,
0x58, 0x04, 0x31, 0x48, 0xfb, 0x49, 0x5c, 0xbd, 0xbd, 0x92, 0x2d, 0x8a, 0xaa, 0xa3, 0x7a, 0x08,
0x0a, 0x57, 0xaf, 0x0d, 0x2b, 0x9f, 0x6f, 0xa3, 0xdf, 0xb5, 0x1f, 0xe9, 0x69, 0x5e, 0x69, 0xaf,
0xeb, 0xf4, 0x73, 0xb2, 0x30, 0x62, 0x5b, 0x2a, 0x80, 0x9b, 0x34, 0xa5, 0xf1, 0xcc, 0x77, 0x80,
0xc7, 0x69, 0x56, 0x0d, 0x1f, 0xf8, 0x6d, 0x34, 0x72, 0x22, 0x4d, 0xf1, 0x71, 0xb8, 0xcf, 0xee,
0x2c, 0x8a, 0x2c, 0x4d, 0xda, 0xfb, 0x93, 0x4a, 0x57, 0x8b, 0xc3, 0x7d, 0xd6, 0xc6, 0xf0, 0x18,
0x34, 0x06, 0x2e, 0xff, 0x33, 0x59, 0x15, 0xe0, 0x1f, 0x83, 0x1c, 0x24, 0x3c, 0x06, 0x61, 0x14,
0xd7, 0x67, 0x0c, 0xfc, 0x20, 0x5e, 0xb1, 0x05, 0x31, 0x06, 0x69, 0x71, 0xb8, 0x3e, 0x36, 0x66,
0x32, 0x05, 0xed, 0x61, 0x3f, 0xe7, 0x50, 0xe6, 0x71, 0xb6, 0x9b, 0xc5, 0xb3, 0x6a, 0x48, 0xf4,
0x1b, 0x97, 0x22, 0x32, 0x05, 0x9a, 0xf6, 0x3c, 0xc6, 0xfd, 0x6a, 0x37, 0x5e, 0xb2, 0x32, 0xe5,
0xf4, 0x63, 0x34, 0x48, 0xe7, 0x63, 0x74, 0x50, 0xaf, 0xb7, 0xad, 0x32, 0xb9, 0x48, 0x97, 0x30,
0x0d, 0x78, 0x6b, 0x90, 0x1e, 0xde, 0x2c, 0xd4, 0xd3, 0x68, 0x63, 0xb6, 0x28, 0x13, 0x20, 0x1b,
0x4d, 0x8a, 0x3b, 0x1b, 0x4d, 0x63, 0xca, 0xc3, 0xdf, 0x0e, 0xa2, 0xdf, 0x93, 0x52, 0x7b, 0xd3,
0x70, 0x27, 0xae, 0x2e, 0xce, 0x58, 0x5c, 0x4e, 0x87, 0x1f, 0xfb, 0xec, 0x78, 0x51, 0xed, 0xfa,
0xd9, 0x75, 0x54, 0xf0, 0x63, 0x3d, 0x48, 0x2b, 0xab, 0xc7, 0x79, 0x1f, 0xab, 0x83, 0x84, 0x1f,
0x2b, 0x46, 0xf1, 0x00, 0x22, 0xe4, 0x72, 0x81, 0xfe, 0x80, 0xd4, 0x77, 0x57, 0xe9, 0x0f, 0x3b,
0x39, 0x3c, 0x3e, 0xd6, 0x42, 0x37, 0x5a, 0xd6, 0x29, 0x1b, 0xfe, 0x88, 0x19, 0xf5, 0xc5, 0x49,
0xcf, 0xba, 0x57, 0x84, 0x3d, 0xb7, 0x7a, 0xc6, 0xa8, 0x2f, 0x4e, 0x78, 0xb6, 0x86, 0xb5, 0x90,
0x67, 0xcf, 0xd0, 0x36, 0xea, 0x8b, 0xe3, 0x8c, 0x42, 0x31, 0xcd, 0xbc, 0xf0, 0x24, 0x60, 0x07,
0xcf, 0x0d, 0x6b, 0xbd, 0x58, 0x1c, 0xb1, 0x5b, 0x45, 0x91, 0xad, 0x26, 0x30, 0x2f, 0x32, 0x32,
0x62, 0x1d, 0x24, 0x1c, 0xb1, 0x18, 0xc5, 0xf9, 0xdd, 0x84, 0xd5, 0xd9, 0xa3, 0x37, 0xbf, 0x13,
0xa2, 0x70, 0x7e, 0xd7, 0x20, 0x38, 0x43, 0x99, 0xb0, 0x6d, 0x96, 0x65, 0x90, 0xf0, 0xf6, 0x71,
0x9f, 0xd6, 0x34, 0x44, 0x38, 0x43, 0x41, 0xa4, 0x59, 0x19, 0x37, 0xab, 0x91, 0xb8, 0x84, 0x17,
0xab, 0x83, 0x34, 0xbf, 0x1c, 0xfa, 0x27, 0x63, 0x03, 0x10, 0x2b, 0x63, 0x2f, 0x88, 0x57, 0x3d,
0xa7, 0xf9, 0x94, 0xf9, 0x57, 0x3d, 0xb5, 0x24, 0xbc, 0xea, 0x51, 0x04, 0x36, 0x79, 0x02, 0x94,
0xc9, 0x5a, 0x12, 0x36, 0xa9, 0x08, 0xdf, 0x00, 0xa4, 0xf6, 0x4f, 0xc9, 0x01, 0x08, 0xed, 0x98,
0x3e, 0xec, 0xe4, 0x70, 0x84, 0x36, 0xcb, 0x9f, 0x5d, 0xe0, 0xc9, 0x85, 0x3f, 0x42, 0x1d, 0x24,
0x1c, 0xa1, 0x18, 0xc5, 0x55, 0x9a, 0x30, 0xbd, 0x7c, 0x7b, 0xe0, 0x8f, 0x8f, 0xd6, 0xd2, 0xed,
0x61, 0x27, 0x87, 0x17, 0x24, 0xfb, 0x73, 0xf1, 0xcc, 0xbc, 0x41, 0x2e, 0x65, 0xe1, 0x05, 0x89,
0x66, 0x70, 0xe9, 0xa5, 0xa0, 0x7e, 0x9c, 0xfe, 0xd2, 0x1b, 0x79, 0xb8, 0xf4, 0x0e, 0xa7, 0x9c,
0xfc, 0xfb, 0x20, 0xba, 0x69, 0x7b, 0x39, 0x62, 0x75, 0x1f, 0x79, 0x1d, 0x67, 0xe9, 0x34, 0xe6,
0x30, 0x61, 0x97, 0x90, 0xa3, 0x1d, 0x0d, 0xb7, 0xb4, 0x92, 0x1f, 0x39, 0x0a, 0xc4, 0x8e, 0x46,
0x2f, 0x45, 0x1c, 0x27, 0x92, 0x3e, 0xad, 0x60, 0x3b, 0xae, 0x88, 0x91, 0xcc, 0x41, 0xc2, 0x71,
0x82, 0x51, 0x9c, 0x25, 0x4a, 0xf9, 0xcb, 0xb7, 0x05, 0x94, 0x29, 0xe4, 0x09, 0xf8, 0xb3, 0x44,
0x4c, 0x85, 0xb3, 0x44, 0x0f, 0xdd, 0x5a, 0xf0, 0xeb, 0xc1, 0xa9, 0x7d, 0x62, 0x8f, 0x89, 0xc0,
0x89, 0x3d, 0x81, 0xe2, 0x4a, 0x1a, 0xc0, 0xbb, 0x69, 0xd6, 0xb2, 0x12, 0xdc, 0x34, 0xa3, 0xe9,
0xd6, 0x36, 0x8a, 0x66, 0xc6, 0x75, 0x37, 0xe9, 0x28, 0xfa, 0xd8, 0xee, 0x2e, 0x6b, 0xbd, 0x58,
0xff, 0xbe, 0xcd, 0x09, 0x64, 0xb1, 0x98, 0x42, 0x02, 0x9b, 0x23, 0x0d, 0xd3, 0x67, 0xdf, 0xc6,
0x62, 0x95, 0xc3, 0xbf, 0x1e, 0x44, 0x1f, 0xf9, 0x3c, 0xbe, 0x2a, 0x84, 0xdf, 0xcd, 0x6e, 0x5b,
0x92, 0x24, 0xae, 0x24, 0x84, 0x35, 0x54, 0x19, 0xfe, 0x3c, 0xfa, 0xb0, 0x11, 0x99, 0x1b, 0x0b,
0xaa, 0x00, 0x6e, 0xda, 0xa2, 0xcb, 0x8f, 0x39, 0xed, 0x7e, 0xa3, 0x37, 0x6f, 0x56, 0x04, 0x6e,
0xb9, 0x2a, 0xb4, 0x22, 0xd0, 0x36, 0x94, 0x98, 0x58, 0x11, 0x78, 0x30, 0x3c, 0x53, 0x37, 0x48,
0xdd, 0x4f, 0x7c, 0x63, 0x9c, 0x36, 0x61, 0xf7, 0x92, 0x47, 0xdd, 0x20, 0x8e, 0x9d, 0x46, 0xac,
0x12, 0xf1, 0x27, 0x21, 0x0b, 0x28, 0x19, 0x5f, 0xeb, 0xc5, 0x2a, 0x87, 0x7f, 0x19, 0x7d, 0xaf,
0x55, 0xb1, 0x5d, 0x88, 0xf9, 0xa2, 0x84, 0xe9, 0x70, 0xa3, 0xa3, 0xdc, 0x0d, 0xa8, 0x5d, 0x6f,
0xf6, 0x57, 0x50, 0xfe, 0xff, 0x7e, 0x10, 0x7d, 0xdf, 0xe5, 0x64, 0x13, 0xeb, 0x32, 0x3c, 0x0b,
0x99, 0x74, 0x59, 0x5d, 0x8c, 0xe7, 0xd7, 0xd2, 0x69, 0x2d, 0xfa, 0xec, 0x40, 0xde, 0x5a, 0xc6,
0x69, 0x26, 0x0e, 0x12, 0x3e, 0x0e, 0x19, 0x75, 0xd0, 0xe0, 0xa2, 0x8f, 0x54, 0x69, 0x8d, 0x92,
0xa2, 0xbf, 0x59, 0x8b, 0x85, 0xa7, 0x74, 0xaf, 0xf4, 0xac, 0x15, 0xd6, 0x7b, 0xd2, 0xca, 0x2d,
0x6f, 0x36, 0xcb, 0xea, 0x9f, 0xed, 0x20, 0xf7, 0x79, 0x55, 0xaa, 0x9e, 0x48, 0x5f, 0xef, 0x49,
0x2b, 0xaf, 0x7f, 0x11, 0x7d, 0xd8, 0xf6, 0xaa, 0x26, 0x85, 0x8d, 0x4e, 0x53, 0x68, 0x5e, 0xd8,
0xec, 0xaf, 0x60, 0x52, 0xfd, 0x2f, 0xd3, 0x8a, 0xb3, 0x72, 0x35, 0xbe, 0x60, 0x57, 0xcd, 0xad,
0x5c, 0xb7, 0xb7, 0x2a, 0x60, 0x64, 0x11, 0x44, 0xaa, 0xef, 0x27, 0x5b, 0xae, 0xcc, 0xed, 0xdd,
0x8a, 0x70, 0x65, 0x11, 0x1d, 0xae, 0x5c, 0xd2, 0x8c, 0x55, 0x4d, 0xad, 0xcc, 0x55, 0xe3, 0x87,
0xfe, 0xa2, 0xb6, 0xaf, 0x1b, 0x3f, 0xea, 0x06, 0x4d, 0xf6, 0xa0, 0xc4, 0x3b, 0xe9, 0xf9, 0xb9,
0xae, 0x93, 0xbf, 0xa4, 0x36, 0x42, 0x64, 0x0f, 0x04, 0x6a, 0x92, 0xd1, 0xdd, 0x34, 0x03, 0x71,
0x2a, 0xf5, 0xea, 0xfc, 0x3c, 0x63, 0xf1, 0x14, 0x25, 0xa3, 0xb5, 0x78, 0x64, 0xcb, 0x89, 0x64,
0xd4, 0xc7, 0x99, 0x4b, 0x3d, 0xb5, 0xf4, 0x04, 0x12, 0x96, 0x27, 0x69, 0x86, 0x2f, 0x29, 0x09,
0x4d, 0x2d, 0x24, 0x2e, 0xf5, 0xb4, 0x20, 0x33, 0x49, 0xd5, 0xa2, 0xba, 0xdb, 0x37, 0xe5, 0xbf,
0xdf, 0x56, 0xb4, 0xc4, 0xc4, 0x24, 0xe5, 0xc1, 0xcc, 0x9a, 0xac, 0x16, 0x9e, 0x16, 0xc2, 0xf8,
0xad, 0xb6, 0x96, 0x94, 0x10, 0x6b, 0x32, 0x97, 0x30, 0x6b, 0x8b, 0xfa, 0xf7, 0x1d, 0x76, 0x95,
0x0b, 0xa3, 0x77, 0xda, 0x2a, 0x8d, 0x8c, 0x58, 0x5b, 0x60, 0x46, 0x19, 0xfe, 0x71, 0xf4, 0xab,
0xc2, 0x70, 0xc9, 0x8a, 0xe1, 0x0d, 0x8f, 0x42, 0x69, 0xdd, 0x27, 0xba, 0x49, 0xca, 0xcd, 0xb5,
0x38, 0x1d, 0x1b, 0xa7, 0x55, 0x3c, 0x83, 0xe1, 0x3d, 0xa2, 0xc5, 0x85, 0x94, 0xb8, 0x16, 0xd7,
0xa6, 0xdc, 0xa8, 0x38, 0x62, 0x53, 0x65, 0xdd, 0x53, 0x43, 0x2d, 0x0c, 0x45, 0x85, 0x0d, 0x99,
0x43, 0x8a, 0xa3, 0x78, 0x99, 0xce, 0xf4, 0x84, 0x23, 0xc7, 0xad, 0x0a, 0x1d, 0x52, 0x18, 0x66,
0x64, 0x41, 0xc4, 0x21, 0x05, 0x09, 0x2b, 0x9f, 0xff, 0x36, 0x88, 0x6e, 0x19, 0x66, 0xaf, 0xd9,
0x3b, 0xda, 0xcf, 0xcf, 0xd9, 0x9b, 0x94, 0x5f, 0x1c, 0xa4, 0xf9, 0x65, 0x35, 0xfc, 0x8c, 0x32,
0xe9, 0xe7, 0x75, 0x51, 0x3e, 0xbf, 0xb6, 0x9e, 0xc9, 0x20, 0x9b, 0x2d, 0x1e, 0x73, 0x62, 0x28,
0x35, 0x50, 0x06, 0xa9, 0x77, 0x82, 0x30, 0x47, 0x64, 0x90, 0x21, 0xde, 0x34, 0xb1, 0x76, 0x9e,
0xb1, 0x1c, 0x37, 0xb1, 0xb1, 0x50, 0x0b, 0x89, 0x26, 0x6e, 0x41, 0x66, 0x3c, 0x6e, 0x44, 0x72,
0x37, 0x62, 0x2b, 0xcb, 0xd0, 0x78, 0xac, 0x55, 0x35, 0x40, 0x8c, 0xc7, 0x5e, 0x50, 0xf9, 0x39,
0x89, 0xbe, 0x53, 0x3f, 0xd2, 0xe3, 0x12, 0x96, 0x29, 0xe0, 0xc3, 0x6d, 0x4b, 0x42, 0xf4, 0x7f,
0x97, 0x30, 0x3d, 0xeb, 0x34, 0xaf, 0x8a, 0x2c, 0xae, 0x2e, 0xd4, 0x71, 0xa7, 0x5b, 0xe7, 0x46,
0x88, 0x0f, 0x3c, 0xef, 0x77, 0x50, 0x66, 0x50, 0x6f, 0x64, 0x7a, 0x88, 0x79, 0xe0, 0x57, 0x6d,
0x0d, 0x33, 0x0f, 0x3b, 0x39, 0xb3, 0xff, 0xba, 0x17, 0x67, 0x19, 0x94, 0xab, 0x46, 0x76, 0x18,
0xe7, 0xe9, 0x39, 0x54, 0x1c, 0xed, 0xbf, 0x2a, 0x6a, 0x84, 0x31, 0x62, 0xff, 0x35, 0x80, 0x9b,
0x6c, 0x1e, 0x79, 0xde, 0xcf, 0xa7, 0xf0, 0x16, 0x65, 0xf3, 0xd8, 0x8e, 0x60, 0x88, 0x6c, 0x9e,
0x62, 0xcd, 0x8e, 0xe8, 0x8b, 0x8c, 0x25, 0x97, 0x6a, 0x0a, 0x70, 0x1b, 0x58, 0x48, 0xf0, 0x1c,
0x70, 0x27, 0x84, 0x98, 0x49, 0x40, 0x08, 0x4e, 0xa0, 0xc8, 0xe2, 0x04, 0xdf, 0x70, 0x90, 0x3a,
0x4a, 0x46, 0x4c, 0x02, 0x98, 0x41, 0xc5, 0x55, 0x37, 0x27, 0x7c, 0xc5, 0x45, 0x17, 0x27, 0xee,
0x84, 0x10, 0x33, 0x0d, 0x0a, 0xc1, 0xb8, 0xc8, 0x52, 0x8e, 0xba, 0x81, 0xd4, 0x10, 0x12, 0xa2,
0x1b, 0xb8, 0x04, 0x32, 0x79, 0x08, 0xe5, 0x0c, 0xbc, 0x26, 0x85, 0x24, 0x68, 0xb2, 0x21, 0xcc,
0x45, 0x38, 0x59, 0x77, 0x56, 0xac, 0xd0, 0x45, 0x38, 0x55, 0x2d, 0x56, 0xac, 0x88, 0x8b, 0x70,
0x0e, 0x80, 0x8a, 0x78, 0x1c, 0x57, 0xdc, 0x5f, 0x44, 0x21, 0x09, 0x16, 0xb1, 0x21, 0xcc, 0x1c,
0x2d, 0x8b, 0xb8, 0xe0, 0x68, 0x8e, 0x56, 0x05, 0xb0, 0xce, 0x43, 0x6f, 0x92, 0x72, 0x33, 0x92,
0xc8, 0x56, 0x01, 0xbe, 0x9b, 0x42, 0x36, 0xad, 0xd0, 0x48, 0xa2, 0x9e, 0x7b, 0x23, 0x25, 0x46,
0x92, 0x36, 0x85, 0x42, 0x49, 0xed, 0x1b, 0xfb, 0x6a, 0x87, 0xb6, 0x8c, 0xef, 0x84, 0x10, 0x33,
0x3e, 0x35, 0x85, 0xde, 0x8e, 0xcb, 0x32, 0xad, 0x27, 0xff, 0x07, 0xfe, 0x02, 0x35, 0x72, 0x62,
0x7c, 0xf2, 0x71, 0xa8, 0x7b, 0x35, 0x03, 0xb7, 0xaf, 0x60, 0x78, 0xe8, 0xbe, 0x1b, 0x64, 0x4c,
0xc6, 0x29, 0x24, 0xd6, 0x81, 0x9e, 0xef, 0x69, 0x7a, 0xce, 0xf3, 0x1e, 0x74, 0x61, 0xd6, 0x45,
0x75, 0xed, 0xe2, 0x90, 0x2d, 0x61, 0xc2, 0x5e, 0xbe, 0x4d, 0x2b, 0x9e, 0xe6, 0x33, 0x35, 0x73,
0x3f, 0x27, 0x2c, 0xf9, 0x60, 0xe2, 0xa2, 0x7a, 0xa7, 0x92, 0x49, 0x20, 0x50, 0x59, 0x8e, 0xe0,
0xca, 0x9b, 0x40, 0x60, 0x8b, 0x9a, 0x23, 0x12, 0x88, 0x10, 0x6f, 0xf6, 0x51, 0xb4, 0x73, 0xf5,
0x36, 0xdf, 0x84, 0x35, 0xb9, 0x1c, 0x65, 0x0d, 0x83, 0xc4, 0x52, 0x36, 0xa8, 0x60, 0xd6, 0x97,
0xda, 0xbf, 0xe9, 0x62, 0x8f, 0x08, 0x3b, 0xed, 0x6e, 0xf6, 0xb8, 0x07, 0xe9, 0x71, 0x65, 0x4e,
0xa5, 0x29, 0x57, 0xed, 0x43, 0xe9, 0xc7, 0x3d, 0x48, 0x6b, 0x4f, 0xc6, 0xae, 0xd6, 0x8b, 0x38,
0xb9, 0x9c, 0x95, 0x6c, 0x91, 0x4f, 0xb7, 0x59, 0xc6, 0x4a, 0xb4, 0x27, 0xe3, 0x94, 0x1a, 0xa1,
0xc4, 0x9e, 0x4c, 0x87, 0x8a, 0xc9, 0xe0, 0xec, 0x52, 0x6c, 0x65, 0xe9, 0x0c, 0xaf, 0xa8, 0x1d,
0x43, 0x02, 0x20, 0x32, 0x38, 0x2f, 0xe8, 0x09, 0x22, 0xb9, 0xe2, 0xe6, 0x69, 0x12, 0x67, 0xd2,
0xdf, 0x06, 0x6d, 0xc6, 0x01, 0x3b, 0x83, 0xc8, 0xa3, 0xe0, 0xa9, 0xe7, 0x64, 0x51, 0xe6, 0xfb,
0x39, 0x67, 0x64, 0x3d, 0x1b, 0xa0, 0xb3, 0x9e, 0x16, 0x88, 0x86, 0xd5, 0x09, 0xbc, 0xad, 0x4b,
0x53, 0xff, 0xe3, 0x1b, 0x56, 0xeb, 0xdf, 0x47, 0x4a, 0x1e, 0x1a, 0x56, 0x11, 0x87, 0x2a, 0xa3,
0x9c, 0xc8, 0x80, 0x09, 0x68, 0xbb, 0x61, 0xf2, 0xa8, 0x1b, 0xf4, 0xfb, 0x19, 0xf3, 0x55, 0x06,
0x21, 0x3f, 0x02, 0xe8, 0xe3, 0xa7, 0x01, 0xcd, 0x76, 0x8b, 0x53, 0x9f, 0x0b, 0x48, 0x2e, 0x5b,
0x97, 0x6c, 0xdc, 0x82, 0x4a, 0x84, 0xd8, 0x6e, 0x21, 0x50, 0x7f, 0x13, 0xed, 0x27, 0x2c, 0x0f,
0x35, 0x51, 0x2d, 0xef, 0xd3, 0x44, 0x8a, 0x33, 0x8b, 0x5f, 0x2d, 0x55, 0x91, 0x29, 0x9b, 0x69,
0x8d, 0xb0, 0x60, 0x43, 0xc4, 0xe2, 0x97, 0x84, 0x4d, 0x4e, 0x8e, 0x7d, 0x1e, 0xb6, 0x6f, 0xd5,
0xb6, 0xac, 0x1c, 0xd2, 0xb7, 0x6a, 0x29, 0x96, 0xae, 0xa4, 0x8c, 0x91, 0x0e, 0x2b, 0x6e, 0x9c,
0x3c, 0xed, 0x07, 0x9b, 0x25, 0x8f, 0xe3, 0x73, 0x3b, 0x83, 0xb8, 0x94, 0x5e, 0xd7, 0x03, 0x86,
0x0c, 0x46, 0x2c, 0x79, 0x02, 0x38, 0x1a, 0xc2, 0x1c, 0xcf, 0xdb, 0x2c, 0xe7, 0x90, 0x73, 0xdf,
0x10, 0xe6, 0x1a, 0x53, 0x60, 0x68, 0x08, 0xa3, 0x14, 0x50, 0xdc, 0x8a, 0xfd, 0x20, 0xe0, 0x47,
0xf1, 0xdc, 0x9b, 0xb1, 0xc9, 0xbd, 0x1e, 0x29, 0x0f, 0xc5, 0x2d, 0xe2, 0xac, 0x03, 0x37, 0xdb,
0xcb, 0x24, 0x2e, 0x67, 0x7a, 0x77, 0x63, 0x3a, 0xdc, 0xa4, 0xed, 0xb8, 0x24, 0x71, 0xe0, 0x16,
0xd6, 0x40, 0xc3, 0xce, 0xfe, 0x3c, 0x9e, 0xe9, 0x9a, 0x7a, 0x6a, 0x20, 0xe4, 0xad, 0xaa, 0x3e,
0xea, 0x06, 0x91, 0x9f, 0xd7, 0xe9, 0x14, 0x58, 0xc0, 0x8f, 0x90, 0xf7, 0xf1, 0x83, 0x41, 0x94,
0xbd, 0xd5, 0xf5, 0x96, 0x2b, 0xba, 0xad, 0x7c, 0xaa, 0xd6, 0xb1, 0x23, 0xe2, 0xf1, 0x20, 0x2e,
0x94, 0xbd, 0x11, 0x3c, 0xea, 0xa3, 0xcd, 0x06, 0x6d, 0xa8, 0x8f, 0xea, 0xfd, 0xd7, 0x3e, 0x7d,
0xd4, 0x07, 0x2b, 0x9f, 0x3f, 0x55, 0x7d, 0x74, 0x27, 0xe6, 0x71, 0x9d, 0xb7, 0xbf, 0x4e, 0xe1,
0x4a, 0x2d, 0x84, 0x3d, 0xf5, 0x6d, 0xa8, 0x91, 0x78, 0x9d, 0x0a, 0xad, 0x8a, 0x37, 0x7a, 0xf3,
0x01, 0xdf, 0x6a, 0x85, 0xd0, 0xe9, 0x1b, 0x2d, 0x15, 0x36, 0x7a, 0xf3, 0x01, 0xdf, 0xea, 0x3d,
0xcd, 0x4e, 0xdf, 0xe8, 0x65, 0xcd, 0x8d, 0xde, 0xbc, 0xf2, 0xfd, 0x37, 0x4d, 0xc7, 0xb5, 0x9d,
0xd7, 0x79, 0x58, 0xc2, 0xd3, 0x25, 0xf8, 0xd2, 0x49, 0xd7, 0x9e, 0x46, 0x43, 0xe9, 0x24, 0xad,
0x62, 0x7d, 0xdc, 0xc3, 0x57, 0x8a, 0x63, 0x56, 0xa5, 0xe2, 0xc0, 0xfc, 0x79, 0x0f, 0xa3, 0x0d,
0x1c, 0x5a, 0x34, 0x85, 0x94, 0xcc, 0x71, 0xa3, 0x83, 0x9a, 0x3b, 0xb5, 0x4f, 0x03, 0xf6, 0xda,
0x57, 0x6b, 0xd7, 0x7b, 0xd2, 0xe6, 0xe0, 0xcf, 0x61, 0xec, 0x13, 0xc7, 0x50, 0xab, 0x7a, 0x0f,
0x1d, 0x37, 0xfb, 0x2b, 0x28, 0xf7, 0x7f, 0xd7, 0xac, 0x2b, 0xb0, 0x7f, 0xd5, 0x09, 0x9e, 0xf5,
0xb1, 0x88, 0x3a, 0xc2, 0xf3, 0x6b, 0xe9, 0xa8, 0x82, 0xfc, 0xd7, 0x20, 0xba, 0xe3, 0x2d, 0x88,
0x7b, 0xf6, 0xfc, 0xfb, 0x7d, 0x6c, 0xfb, 0xcf, 0xa0, 0xbf, 0xf8, 0x36, 0xaa, 0xaa, 0x74, 0xff,
0xd4, 0x2c, 0xef, 0x1b, 0x0d, 0xf1, 0xde, 0xc3, 0xab, 0x72, 0x0a, 0xa5, 0xea, 0xb1, 0xa1, 0xa0,
0x33, 0x30, 0xee, 0xb7, 0x9f, 0x5e, 0x53, 0xcb, 0xfa, 0x10, 0x8d, 0x03, 0xab, 0x77, 0xce, 0xac,
0xf2, 0x84, 0x2c, 0x5b, 0x34, 0x2e, 0xd0, 0x67, 0xd7, 0x55, 0xa3, 0x7a, 0xb2, 0x05, 0x8b, 0xf7,
0xda, 0x9f, 0xf7, 0x34, 0xec, 0xbc, 0xe9, 0xfe, 0xc9, 0xf5, 0x94, 0x54, 0x59, 0xfe, 0x67, 0x10,
0xdd, 0x77, 0x58, 0x73, 0xda, 0x81, 0xf6, 0x64, 0x7e, 0x14, 0xb0, 0x4f, 0x29, 0xe9, 0xc2, 0xfd,
0xc1, 0xb7, 0x53, 0x36, 0x5f, 0x6d, 0x71, 0x54, 0x76, 0xd3, 0x8c, 0x43, 0xd9, 0xfe, 0x6a, 0x8b,
0x6b, 0x57, 0x52, 0x23, 0xfa, 0xab, 0x2d, 0x01, 0xdc, 0xfa, 0x6a, 0x8b, 0xc7, 0xb3, 0xf7, 0xab,
0x2d, 0x5e, 0x6b, 0xc1, 0xaf, 0xb6, 0x84, 0x35, 0xa8, 0xc9, 0xa7, 0x29, 0x82, 0xdc, 0x55, 0xef,
0x65, 0xd1, 0xdd, 0x64, 0x7f, 0x76, 0x1d, 0x15, 0x62, 0xfa, 0x95, 0x9c, 0xb8, 0x11, 0xd7, 0xe3,
0x99, 0x3a, 0xb7, 0xe2, 0x36, 0x7a, 0xf3, 0xca, 0xf7, 0x4f, 0xd4, 0xda, 0x4b, 0x4f, 0x36, 0xac,
0x14, 0x5f, 0xec, 0x59, 0x0b, 0x4d, 0x1e, 0xb5, 0x05, 0xbb, 0xe5, 0x9f, 0xf6, 0x83, 0x89, 0xea,
0xd6, 0x84, 0x6a, 0xf4, 0x51, 0x97, 0x21, 0xd4, 0xe4, 0x1b, 0xbd, 0x79, 0x62, 0x92, 0x93, 0xbe,
0x65, 0x6b, 0xf7, 0x30, 0xe6, 0xb6, 0xf5, 0x66, 0x7f, 0x05, 0xe5, 0x7e, 0xa9, 0x92, 0x5a, 0xdb,
0xbd, 0x68, 0xe7, 0xf5, 0x2e, 0x53, 0x63, 0xa7, 0x99, 0x47, 0x7d, 0xf1, 0x50, 0x7a, 0x63, 0x4f,
0xf0, 0x5d, 0xe9, 0x8d, 0x77, 0x92, 0xff, 0xe4, 0x7a, 0x4a, 0xaa, 0x2c, 0xff, 0x3a, 0x88, 0x6e,
0x92, 0x65, 0x51, 0x71, 0xf0, 0x59, 0x5f, 0xcb, 0x28, 0x1e, 0x3e, 0xbf, 0xb6, 0x9e, 0x2a, 0xd4,
0x7f, 0x0c, 0xa2, 0x5b, 0x81, 0x42, 0xc9, 0x00, 0xb9, 0x86, 0x75, 0x37, 0x50, 0x7e, 0x78, 0x7d,
0x45, 0x6a, 0xba, 0xb7, 0xf1, 0x71, 0xfb, 0x73, 0x26, 0x01, 0xdb, 0x63, 0xfa, 0x73, 0x26, 0xdd,
0x5a, 0x78, 0x0b, 0xaa, 0x4e, 0x4a, 0xd4, 0xca, 0xc8, 0xb7, 0x05, 0x25, 0x72, 0x16, 0xb4, 0x22,
0x7a, 0xd8, 0xc9, 0xf9, 0x9c, 0xbc, 0x7c, 0x5b, 0xc4, 0xf9, 0x94, 0x76, 0x22, 0xe5, 0xdd, 0x4e,
0x34, 0x87, 0xb7, 0xee, 0x6a, 0xe9, 0x09, 0x6b, 0x96, 0x79, 0x8f, 0x29, 0x7d, 0x8d, 0x04, 0xb7,
0xee, 0x5a, 0x28, 0xe1, 0x4d, 0xe5, 0xb4, 0x21, 0x6f, 0x28, 0x95, 0x7d, 0xd2, 0x07, 0x45, 0x0b,
0x08, 0xed, 0x4d, 0x9f, 0x08, 0x3c, 0x0d, 0x59, 0x69, 0x9d, 0x0a, 0xac, 0xf7, 0xa4, 0x09, 0xb7,
0x63, 0xe0, 0x5f, 0x42, 0x3c, 0x85, 0x32, 0xe8, 0x56, 0x53, 0xbd, 0xdc, 0xda, 0xb4, 0xcf, 0xed,
0x36, 0xcb, 0x16, 0xf3, 0x5c, 0x35, 0x26, 0xe9, 0xd6, 0xa6, 0xba, 0xdd, 0x22, 0x1a, 0x6f, 0x5a,
0x1a, 0xb7, 0x22, 0xbd, 0x7c, 0x12, 0x36, 0xe3, 0x64, 0x95, 0x6b, 0xbd, 0x58, 0xba, 0x9e, 0x2a,
0x8c, 0x3a, 0xea, 0x89, 0x22, 0x69, 0xbd, 0x27, 0x8d, 0x77, 0x0f, 0x2d, 0xb7, 0x3a, 0x9e, 0x36,
0x3a, 0x6c, 0xb5, 0x42, 0x6a, 0xb3, 0xbf, 0x02, 0xde, 0xab, 0x55, 0x51, 0x55, 0xaf, 0x8b, 0x76,
0xd3, 0x2c, 0x1b, 0xae, 0x05, 0xc2, 0xa4, 0x81, 0x82, 0x7b, 0xb5, 0x1e, 0x98, 0x88, 0xe4, 0x66,
0x6f, 0x33, 0x1f, 0x76, 0xd9, 0x11, 0x54, 0xaf, 0x48, 0xb6, 0x69, 0xb4, 0xdf, 0x66, 0x3d, 0x6a,
0x5d, 0xdb, 0x51, 0xf8, 0xc1, 0xb5, 0x2a, 0xbc, 0xd1, 0x9b, 0x47, 0x97, 0x01, 0x04, 0x25, 0x66,
0x96, 0x7b, 0x94, 0x09, 0x67, 0x26, 0xb9, 0xdf, 0x41, 0xa1, 0x3d, 0x4b, 0xd9, 0x8d, 0xde, 0xa4,
0xd3, 0x19, 0x70, 0xef, 0x39, 0x96, 0x0d, 0x04, 0xcf, 0xb1, 0x10, 0x88, 0x9a, 0x4e, 0xfe, 0xae,
0x37, 0x6b, 0xf7, 0xa7, 0xbe, 0xa6, 0x53, 0xca, 0x16, 0x15, 0x6a, 0x3a, 0x2f, 0x8d, 0x46, 0x03,
0xed, 0x56, 0xbd, 0xba, 0xfe, 0x24, 0x64, 0x06, 0xbd, 0xbf, 0xbe, 0xd6, 0x8b, 0x45, 0x33, 0x8a,
0x71, 0x98, 0xce, 0x53, 0xee, 0x9b, 0x51, 0x2c, 0x1b, 0x35, 0x12, 0x9a, 0x51, 0xda, 0x28, 0x55,
0xbd, 0x3a, 0x47, 0xd8, 0x9f, 0x86, 0xab, 0x27, 0x99, 0x7e, 0xd5, 0xd3, 0x6c, 0xeb, 0xd8, 0x35,
0xd7, 0x21, 0xc3, 0x2f, 0xd4, 0x62, 0xd9, 0x13, 0xdb, 0xe2, 0xe5, 0x4a, 0x0c, 0x86, 0x46, 0x1d,
0x4a, 0x01, 0x1f, 0x27, 0xd4, 0x5c, 0x73, 0x32, 0x5c, 0x14, 0x10, 0x97, 0x71, 0x9e, 0x78, 0x17,
0xa7, 0xc2, 0x60, 0x8b, 0x0c, 0x2d, 0x4e, 0x49, 0x0d, 0x74, 0xa8, 0xef, 0xbe, 0x16, 0xe9, 0xe9,
0x0a, 0xfa, 0xfd, 0x43, 0xf7, 0xad, 0xc8, 0xc7, 0x3d, 0x48, 0x7c, 0xa8, 0xdf, 0x00, 0x7a, 0x5b,
0x5e, 0x3a, 0xfd, 0x38, 0x60, 0xca, 0x45, 0x43, 0x0b, 0x61, 0x5a, 0x05, 0x05, 0xb5, 0x4e, 0x70,
0x81, 0xff, 0x18, 0x56, 0xbe, 0xa0, 0x36, 0xf9, 0xa9, 0x40, 0x42, 0x41, 0xdd, 0x46, 0x51, 0x9e,
0x69, 0xaf, 0x83, 0x1e, 0x04, 0xf4, 0xed, 0xa5, 0xcf, 0xc3, 0x4e, 0x0e, 0xf5, 0x9c, 0x9d, 0x74,
0xe9, 0x9c, 0x62, 0x78, 0x0a, 0xba, 0x93, 0x2e, 0xfd, 0x87, 0x18, 0x6b, 0xbd, 0x58, 0x7c, 0x61,
0x20, 0xe6, 0xf0, 0xb6, 0x39, 0xc9, 0xf7, 0x14, 0x57, 0xc8, 0x5b, 0x47, 0xf9, 0x8f, 0xba, 0x41,
0x73, 0x3d, 0xf7, 0xb8, 0x64, 0x09, 0x54, 0x95, 0xfa, 0xc6, 0x9b, 0x7b, 0xff, 0x49, 0xc9, 0x46,
0xe8, 0x0b, 0x6f, 0xf7, 0xc2, 0x90, 0xb2, 0xfd, 0x65, 0xf4, 0xee, 0x01, 0x9b, 0x8d, 0x21, 0x9f,
0x0e, 0x7f, 0xe0, 0x5e, 0x88, 0x65, 0xb3, 0x51, 0xfd, 0xb3, 0xb6, 0x77, 0x83, 0x12, 0x9b, 0x2b,
0x7d, 0x3b, 0x70, 0xb6, 0x98, 0x8d, 0x79, 0xcc, 0xd1, 0x95, 0x3e, 0xf1, 0xfb, 0xa8, 0x16, 0x10,
0x57, 0xfa, 0x1c, 0x00, 0xd9, 0x9b, 0x94, 0x00, 0x5e, 0x7b, 0xb5, 0x20, 0x68, 0x4f, 0x01, 0x66,
0xd6, 0xd5, 0xf6, 0xea, 0xc4, 0x16, 0x5f, 0xc1, 0x33, 0x3a, 0x42, 0x4a, 0xcc, 0xba, 0x6d, 0xca,
0x04, 0x83, 0xac, 0xbe, 0xf8, 0xa2, 0xc5, 0x62, 0x3e, 0x8f, 0xcb, 0x15, 0x0a, 0x06, 0x55, 0x4b,
0x0b, 0x20, 0x82, 0xc1, 0x0b, 0x9a, 0x28, 0x6f, 0x1e, 0x73, 0x72, 0xb9, 0xc7, 0x4a, 0xb6, 0xe0,
0x69, 0x0e, 0xf8, 0xab, 0x06, 0xfa, 0x81, 0xda, 0x0c, 0x11, 0xe5, 0x14, 0x6b, 0xb2, 0x42, 0x41,
0xc8, 0xdb, 0x81, 0xe2, 0x4b, 0xa9, 0x15, 0x67, 0x25, 0x3e, 0x1d, 0x94, 0x56, 0x30, 0x44, 0x64,
0x85, 0x24, 0x8c, 0xda, 0xfe, 0x38, 0xcd, 0x67, 0xde, 0xb6, 0x3f, 0xb6, 0xbf, 0x33, 0x78, 0x8b,
0x06, 0xcc, 0xf8, 0x2e, 0x1f, 0x9a, 0xfc, 0x72, 0x90, 0x7a, 0x4b, 0xd2, 0xfb, 0xd0, 0x6d, 0x82,
0x18, 0xdf, 0xfd, 0x24, 0x72, 0xf5, 0xaa, 0x80, 0x1c, 0xa6, 0xcd, 0x1d, 0x38, 0x9f, 0x2b, 0x87,
0x08, 0xba, 0xc2, 0xa4, 0x19, 0x55, 0x85, 0xfc, 0x64, 0x91, 0x1f, 0x97, 0xec, 0x3c, 0xcd, 0xa0,
0x44, 0xa3, 0xaa, 0x54, 0xb7, 0xe4, 0xc4, 0xa8, 0xea, 0xe3, 0xcc, 0x65, 0x0a, 0x21, 0x75, 0x3e,
0xf7, 0x3b, 0x29, 0xe3, 0x04, 0x5f, 0xa6, 0x90, 0x36, 0xda, 0x18, 0xb1, 0x93, 0x16, 0xc0, 0x4d,
0xa4, 0x1f, 0x02, 0x2f, 0xd3, 0xa4, 0x1a, 0x03, 0x3f, 0x8e, 0xcb, 0x78, 0x0e, 0x1c, 0x4a, 0x1c,
0xe9, 0x0a, 0x19, 0x39, 0x0c, 0x11, 0xe9, 0x14, 0xab, 0x1c, 0xfe, 0x61, 0xf4, 0x7e, 0x3d, 0xd0,
0x43, 0xae, 0xbe, 0x4c, 0xff, 0x52, 0xfc, 0x49, 0x8b, 0xe1, 0x07, 0xda, 0xc6, 0x98, 0x97, 0x10,
0xcf, 0x1b, 0xdb, 0xef, 0xe9, 0xdf, 0x05, 0xb8, 0x39, 0xa8, 0x1b, 0xe4, 0x88, 0xf1, 0xf4, 0xbc,
0x5e, 0x57, 0xa9, 0x53, 0x2c, 0xd4, 0x20, 0xb6, 0x78, 0x14, 0xf8, 0x64, 0x80, 0x8f, 0x33, 0x03,
0x8d, 0x2d, 0x3d, 0x81, 0x22, 0xc3, 0x03, 0x8d, 0xa3, 0x2d, 0x00, 0x62, 0xa0, 0xf1, 0x82, 0x26,
0xba, 0x6c, 0xf1, 0x04, 0xc2, 0x95, 0x99, 0x40, 0xbf, 0xca, 0x4c, 0x9c, 0x77, 0x04, 0xb2, 0xe8,
0xfd, 0x43, 0x98, 0x9f, 0x41, 0x59, 0x5d, 0xa4, 0xc5, 0x5e, 0x3d, 0xc3, 0xc6, 0x7c, 0x81, 0xdf,
0xa2, 0x33, 0xc4, 0x48, 0x23, 0x44, 0x1a, 0x42, 0xa0, 0x66, 0x28, 0x33, 0xc0, 0x7e, 0x75, 0x14,
0xcf, 0x41, 0x7c, 0x00, 0x61, 0xb8, 0x46, 0x19, 0xb1, 0x20, 0x62, 0x28, 0x23, 0x61, 0xeb, 0x75,
0x23, 0xc3, 0x9c, 0xc0, 0xac, 0x8e, 0xb0, 0xf2, 0x38, 0x5e, 0xcd, 0x21, 0xe7, 0xca, 0x24, 0xda,
0x84, 0xb5, 0x4c, 0xfa, 0x79, 0x62, 0x13, 0xb6, 0x8f, 0x9e, 0x95, 0x74, 0x3b, 0x0f, 0xfe, 0x98,
0x95, 0x5c, 0xfe, 0xdd, 0x89, 0xd3, 0x32, 0x43, 0x49, 0xb7, 0xfb, 0x50, 0x1d, 0x92, 0x48, 0xba,
0xc3, 0x1a, 0xd6, 0x07, 0x9b, 0x9d, 0x32, 0xbc, 0x86, 0x52, 0xc7, 0xc9, 0xcb, 0x79, 0x9c, 0x66,
0x2a, 0x1a, 0xbe, 0x08, 0xd8, 0x26, 0x74, 0x88, 0x0f, 0x36, 0xf7, 0xd5, 0xb5, 0x3e, 0x71, 0x1d,
0x2e, 0x21, 0xda, 0x13, 0xee, 0xb0, 0x4f, 0xec, 0x09, 0x77, 0x6b, 0x99, 0xa5, 0x9a, 0x61, 0x05,
0xb7, 0x12, 0xc4, 0x36, 0x9b, 0xe2, 0x0d, 0x22, 0xcb, 0x26, 0x02, 0x89, 0xa5, 0x5a, 0x50, 0xc1,
0xcc, 0x6d, 0x06, 0xdb, 0x4d, 0xf3, 0x38, 0x4b, 0x7f, 0x8a, 0xef, 0x3e, 0x5b, 0x76, 0x1a, 0x82,
0x98, 0xdb, 0xfc, 0xa4, 0xcf, 0xd5, 0x1e, 0xf0, 0x49, 0x5a, 0x0f, 0xfd, 0x8f, 0x02, 0xcf, 0x4d,
0x10, 0xdd, 0xae, 0x2c, 0x52, 0xb9, 0xfa, 0xd9, 0x20, 0xba, 0x89, 0x1f, 0xeb, 0x56, 0x51, 0x8c,
0xeb, 0x94, 0xe4, 0x04, 0x12, 0x48, 0x0b, 0x3e, 0xfc, 0x34, 0xfc, 0xac, 0x10, 0x4e, 0x9c, 0xac,
0xf7, 0x50, 0xb3, 0xce, 0x6b, 0xeb, 0xb1, 0x64, 0x2c, 0xff, 0x20, 0xd3, 0x69, 0x05, 0xa5, 0x9a,
0x29, 0xf7, 0x80, 0xa3, 0xde, 0x69, 0x71, 0x23, 0x0b, 0xac, 0x2b, 0x4a, 0xf4, 0xce, 0xb0, 0x86,
0xd9, 0xdd, 0xb1, 0xb8, 0x13, 0xa8, 0x58, 0xb6, 0x04, 0x71, 0xfd, 0xed, 0x29, 0x69, 0xcc, 0xa2,
0x88, 0xdd, 0x1d, 0x9a, 0x36, 0xe9, 0x46, 0xdb, 0xed, 0x56, 0xbe, 0xda, 0xc7, 0x67, 0xe4, 0x1e,
0x4b, 0x02, 0x23, 0xd2, 0x8d, 0x00, 0x6e, 0xed, 0x7e, 0x96, 0x2c, 0x9e, 0x26, 0x71, 0xc5, 0x8f,
0xe3, 0x55, 0xc6, 0xe2, 0xa9, 0x98, 0xd7, 0xf1, 0xee, 0x67, 0xc3, 0x8c, 0x6c, 0x88, 0xda, 0xfd,
0xa4, 0x60, 0xb3, 0xb2, 0x53, 0x7f, 0x67, 0x4a, 0x5d, 0x2d, 0xbc, 0x8b, 0x72, 0x24, 0x51, 0x5e,
0x7c, 0xad, 0xf0, 0x5e, 0x18, 0x32, 0xaf, 0x44, 0x49, 0x91, 0x48, 0x43, 0x6e, 0xf9, 0x74, 0x9c,
0x04, 0xe4, 0x76, 0x80, 0x30, 0x9f, 0x49, 0x90, 0xbf, 0x37, 0x7f, 0x2a, 0x81, 0xab, 0x4f, 0xd7,
0x3e, 0xf5, 0xe9, 0xda, 0xd0, 0xc8, 0xfe, 0x0e, 0xd9, 0x7a, 0x4f, 0x5a, 0x7a, 0x7d, 0x71, 0xfb,
0x7f, 0xbf, 0xbe, 0x31, 0xf8, 0xf9, 0xd7, 0x37, 0x06, 0xff, 0xff, 0xf5, 0x8d, 0xc1, 0xcf, 0xbe,
0xb9, 0xf1, 0xce, 0xcf, 0xbf, 0xb9, 0xf1, 0xce, 0x2f, 0xbe, 0xb9, 0xf1, 0xce, 0x57, 0xef, 0xaa,
0x3f, 0x58, 0x76, 0xf6, 0x2b, 0xe2, 0xcf, 0x8e, 0x3d, 0xff, 0x65, 0x00, 0x00, 0x00, 0xff, 0xff,
0xf5, 0x3b, 0x43, 0x25, 0xd4, 0x6c, 0x00, 0x00,
0x52, 0xc0, 0xb7, 0x5f, 0x58, 0xa8, 0xe3, 0x16, 0xa8, 0x85, 0x65, 0x6f, 0xb9, 0x9b, 0xef, 0x6f,
0x8f, 0xdb, 0xb3, 0x33, 0xfb, 0x71, 0xec, 0x21, 0x21, 0x8f, 0x3d, 0xf6, 0x9a, 0xb3, 0x3d, 0xc6,
0x6d, 0xcf, 0x48, 0x2b, 0x21, 0x51, 0x53, 0x1d, 0x6e, 0x17, 0xae, 0xae, 0xac, 0xab, 0xca, 0x6e,
0x4f, 0x1f, 0x02, 0x81, 0x40, 0x20, 0x10, 0x88, 0x13, 0x5f, 0x2f, 0x3c, 0x20, 0xf1, 0xd7, 0xf0,
0x78, 0x12, 0x2f, 0xf0, 0x86, 0x76, 0xff, 0x91, 0x53, 0x65, 0x66, 0xe5, 0x47, 0x54, 0x46, 0x56,
0x79, 0x9f, 0x66, 0xd4, 0xf1, 0x8b, 0x88, 0xcc, 0xca, 0xcc, 0xc8, 0xc8, 0x8f, 0x2a, 0x47, 0xd7,
0xcb, 0x37, 0x1b, 0x65, 0xc5, 0x38, 0xab, 0x37, 0x6a, 0xa8, 0x96, 0x59, 0x0a, 0xed, 0xbf, 0x63,
0xf1, 0x73, 0xfc, 0x6e, 0x52, 0xac, 0xf8, 0xaa, 0x84, 0x8f, 0x3e, 0x34, 0x64, 0xca, 0xe6, 0xf3,
0xa4, 0x98, 0xd6, 0x12, 0xf9, 0xe8, 0x03, 0x23, 0x81, 0x25, 0x14, 0x5c, 0xfd, 0xfe, 0xf4, 0x7f,
0xfe, 0x6f, 0x14, 0xbd, 0xb7, 0x95, 0x67, 0x50, 0xf0, 0x2d, 0xa5, 0x11, 0x7f, 0x15, 0x7d, 0x77,
0xb3, 0x2c, 0x77, 0x81, 0xbf, 0x82, 0xaa, 0xce, 0x58, 0x11, 0xdf, 0x1e, 0x2b, 0x07, 0xe3, 0xe3,
0x32, 0x1d, 0x6f, 0x96, 0xe5, 0xd8, 0x08, 0xc7, 0xc7, 0xf0, 0x93, 0x05, 0xd4, 0xfc, 0xa3, 0x3b,
0x61, 0xa8, 0x2e, 0x59, 0x51, 0x43, 0x7c, 0x16, 0xfd, 0xc6, 0x66, 0x59, 0x4e, 0x80, 0x6f, 0x43,
0x53, 0x81, 0x09, 0x4f, 0x38, 0xc4, 0xf7, 0x3b, 0xaa, 0x2e, 0xa0, 0x7d, 0x3c, 0xe8, 0x07, 0x95,
0x9f, 0x93, 0xe8, 0x3b, 0x8d, 0x9f, 0xf3, 0x05, 0x9f, 0xb2, 0xcb, 0x22, 0xbe, 0xd9, 0x55, 0x54,
0x22, 0x6d, 0xfb, 0x56, 0x08, 0x51, 0x56, 0x5f, 0x47, 0xbf, 0xfa, 0x3a, 0xc9, 0x73, 0xe0, 0x5b,
0x15, 0x34, 0x05, 0x77, 0x75, 0xa4, 0x68, 0x2c, 0x65, 0xda, 0xee, 0xed, 0x20, 0xa3, 0x0c, 0x7f,
0x15, 0x7d, 0x57, 0x4a, 0x8e, 0x21, 0x65, 0x4b, 0xa8, 0x62, 0xaf, 0x96, 0x12, 0x12, 0x8f, 0xbc,
0x03, 0x61, 0xdb, 0x5b, 0xac, 0x58, 0x42, 0xc5, 0xfd, 0xb6, 0x95, 0x30, 0x6c, 0xdb, 0x40, 0xca,
0xf6, 0xdf, 0x8d, 0xa2, 0xef, 0x6f, 0xa6, 0x29, 0x5b, 0x14, 0x7c, 0x9f, 0xa5, 0x49, 0xbe, 0x9f,
0x15, 0x17, 0x87, 0x70, 0xb9, 0x75, 0xde, 0xf0, 0xc5, 0x0c, 0xe2, 0x67, 0xee, 0x53, 0x95, 0xe8,
0x58, 0xb3, 0x63, 0x1b, 0xd6, 0xbe, 0x3f, 0xb9, 0x9a, 0x92, 0x2a, 0xcb, 0x3f, 0x8d, 0xa2, 0x6b,
0xb8, 0x2c, 0x13, 0x96, 0x2f, 0xc1, 0x94, 0xe6, 0xd3, 0x1e, 0xc3, 0x2e, 0xae, 0xcb, 0xf3, 0xd9,
0x55, 0xd5, 0x54, 0x89, 0xf2, 0xe8, 0x7d, 0xbb, 0xbb, 0x4c, 0xa0, 0x16, 0xc3, 0xe9, 0x21, 0xdd,
0x23, 0x14, 0xa2, 0x3d, 0x3f, 0x1a, 0x82, 0x2a, 0x6f, 0x59, 0x14, 0x2b, 0x6f, 0x39, 0xab, 0xb5,
0xb3, 0x07, 0x5e, 0x0b, 0x16, 0xa1, 0x7d, 0x3d, 0x1c, 0x40, 0x2a, 0x57, 0x7f, 0x1c, 0xfd, 0xda,
0x6b, 0x56, 0x5d, 0xd4, 0x65, 0x92, 0x82, 0x1a, 0x0a, 0x77, 0x5d, 0xed, 0x56, 0x8a, 0x47, 0xc3,
0xbd, 0x3e, 0xcc, 0xea, 0xb4, 0xad, 0xf0, 0x65, 0x09, 0x38, 0x06, 0x19, 0xc5, 0x46, 0x48, 0x75,
0x5a, 0x0c, 0x29, 0xdb, 0x17, 0x51, 0x6c, 0x6c, 0xbf, 0xf9, 0x13, 0x48, 0xf9, 0xe6, 0x74, 0x8a,
0x5b, 0xc5, 0xe8, 0x0a, 0x62, 0xbc, 0x39, 0x9d, 0x52, 0xad, 0xe2, 0x47, 0x95, 0xb3, 0xcb, 0xe8,
0x03, 0xe4, 0x6c, 0x3f, 0xab, 0x85, 0xc3, 0xf5, 0xb0, 0x15, 0x85, 0x69, 0xa7, 0xe3, 0xa1, 0xb8,
0x72, 0xfc, 0x17, 0xa3, 0xe8, 0x7b, 0x1e, 0xcf, 0xc7, 0x30, 0x67, 0x4b, 0x88, 0x9f, 0xf4, 0x5b,
0x93, 0xa4, 0xf6, 0xff, 0xf1, 0x15, 0x34, 0x3c, 0xdd, 0x64, 0x02, 0x39, 0xa4, 0x9c, 0xec, 0x26,
0x52, 0xdc, 0xdb, 0x4d, 0x34, 0x66, 0x8d, 0xb0, 0x56, 0xb8, 0x0b, 0x7c, 0x6b, 0x51, 0x55, 0x50,
0x70, 0xb2, 0x2d, 0x0d, 0xd2, 0xdb, 0x96, 0x0e, 0xea, 0xa9, 0xcf, 0x2e, 0xf0, 0xcd, 0x3c, 0x27,
0xeb, 0x23, 0xc5, 0xbd, 0xf5, 0xd1, 0x98, 0xf2, 0x90, 0x46, 0xbf, 0x6e, 0x3d, 0x31, 0xbe, 0x57,
0x9c, 0xb1, 0x98, 0x7e, 0x16, 0x42, 0xae, 0x7d, 0xdc, 0xef, 0xe5, 0x3c, 0xd5, 0x78, 0xf1, 0xb6,
0x64, 0x15, 0xdd, 0x2c, 0x52, 0xdc, 0x5b, 0x0d, 0x8d, 0x29, 0x0f, 0x7f, 0x14, 0xbd, 0xa7, 0xa2,
0x64, 0x3b, 0x9f, 0xdd, 0xf1, 0x86, 0x50, 0x3c, 0xa1, 0xdd, 0xed, 0xa1, 0x4c, 0x70, 0x50, 0x32,
0x15, 0x7c, 0x6e, 0x7b, 0xf5, 0x50, 0xe8, 0xb9, 0x13, 0x86, 0x3a, 0xb6, 0xb7, 0x21, 0x07, 0xd2,
0xb6, 0x14, 0xf6, 0xd8, 0xd6, 0x90, 0xb2, 0x5d, 0x45, 0xbf, 0xa5, 0x1f, 0x4b, 0x33, 0x8f, 0x0a,
0x79, 0x13, 0xa4, 0xd7, 0x88, 0x7a, 0xdb, 0x90, 0xf6, 0xf5, 0x78, 0x18, 0xdc, 0xa9, 0x8f, 0x1a,
0x81, 0xfe, 0xfa, 0xa0, 0xf1, 0x77, 0x27, 0x0c, 0x29, 0xdb, 0x7f, 0x3f, 0x8a, 0x7e, 0xa0, 0x64,
0x2f, 0x8a, 0xe4, 0x4d, 0x0e, 0x62, 0x4a, 0x3c, 0x04, 0x7e, 0xc9, 0xaa, 0x8b, 0xc9, 0xaa, 0x48,
0x89, 0xe9, 0xdf, 0x0f, 0xf7, 0x4c, 0xff, 0xa4, 0x92, 0x95, 0xf1, 0xa9, 0x8a, 0x72, 0x56, 0xe2,
0x8c, 0xaf, 0xad, 0x01, 0x67, 0x25, 0x95, 0xf1, 0xb9, 0x48, 0xc7, 0xea, 0x41, 0x13, 0x36, 0xfd,
0x56, 0x0f, 0xec, 0x38, 0x79, 0x2b, 0x84, 0x98, 0xb0, 0xd5, 0x76, 0x60, 0x56, 0x9c, 0x65, 0xb3,
0xd3, 0x72, 0xda, 0x74, 0xe3, 0x87, 0xfe, 0x1e, 0x6a, 0x21, 0x44, 0xd8, 0x22, 0x50, 0xe5, 0xed,
0x1f, 0x4d, 0x62, 0xa4, 0x86, 0xd2, 0x4e, 0xc5, 0xe6, 0xfb, 0x30, 0x4b, 0xd2, 0x95, 0x1a, 0xff,
0x9f, 0x84, 0x06, 0x1e, 0xa6, 0x75, 0x21, 0x3e, 0xbd, 0xa2, 0x96, 0x2a, 0xcf, 0x7f, 0x8e, 0xa2,
0x3b, 0x6d, 0xf5, 0xcf, 0x93, 0x62, 0x06, 0xaa, 0x3d, 0x65, 0xe9, 0x37, 0x8b, 0xe9, 0x31, 0xd4,
0x3c, 0xa9, 0x78, 0xfc, 0x85, 0xbf, 0x92, 0x21, 0x1d, 0x5d, 0xb6, 0x1f, 0x7d, 0x2b, 0x5d, 0xd3,
0xea, 0x93, 0x26, 0xb0, 0xa9, 0x10, 0xe0, 0xb6, 0xba, 0x90, 0xe0, 0x00, 0x70, 0x2b, 0x84, 0x98,
0x56, 0x17, 0x82, 0xbd, 0x62, 0x99, 0x71, 0xd8, 0x85, 0x02, 0xaa, 0x6e, 0xab, 0x4b, 0x55, 0x17,
0x21, 0x5a, 0x9d, 0x40, 0x4d, 0xb0, 0x71, 0xbc, 0xe9, 0xc9, 0x71, 0x2d, 0x60, 0xa4, 0x33, 0x3d,
0x3e, 0x1e, 0x06, 0x9b, 0xd5, 0x9d, 0xe5, 0xf3, 0x18, 0x96, 0xec, 0x02, 0xaf, 0xee, 0x6c, 0x13,
0x12, 0x20, 0x56, 0x77, 0x5e, 0xd0, 0xcc, 0x60, 0x96, 0x9f, 0x57, 0x19, 0x5c, 0xa2, 0x19, 0xcc,
0x56, 0x6e, 0xc4, 0xc4, 0x0c, 0xe6, 0xc1, 0x94, 0x87, 0xc3, 0xe8, 0x57, 0x84, 0xf0, 0x0f, 0x58,
0x56, 0xc4, 0xd7, 0x3d, 0x4a, 0x8d, 0x40, 0x5b, 0xbd, 0x41, 0x03, 0xa8, 0xc4, 0xcd, 0xaf, 0x5b,
0x49, 0x91, 0x42, 0xee, 0x2d, 0xb1, 0x11, 0x07, 0x4b, 0xec, 0x60, 0x26, 0x75, 0x10, 0xc2, 0x26,
0x7e, 0x4d, 0xce, 0x93, 0x2a, 0x2b, 0x66, 0xb1, 0x4f, 0xd7, 0x92, 0x13, 0xa9, 0x83, 0x8f, 0x43,
0x5d, 0x58, 0x29, 0x6e, 0x96, 0x65, 0xd5, 0x84, 0x45, 0x5f, 0x17, 0x76, 0x91, 0x60, 0x17, 0xee,
0xa0, 0x7e, 0x6f, 0xdb, 0x90, 0xe6, 0x59, 0x11, 0xf4, 0xa6, 0x90, 0x21, 0xde, 0x0c, 0x8a, 0x3a,
0xef, 0x3e, 0x24, 0x4b, 0x68, 0x6b, 0xe6, 0x7b, 0x32, 0x36, 0x10, 0xec, 0xbc, 0x08, 0x34, 0xeb,
0x34, 0x21, 0x3e, 0x48, 0x2e, 0xa0, 0x79, 0xc0, 0xd0, 0xcc, 0x6b, 0xb1, 0x4f, 0xdf, 0x21, 0x88,
0x75, 0x9a, 0x9f, 0x54, 0xae, 0x16, 0xd1, 0x07, 0x42, 0x7e, 0x94, 0x54, 0x3c, 0x4b, 0xb3, 0x32,
0x29, 0xda, 0xfc, 0xdf, 0x37, 0xae, 0x3b, 0x94, 0x76, 0xb9, 0x3e, 0x90, 0x56, 0x6e, 0xff, 0x7d,
0x14, 0xdd, 0xc4, 0x7e, 0x8f, 0xa0, 0x9a, 0x67, 0x62, 0x19, 0x59, 0xcb, 0x20, 0x1c, 0x7f, 0x1e,
0x36, 0xda, 0x51, 0xd0, 0xa5, 0xf9, 0xe1, 0xd5, 0x15, 0x55, 0xc1, 0xfe, 0x30, 0x8a, 0xe4, 0x72,
0x45, 0x2c, 0x29, 0xdd, 0x51, 0xab, 0xd6, 0x31, 0xce, 0x7a, 0xf2, 0x66, 0x80, 0x30, 0x53, 0x85,
0xfc, 0x5d, 0xac, 0x94, 0x63, 0xaf, 0x86, 0x10, 0x11, 0x53, 0x05, 0x42, 0x70, 0x41, 0x27, 0xe7,
0xec, 0xd2, 0x5f, 0xd0, 0x46, 0x12, 0x2e, 0xa8, 0x22, 0xcc, 0xde, 0x95, 0x2a, 0xa8, 0x6f, 0xef,
0xaa, 0x2d, 0x46, 0x68, 0xef, 0x0a, 0x33, 0xca, 0x30, 0x8b, 0x7e, 0xd3, 0x36, 0xfc, 0x9c, 0xb1,
0x8b, 0x79, 0x52, 0x5d, 0xc4, 0x8f, 0x68, 0xe5, 0x96, 0xd1, 0x8e, 0xd6, 0x06, 0xb1, 0x26, 0x2c,
0xd8, 0x0e, 0x9b, 0x44, 0xe3, 0xb4, 0xca, 0x51, 0x58, 0x70, 0x6c, 0x28, 0x84, 0x08, 0x0b, 0x04,
0x6a, 0x22, 0xb7, 0xed, 0x6d, 0x02, 0x78, 0xb5, 0xe4, 0xa8, 0x4f, 0x80, 0x5a, 0x2d, 0x79, 0x30,
0xdc, 0x85, 0x76, 0xab, 0xa4, 0x3c, 0xf7, 0x77, 0x21, 0x21, 0x0a, 0x77, 0xa1, 0x16, 0xc1, 0xed,
0x3d, 0x81, 0xa4, 0x4a, 0xcf, 0xfd, 0xed, 0x2d, 0x65, 0xe1, 0xf6, 0xd6, 0x0c, 0x6e, 0x6f, 0x29,
0x78, 0x9d, 0xf1, 0xf3, 0x03, 0xe0, 0x89, 0xbf, 0xbd, 0x5d, 0x26, 0xdc, 0xde, 0x1d, 0xd6, 0x64,
0x32, 0xb6, 0xc3, 0xc9, 0xe2, 0x4d, 0x9d, 0x56, 0xd9, 0x1b, 0x88, 0x03, 0x56, 0x34, 0x44, 0x64,
0x32, 0x24, 0x6c, 0x82, 0xb4, 0xf2, 0xd9, 0xca, 0xf6, 0xa6, 0x35, 0x0a, 0xd2, 0xad, 0x0d, 0x8b,
0x20, 0x82, 0xb4, 0x9f, 0xc4, 0xd5, 0xdb, 0xad, 0xd8, 0xa2, 0xac, 0x7b, 0xaa, 0x87, 0xa0, 0x70,
0xf5, 0xba, 0xb0, 0xf2, 0xf9, 0x36, 0xfa, 0x6d, 0xfb, 0x91, 0x9e, 0x16, 0xb5, 0xf6, 0xba, 0x4e,
0x3f, 0x27, 0x0b, 0x23, 0xb6, 0xa5, 0x02, 0xb8, 0x49, 0x53, 0x5a, 0xcf, 0x7c, 0x1b, 0x78, 0x92,
0xe5, 0x75, 0x7c, 0xcf, 0x6f, 0xa3, 0x95, 0x13, 0x69, 0x8a, 0x8f, 0xc3, 0x63, 0x76, 0x7b, 0x51,
0xe6, 0x59, 0xda, 0xdd, 0x9f, 0x54, 0xba, 0x5a, 0x1c, 0x1e, 0xb3, 0x36, 0x86, 0x63, 0xd0, 0x04,
0xb8, 0xfc, 0xcf, 0xc9, 0xaa, 0x04, 0x7f, 0x0c, 0x72, 0x90, 0x70, 0x0c, 0xc2, 0x28, 0xae, 0xcf,
0x04, 0xf8, 0x7e, 0xb2, 0x62, 0x0b, 0x22, 0x06, 0x69, 0x71, 0xb8, 0x3e, 0x36, 0x66, 0x32, 0x05,
0xed, 0x61, 0xaf, 0xe0, 0x50, 0x15, 0x49, 0xbe, 0x93, 0x27, 0xb3, 0x3a, 0x26, 0xc6, 0x8d, 0x4b,
0x11, 0x99, 0x02, 0x4d, 0x7b, 0x1e, 0xe3, 0x5e, 0xbd, 0x93, 0x2c, 0x59, 0x95, 0x71, 0xfa, 0x31,
0x1a, 0xa4, 0xf7, 0x31, 0x3a, 0xa8, 0xd7, 0xdb, 0x66, 0x95, 0x9e, 0x67, 0x4b, 0x98, 0x06, 0xbc,
0xb5, 0xc8, 0x00, 0x6f, 0x16, 0xea, 0x69, 0xb4, 0x09, 0x5b, 0x54, 0x29, 0x90, 0x8d, 0x26, 0xc5,
0xbd, 0x8d, 0xa6, 0x31, 0xe5, 0xe1, 0xaf, 0x47, 0xd1, 0xef, 0x48, 0xa9, 0xbd, 0x69, 0xb8, 0x9d,
0xd4, 0xe7, 0x6f, 0x58, 0x52, 0x4d, 0xe3, 0x8f, 0x7d, 0x76, 0xbc, 0xa8, 0x76, 0xfd, 0xf4, 0x2a,
0x2a, 0xf8, 0xb1, 0xee, 0x67, 0xb5, 0x35, 0xe2, 0xbc, 0x8f, 0xd5, 0x41, 0xc2, 0x8f, 0x15, 0xa3,
0x38, 0x80, 0x08, 0xb9, 0x5c, 0xa0, 0xdf, 0x23, 0xf5, 0xdd, 0x55, 0xfa, 0xfd, 0x5e, 0x0e, 0xc7,
0xc7, 0x46, 0xe8, 0xf6, 0x96, 0x75, 0xca, 0x86, 0xbf, 0xc7, 0x8c, 0x87, 0xe2, 0xa4, 0x67, 0x3d,
0x2a, 0xc2, 0x9e, 0x3b, 0x23, 0x63, 0x3c, 0x14, 0x27, 0x3c, 0x5b, 0x61, 0x2d, 0xe4, 0xd9, 0x13,
0xda, 0xc6, 0x43, 0x71, 0x9c, 0x51, 0x28, 0xa6, 0x9d, 0x17, 0x1e, 0x05, 0xec, 0xe0, 0xb9, 0x61,
0x6d, 0x10, 0xab, 0x1c, 0xfe, 0xed, 0x28, 0xfa, 0xbe, 0xf1, 0x78, 0xc0, 0xa6, 0xd9, 0xd9, 0x4a,
0x42, 0xaf, 0x92, 0x7c, 0x01, 0x75, 0xfc, 0x94, 0xb2, 0xd6, 0x65, 0x75, 0x09, 0x9e, 0x5d, 0x49,
0x07, 0x8f, 0x9d, 0xcd, 0xb2, 0xcc, 0x57, 0x27, 0x30, 0x2f, 0x73, 0x72, 0xec, 0x38, 0x48, 0x78,
0xec, 0x60, 0x14, 0x67, 0x9a, 0x27, 0xac, 0xc9, 0x63, 0xbd, 0x99, 0xa6, 0x10, 0x85, 0x33, 0xcd,
0x16, 0xc1, 0xb9, 0xd2, 0x09, 0xdb, 0x62, 0x79, 0x0e, 0x29, 0xef, 0x1e, 0x3c, 0x6a, 0x4d, 0x43,
0x84, 0x73, 0x25, 0x44, 0x9a, 0x35, 0x7a, 0xbb, 0x2e, 0x4a, 0x2a, 0x78, 0xbe, 0xda, 0xcf, 0x8a,
0x8b, 0xd8, 0x9f, 0x16, 0x18, 0x80, 0x58, 0xa3, 0x7b, 0x41, 0xbc, 0xfe, 0x3a, 0x2d, 0xa6, 0xcc,
0xbf, 0xfe, 0x6a, 0x24, 0xe1, 0xf5, 0x97, 0x22, 0xb0, 0xc9, 0x63, 0xa0, 0x4c, 0x36, 0x92, 0xb0,
0x49, 0x45, 0xf8, 0x42, 0xa1, 0xda, 0xc9, 0x25, 0x43, 0x21, 0xda, 0xbb, 0xbd, 0xdf, 0xcb, 0xe1,
0x1e, 0xda, 0x2e, 0xc4, 0x76, 0x80, 0xa7, 0xe7, 0xfe, 0x1e, 0xea, 0x20, 0xe1, 0x1e, 0x8a, 0x51,
0x5c, 0xa5, 0x13, 0xa6, 0x17, 0x92, 0xf7, 0xfc, 0xfd, 0xa3, 0xb3, 0x88, 0xbc, 0xdf, 0xcb, 0xe1,
0xa5, 0xd1, 0xde, 0x5c, 0x3c, 0x33, 0x6f, 0x27, 0x97, 0xb2, 0xf0, 0xd2, 0x48, 0x33, 0xb8, 0xf4,
0x52, 0xd0, 0x3c, 0x4e, 0x7f, 0xe9, 0x8d, 0x3c, 0x5c, 0x7a, 0x87, 0x53, 0x4e, 0xfe, 0x75, 0x14,
0x5d, 0xb7, 0xbd, 0x1c, 0xb2, 0x66, 0x8c, 0xbc, 0x4a, 0xf2, 0x6c, 0x9a, 0x70, 0x38, 0x61, 0x17,
0x50, 0xa0, 0xbd, 0x15, 0xb7, 0xb4, 0x92, 0x1f, 0x3b, 0x0a, 0xc4, 0xde, 0xca, 0x20, 0x45, 0xdc,
0x4f, 0x24, 0x7d, 0x5a, 0xc3, 0x56, 0x52, 0x13, 0x91, 0xcc, 0x41, 0xc2, 0xfd, 0x04, 0xa3, 0x38,
0x5f, 0x95, 0xf2, 0x17, 0x6f, 0x4b, 0xa8, 0x32, 0x28, 0x52, 0xf0, 0xe7, 0xab, 0x98, 0x0a, 0xe7,
0xab, 0x1e, 0xba, 0xb3, 0xf5, 0xa0, 0x83, 0x53, 0xf7, 0xee, 0x00, 0x26, 0x02, 0x77, 0x07, 0x08,
0x14, 0x57, 0xd2, 0x00, 0xde, 0xed, 0xbb, 0x8e, 0x95, 0xe0, 0xf6, 0x1d, 0x4d, 0x77, 0x36, 0x74,
0x34, 0x33, 0x69, 0x86, 0x49, 0x4f, 0xd1, 0x27, 0xf6, 0x70, 0x59, 0x1b, 0xc4, 0xfa, 0x77, 0x90,
0x8e, 0x21, 0x4f, 0xc4, 0x14, 0x12, 0xd8, 0xa6, 0x69, 0x99, 0x21, 0x3b, 0x48, 0x16, 0xab, 0x1c,
0xfe, 0xe5, 0x28, 0xfa, 0xc8, 0xe7, 0xf1, 0x65, 0x29, 0xfc, 0x3e, 0xe9, 0xb7, 0x25, 0x49, 0xe2,
0x72, 0x44, 0x58, 0x43, 0x95, 0xe1, 0x4f, 0xa3, 0x0f, 0x5b, 0x91, 0xb9, 0x3b, 0xa1, 0x0a, 0xe0,
0x26, 0x50, 0xba, 0xfc, 0x98, 0xd3, 0xee, 0x37, 0x06, 0xf3, 0x66, 0x6d, 0xe2, 0x96, 0xab, 0x46,
0x6b, 0x13, 0x6d, 0x43, 0x89, 0x89, 0xb5, 0x89, 0x07, 0xc3, 0x33, 0x75, 0x8b, 0x34, 0xe3, 0xc4,
0x17, 0xe3, 0xb4, 0x09, 0x7b, 0x94, 0x3c, 0xe8, 0x07, 0x71, 0xdf, 0x69, 0xc5, 0x6a, 0x49, 0xf0,
0x28, 0x64, 0x01, 0x2d, 0x0b, 0xd6, 0x06, 0xb1, 0xca, 0xe1, 0x9f, 0x47, 0xdf, 0xeb, 0x54, 0x6c,
0x07, 0x12, 0xbe, 0xa8, 0x60, 0x1a, 0x6f, 0xf4, 0x94, 0xbb, 0x05, 0xb5, 0xeb, 0x27, 0xc3, 0x15,
0x3a, 0xb9, 0x6b, 0xcb, 0xc9, 0x26, 0xd6, 0x65, 0x78, 0x1a, 0x32, 0xe9, 0xb2, 0xc1, 0xdc, 0x95,
0xd6, 0xe9, 0x2c, 0x3f, 0xed, 0x8e, 0xbc, 0xb9, 0x4c, 0xb2, 0x5c, 0x1c, 0x69, 0x7c, 0x1c, 0x32,
0xea, 0xa0, 0xc1, 0xe5, 0x27, 0xa9, 0xd2, 0x89, 0x92, 0x62, 0xbc, 0x59, 0xcb, 0x96, 0xc7, 0xf4,
0xa8, 0xf4, 0xac, 0x5a, 0xd6, 0x07, 0xd2, 0xca, 0x2d, 0x6f, 0xb7, 0xed, 0x9a, 0x9f, 0xed, 0x4e,
0xee, 0xf3, 0xaa, 0x54, 0x3d, 0x3d, 0x7d, 0x7d, 0x20, 0xad, 0xbc, 0xfe, 0x59, 0xf4, 0x61, 0xd7,
0xab, 0x9a, 0x14, 0x36, 0x7a, 0x4d, 0xa1, 0x79, 0xe1, 0xc9, 0x70, 0x05, 0x93, 0xea, 0x7f, 0x99,
0xd5, 0x9c, 0x55, 0xab, 0xc9, 0x39, 0xbb, 0x6c, 0xef, 0x07, 0xbb, 0xa3, 0x55, 0x01, 0x63, 0x8b,
0x20, 0x52, 0x7d, 0x3f, 0xd9, 0x71, 0x65, 0xee, 0x11, 0xd7, 0x84, 0x2b, 0x8b, 0xe8, 0x71, 0xe5,
0x92, 0x26, 0x56, 0xb5, 0xb5, 0x32, 0x97, 0x9e, 0xef, 0xfb, 0x8b, 0xda, 0xbd, 0xf8, 0xfc, 0xa0,
0x1f, 0x34, 0xd9, 0x83, 0x12, 0x6f, 0x67, 0x67, 0x67, 0xba, 0x4e, 0xfe, 0x92, 0xda, 0x08, 0x91,
0x3d, 0x10, 0xa8, 0x49, 0x46, 0x77, 0xb2, 0x1c, 0xc4, 0xf9, 0xd8, 0xcb, 0xb3, 0xb3, 0x9c, 0x25,
0x53, 0x94, 0x8c, 0x36, 0xe2, 0xb1, 0x2d, 0x27, 0x92, 0x51, 0x1f, 0x67, 0xae, 0x17, 0x35, 0xd2,
0x63, 0x48, 0x59, 0x91, 0x66, 0x39, 0xbe, 0x2e, 0x25, 0x34, 0xb5, 0x90, 0xb8, 0x5e, 0xd4, 0x81,
0xcc, 0x24, 0xd5, 0x88, 0x9a, 0x61, 0xdf, 0x96, 0xff, 0x6e, 0x57, 0xd1, 0x12, 0x13, 0x93, 0x94,
0x07, 0x33, 0x6b, 0xb2, 0x46, 0x78, 0x5a, 0x0a, 0xe3, 0x37, 0xba, 0x5a, 0x52, 0x42, 0xac, 0xc9,
0x5c, 0xc2, 0xac, 0x2d, 0x9a, 0xdf, 0xb7, 0xd9, 0x65, 0x21, 0x8c, 0xde, 0xea, 0xaa, 0xb4, 0x32,
0x62, 0x6d, 0x81, 0x19, 0x65, 0xf8, 0xc7, 0xd1, 0x2f, 0x0b, 0xc3, 0x15, 0x2b, 0xe3, 0x6b, 0x1e,
0x85, 0xca, 0xba, 0xd9, 0x74, 0x9d, 0x94, 0x9b, 0x0b, 0x7a, 0xba, 0x6f, 0x9c, 0xd6, 0xc9, 0x0c,
0xe2, 0x3b, 0x44, 0x8b, 0x0b, 0x29, 0x71, 0x41, 0xaf, 0x4b, 0xb9, 0xbd, 0xe2, 0x90, 0x4d, 0x95,
0x75, 0x4f, 0x0d, 0xb5, 0x30, 0xd4, 0x2b, 0x6c, 0xc8, 0x1c, 0x97, 0x1c, 0x26, 0xcb, 0x6c, 0xa6,
0x27, 0x1c, 0x19, 0xb7, 0x6a, 0x74, 0x5c, 0x62, 0x98, 0xb1, 0x05, 0x11, 0xc7, 0x25, 0x24, 0xac,
0x7c, 0xfe, 0xcb, 0x28, 0xba, 0x61, 0x98, 0xdd, 0x76, 0x17, 0x6b, 0xaf, 0x38, 0x63, 0xaf, 0x33,
0x7e, 0xbe, 0x9f, 0x15, 0x17, 0x75, 0xfc, 0x19, 0x65, 0xd2, 0xcf, 0xeb, 0xa2, 0x7c, 0x7e, 0x65,
0x3d, 0x93, 0x41, 0xb6, 0x5b, 0x3c, 0xe6, 0xec, 0x52, 0x6a, 0xa0, 0x0c, 0x52, 0xef, 0x04, 0x61,
0x8e, 0xc8, 0x20, 0x43, 0xbc, 0x69, 0x62, 0xed, 0x3c, 0x67, 0x05, 0x6e, 0x62, 0x63, 0xa1, 0x11,
0x12, 0x4d, 0xdc, 0x81, 0x4c, 0x3c, 0x6e, 0x45, 0x72, 0x37, 0x62, 0x33, 0xcf, 0x51, 0x3c, 0xd6,
0xaa, 0x1a, 0x20, 0xe2, 0xb1, 0x17, 0x54, 0x7e, 0x8e, 0xa3, 0xef, 0x34, 0x8f, 0xf4, 0xa8, 0x82,
0x65, 0x06, 0xf8, 0x98, 0xdd, 0x92, 0x10, 0xe3, 0xdf, 0x25, 0xcc, 0xc8, 0x3a, 0x2d, 0xea, 0x32,
0x4f, 0xea, 0x73, 0x75, 0xf0, 0xea, 0xd6, 0xb9, 0x15, 0xe2, 0xa3, 0xd7, 0xbb, 0x3d, 0x94, 0x09,
0xea, 0xad, 0x4c, 0x87, 0x98, 0x7b, 0x7e, 0xd5, 0x4e, 0x98, 0xb9, 0xdf, 0xcb, 0x99, 0x9d, 0xe0,
0xdd, 0x24, 0xcf, 0xa1, 0x5a, 0xb5, 0xb2, 0x83, 0xa4, 0xc8, 0xce, 0xa0, 0xe6, 0x68, 0x27, 0x58,
0x51, 0x63, 0x8c, 0x11, 0x3b, 0xc1, 0x01, 0xdc, 0x64, 0xf3, 0xc8, 0xf3, 0x5e, 0x31, 0x85, 0xb7,
0x28, 0x9b, 0xc7, 0x76, 0x04, 0x43, 0x64, 0xf3, 0x14, 0x6b, 0x76, 0x44, 0x9f, 0xe7, 0x2c, 0xbd,
0x50, 0x53, 0x80, 0xdb, 0xc0, 0x42, 0x82, 0xe7, 0x80, 0x5b, 0x21, 0xc4, 0x4c, 0x02, 0x42, 0x70,
0x0c, 0x65, 0x9e, 0xa4, 0xf8, 0xae, 0x85, 0xd4, 0x51, 0x32, 0x62, 0x12, 0xc0, 0x0c, 0x2a, 0xae,
0xba, 0xc3, 0xe1, 0x2b, 0x2e, 0xba, 0xc2, 0x71, 0x2b, 0x84, 0x98, 0x69, 0x50, 0x08, 0x26, 0x65,
0x9e, 0x71, 0x34, 0x0c, 0xa4, 0x86, 0x90, 0x10, 0xc3, 0xc0, 0x25, 0x90, 0xc9, 0x03, 0xa8, 0x66,
0xe0, 0x35, 0x29, 0x24, 0x41, 0x93, 0x2d, 0x61, 0xae, 0xe4, 0xc9, 0xba, 0xb3, 0x72, 0x85, 0xae,
0xe4, 0xa9, 0x6a, 0xb1, 0x72, 0x45, 0x5c, 0xc9, 0x73, 0x00, 0x54, 0xc4, 0xa3, 0xa4, 0xe6, 0xfe,
0x22, 0x0a, 0x49, 0xb0, 0x88, 0x2d, 0x61, 0xe6, 0x68, 0x59, 0xc4, 0x05, 0x47, 0x73, 0xb4, 0x2a,
0x80, 0x75, 0x32, 0x7b, 0x9d, 0x94, 0x9b, 0x48, 0x22, 0x5b, 0x05, 0xf8, 0x4e, 0x06, 0xf9, 0xb4,
0x46, 0x91, 0x44, 0x3d, 0xf7, 0x56, 0x4a, 0x44, 0x92, 0x2e, 0x85, 0xba, 0x92, 0xda, 0x37, 0xf6,
0xd5, 0x0e, 0x6d, 0x19, 0xdf, 0x0a, 0x21, 0x26, 0x3e, 0xb5, 0x85, 0xde, 0x4a, 0xaa, 0x2a, 0x6b,
0x26, 0xff, 0x7b, 0xfe, 0x02, 0xb5, 0x72, 0x22, 0x3e, 0xf9, 0x38, 0x34, 0xbc, 0xda, 0xc0, 0xed,
0x2b, 0x18, 0x0e, 0xdd, 0xb7, 0x83, 0x8c, 0xc9, 0x38, 0x85, 0xc4, 0x3a, 0x5a, 0xf4, 0x3d, 0x4d,
0xcf, 0xc9, 0xe2, 0xbd, 0x3e, 0xcc, 0xba, 0x32, 0xaf, 0x5d, 0x1c, 0xb0, 0x25, 0x9c, 0xb0, 0x17,
0x6f, 0xb3, 0x9a, 0x67, 0xc5, 0x4c, 0xcd, 0xdc, 0xcf, 0x08, 0x4b, 0x3e, 0x98, 0xb8, 0x32, 0xdf,
0xab, 0x64, 0x12, 0x08, 0x54, 0x96, 0x43, 0xb8, 0xf4, 0x26, 0x10, 0xd8, 0xa2, 0xe6, 0x88, 0x04,
0x22, 0xc4, 0x9b, 0x7d, 0x14, 0xed, 0x5c, 0xbd, 0x57, 0x78, 0xc2, 0xda, 0x5c, 0x8e, 0xb2, 0x86,
0x41, 0x62, 0x29, 0x1b, 0x54, 0x30, 0xeb, 0x4b, 0xed, 0xdf, 0x0c, 0xb1, 0x07, 0x84, 0x9d, 0xee,
0x30, 0x7b, 0x38, 0x80, 0xf4, 0xb8, 0x32, 0xe7, 0xe3, 0x94, 0xab, 0xee, 0xf1, 0xf8, 0xc3, 0x01,
0xa4, 0xb5, 0x27, 0x63, 0x57, 0xeb, 0x79, 0x92, 0x5e, 0xcc, 0x2a, 0xb6, 0x28, 0xa6, 0x5b, 0x2c,
0x67, 0x15, 0xda, 0x93, 0x71, 0x4a, 0x8d, 0x50, 0x62, 0x4f, 0xa6, 0x47, 0xc5, 0x64, 0x70, 0x76,
0x29, 0x36, 0xf3, 0x6c, 0x86, 0x57, 0xd4, 0x8e, 0x21, 0x01, 0x10, 0x19, 0x9c, 0x17, 0xf4, 0x74,
0x22, 0xb9, 0xe2, 0xe6, 0x59, 0x9a, 0xe4, 0xd2, 0xdf, 0x06, 0x6d, 0xc6, 0x01, 0x7b, 0x3b, 0x91,
0x47, 0xc1, 0x53, 0xcf, 0x93, 0x45, 0x55, 0xec, 0x15, 0x9c, 0x91, 0xf5, 0x6c, 0x81, 0xde, 0x7a,
0x5a, 0x20, 0x0a, 0xab, 0x27, 0xf0, 0xb6, 0x29, 0x4d, 0xf3, 0x8f, 0x2f, 0xac, 0x36, 0xbf, 0x8f,
0x95, 0x3c, 0x14, 0x56, 0x11, 0x87, 0x2a, 0xa3, 0x9c, 0xc8, 0x0e, 0x13, 0xd0, 0x76, 0xbb, 0xc9,
0x83, 0x7e, 0xd0, 0xef, 0x67, 0xc2, 0x57, 0x39, 0x84, 0xfc, 0x08, 0x60, 0x88, 0x9f, 0x16, 0x34,
0xdb, 0x2d, 0x4e, 0x7d, 0xce, 0x21, 0xbd, 0xe8, 0x5c, 0xf7, 0x71, 0x0b, 0x2a, 0x11, 0x62, 0xbb,
0x85, 0x40, 0xfd, 0x4d, 0xb4, 0x97, 0xb2, 0x22, 0xd4, 0x44, 0x8d, 0x7c, 0x48, 0x13, 0x29, 0xce,
0x2c, 0x7e, 0xb5, 0x54, 0xf5, 0x4c, 0xd9, 0x4c, 0x6b, 0x84, 0x05, 0x1b, 0x22, 0x16, 0xbf, 0x24,
0x6c, 0x72, 0x72, 0xec, 0xf3, 0xa0, 0x7b, 0xbf, 0xb7, 0x63, 0xe5, 0x80, 0xbe, 0xdf, 0x4b, 0xb1,
0x74, 0x25, 0x65, 0x1f, 0xe9, 0xb1, 0xe2, 0xf6, 0x93, 0xc7, 0xc3, 0x60, 0xb3, 0xe4, 0x71, 0x7c,
0x6e, 0xe5, 0x90, 0x54, 0xd2, 0xeb, 0x7a, 0xc0, 0x90, 0xc1, 0x88, 0x25, 0x4f, 0x00, 0x47, 0x21,
0xcc, 0xf1, 0xbc, 0xc5, 0x0a, 0x0e, 0x05, 0xf7, 0x85, 0x30, 0xd7, 0x98, 0x02, 0x43, 0x21, 0x8c,
0x52, 0x40, 0xfd, 0x56, 0xec, 0x07, 0x01, 0x3f, 0x4c, 0xe6, 0xde, 0x8c, 0x4d, 0xee, 0xf5, 0x48,
0x79, 0xa8, 0xdf, 0x22, 0xce, 0x3a, 0x70, 0xb3, 0xbd, 0x9c, 0x24, 0xd5, 0x4c, 0xef, 0x6e, 0x4c,
0xe3, 0x27, 0xb4, 0x1d, 0x97, 0x24, 0x0e, 0xdc, 0xc2, 0x1a, 0x28, 0xec, 0xec, 0xcd, 0x93, 0x99,
0xae, 0xa9, 0xa7, 0x06, 0x42, 0xde, 0xa9, 0xea, 0x83, 0x7e, 0x10, 0xf9, 0x79, 0x95, 0x4d, 0x81,
0x05, 0xfc, 0x08, 0xf9, 0x10, 0x3f, 0x18, 0x44, 0xd9, 0x5b, 0x53, 0x6f, 0xb9, 0xa2, 0xdb, 0x2c,
0xa6, 0x6a, 0x1d, 0x3b, 0x26, 0x1e, 0x0f, 0xe2, 0x42, 0xd9, 0x1b, 0xc1, 0xa3, 0x31, 0xda, 0x6e,
0xd0, 0x86, 0xc6, 0xa8, 0xde, 0x7f, 0x1d, 0x32, 0x46, 0x7d, 0xb0, 0xf2, 0xf9, 0x53, 0x35, 0x46,
0xb7, 0x13, 0x9e, 0x34, 0x79, 0xfb, 0xab, 0x0c, 0x2e, 0xd5, 0x42, 0xd8, 0x53, 0xdf, 0x96, 0x1a,
0x8b, 0x17, 0xbb, 0xd0, 0xaa, 0x78, 0x63, 0x30, 0x1f, 0xf0, 0xad, 0x56, 0x08, 0xbd, 0xbe, 0xd1,
0x52, 0x61, 0x63, 0x30, 0x1f, 0xf0, 0xad, 0xde, 0x18, 0xed, 0xf5, 0x8d, 0x5e, 0x1b, 0xdd, 0x18,
0xcc, 0x2b, 0xdf, 0x7f, 0xd5, 0x0e, 0x5c, 0xdb, 0x79, 0x93, 0x87, 0xa5, 0x3c, 0x5b, 0x82, 0x2f,
0x9d, 0x74, 0xed, 0x69, 0x34, 0x94, 0x4e, 0xd2, 0x2a, 0xd6, 0x67, 0x46, 0x7c, 0xa5, 0x38, 0x62,
0x75, 0x26, 0x0e, 0xcc, 0x9f, 0x0d, 0x30, 0xda, 0xc2, 0xa1, 0x45, 0x53, 0x48, 0xc9, 0x1c, 0x37,
0x3a, 0xa8, 0xb9, 0xdd, 0xfb, 0x38, 0x60, 0xaf, 0x7b, 0xc9, 0x77, 0x7d, 0x20, 0x6d, 0x0e, 0xfe,
0x1c, 0xc6, 0x3e, 0x71, 0x0c, 0xb5, 0xaa, 0xf7, 0xd0, 0xf1, 0xc9, 0x70, 0x05, 0xe5, 0xfe, 0x6f,
0xda, 0x75, 0x05, 0xf6, 0xaf, 0x06, 0xc1, 0xd3, 0x21, 0x16, 0xd1, 0x40, 0x78, 0x76, 0x25, 0x1d,
0x55, 0x90, 0xff, 0x18, 0x45, 0xb7, 0xbc, 0x05, 0x71, 0xcf, 0x9e, 0x7f, 0x77, 0x88, 0x6d, 0xff,
0x19, 0xf4, 0x17, 0xdf, 0x46, 0x55, 0x95, 0xee, 0x1f, 0xda, 0xe5, 0x7d, 0xab, 0x21, 0xde, 0xc0,
0x78, 0x59, 0x4d, 0xa1, 0x52, 0x23, 0x36, 0xd4, 0xe9, 0x0c, 0x8c, 0xc7, 0xed, 0xa7, 0x57, 0xd4,
0xb2, 0x3e, 0x89, 0xe3, 0xc0, 0xea, 0xed, 0x37, 0xab, 0x3c, 0x21, 0xcb, 0x16, 0x8d, 0x0b, 0xf4,
0xd9, 0x55, 0xd5, 0xa8, 0x91, 0x6c, 0xc1, 0xe2, 0x0d, 0xfb, 0x67, 0x03, 0x0d, 0x3b, 0xef, 0xdc,
0x7f, 0x72, 0x35, 0x25, 0x55, 0x96, 0xff, 0x1a, 0x45, 0x77, 0x1d, 0xd6, 0x9c, 0x76, 0xa0, 0x3d,
0x99, 0x1f, 0x05, 0xec, 0x53, 0x4a, 0xba, 0x70, 0xbf, 0xf7, 0xed, 0x94, 0xcd, 0xf7, 0x63, 0x1c,
0x95, 0x9d, 0x2c, 0xe7, 0x50, 0x75, 0xbf, 0x1f, 0xe3, 0xda, 0x95, 0xd4, 0x98, 0xfe, 0x7e, 0x4c,
0x00, 0xb7, 0xbe, 0x1f, 0xe3, 0xf1, 0xec, 0xfd, 0x7e, 0x8c, 0xd7, 0x5a, 0xf0, 0xfb, 0x31, 0x61,
0x0d, 0x6a, 0xf2, 0x69, 0x8b, 0x20, 0x77, 0xd5, 0x07, 0x59, 0x74, 0x37, 0xd9, 0x9f, 0x5e, 0x45,
0x85, 0x98, 0x7e, 0x25, 0x27, 0x6e, 0xc4, 0x0d, 0x78, 0xa6, 0xce, 0xad, 0xb8, 0x8d, 0xc1, 0xbc,
0xf2, 0xfd, 0x13, 0xb5, 0xf6, 0xd2, 0x93, 0x0d, 0xab, 0xc4, 0xb7, 0x83, 0xd6, 0x42, 0x93, 0x47,
0x63, 0xc1, 0x6e, 0xf9, 0xc7, 0xc3, 0x60, 0xa2, 0xba, 0x0d, 0xa1, 0x1a, 0x7d, 0xdc, 0x67, 0x08,
0x35, 0xf9, 0xc6, 0x60, 0x9e, 0x98, 0xe4, 0xa4, 0x6f, 0xd9, 0xda, 0x03, 0x8c, 0xb9, 0x6d, 0xfd,
0x64, 0xb8, 0x82, 0x72, 0xbf, 0x54, 0x49, 0xad, 0xed, 0x5e, 0xb4, 0xf3, 0x7a, 0x9f, 0xa9, 0x89,
0xd3, 0xcc, 0xe3, 0xa1, 0x78, 0x28, 0xbd, 0xb1, 0x27, 0xf8, 0xbe, 0xf4, 0xc6, 0x3b, 0xc9, 0x7f,
0x72, 0x35, 0x25, 0x55, 0x96, 0x7f, 0x1e, 0x45, 0xd7, 0xc9, 0xb2, 0xa8, 0x7e, 0xf0, 0xd9, 0x50,
0xcb, 0xa8, 0x3f, 0x7c, 0x7e, 0x65, 0x3d, 0x55, 0xa8, 0x7f, 0x1b, 0x45, 0x37, 0x02, 0x85, 0x92,
0x1d, 0xe4, 0x0a, 0xd6, 0xdd, 0x8e, 0xf2, 0xc3, 0xab, 0x2b, 0x52, 0xd3, 0xbd, 0x8d, 0x4f, 0xba,
0x1f, 0x56, 0x09, 0xd8, 0x9e, 0xd0, 0x1f, 0x56, 0xe9, 0xd7, 0xc2, 0x5b, 0x50, 0x4d, 0x52, 0xa2,
0x56, 0x46, 0xbe, 0x2d, 0x28, 0x91, 0xb3, 0xa0, 0x15, 0xd1, 0xfd, 0x5e, 0xce, 0xe7, 0xe4, 0xc5,
0xdb, 0x32, 0x29, 0xa6, 0xb4, 0x13, 0x29, 0xef, 0x77, 0xa2, 0x39, 0xbc, 0x75, 0xd7, 0x48, 0x8f,
0x59, 0xbb, 0xcc, 0x7b, 0x48, 0xe9, 0x6b, 0x24, 0xb8, 0x75, 0xd7, 0x41, 0x09, 0x6f, 0x2a, 0xa7,
0x0d, 0x79, 0x43, 0xa9, 0xec, 0xa3, 0x21, 0x28, 0x5a, 0x40, 0x68, 0x6f, 0xfa, 0x44, 0xe0, 0x71,
0xc8, 0x4a, 0xe7, 0x54, 0x60, 0x7d, 0x20, 0x4d, 0xb8, 0x9d, 0x00, 0xff, 0x12, 0x92, 0x29, 0x54,
0x41, 0xb7, 0x9a, 0x1a, 0xe4, 0xd6, 0xa6, 0x7d, 0x6e, 0xb7, 0x58, 0xbe, 0x98, 0x17, 0xaa, 0x31,
0x49, 0xb7, 0x36, 0xd5, 0xef, 0x16, 0xd1, 0x78, 0xd3, 0xd2, 0xb8, 0x15, 0xe9, 0xe5, 0xa3, 0xb0,
0x19, 0x27, 0xab, 0x5c, 0x1b, 0xc4, 0xd2, 0xf5, 0x54, 0xdd, 0xa8, 0xa7, 0x9e, 0xa8, 0x27, 0xad,
0x0f, 0xa4, 0xf1, 0xee, 0xa1, 0xe5, 0x56, 0xf7, 0xa7, 0x8d, 0x1e, 0x5b, 0x9d, 0x2e, 0xf5, 0x64,
0xb8, 0x02, 0xde, 0xab, 0x55, 0xbd, 0xaa, 0x59, 0x17, 0xed, 0x64, 0x79, 0x1e, 0xaf, 0x05, 0xba,
0x49, 0x0b, 0x05, 0xf7, 0x6a, 0x3d, 0x30, 0xd1, 0x93, 0xdb, 0xbd, 0xcd, 0x22, 0xee, 0xb3, 0x23,
0xa8, 0x41, 0x3d, 0xd9, 0xa6, 0xd1, 0x7e, 0x9b, 0xf5, 0xa8, 0x75, 0x6d, 0xc7, 0xe1, 0x07, 0xd7,
0xa9, 0xf0, 0xc6, 0x60, 0x1e, 0x5d, 0x06, 0x10, 0x94, 0x98, 0x59, 0xee, 0x50, 0x26, 0x9c, 0x99,
0xe4, 0x6e, 0x0f, 0x85, 0xf6, 0x2c, 0xe5, 0x30, 0x7a, 0x9d, 0x4d, 0x67, 0xc0, 0xbd, 0xe7, 0x58,
0x36, 0x10, 0x3c, 0xc7, 0x42, 0x20, 0x6a, 0x3a, 0xf9, 0xbb, 0xde, 0xac, 0xdd, 0x9b, 0xfa, 0x9a,
0x4e, 0x29, 0x5b, 0x54, 0xa8, 0xe9, 0xbc, 0x34, 0x8a, 0x06, 0xda, 0xad, 0x7a, 0x89, 0xfe, 0x51,
0xc8, 0x0c, 0x7a, 0x93, 0x7e, 0x6d, 0x10, 0x8b, 0x66, 0x14, 0xe3, 0x30, 0x9b, 0x67, 0xdc, 0x37,
0xa3, 0x58, 0x36, 0x1a, 0x24, 0x34, 0xa3, 0x74, 0x51, 0xaa, 0x7a, 0x4d, 0x8e, 0xb0, 0x37, 0x0d,
0x57, 0x4f, 0x32, 0xc3, 0xaa, 0xa7, 0xd9, 0xce, 0xb1, 0x6b, 0xa1, 0xbb, 0x0c, 0x3f, 0x57, 0x8b,
0x65, 0x4f, 0xdf, 0x16, 0x2f, 0x57, 0x62, 0x30, 0x14, 0x75, 0x28, 0x05, 0x7c, 0x9c, 0xd0, 0x70,
0xed, 0xc9, 0x70, 0x59, 0x42, 0x52, 0x25, 0x45, 0xea, 0x5d, 0x9c, 0x0a, 0x83, 0x1d, 0x32, 0xb4,
0x38, 0x25, 0x35, 0xd0, 0xa1, 0xbe, 0xfb, 0x5a, 0xa4, 0x67, 0x28, 0xe8, 0xf7, 0x0f, 0xdd, 0xb7,
0x22, 0x1f, 0x0e, 0x20, 0xf1, 0xa1, 0x7e, 0x0b, 0xe8, 0x6d, 0x79, 0xe9, 0xf4, 0xe3, 0x80, 0x29,
0x17, 0x0d, 0x2d, 0x84, 0x69, 0x15, 0xd4, 0xa9, 0x75, 0x82, 0x0b, 0xfc, 0xc7, 0xb0, 0xf2, 0x75,
0x6a, 0x93, 0x9f, 0x0a, 0x24, 0xd4, 0xa9, 0xbb, 0x28, 0xca, 0x33, 0xed, 0x75, 0xd0, 0xbd, 0x80,
0xbe, 0xbd, 0xf4, 0xb9, 0xdf, 0xcb, 0xa1, 0x91, 0xb3, 0x9d, 0x2d, 0x9d, 0x53, 0x0c, 0x4f, 0x41,
0xb7, 0xb3, 0xa5, 0xff, 0x10, 0x63, 0x6d, 0x10, 0x8b, 0x2f, 0x0c, 0x24, 0x1c, 0xde, 0xb6, 0x27,
0xf9, 0x9e, 0xe2, 0x0a, 0x79, 0xe7, 0x28, 0xff, 0x41, 0x3f, 0x68, 0xae, 0xe7, 0x1e, 0x55, 0x2c,
0x85, 0xba, 0x56, 0x5f, 0x9b, 0x73, 0xef, 0x3f, 0x29, 0xd9, 0x18, 0x7d, 0x6b, 0xee, 0x4e, 0x18,
0x52, 0xb6, 0xbf, 0x8c, 0xde, 0xdd, 0x67, 0xb3, 0x09, 0x14, 0xd3, 0xf8, 0x07, 0xee, 0x85, 0x58,
0x36, 0x1b, 0x37, 0x3f, 0x6b, 0x7b, 0xd7, 0x28, 0xb1, 0xb9, 0xd2, 0xb7, 0x0d, 0x6f, 0x16, 0xb3,
0x09, 0x4f, 0x38, 0xba, 0xd2, 0x27, 0x7e, 0x1f, 0x37, 0x02, 0xe2, 0x4a, 0x9f, 0x03, 0x20, 0x7b,
0x27, 0x15, 0x80, 0xd7, 0x5e, 0x23, 0x08, 0xda, 0x53, 0x80, 0x99, 0x75, 0xb5, 0xbd, 0x26, 0xb1,
0xc5, 0x57, 0xf0, 0x8c, 0x8e, 0x90, 0x12, 0xb3, 0x6e, 0x97, 0x32, 0x9d, 0x41, 0x56, 0x5f, 0x7c,
0x5b, 0x63, 0x31, 0x9f, 0x27, 0xd5, 0x0a, 0x75, 0x06, 0x55, 0x4b, 0x0b, 0x20, 0x3a, 0x83, 0x17,
0x34, 0xbd, 0xbc, 0x7d, 0xcc, 0xe9, 0xc5, 0x2e, 0xab, 0xd8, 0x82, 0x67, 0x05, 0xe0, 0xef, 0x2b,
0xe8, 0x07, 0x6a, 0x33, 0x44, 0x2f, 0xa7, 0x58, 0x93, 0x15, 0x0a, 0x42, 0xde, 0x0e, 0x14, 0xdf,
0x6c, 0xad, 0x39, 0xab, 0xf0, 0xe9, 0xa0, 0xb4, 0x82, 0x21, 0x22, 0x2b, 0x24, 0x61, 0xd4, 0xf6,
0x47, 0x59, 0x31, 0xf3, 0xb6, 0xfd, 0x91, 0xfd, 0xc5, 0xc3, 0x1b, 0x34, 0x60, 0xe2, 0xbb, 0x7c,
0x68, 0xf2, 0x1b, 0x46, 0xea, 0x2d, 0x49, 0xef, 0x43, 0xb7, 0x09, 0x22, 0xbe, 0xfb, 0x49, 0xe4,
0xea, 0x65, 0x09, 0x05, 0x4c, 0xdb, 0x3b, 0x70, 0x3e, 0x57, 0x0e, 0x11, 0x74, 0x85, 0x49, 0x13,
0x55, 0x85, 0xfc, 0x78, 0x51, 0x1c, 0x55, 0xec, 0x2c, 0xcb, 0xa1, 0x42, 0x51, 0x55, 0xaa, 0x5b,
0x72, 0x22, 0xaa, 0xfa, 0x38, 0x73, 0x99, 0x42, 0x48, 0x9d, 0x0f, 0x0f, 0x9f, 0x54, 0x49, 0x8a,
0x2f, 0x53, 0x48, 0x1b, 0x5d, 0x8c, 0xd8, 0x49, 0x0b, 0xe0, 0xa6, 0xa7, 0x1f, 0x00, 0xaf, 0xb2,
0xb4, 0x9e, 0x00, 0x3f, 0x4a, 0xaa, 0x64, 0x0e, 0x1c, 0x2a, 0xdc, 0xd3, 0x15, 0x32, 0x76, 0x18,
0xa2, 0xa7, 0x53, 0xac, 0x72, 0xf8, 0xfb, 0xd1, 0xfb, 0x4d, 0xa0, 0x87, 0x42, 0x7d, 0x23, 0xff,
0x85, 0xf8, 0xe3, 0x1a, 0xf1, 0x07, 0xda, 0xc6, 0x84, 0x57, 0x90, 0xcc, 0x5b, 0xdb, 0xef, 0xe9,
0xdf, 0x05, 0xf8, 0x64, 0xd4, 0x34, 0xc8, 0x21, 0xe3, 0xd9, 0x59, 0xb3, 0xae, 0x52, 0xa7, 0x58,
0xa8, 0x41, 0x6c, 0xf1, 0x38, 0xf0, 0xc9, 0x00, 0x1f, 0x67, 0x02, 0x8d, 0x2d, 0x3d, 0x86, 0x32,
0xc7, 0x81, 0xc6, 0xd1, 0x16, 0x00, 0x11, 0x68, 0xbc, 0xa0, 0xe9, 0x5d, 0xb6, 0xf8, 0x04, 0xc2,
0x95, 0x39, 0x81, 0x61, 0x95, 0x39, 0x71, 0xde, 0x11, 0xc8, 0xa3, 0xf7, 0x0f, 0x60, 0xfe, 0x06,
0xaa, 0xfa, 0x3c, 0x2b, 0x77, 0x9b, 0x19, 0x36, 0xe1, 0x0b, 0xfc, 0x16, 0x9d, 0x21, 0xc6, 0x1a,
0x21, 0xd2, 0x10, 0x02, 0x35, 0xa1, 0xcc, 0x00, 0x7b, 0xf5, 0x61, 0x32, 0x07, 0xf1, 0x01, 0x84,
0x78, 0x8d, 0x32, 0x62, 0x41, 0x44, 0x28, 0x23, 0x61, 0xeb, 0x75, 0x23, 0xc3, 0x1c, 0xc3, 0xac,
0xe9, 0x61, 0xd5, 0x51, 0xb2, 0x9a, 0x43, 0xc1, 0x95, 0x49, 0xb4, 0x09, 0x6b, 0x99, 0xf4, 0xf3,
0xc4, 0x26, 0xec, 0x10, 0x3d, 0x2b, 0xe9, 0x76, 0x1e, 0xfc, 0x11, 0xab, 0xb8, 0xfc, 0x0b, 0x18,
0xa7, 0x55, 0x8e, 0x92, 0x6e, 0xf7, 0xa1, 0x3a, 0x24, 0x91, 0x74, 0x87, 0x35, 0xac, 0x4f, 0x47,
0x3b, 0x65, 0x78, 0x05, 0x95, 0xee, 0x27, 0x2f, 0xe6, 0x49, 0x96, 0xab, 0xde, 0xf0, 0x45, 0xc0,
0x36, 0xa1, 0x43, 0x7c, 0x3a, 0x7a, 0xa8, 0xae, 0xf5, 0xb1, 0xed, 0x70, 0x09, 0xd1, 0x9e, 0x70,
0x8f, 0x7d, 0x62, 0x4f, 0xb8, 0x5f, 0xcb, 0x2c, 0xd5, 0x0c, 0x2b, 0xb8, 0x95, 0x20, 0xb6, 0xd8,
0x14, 0x6f, 0x10, 0x59, 0x36, 0x11, 0x48, 0x2c, 0xd5, 0x82, 0x0a, 0x66, 0x6e, 0x33, 0xd8, 0x4e,
0x56, 0x24, 0x79, 0xf6, 0x53, 0x7c, 0xf7, 0xd9, 0xb2, 0xd3, 0x12, 0xc4, 0xdc, 0xe6, 0x27, 0x7d,
0xae, 0x76, 0x81, 0x9f, 0x64, 0x4d, 0xe8, 0x7f, 0x10, 0x78, 0x6e, 0x82, 0xe8, 0x77, 0x65, 0x91,
0xca, 0xd5, 0xcf, 0x46, 0xd1, 0x75, 0xfc, 0x58, 0x37, 0xcb, 0x72, 0xd2, 0xa4, 0x24, 0xc7, 0x90,
0x42, 0x56, 0xf2, 0xf8, 0xd3, 0xf0, 0xb3, 0x42, 0x38, 0x71, 0xb2, 0x3e, 0x40, 0xcd, 0x3a, 0xaf,
0x6d, 0x62, 0xc9, 0x44, 0xfe, 0x69, 0xa8, 0xd3, 0x1a, 0x2a, 0x35, 0x53, 0xee, 0x02, 0x47, 0xa3,
0xd3, 0xe2, 0xc6, 0x16, 0xd8, 0x54, 0x94, 0x18, 0x9d, 0x61, 0x0d, 0xb3, 0xbb, 0x63, 0x71, 0xc7,
0x50, 0xb3, 0x7c, 0x09, 0xe2, 0xfa, 0xdb, 0x63, 0xd2, 0x98, 0x45, 0x11, 0xbb, 0x3b, 0x34, 0x6d,
0xd2, 0x8d, 0xae, 0xdb, 0xcd, 0x62, 0xb5, 0x87, 0xcf, 0xc8, 0x3d, 0x96, 0x04, 0x46, 0xa4, 0x1b,
0x01, 0xdc, 0xda, 0xfd, 0xac, 0x58, 0x32, 0x4d, 0x93, 0x9a, 0x1f, 0x25, 0xab, 0x9c, 0x25, 0x53,
0x31, 0xaf, 0xe3, 0xdd, 0xcf, 0x96, 0x19, 0xdb, 0x10, 0xb5, 0xfb, 0x49, 0xc1, 0x66, 0x65, 0xa7,
0xfe, 0xe2, 0x95, 0xba, 0x5a, 0x78, 0x1b, 0xe5, 0x48, 0xa2, 0xbc, 0xf8, 0x5a, 0xe1, 0x9d, 0x30,
0x64, 0x5e, 0x89, 0x92, 0x22, 0x91, 0x86, 0xdc, 0xf0, 0xe9, 0x38, 0x09, 0xc8, 0xcd, 0x00, 0x61,
0x3e, 0x93, 0x20, 0x7f, 0x6f, 0xff, 0x68, 0x03, 0x57, 0x1f, 0xd1, 0x7d, 0xec, 0xd3, 0xb5, 0xa1,
0xb1, 0xfd, 0x1d, 0xb2, 0xf5, 0x81, 0xb4, 0xf4, 0xfa, 0xfc, 0xe6, 0x7f, 0x7f, 0x7d, 0x6d, 0xf4,
0xf3, 0xaf, 0xaf, 0x8d, 0xfe, 0xff, 0xeb, 0x6b, 0xa3, 0x9f, 0x7d, 0x73, 0xed, 0x9d, 0x9f, 0x7f,
0x73, 0xed, 0x9d, 0xff, 0xfd, 0xe6, 0xda, 0x3b, 0x5f, 0xbd, 0xab, 0xfe, 0x74, 0xda, 0x9b, 0x5f,
0x12, 0x7f, 0x00, 0xed, 0xd9, 0x2f, 0x02, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2e, 0xe4, 0x86, 0x5e,
0x6d, 0x00, 0x00,
}
// Reference imports to suppress errors if they are not otherwise used.
@ -435,6 +437,7 @@ type ClientCommandsClient interface {
ObjectListSetIsFavorite(ctx context.Context, in *pb.RpcObjectListSetIsFavoriteRequest, opts ...grpc.CallOption) (*pb.RpcObjectListSetIsFavoriteResponse, error)
ObjectListSetObjectType(ctx context.Context, in *pb.RpcObjectListSetObjectTypeRequest, opts ...grpc.CallOption) (*pb.RpcObjectListSetObjectTypeResponse, error)
ObjectListSetDetails(ctx context.Context, in *pb.RpcObjectListSetDetailsRequest, opts ...grpc.CallOption) (*pb.RpcObjectListSetDetailsResponse, error)
ObjectListModifyDetailValues(ctx context.Context, in *pb.RpcObjectListModifyDetailValuesRequest, opts ...grpc.CallOption) (*pb.RpcObjectListModifyDetailValuesResponse, error)
ObjectApplyTemplate(ctx context.Context, in *pb.RpcObjectApplyTemplateRequest, opts ...grpc.CallOption) (*pb.RpcObjectApplyTemplateResponse, error)
// ObjectToSet creates new set from given object and removes object
ObjectToSet(ctx context.Context, in *pb.RpcObjectToSetRequest, opts ...grpc.CallOption) (*pb.RpcObjectToSetResponse, error)
@ -1334,6 +1337,15 @@ func (c *clientCommandsClient) ObjectListSetDetails(ctx context.Context, in *pb.
return out, nil
}
func (c *clientCommandsClient) ObjectListModifyDetailValues(ctx context.Context, in *pb.RpcObjectListModifyDetailValuesRequest, opts ...grpc.CallOption) (*pb.RpcObjectListModifyDetailValuesResponse, error) {
out := new(pb.RpcObjectListModifyDetailValuesResponse)
err := c.cc.Invoke(ctx, "/anytype.ClientCommands/ObjectListModifyDetailValues", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *clientCommandsClient) ObjectApplyTemplate(ctx context.Context, in *pb.RpcObjectApplyTemplateRequest, opts ...grpc.CallOption) (*pb.RpcObjectApplyTemplateResponse, error) {
out := new(pb.RpcObjectApplyTemplateResponse)
err := c.cc.Invoke(ctx, "/anytype.ClientCommands/ObjectApplyTemplate", in, out, opts...)
@ -3030,6 +3042,7 @@ type ClientCommandsServer interface {
ObjectListSetIsFavorite(context.Context, *pb.RpcObjectListSetIsFavoriteRequest) *pb.RpcObjectListSetIsFavoriteResponse
ObjectListSetObjectType(context.Context, *pb.RpcObjectListSetObjectTypeRequest) *pb.RpcObjectListSetObjectTypeResponse
ObjectListSetDetails(context.Context, *pb.RpcObjectListSetDetailsRequest) *pb.RpcObjectListSetDetailsResponse
ObjectListModifyDetailValues(context.Context, *pb.RpcObjectListModifyDetailValuesRequest) *pb.RpcObjectListModifyDetailValuesResponse
ObjectApplyTemplate(context.Context, *pb.RpcObjectApplyTemplateRequest) *pb.RpcObjectApplyTemplateResponse
// ObjectToSet creates new set from given object and removes object
ObjectToSet(context.Context, *pb.RpcObjectToSetRequest) *pb.RpcObjectToSetResponse
@ -3481,6 +3494,9 @@ func (*UnimplementedClientCommandsServer) ObjectListSetObjectType(ctx context.Co
func (*UnimplementedClientCommandsServer) ObjectListSetDetails(ctx context.Context, req *pb.RpcObjectListSetDetailsRequest) *pb.RpcObjectListSetDetailsResponse {
return nil
}
func (*UnimplementedClientCommandsServer) ObjectListModifyDetailValues(ctx context.Context, req *pb.RpcObjectListModifyDetailValuesRequest) *pb.RpcObjectListModifyDetailValuesResponse {
return nil
}
func (*UnimplementedClientCommandsServer) ObjectApplyTemplate(ctx context.Context, req *pb.RpcObjectApplyTemplateRequest) *pb.RpcObjectApplyTemplateResponse {
return nil
}
@ -5346,6 +5362,24 @@ func _ClientCommands_ObjectListSetDetails_Handler(srv interface{}, ctx context.C
return interceptor(ctx, in, info, handler)
}
func _ClientCommands_ObjectListModifyDetailValues_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(pb.RpcObjectListModifyDetailValuesRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(ClientCommandsServer).ObjectListModifyDetailValues(ctx, in), nil
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/anytype.ClientCommands/ObjectListModifyDetailValues",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(ClientCommandsServer).ObjectListModifyDetailValues(ctx, req.(*pb.RpcObjectListModifyDetailValuesRequest)), nil
}
return interceptor(ctx, in, info, handler)
}
func _ClientCommands_ObjectApplyTemplate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(pb.RpcObjectApplyTemplateRequest)
if err := dec(in); err != nil {
@ -8818,6 +8852,10 @@ var _ClientCommands_serviceDesc = grpc.ServiceDesc{
MethodName: "ObjectListSetDetails",
Handler: _ClientCommands_ObjectListSetDetails_Handler,
},
{
MethodName: "ObjectListModifyDetailValues",
Handler: _ClientCommands_ObjectListModifyDetailValues_Handler,
},
{
MethodName: "ObjectApplyTemplate",
Handler: _ClientCommands_ObjectApplyTemplate_Handler,

View file

@ -88,7 +88,14 @@ func makeFilter(spaceID string, rawFilter *model.BlockContentDataviewFilter, sto
func makeFilterByCondition(spaceID string, rawFilter *model.BlockContentDataviewFilter, store ObjectStore) (Filter, error) {
parts := strings.SplitN(rawFilter.RelationKey, ".", 2)
if len(parts) == 2 {
return makeFilterNestedIn(spaceID, rawFilter, store, parts[0], parts[1])
relationKey := parts[0]
nestedRelationKey := parts[1]
if rawFilter.Condition == model.BlockContentDataviewFilter_NotEqual {
return makeFilterNestedNotIn(spaceID, rawFilter, store, relationKey, nestedRelationKey)
} else {
return makeFilterNestedIn(spaceID, rawFilter, store, relationKey, nestedRelationKey)
}
}
// replaces "value == false" to "value != true" for expected work with checkboxes
@ -310,6 +317,12 @@ func negateFilter(filter query.Filter) query.Filter {
}
return negated
case query.Key:
if nested, ok := v.Filter.(query.Not); ok {
return query.Key{
Path: v.Path,
Filter: nested.Filter,
}
}
return query.Key{
Path: v.Path,
Filter: query.Not{
@ -342,16 +355,7 @@ func (e FilterEq) AnystoreFilter() query.Filter {
case model.BlockContentDataviewFilter_LessOrEqual:
op = query.CompOpLte
case model.BlockContentDataviewFilter_NotEqual:
return query.Or{
query.Key{
Path: path,
Filter: query.NewComp(query.CompOpNe, scalarPbValueToAny(e.Value)),
},
query.Key{
Path: path,
Filter: query.Not{Filter: query.Exists{}},
},
}
op = query.CompOpNe
}
return query.Key{
Path: path,
@ -676,18 +680,6 @@ func optionsToMap(spaceID string, key string, store ObjectStore) map[string]stri
return result
}
// FilterNestedIn returns true for object that has a relation pointing to any object that matches FilterForNestedObjects.
// This filter uses special machinery in able to work: it only functions when IDs field is populated by IDs of objects
// that match FilterForNestedObjects. You can't just use FilterNestedIn without populating IDs field
type FilterNestedIn struct {
Key string
FilterForNestedObjects Filter
IDs []string
}
var _ WithNestedFilter = &FilterNestedIn{}
func makeFilterNestedIn(spaceID string, rawFilter *model.BlockContentDataviewFilter, store ObjectStore, relationKey string, nestedRelationKey string) (Filter, error) {
rawNestedFilter := proto.Clone(rawFilter).(*model.BlockContentDataviewFilter)
rawNestedFilter.RelationKey = nestedRelationKey
@ -711,6 +703,18 @@ func makeFilterNestedIn(spaceID string, rawFilter *model.BlockContentDataviewFil
}, nil
}
// FilterNestedIn returns true for object that has a relation pointing to any object that matches FilterForNestedObjects.
// This filter uses special machinery in able to work: it only functions when IDs field is populated by IDs of objects
// that match FilterForNestedObjects. You can't just use FilterNestedIn without populating IDs field
type FilterNestedIn struct {
Key string
FilterForNestedObjects Filter
IDs []string
}
var _ WithNestedFilter = &FilterNestedIn{}
func (i *FilterNestedIn) FilterObject(g *types.Struct) bool {
val := pbtypes.Get(g, i.Key)
for _, id := range i.IDs {
@ -737,3 +741,70 @@ func (i *FilterNestedIn) AnystoreFilter() query.Filter {
func (i *FilterNestedIn) IterateNestedFilters(fn func(nestedFilter Filter) error) error {
return fn(i)
}
// See FilterNestedIn for details
type FilterNestedNotIn struct {
Key string
FilterForNestedObjects Filter
IDs []string
}
func makeFilterNestedNotIn(spaceID string, rawFilter *model.BlockContentDataviewFilter, store ObjectStore, relationKey string, nestedRelationKey string) (Filter, error) {
rawNestedFilter := proto.Clone(rawFilter).(*model.BlockContentDataviewFilter)
rawNestedFilter.RelationKey = nestedRelationKey
subQueryRawFilter := proto.Clone(rawFilter).(*model.BlockContentDataviewFilter)
subQueryRawFilter.RelationKey = nestedRelationKey
subQueryRawFilter.Condition = model.BlockContentDataviewFilter_Equal
subQueryFilter, err := MakeFilter(spaceID, subQueryRawFilter, store)
if err != nil {
return nil, fmt.Errorf("make nested filter %s -> %s: %w", relationKey, nestedRelationKey, err)
}
records, err := store.QueryRaw(&Filters{FilterObj: subQueryFilter}, 0, 0)
if err != nil {
return nil, fmt.Errorf("enrich nested filter: %w", err)
}
ids := make([]string, 0, len(records))
for _, rec := range records {
ids = append(ids, pbtypes.GetString(rec.Details, bundle.RelationKeyId.String()))
}
nestedFilter, err := MakeFilter(spaceID, rawNestedFilter, store)
if err != nil {
return nil, fmt.Errorf("make nested filter %s -> %s: %w", relationKey, nestedRelationKey, err)
}
return &FilterNestedNotIn{
Key: relationKey,
FilterForNestedObjects: nestedFilter,
IDs: ids,
}, nil
}
func (i *FilterNestedNotIn) FilterObject(g *types.Struct) bool {
val := pbtypes.Get(g, i.Key)
for _, id := range i.IDs {
eq := FilterEq{Value: pbtypes.String(id), Cond: model.BlockContentDataviewFilter_Equal}
if eq.filterObject(val) {
return false
}
}
return true
}
func (i *FilterNestedNotIn) AnystoreFilter() query.Filter {
path := []string{i.Key}
conds := make([]query.Filter, 0, len(i.IDs))
for _, id := range i.IDs {
conds = append(conds, query.Key{
Path: path,
Filter: query.NewComp(query.CompOpNe, id),
})
}
return query.And(conds)
}
func (i *FilterNestedNotIn) IterateNestedFilters(fn func(nestedFilter Filter) error) error {
return fn(i)
}

View file

@ -125,6 +125,23 @@ func TestEq_FilterObject(t *testing.T) {
obj = &types.Struct{Fields: map[string]*types.Value{"k": pbtypes.Float64(2)}}
assertFilter(t, eq, obj, false)
})
t.Run("not equal true: no key", func(t *testing.T) {
eq := FilterEq{Key: "k", Value: pbtypes.Bool(true), Cond: model.BlockContentDataviewFilter_NotEqual}
obj := &types.Struct{Fields: map[string]*types.Value{}}
assertFilter(t, eq, obj, true)
obj = &types.Struct{Fields: map[string]*types.Value{"k": pbtypes.Bool(true)}}
assertFilter(t, eq, obj, false)
})
t.Run("not equal false: no key", func(t *testing.T) {
eq := FilterEq{Key: "k", Value: pbtypes.Bool(false), Cond: model.BlockContentDataviewFilter_NotEqual}
obj := &types.Struct{Fields: map[string]*types.Value{}}
assertFilter(t, eq, obj, true)
obj = &types.Struct{Fields: map[string]*types.Value{"k": pbtypes.Bool(false)}}
assertFilter(t, eq, obj, false)
})
}
func TestNot_FilterObject(t *testing.T) {
@ -432,7 +449,7 @@ func TestMakeAndFilter(t *testing.T) {
}
func TestNestedFilters(t *testing.T) {
t.Run("simple", func(t *testing.T) {
t.Run("equal", func(t *testing.T) {
store := NewMockObjectStore(t)
// Query will occur while nested filter resolving
store.EXPECT().QueryRaw(mock.Anything, 0, 0).Return([]Record{
@ -467,6 +484,44 @@ func TestNestedFilters(t *testing.T) {
assertFilter(t, f, obj2, true)
})
t.Run("not equal", func(t *testing.T) {
store := NewMockObjectStore(t)
// Query will occur while nested filter resolving
store.EXPECT().QueryRaw(mock.Anything, 0, 0).Return([]Record{
{
Details: &types.Struct{
Fields: map[string]*types.Value{
bundle.RelationKeyId.String(): pbtypes.String("id1"),
bundle.RelationKeyUniqueKey.String(): pbtypes.String("ot-note"),
},
},
},
{
Details: &types.Struct{
Fields: map[string]*types.Value{
bundle.RelationKeyId.String(): pbtypes.String("id2"),
bundle.RelationKeyUniqueKey.String(): pbtypes.String("ot-note"),
},
},
},
}, nil)
f, err := MakeFilter("spaceId", &model.BlockContentDataviewFilter{
RelationKey: "type.uniqueKey",
Condition: model.BlockContentDataviewFilter_NotEqual,
Value: pbtypes.String("ot-note"),
}, store)
require.NoError(t, err)
obj1 := &types.Struct{Fields: map[string]*types.Value{bundle.RelationKeyType.String(): pbtypes.StringList([]string{"id1"})}}
obj2 := &types.Struct{Fields: map[string]*types.Value{bundle.RelationKeyType.String(): pbtypes.StringList([]string{"id2", "id1"})}}
obj3 := &types.Struct{Fields: map[string]*types.Value{bundle.RelationKeyType.String(): pbtypes.StringList([]string{"id3"})}}
obj4 := &types.Struct{Fields: map[string]*types.Value{bundle.RelationKeyType.String(): pbtypes.StringList([]string{"id4", "id5"})}}
assertFilter(t, f, obj1, false)
assertFilter(t, f, obj2, false)
assertFilter(t, f, obj3, true)
assertFilter(t, f, obj4, true)
})
}
func TestFilterExists(t *testing.T) {

View file

@ -28,7 +28,7 @@ import (
const (
CName = "fts"
ftsDir = "fts"
ftsVer = "4"
ftsVer = "5"
fieldTitle = "Title"
fieldText = "Text"

View file

@ -1,8 +1,8 @@
package ftsearch
/*
#cgo windows,amd64 LDFLAGS:-L${SRCDIR}/../../../../deps/libs/windows-amd64 -ltantivy_go -lm -pthread -lws2_32 -lbcrypt -lwsock32 -lntdll -luserenv -lsynchronization
#cgo darwin,amd64 LDFLAGS:-L${SRCDIR}/../../../../deps/libs/darwin-amd64 -ltantivy_go -lm -pthread -framework CoreFoundation -framework Security -ldl
#cgo windows,amd64 LDFLAGS:-L${SRCDIR}/../../../../deps/libs/windows-amd64 -ltantivy_go -lm -pthread -lws2_32 -lbcrypt -lntdll -luserenv
#cgo darwin,amd64 LDFLAGS:-L${SRCDIR}/../../../../deps/libs/darwin-amd64 -ltantivy_go -lm -pthread -ldl
#cgo darwin,arm64 LDFLAGS:-L${SRCDIR}/../../../../deps/libs/darwin-arm64 -ltantivy_go -lm -pthread -ldl
#cgo ios,arm64 LDFLAGS:-L${SRCDIR}/../../../../deps/libs/ios-arm64 -ltantivy_go -lm -pthread -ldl
#cgo ios,amd64 LDFLAGS:-L${SRCDIR}/../../../../deps/libs/ios-amd64 -ltantivy_go -lm -pthread -ldl
@ -36,8 +36,9 @@ func TantivyNew() FTSearch {
}
var specialChars = map[rune]struct{}{
'+': {}, '-': {}, '&': {}, '|': {}, '!': {}, '(': {}, ')': {}, '{': {}, '}': {},
'[': {}, ']': {}, '^': {}, '"': {}, '~': {}, '*': {}, '?': {}, ':': {},
'+': {}, '^': {}, '`': {}, ':': {}, '{': {},
'}': {}, '"': {}, '[': {}, ']': {}, '(': {},
')': {}, '~': {}, '!': {}, '\\': {}, '*': {},
}
type ftSearchTantivy struct {
@ -350,10 +351,11 @@ func escapeQuery(query string) string {
for _, char := range query {
if _, found := specialChars[char]; found {
escapedQuery.WriteRune('\\')
escapedQuery.WriteRune(' ')
}
escapedQuery.WriteRune(char)
}
return escapedQuery.String()
resultQuery := escapedQuery.String()
return "(\"" + resultQuery + "\" OR " + resultQuery + ")"
}

View file

@ -273,6 +273,14 @@ func (s *dsObjectStore) runDatabase(ctx context.Context, path string) error {
Name: "syncStatus",
Fields: []string{bundle.RelationKeySyncStatus.String()},
},
{
Name: "isDeleted",
Fields: []string{bundle.RelationKeyIsDeleted.String()},
},
{
Name: "isArchived",
Fields: []string{bundle.RelationKeyIsArchived.String()},
},
}
err = s.addIndexes(ctx, objects, objectIndexes)
if err != nil {

View file

@ -130,7 +130,7 @@ func (s *dsObjectStore) queryAnyStore(filter database.Filter, order database.Ord
}
}
}()
iter, err := s.objects.Find(anystoreFilter.String()).Sort(sortsArg...).Offset(offset).Limit(limit).Iter(s.componentCtx)
iter, err := query.Iter(s.componentCtx)
if err != nil {
return nil, fmt.Errorf("find: %w", err)
}

View file

@ -953,33 +953,83 @@ func TestQueryRaw(t *testing.T) {
})
t.Run("with nested filter", func(t *testing.T) {
s := NewStoreFixture(t)
obj1 := TestObject{
bundle.RelationKeyId: pbtypes.String("id1"),
bundle.RelationKeyType: pbtypes.String("type1"),
}
type1 := TestObject{
bundle.RelationKeyId: pbtypes.String("type1"),
bundle.RelationKeyType: pbtypes.String("objectType"),
domain.RelationKey("typeKey"): pbtypes.String("note"),
}
t.Run("equal", func(t *testing.T) {
s := NewStoreFixture(t)
obj1 := TestObject{
bundle.RelationKeyId: pbtypes.String("id1"),
bundle.RelationKeyType: pbtypes.String("type1"),
}
type1 := TestObject{
bundle.RelationKeyId: pbtypes.String("type1"),
bundle.RelationKeyType: pbtypes.String("objectType"),
bundle.RelationKeyUniqueKey: pbtypes.String("ot-note"),
}
s.AddObjects(t, []TestObject{obj1, type1})
s.AddObjects(t, []TestObject{obj1, type1})
flt, err := database.NewFilters(database.Query{
Filters: []*model.BlockContentDataviewFilter{
{
RelationKey: "type.typeKey",
Condition: model.BlockContentDataviewFilter_Equal,
Value: pbtypes.String("note"),
flt, err := database.NewFilters(database.Query{
Filters: []*model.BlockContentDataviewFilter{
{
RelationKey: "type.uniqueKey",
Condition: model.BlockContentDataviewFilter_Equal,
Value: pbtypes.String("ot-note"),
},
},
},
}, s, arena)
require.NoError(t, err)
}, s, arena)
require.NoError(t, err)
recs, err := s.QueryRaw(flt, 0, 0)
require.NoError(t, err)
assertRecordsEqual(t, []TestObject{obj1}, recs)
})
t.Run("not equal", func(t *testing.T) {
s := NewStoreFixture(t)
obj1 := TestObject{
bundle.RelationKeyId: pbtypes.String("id1"),
bundle.RelationKeyType: pbtypes.String("type1"),
bundle.RelationKeyLayout: pbtypes.Int64(int64(model.ObjectType_basic)),
}
obj2 := TestObject{
bundle.RelationKeyId: pbtypes.String("id2"),
bundle.RelationKeyType: pbtypes.String("type2"),
bundle.RelationKeyLayout: pbtypes.Int64(int64(model.ObjectType_basic)),
}
type1 := TestObject{
bundle.RelationKeyId: pbtypes.String("type1"),
bundle.RelationKeyType: pbtypes.String("objectType"),
bundle.RelationKeyUniqueKey: pbtypes.String("ot-template"),
bundle.RelationKeyLayout: pbtypes.Int64(int64(model.ObjectType_objectType)),
}
type2 := TestObject{
bundle.RelationKeyId: pbtypes.String("type2"),
bundle.RelationKeyType: pbtypes.String("objectType"),
bundle.RelationKeyUniqueKey: pbtypes.String("ot-page"),
bundle.RelationKeyLayout: pbtypes.Int64(int64(model.ObjectType_objectType)),
}
s.AddObjects(t, []TestObject{obj1, obj2, type1, type2})
flt, err := database.NewFilters(database.Query{
Filters: []*model.BlockContentDataviewFilter{
{
RelationKey: "type.uniqueKey",
Condition: model.BlockContentDataviewFilter_NotEqual,
Value: pbtypes.String("ot-template"),
},
{
RelationKey: bundle.RelationKeyLayout.String(),
Condition: model.BlockContentDataviewFilter_Equal,
Value: pbtypes.Int64(int64(model.ObjectType_basic)),
},
},
}, s, arena)
require.NoError(t, err)
recs, err := s.QueryRaw(flt, 0, 0)
require.NoError(t, err)
assertRecordsEqual(t, []TestObject{obj2}, recs)
})
recs, err := s.QueryRaw(flt, 0, 0)
require.NoError(t, err)
assertRecordsEqual(t, []TestObject{obj1}, recs)
})
}
@ -1182,3 +1232,36 @@ func TestGetSpaceIDFromFilters(t *testing.T) {
assert.Equal(t, []string{spaceId}, getSpaceIdsFromFilter(f))
})
}
func TestIndex(t *testing.T) {
s := NewStoreFixture(t)
obj1 := TestObject{
bundle.RelationKeyId: pbtypes.String("id1"),
bundle.RelationKeyName: pbtypes.String("name1"),
bundle.RelationKeyIsDeleted: pbtypes.Bool(true),
}
obj2 := TestObject{
bundle.RelationKeyId: pbtypes.String("id2"),
bundle.RelationKeyName: pbtypes.String("name2"),
}
obj3 := TestObject{
bundle.RelationKeyId: pbtypes.String("id3"),
bundle.RelationKeyName: pbtypes.String("name3"),
}
s.AddObjects(t, []TestObject{obj1, obj2, obj3})
recs, err := s.Query(database.Query{
Filters: []*model.BlockContentDataviewFilter{
{
RelationKey: bundle.RelationKeyIsDeleted.String(),
Condition: model.BlockContentDataviewFilter_NotEqual,
Value: pbtypes.Bool(true),
},
},
})
require.NoError(t, err)
assertRecordsEqual(t, []TestObject{
obj2, obj3,
}, recs)
}

View file

@ -30,13 +30,13 @@ func TestImageExif_Mill(t *testing.T) {
}
if exif.Width != i.Width {
t.Errorf("wrong width")
t.Errorf("wrong width %v %v", exif.Width, i.Width)
}
if exif.Height != i.Height {
t.Errorf("wrong height")
t.Errorf("wrong height %v %v", exif.Height, i.Height)
}
if exif.Format != i.Format {
t.Errorf("wrong format")
t.Errorf("wrong format %v %v", exif.Format, i.Format)
}
})
}

View file

@ -31,12 +31,15 @@ func init() {
}
const (
JPEG Format = "jpeg"
PNG Format = "png"
GIF Format = "gif"
ICO Format = "vnd.microsoft.icon"
WEBP Format = "webp"
HEIC Format = "heic"
JPEG Format = "jpeg"
PNG Format = "png"
GIF Format = "gif"
ICO Format = "vnd.microsoft.icon"
WEBP Format = "webp"
HEIC Format = "heic"
PSD Format = "psd"
PSD_MIME Format = "vnd.adobe.photoshop"
TIFF Format = "tiff"
)
func IsImage(mime string) bool {
@ -51,7 +54,7 @@ func IsImage(mime string) bool {
func isImageFormatSupported(format Format) bool {
switch format {
case JPEG, PNG, GIF, ICO, WEBP, HEIC:
case JPEG, PNG, GIF, ICO, WEBP, HEIC, PSD_MIME, PSD, TIFF:
return true
}
return false
@ -120,6 +123,10 @@ func (m *ImageResize) Mill(r io.ReadSeeker, name string) (*Result, error) {
return m.resizeGIF(&imgConfig, r)
case HEIC:
return m.resizeHEIC(&imgConfig, r)
case TIFF:
return m.resizeTIFF(&imgConfig, r)
case PSD:
return m.resizePSD(&imgConfig, r)
}
return nil, fmt.Errorf("unknown format")
@ -336,6 +343,47 @@ func (m *ImageResize) resizeGIF(imgConfig *image.Config, r io.ReadSeeker) (*Resu
}, nil
}
func (m *ImageResize) resizeTIFF(imgConfig *image.Config, r io.ReadSeeker) (*Result, error) {
// tiff resizes to jpeg
img, _, err := image.Decode(r)
if err != nil {
return nil, fmt.Errorf("decode tiff: %w", err)
}
var height int
width, err := strconv.Atoi(m.Opts.Width)
if err != nil {
return nil, fmt.Errorf("invalid width: " + m.Opts.Width)
}
resized := imaging.Resize(img, width, 0, imaging.Lanczos)
width, height = resized.Rect.Max.X, resized.Rect.Max.Y
quality, err := strconv.Atoi(m.Opts.Quality)
if err != nil {
return nil, fmt.Errorf("invalid quality: " + m.Opts.Quality)
}
buf := pool.Get()
defer func() {
_ = buf.Close()
}()
if err = jpeg.Encode(buf, resized, &jpeg.Options{Quality: quality}); err != nil {
return nil, err
}
readSeekCloser, err := buf.GetReadSeekCloser()
if err != nil {
return nil, err
}
return &Result{
File: readSeekCloser,
Meta: map[string]interface{}{
"width": width,
"height": height,
},
}, nil
}
func getExifData(r io.ReadSeeker) (data []byte, err error) {
exifData, err := exif.SearchAndExtractExifWithReader(r)
if err != nil {

View file

@ -0,0 +1,54 @@
package mill
import (
"fmt"
"image"
"image/jpeg"
"io"
"strconv"
"github.com/disintegration/imaging"
"github.com/oov/psd"
)
func (m *ImageResize) resizePSD(imgConfig *image.Config, r io.ReadSeeker) (res *Result, err error) {
img, _, err := psd.Decode(r, &psd.DecodeOptions{SkipLayerImage: true})
if err != nil {
return nil, err
}
var height int
width, err := strconv.Atoi(m.Opts.Width)
if err != nil {
return nil, fmt.Errorf("invalid width: " + m.Opts.Width)
}
resized := imaging.Resize(img.Picker, width, 0, imaging.Lanczos)
width, height = resized.Rect.Max.X, resized.Rect.Max.Y
quality, err := strconv.Atoi(m.Opts.Quality)
if err != nil {
return nil, fmt.Errorf("invalid quality: " + m.Opts.Quality)
}
buf := pool.Get()
defer func() {
_ = buf.Close()
}()
// encode to jpeg encoding to increase compatibility on mobile devices
if err = jpeg.Encode(buf, resized, &jpeg.Options{Quality: quality}); err != nil {
return nil, err
}
readSeekCloser, err := buf.GetReadSeekCloser()
if err != nil {
return nil, err
}
return &Result{
File: readSeekCloser,
Meta: map[string]interface{}{
"width": width,
"height": height,
},
}, nil
}

BIN
pkg/lib/mill/testdata/image.tif vendored Normal file

Binary file not shown.

View file

@ -65,4 +65,18 @@ var Images = []TestImage{
Width: 102,
Height: 79,
},
{
Path: "testdata/text.psd",
Format: "psd",
HasExif: true,
Width: 800,
Height: 600,
},
{
Path: "testdata/image.tif",
Format: "tiff",
HasExif: true,
Width: 1728,
Height: 2376,
},
}

BIN
pkg/lib/mill/testdata/text.psd vendored Normal file

Binary file not shown.

View file

@ -11,6 +11,7 @@ import (
"github.com/anyproto/any-sync/commonspace/object/acl/syncacl"
"github.com/anyproto/any-sync/commonspace/object/acl/syncacl/headupdater"
"github.com/anyproto/any-sync/commonspace/spacesyncproto"
"github.com/anyproto/any-sync/net/peer"
"github.com/stretchr/testify/mock"
"github.com/stretchr/testify/require"
"go.uber.org/mock/gomock"
@ -204,6 +205,14 @@ type syncAclStub struct {
updater headupdater.AclUpdater
}
func (s *syncAclStub) HandleMessage(ctx context.Context, senderId string, protoVersion uint32, message *spacesyncproto.ObjectSyncMessage) (err error) {
return
}
func (s *syncAclStub) SyncWithPeer(ctx context.Context, p peer.Peer) (err error) {
return
}
func (s *syncAclStub) Init(a *app.App) (err error) {
return nil
}
@ -216,10 +225,6 @@ func (s *syncAclStub) Run(ctx context.Context) (err error) {
return
}
func (s *syncAclStub) HandleMessage(ctx context.Context, senderId string, message *spacesyncproto.ObjectSyncMessage) (err error) {
return
}
func (s *syncAclStub) HandleRequest(ctx context.Context, senderId string, request *spacesyncproto.ObjectSyncMessage) (response *spacesyncproto.ObjectSyncMessage, err error) {
return
}
@ -228,10 +233,6 @@ func (s *syncAclStub) SetHeadUpdater(updater headupdater.HeadUpdater) {
return
}
func (s *syncAclStub) SyncWithPeer(ctx context.Context, peerId string) (err error) {
return
}
func (s *syncAclStub) SetAclUpdater(updater headupdater.AclUpdater) {
s.updater = updater
return

View file

@ -1,7 +0,0 @@
package dependencies
import "github.com/gogo/protobuf/types"
type DetailsModifier interface {
ModifyDetails(objectId string, modifier func(current *types.Struct) (*types.Struct, error)) (err error)
}

View file

@ -186,6 +186,7 @@ func newTestPeer(id string) *testPeer {
type testPeer struct {
id string
closed chan struct{}
ctx context.Context
}
func (t *testPeer) SetTTL(ttl time.Duration) {
@ -203,8 +204,7 @@ func (t *testPeer) AcquireDrpcConn(ctx context.Context) (drpc.Conn, error) {
func (t *testPeer) ReleaseDrpcConn(conn drpc.Conn) {}
func (t *testPeer) Context() context.Context {
// TODO implement me
panic("implement me")
return t.ctx
}
func (t *testPeer) Accept() (conn net.Conn, err error) {

View file

@ -1,10 +1,11 @@
31eaddb2ce286ff3c8b9fe01781adaa2f8fd7db759d01c5fab2f655cb85202bb deps/libs/android-386.tar.gz
011be437ffd1498aa295191f0c5f44d30de5ec7dc293f28f57d3acc311a59168 deps/libs/android-amd64.tar.gz
93864215777aba8451ee6ba09a3b2fc2b0582273b166a7f43ecc54e00b37615b deps/libs/android-arm.tar.gz
3a7a5ed4b205d4dafe12dc2cac592cf1f37f5a0f6c99a471365db70eda19effb deps/libs/android-arm64.tar.gz
d9fcba7ec18aaf6e59d06e0ef8011de45df578b7617a566ce38fbe764ebfa0ed deps/libs/darwin-amd64.tar.gz
5d8a1600029c1544bebc6ee0d35098ff8d1242056a23b041da739e5197185557 deps/libs/darwin-arm64.tar.gz
0222fa5e850ddc1641ea9138107138ba754254c577f77b43c1b5bfb11c264610 deps/libs/ios-amd64.tar.gz
e3adc97753f1b8fa95e4d2e37385da2c710dd40ba7706af34303af5bce69506c deps/libs/ios-arm64.tar.gz
f88cff214cc0bb01f2cf7b6e54ca617cce1eac6393decf2d86c6d24f0b903df0 deps/libs/linux-amd64-musl.tar.gz
cb29b5328e9b09d99342b936812903410a1864196486d2edd5cc9028bba9c0a2 deps/libs/windows-amd64.tar.gz
ae7b1f9899be6b310aaf7678dfb19c5b4a1ad19fff967a525ab6b30e4730bd77 deps/libs/android-386.tar.gz
b86d874ba76de4f16d43e86cd2ab1f597f5e4b671f39827c018b18558b5333b7 deps/libs/android-amd64.tar.gz
b5796dbcaa501eecb5568ff44bb280099a10e6ec7607383e6fa88dc126c97b11 deps/libs/android-arm.tar.gz
096a55e25df9ccae19b026c628fa3b8f21eb76f70b617d0fcaf2a0dbc291f59c deps/libs/android-arm64.tar.gz
28ab38b8fd0796c07406a15183a29223057e2193365502e7dfe1e88ae86c90b6 deps/libs/darwin-amd64.tar.gz
247e5d6b9eb8d6c5d65f9c44795aaac40499e781715c1d1769151bf8874b7509 deps/libs/darwin-arm64.tar.gz
2ea69b27b42b1e0ef08817c778d6f9a890a9900f22bbab10a1c229ec19d08304 deps/libs/ios-amd64.tar.gz
553fd2feb0ac055eb8c09f076cfcebc455309ca9f4cc37cf2d76e17654b7471d deps/libs/ios-arm64.tar.gz
a1f27b2c55c3fabe16367041706da72dd57ba30f768b227161212a0cf8e50290 deps/libs/ios-arm64-sim.tar.gz
63c5384d4034875e4302d5d583ac6ccae64a88fe73de931cb885f9a75c777408 deps/libs/linux-amd64-musl.tar.gz
de00e402a6bbdf3f77bd91ddc486c4572a630f4332712c72098ecef931350065 deps/libs/windows-amd64.tar.gz

View file

@ -21,6 +21,35 @@ var (
addressPattern = regexp.MustCompile(`\+?0x[0-9a-z]*`)
)
func InlineCallStack() string {
// Allocate space for the call stack
var pcs [32]uintptr
// Skip 3 frames: runtime.Callers, printStack, and the function calling printStack
n := runtime.Callers(2, pcs[:])
// Get the stack frames
frames := runtime.CallersFrames(pcs[:n])
var sep string
buf := &strings.Builder{}
// Iterate through the frames and print them
for {
frame, more := frames.Next()
buf.WriteString(sep)
sep = " -> "
buf.WriteString(frame.Function)
buf.WriteString(" ")
buf.WriteString(frame.File)
buf.WriteString(":")
buf.WriteString(fmt.Sprintf("%d", frame.Line))
if !more {
break
}
}
return buf.String()
}
func ParseGoroutinesDump(trace string, pattern string) string {
var sb strings.Builder

View file

@ -117,16 +117,24 @@ func IsEmptyValueOrAbsent(s *types.Struct, name string) bool {
if !exists {
return true
}
if _, ok := value.Kind.(*types.Value_StringValue); ok {
return len(GetString(s, name)) == 0
return IsEmptyValue(value)
}
func IsEmptyValue(value *types.Value) bool {
if value == nil {
return true
}
if _, ok := value.Kind.(*types.Value_NumberValue); ok {
return GetFloat64(s, name) == 0
if v, ok := value.Kind.(*types.Value_StringValue); ok {
return len(v.StringValue) == 0
}
if _, ok := value.Kind.(*types.Value_BoolValue); ok {
return !GetBool(s, name)
if v, ok := value.Kind.(*types.Value_NumberValue); ok {
return v.NumberValue == 0
}
if v, ok := value.Kind.(*types.Value_BoolValue); ok {
return !v.BoolValue
}
if _, ok := value.Kind.(*types.Value_ListValue); ok {
@ -187,12 +195,24 @@ func GetStringList(s *types.Struct, name string) []string {
return nil
}
if v, ok := s.Fields[name]; !ok {
return nil
} else {
if v, ok := s.Fields[name]; ok {
return GetStringListValue(v)
}
return nil
}
func GetValueList(s *types.Struct, name string) []*types.Value {
if s == nil || s.Fields == nil {
return nil
}
if v, ok := s.Fields[name]; ok {
if list, ok := v.Kind.(*types.Value_ListValue); ok {
return list.ListValue.Values
}
return []*types.Value{v}
}
return nil
}
// UpdateStringList updates a string list field using modifier function and returns updated value
@ -256,6 +276,16 @@ func GetStringListValue(v *types.Value) []string {
return nil
}
func GetList(v *types.Value) []*types.Value {
if v == nil {
return nil
}
if list, ok := v.Kind.(*types.Value_ListValue); ok {
return list.ListValue.Values
}
return []*types.Value{v}
}
func ListValueToStrings(list *types.ListValue) []string {
if list == nil {
return nil

View file

@ -237,3 +237,19 @@ func FilterCID(cids []string) []string {
return err == nil
})
}
// MergeUniqBy merges two slices with comparator. Resulting slice saves values' order and uniqueness.
// Input slices MUST contain only unique values
func MergeUniqBy[T comparable](s1, s2 []T, equal func(v1, v2 T) bool) (result []T) {
result = make([]T, len(s1))
copy(result, s1)
for _, v2 := range s2 {
if !slices.ContainsFunc(s1, func(v1 T) bool {
return equal(v1, v2)
}) {
result = append(result, v2)
}
}
return result
}

View file

@ -100,3 +100,12 @@ func TestUnsortedEquals(t *testing.T) {
assert.False(t, UnsortedEqual([]string{"a", "b", "c"}, []string{"a", "b"}))
assert.False(t, UnsortedEqual([]string{"a", "b", "c"}, []string{"a", "b", "c", "d"}))
}
func TestMergeUniqBy(t *testing.T) {
strEqual := func(v1, v2 string) bool {
return v1 == v2
}
assert.Equal(t, MergeUniqBy([]string{"a", "b", "c"}, []string{"a", "b"}, strEqual), []string{"a", "b", "c"})
assert.Equal(t, MergeUniqBy([]string{}, []string{"a", "b"}, strEqual), []string{"a", "b"})
assert.Equal(t, MergeUniqBy([]string{"a", "b", "c"}, []string{"z", "d"}, strEqual), []string{"a", "b", "c", "z", "d"})
}