From 370b6fde58da8ffd215e087ca9d31392bc5222b7 Mon Sep 17 00:00:00 2001 From: foxspy Date: Fri, 22 Sep 2023 09:59:26 +0800 Subject: [PATCH] milvus support multi index engine (#27178) Co-authored-by: longjiquan --- Makefile | 10 +- configs/milvus.yaml | 2 + internal/core/build.sh | 7 +- internal/core/src/common/Utils.h | 41 +- internal/core/src/config/ConfigKnowhere.cpp | 5 +- internal/core/src/index/BoolIndex.h | 5 +- internal/core/src/index/CMakeLists.txt | 8 +- internal/core/src/index/IndexFactory-inl.h | 14 +- internal/core/src/index/IndexFactory.cpp | 49 +- internal/core/src/index/IndexFactory.h | 10 +- internal/core/src/index/IndexInfo.h | 1 + internal/core/src/index/Meta.h | 5 +- internal/core/src/index/ScalarIndexSort-inl.h | 9 +- internal/core/src/index/ScalarIndexSort.h | 8 +- internal/core/src/index/StringIndexMarisa.cpp | 9 +- internal/core/src/index/StringIndexMarisa.h | 9 +- internal/core/src/index/Utils.cpp | 7 + internal/core/src/index/Utils.h | 3 + internal/core/src/index/VectorDiskIndex.cpp | 99 +-- internal/core/src/index/VectorDiskIndex.h | 14 +- internal/core/src/index/VectorIndex.h | 13 + internal/core/src/index/VectorMemIndex.cpp | 20 +- internal/core/src/index/VectorMemIndex.h | 9 +- internal/core/src/indexbuilder/IndexFactory.h | 7 +- .../src/indexbuilder/ScalarIndexCreator.cpp | 11 +- .../src/indexbuilder/ScalarIndexCreator.h | 7 +- .../core/src/indexbuilder/VecIndexCreator.cpp | 13 +- .../core/src/indexbuilder/VecIndexCreator.h | 8 +- internal/core/src/indexbuilder/index_c.cpp | 42 +- internal/core/src/indexbuilder/index_c.h | 4 + internal/core/src/indexbuilder/types.h | 1 + internal/core/src/segcore/FieldIndexing.cpp | 10 +- internal/core/src/segcore/Types.h | 1 + internal/core/src/segcore/load_index_c.cpp | 53 +- internal/core/src/segcore/load_index_c.h | 4 + .../core/src/storage/DiskFileManagerImpl.cpp | 10 +- .../core/src/storage/DiskFileManagerImpl.h | 4 +- internal/core/src/storage/FileManager.h | 20 + .../core/src/storage/MemFileManagerImpl.cpp | 10 +- .../core/src/storage/MemFileManagerImpl.h | 4 +- internal/core/src/storage/ThreadPools.cpp | 11 + internal/core/src/storage/Util.cpp | 13 - internal/core/src/storage/Util.h | 6 - .../core/thirdparty/knowhere/CMakeLists.txt | 12 +- .../unittest/bench/bench_indexbuilder.cpp | 6 +- internal/core/unittest/test_c_api.cpp | 30 +- .../unittest/test_disk_file_manager_test.cpp | 4 +- internal/core/unittest/test_float16.cpp | 13 +- internal/core/unittest/test_growing_index.cpp | 3 +- internal/core/unittest/test_index_c_api.cpp | 4 +- internal/core/unittest/test_index_wrapper.cpp | 22 +- internal/core/unittest/test_indexing.cpp | 44 +- .../unittest/test_scalar_index_creator.cpp | 12 +- internal/core/unittest/test_sealed.cpp | 23 +- internal/core/unittest/test_string_expr.cpp | 35 +- internal/core/unittest/test_utils/DataGen.h | 4 +- internal/datacoord/index_builder.go | 19 +- internal/datacoord/index_service.go | 43 +- internal/indexnode/indexnode_service.go | 1 + internal/indexnode/task.go | 5 + internal/metastore/model/segment_index.go | 96 +-- internal/proto/index_coord.proto | 3 + internal/proto/indexpb/index_coord.pb.go | 318 ++++----- internal/proto/internalpb/internal.pb.go | 296 +++++---- internal/proto/planpb/plan.pb.go | 3 - internal/proto/proxypb/proxy.pb.go | 5 +- internal/proto/query_coord.proto | 1 + internal/proto/querypb/query_coord.pb.go | 609 +++++++++--------- internal/proto/rootcoordpb/root_coord.pb.go | 40 +- .../querycoordv2/meta/coordinator_broker.go | 21 +- .../querynodev2/segments/load_index_info.go | 12 + .../querynodev2/segments/segment_loader.go | 1 + .../util/indexcgowrapper/build_index_info.go | 8 + pkg/util/paramtable/component_param.go | 11 + scripts/core_build.sh | 11 +- tests/scripts/values/cardinal.yaml | 4 + 76 files changed, 1282 insertions(+), 1033 deletions(-) create mode 100644 tests/scripts/values/cardinal.yaml diff --git a/Makefile b/Makefile index 1a0993b2e3..349314c690 100644 --- a/Makefile +++ b/Makefile @@ -45,6 +45,8 @@ GOFUMPT_VERSION := 0.5.0 GOFUMPT_OUTPUT := $(shell $(INSTALL_PATH)/gofumpt --version 2>/dev/null) INSTALL_GOFUMPT := $(findstring $(GOFUMPT_VERSION),$(GOFUMPT_OUTPUT)) +index_engine = knowhere + export GIT_BRANCH=master ENABLE_AZURE = false @@ -197,19 +199,19 @@ generated-proto: download-milvus-proto build-3rdparty build-cpp: generated-proto @echo "Building Milvus cpp library ... ${AZURE_OPTION}" - @(env bash $(PWD)/scripts/core_build.sh -t ${mode} -f "$(CUSTOM_THIRDPARTY_PATH)" -n ${disk_index} -y ${use_dynamic_simd} ${AZURE_OPTION}) + @(env bash $(PWD)/scripts/core_build.sh -t ${mode} -f "$(CUSTOM_THIRDPARTY_PATH)" -n ${disk_index} -y ${use_dynamic_simd} ${AZURE_OPTION} -x ${index_engine}) build-cpp-gpu: generated-proto @echo "Building Milvus cpp gpu library ... " - @(env bash $(PWD)/scripts/core_build.sh -t ${mode} -g -f "$(CUSTOM_THIRDPARTY_PATH)" -n ${disk_index} -y ${use_dynamic_simd} ${AZURE_OPTION}) + @(env bash $(PWD)/scripts/core_build.sh -t ${mode} -g -f "$(CUSTOM_THIRDPARTY_PATH)" -n ${disk_index} -y ${use_dynamic_simd} ${AZURE_OPTION} -x ${index_engine}) build-cpp-with-unittest: generated-proto @echo "Building Milvus cpp library with unittest ... " - @(env bash $(PWD)/scripts/core_build.sh -t ${mode} -u -f "$(CUSTOM_THIRDPARTY_PATH)" -n ${disk_index} -y ${use_dynamic_simd} ${AZURE_OPTION}) + @(env bash $(PWD)/scripts/core_build.sh -t ${mode} -u -f "$(CUSTOM_THIRDPARTY_PATH)" -n ${disk_index} -y ${use_dynamic_simd} ${AZURE_OPTION} -x ${index_engine}) build-cpp-with-coverage: generated-proto @echo "Building Milvus cpp library with coverage and unittest ..." - @(env bash $(PWD)/scripts/core_build.sh -t ${mode} -a ${useasan} -u -c -f "$(CUSTOM_THIRDPARTY_PATH)" -n ${disk_index} -y ${use_dynamic_simd} ${AZURE_OPTION}) + @(env bash $(PWD)/scripts/core_build.sh -t ${mode} -a ${useasan} -u -c -f "$(CUSTOM_THIRDPARTY_PATH)" -n ${disk_index} -y ${use_dynamic_simd} ${AZURE_OPTION} -x ${index_engine}) check-proto-product: generated-proto @(env bash $(PWD)/scripts/check_proto_product.sh) diff --git a/configs/milvus.yaml b/configs/milvus.yaml index eec1854704..96f018320a 100644 --- a/configs/milvus.yaml +++ b/configs/milvus.yaml @@ -523,6 +523,8 @@ common: info: 500 # minimum milliseconds for printing durations in info level warn: 1000 # minimum milliseconds for printing durations in warn level + indexEngineVersion: "knowhere-v0" + # QuotaConfig, configurations of Milvus quota and limits. # By default, we enable: # 1. TT protection; diff --git a/internal/core/build.sh b/internal/core/build.sh index ec918b78a6..051a42e5f5 100755 --- a/internal/core/build.sh +++ b/internal/core/build.sh @@ -37,8 +37,9 @@ WITH_PROMETHEUS="ON" CUDA_ARCH="DEFAULT" CUSTOM_THIRDPARTY_PATH="" BUILD_DISK_ANN="OFF" +INDEX_ENGINE="knowhere" -while getopts "p:t:s:f:o:ulrcghzme" arg; do +while getopts "p:t:s:f:o:ulrcghzmex" arg; do case $arg in f) CUSTOM_THIRDPARTY_PATH=$OPTARG @@ -82,6 +83,9 @@ while getopts "p:t:s:f:o:ulrcghzme" arg; do n) BUILD_DISK_ANN="OFF" ;; + x) + INDEX_ENGINE=$OPTARG + ;; h) # help echo " parameter: @@ -154,6 +158,7 @@ CMAKE_CMD="cmake \ -DCUSTOM_THIRDPARTY_DOWNLOAD_PATH=${CUSTOM_THIRDPARTY_PATH} \ -DKNOWHERE_GPU_VERSION=${SUPPORT_GPU} \ -DBUILD_DISK_ANN=${BUILD_DISK_ANN} \ +-DINDEX_ENGINE=${INDEX_ENGINE} \ ${SCRIPTS_DIR}" echo ${CMAKE_CMD} ${CMAKE_CMD} diff --git a/internal/core/src/common/Utils.h b/internal/core/src/common/Utils.h index 58b9f0da5e..2e8e245af0 100644 --- a/internal/core/src/common/Utils.h +++ b/internal/core/src/common/Utils.h @@ -166,46 +166,7 @@ PositivelyRelated(const knowhere::MetricType& metric_type) { inline std::string KnowhereStatusString(knowhere::Status status) { - switch (status) { - case knowhere::Status::invalid_args: - return "invalid args"; - case knowhere::Status::invalid_param_in_json: - return "invalid param in json"; - case knowhere::Status::out_of_range_in_json: - return "out of range in json"; - case knowhere::Status::type_conflict_in_json: - return "type conflict in json"; - case knowhere::Status::invalid_metric_type: - return "invalid metric type"; - case knowhere::Status::empty_index: - return "empty index"; - case knowhere::Status::not_implemented: - return "not implemented"; - case knowhere::Status::index_not_trained: - return "index not trained"; - case knowhere::Status::index_already_trained: - return "index already trained"; - case knowhere::Status::faiss_inner_error: - return "faiss inner error"; - case knowhere::Status::hnsw_inner_error: - return "hnsw inner error"; - case knowhere::Status::malloc_error: - return "malloc error"; - case knowhere::Status::diskann_inner_error: - return "diskann inner error"; - case knowhere::Status::diskann_file_error: - return "diskann file error"; - case knowhere::Status::invalid_value_in_json: - return "invalid value in json"; - case knowhere::Status::arithmetic_overflow: - return "arithmetic overflow"; - case knowhere::Status::raft_inner_error: - return "raft inner error"; - case knowhere::Status::invalid_binary_set: - return "invalid binary set"; - default: - return "unexpected status"; - } + return knowhere::Status2String(status); } inline std::vector diff --git a/internal/core/src/config/ConfigKnowhere.cpp b/internal/core/src/config/ConfigKnowhere.cpp index 99b5ce80e6..2e291db8b3 100644 --- a/internal/core/src/config/ConfigKnowhere.cpp +++ b/internal/core/src/config/ConfigKnowhere.cpp @@ -20,7 +20,6 @@ #include "common/EasyAssert.h" #include "glog/logging.h" #include "log/Log.h" -#include "knowhere/comp/thread_pool.h" #include "knowhere/comp/knowhere_config.h" namespace milvus::config { @@ -74,12 +73,12 @@ KnowhereSetSimdType(const char* value) { void KnowhereInitBuildThreadPool(const uint32_t num_threads) { - knowhere::ThreadPool::InitGlobalBuildThreadPool(num_threads); + knowhere::KnowhereConfig::SetBuildThreadPoolSize(num_threads); } void KnowhereInitSearchThreadPool(const uint32_t num_threads) { - knowhere::ThreadPool::InitGlobalSearchThreadPool(num_threads); + knowhere::KnowhereConfig::SetSearchThreadPoolSize(num_threads); if (!knowhere::KnowhereConfig::SetAioContextPool(num_threads)) { PanicInfo("Failed to set aio context pool with num_threads " + std::to_string(num_threads)); diff --git a/internal/core/src/index/BoolIndex.h b/internal/core/src/index/BoolIndex.h index 3e18a127f0..fe9b3df66a 100644 --- a/internal/core/src/index/BoolIndex.h +++ b/internal/core/src/index/BoolIndex.h @@ -25,7 +25,8 @@ namespace milvus::index { using BoolIndexPtr = std::shared_ptr>; inline BoolIndexPtr -CreateBoolIndex(storage::FileManagerImplPtr file_manager = nullptr) { - return std::make_unique>(file_manager); +CreateBoolIndex(const storage::FileManagerContext& file_manager_context = + storage::FileManagerContext()) { + return std::make_unique>(file_manager_context); } } // namespace milvus::index diff --git a/internal/core/src/index/CMakeLists.txt b/internal/core/src/index/CMakeLists.txt index feec1b22e3..61e3878aa0 100644 --- a/internal/core/src/index/CMakeLists.txt +++ b/internal/core/src/index/CMakeLists.txt @@ -14,15 +14,9 @@ set(INDEX_FILES Utils.cpp VectorMemIndex.cpp IndexFactory.cpp + VectorDiskIndex.cpp ) -if ( BUILD_DISK_ANN STREQUAL "ON" ) - set(INDEX_FILES - ${INDEX_FILES} - VectorDiskIndex.cpp - ) -endif () - milvus_add_pkg_config("milvus_index") add_library(milvus_index SHARED ${INDEX_FILES}) diff --git a/internal/core/src/index/IndexFactory-inl.h b/internal/core/src/index/IndexFactory-inl.h index f8c120fb23..0abd1aa2ef 100644 --- a/internal/core/src/index/IndexFactory-inl.h +++ b/internal/core/src/index/IndexFactory-inl.h @@ -23,9 +23,10 @@ namespace milvus::index { template inline ScalarIndexPtr -IndexFactory::CreateScalarIndex(const IndexType& index_type, - storage::FileManagerImplPtr file_manager) { - return CreateScalarIndexSort(file_manager); +IndexFactory::CreateScalarIndex( + const IndexType& index_type, + const storage::FileManagerContext& file_manager_context) { + return CreateScalarIndexSort(file_manager_context); } // template <> @@ -36,10 +37,11 @@ IndexFactory::CreateScalarIndex(const IndexType& index_type, template <> inline ScalarIndexPtr -IndexFactory::CreateScalarIndex(const IndexType& index_type, - storage::FileManagerImplPtr file_manager) { +IndexFactory::CreateScalarIndex( + const IndexType& index_type, + const storage::FileManagerContext& file_manager_context) { #if defined(__linux__) || defined(__APPLE__) - return CreateStringIndexMarisa(file_manager); + return CreateStringIndexMarisa(file_manager_context); #else throw std::runtime_error("unsupported platform"); #endif diff --git a/internal/core/src/index/IndexFactory.cpp b/internal/core/src/index/IndexFactory.cpp index 812421d8e4..abfe24cc1c 100644 --- a/internal/core/src/index/IndexFactory.cpp +++ b/internal/core/src/index/IndexFactory.cpp @@ -18,50 +18,52 @@ #include "index/VectorMemIndex.h" #include "index/Utils.h" #include "index/Meta.h" +#include "knowhere/utils.h" -#ifdef BUILD_DISK_ANN #include "index/VectorDiskIndex.h" -#endif namespace milvus::index { IndexBasePtr -IndexFactory::CreateIndex(const CreateIndexInfo& create_index_info, - storage::FileManagerImplPtr file_manager) { +IndexFactory::CreateIndex( + const CreateIndexInfo& create_index_info, + const storage::FileManagerContext& file_manager_context) { if (datatype_is_vector(create_index_info.field_type)) { - return CreateVectorIndex(create_index_info, file_manager); + return CreateVectorIndex(create_index_info, file_manager_context); } - return CreateScalarIndex(create_index_info, file_manager); + return CreateScalarIndex(create_index_info, file_manager_context); } IndexBasePtr -IndexFactory::CreateScalarIndex(const CreateIndexInfo& create_index_info, - storage::FileManagerImplPtr file_manager) { +IndexFactory::CreateScalarIndex( + const CreateIndexInfo& create_index_info, + const storage::FileManagerContext& file_manager_context) { auto data_type = create_index_info.field_type; auto index_type = create_index_info.index_type; switch (data_type) { // create scalar index case DataType::BOOL: - return CreateScalarIndex(index_type, file_manager); + return CreateScalarIndex(index_type, file_manager_context); case DataType::INT8: - return CreateScalarIndex(index_type, file_manager); + return CreateScalarIndex(index_type, file_manager_context); case DataType::INT16: - return CreateScalarIndex(index_type, file_manager); + return CreateScalarIndex(index_type, file_manager_context); case DataType::INT32: - return CreateScalarIndex(index_type, file_manager); + return CreateScalarIndex(index_type, file_manager_context); case DataType::INT64: - return CreateScalarIndex(index_type, file_manager); + return CreateScalarIndex(index_type, file_manager_context); case DataType::FLOAT: - return CreateScalarIndex(index_type, file_manager); + return CreateScalarIndex(index_type, file_manager_context); case DataType::DOUBLE: - return CreateScalarIndex(index_type, file_manager); + return CreateScalarIndex(index_type, file_manager_context); // create string index case DataType::STRING: case DataType::VARCHAR: - return CreateScalarIndex(index_type, file_manager); + return CreateScalarIndex(index_type, + file_manager_context); default: throw SegcoreError( DataTypeInvalid, @@ -70,19 +72,19 @@ IndexFactory::CreateScalarIndex(const CreateIndexInfo& create_index_info, } IndexBasePtr -IndexFactory::CreateVectorIndex(const CreateIndexInfo& create_index_info, - storage::FileManagerImplPtr file_manager) { +IndexFactory::CreateVectorIndex( + const CreateIndexInfo& create_index_info, + const storage::FileManagerContext& file_manager_context) { auto index_type = create_index_info.index_type; auto metric_type = create_index_info.metric_type; - -#ifdef BUILD_DISK_ANN + auto version = create_index_info.index_engine_version; // create disk index auto data_type = create_index_info.field_type; - if (is_in_disk_list(index_type)) { + if (knowhere::UseDiskLoad(index_type, version)) { switch (data_type) { case DataType::VECTOR_FLOAT: { return std::make_unique>( - index_type, metric_type, file_manager); + index_type, metric_type, version, file_manager_context); } default: throw SegcoreError( @@ -91,11 +93,10 @@ IndexFactory::CreateVectorIndex(const CreateIndexInfo& create_index_info, data_type)); } } -#endif // create mem index return std::make_unique( - index_type, metric_type, file_manager); + index_type, metric_type, version, file_manager_context); } } // namespace milvus::index diff --git a/internal/core/src/index/IndexFactory.h b/internal/core/src/index/IndexFactory.h index ec1c9cfdf8..aedcc794f2 100644 --- a/internal/core/src/index/IndexFactory.h +++ b/internal/core/src/index/IndexFactory.h @@ -48,15 +48,16 @@ class IndexFactory { IndexBasePtr CreateIndex(const CreateIndexInfo& create_index_info, - storage::FileManagerImplPtr file_manager); + const storage::FileManagerContext& file_manager_context); IndexBasePtr CreateVectorIndex(const CreateIndexInfo& create_index_info, - storage::FileManagerImplPtr file_manager); + const storage::FileManagerContext& file_manager_context); IndexBasePtr CreateScalarIndex(const CreateIndexInfo& create_index_info, - storage::FileManagerImplPtr file_manager = nullptr); + const storage::FileManagerContext& file_manager_context = + storage::FileManagerContext()); // IndexBasePtr // CreateIndex(DataType dtype, const IndexType& index_type); @@ -64,7 +65,8 @@ class IndexFactory { template ScalarIndexPtr CreateScalarIndex(const IndexType& index_type, - storage::FileManagerImplPtr file_manager = nullptr); + const storage::FileManagerContext& file_manager_context = + storage::FileManagerContext()); }; } // namespace milvus::index diff --git a/internal/core/src/index/IndexInfo.h b/internal/core/src/index/IndexInfo.h index 47dd21c0fd..c63a98bb3c 100644 --- a/internal/core/src/index/IndexInfo.h +++ b/internal/core/src/index/IndexInfo.h @@ -24,6 +24,7 @@ struct CreateIndexInfo { DataType field_type; IndexType index_type; MetricType metric_type; + std::string index_engine_version; }; } // namespace milvus::index diff --git a/internal/core/src/index/Meta.h b/internal/core/src/index/Meta.h index 489a8afe50..77024a13aa 100644 --- a/internal/core/src/index/Meta.h +++ b/internal/core/src/index/Meta.h @@ -45,10 +45,13 @@ constexpr const char* FIELD_ID = "field_id"; constexpr const char* INDEX_BUILD_ID = "index_build_id"; constexpr const char* INDEX_ID = "index_id"; constexpr const char* INDEX_VERSION = "index_version"; +constexpr const char* INDEX_ENGINE_VERSION = "index_engine_version"; -// DiskAnn build params +// VecIndex file metas constexpr const char* DISK_ANN_PREFIX_PATH = "index_prefix"; constexpr const char* DISK_ANN_RAW_DATA_PATH = "data_path"; + +// DiskAnn build params constexpr const char* DISK_ANN_MAX_DEGREE = "max_degree"; constexpr const char* DISK_ANN_SEARCH_LIST_SIZE = "search_list_size"; constexpr const char* DISK_ANN_PQ_CODE_BUDGET = "pq_code_budget_gb"; diff --git a/internal/core/src/index/ScalarIndexSort-inl.h b/internal/core/src/index/ScalarIndexSort-inl.h index f79e6a6320..a21c6c4b91 100644 --- a/internal/core/src/index/ScalarIndexSort-inl.h +++ b/internal/core/src/index/ScalarIndexSort-inl.h @@ -30,11 +30,12 @@ namespace milvus::index { template inline ScalarIndexSort::ScalarIndexSort( - storage::FileManagerImplPtr file_manager) + const storage::FileManagerContext& file_manager_context) : is_built_(false), data_() { - if (file_manager != nullptr) { - file_manager_ = std::dynamic_pointer_cast( - file_manager); + if (file_manager_context.Valid()) { + file_manager_ = + std::make_shared(file_manager_context); + AssertInfo(file_manager_ != nullptr, "create file manager failed!"); } } diff --git a/internal/core/src/index/ScalarIndexSort.h b/internal/core/src/index/ScalarIndexSort.h index 9003c57dc7..6d9fae3258 100644 --- a/internal/core/src/index/ScalarIndexSort.h +++ b/internal/core/src/index/ScalarIndexSort.h @@ -33,7 +33,8 @@ template class ScalarIndexSort : public ScalarIndex { public: explicit ScalarIndexSort( - storage::FileManagerImplPtr file_manager = nullptr); + const storage::FileManagerContext& file_manager_context = + storage::FileManagerContext()); BinarySet Serialize(const Config& config) override; @@ -113,7 +114,8 @@ using ScalarIndexSortPtr = std::unique_ptr>; namespace milvus::index { template inline ScalarIndexSortPtr -CreateScalarIndexSort(storage::FileManagerImplPtr file_manager = nullptr) { - return std::make_unique>(file_manager); +CreateScalarIndexSort(const storage::FileManagerContext& file_manager_context = + storage::FileManagerContext()) { + return std::make_unique>(file_manager_context); } } // namespace milvus::index diff --git a/internal/core/src/index/StringIndexMarisa.cpp b/internal/core/src/index/StringIndexMarisa.cpp index 27f9e67382..91a9d14f72 100644 --- a/internal/core/src/index/StringIndexMarisa.cpp +++ b/internal/core/src/index/StringIndexMarisa.cpp @@ -30,10 +30,11 @@ namespace milvus::index { -StringIndexMarisa::StringIndexMarisa(storage::FileManagerImplPtr file_manager) { - if (file_manager != nullptr) { - file_manager_ = std::dynamic_pointer_cast( - file_manager); +StringIndexMarisa::StringIndexMarisa( + const storage::FileManagerContext& file_manager_context) { + if (file_manager_context.Valid()) { + file_manager_ = + std::make_shared(file_manager_context); } } diff --git a/internal/core/src/index/StringIndexMarisa.h b/internal/core/src/index/StringIndexMarisa.h index 859fa70376..ed9a4c22e8 100644 --- a/internal/core/src/index/StringIndexMarisa.h +++ b/internal/core/src/index/StringIndexMarisa.h @@ -29,7 +29,8 @@ namespace milvus::index { class StringIndexMarisa : public StringIndex { public: explicit StringIndexMarisa( - storage::FileManagerImplPtr file_manager = nullptr); + const storage::FileManagerContext& file_manager_context = + storage::FileManagerContext()); int64_t Size() override; @@ -107,8 +108,10 @@ class StringIndexMarisa : public StringIndex { using StringIndexMarisaPtr = std::unique_ptr; inline StringIndexPtr -CreateStringIndexMarisa(storage::FileManagerImplPtr file_manager = nullptr) { - return std::make_unique(file_manager); +CreateStringIndexMarisa( + const storage::FileManagerContext& file_manager_context = + storage::FileManagerContext()) { + return std::make_unique(file_manager_context); } } // namespace milvus::index diff --git a/internal/core/src/index/Utils.cpp b/internal/core/src/index/Utils.cpp index c9f693a0e9..880718e9de 100644 --- a/internal/core/src/index/Utils.cpp +++ b/internal/core/src/index/Utils.cpp @@ -120,6 +120,13 @@ GetIndexTypeFromConfig(const Config& config) { return index_type.value(); } +std::string +GetIndexEngineVersionFromConfig(const Config& config) { + auto index_engine_version = + GetValueFromConfig(config, INDEX_ENGINE_VERSION); + return index_engine_version.has_value() ? index_engine_version.value() : ""; +} + // TODO :: too ugly storage::FieldDataMeta GetFieldDataMetaFromConfig(const Config& config) { diff --git a/internal/core/src/index/Utils.h b/internal/core/src/index/Utils.h index 02c5747197..201b329f8e 100644 --- a/internal/core/src/index/Utils.h +++ b/internal/core/src/index/Utils.h @@ -100,6 +100,9 @@ GetMetricTypeFromConfig(const Config& config); std::string GetIndexTypeFromConfig(const Config& config); +std::string +GetIndexEngineVersionFromConfig(const Config& config); + storage::FieldDataMeta GetFieldDataMetaFromConfig(const Config& config); diff --git a/internal/core/src/index/VectorDiskIndex.cpp b/internal/core/src/index/VectorDiskIndex.cpp index 6b0f4e2252..ef3109a4c1 100644 --- a/internal/core/src/index/VectorDiskIndex.cpp +++ b/internal/core/src/index/VectorDiskIndex.cpp @@ -27,8 +27,6 @@ namespace milvus::index { -#ifdef BUILD_DISK_ANN - #define kSearchListMaxValue1 200 // used if tok <= 20 #define kSearchListMaxValue2 65535 // used for topk > 20 #define kPrepareDim 100 @@ -38,10 +36,12 @@ template VectorDiskAnnIndex::VectorDiskAnnIndex( const IndexType& index_type, const MetricType& metric_type, - storage::FileManagerImplPtr file_manager) + const std::string& version, + const storage::FileManagerContext& file_manager_context) : VectorIndex(index_type, metric_type) { file_manager_ = - std::dynamic_pointer_cast(file_manager); + std::make_shared(file_manager_context); + AssertInfo(file_manager_ != nullptr, "create file manager failed!"); auto local_chunk_manager = storage::LocalChunkManagerSingleton::GetInstance().GetChunkManager(); auto local_index_path_prefix = file_manager_->GetLocalIndexObjectPrefix(); @@ -52,12 +52,12 @@ VectorDiskAnnIndex::VectorDiskAnnIndex( if (local_chunk_manager->Exist(local_index_path_prefix)) { local_chunk_manager->RemoveDir(local_index_path_prefix); } - + CheckCompatible(version); local_chunk_manager->CreateDir(local_index_path_prefix); auto diskann_index_pack = - knowhere::Pack(std::shared_ptr(file_manager)); - index_ = knowhere::IndexFactory::Instance().Create(GetIndexType(), - diskann_index_pack); + knowhere::Pack(std::shared_ptr(file_manager_)); + index_ = knowhere::IndexFactory::Instance().Create( + GetIndexType(), version, diskann_index_pack); } template @@ -90,8 +90,9 @@ VectorDiskAnnIndex::Load(const Config& config) { template BinarySet VectorDiskAnnIndex::Upload(const Config& config) { - auto remote_paths_to_size = file_manager_->GetRemotePathsToFileSize(); BinarySet ret; + index_.Serialize(ret); + auto remote_paths_to_size = file_manager_->GetRemotePathsToFileSize(); for (auto& file : remote_paths_to_size) { ret.Append(file.first, nullptr, file.second); } @@ -119,11 +120,15 @@ VectorDiskAnnIndex::Build(const Config& config) { auto local_index_path_prefix = file_manager_->GetLocalIndexObjectPrefix(); build_config[DISK_ANN_PREFIX_PATH] = local_index_path_prefix; - auto num_threads = GetValueFromConfig( - build_config, DISK_ANN_BUILD_THREAD_NUM); - AssertInfo(num_threads.has_value(), - "param " + std::string(DISK_ANN_BUILD_THREAD_NUM) + "is empty"); - build_config[DISK_ANN_THREADS_NUM] = std::atoi(num_threads.value().c_str()); + if (GetIndexType() == knowhere::IndexEnum::INDEX_DISKANN) { + auto num_threads = GetValueFromConfig( + build_config, DISK_ANN_BUILD_THREAD_NUM); + AssertInfo( + num_threads.has_value(), + "param " + std::string(DISK_ANN_BUILD_THREAD_NUM) + "is empty"); + build_config[DISK_ANN_THREADS_NUM] = + std::atoi(num_threads.value().c_str()); + } knowhere::DataSet* ds_ptr = nullptr; build_config.erase("insert_files"); index_.Build(*ds_ptr, build_config); @@ -151,12 +156,15 @@ VectorDiskAnnIndex::BuildWithDataset(const DatasetPtr& dataset, auto local_index_path_prefix = file_manager_->GetLocalIndexObjectPrefix(); build_config[DISK_ANN_PREFIX_PATH] = local_index_path_prefix; - auto num_threads = GetValueFromConfig( - build_config, DISK_ANN_BUILD_THREAD_NUM); - AssertInfo(num_threads.has_value(), - "param " + std::string(DISK_ANN_BUILD_THREAD_NUM) + "is empty"); - build_config[DISK_ANN_THREADS_NUM] = std::atoi(num_threads.value().c_str()); - + if (GetIndexType() == knowhere::IndexEnum::INDEX_DISKANN) { + auto num_threads = GetValueFromConfig( + build_config, DISK_ANN_BUILD_THREAD_NUM); + AssertInfo( + num_threads.has_value(), + "param " + std::string(DISK_ANN_BUILD_THREAD_NUM) + "is empty"); + build_config[DISK_ANN_THREADS_NUM] = + std::atoi(num_threads.value().c_str()); + } if (!local_chunk_manager->Exist(local_data_path)) { local_chunk_manager->CreateFile(local_data_path); } @@ -204,20 +212,21 @@ VectorDiskAnnIndex::Query(const DatasetPtr dataset, // set search list size auto search_list_size = GetValueFromConfig( search_info.search_params_, DISK_ANN_QUERY_LIST); - if (search_list_size.has_value()) { - search_config[DISK_ANN_SEARCH_LIST_SIZE] = search_list_size.value(); - } - // set beamwidth - search_config[DISK_ANN_QUERY_BEAMWIDTH] = int(search_beamwidth_); + if (GetIndexType() == knowhere::IndexEnum::INDEX_DISKANN) { + if (search_list_size.has_value()) { + search_config[DISK_ANN_SEARCH_LIST_SIZE] = search_list_size.value(); + } + // set beamwidth + search_config[DISK_ANN_QUERY_BEAMWIDTH] = int(search_beamwidth_); + // set json reset field, will be removed later + search_config[DISK_ANN_PQ_CODE_BUDGET] = 0.0; + } // set index prefix, will be removed later auto local_index_path_prefix = file_manager_->GetLocalIndexObjectPrefix(); search_config[DISK_ANN_PREFIX_PATH] = local_index_path_prefix; - // set json reset field, will be removed later - search_config[DISK_ANN_PQ_CODE_BUDGET] = 0.0; - auto final = [&] { auto radius = GetValueFromConfig(search_info.search_params_, RADIUS); @@ -330,22 +339,26 @@ VectorDiskAnnIndex::update_load_json(const Config& config) { auto local_index_path_prefix = file_manager_->GetLocalIndexObjectPrefix(); load_config[DISK_ANN_PREFIX_PATH] = local_index_path_prefix; - // set base info - load_config[DISK_ANN_PREPARE_WARM_UP] = false; - load_config[DISK_ANN_PREPARE_USE_BFS_CACHE] = false; + if (GetIndexType() == knowhere::IndexEnum::INDEX_DISKANN) { + // set base info + load_config[DISK_ANN_PREPARE_WARM_UP] = false; + load_config[DISK_ANN_PREPARE_USE_BFS_CACHE] = false; - // set threads number - auto num_threads = - GetValueFromConfig(load_config, DISK_ANN_LOAD_THREAD_NUM); - AssertInfo(num_threads.has_value(), - "param " + std::string(DISK_ANN_LOAD_THREAD_NUM) + "is empty"); - load_config[DISK_ANN_THREADS_NUM] = std::atoi(num_threads.value().c_str()); + // set threads number + auto num_threads = GetValueFromConfig( + load_config, DISK_ANN_LOAD_THREAD_NUM); + AssertInfo( + num_threads.has_value(), + "param " + std::string(DISK_ANN_LOAD_THREAD_NUM) + "is empty"); + load_config[DISK_ANN_THREADS_NUM] = + std::atoi(num_threads.value().c_str()); - // update search_beamwidth - auto beamwidth = - GetValueFromConfig(load_config, DISK_ANN_QUERY_BEAMWIDTH); - if (beamwidth.has_value()) { - search_beamwidth_ = std::atoi(beamwidth.value().c_str()); + // update search_beamwidth + auto beamwidth = GetValueFromConfig( + load_config, DISK_ANN_QUERY_BEAMWIDTH); + if (beamwidth.has_value()) { + search_beamwidth_ = std::atoi(beamwidth.value().c_str()); + } } return load_config; @@ -353,6 +366,4 @@ VectorDiskAnnIndex::update_load_json(const Config& config) { template class VectorDiskAnnIndex; -#endif - } // namespace milvus::index diff --git a/internal/core/src/index/VectorDiskIndex.h b/internal/core/src/index/VectorDiskIndex.h index de2f964b2c..87c04220cb 100644 --- a/internal/core/src/index/VectorDiskIndex.h +++ b/internal/core/src/index/VectorDiskIndex.h @@ -24,18 +24,19 @@ namespace milvus::index { -#ifdef BUILD_DISK_ANN - template class VectorDiskAnnIndex : public VectorIndex { public: - explicit VectorDiskAnnIndex(const IndexType& index_type, - const MetricType& metric_type, - storage::FileManagerImplPtr file_manager); + explicit VectorDiskAnnIndex( + const IndexType& index_type, + const MetricType& metric_type, + const std::string& version, + const storage::FileManagerContext& file_manager_context); BinarySet Serialize(const Config& config) override { // deprecated - auto remote_paths_to_size = file_manager_->GetRemotePathsToFileSize(); BinarySet binary_set; + index_.Serialize(binary_set); + auto remote_paths_to_size = file_manager_->GetRemotePathsToFileSize(); for (auto& file : remote_paths_to_size) { binary_set.Append(file.first, nullptr, file.second); } @@ -91,6 +92,5 @@ class VectorDiskAnnIndex : public VectorIndex { template using VectorDiskAnnIndexPtr = std::unique_ptr>; -#endif } // namespace milvus::index diff --git a/internal/core/src/index/VectorIndex.h b/internal/core/src/index/VectorIndex.h index 4738c7747b..5b16c8a0e1 100644 --- a/internal/core/src/index/VectorIndex.h +++ b/internal/core/src/index/VectorIndex.h @@ -22,12 +22,14 @@ #include #include +#include "Utils.h" #include "knowhere/factory.h" #include "index/Index.h" #include "common/Types.h" #include "common/BitsetView.h" #include "common/QueryResult.h" #include "common/QueryInfo.h" +#include "knowhere/version.h" namespace milvus::index { @@ -88,6 +90,17 @@ class VectorIndex : public IndexBase { CleanLocalData() { } + void + CheckCompatible(const std::string& version) { + std::string err_msg = + "version not support : " + version + + " , knowhere current version " + + knowhere::Version::GetCurrentVersion().VersionCode(); + AssertInfo( + knowhere::Version::VersionSupport(knowhere::Version(version)), + err_msg); + } + private: MetricType metric_type_; int64_t dim_; diff --git a/internal/core/src/index/VectorMemIndex.cpp b/internal/core/src/index/VectorMemIndex.cpp index dc510cd240..45493b3f3b 100644 --- a/internal/core/src/index/VectorMemIndex.cpp +++ b/internal/core/src/index/VectorMemIndex.cpp @@ -48,17 +48,21 @@ namespace milvus::index { -VectorMemIndex::VectorMemIndex(const IndexType& index_type, - const MetricType& metric_type, - storage::FileManagerImplPtr file_manager) +VectorMemIndex::VectorMemIndex( + const IndexType& index_type, + const MetricType& metric_type, + const std::string& version, + const storage::FileManagerContext& file_manager_context) : VectorIndex(index_type, metric_type) { AssertInfo(!is_unsupported(index_type, metric_type), index_type + " doesn't support metric: " + metric_type); - if (file_manager != nullptr) { - file_manager_ = std::dynamic_pointer_cast( - file_manager); + if (file_manager_context.Valid()) { + file_manager_ = + std::make_shared(file_manager_context); + AssertInfo(file_manager_ != nullptr, "create file manager failed!"); } - index_ = knowhere::IndexFactory::Instance().Create(GetIndexType()); + CheckCompatible(version); + index_ = knowhere::IndexFactory::Instance().Create(GetIndexType(), version); } BinarySet @@ -91,7 +95,7 @@ VectorMemIndex::Serialize(const Config& config) { void VectorMemIndex::LoadWithoutAssemble(const BinarySet& binary_set, const Config& config) { - auto stat = index_.Deserialize(binary_set); + auto stat = index_.Deserialize(binary_set, config); if (stat != knowhere::Status::success) PanicCodeInfo( ErrorCode::UnexpectedError, diff --git a/internal/core/src/index/VectorMemIndex.h b/internal/core/src/index/VectorMemIndex.h index 884fea63a8..ca848023a0 100644 --- a/internal/core/src/index/VectorMemIndex.h +++ b/internal/core/src/index/VectorMemIndex.h @@ -29,9 +29,12 @@ namespace milvus::index { class VectorMemIndex : public VectorIndex { public: - explicit VectorMemIndex(const IndexType& index_type, - const MetricType& metric_type, - storage::FileManagerImplPtr file_manager = nullptr); + explicit VectorMemIndex( + const IndexType& index_type, + const MetricType& metric_type, + const std::string& version, + const storage::FileManagerContext& file_manager_context = + storage::FileManagerContext()); BinarySet Serialize(const Config& config) override; diff --git a/internal/core/src/indexbuilder/IndexFactory.h b/internal/core/src/indexbuilder/IndexFactory.h index f19a9d3616..475ff7f7b3 100644 --- a/internal/core/src/indexbuilder/IndexFactory.h +++ b/internal/core/src/indexbuilder/IndexFactory.h @@ -45,7 +45,7 @@ class IndexFactory { IndexCreatorBasePtr CreateIndex(DataType type, Config& config, - storage::FileManagerImplPtr file_manager) { + const storage::FileManagerContext& context) { auto invalid_dtype_msg = std::string("invalid data type: ") + std::to_string(int(type)); @@ -59,12 +59,11 @@ class IndexFactory { case DataType::DOUBLE: case DataType::VARCHAR: case DataType::STRING: - return CreateScalarIndex(type, config, file_manager); + return CreateScalarIndex(type, config, context); case DataType::VECTOR_FLOAT: case DataType::VECTOR_BINARY: - return std::make_unique( - type, config, file_manager); + return std::make_unique(type, config, context); default: throw SegcoreError( DataTypeInvalid, diff --git a/internal/core/src/indexbuilder/ScalarIndexCreator.cpp b/internal/core/src/indexbuilder/ScalarIndexCreator.cpp index 7d4eefc7f9..62415ea20b 100644 --- a/internal/core/src/indexbuilder/ScalarIndexCreator.cpp +++ b/internal/core/src/indexbuilder/ScalarIndexCreator.cpp @@ -20,15 +20,16 @@ namespace milvus::indexbuilder { -ScalarIndexCreator::ScalarIndexCreator(DataType dtype, - Config& config, - storage::FileManagerImplPtr file_manager) +ScalarIndexCreator::ScalarIndexCreator( + DataType dtype, + Config& config, + const storage::FileManagerContext& file_manager_context) : dtype_(dtype), config_(config) { milvus::index::CreateIndexInfo index_info; index_info.field_type = dtype_; index_info.index_type = index_type(); - index_ = index::IndexFactory::GetInstance().CreateIndex(index_info, - file_manager); + index_ = index::IndexFactory::GetInstance().CreateIndex( + index_info, file_manager_context); } void diff --git a/internal/core/src/indexbuilder/ScalarIndexCreator.h b/internal/core/src/indexbuilder/ScalarIndexCreator.h index 9d6fe9214c..987da36cbc 100644 --- a/internal/core/src/indexbuilder/ScalarIndexCreator.h +++ b/internal/core/src/indexbuilder/ScalarIndexCreator.h @@ -24,7 +24,7 @@ class ScalarIndexCreator : public IndexCreatorBase { public: ScalarIndexCreator(DataType data_type, Config& config, - storage::FileManagerImplPtr file_manager); + const storage::FileManagerContext& file_manager_context); void Build(const milvus::DatasetPtr& dataset) override; @@ -56,8 +56,9 @@ using ScalarIndexCreatorPtr = std::unique_ptr; inline ScalarIndexCreatorPtr CreateScalarIndex(DataType dtype, Config& config, - storage::FileManagerImplPtr file_manager) { - return std::make_unique(dtype, config, file_manager); + const storage::FileManagerContext& file_manager_context) { + return std::make_unique( + dtype, config, file_manager_context); } } // namespace milvus::indexbuilder diff --git a/internal/core/src/indexbuilder/VecIndexCreator.cpp b/internal/core/src/indexbuilder/VecIndexCreator.cpp index dcc47901de..062ecb0e82 100644 --- a/internal/core/src/indexbuilder/VecIndexCreator.cpp +++ b/internal/core/src/indexbuilder/VecIndexCreator.cpp @@ -19,17 +19,20 @@ namespace milvus::indexbuilder { -VecIndexCreator::VecIndexCreator(DataType data_type, - Config& config, - storage::FileManagerImplPtr file_manager) +VecIndexCreator::VecIndexCreator( + DataType data_type, + Config& config, + const storage::FileManagerContext& file_manager_context) : data_type_(data_type), config_(config) { index::CreateIndexInfo index_info; index_info.field_type = data_type_; index_info.index_type = index::GetIndexTypeFromConfig(config_); index_info.metric_type = index::GetMetricTypeFromConfig(config_); + index_info.index_engine_version = + index::GetIndexEngineVersionFromConfig(config_); - index_ = index::IndexFactory::GetInstance().CreateIndex(index_info, - file_manager); + index_ = index::IndexFactory::GetInstance().CreateIndex( + index_info, file_manager_context); AssertInfo(index_ != nullptr, "[VecIndexCreator]Index is null after create index"); } diff --git a/internal/core/src/indexbuilder/VecIndexCreator.h b/internal/core/src/indexbuilder/VecIndexCreator.h index 13aef5f477..e00860adc4 100644 --- a/internal/core/src/indexbuilder/VecIndexCreator.h +++ b/internal/core/src/indexbuilder/VecIndexCreator.h @@ -26,9 +26,11 @@ namespace milvus::indexbuilder { // TODO: better to distinguish binary vec & float vec. class VecIndexCreator : public IndexCreatorBase { public: - explicit VecIndexCreator(DataType data_type, - Config& config, - storage::FileManagerImplPtr file_manager); + explicit VecIndexCreator( + DataType data_type, + Config& config, + const storage::FileManagerContext& file_manager_context = + storage::FileManagerContext()); void Build(const milvus::DatasetPtr& dataset) override; diff --git a/internal/core/src/indexbuilder/index_c.cpp b/internal/core/src/indexbuilder/index_c.cpp index 107909f071..6f53ecc483 100644 --- a/internal/core/src/indexbuilder/index_c.cpp +++ b/internal/core/src/indexbuilder/index_c.cpp @@ -25,6 +25,7 @@ #include "index/Utils.h" #include "pb/index_cgo_msg.pb.h" #include "storage/Util.h" +#include "index/Meta.h" using namespace milvus; CStatus @@ -52,9 +53,14 @@ CreateIndex(enum CDataType dtype, config[param.key()] = param.value(); } + config[milvus::index::INDEX_ENGINE_VERSION] = + knowhere::Version::GetDefaultVersion().VersionCode(); + auto& index_factory = milvus::indexbuilder::IndexFactory::GetInstance(); auto index = - index_factory.CreateIndex(milvus::DataType(dtype), config, nullptr); + index_factory.CreateIndex(milvus::DataType(dtype), + config, + milvus::storage::FileManagerContext()); *res_index = index.release(); status.error_code = Success; @@ -84,6 +90,14 @@ CreateIndexV2(CIndex* res_index, CBuildIndexInfo c_build_index_info) { AssertInfo(index_type.has_value(), "index type is empty"); index_info.index_type = index_type.value(); + auto engine_version = + build_index_info->index_engine_version.empty() + ? knowhere::Version::GetDefaultVersion().VersionCode() + : build_index_info->index_engine_version; + + index_info.index_engine_version = engine_version; + config[milvus::index::INDEX_ENGINE_VERSION] = engine_version; + // get metric type if (milvus::datatype_is_vector(field_type)) { auto metric_type = milvus::index::GetValueFromConfig( @@ -104,13 +118,13 @@ CreateIndexV2(CIndex* res_index, CBuildIndexInfo c_build_index_info) { build_index_info->index_version}; auto chunk_manager = milvus::storage::CreateChunkManager( build_index_info->storage_config); - auto file_manager = milvus::storage::CreateFileManager( - index_info.index_type, field_meta, index_meta, chunk_manager); - AssertInfo(file_manager != nullptr, "create file manager failed!"); + + milvus::storage::FileManagerContext fileManagerContext( + field_meta, index_meta, chunk_manager); auto index = milvus::indexbuilder::IndexFactory::GetInstance().CreateIndex( - build_index_info->field_type, config, file_manager); + build_index_info->field_type, config, fileManagerContext); index->Build(); *res_index = index.release(); auto status = CStatus(); @@ -439,10 +453,24 @@ AppendInsertFilePath(CBuildIndexInfo c_build_index_info, status.error_msg = ""; return status; } catch (std::exception& e) { + return milvus::FailureCStatus(&e); + } +} + +CStatus +AppendIndexEngineVersionToBuildInfo(CBuildIndexInfo c_load_index_info, + const char* c_index_engine_version) { + try { + auto build_index_info = (BuildIndexInfo*)c_load_index_info; + std::string index_engine_version(c_index_engine_version); + build_index_info->index_engine_version = index_engine_version; + auto status = CStatus(); - status.error_code = UnexpectedError; - status.error_msg = strdup(e.what()); + status.error_code = Success; + status.error_msg = ""; return status; + } catch (std::exception& e) { + return milvus::FailureCStatus(&e); } } diff --git a/internal/core/src/indexbuilder/index_c.h b/internal/core/src/indexbuilder/index_c.h index c5ca784c7b..1b0d9b74c2 100644 --- a/internal/core/src/indexbuilder/index_c.h +++ b/internal/core/src/indexbuilder/index_c.h @@ -86,6 +86,10 @@ AppendIndexMetaInfo(CBuildIndexInfo c_build_index_info, CStatus AppendInsertFilePath(CBuildIndexInfo c_build_index_info, const char* file_path); +CStatus +AppendIndexEngineVersionToBuildInfo(CBuildIndexInfo c_load_index_info, + const char* c_index_engine_version); + CStatus CreateIndexV2(CIndex* res_index, CBuildIndexInfo c_build_index_info); diff --git a/internal/core/src/indexbuilder/types.h b/internal/core/src/indexbuilder/types.h index 2301d0ae78..2149646a8c 100644 --- a/internal/core/src/indexbuilder/types.h +++ b/internal/core/src/indexbuilder/types.h @@ -33,4 +33,5 @@ struct BuildIndexInfo { std::vector insert_files; milvus::storage::StorageConfig storage_config; milvus::Config config; + std::string index_engine_version; }; \ No newline at end of file diff --git a/internal/core/src/segcore/FieldIndexing.cpp b/internal/core/src/segcore/FieldIndexing.cpp index d8a0fc0cae..e9b6ff38a7 100644 --- a/internal/core/src/segcore/FieldIndexing.cpp +++ b/internal/core/src/segcore/FieldIndexing.cpp @@ -33,8 +33,10 @@ VectorFieldIndexing::VectorFieldIndexing(const FieldMeta& field_meta, sync_with_index(false), config_(std::make_unique( segment_max_row_count, field_index_meta, segcore_config)) { - index_ = std::make_unique(config_->GetIndexType(), - config_->GetMetricType()); + index_ = std::make_unique( + config_->GetIndexType(), + config_->GetMetricType(), + knowhere::Version::GetCurrentVersion().VersionCode()); } void @@ -54,7 +56,9 @@ VectorFieldIndexing::BuildIndexRange(int64_t ack_beg, for (int chunk_id = ack_beg; chunk_id < ack_end; chunk_id++) { const auto& chunk = source->get_chunk(chunk_id); auto indexing = std::make_unique( - knowhere::IndexEnum::INDEX_FAISS_IVFFLAT, knowhere::metric::L2); + knowhere::IndexEnum::INDEX_FAISS_IVFFLAT, + knowhere::metric::L2, + knowhere::Version::GetCurrentVersion().VersionCode()); auto dataset = knowhere::GenDataSet( source->get_size_per_chunk(), dim, chunk.data()); indexing->BuildWithDataset(dataset, conf); diff --git a/internal/core/src/segcore/Types.h b/internal/core/src/segcore/Types.h index ce7b9d2657..5e378cc770 100644 --- a/internal/core/src/segcore/Types.h +++ b/internal/core/src/segcore/Types.h @@ -42,6 +42,7 @@ struct LoadIndexInfo { std::map index_params; std::vector index_files; index::IndexBasePtr index; + std::string index_engine_version; }; } // namespace milvus::segcore diff --git a/internal/core/src/segcore/load_index_c.cpp b/internal/core/src/segcore/load_index_c.cpp index 1f6af6c95a..660601372c 100644 --- a/internal/core/src/segcore/load_index_c.cpp +++ b/internal/core/src/segcore/load_index_c.cpp @@ -18,6 +18,7 @@ #include "index/Meta.h" #include "index/Utils.h" #include "log/Log.h" +#include "storage/FileManager.h" #include "segcore/Types.h" #include "storage/Util.h" #include "storage/RemoteChunkManagerSingleton.h" @@ -111,6 +112,7 @@ appendVecIndex(CLoadIndexInfo c_load_index_info, CBinarySet c_binary_set) { milvus::index::CreateIndexInfo index_info; index_info.field_type = load_index_info->field_type; + index_info.index_engine_version = load_index_info->index_engine_version; // get index type AssertInfo(index_params.find("index_type") != index_params.end(), @@ -135,20 +137,16 @@ appendVecIndex(CLoadIndexInfo c_load_index_info, CBinarySet c_binary_set) { auto remote_chunk_manager = milvus::storage::RemoteChunkManagerSingleton::GetInstance() .GetRemoteChunkManager(); - auto file_manager = - milvus::storage::CreateFileManager(index_info.index_type, - field_meta, - index_meta, - remote_chunk_manager); - AssertInfo(file_manager != nullptr, "create file manager failed!"); auto config = milvus::index::ParseConfigFromIndexParams( load_index_info->index_params); config["index_files"] = load_index_info->index_files; + milvus::storage::FileManagerContext fileManagerContext( + field_meta, index_meta, remote_chunk_manager); load_index_info->index = milvus::index::IndexFactory::GetInstance().CreateIndex( - index_info, file_manager); + index_info, fileManagerContext); load_index_info->index->Load(*binary_set, config); auto status = CStatus(); status.error_code = milvus::Success; @@ -180,8 +178,8 @@ appendScalarIndex(CLoadIndexInfo c_load_index_info, CBinarySet c_binary_set) { index_info.index_type = index_params["index_type"]; load_index_info->index = - milvus::index::IndexFactory::GetInstance().CreateIndex(index_info, - nullptr); + milvus::index::IndexFactory::GetInstance().CreateIndex( + index_info, milvus::storage::FileManagerContext()); load_index_info->index->Load(*binary_set); auto status = CStatus(); status.error_code = milvus::Success; @@ -213,8 +211,14 @@ AppendIndexV2(CLoadIndexInfo c_load_index_info) { auto& index_params = load_index_info->index_params; auto field_type = load_index_info->field_type; + auto engine_version = + load_index_info->index_engine_version.empty() + ? knowhere::Version::GetDefaultVersion().VersionCode() + : load_index_info->index_engine_version; + milvus::index::CreateIndexInfo index_info; index_info.field_type = load_index_info->field_type; + index_info.index_engine_version = engine_version; // get index type AssertInfo(index_params.find("index_type") != index_params.end(), @@ -241,20 +245,16 @@ AppendIndexV2(CLoadIndexInfo c_load_index_info) { auto remote_chunk_manager = milvus::storage::RemoteChunkManagerSingleton::GetInstance() .GetRemoteChunkManager(); - auto file_manager = - milvus::storage::CreateFileManager(index_info.index_type, - field_meta, - index_meta, - remote_chunk_manager); - AssertInfo(file_manager != nullptr, "create file manager failed!"); auto config = milvus::index::ParseConfigFromIndexParams( load_index_info->index_params); config["index_files"] = load_index_info->index_files; + milvus::storage::FileManagerContext fileManagerContext( + field_meta, index_meta, remote_chunk_manager); load_index_info->index = milvus::index::IndexFactory::GetInstance().CreateIndex( - index_info, file_manager); + index_info, fileManagerContext); if (!load_index_info->mmap_dir_path.empty() && load_index_info->index->IsMmapSupported()) { @@ -324,6 +324,27 @@ AppendIndexInfo(CLoadIndexInfo c_load_index_info, } } +CStatus +AppendIndexEngineVersionToLoadInfo(CLoadIndexInfo c_load_index_info, + const char* c_index_engine_version) { + try { + auto load_index_info = + (milvus::segcore::LoadIndexInfo*)c_load_index_info; + std::string index_engine_version(c_index_engine_version); + load_index_info->index_engine_version = index_engine_version; + + auto status = CStatus(); + status.error_code = milvus::Success; + status.error_msg = ""; + return status; + } catch (std::exception& e) { + auto status = CStatus(); + status.error_code = milvus::UnexpectedError; + status.error_msg = strdup(e.what()); + return status; + } +} + CStatus CleanLoadedIndex(CLoadIndexInfo c_load_index_info) { try { diff --git a/internal/core/src/segcore/load_index_c.h b/internal/core/src/segcore/load_index_c.h index d386b57b0e..f6998ad09b 100644 --- a/internal/core/src/segcore/load_index_c.h +++ b/internal/core/src/segcore/load_index_c.h @@ -58,6 +58,10 @@ AppendIndexFilePath(CLoadIndexInfo c_load_index_info, const char* file_path); CStatus AppendIndexV2(CLoadIndexInfo c_load_index_info); +CStatus +AppendIndexEngineVersionToLoadInfo(CLoadIndexInfo c_load_index_info, + const char* c_index_engine_version); + CStatus CleanLoadedIndex(CLoadIndexInfo c_load_index_info); diff --git a/internal/core/src/storage/DiskFileManagerImpl.cpp b/internal/core/src/storage/DiskFileManagerImpl.cpp index c1cddc6403..7c275b2c7a 100644 --- a/internal/core/src/storage/DiskFileManagerImpl.cpp +++ b/internal/core/src/storage/DiskFileManagerImpl.cpp @@ -31,11 +31,11 @@ namespace milvus::storage { -DiskFileManagerImpl::DiskFileManagerImpl(const FieldDataMeta& field_mata, - IndexMeta index_meta, - ChunkManagerPtr remote_chunk_manager) - : FileManagerImpl(field_mata, index_meta) { - rcm_ = remote_chunk_manager; +DiskFileManagerImpl::DiskFileManagerImpl( + const FileManagerContext& fileManagerContext) + : FileManagerImpl(fileManagerContext.fieldDataMeta, + fileManagerContext.indexMeta) { + rcm_ = fileManagerContext.chunkManagerPtr; } DiskFileManagerImpl::~DiskFileManagerImpl() { diff --git a/internal/core/src/storage/DiskFileManagerImpl.h b/internal/core/src/storage/DiskFileManagerImpl.h index 4d79e8acc7..ed23dd7dee 100644 --- a/internal/core/src/storage/DiskFileManagerImpl.h +++ b/internal/core/src/storage/DiskFileManagerImpl.h @@ -32,9 +32,7 @@ namespace milvus::storage { class DiskFileManagerImpl : public FileManagerImpl { public: - explicit DiskFileManagerImpl(const FieldDataMeta& field_mata, - IndexMeta index_meta, - ChunkManagerPtr remote_chunk_manager); + explicit DiskFileManagerImpl(const FileManagerContext& fileManagerContext); virtual ~DiskFileManagerImpl(); diff --git a/internal/core/src/storage/FileManager.h b/internal/core/src/storage/FileManager.h index b80c35429c..13493d31fb 100644 --- a/internal/core/src/storage/FileManager.h +++ b/internal/core/src/storage/FileManager.h @@ -28,6 +28,26 @@ namespace milvus::storage { +struct FileManagerContext { + FileManagerContext() : chunkManagerPtr(nullptr) { + } + FileManagerContext(const FieldDataMeta& fieldDataMeta, + const IndexMeta& indexMeta, + const ChunkManagerPtr& chunkManagerPtr) + : fieldDataMeta(fieldDataMeta), + indexMeta(indexMeta), + chunkManagerPtr(chunkManagerPtr) { + } + bool + Valid() const { + return chunkManagerPtr != nullptr; + } + + FieldDataMeta fieldDataMeta; + IndexMeta indexMeta; + ChunkManagerPtr chunkManagerPtr; +}; + #define FILEMANAGER_TRY try { #define FILEMANAGER_CATCH \ } \ diff --git a/internal/core/src/storage/MemFileManagerImpl.cpp b/internal/core/src/storage/MemFileManagerImpl.cpp index def1f351a1..e7c0c49428 100644 --- a/internal/core/src/storage/MemFileManagerImpl.cpp +++ b/internal/core/src/storage/MemFileManagerImpl.cpp @@ -24,11 +24,11 @@ namespace milvus::storage { -MemFileManagerImpl::MemFileManagerImpl(const FieldDataMeta& field_mata, - IndexMeta index_meta, - ChunkManagerPtr remote_chunk_manager) - : FileManagerImpl(field_mata, index_meta) { - rcm_ = remote_chunk_manager; +MemFileManagerImpl::MemFileManagerImpl( + const FileManagerContext& fileManagerContext) + : FileManagerImpl(fileManagerContext.fieldDataMeta, + fileManagerContext.indexMeta) { + rcm_ = fileManagerContext.chunkManagerPtr; } bool diff --git a/internal/core/src/storage/MemFileManagerImpl.h b/internal/core/src/storage/MemFileManagerImpl.h index 44f2054e59..860d4b14c6 100644 --- a/internal/core/src/storage/MemFileManagerImpl.h +++ b/internal/core/src/storage/MemFileManagerImpl.h @@ -30,9 +30,7 @@ namespace milvus::storage { class MemFileManagerImpl : public FileManagerImpl { public: - explicit MemFileManagerImpl(const FieldDataMeta& field_mata, - IndexMeta index_meta, - ChunkManagerPtr remote_chunk_manager); + explicit MemFileManagerImpl(const FileManagerContext& fileManagerContext); virtual bool LoadFile(const std::string& filename) noexcept; diff --git a/internal/core/src/storage/ThreadPools.cpp b/internal/core/src/storage/ThreadPools.cpp index ec3a019702..e2253fafe2 100644 --- a/internal/core/src/storage/ThreadPools.cpp +++ b/internal/core/src/storage/ThreadPools.cpp @@ -1,3 +1,14 @@ +// Copyright (C) 2019-2020 Zilliz. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software distributed under the License +// is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express +// or implied. See the License for the specific language governing permissions and limitations under the License + // // Created by zilliz on 2023/7/31. // diff --git a/internal/core/src/storage/Util.cpp b/internal/core/src/storage/Util.cpp index 18e7222fdf..e91a0d6c00 100644 --- a/internal/core/src/storage/Util.cpp +++ b/internal/core/src/storage/Util.cpp @@ -614,19 +614,6 @@ CreateChunkManager(const StorageConfig& storage_config) { } } -FileManagerImplPtr -CreateFileManager(IndexType index_type, - const FieldDataMeta& field_meta, - const IndexMeta& index_meta, - ChunkManagerPtr cm) { - if (is_in_disk_list(index_type)) { - return std::make_shared( - field_meta, index_meta, cm); - } - - return std::make_shared(field_meta, index_meta, cm); -} - FieldDataPtr CreateFieldData(const DataType& type, int64_t dim, int64_t total_num_rows) { switch (type) { diff --git a/internal/core/src/storage/Util.h b/internal/core/src/storage/Util.h index 60a9886bf8..e732371a1c 100644 --- a/internal/core/src/storage/Util.h +++ b/internal/core/src/storage/Util.h @@ -129,12 +129,6 @@ ReleaseArrowUnused(); ChunkManagerPtr CreateChunkManager(const StorageConfig& storage_config); -FileManagerImplPtr -CreateFileManager(IndexType index_type, - const FieldDataMeta& field_meta, - const IndexMeta& index_meta, - ChunkManagerPtr cm); - FieldDataPtr CreateFieldData(const DataType& type, int64_t dim = 1, diff --git a/internal/core/thirdparty/knowhere/CMakeLists.txt b/internal/core/thirdparty/knowhere/CMakeLists.txt index c16ac908e7..5679e5a1d8 100644 --- a/internal/core/thirdparty/knowhere/CMakeLists.txt +++ b/internal/core/thirdparty/knowhere/CMakeLists.txt @@ -11,7 +11,14 @@ # or implied. See the License for the specific language governing permissions and limitations under the License. #------------------------------------------------------------------------------- -set( KNOWHERE_VERSION 7b63839 ) +set( KNOWHERE_VERSION 1dcd84b4 ) +set( GIT_REPOSITORY "https://github.com/zilliztech/knowhere.git") +if ( INDEX_ENGINE STREQUAL "cardinal" ) + set( KNOWHERE_VERSION main) + set( GIT_REPOSITORY "https://github.com/zilliztech/knowhere-cloud.git") +endif() +message(STATUS "Knowhere repo: ${GIT_REPOSITORY}") +message(STATUS "Knowhere version: ${KNOWHERE_VERSION}") message(STATUS "Building knowhere-${KNOWHERE_SOURCE_VER} from source") message(STATUS ${CMAKE_BUILD_TYPE}) @@ -26,11 +33,10 @@ if ( MILVUS_GPU_VERSION STREQUAL "ON" ) set(WITH_RAFT ON CACHE BOOL "" FORCE ) endif () - set( CMAKE_PREFIX_PATH ${CONAN_BOOST_ROOT} ) FetchContent_Declare( knowhere - GIT_REPOSITORY "https://github.com/zilliztech/knowhere.git" + GIT_REPOSITORY ${GIT_REPOSITORY} GIT_TAG ${KNOWHERE_VERSION} SOURCE_DIR ${CMAKE_CURRENT_BINARY_DIR}/knowhere-src BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/knowhere-build diff --git a/internal/core/unittest/bench/bench_indexbuilder.cpp b/internal/core/unittest/bench/bench_indexbuilder.cpp index e85c927cbf..2355663247 100644 --- a/internal/core/unittest/bench/bench_indexbuilder.cpp +++ b/internal/core/unittest/bench/bench_indexbuilder.cpp @@ -60,6 +60,8 @@ IndexBuilder_build(benchmark::State& state) { const auto& param = index_params.params(i); config[param.key()] = param.value(); } + config[milvus::index::INDEX_ENGINE_VERSION] = + knowhere::Version::GetCurrentVersion().VersionCode(); auto is_binary = state.range(2); auto dataset = GenDataset(NB, metric_type, is_binary); @@ -68,7 +70,7 @@ IndexBuilder_build(benchmark::State& state) { for (auto _ : state) { auto index = std::make_unique( - milvus::DataType::VECTOR_FLOAT, config, nullptr); + milvus::DataType::VECTOR_FLOAT, config); index->Build(xb_dataset); } } @@ -102,7 +104,7 @@ IndexBuilder_build_and_codec(benchmark::State& state) { for (auto _ : state) { auto index = std::make_unique( - milvus::DataType::VECTOR_FLOAT, config, nullptr); + milvus::DataType::VECTOR_FLOAT, config); index->Build(xb_dataset); index->Serialize(); diff --git a/internal/core/unittest/test_c_api.cpp b/internal/core/unittest/test_c_api.cpp index 3b33b5f103..351d7d3b6d 100644 --- a/internal/core/unittest/test_c_api.cpp +++ b/internal/core/unittest/test_c_api.cpp @@ -249,9 +249,11 @@ generate_index(void* raw_data, IndexType index_type, int64_t dim, int64_t N) { - CreateIndexInfo create_index_info{field_type, index_type, metric_type}; + auto engine_version = knowhere::Version::GetCurrentVersion().VersionCode(); + CreateIndexInfo create_index_info{ + field_type, index_type, metric_type, engine_version}; auto indexing = milvus::index::IndexFactory::GetInstance().CreateIndex( - create_index_info, nullptr); + create_index_info, milvus::storage::FileManagerContext()); auto database = knowhere::GenDataSet(N, dim, raw_data); auto build_config = generate_build_conf(index_type, metric_type); @@ -1597,7 +1599,8 @@ TEST(CApiTest, LoadIndexInfo) { auto N = 1024 * 10; auto [raw_data, timestamps, uids] = generate_data(N); auto indexing = knowhere::IndexFactory::Instance().Create( - knowhere::IndexEnum::INDEX_FAISS_IVFSQ8); + knowhere::IndexEnum::INDEX_FAISS_IVFSQ8, + knowhere::Version::GetCurrentVersion().VersionCode()); auto conf = knowhere::Json{{knowhere::meta::METRIC_TYPE, knowhere::metric::L2}, {knowhere::meta::DIM, DIM}, @@ -1630,6 +1633,7 @@ TEST(CApiTest, LoadIndexInfo) { status = AppendFieldInfo( c_load_index_info, 0, 0, 0, 0, CDataType::FloatVector, ""); ASSERT_EQ(status.error_code, Success); + AppendIndexEngineVersionToLoadInfo(c_load_index_info, knowhere::Version::GetCurrentVersion().VersionCode().c_str()); status = AppendIndex(c_load_index_info, c_binary_set); ASSERT_EQ(status.error_code, Success); DeleteLoadIndexInfo(c_load_index_info); @@ -1643,7 +1647,8 @@ TEST(CApiTest, LoadIndexSearch) { auto num_query = 100; auto [raw_data, timestamps, uids] = generate_data(N); auto indexing = knowhere::IndexFactory::Instance().Create( - knowhere::IndexEnum::INDEX_FAISS_IVFSQ8); + knowhere::IndexEnum::INDEX_FAISS_IVFSQ8, + knowhere::Version::GetCurrentVersion().VersionCode()); auto conf = knowhere::Json{{knowhere::meta::METRIC_TYPE, knowhere::metric::L2}, {knowhere::meta::DIM, DIM}, @@ -1667,7 +1672,9 @@ TEST(CApiTest, LoadIndexSearch) { auto& index_params = load_index_info.index_params; index_params["index_type"] = knowhere::IndexEnum::INDEX_FAISS_IVFSQ8; load_index_info.index = std::make_unique( - index_params["index_type"], knowhere::metric::L2); + index_params["index_type"], + knowhere::metric::L2, + knowhere::Version::GetCurrentVersion().VersionCode()); load_index_info.index->Load(binary_set); // search @@ -1785,8 +1792,8 @@ TEST(CApiTest, Indexing_Without_Predicate) { c_load_index_info, metric_type_key.c_str(), metric_type_value.c_str()); AppendFieldInfo( c_load_index_info, 0, 0, 0, 100, CDataType::FloatVector, ""); + AppendIndexEngineVersionToLoadInfo(c_load_index_info, knowhere::Version::GetCurrentVersion().VersionCode().c_str()); AppendIndex(c_load_index_info, (CBinarySet)&binary_set); - // load index for vec field, load raw data for scalar field auto sealed_segment = SealedCreator(schema, dataset); sealed_segment->DropFieldData(FieldId(100)); @@ -1925,6 +1932,7 @@ TEST(CApiTest, Indexing_Expr_Without_Predicate) { c_load_index_info, metric_type_key.c_str(), metric_type_value.c_str()); AppendFieldInfo( c_load_index_info, 0, 0, 0, 100, CDataType::FloatVector, ""); + AppendIndexEngineVersionToLoadInfo(c_load_index_info, knowhere::Version::GetCurrentVersion().VersionCode().c_str()); AppendIndex(c_load_index_info, (CBinarySet)&binary_set); // load index for vec field, load raw data for scalar field @@ -2094,6 +2102,7 @@ TEST(CApiTest, Indexing_With_float_Predicate_Range) { c_load_index_info, metric_type_key.c_str(), metric_type_value.c_str()); AppendFieldInfo( c_load_index_info, 0, 0, 0, 100, CDataType::FloatVector, ""); + AppendIndexEngineVersionToLoadInfo(c_load_index_info, knowhere::Version::GetCurrentVersion().VersionCode().c_str()); AppendIndex(c_load_index_info, (CBinarySet)&binary_set); // load index for vec field, load raw data for scalar field @@ -2265,6 +2274,7 @@ TEST(CApiTest, Indexing_Expr_With_float_Predicate_Range) { c_load_index_info, metric_type_key.c_str(), metric_type_value.c_str()); AppendFieldInfo( c_load_index_info, 0, 0, 0, 100, CDataType::FloatVector, ""); + AppendIndexEngineVersionToLoadInfo(c_load_index_info, knowhere::Version::GetCurrentVersion().VersionCode().c_str()); AppendIndex(c_load_index_info, (CBinarySet)&binary_set); // load index for vec field, load raw data for scalar field @@ -2428,6 +2438,7 @@ TEST(CApiTest, Indexing_With_float_Predicate_Term) { c_load_index_info, metric_type_key.c_str(), metric_type_value.c_str()); AppendFieldInfo( c_load_index_info, 0, 0, 0, 100, CDataType::FloatVector, ""); + AppendIndexEngineVersionToLoadInfo(c_load_index_info, knowhere::Version::GetCurrentVersion().VersionCode().c_str()); AppendIndex(c_load_index_info, (CBinarySet)&binary_set); // load index for vec field, load raw data for scalar field @@ -2592,6 +2603,7 @@ TEST(CApiTest, Indexing_Expr_With_float_Predicate_Term) { c_load_index_info, metric_type_key.c_str(), metric_type_value.c_str()); AppendFieldInfo( c_load_index_info, 0, 0, 0, 100, CDataType::FloatVector, ""); + AppendIndexEngineVersionToLoadInfo(c_load_index_info, knowhere::Version::GetCurrentVersion().VersionCode().c_str()); AppendIndex(c_load_index_info, (CBinarySet)&binary_set); // load index for vec field, load raw data for scalar field @@ -2762,6 +2774,7 @@ TEST(CApiTest, Indexing_With_binary_Predicate_Range) { c_load_index_info, metric_type_key.c_str(), metric_type_value.c_str()); AppendFieldInfo( c_load_index_info, 0, 0, 0, 100, CDataType::BinaryVector, ""); + AppendIndexEngineVersionToLoadInfo(c_load_index_info, knowhere::Version::GetCurrentVersion().VersionCode().c_str()); AppendIndex(c_load_index_info, (CBinarySet)&binary_set); // load index for vec field, load raw data for scalar field @@ -2932,6 +2945,7 @@ TEST(CApiTest, Indexing_Expr_With_binary_Predicate_Range) { c_load_index_info, metric_type_key.c_str(), metric_type_value.c_str()); AppendFieldInfo( c_load_index_info, 0, 0, 0, 100, CDataType::BinaryVector, ""); + AppendIndexEngineVersionToLoadInfo(c_load_index_info, knowhere::Version::GetCurrentVersion().VersionCode().c_str()); AppendIndex(c_load_index_info, (CBinarySet)&binary_set); // load index for vec field, load raw data for scalar field @@ -3096,6 +3110,7 @@ TEST(CApiTest, Indexing_With_binary_Predicate_Term) { c_load_index_info, metric_type_key.c_str(), metric_type_value.c_str()); AppendFieldInfo( c_load_index_info, 0, 0, 0, 100, CDataType::BinaryVector, ""); + AppendIndexEngineVersionToLoadInfo(c_load_index_info, knowhere::Version::GetCurrentVersion().VersionCode().c_str()); AppendIndex(c_load_index_info, (CBinarySet)&binary_set); // load index for vec field, load raw data for scalar field @@ -3283,6 +3298,7 @@ TEST(CApiTest, Indexing_Expr_With_binary_Predicate_Term) { c_load_index_info, metric_type_key.c_str(), metric_type_value.c_str()); AppendFieldInfo( c_load_index_info, 0, 0, 0, 100, CDataType::BinaryVector, ""); + AppendIndexEngineVersionToLoadInfo(c_load_index_info, knowhere::Version::GetCurrentVersion().VersionCode().c_str()); AppendIndex(c_load_index_info, (CBinarySet)&binary_set); // load index for vec field, load raw data for scalar field @@ -3453,6 +3469,7 @@ TEST(CApiTest, SealedSegment_search_float_Predicate_Range) { c_load_index_info, metric_type_key.c_str(), metric_type_value.c_str()); AppendFieldInfo( c_load_index_info, 0, 0, 0, 100, CDataType::FloatVector, ""); + AppendIndexEngineVersionToLoadInfo(c_load_index_info, knowhere::Version::GetCurrentVersion().VersionCode().c_str()); AppendIndex(c_load_index_info, (CBinarySet)&binary_set); auto query_dataset = knowhere::GenDataSet(num_queries, DIM, query_ptr); @@ -3677,6 +3694,7 @@ TEST(CApiTest, SealedSegment_search_float_With_Expr_Predicate_Range) { c_load_index_info, metric_type_key.c_str(), metric_type_value.c_str()); AppendFieldInfo( c_load_index_info, 0, 0, 0, 100, CDataType::FloatVector, ""); + AppendIndexEngineVersionToLoadInfo(c_load_index_info, knowhere::Version::GetCurrentVersion().VersionCode().c_str()); AppendIndex(c_load_index_info, (CBinarySet)&binary_set); // load vec index diff --git a/internal/core/unittest/test_disk_file_manager_test.cpp b/internal/core/unittest/test_disk_file_manager_test.cpp index 298c6bbd0e..52762a57c9 100644 --- a/internal/core/unittest/test_disk_file_manager_test.cpp +++ b/internal/core/unittest/test_disk_file_manager_test.cpp @@ -61,8 +61,8 @@ TEST_F(DiskAnnFileManagerTest, AddFilePositiveParallel) { IndexMeta index_meta = {3, 100, 1000, 1, "index"}; int64_t slice_size = milvus::FILE_SLICE_SIZE; - auto diskAnnFileManager = - std::make_shared(filed_data_meta, index_meta, cm_); + auto diskAnnFileManager = std::make_shared( + storage::FileManagerContext(filed_data_meta, index_meta, cm_)); auto ok = diskAnnFileManager->AddFile(indexFilePath); EXPECT_EQ(ok, true); diff --git a/internal/core/unittest/test_float16.cpp b/internal/core/unittest/test_float16.cpp index 5af0517254..d83c433bb3 100644 --- a/internal/core/unittest/test_float16.cpp +++ b/internal/core/unittest/test_float16.cpp @@ -11,7 +11,6 @@ #include - #include "common/LoadInfo.h" #include "common/Types.h" #include "index/IndexFactory.h" @@ -80,8 +79,8 @@ TEST(Float16, Insert) { auto row_count = interface.get_row_count(); ASSERT_EQ(N, row_count); for (auto chunk_id = 0; chunk_id < num_chunk; ++chunk_id) { - auto float16_span = - interface.chunk_data(float16_vec_fid, chunk_id); + auto float16_span = interface.chunk_data( + float16_vec_fid, chunk_id); auto begin = chunk_id * size_per_chunk; auto end = std::min((chunk_id + 1) * size_per_chunk, N); auto size_of_chunk = end - begin; @@ -150,8 +149,7 @@ TEST(Float16, ExecWithoutPredicateFlat) { auto vec_ptr = dataset.get_col(vec_fid); auto num_queries = 5; - auto ph_group_raw = CreateFloat16PlaceholderGroup( - num_queries, 32, 1024); + auto ph_group_raw = CreateFloat16PlaceholderGroup(num_queries, 32, 1024); auto ph_group = ParsePlaceholderGroup(plan.get(), ph_group_raw.SerializeAsString()); @@ -204,7 +202,7 @@ TEST(Float16, GetVector) { segment->bulk_subscript(vec, ids_ds->GetIds(), num_inserted); auto vector = result.get()->mutable_vectors()->float16_vector(); - EXPECT_TRUE(vector.size() == num_inserted * dim * sizeof(float16)); + EXPECT_TRUE(vector.size() == num_inserted * dim * sizeof(float16)); // EXPECT_TRUE(vector.size() == num_inserted * dim); // for (size_t i = 0; i < num_inserted; ++i) { // auto id = ids_ds->GetIds()[i]; @@ -286,7 +284,8 @@ TEST(Float16, CApiCPlan) { milvus::proto::plan::PlanNode plan_node; auto vector_anns = plan_node.mutable_vector_anns(); - vector_anns->set_vector_type(milvus::proto::plan::VectorType::Float16Vector); + vector_anns->set_vector_type( + milvus::proto::plan::VectorType::Float16Vector); vector_anns->set_placeholder_tag("$0"); vector_anns->set_field_id(100); auto query_info = vector_anns->mutable_query_info(); diff --git a/internal/core/unittest/test_growing_index.cpp b/internal/core/unittest/test_growing_index.cpp index 9e1d8bc2ae..fa612fc31c 100644 --- a/internal/core/unittest/test_growing_index.cpp +++ b/internal/core/unittest/test_growing_index.cpp @@ -58,7 +58,8 @@ TEST(GrowingIndex, Correctness) { milvus::proto::plan::PlanNode range_query_plan_node; auto vector_range_querys = range_query_plan_node.mutable_vector_anns(); - vector_range_querys->set_vector_type(milvus::proto::plan::VectorType::FloatVector); + vector_range_querys->set_vector_type( + milvus::proto::plan::VectorType::FloatVector); vector_range_querys->set_placeholder_tag("$0"); vector_range_querys->set_field_id(102); auto range_query_info = vector_range_querys->mutable_query_info(); diff --git a/internal/core/unittest/test_index_c_api.cpp b/internal/core/unittest/test_index_c_api.cpp index 3b52a6d6da..54c528b3a5 100644 --- a/internal/core/unittest/test_index_c_api.cpp +++ b/internal/core/unittest/test_index_c_api.cpp @@ -199,7 +199,7 @@ TEST(CBoolIndexTest, All) { { DeleteBinarySet(binary_set); } } - delete[] (char*)(half_ds->GetTensor()); + delete[](char*)(half_ds->GetTensor()); } // TODO: more scalar type. @@ -316,6 +316,6 @@ TEST(CStringIndexTest, All) { { DeleteBinarySet(binary_set); } } - delete[] (char*)(str_ds->GetTensor()); + delete[](char*)(str_ds->GetTensor()); } #endif diff --git a/internal/core/unittest/test_index_wrapper.cpp b/internal/core/unittest/test_index_wrapper.cpp index 2d44206c61..7d9058f4ae 100644 --- a/internal/core/unittest/test_index_wrapper.cpp +++ b/internal/core/unittest/test_index_wrapper.cpp @@ -70,10 +70,9 @@ class IndexWrapperTest : public ::testing::TestWithParam { is_binary = is_binary_map[index_type]; if (is_binary) { - vec_field_data_type = DataType::VECTOR_FLOAT; - ; - } else { vec_field_data_type = DataType::VECTOR_BINARY; + } else { + vec_field_data_type = DataType::VECTOR_FLOAT; } auto dataset = GenDataset(NB, metric_type, is_binary); @@ -129,8 +128,15 @@ INSTANTIATE_TEST_CASE_P( std::pair(knowhere::IndexEnum::INDEX_HNSW, knowhere::metric::L2))); TEST_P(IndexWrapperTest, BuildAndQuery) { + milvus::storage::FieldDataMeta field_data_meta{1, 2, 3, 100}; + milvus::storage::IndexMeta index_meta{3, 100, 1000, 1}; + auto chunk_manager = milvus::storage::CreateChunkManager(storage_config_); + + storage::FileManagerContext file_manager_context( + field_data_meta, index_meta, chunk_manager); + config[milvus::index::INDEX_ENGINE_VERSION] = knowhere::Version::GetCurrentVersion().VersionCode(); auto index = milvus::indexbuilder::IndexFactory::GetInstance().CreateIndex( - vec_field_data_type, config, nullptr); + vec_field_data_type, config, file_manager_context); auto dataset = GenDataset(NB, metric_type, is_binary); knowhere::DataSetPtr xb_dataset; @@ -146,12 +152,18 @@ TEST_P(IndexWrapperTest, BuildAndQuery) { ASSERT_NO_THROW(index->Build(xb_dataset)); auto binary_set = index->Serialize(); + std::vector index_files; + for (auto& binary : binary_set.binary_map_) { + index_files.emplace_back(binary.first); + } + config["index_files"] = index_files; auto copy_index = milvus::indexbuilder::IndexFactory::GetInstance().CreateIndex( - vec_field_data_type, config, nullptr); + vec_field_data_type, config, file_manager_context); auto vec_index = static_cast(copy_index.get()); ASSERT_EQ(vec_index->dim(), DIM); + ASSERT_NO_THROW(vec_index->Load(binary_set)); milvus::SearchInfo search_info; diff --git a/internal/core/unittest/test_indexing.cpp b/internal/core/unittest/test_indexing.cpp index 1186e9b259..90237531ad 100644 --- a/internal/core/unittest/test_indexing.cpp +++ b/internal/core/unittest/test_indexing.cpp @@ -223,8 +223,10 @@ TEST(Indexing, Naive) { create_index_info.field_type = DataType::VECTOR_FLOAT; create_index_info.metric_type = knowhere::metric::L2; create_index_info.index_type = knowhere::IndexEnum::INDEX_FAISS_IVFPQ; + create_index_info.index_engine_version = + knowhere::Version::GetCurrentVersion().VersionCode(); auto index = milvus::index::IndexFactory::GetInstance().CreateIndex( - create_index_info, nullptr); + create_index_info, milvus::storage::FileManagerContext()); auto build_conf = knowhere::Json{ {knowhere::meta::METRIC_TYPE, knowhere::metric::L2}, @@ -386,15 +388,17 @@ TEST_P(IndexTest, BuildAndQuery) { create_index_info.index_type = index_type; create_index_info.metric_type = metric_type; create_index_info.field_type = vec_field_data_type; + create_index_info.index_engine_version = + knowhere::Version::GetCurrentVersion().VersionCode(); index::IndexBasePtr index; milvus::storage::FieldDataMeta field_data_meta{1, 2, 3, 100}; milvus::storage::IndexMeta index_meta{3, 100, 1000, 1}; auto chunk_manager = milvus::storage::CreateChunkManager(storage_config_); - auto file_manager = milvus::storage::CreateFileManager( - index_type, field_data_meta, index_meta, chunk_manager); + milvus::storage::FileManagerContext file_manager_context( + field_data_meta, index_meta, chunk_manager); index = milvus::index::IndexFactory::GetInstance().CreateIndex( - create_index_info, file_manager); + create_index_info, file_manager_context); ASSERT_NO_THROW(index->BuildWithDataset(xb_dataset, build_conf)); milvus::index::IndexBasePtr new_index; @@ -404,7 +408,7 @@ TEST_P(IndexTest, BuildAndQuery) { index.reset(); new_index = milvus::index::IndexFactory::GetInstance().CreateIndex( - create_index_info, file_manager); + create_index_info, file_manager_context); vec_index = dynamic_cast(new_index.get()); std::vector index_files; @@ -437,15 +441,17 @@ TEST_P(IndexTest, Mmap) { create_index_info.index_type = index_type; create_index_info.metric_type = metric_type; create_index_info.field_type = vec_field_data_type; + create_index_info.index_engine_version = + knowhere::Version::GetCurrentVersion().VersionCode(); index::IndexBasePtr index; milvus::storage::FieldDataMeta field_data_meta{1, 2, 3, 100}; milvus::storage::IndexMeta index_meta{3, 100, 1000, 1}; auto chunk_manager = milvus::storage::CreateChunkManager(storage_config_); - auto file_manager = milvus::storage::CreateFileManager( - index_type, field_data_meta, index_meta, chunk_manager); + milvus::storage::FileManagerContext file_manager_context( + field_data_meta, index_meta, chunk_manager); index = milvus::index::IndexFactory::GetInstance().CreateIndex( - create_index_info, file_manager); + create_index_info, file_manager_context); ASSERT_NO_THROW(index->BuildWithDataset(xb_dataset, build_conf)); milvus::index::IndexBasePtr new_index; @@ -455,7 +461,7 @@ TEST_P(IndexTest, Mmap) { index.reset(); new_index = milvus::index::IndexFactory::GetInstance().CreateIndex( - create_index_info, file_manager); + create_index_info, file_manager_context); if (!new_index->IsMmapSupported()) { return; } @@ -492,15 +498,17 @@ TEST_P(IndexTest, GetVector) { create_index_info.index_type = index_type; create_index_info.metric_type = metric_type; create_index_info.field_type = vec_field_data_type; + create_index_info.index_engine_version = + knowhere::Version::GetCurrentVersion().VersionCode(); index::IndexBasePtr index; milvus::storage::FieldDataMeta field_data_meta{1, 2, 3, 100}; milvus::storage::IndexMeta index_meta{3, 100, 1000, 1}; auto chunk_manager = milvus::storage::CreateChunkManager(storage_config_); - auto file_manager = milvus::storage::CreateFileManager( - index_type, field_data_meta, index_meta, chunk_manager); + milvus::storage::FileManagerContext file_manager_context( + field_data_meta, index_meta, chunk_manager); index = milvus::index::IndexFactory::GetInstance().CreateIndex( - create_index_info, file_manager); + create_index_info, file_manager_context); ASSERT_NO_THROW(index->BuildWithDataset(xb_dataset, build_conf)); milvus::index::IndexBasePtr new_index; @@ -512,7 +520,7 @@ TEST_P(IndexTest, GetVector) { index.reset(); new_index = milvus::index::IndexFactory::GetInstance().CreateIndex( - create_index_info, file_manager); + create_index_info, file_manager_context); vec_index = dynamic_cast(new_index.get()); @@ -569,6 +577,8 @@ TEST(Indexing, SearchDiskAnnWithInvalidParam) { create_index_info.index_type = index_type; create_index_info.metric_type = metric_type; create_index_info.field_type = milvus::DataType::VECTOR_FLOAT; + create_index_info.index_engine_version = + knowhere::Version::GetCurrentVersion().VersionCode(); int64_t collection_id = 1; int64_t partition_id = 2; @@ -583,10 +593,10 @@ TEST(Indexing, SearchDiskAnnWithInvalidParam) { milvus::storage::IndexMeta index_meta{ segment_id, field_id, build_id, index_version}; auto chunk_manager = storage::CreateChunkManager(storage_config); - auto file_manager = milvus::storage::CreateFileManager( - index_type, field_data_meta, index_meta, chunk_manager); + milvus::storage::FileManagerContext file_manager_context( + field_data_meta, index_meta, chunk_manager); auto index = milvus::index::IndexFactory::GetInstance().CreateIndex( - create_index_info, file_manager); + create_index_info, file_manager_context); auto build_conf = Config{ {knowhere::meta::METRIC_TYPE, metric_type}, @@ -611,7 +621,7 @@ TEST(Indexing, SearchDiskAnnWithInvalidParam) { index.reset(); auto new_index = milvus::index::IndexFactory::GetInstance().CreateIndex( - create_index_info, file_manager); + create_index_info, file_manager_context); auto vec_index = dynamic_cast(new_index.get()); std::vector index_files; for (auto& binary : binary_set.binary_map_) { diff --git a/internal/core/unittest/test_scalar_index_creator.cpp b/internal/core/unittest/test_scalar_index_creator.cpp index 987c6ce87d..e23e163018 100644 --- a/internal/core/unittest/test_scalar_index_creator.cpp +++ b/internal/core/unittest/test_scalar_index_creator.cpp @@ -112,7 +112,9 @@ TYPED_TEST_P(TypedScalarIndexCreatorTest, Constructor) { } auto creator = milvus::indexbuilder::CreateScalarIndex( - milvus::DataType(dtype), config, nullptr); + milvus::DataType(dtype), + config, + milvus::storage::FileManagerContext()); } } @@ -133,12 +135,16 @@ TYPED_TEST_P(TypedScalarIndexCreatorTest, Codec) { config[iter->first] = iter->second; } auto creator = milvus::indexbuilder::CreateScalarIndex( - milvus::DataType(dtype), config, nullptr); + milvus::DataType(dtype), + config, + milvus::storage::FileManagerContext()); auto arr = GenArr(nb); build_index(creator, arr); auto binary_set = creator->Serialize(); auto copy_creator = milvus::indexbuilder::CreateScalarIndex( - milvus::DataType(dtype), config, nullptr); + milvus::DataType(dtype), + config, + milvus::storage::FileManagerContext()); copy_creator->Load(binary_set); } } diff --git a/internal/core/unittest/test_sealed.cpp b/internal/core/unittest/test_sealed.cpp index ba0dd0ed5c..68dedcb616 100644 --- a/internal/core/unittest/test_sealed.cpp +++ b/internal/core/unittest/test_sealed.cpp @@ -18,6 +18,7 @@ #include "test_utils/storage_test_utils.h" #include "index/IndexFactory.h" #include "storage/Util.h" +#include "knowhere/version.h" #include "storage/ChunkCacheSingleton.h" #include "storage/RemoteChunkManagerSingleton.h" #include "storage/MinioChunkManager.h" @@ -88,9 +89,11 @@ TEST(Sealed, without_predicate) { create_index_info.field_type = DataType::VECTOR_FLOAT; create_index_info.metric_type = knowhere::metric::L2; create_index_info.index_type = knowhere::IndexEnum::INDEX_FAISS_IVFFLAT; + create_index_info.index_engine_version = + knowhere::Version::GetCurrentVersion().VersionCode(); auto indexing = milvus::index::IndexFactory::GetInstance().CreateIndex( - create_index_info, nullptr); + create_index_info, milvus::storage::FileManagerContext()); auto build_conf = knowhere::Json{{knowhere::meta::METRIC_TYPE, knowhere::metric::L2}, @@ -201,8 +204,10 @@ TEST(Sealed, with_predicate) { create_index_info.field_type = DataType::VECTOR_FLOAT; create_index_info.metric_type = knowhere::metric::L2; create_index_info.index_type = knowhere::IndexEnum::INDEX_FAISS_IVFFLAT; + create_index_info.index_engine_version = + knowhere::Version::GetCurrentVersion().VersionCode(); auto indexing = milvus::index::IndexFactory::GetInstance().CreateIndex( - create_index_info, nullptr); + create_index_info, milvus::storage::FileManagerContext()); auto build_conf = knowhere::Json{{knowhere::meta::METRIC_TYPE, knowhere::metric::L2}, @@ -305,8 +310,10 @@ TEST(Sealed, with_predicate_filter_all) { create_index_info.field_type = DataType::VECTOR_FLOAT; create_index_info.metric_type = knowhere::metric::L2; create_index_info.index_type = knowhere::IndexEnum::INDEX_FAISS_IVFFLAT; + create_index_info.index_engine_version = + knowhere::Version::GetCurrentVersion().VersionCode(); auto ivf_indexing = milvus::index::IndexFactory::GetInstance().CreateIndex( - create_index_info, nullptr); + create_index_info, milvus::storage::FileManagerContext()); auto ivf_build_conf = knowhere::Json{{knowhere::meta::DIM, std::to_string(dim)}, @@ -343,8 +350,10 @@ TEST(Sealed, with_predicate_filter_all) { create_index_info.field_type = DataType::VECTOR_FLOAT; create_index_info.metric_type = knowhere::metric::L2; create_index_info.index_type = knowhere::IndexEnum::INDEX_HNSW; + create_index_info.index_engine_version = + knowhere::Version::GetCurrentVersion().VersionCode(); auto hnsw_indexing = milvus::index::IndexFactory::GetInstance().CreateIndex( - create_index_info, nullptr); + create_index_info, milvus::storage::FileManagerContext()); hnsw_indexing->BuildWithDataset(database, hnsw_conf); auto hnsw_vec_index = @@ -1212,8 +1221,10 @@ TEST(Sealed, GetVectorFromChunkCache) { auto fakevec = dataset.get_col(fakevec_id); auto conf = generate_build_conf(index_type, metric_type); auto ds = knowhere::GenDataSet(N, dim, fakevec.data()); - auto indexing = - std::make_unique(index_type, metric_type); + auto indexing = std::make_unique( + index_type, + metric_type, + knowhere::Version::GetCurrentVersion().VersionCode()); indexing->BuildWithDataset(ds, conf); auto segment_sealed = CreateSealedSegment(schema); diff --git a/internal/core/unittest/test_string_expr.cpp b/internal/core/unittest/test_string_expr.cpp index 7f257809ab..32aa555d5f 100644 --- a/internal/core/unittest/test_string_expr.cpp +++ b/internal/core/unittest/test_string_expr.cpp @@ -186,10 +186,7 @@ GenTermPlan(const FieldMeta& fvec_meta, vector_type = proto::plan::VectorType::Float16Vector; } - auto anns = GenAnns(expr, - vector_type, - fvec_meta.get_id().get(), - "$0"); + auto anns = GenAnns(expr, vector_type, fvec_meta.get_id().get(), "$0"); auto plan_node = GenPlanNode(); plan_node->set_allocated_vector_anns(anns); @@ -232,10 +229,8 @@ GenAlwaysFalsePlan(const FieldMeta& fvec_meta, const FieldMeta& str_meta) { } else if (fvec_meta.get_data_type() == DataType::VECTOR_FLOAT16) { vector_type = proto::plan::VectorType::Float16Vector; } - auto anns = GenAnns(always_false_expr, - vector_type, - fvec_meta.get_id().get(), - "$0"); + auto anns = + GenAnns(always_false_expr, vector_type, fvec_meta.get_id().get(), "$0"); auto plan_node = GenPlanNode(); plan_node->set_allocated_vector_anns(anns); @@ -253,10 +248,8 @@ GenAlwaysTruePlan(const FieldMeta& fvec_meta, const FieldMeta& str_meta) { } else if (fvec_meta.get_data_type() == DataType::VECTOR_FLOAT16) { vector_type = proto::plan::VectorType::Float16Vector; } - auto anns = GenAnns(always_true_expr, - vector_type, - fvec_meta.get_id().get(), - "$0"); + auto anns = + GenAnns(always_true_expr, vector_type, fvec_meta.get_id().get(), "$0"); auto plan_node = GenPlanNode(); plan_node->set_allocated_vector_anns(anns); @@ -386,11 +379,7 @@ TEST(StringExpr, Compare) { } else if (fvec_meta.get_data_type() == DataType::VECTOR_FLOAT16) { vector_type = proto::plan::VectorType::Float16Vector; } - auto anns = - GenAnns(expr, - vector_type, - fvec_meta.get_id().get(), - "$0"); + auto anns = GenAnns(expr, vector_type, fvec_meta.get_id().get(), "$0"); auto plan_node = std::make_unique(); plan_node->set_allocated_vector_anns(anns); @@ -497,11 +486,7 @@ TEST(StringExpr, UnaryRange) { } else if (fvec_meta.get_data_type() == DataType::VECTOR_FLOAT16) { vector_type = proto::plan::VectorType::Float16Vector; } - auto anns = - GenAnns(expr, - vector_type, - fvec_meta.get_id().get(), - "$0"); + auto anns = GenAnns(expr, vector_type, fvec_meta.get_id().get(), "$0"); auto plan_node = std::make_unique(); plan_node->set_allocated_vector_anns(anns); @@ -600,11 +585,7 @@ TEST(StringExpr, BinaryRange) { } else if (fvec_meta.get_data_type() == DataType::VECTOR_FLOAT16) { vector_type = proto::plan::VectorType::Float16Vector; } - auto anns = - GenAnns(expr, - vector_type, - fvec_meta.get_id().get(), - "$0"); + auto anns = GenAnns(expr, vector_type, fvec_meta.get_id().get(), "$0"); auto plan_node = std::make_unique(); plan_node->set_allocated_vector_anns(anns); diff --git a/internal/core/unittest/test_utils/DataGen.h b/internal/core/unittest/test_utils/DataGen.h index a0e9921429..d495c005cc 100644 --- a/internal/core/unittest/test_utils/DataGen.h +++ b/internal/core/unittest/test_utils/DataGen.h @@ -910,7 +910,9 @@ GenVecIndexing(int64_t N, int64_t dim, const float* vec) { {knowhere::meta::DEVICE_ID, 0}}; auto database = knowhere::GenDataSet(N, dim, vec); auto indexing = std::make_unique( - knowhere::IndexEnum::INDEX_FAISS_IVFFLAT, knowhere::metric::L2); + knowhere::IndexEnum::INDEX_FAISS_IVFFLAT, + knowhere::metric::L2, + knowhere::Version::GetCurrentVersion().VersionCode()); indexing->BuildWithDataset(database, conf); return indexing; } diff --git a/internal/datacoord/index_builder.go b/internal/datacoord/index_builder.go index 2bdc618a87..5af90cc8b1 100644 --- a/internal/datacoord/index_builder.go +++ b/internal/datacoord/index_builder.go @@ -292,15 +292,16 @@ func (ib *indexBuilder) process(buildID UniqueID) bool { } } req := &indexpb.CreateJobRequest{ - ClusterID: Params.CommonCfg.ClusterPrefix.GetValue(), - IndexFilePrefix: path.Join(ib.chunkManager.RootPath(), common.SegmentIndexPath), - BuildID: buildID, - DataPaths: binLogs, - IndexVersion: meta.IndexVersion + 1, - StorageConfig: storageConfig, - IndexParams: indexParams, - TypeParams: typeParams, - NumRows: meta.NumRows, + ClusterID: Params.CommonCfg.ClusterPrefix.GetValue(), + IndexFilePrefix: path.Join(ib.chunkManager.RootPath(), common.SegmentIndexPath), + BuildID: buildID, + DataPaths: binLogs, + IndexVersion: meta.IndexVersion + 1, + StorageConfig: storageConfig, + IndexParams: indexParams, + TypeParams: typeParams, + NumRows: meta.NumRows, + IndexEngineVersion: meta.IndexEngineVersion, } if err := ib.assignTask(client, req); err != nil { // need to release lock then reassign, so set task state to retry diff --git a/internal/datacoord/index_service.go b/internal/datacoord/index_service.go index 8bd70e1023..48b2dbb27f 100644 --- a/internal/datacoord/index_service.go +++ b/internal/datacoord/index_service.go @@ -51,20 +51,24 @@ func (s *Server) startIndexService(ctx context.Context) { } func (s *Server) createIndexForSegment(segment *SegmentInfo, indexID UniqueID) error { - log.Info("create index for segment", zap.Int64("segmentID", segment.ID), zap.Int64("indexID", indexID)) + indexEngineVersion := Params.CommonCfg.IndexEngineVersion.GetValue() + log.Info("create index for segment", zap.Int64("segmentID", segment.ID), zap.Int64("indexID", indexID), + zap.String("index_engine_version", indexEngineVersion), + ) buildID, err := s.allocator.allocID(context.Background()) if err != nil { return err } segIndex := &model.SegmentIndex{ - SegmentID: segment.ID, - CollectionID: segment.CollectionID, - PartitionID: segment.PartitionID, - NumRows: segment.NumOfRows, - IndexID: indexID, - BuildID: buildID, - CreateTime: uint64(segment.ID), - WriteHandoff: false, + SegmentID: segment.ID, + CollectionID: segment.CollectionID, + PartitionID: segment.PartitionID, + NumRows: segment.NumOfRows, + IndexID: indexID, + BuildID: buildID, + CreateTime: uint64(segment.ID), + WriteHandoff: false, + IndexEngineVersion: indexEngineVersion, } if err = s.meta.AddSegmentIndex(segIndex); err != nil { return err @@ -732,16 +736,17 @@ func (s *Server) GetIndexInfos(ctx context.Context, req *indexpb.GetIndexInfoReq indexParams = append(indexParams, s.meta.GetTypeParams(segIdx.CollectionID, segIdx.IndexID)...) ret.SegmentInfo[segID].IndexInfos = append(ret.SegmentInfo[segID].IndexInfos, &indexpb.IndexFilePathInfo{ - SegmentID: segID, - FieldID: s.meta.GetFieldIDByIndexID(segIdx.CollectionID, segIdx.IndexID), - IndexID: segIdx.IndexID, - BuildID: segIdx.BuildID, - IndexName: s.meta.GetIndexNameByID(segIdx.CollectionID, segIdx.IndexID), - IndexParams: indexParams, - IndexFilePaths: indexFilePaths, - SerializedSize: segIdx.IndexSize, - IndexVersion: segIdx.IndexVersion, - NumRows: segIdx.NumRows, + SegmentID: segID, + FieldID: s.meta.GetFieldIDByIndexID(segIdx.CollectionID, segIdx.IndexID), + IndexID: segIdx.IndexID, + BuildID: segIdx.BuildID, + IndexName: s.meta.GetIndexNameByID(segIdx.CollectionID, segIdx.IndexID), + IndexParams: indexParams, + IndexFilePaths: indexFilePaths, + SerializedSize: segIdx.IndexSize, + IndexVersion: segIdx.IndexVersion, + NumRows: segIdx.NumRows, + IndexEngineVersion: segIdx.IndexEngineVersion, }) } } diff --git a/internal/indexnode/indexnode_service.go b/internal/indexnode/indexnode_service.go index a2d71e7e89..c2d28b8cd2 100644 --- a/internal/indexnode/indexnode_service.go +++ b/internal/indexnode/indexnode_service.go @@ -63,6 +63,7 @@ func (i *IndexNode) CreateJob(ctx context.Context, req *indexpb.CreateJobRequest zap.Any("typeParams", req.GetTypeParams()), zap.Any("indexParams", req.GetIndexParams()), zap.Int64("numRows", req.GetNumRows()), + zap.String("index_engine_version", req.GetIndexEngineVersion()), ) ctx, sp := otel.Tracer(typeutil.IndexNodeRole).Start(ctx, "IndexNode-CreateIndex", trace.WithAttributes( attribute.Int64("indexBuildID", req.GetBuildID()), diff --git a/internal/indexnode/task.go b/internal/indexnode/task.go index 8ab483c932..343cc100b1 100644 --- a/internal/indexnode/task.go +++ b/internal/indexnode/task.go @@ -337,6 +337,11 @@ func (it *indexBuildTask) BuildIndex(ctx context.Context) error { } } + if err := buildIndexInfo.AppendIndexEngineVersion(it.req.GetIndexEngineVersion()); err != nil { + log.Ctx(ctx).Warn("append index engine version failed", zap.Error(err)) + return err + } + it.index, err = indexcgowrapper.CreateIndex(ctx, buildIndexInfo) if err != nil { if it.index != nil && it.index.CleanLocalData() != nil { diff --git a/internal/metastore/model/segment_index.go b/internal/metastore/model/segment_index.go index fc82880a68..31b5278a88 100644 --- a/internal/metastore/model/segment_index.go +++ b/internal/metastore/model/segment_index.go @@ -22,7 +22,8 @@ type SegmentIndex struct { IndexFileKeys []string IndexSize uint64 // deprecated - WriteHandoff bool + WriteHandoff bool + IndexEngineVersion string } func UnmarshalSegmentIndexModel(segIndex *indexpb.SegmentIndex) *SegmentIndex { @@ -31,21 +32,22 @@ func UnmarshalSegmentIndexModel(segIndex *indexpb.SegmentIndex) *SegmentIndex { } return &SegmentIndex{ - SegmentID: segIndex.SegmentID, - CollectionID: segIndex.CollectionID, - PartitionID: segIndex.PartitionID, - NumRows: segIndex.NumRows, - IndexID: segIndex.IndexID, - BuildID: segIndex.BuildID, - NodeID: segIndex.NodeID, - IndexState: segIndex.State, - FailReason: segIndex.FailReason, - IndexVersion: segIndex.IndexVersion, - IsDeleted: segIndex.Deleted, - CreateTime: segIndex.CreateTime, - IndexFileKeys: common.CloneStringList(segIndex.IndexFileKeys), - IndexSize: segIndex.SerializeSize, - WriteHandoff: segIndex.WriteHandoff, + SegmentID: segIndex.SegmentID, + CollectionID: segIndex.CollectionID, + PartitionID: segIndex.PartitionID, + NumRows: segIndex.NumRows, + IndexID: segIndex.IndexID, + BuildID: segIndex.BuildID, + NodeID: segIndex.NodeID, + IndexState: segIndex.State, + FailReason: segIndex.FailReason, + IndexVersion: segIndex.IndexVersion, + IsDeleted: segIndex.Deleted, + CreateTime: segIndex.CreateTime, + IndexFileKeys: common.CloneStringList(segIndex.IndexFileKeys), + IndexSize: segIndex.SerializeSize, + WriteHandoff: segIndex.WriteHandoff, + IndexEngineVersion: segIndex.GetIndexEngineVersion(), } } @@ -55,40 +57,42 @@ func MarshalSegmentIndexModel(segIdx *SegmentIndex) *indexpb.SegmentIndex { } return &indexpb.SegmentIndex{ - CollectionID: segIdx.CollectionID, - PartitionID: segIdx.PartitionID, - SegmentID: segIdx.SegmentID, - NumRows: segIdx.NumRows, - IndexID: segIdx.IndexID, - BuildID: segIdx.BuildID, - NodeID: segIdx.NodeID, - State: segIdx.IndexState, - FailReason: segIdx.FailReason, - IndexVersion: segIdx.IndexVersion, - IndexFileKeys: common.CloneStringList(segIdx.IndexFileKeys), - Deleted: segIdx.IsDeleted, - CreateTime: segIdx.CreateTime, - SerializeSize: segIdx.IndexSize, - WriteHandoff: segIdx.WriteHandoff, + CollectionID: segIdx.CollectionID, + PartitionID: segIdx.PartitionID, + SegmentID: segIdx.SegmentID, + NumRows: segIdx.NumRows, + IndexID: segIdx.IndexID, + BuildID: segIdx.BuildID, + NodeID: segIdx.NodeID, + State: segIdx.IndexState, + FailReason: segIdx.FailReason, + IndexVersion: segIdx.IndexVersion, + IndexFileKeys: common.CloneStringList(segIdx.IndexFileKeys), + Deleted: segIdx.IsDeleted, + CreateTime: segIdx.CreateTime, + SerializeSize: segIdx.IndexSize, + WriteHandoff: segIdx.WriteHandoff, + IndexEngineVersion: segIdx.IndexEngineVersion, } } func CloneSegmentIndex(segIndex *SegmentIndex) *SegmentIndex { return &SegmentIndex{ - SegmentID: segIndex.SegmentID, - CollectionID: segIndex.CollectionID, - PartitionID: segIndex.PartitionID, - NumRows: segIndex.NumRows, - IndexID: segIndex.IndexID, - BuildID: segIndex.BuildID, - NodeID: segIndex.NodeID, - IndexState: segIndex.IndexState, - FailReason: segIndex.FailReason, - IndexVersion: segIndex.IndexVersion, - IsDeleted: segIndex.IsDeleted, - CreateTime: segIndex.CreateTime, - IndexFileKeys: common.CloneStringList(segIndex.IndexFileKeys), - IndexSize: segIndex.IndexSize, - WriteHandoff: segIndex.WriteHandoff, + SegmentID: segIndex.SegmentID, + CollectionID: segIndex.CollectionID, + PartitionID: segIndex.PartitionID, + NumRows: segIndex.NumRows, + IndexID: segIndex.IndexID, + BuildID: segIndex.BuildID, + NodeID: segIndex.NodeID, + IndexState: segIndex.IndexState, + FailReason: segIndex.FailReason, + IndexVersion: segIndex.IndexVersion, + IsDeleted: segIndex.IsDeleted, + CreateTime: segIndex.CreateTime, + IndexFileKeys: common.CloneStringList(segIndex.IndexFileKeys), + IndexSize: segIndex.IndexSize, + WriteHandoff: segIndex.WriteHandoff, + IndexEngineVersion: segIndex.IndexEngineVersion, } } diff --git a/internal/proto/index_coord.proto b/internal/proto/index_coord.proto index b9616ebaff..31ecbacf19 100644 --- a/internal/proto/index_coord.proto +++ b/internal/proto/index_coord.proto @@ -83,6 +83,7 @@ message SegmentIndex { uint64 create_time = 13; uint64 serialize_size = 14; bool write_handoff = 15; + string index_engine_version = 16; } message RegisterNodeRequest { @@ -152,6 +153,7 @@ message IndexFilePathInfo { uint64 serialized_size = 8; int64 index_version = 9; int64 num_rows = 10; + string index_engine_version = 11; } message SegmentInfo { @@ -223,6 +225,7 @@ message CreateJobRequest { repeated common.KeyValuePair index_params = 9; repeated common.KeyValuePair type_params = 10; int64 num_rows = 11; + string index_engine_version = 12; } message QueryJobsRequest { diff --git a/internal/proto/indexpb/index_coord.pb.go b/internal/proto/indexpb/index_coord.pb.go index a44ff35adf..79b2570fcf 100644 --- a/internal/proto/indexpb/index_coord.pb.go +++ b/internal/proto/indexpb/index_coord.pb.go @@ -236,6 +236,7 @@ type SegmentIndex struct { CreateTime uint64 `protobuf:"varint,13,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"` SerializeSize uint64 `protobuf:"varint,14,opt,name=serialize_size,json=serializeSize,proto3" json:"serialize_size,omitempty"` WriteHandoff bool `protobuf:"varint,15,opt,name=write_handoff,json=writeHandoff,proto3" json:"write_handoff,omitempty"` + IndexEngineVersion string `protobuf:"bytes,16,opt,name=index_engine_version,json=indexEngineVersion,proto3" json:"index_engine_version,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -371,6 +372,13 @@ func (m *SegmentIndex) GetWriteHandoff() bool { return false } +func (m *SegmentIndex) GetIndexEngineVersion() string { + if m != nil { + return m.IndexEngineVersion + } + return "" +} + type RegisterNodeRequest struct { Base *commonpb.MsgBase `protobuf:"bytes,1,opt,name=base,proto3" json:"base,omitempty"` Address *commonpb.Address `protobuf:"bytes,2,opt,name=address,proto3" json:"address,omitempty"` @@ -893,6 +901,7 @@ type IndexFilePathInfo struct { SerializedSize uint64 `protobuf:"varint,8,opt,name=serialized_size,json=serializedSize,proto3" json:"serialized_size,omitempty"` IndexVersion int64 `protobuf:"varint,9,opt,name=index_version,json=indexVersion,proto3" json:"index_version,omitempty"` NumRows int64 `protobuf:"varint,10,opt,name=num_rows,json=numRows,proto3" json:"num_rows,omitempty"` + IndexEngineVersion string `protobuf:"bytes,11,opt,name=index_engine_version,json=indexEngineVersion,proto3" json:"index_engine_version,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -993,6 +1002,13 @@ func (m *IndexFilePathInfo) GetNumRows() int64 { return 0 } +func (m *IndexFilePathInfo) GetIndexEngineVersion() string { + if m != nil { + return m.IndexEngineVersion + } + return "" +} + type SegmentInfo struct { CollectionID int64 `protobuf:"varint,1,opt,name=collectionID,proto3" json:"collectionID,omitempty"` SegmentID int64 `protobuf:"varint,2,opt,name=segmentID,proto3" json:"segmentID,omitempty"` @@ -1517,6 +1533,7 @@ type CreateJobRequest struct { IndexParams []*commonpb.KeyValuePair `protobuf:"bytes,9,rep,name=index_params,json=indexParams,proto3" json:"index_params,omitempty"` TypeParams []*commonpb.KeyValuePair `protobuf:"bytes,10,rep,name=type_params,json=typeParams,proto3" json:"type_params,omitempty"` NumRows int64 `protobuf:"varint,11,opt,name=num_rows,json=numRows,proto3" json:"num_rows,omitempty"` + IndexEngineVersion string `protobuf:"bytes,12,opt,name=index_engine_version,json=indexEngineVersion,proto3" json:"index_engine_version,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -1624,6 +1641,13 @@ func (m *CreateJobRequest) GetNumRows() int64 { return 0 } +func (m *CreateJobRequest) GetIndexEngineVersion() string { + if m != nil { + return m.IndexEngineVersion + } + return "" +} + type QueryJobsRequest struct { ClusterID string `protobuf:"bytes,1,opt,name=clusterID,proto3" json:"clusterID,omitempty"` BuildIDs []int64 `protobuf:"varint,2,rep,packed,name=buildIDs,proto3" json:"buildIDs,omitempty"` @@ -2173,152 +2197,154 @@ func init() { func init() { proto.RegisterFile("index_coord.proto", fileDescriptor_f9e019eb3fda53c2) } var fileDescriptor_f9e019eb3fda53c2 = []byte{ - // 2319 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x59, 0xcf, 0x6f, 0x1c, 0x49, - 0xf5, 0x4f, 0xbb, 0xc7, 0xf6, 0xf4, 0xeb, 0x19, 0xff, 0xa8, 0x78, 0xbf, 0xdf, 0xc9, 0x24, 0x21, - 0x4e, 0x67, 0x93, 0x18, 0x44, 0x9c, 0xe0, 0x65, 0xd1, 0x82, 0x00, 0xc9, 0xb1, 0x37, 0xc9, 0x24, - 0x9b, 0xc8, 0xb4, 0xa3, 0x48, 0xac, 0x10, 0x4d, 0xcf, 0x74, 0x8d, 0x5d, 0xeb, 0x9e, 0xae, 0x49, - 0x57, 0x75, 0x12, 0x07, 0x09, 0xc1, 0x61, 0x0f, 0xa0, 0x95, 0x10, 0x68, 0x25, 0xfe, 0x01, 0x4e, - 0xfb, 0x27, 0x70, 0xe1, 0xc2, 0x91, 0x13, 0x77, 0x2e, 0xfc, 0x13, 0x5c, 0x51, 0xfd, 0xe8, 0x9e, - 0xee, 0x9e, 0x1e, 0xcf, 0xc4, 0x36, 0x42, 0x82, 0xdb, 0xd4, 0xab, 0x57, 0x3f, 0xfa, 0xbd, 0xcf, - 0x7b, 0xef, 0xf3, 0x6a, 0x60, 0x95, 0x44, 0x01, 0x7e, 0xe3, 0xf5, 0x28, 0x8d, 0x83, 0xcd, 0x61, - 0x4c, 0x39, 0x45, 0x68, 0x40, 0xc2, 0x57, 0x09, 0x53, 0xa3, 0x4d, 0x39, 0xdf, 0x6e, 0xf4, 0xe8, - 0x60, 0x40, 0x23, 0x25, 0x6b, 0x2f, 0x91, 0x88, 0xe3, 0x38, 0xf2, 0x43, 0x3d, 0x6e, 0xe4, 0x57, - 0x38, 0x7f, 0xaf, 0x81, 0xd5, 0x11, 0xab, 0x3a, 0x51, 0x9f, 0x22, 0x07, 0x1a, 0x3d, 0x1a, 0x86, - 0xb8, 0xc7, 0x09, 0x8d, 0x3a, 0xbb, 0x2d, 0x63, 0xdd, 0xd8, 0x30, 0xdd, 0x82, 0x0c, 0xb5, 0x60, - 0xb1, 0x4f, 0x70, 0x18, 0x74, 0x76, 0x5b, 0x73, 0x72, 0x3a, 0x1d, 0xa2, 0xab, 0x00, 0xea, 0x82, - 0x91, 0x3f, 0xc0, 0x2d, 0x73, 0xdd, 0xd8, 0xb0, 0x5c, 0x4b, 0x4a, 0x9e, 0xf9, 0x03, 0x2c, 0x16, - 0xca, 0x41, 0x67, 0xb7, 0x55, 0x53, 0x0b, 0xf5, 0x10, 0xdd, 0x07, 0x9b, 0x1f, 0x0f, 0xb1, 0x37, - 0xf4, 0x63, 0x7f, 0xc0, 0x5a, 0xf3, 0xeb, 0xe6, 0x86, 0xbd, 0x75, 0x7d, 0xb3, 0xf0, 0x69, 0xfa, - 0x9b, 0x9e, 0xe0, 0xe3, 0x17, 0x7e, 0x98, 0xe0, 0x3d, 0x9f, 0xc4, 0x2e, 0x88, 0x55, 0x7b, 0x72, - 0x11, 0xda, 0x85, 0x86, 0x3a, 0x5c, 0x6f, 0xb2, 0x30, 0xeb, 0x26, 0xb6, 0x5c, 0xa6, 0x77, 0xb9, - 0xae, 0x77, 0xc1, 0x81, 0x17, 0xd3, 0xd7, 0xac, 0xb5, 0x28, 0x2f, 0x6a, 0x6b, 0x99, 0x4b, 0x5f, - 0x33, 0xf1, 0x95, 0x9c, 0x72, 0x3f, 0x54, 0x0a, 0x75, 0xa9, 0x60, 0x49, 0x89, 0x9c, 0xfe, 0x10, - 0xe6, 0x19, 0xf7, 0x39, 0x6e, 0x59, 0xeb, 0xc6, 0xc6, 0xd2, 0xd6, 0xb5, 0xca, 0x0b, 0x48, 0x8b, - 0xef, 0x0b, 0x35, 0x57, 0x69, 0xa3, 0x0f, 0xe1, 0xff, 0xd5, 0xf5, 0xe5, 0xd0, 0xeb, 0xfb, 0x24, - 0xf4, 0x62, 0xec, 0x33, 0x1a, 0xb5, 0x40, 0x1a, 0x72, 0x8d, 0x64, 0x6b, 0x1e, 0xf8, 0x24, 0x74, - 0xe5, 0x1c, 0x72, 0xa0, 0x49, 0x98, 0xe7, 0x27, 0x9c, 0x7a, 0x72, 0xbe, 0x65, 0xaf, 0x1b, 0x1b, - 0x75, 0xd7, 0x26, 0x6c, 0x3b, 0xe1, 0x54, 0x1e, 0x83, 0x9e, 0xc2, 0x6a, 0xc2, 0x70, 0xec, 0x15, - 0xcc, 0xd3, 0x98, 0xd5, 0x3c, 0xcb, 0x62, 0x6d, 0x27, 0x67, 0xa2, 0x6f, 0x02, 0x1a, 0xe2, 0x28, - 0x20, 0xd1, 0x81, 0xde, 0x51, 0xda, 0xa1, 0x29, 0xed, 0xb0, 0xa2, 0x67, 0xa4, 0xbe, 0x30, 0x87, - 0xf3, 0xb9, 0x01, 0xf0, 0x40, 0xe2, 0x43, 0xde, 0xe5, 0xfb, 0x29, 0x44, 0x48, 0xd4, 0xa7, 0x12, - 0x5e, 0xf6, 0xd6, 0xd5, 0xcd, 0x71, 0x0c, 0x6f, 0x66, 0x98, 0xd4, 0x08, 0x92, 0xf0, 0x6c, 0xc1, - 0x62, 0x80, 0x43, 0xcc, 0x71, 0x20, 0xa1, 0x57, 0x77, 0xd3, 0x21, 0xba, 0x06, 0x76, 0x2f, 0xc6, - 0xc2, 0x72, 0x9c, 0x68, 0xec, 0xd5, 0x5c, 0x50, 0xa2, 0xe7, 0x64, 0x80, 0x9d, 0xcf, 0x6b, 0xd0, - 0xd8, 0xc7, 0x07, 0x03, 0x1c, 0x71, 0x75, 0x93, 0x59, 0xa0, 0xbe, 0x0e, 0xf6, 0xd0, 0x8f, 0x39, - 0xd1, 0x2a, 0x0a, 0xee, 0x79, 0x11, 0xba, 0x02, 0x16, 0xd3, 0xbb, 0xee, 0xca, 0x53, 0x4d, 0x77, - 0x24, 0x40, 0x97, 0xa0, 0x1e, 0x25, 0x03, 0x65, 0x20, 0x0d, 0xf9, 0x28, 0x19, 0x48, 0x98, 0xe4, - 0x82, 0x61, 0xbe, 0x18, 0x0c, 0x2d, 0x58, 0xec, 0x26, 0x44, 0xc6, 0xd7, 0x82, 0x9a, 0xd1, 0x43, - 0xf4, 0x7f, 0xb0, 0x10, 0xd1, 0x00, 0x77, 0x76, 0x35, 0x2c, 0xf5, 0x08, 0xdd, 0x80, 0xa6, 0x32, - 0xea, 0x2b, 0x1c, 0x33, 0x42, 0x23, 0x0d, 0x4a, 0x85, 0xe4, 0x17, 0x4a, 0x76, 0x5a, 0x5c, 0x5e, - 0x03, 0x7b, 0x1c, 0x8b, 0xd0, 0x1f, 0x21, 0xf0, 0x16, 0x2c, 0xab, 0xc3, 0xfb, 0x24, 0xc4, 0xde, - 0x11, 0x3e, 0x66, 0x2d, 0x7b, 0xdd, 0xdc, 0xb0, 0x5c, 0x75, 0xa7, 0x07, 0x24, 0xc4, 0x4f, 0xf0, - 0x31, 0xcb, 0xfb, 0xae, 0x71, 0xa2, 0xef, 0x9a, 0x65, 0xdf, 0xa1, 0x9b, 0xb0, 0xc4, 0x70, 0x4c, - 0xfc, 0x90, 0xbc, 0xc5, 0x1e, 0x23, 0x6f, 0x71, 0x6b, 0x49, 0xea, 0x34, 0x33, 0xe9, 0x3e, 0x79, - 0x8b, 0x85, 0x19, 0x5e, 0xc7, 0x84, 0x63, 0xef, 0xd0, 0x8f, 0x02, 0xda, 0xef, 0xb7, 0x96, 0xe5, - 0x39, 0x0d, 0x29, 0x7c, 0xa4, 0x64, 0xce, 0x1f, 0x0c, 0xb8, 0xe8, 0xe2, 0x03, 0xc2, 0x38, 0x8e, - 0x9f, 0xd1, 0x00, 0xbb, 0xf8, 0x65, 0x82, 0x19, 0x47, 0xf7, 0xa0, 0xd6, 0xf5, 0x19, 0xd6, 0x90, - 0xbc, 0x52, 0x69, 0x9d, 0xa7, 0xec, 0xe0, 0xbe, 0xcf, 0xb0, 0x2b, 0x35, 0xd1, 0x77, 0x60, 0xd1, - 0x0f, 0x82, 0x18, 0x33, 0x26, 0x81, 0x31, 0x69, 0xd1, 0xb6, 0xd2, 0x71, 0x53, 0xe5, 0x9c, 0x17, - 0xcd, 0xbc, 0x17, 0x9d, 0xdf, 0x1a, 0xb0, 0x56, 0xbc, 0x19, 0x1b, 0xd2, 0x88, 0x61, 0xf4, 0x01, - 0x2c, 0x08, 0x5f, 0x24, 0x4c, 0x5f, 0xee, 0x72, 0xe5, 0x39, 0xfb, 0x52, 0xc5, 0xd5, 0xaa, 0x22, - 0xa5, 0x92, 0x88, 0xf0, 0x34, 0xdc, 0xd5, 0x0d, 0xaf, 0x97, 0x23, 0x4d, 0x17, 0x86, 0x4e, 0x44, - 0xb8, 0x8a, 0x6e, 0x17, 0x48, 0xf6, 0xdb, 0xf9, 0x31, 0xac, 0x3d, 0xc4, 0x3c, 0x87, 0x09, 0x6d, - 0xab, 0x59, 0x42, 0xa7, 0x58, 0x0b, 0xe6, 0x4a, 0xb5, 0xc0, 0xf9, 0xa3, 0x01, 0xef, 0x95, 0xf6, - 0x3e, 0xcb, 0xd7, 0x66, 0xe0, 0x9e, 0x3b, 0x0b, 0xb8, 0xcd, 0x32, 0xb8, 0x9d, 0x5f, 0x1a, 0x70, - 0xf9, 0x21, 0xe6, 0xf9, 0xc4, 0x71, 0xce, 0x96, 0x40, 0x5f, 0x03, 0xc8, 0x12, 0x06, 0x6b, 0x99, - 0xeb, 0xe6, 0x86, 0xe9, 0xe6, 0x24, 0xce, 0xaf, 0x0d, 0x58, 0x1d, 0x3b, 0xbf, 0x98, 0x77, 0x8c, - 0x72, 0xde, 0xf9, 0x77, 0x99, 0xe3, 0xf7, 0x06, 0x5c, 0xa9, 0x36, 0xc7, 0x59, 0x9c, 0xf7, 0x03, - 0xb5, 0x08, 0x0b, 0x94, 0x8a, 0xa2, 0x74, 0xb3, 0xaa, 0x1e, 0x8c, 0x9f, 0xa9, 0x17, 0x39, 0x5f, - 0x98, 0x80, 0x76, 0x64, 0xb2, 0x50, 0x55, 0xe7, 0x1d, 0x5c, 0x73, 0x6a, 0x2a, 0x53, 0x22, 0x2c, - 0xb5, 0xf3, 0x20, 0x2c, 0xf3, 0xa7, 0x22, 0x2c, 0x57, 0xc0, 0x12, 0x59, 0x93, 0x71, 0x7f, 0x30, - 0x94, 0xf5, 0xa2, 0xe6, 0x8e, 0x04, 0xe3, 0xf4, 0x60, 0x71, 0x46, 0x7a, 0x50, 0x3f, 0x2d, 0x3d, - 0x70, 0xde, 0xc0, 0xc5, 0x34, 0xb0, 0x65, 0xf9, 0x7e, 0x07, 0x77, 0x14, 0x43, 0x61, 0xae, 0x1c, - 0x0a, 0x53, 0x9c, 0xe2, 0xfc, 0x73, 0x0e, 0x56, 0x3b, 0x69, 0xcd, 0xd9, 0xf3, 0xf9, 0xa1, 0xe4, - 0x0c, 0x27, 0x47, 0xca, 0x64, 0x04, 0xe4, 0x0a, 0xb4, 0x39, 0xb1, 0x40, 0xd7, 0x8a, 0x05, 0xba, - 0x78, 0xc1, 0xf9, 0x32, 0x6a, 0xce, 0x87, 0xa2, 0x6e, 0xc0, 0x4a, 0xae, 0xe0, 0x0e, 0x7d, 0x7e, - 0x28, 0x68, 0xaa, 0xa8, 0xb8, 0x4b, 0x24, 0xff, 0xf5, 0x0c, 0xdd, 0x86, 0xe5, 0xac, 0x42, 0x06, - 0xaa, 0x70, 0xd6, 0x25, 0x42, 0x46, 0xe5, 0x34, 0x48, 0x2b, 0x67, 0x91, 0x40, 0x58, 0x15, 0x04, - 0x22, 0x4f, 0x66, 0xa0, 0x40, 0x66, 0x9c, 0x3f, 0x19, 0x60, 0x67, 0x01, 0x3a, 0x63, 0x1b, 0x51, - 0xf0, 0xcb, 0x5c, 0xd9, 0x2f, 0xd7, 0xa1, 0x81, 0x23, 0xbf, 0x1b, 0x62, 0x8d, 0x5b, 0x53, 0xe1, - 0x56, 0xc9, 0x14, 0x6e, 0x1f, 0x80, 0x3d, 0xa2, 0x92, 0x69, 0x0c, 0xde, 0x9c, 0xc8, 0x25, 0xf3, - 0xa0, 0x70, 0x21, 0xe3, 0x94, 0xcc, 0xf9, 0xcd, 0xdc, 0xa8, 0xcc, 0x29, 0xc4, 0x9e, 0x25, 0x99, - 0xfd, 0x04, 0x1a, 0xfa, 0x2b, 0x14, 0xc5, 0x55, 0x29, 0xed, 0xbb, 0x55, 0xd7, 0xaa, 0x3a, 0x74, - 0x33, 0x67, 0xc6, 0x8f, 0x23, 0x1e, 0x1f, 0xbb, 0x36, 0x1b, 0x49, 0xda, 0x1e, 0xac, 0x94, 0x15, - 0xd0, 0x0a, 0x98, 0x47, 0xf8, 0x58, 0xdb, 0x58, 0xfc, 0x14, 0xe9, 0xff, 0x95, 0xc0, 0x8e, 0xae, - 0xfa, 0xd7, 0x4e, 0xcc, 0xa7, 0x7d, 0xea, 0x2a, 0xed, 0xef, 0xcd, 0x7d, 0x64, 0x38, 0x5f, 0x1a, - 0xb0, 0xb2, 0x1b, 0xd3, 0xe1, 0x3b, 0xa7, 0x52, 0x07, 0x1a, 0x39, 0x5e, 0x9c, 0x46, 0x6f, 0x41, - 0x36, 0x2d, 0xa9, 0x5e, 0x82, 0x7a, 0x10, 0xd3, 0xa1, 0xe7, 0x87, 0xa1, 0x0c, 0x2c, 0x41, 0x11, - 0x63, 0x3a, 0xdc, 0x0e, 0x43, 0xe7, 0x35, 0xac, 0xed, 0x62, 0xd6, 0x8b, 0x49, 0xf7, 0xdd, 0x93, - 0xfc, 0x94, 0xfa, 0x5b, 0x48, 0xa0, 0x66, 0x29, 0x81, 0x3a, 0x5f, 0x18, 0xf0, 0x5e, 0xe9, 0xe4, - 0xb3, 0xa0, 0xe3, 0x87, 0x45, 0xcc, 0x2a, 0x70, 0x4c, 0xe9, 0x7f, 0xf2, 0x58, 0xf5, 0x65, 0xfd, - 0x95, 0x73, 0xf7, 0x45, 0xce, 0xd9, 0x8b, 0xe9, 0x81, 0x64, 0x97, 0xe7, 0xc7, 0xcc, 0xfe, 0x62, - 0xc0, 0xd5, 0x09, 0x67, 0x9c, 0xe5, 0xcb, 0xcb, 0x8d, 0xf5, 0xdc, 0xb4, 0xc6, 0xda, 0x2c, 0x37, - 0xd6, 0xd5, 0x7d, 0x67, 0x6d, 0x42, 0xdf, 0xf9, 0xa5, 0x09, 0xcd, 0x7d, 0x4e, 0x63, 0xff, 0x00, - 0xef, 0xd0, 0xa8, 0x4f, 0x0e, 0x44, 0xda, 0x4e, 0xf9, 0xba, 0x21, 0x3f, 0x3a, 0x63, 0xe4, 0xd7, - 0xa1, 0xe1, 0xf7, 0x7a, 0x98, 0x31, 0xd1, 0xbe, 0xe8, 0x6c, 0x64, 0xb9, 0xb6, 0x92, 0x3d, 0x11, - 0x22, 0xf4, 0x0d, 0x58, 0x65, 0xb8, 0x17, 0x63, 0xee, 0x8d, 0x34, 0x35, 0x82, 0x97, 0xd5, 0xc4, - 0x76, 0xaa, 0x2d, 0x08, 0x7e, 0xc2, 0xf0, 0xfe, 0xfe, 0x27, 0x1a, 0xc5, 0x7a, 0x24, 0xe8, 0x55, - 0x37, 0xe9, 0x1d, 0x61, 0x9e, 0x2f, 0x0f, 0xa0, 0x44, 0x12, 0x8a, 0x97, 0xc1, 0x8a, 0x29, 0xe5, - 0x32, 0xa7, 0xcb, 0x5a, 0x6e, 0xb9, 0x75, 0x21, 0x10, 0x69, 0x4b, 0xef, 0xda, 0xd9, 0x7e, 0xaa, - 0x6b, 0xb8, 0x1e, 0x89, 0x1e, 0xb5, 0xb3, 0xfd, 0xf4, 0xe3, 0x28, 0x18, 0x52, 0x12, 0x71, 0x99, - 0xe0, 0x2d, 0x37, 0x2f, 0x12, 0x9f, 0xc7, 0x94, 0x25, 0x3c, 0x41, 0x3f, 0x64, 0x72, 0xb7, 0x5c, - 0x5b, 0xcb, 0x9e, 0x1f, 0x0f, 0xb1, 0xa8, 0x29, 0x09, 0xc3, 0xde, 0x2b, 0x12, 0xf3, 0xc4, 0x0f, - 0xbd, 0x43, 0xca, 0xb8, 0xcc, 0xf1, 0x75, 0x77, 0x29, 0x61, 0xf8, 0x85, 0x12, 0x3f, 0xa2, 0x8c, - 0x8b, 0x6b, 0xc4, 0xf8, 0x40, 0xd4, 0x08, 0x5b, 0x6e, 0xa3, 0x47, 0xa2, 0x47, 0xeb, 0x85, 0x34, - 0x09, 0xbc, 0x61, 0x4c, 0x5f, 0x91, 0x00, 0xc7, 0xb2, 0xcb, 0xb3, 0xdc, 0xa6, 0x94, 0xee, 0x69, - 0xa1, 0xf3, 0x0f, 0x13, 0x56, 0x14, 0x59, 0x7b, 0x4c, 0xbb, 0x29, 0x6a, 0xaf, 0x80, 0xd5, 0x0b, - 0x13, 0xd1, 0xf7, 0x68, 0xc8, 0x5a, 0xee, 0x48, 0x20, 0x4c, 0x9f, 0xaf, 0x77, 0x31, 0xee, 0x93, - 0x37, 0xda, 0x45, 0xcb, 0xa3, 0x82, 0x27, 0xc5, 0xf9, 0xd2, 0x6c, 0x8e, 0x95, 0xe6, 0xc0, 0xe7, - 0xbe, 0xae, 0x97, 0x35, 0x59, 0x2f, 0x2d, 0x21, 0x51, 0xa5, 0x72, 0xac, 0x02, 0xce, 0x57, 0x54, - 0xc0, 0x1c, 0x25, 0x58, 0x28, 0x52, 0x82, 0x62, 0x4c, 0x2d, 0x96, 0x73, 0xcc, 0x23, 0x58, 0x4a, - 0x3d, 0xd0, 0x93, 0x60, 0x94, 0x6e, 0xaa, 0xe8, 0xc7, 0x64, 0x66, 0xce, 0xa3, 0xd6, 0x6d, 0xb2, - 0x02, 0x88, 0xcb, 0x14, 0xc2, 0x3a, 0x15, 0x85, 0x28, 0xd1, 0x57, 0x38, 0x0d, 0x7d, 0xcd, 0xd3, - 0x01, 0xbb, 0x48, 0x07, 0x3e, 0x81, 0x95, 0x1f, 0x25, 0x38, 0x3e, 0x7e, 0x4c, 0xbb, 0x6c, 0x36, - 0x1f, 0xb7, 0xa1, 0xae, 0x1d, 0x95, 0x56, 0x8e, 0x6c, 0xec, 0xfc, 0xcd, 0x80, 0xa6, 0x8c, 0xeb, - 0xe7, 0x3e, 0x3b, 0x4a, 0x9f, 0x81, 0x52, 0x2f, 0x1b, 0x45, 0x2f, 0x9f, 0xb2, 0xf1, 0xa9, 0x78, - 0xc3, 0x30, 0xab, 0xde, 0x30, 0x2a, 0x08, 0x55, 0xad, 0x92, 0x50, 0x95, 0x3a, 0xa9, 0xf9, 0xb1, - 0x4e, 0xea, 0x2b, 0x03, 0x56, 0x73, 0x36, 0x3a, 0x4b, 0x66, 0x2d, 0x58, 0x76, 0xae, 0x6c, 0xd9, - 0xfb, 0xc5, 0x8a, 0x63, 0x56, 0xb9, 0x3a, 0x57, 0x71, 0x52, 0x1b, 0x17, 0xaa, 0xce, 0x13, 0x58, - 0x16, 0x9c, 0xe0, 0x7c, 0xdc, 0xf9, 0x57, 0x03, 0x16, 0x1f, 0xd3, 0xae, 0x74, 0x64, 0x1e, 0x43, - 0x46, 0xf1, 0x7d, 0x6c, 0x05, 0xcc, 0x80, 0x0c, 0x74, 0x99, 0x10, 0x3f, 0x45, 0x8c, 0x31, 0xee, - 0xc7, 0x7c, 0xf4, 0xc2, 0x27, 0x18, 0xa3, 0x90, 0xc8, 0x47, 0xa2, 0x4b, 0x50, 0xc7, 0x51, 0xa0, - 0x26, 0x35, 0x2d, 0xc7, 0x51, 0x20, 0xa7, 0xce, 0xa7, 0xd3, 0x5a, 0x83, 0xf9, 0x21, 0x1d, 0xbd, - 0xca, 0xa9, 0x81, 0xb3, 0x06, 0xe8, 0x21, 0xe6, 0x8f, 0x69, 0x57, 0x78, 0x25, 0x35, 0x8f, 0xf3, - 0xe7, 0x39, 0xd9, 0x05, 0x8d, 0xc4, 0x67, 0x71, 0xb0, 0x03, 0x4d, 0x55, 0x17, 0x3f, 0xa3, 0x5d, - 0x2f, 0x4a, 0x52, 0xa3, 0xd8, 0x52, 0xf8, 0x98, 0x76, 0x9f, 0x25, 0x03, 0x74, 0x07, 0x2e, 0x92, - 0x48, 0xe4, 0x5e, 0x59, 0xaa, 0x33, 0x4d, 0x65, 0xa5, 0x15, 0x12, 0xa5, 0x45, 0x5c, 0xab, 0xdf, - 0x82, 0x65, 0x1c, 0xbd, 0x4c, 0x70, 0x82, 0x33, 0x55, 0x65, 0xb3, 0xa6, 0x16, 0x6b, 0x3d, 0x51, - 0x92, 0x7d, 0x76, 0xe4, 0xb1, 0x90, 0x72, 0xa6, 0x73, 0xa2, 0x25, 0x24, 0xfb, 0x42, 0x80, 0x3e, - 0x02, 0x4b, 0x2c, 0x57, 0xd0, 0x52, 0xdd, 0xcc, 0xe5, 0x2a, 0x68, 0x69, 0x7f, 0xbb, 0xf5, 0xcf, - 0xd4, 0x0f, 0x26, 0x02, 0x44, 0xf3, 0xfb, 0x80, 0xb0, 0x23, 0x5d, 0xd2, 0x40, 0x89, 0x76, 0x09, - 0x3b, 0x72, 0x7e, 0x0a, 0x97, 0xf2, 0xef, 0x43, 0x84, 0x71, 0xd2, 0x3b, 0x4f, 0x9a, 0xf3, 0x3b, - 0x03, 0xda, 0x55, 0x07, 0xfc, 0x07, 0xd9, 0xdd, 0xd6, 0xaf, 0x6c, 0x00, 0x39, 0xb3, 0x43, 0x69, - 0x1c, 0xa0, 0x50, 0x42, 0x6b, 0x87, 0x0e, 0x86, 0x34, 0xc2, 0x11, 0x97, 0x19, 0x8b, 0xa1, 0xcd, - 0xe2, 0x7e, 0x7a, 0x30, 0xae, 0xa8, 0x6d, 0xd5, 0x7e, 0xbf, 0x52, 0xbf, 0xa4, 0xec, 0x5c, 0x40, - 0x2f, 0x65, 0x17, 0x34, 0x32, 0xc5, 0xce, 0xa1, 0x1f, 0x45, 0x38, 0x44, 0x5b, 0x13, 0xde, 0x0c, - 0xab, 0x94, 0xd3, 0x33, 0x6f, 0x54, 0x9e, 0xb9, 0xcf, 0x63, 0x12, 0x1d, 0xa4, 0x26, 0x76, 0x2e, - 0xa0, 0xe7, 0x60, 0xe7, 0x1e, 0x6e, 0xd0, 0xad, 0x2a, 0x4b, 0x8d, 0xbf, 0xec, 0xb4, 0x4f, 0xf2, - 0x85, 0x73, 0x01, 0xf5, 0xa1, 0x59, 0x78, 0x59, 0x44, 0x1b, 0x27, 0x35, 0x5f, 0xf9, 0xe7, 0xbc, - 0xf6, 0xd7, 0x67, 0xd0, 0xcc, 0x6e, 0xff, 0x73, 0x65, 0xb0, 0xb1, 0xa7, 0xb9, 0xbb, 0x13, 0x36, - 0x99, 0xf4, 0x88, 0xd8, 0xbe, 0x37, 0xfb, 0x82, 0xec, 0xf0, 0x60, 0xf4, 0x91, 0x2a, 0xa0, 0x6e, - 0x4f, 0xef, 0x30, 0xd5, 0x69, 0x1b, 0xb3, 0xb6, 0xa2, 0xce, 0x05, 0xb4, 0x07, 0x56, 0xd6, 0x0c, - 0xa2, 0xf7, 0xab, 0x16, 0x96, 0x7b, 0xc5, 0x19, 0x9c, 0x53, 0x68, 0xa7, 0xaa, 0x9d, 0x53, 0xd5, - 0xeb, 0x55, 0x3b, 0xa7, 0xb2, 0x37, 0x73, 0x2e, 0xa0, 0x44, 0xc6, 0x4e, 0x29, 0xba, 0xd1, 0x9d, - 0x69, 0xfe, 0x2d, 0xa4, 0x99, 0xf6, 0xe6, 0xac, 0xea, 0xd9, 0xb1, 0xbf, 0x18, 0xbd, 0x6a, 0x17, - 0x7a, 0x27, 0x74, 0xef, 0xa4, 0xad, 0xaa, 0x5a, 0xb9, 0xf6, 0xb7, 0xde, 0x61, 0x45, 0x0e, 0x93, - 0x68, 0xff, 0x90, 0xbe, 0x56, 0x64, 0x31, 0x89, 0x7d, 0x91, 0x0b, 0x2b, 0x0e, 0xd7, 0x21, 0x3c, - 0xae, 0x3a, 0xf1, 0xf0, 0x13, 0x56, 0x64, 0x87, 0x7b, 0x00, 0x0f, 0x31, 0x7f, 0x8a, 0x79, 0x2c, - 0x6c, 0x7d, 0x6b, 0x52, 0x9e, 0xd2, 0x0a, 0xe9, 0x51, 0xb7, 0xa7, 0xea, 0x65, 0x07, 0x74, 0xc1, - 0xde, 0x39, 0xc4, 0xbd, 0xa3, 0x47, 0xd8, 0x0f, 0xf9, 0x21, 0xaa, 0x5e, 0x99, 0xd3, 0x98, 0x00, - 0xf9, 0x2a, 0xc5, 0xf4, 0x8c, 0xad, 0xaf, 0x16, 0xf4, 0xff, 0xe1, 0xcf, 0x68, 0x80, 0xff, 0xfb, - 0x53, 0xf0, 0x1e, 0x58, 0x59, 0x3b, 0x56, 0x1d, 0xe1, 0xe5, 0x6e, 0x6d, 0x5a, 0x84, 0x7f, 0x0a, - 0x56, 0x46, 0x6c, 0xab, 0x77, 0x2c, 0xf7, 0x06, 0xed, 0x9b, 0x53, 0xb4, 0xb2, 0xdb, 0x3e, 0x83, - 0x7a, 0x4a, 0x44, 0xd1, 0x8d, 0x49, 0xe9, 0x28, 0xbf, 0xf3, 0x94, 0xbb, 0xfe, 0x0c, 0xec, 0x1c, - 0x4b, 0xab, 0x2e, 0x40, 0xe3, 0xec, 0xae, 0x7d, 0x7b, 0xaa, 0xde, 0xff, 0x46, 0x40, 0xde, 0xff, - 0xf6, 0xa7, 0x5b, 0x07, 0x84, 0x1f, 0x26, 0x5d, 0x61, 0xd9, 0xbb, 0x4a, 0xf3, 0x0e, 0xa1, 0xfa, - 0xd7, 0xdd, 0xf4, 0x96, 0x77, 0xe5, 0x4e, 0x77, 0xa5, 0x9d, 0x86, 0xdd, 0xee, 0x82, 0x1c, 0x7e, - 0xf0, 0xaf, 0x00, 0x00, 0x00, 0xff, 0xff, 0xda, 0xb6, 0x87, 0xda, 0xce, 0x22, 0x00, 0x00, + // 2344 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x59, 0xdd, 0x6f, 0xdc, 0x58, + 0x15, 0xaf, 0xe3, 0x49, 0x32, 0x3e, 0x9e, 0xc9, 0xc7, 0xdd, 0x2c, 0x4c, 0xa7, 0x5d, 0x9a, 0xba, + 0xdb, 0x36, 0x20, 0x9a, 0x96, 0x2c, 0x8b, 0x16, 0x04, 0x48, 0x69, 0xd2, 0x8f, 0xb4, 0xdb, 0x2a, + 0x38, 0x55, 0x25, 0x56, 0x08, 0xe3, 0x19, 0xdf, 0x99, 0xdc, 0x8d, 0xc7, 0x77, 0xea, 0x7b, 0xdd, + 0x36, 0x45, 0x42, 0xf0, 0xc0, 0x03, 0x68, 0x25, 0x04, 0xaa, 0xc4, 0x3f, 0xc0, 0x0b, 0xfb, 0x0f, + 0x20, 0xf1, 0xc2, 0x0b, 0x8f, 0x3c, 0xf1, 0xce, 0xff, 0x82, 0xee, 0x87, 0x3d, 0xb6, 0xc7, 0x93, + 0x99, 0x26, 0x41, 0x48, 0xf0, 0x36, 0xf7, 0xdc, 0x73, 0x3f, 0x7c, 0xce, 0xef, 0x9c, 0xdf, 0x39, + 0x77, 0x60, 0x95, 0x44, 0x01, 0x7e, 0xed, 0x75, 0x29, 0x8d, 0x83, 0xcd, 0x61, 0x4c, 0x39, 0x45, + 0x68, 0x40, 0xc2, 0x97, 0x09, 0x53, 0xa3, 0x4d, 0x39, 0xdf, 0x6e, 0x74, 0xe9, 0x60, 0x40, 0x23, + 0x25, 0x6b, 0x2f, 0x91, 0x88, 0xe3, 0x38, 0xf2, 0x43, 0x3d, 0x6e, 0xe4, 0x57, 0x38, 0xff, 0xaa, + 0x81, 0xb5, 0x27, 0x56, 0xed, 0x45, 0x3d, 0x8a, 0x1c, 0x68, 0x74, 0x69, 0x18, 0xe2, 0x2e, 0x27, + 0x34, 0xda, 0xdb, 0x6d, 0x19, 0xeb, 0xc6, 0x86, 0xe9, 0x16, 0x64, 0xa8, 0x05, 0x8b, 0x3d, 0x82, + 0xc3, 0x60, 0x6f, 0xb7, 0x35, 0x27, 0xa7, 0xd3, 0x21, 0xfa, 0x00, 0x40, 0x5d, 0x30, 0xf2, 0x07, + 0xb8, 0x65, 0xae, 0x1b, 0x1b, 0x96, 0x6b, 0x49, 0xc9, 0x53, 0x7f, 0x80, 0xc5, 0x42, 0x39, 0xd8, + 0xdb, 0x6d, 0xd5, 0xd4, 0x42, 0x3d, 0x44, 0x77, 0xc1, 0xe6, 0xc7, 0x43, 0xec, 0x0d, 0xfd, 0xd8, + 0x1f, 0xb0, 0xd6, 0xfc, 0xba, 0xb9, 0x61, 0x6f, 0x5d, 0xdd, 0x2c, 0x7c, 0x9a, 0xfe, 0xa6, 0xc7, + 0xf8, 0xf8, 0xb9, 0x1f, 0x26, 0x78, 0xdf, 0x27, 0xb1, 0x0b, 0x62, 0xd5, 0xbe, 0x5c, 0x84, 0x76, + 0xa1, 0xa1, 0x0e, 0xd7, 0x9b, 0x2c, 0xcc, 0xba, 0x89, 0x2d, 0x97, 0xe9, 0x5d, 0xae, 0xea, 0x5d, + 0x70, 0xe0, 0xc5, 0xf4, 0x15, 0x6b, 0x2d, 0xca, 0x8b, 0xda, 0x5a, 0xe6, 0xd2, 0x57, 0x4c, 0x7c, + 0x25, 0xa7, 0xdc, 0x0f, 0x95, 0x42, 0x5d, 0x2a, 0x58, 0x52, 0x22, 0xa7, 0x3f, 0x86, 0x79, 0xc6, + 0x7d, 0x8e, 0x5b, 0xd6, 0xba, 0xb1, 0xb1, 0xb4, 0x75, 0xa5, 0xf2, 0x02, 0xd2, 0xe2, 0x07, 0x42, + 0xcd, 0x55, 0xda, 0xe8, 0x63, 0xf8, 0xaa, 0xba, 0xbe, 0x1c, 0x7a, 0x3d, 0x9f, 0x84, 0x5e, 0x8c, + 0x7d, 0x46, 0xa3, 0x16, 0x48, 0x43, 0xae, 0x91, 0x6c, 0xcd, 0x7d, 0x9f, 0x84, 0xae, 0x9c, 0x43, + 0x0e, 0x34, 0x09, 0xf3, 0xfc, 0x84, 0x53, 0x4f, 0xce, 0xb7, 0xec, 0x75, 0x63, 0xa3, 0xee, 0xda, + 0x84, 0x6d, 0x27, 0x9c, 0xca, 0x63, 0xd0, 0x13, 0x58, 0x4d, 0x18, 0x8e, 0xbd, 0x82, 0x79, 0x1a, + 0xb3, 0x9a, 0x67, 0x59, 0xac, 0xdd, 0xcb, 0x99, 0xe8, 0x9b, 0x80, 0x86, 0x38, 0x0a, 0x48, 0xd4, + 0xd7, 0x3b, 0x4a, 0x3b, 0x34, 0xa5, 0x1d, 0x56, 0xf4, 0x8c, 0xd4, 0x17, 0xe6, 0x70, 0x7e, 0x6d, + 0x00, 0xdc, 0x97, 0xf8, 0x90, 0x77, 0xf9, 0x7e, 0x0a, 0x11, 0x12, 0xf5, 0xa8, 0x84, 0x97, 0xbd, + 0xf5, 0xc1, 0xe6, 0x38, 0x86, 0x37, 0x33, 0x4c, 0x6a, 0x04, 0x49, 0x78, 0xb6, 0x60, 0x31, 0xc0, + 0x21, 0xe6, 0x38, 0x90, 0xd0, 0xab, 0xbb, 0xe9, 0x10, 0x5d, 0x01, 0xbb, 0x1b, 0x63, 0x61, 0x39, + 0x4e, 0x34, 0xf6, 0x6a, 0x2e, 0x28, 0xd1, 0x33, 0x32, 0xc0, 0xce, 0x5f, 0x6a, 0xd0, 0x38, 0xc0, + 0xfd, 0x01, 0x8e, 0xb8, 0xba, 0xc9, 0x2c, 0x50, 0x5f, 0x07, 0x7b, 0xe8, 0xc7, 0x9c, 0x68, 0x15, + 0x05, 0xf7, 0xbc, 0x08, 0x5d, 0x06, 0x8b, 0xe9, 0x5d, 0x77, 0xe5, 0xa9, 0xa6, 0x3b, 0x12, 0xa0, + 0x8b, 0x50, 0x8f, 0x92, 0x81, 0x32, 0x90, 0x86, 0x7c, 0x94, 0x0c, 0x24, 0x4c, 0x72, 0xc1, 0x30, + 0x5f, 0x0c, 0x86, 0x16, 0x2c, 0x76, 0x12, 0x22, 0xe3, 0x6b, 0x41, 0xcd, 0xe8, 0x21, 0xfa, 0x0a, + 0x2c, 0x44, 0x34, 0xc0, 0x7b, 0xbb, 0x1a, 0x96, 0x7a, 0x84, 0xae, 0x41, 0x53, 0x19, 0xf5, 0x25, + 0x8e, 0x19, 0xa1, 0x91, 0x06, 0xa5, 0x42, 0xf2, 0x73, 0x25, 0x3b, 0x2d, 0x2e, 0xaf, 0x80, 0x3d, + 0x8e, 0x45, 0xe8, 0x8d, 0x10, 0x78, 0x03, 0x96, 0xd5, 0xe1, 0x3d, 0x12, 0x62, 0xef, 0x08, 0x1f, + 0xb3, 0x96, 0xbd, 0x6e, 0x6e, 0x58, 0xae, 0xba, 0xd3, 0x7d, 0x12, 0xe2, 0xc7, 0xf8, 0x98, 0xe5, + 0x7d, 0xd7, 0x38, 0xd1, 0x77, 0xcd, 0xb2, 0xef, 0xd0, 0x75, 0x58, 0x62, 0x38, 0x26, 0x7e, 0x48, + 0xde, 0x60, 0x8f, 0x91, 0x37, 0xb8, 0xb5, 0x24, 0x75, 0x9a, 0x99, 0xf4, 0x80, 0xbc, 0xc1, 0xc2, + 0x0c, 0xaf, 0x62, 0xc2, 0xb1, 0x77, 0xe8, 0x47, 0x01, 0xed, 0xf5, 0x5a, 0xcb, 0xf2, 0x9c, 0x86, + 0x14, 0x3e, 0x54, 0x32, 0x74, 0x07, 0x54, 0x20, 0x79, 0x38, 0xea, 0x93, 0x08, 0x67, 0x26, 0x5b, + 0x91, 0x1f, 0x86, 0xe4, 0xdc, 0x3d, 0x39, 0xa5, 0x0d, 0xe7, 0xfc, 0xd1, 0x80, 0xf7, 0x5c, 0xdc, + 0x27, 0x8c, 0xe3, 0xf8, 0x29, 0x0d, 0xb0, 0x8b, 0x5f, 0x24, 0x98, 0x71, 0x74, 0x07, 0x6a, 0x1d, + 0x9f, 0x61, 0x0d, 0xe2, 0xcb, 0x95, 0xf6, 0x7c, 0xc2, 0xfa, 0x77, 0x7d, 0x86, 0x5d, 0xa9, 0x89, + 0xbe, 0x03, 0x8b, 0x7e, 0x10, 0xc4, 0x98, 0x31, 0x09, 0xa5, 0x49, 0x8b, 0xb6, 0x95, 0x8e, 0x9b, + 0x2a, 0xe7, 0xfc, 0x6e, 0xe6, 0xfd, 0xee, 0xfc, 0xce, 0x80, 0xb5, 0xe2, 0xcd, 0xd8, 0x90, 0x46, + 0x0c, 0xa3, 0x8f, 0x60, 0x41, 0x78, 0x2f, 0x61, 0xfa, 0x72, 0x97, 0x2a, 0xcf, 0x39, 0x90, 0x2a, + 0xae, 0x56, 0x15, 0x49, 0x98, 0x44, 0x84, 0xa7, 0x09, 0x42, 0xdd, 0xf0, 0x6a, 0x39, 0x36, 0x35, + 0x95, 0xec, 0x45, 0x84, 0xab, 0x7c, 0xe0, 0x02, 0xc9, 0x7e, 0x3b, 0x3f, 0x86, 0xb5, 0x07, 0x98, + 0xe7, 0x50, 0xa4, 0x6d, 0x35, 0x4b, 0xb0, 0x15, 0xd9, 0x63, 0xae, 0xc4, 0x1e, 0xce, 0x9f, 0x0c, + 0x78, 0xbf, 0xb4, 0xf7, 0x59, 0xbe, 0x36, 0x0b, 0x87, 0xb9, 0xb3, 0x84, 0x83, 0x59, 0x0e, 0x07, + 0xe7, 0x97, 0x06, 0x5c, 0x7a, 0x80, 0x79, 0x3e, 0xd5, 0x9c, 0xb3, 0x25, 0xd0, 0xd7, 0x00, 0xb2, + 0x14, 0xc3, 0x5a, 0xe6, 0xba, 0xb9, 0x61, 0xba, 0x39, 0x89, 0xf3, 0x1b, 0x03, 0x56, 0xc7, 0xce, + 0x2f, 0x66, 0x2a, 0xa3, 0x9c, 0xa9, 0xfe, 0x53, 0xe6, 0xf8, 0x83, 0x01, 0x97, 0xab, 0xcd, 0x71, + 0x16, 0xe7, 0xfd, 0x40, 0x2d, 0xc2, 0x02, 0xa5, 0x82, 0xc6, 0xae, 0x57, 0x31, 0xc8, 0xf8, 0x99, + 0x7a, 0x91, 0xf3, 0x85, 0x09, 0x68, 0x47, 0xa6, 0x17, 0xc5, 0x53, 0xef, 0xe0, 0x9a, 0x53, 0x17, + 0x3f, 0xa5, 0x12, 0xa7, 0x76, 0x1e, 0x25, 0xce, 0xfc, 0xa9, 0x4a, 0x9c, 0xcb, 0x60, 0x89, 0x3c, + 0xcb, 0xb8, 0x3f, 0x18, 0x4a, 0x86, 0xa9, 0xb9, 0x23, 0xc1, 0x78, 0x41, 0xb1, 0x38, 0x63, 0x41, + 0x51, 0x3f, 0x6d, 0x41, 0xe1, 0xbc, 0x86, 0xf7, 0xd2, 0xc0, 0x96, 0x84, 0xff, 0x0e, 0xee, 0x28, + 0x86, 0xc2, 0x5c, 0x39, 0x14, 0xa6, 0x38, 0xc5, 0xf9, 0xb3, 0x09, 0xab, 0x7b, 0x29, 0x4b, 0xed, + 0xfb, 0xfc, 0x50, 0x56, 0x19, 0x27, 0x47, 0xca, 0x64, 0x04, 0xe4, 0x28, 0xdd, 0x9c, 0x48, 0xe9, + 0xb5, 0x22, 0xa5, 0x17, 0x2f, 0x38, 0x5f, 0x46, 0xcd, 0xf9, 0x14, 0xb5, 0x1b, 0xb0, 0x92, 0xa3, + 0xe8, 0xa1, 0xcf, 0x0f, 0x45, 0x61, 0x2b, 0x38, 0x7a, 0x89, 0xe4, 0xbf, 0x9e, 0xa1, 0x9b, 0xb0, + 0x9c, 0x71, 0x6a, 0xa0, 0xa8, 0xb6, 0x2e, 0x11, 0x32, 0x22, 0xe0, 0x20, 0xe5, 0xda, 0x62, 0xc9, + 0x61, 0x55, 0x94, 0x1c, 0xf9, 0xf2, 0x07, 0x8a, 0xe5, 0xcf, 0x24, 0x1a, 0xb6, 0x27, 0xd2, 0xf0, + 0x5f, 0x0d, 0xb0, 0xb3, 0x90, 0x9e, 0xb1, 0x55, 0x29, 0x78, 0x72, 0xae, 0xec, 0xc9, 0xab, 0xd0, + 0xc0, 0x91, 0xdf, 0x09, 0xb1, 0x46, 0xba, 0xa9, 0x90, 0xae, 0x64, 0x0a, 0xe9, 0xf7, 0xc1, 0x1e, + 0x95, 0xab, 0x69, 0xd4, 0x5e, 0x9f, 0x58, 0xaf, 0xe6, 0x61, 0xe4, 0x42, 0x56, 0xb7, 0x32, 0xe7, + 0xb7, 0x73, 0x23, 0x62, 0x54, 0x18, 0x3f, 0x4b, 0xfa, 0xfb, 0x09, 0x34, 0xf4, 0x57, 0xa8, 0x32, + 0x5a, 0x25, 0xc1, 0xef, 0x56, 0x5d, 0xab, 0xea, 0xd0, 0xcd, 0x9c, 0x19, 0xef, 0x45, 0x3c, 0x3e, + 0x76, 0x6d, 0x36, 0x92, 0xb4, 0x3d, 0x58, 0x29, 0x2b, 0xa0, 0x15, 0x30, 0x8f, 0xf0, 0xb1, 0xb6, + 0xb1, 0xf8, 0x29, 0x08, 0xe3, 0xa5, 0x40, 0x9b, 0xae, 0x13, 0xae, 0x9c, 0x98, 0x81, 0x7b, 0xd4, + 0x55, 0xda, 0xdf, 0x9b, 0xfb, 0xc4, 0x70, 0xde, 0x1a, 0xb0, 0xb2, 0x1b, 0xd3, 0xe1, 0x3b, 0x27, + 0x5f, 0x07, 0x1a, 0xb9, 0xda, 0x3b, 0x8d, 0xf7, 0x82, 0x6c, 0x5a, 0x1a, 0xbe, 0x08, 0xf5, 0x20, + 0xa6, 0x43, 0xcf, 0x0f, 0x43, 0x19, 0x8a, 0xa2, 0x0c, 0x8d, 0xe9, 0x70, 0x3b, 0x0c, 0x9d, 0x57, + 0xb0, 0xb6, 0x8b, 0x59, 0x37, 0x26, 0x9d, 0x77, 0xa7, 0x85, 0x29, 0x8c, 0x5d, 0x48, 0xb9, 0x66, + 0x29, 0xe5, 0x3a, 0x5f, 0x18, 0xf0, 0x7e, 0xe9, 0xe4, 0xb3, 0xa0, 0xe3, 0x87, 0x45, 0xcc, 0x2a, + 0x70, 0x4c, 0xe9, 0xb1, 0xf2, 0x58, 0xf5, 0x25, 0x63, 0xcb, 0xb9, 0xbb, 0x22, 0x4b, 0xed, 0xc7, + 0xb4, 0x2f, 0xeb, 0xd1, 0xf3, 0xab, 0xe5, 0xfe, 0x6e, 0xc0, 0x07, 0x13, 0xce, 0x38, 0xcb, 0x97, + 0x97, 0x9b, 0xf7, 0xb9, 0x69, 0xcd, 0xbb, 0x59, 0x6e, 0xde, 0xab, 0x7b, 0xdb, 0xda, 0x84, 0xde, + 0xf6, 0xad, 0x09, 0xcd, 0x03, 0x4e, 0x63, 0xbf, 0x8f, 0x77, 0x68, 0xd4, 0x23, 0x7d, 0x91, 0xe8, + 0xd3, 0x0a, 0xdf, 0x90, 0x1f, 0x9d, 0xd5, 0xf0, 0x57, 0xa1, 0xe1, 0x77, 0xbb, 0x98, 0x31, 0xd1, + 0x22, 0xe9, 0x6c, 0x64, 0xb9, 0xb6, 0x92, 0x3d, 0x16, 0x22, 0xf4, 0x0d, 0x58, 0x65, 0xb8, 0x1b, + 0x63, 0xee, 0x8d, 0x34, 0x35, 0x82, 0x97, 0xd5, 0xc4, 0x76, 0xaa, 0x2d, 0x5a, 0x82, 0x84, 0xe1, + 0x83, 0x83, 0x4f, 0x35, 0x8a, 0xf5, 0x48, 0x14, 0x64, 0x9d, 0xa4, 0x7b, 0x84, 0x79, 0x9e, 0x50, + 0x40, 0x89, 0x24, 0x14, 0x2f, 0x81, 0x15, 0x53, 0xca, 0x25, 0x0b, 0x48, 0xf6, 0xb7, 0xdc, 0xba, + 0x10, 0x88, 0xb4, 0xa5, 0x77, 0xdd, 0xdb, 0x7e, 0xa2, 0x59, 0x5f, 0x8f, 0x44, 0x1f, 0xbc, 0xb7, + 0xfd, 0xe4, 0x5e, 0x14, 0x0c, 0x29, 0x89, 0xb8, 0xa4, 0x04, 0xcb, 0xcd, 0x8b, 0xc4, 0xe7, 0x31, + 0x65, 0x09, 0x4f, 0x14, 0x2c, 0x92, 0x0e, 0x2c, 0xd7, 0xd6, 0xb2, 0x67, 0xc7, 0x43, 0x2c, 0x58, + 0x28, 0x61, 0xd8, 0x7b, 0x49, 0x62, 0x9e, 0xf8, 0xa1, 0x77, 0x48, 0x19, 0x97, 0xac, 0x50, 0x77, + 0x97, 0x12, 0x86, 0x9f, 0x2b, 0xf1, 0x43, 0xca, 0xb8, 0xb8, 0x46, 0x8c, 0xfb, 0x23, 0x3a, 0xd0, + 0x23, 0xd1, 0x07, 0x76, 0x43, 0x9a, 0x04, 0xde, 0x30, 0xa6, 0x2f, 0x49, 0x80, 0x63, 0xd9, 0x49, + 0x5a, 0x6e, 0x53, 0x4a, 0xf7, 0xb5, 0xd0, 0x79, 0x5b, 0x83, 0x15, 0x55, 0xde, 0x3d, 0xa2, 0x9d, + 0x14, 0xb5, 0x97, 0xc1, 0xea, 0x86, 0x89, 0xe8, 0x94, 0x34, 0x64, 0x2d, 0x77, 0x24, 0x10, 0xa6, + 0xcf, 0x33, 0x64, 0x8c, 0x7b, 0xe4, 0xb5, 0x76, 0xd1, 0xf2, 0x88, 0x22, 0xa5, 0x38, 0x4f, 0xe6, + 0xe6, 0x18, 0x99, 0x07, 0x3e, 0xf7, 0x35, 0xc3, 0xd6, 0x24, 0xc3, 0x5a, 0x42, 0xa2, 0xc8, 0x75, + 0x8c, 0x33, 0xe7, 0x2b, 0x38, 0x33, 0x57, 0x44, 0x2c, 0x14, 0x8b, 0x88, 0x62, 0x4c, 0x2d, 0x96, + 0x73, 0xcc, 0x43, 0x58, 0x4a, 0x3d, 0xd0, 0x95, 0x60, 0x94, 0x6e, 0xaa, 0xe8, 0xe0, 0x64, 0x66, + 0xce, 0xa3, 0xd6, 0x6d, 0xb2, 0x02, 0x88, 0xcb, 0x45, 0x87, 0x75, 0xaa, 0xa2, 0xa3, 0x54, 0xf0, + 0xc2, 0x69, 0x0a, 0xde, 0x7c, 0x01, 0x61, 0xcf, 0x56, 0x40, 0x34, 0x26, 0x16, 0x10, 0x9f, 0xc2, + 0xca, 0x8f, 0x12, 0x1c, 0x1f, 0x3f, 0xa2, 0x1d, 0x36, 0x1b, 0x2a, 0xda, 0x50, 0xd7, 0xae, 0x4d, + 0xb9, 0x26, 0x1b, 0x3b, 0xff, 0x34, 0xa0, 0x29, 0x33, 0xc1, 0x33, 0x9f, 0x1d, 0xa5, 0x8f, 0x53, + 0x29, 0x2e, 0x8c, 0x22, 0x2e, 0x4e, 0xd9, 0x5c, 0x55, 0xbc, 0xac, 0x98, 0x55, 0x2f, 0x2b, 0x15, + 0x45, 0x5b, 0xad, 0xb2, 0x68, 0x2b, 0x75, 0x6b, 0xf3, 0x63, 0xdd, 0xda, 0x97, 0x06, 0xac, 0xe6, + 0x6c, 0x74, 0x96, 0x5c, 0x5c, 0xb0, 0xec, 0x5c, 0xd9, 0xb2, 0x77, 0x8b, 0x1c, 0x65, 0x56, 0x81, + 0x23, 0xc7, 0x51, 0xa9, 0x8d, 0x0b, 0x3c, 0xf5, 0x18, 0x96, 0x45, 0x15, 0x71, 0x3e, 0xee, 0xfc, + 0x87, 0x01, 0x8b, 0x8f, 0x68, 0x47, 0x3a, 0x32, 0x8f, 0x3a, 0xa3, 0x88, 0xba, 0x15, 0x30, 0x03, + 0x32, 0xd0, 0xc4, 0x22, 0x7e, 0x8a, 0xa8, 0x64, 0xdc, 0x8f, 0xf9, 0xe8, 0xdd, 0x51, 0xd4, 0x98, + 0x42, 0x22, 0x9f, 0xae, 0x2e, 0x42, 0x1d, 0x47, 0x81, 0x9a, 0xd4, 0xa5, 0x3f, 0x8e, 0x02, 0x39, + 0x75, 0x3e, 0xdd, 0xdc, 0x1a, 0xcc, 0x0f, 0xe9, 0xe8, 0xad, 0x50, 0x0d, 0x9c, 0x35, 0x40, 0x0f, + 0x30, 0x7f, 0x44, 0x3b, 0xc2, 0x2b, 0xa9, 0x79, 0x9c, 0xbf, 0xcd, 0xc9, 0x4e, 0x6b, 0x24, 0x3e, + 0x8b, 0x83, 0x1d, 0x68, 0x2a, 0x26, 0xfd, 0x9c, 0x76, 0xbc, 0x28, 0x49, 0x8d, 0x62, 0x4b, 0xe1, + 0x23, 0xda, 0x79, 0x9a, 0x0c, 0xd0, 0x2d, 0x78, 0x8f, 0x44, 0x22, 0x5b, 0x4b, 0x72, 0xcf, 0x34, + 0x95, 0x95, 0x56, 0x48, 0x94, 0xd2, 0xbe, 0x56, 0xbf, 0x01, 0xcb, 0x38, 0x7a, 0x91, 0xe0, 0x04, + 0x67, 0xaa, 0xca, 0x66, 0x4d, 0x2d, 0xd6, 0x7a, 0x82, 0xc4, 0x7d, 0x76, 0xe4, 0xb1, 0x90, 0x72, + 0xa6, 0xb3, 0xa8, 0x25, 0x24, 0x07, 0x42, 0x80, 0x3e, 0x01, 0x4b, 0x2c, 0x57, 0xd0, 0x52, 0x1d, + 0xd3, 0xa5, 0x2a, 0x68, 0x69, 0x7f, 0xbb, 0xf5, 0xcf, 0xd5, 0x0f, 0x26, 0x02, 0x44, 0x77, 0x04, + 0x01, 0x61, 0x47, 0x9a, 0x04, 0x41, 0x89, 0x76, 0x09, 0x3b, 0x72, 0x7e, 0x0a, 0x17, 0xf3, 0x6f, + 0x50, 0x84, 0x71, 0xd2, 0x3d, 0xcf, 0xc2, 0xe8, 0xf7, 0x06, 0xb4, 0xab, 0x0e, 0xf8, 0x2f, 0xd6, + 0x83, 0x5b, 0xbf, 0xb2, 0x01, 0xe4, 0xcc, 0x0e, 0xa5, 0x71, 0x80, 0x42, 0x09, 0xad, 0x1d, 0x3a, + 0x18, 0xd2, 0x08, 0x47, 0x5c, 0x66, 0x2c, 0x86, 0x36, 0x8b, 0xfb, 0xe9, 0xc1, 0xb8, 0xa2, 0xb6, + 0x55, 0xfb, 0xc3, 0x4a, 0xfd, 0x92, 0xb2, 0x73, 0x01, 0xbd, 0x90, 0x7d, 0xd3, 0xc8, 0x14, 0x3b, + 0x87, 0x7e, 0x14, 0xe1, 0x10, 0x6d, 0x4d, 0x78, 0x97, 0xac, 0x52, 0x4e, 0xcf, 0xbc, 0x56, 0x79, + 0xe6, 0x01, 0x8f, 0x49, 0xd4, 0x4f, 0x4d, 0xec, 0x5c, 0x40, 0xcf, 0xc0, 0xce, 0x3d, 0x0e, 0xa1, + 0x1b, 0x55, 0x96, 0x1a, 0x7f, 0x3d, 0x6a, 0x9f, 0xe4, 0x0b, 0xe7, 0x02, 0xea, 0x41, 0xb3, 0xf0, + 0x7a, 0x89, 0x36, 0x4e, 0x6a, 0xd7, 0xf2, 0x4f, 0x86, 0xed, 0xaf, 0xcf, 0xa0, 0x99, 0xdd, 0xfe, + 0xe7, 0xca, 0x60, 0x63, 0xcf, 0x7f, 0xb7, 0x27, 0x6c, 0x32, 0xe9, 0xa1, 0xb2, 0x7d, 0x67, 0xf6, + 0x05, 0xd9, 0xe1, 0xc1, 0xe8, 0x23, 0x55, 0x40, 0xdd, 0x9c, 0xde, 0x93, 0xaa, 0xd3, 0x36, 0x66, + 0x6d, 0x5e, 0x9d, 0x0b, 0x68, 0x1f, 0xac, 0xac, 0x7d, 0x44, 0x1f, 0x56, 0x2d, 0x2c, 0x77, 0x97, + 0x33, 0x38, 0xa7, 0xd0, 0x80, 0x55, 0x3b, 0xa7, 0xaa, 0x3b, 0xac, 0x76, 0x4e, 0x65, 0x37, 0xe7, + 0x5c, 0x40, 0x89, 0x8c, 0x9d, 0x52, 0x74, 0xa3, 0x5b, 0xd3, 0xfc, 0x5b, 0x48, 0x33, 0xed, 0xcd, + 0x59, 0xd5, 0xb3, 0x63, 0x7f, 0x31, 0x7a, 0x39, 0x2f, 0x74, 0x5b, 0xe8, 0xce, 0x49, 0x5b, 0x55, + 0x35, 0x7f, 0xed, 0x6f, 0xbd, 0xc3, 0x8a, 0x1c, 0x26, 0xd1, 0xc1, 0x21, 0x7d, 0xa5, 0xca, 0xcb, + 0x24, 0xf6, 0x45, 0x2e, 0xac, 0x38, 0x5c, 0x87, 0xf0, 0xb8, 0xea, 0xc4, 0xc3, 0x4f, 0x58, 0x91, + 0x1d, 0xee, 0x01, 0x3c, 0xc0, 0xfc, 0x09, 0xe6, 0xb1, 0xb0, 0xf5, 0x8d, 0x49, 0x79, 0x4a, 0x2b, + 0xa4, 0x47, 0xdd, 0x9c, 0xaa, 0x97, 0x1d, 0xd0, 0x01, 0x7b, 0xe7, 0x10, 0x77, 0x8f, 0x1e, 0x62, + 0x3f, 0xe4, 0x87, 0xa8, 0x7a, 0x65, 0x4e, 0x63, 0x02, 0xe4, 0xab, 0x14, 0xd3, 0x33, 0xb6, 0xbe, + 0x5c, 0xd0, 0xff, 0xd2, 0x3f, 0xa5, 0x01, 0xfe, 0xdf, 0x4f, 0xc1, 0xfb, 0x60, 0x65, 0x0d, 0x5c, + 0x75, 0x84, 0x97, 0xfb, 0xbb, 0x69, 0x11, 0xfe, 0x19, 0x58, 0x59, 0x61, 0x5b, 0xbd, 0x63, 0xb9, + 0x37, 0x68, 0x5f, 0x9f, 0xa2, 0x95, 0xdd, 0xf6, 0x29, 0xd4, 0xd3, 0x42, 0x14, 0x5d, 0x9b, 0x94, + 0x8e, 0xf2, 0x3b, 0x4f, 0xb9, 0xeb, 0xcf, 0xc0, 0xce, 0x55, 0x69, 0xd5, 0x04, 0x34, 0x5e, 0xdd, + 0xb5, 0x6f, 0x4e, 0xd5, 0xfb, 0xff, 0x08, 0xc8, 0xbb, 0xdf, 0xfe, 0x6c, 0xab, 0x4f, 0xf8, 0x61, + 0xd2, 0x11, 0x96, 0xbd, 0xad, 0x34, 0x6f, 0x11, 0xaa, 0x7f, 0xdd, 0x4e, 0x6f, 0x79, 0x5b, 0xee, + 0x74, 0x5b, 0xda, 0x69, 0xd8, 0xe9, 0x2c, 0xc8, 0xe1, 0x47, 0xff, 0x0e, 0x00, 0x00, 0xff, 0xff, + 0x4f, 0x5f, 0xf8, 0xb7, 0x64, 0x23, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/internal/proto/internalpb/internal.pb.go b/internal/proto/internalpb/internal.pb.go index 5c2c09095d..30d24043d6 100644 --- a/internal/proto/internalpb/internal.pb.go +++ b/internal/proto/internalpb/internal.pb.go @@ -1093,24 +1093,25 @@ func (m *CostAggregation) GetTotalNQ() int64 { } type RetrieveRequest struct { - Base *commonpb.MsgBase `protobuf:"bytes,1,opt,name=base,proto3" json:"base,omitempty"` - ReqID int64 `protobuf:"varint,2,opt,name=reqID,proto3" json:"reqID,omitempty"` - DbID int64 `protobuf:"varint,3,opt,name=dbID,proto3" json:"dbID,omitempty"` - CollectionID int64 `protobuf:"varint,4,opt,name=collectionID,proto3" json:"collectionID,omitempty"` - PartitionIDs []int64 `protobuf:"varint,5,rep,packed,name=partitionIDs,proto3" json:"partitionIDs,omitempty"` - SerializedExprPlan []byte `protobuf:"bytes,6,opt,name=serialized_expr_plan,json=serializedExprPlan,proto3" json:"serialized_expr_plan,omitempty"` - OutputFieldsId []int64 `protobuf:"varint,7,rep,packed,name=output_fields_id,json=outputFieldsId,proto3" json:"output_fields_id,omitempty"` - MvccTimestamp uint64 `protobuf:"varint,8,opt,name=mvcc_timestamp,json=mvccTimestamp,proto3" json:"mvcc_timestamp,omitempty"` - GuaranteeTimestamp uint64 `protobuf:"varint,9,opt,name=guarantee_timestamp,json=guaranteeTimestamp,proto3" json:"guarantee_timestamp,omitempty"` - TimeoutTimestamp uint64 `protobuf:"varint,10,opt,name=timeout_timestamp,json=timeoutTimestamp,proto3" json:"timeout_timestamp,omitempty"` - Limit int64 `protobuf:"varint,11,opt,name=limit,proto3" json:"limit,omitempty"` - IgnoreGrowing bool `protobuf:"varint,12,opt,name=ignoreGrowing,proto3" json:"ignoreGrowing,omitempty"` - IsCount bool `protobuf:"varint,13,opt,name=is_count,json=isCount,proto3" json:"is_count,omitempty"` - ReduceStopForBest bool `protobuf:"varint,14,opt,name=reduce_stop_for_best,json=reduceStopForBest,proto3" json:"reduce_stop_for_best,omitempty"` - Username string `protobuf:"bytes,15,opt,name=username,proto3" json:"username,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Base *commonpb.MsgBase `protobuf:"bytes,1,opt,name=base,proto3" json:"base,omitempty"` + ReqID int64 `protobuf:"varint,2,opt,name=reqID,proto3" json:"reqID,omitempty"` + DbID int64 `protobuf:"varint,3,opt,name=dbID,proto3" json:"dbID,omitempty"` + CollectionID int64 `protobuf:"varint,4,opt,name=collectionID,proto3" json:"collectionID,omitempty"` + PartitionIDs []int64 `protobuf:"varint,5,rep,packed,name=partitionIDs,proto3" json:"partitionIDs,omitempty"` + SerializedExprPlan []byte `protobuf:"bytes,6,opt,name=serialized_expr_plan,json=serializedExprPlan,proto3" json:"serialized_expr_plan,omitempty"` + OutputFieldsId []int64 `protobuf:"varint,7,rep,packed,name=output_fields_id,json=outputFieldsId,proto3" json:"output_fields_id,omitempty"` + MvccTimestamp uint64 `protobuf:"varint,8,opt,name=mvcc_timestamp,json=mvccTimestamp,proto3" json:"mvcc_timestamp,omitempty"` + GuaranteeTimestamp uint64 `protobuf:"varint,9,opt,name=guarantee_timestamp,json=guaranteeTimestamp,proto3" json:"guarantee_timestamp,omitempty"` + TimeoutTimestamp uint64 `protobuf:"varint,10,opt,name=timeout_timestamp,json=timeoutTimestamp,proto3" json:"timeout_timestamp,omitempty"` + Limit int64 `protobuf:"varint,11,opt,name=limit,proto3" json:"limit,omitempty"` + IgnoreGrowing bool `protobuf:"varint,12,opt,name=ignoreGrowing,proto3" json:"ignoreGrowing,omitempty"` + IsCount bool `protobuf:"varint,13,opt,name=is_count,json=isCount,proto3" json:"is_count,omitempty"` + IterationExtensionReduceRate int64 `protobuf:"varint,14,opt,name=iteration_extension_reduce_rate,json=iterationExtensionReduceRate,proto3" json:"iteration_extension_reduce_rate,omitempty"` + Username string `protobuf:"bytes,15,opt,name=username,proto3" json:"username,omitempty"` + ReduceStopForBest bool `protobuf:"varint,16,opt,name=reduce_stop_for_best,json=reduceStopForBest,proto3" json:"reduce_stop_for_best,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *RetrieveRequest) Reset() { *m = RetrieveRequest{} } @@ -1229,11 +1230,11 @@ func (m *RetrieveRequest) GetIsCount() bool { return false } -func (m *RetrieveRequest) GetReduceStopForBest() bool { +func (m *RetrieveRequest) GetIterationExtensionReduceRate() int64 { if m != nil { - return m.ReduceStopForBest + return m.IterationExtensionReduceRate } - return false + return 0 } func (m *RetrieveRequest) GetUsername() string { @@ -1243,6 +1244,13 @@ func (m *RetrieveRequest) GetUsername() string { return "" } +func (m *RetrieveRequest) GetReduceStopForBest() bool { + if m != nil { + return m.ReduceStopForBest + } + return false +} + type RetrieveResults struct { Base *commonpb.MsgBase `protobuf:"bytes,1,opt,name=base,proto3" json:"base,omitempty"` Status *commonpb.Status `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` @@ -1999,126 +2007,128 @@ func init() { func init() { proto.RegisterFile("internal.proto", fileDescriptor_41f4a519b878ee3b) } var fileDescriptor_41f4a519b878ee3b = []byte{ - // 1935 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x58, 0xcd, 0x72, 0x1c, 0x49, - 0x11, 0xa6, 0xe7, 0x7f, 0x72, 0x46, 0xa3, 0x51, 0x59, 0x36, 0x6d, 0x7b, 0x77, 0xad, 0x1d, 0xfe, - 0xc4, 0x12, 0x6b, 0x2d, 0xda, 0xd8, 0x35, 0x07, 0x02, 0xc2, 0x52, 0xdb, 0x8a, 0x89, 0x1d, 0x1b, - 0xb9, 0xc7, 0x6c, 0x04, 0x5c, 0x3a, 0x6a, 0xba, 0x4b, 0xa3, 0xc2, 0xdd, 0x5d, 0xad, 0xaa, 0x6a, - 0xc9, 0xf2, 0x99, 0x1b, 0x11, 0xdc, 0xb8, 0x10, 0x01, 0x6f, 0xc0, 0x99, 0x80, 0x0b, 0x6f, 0xc0, - 0x8b, 0xf0, 0x06, 0x7b, 0x22, 0xea, 0xa7, 0x67, 0x7a, 0x46, 0x23, 0x21, 0xcb, 0xfc, 0x2c, 0xb7, - 0xce, 0x2f, 0xb3, 0xb2, 0x2a, 0xb3, 0xb2, 0xbe, 0xca, 0x6a, 0xe8, 0xd1, 0x54, 0x12, 0x9e, 0xe2, - 0xf8, 0x61, 0xc6, 0x99, 0x64, 0xe8, 0x76, 0x42, 0xe3, 0xd3, 0x5c, 0x18, 0xe9, 0x61, 0xa1, 0xbc, - 0xd7, 0x0d, 0x59, 0x92, 0xb0, 0xd4, 0xc0, 0xf7, 0xba, 0x22, 0x3c, 0x26, 0x09, 0x36, 0xd2, 0xe0, - 0x3e, 0xdc, 0x3d, 0x20, 0xf2, 0x25, 0x4d, 0xc8, 0x4b, 0x1a, 0xbe, 0xda, 0x3f, 0xc6, 0x69, 0x4a, - 0x62, 0x9f, 0x9c, 0xe4, 0x44, 0xc8, 0xc1, 0xfb, 0x70, 0xff, 0x80, 0xc8, 0xb1, 0xc4, 0x92, 0x0a, - 0x49, 0x43, 0xb1, 0xa4, 0xbe, 0x0d, 0xb7, 0x0e, 0x88, 0xf4, 0xa2, 0x25, 0xf8, 0x4b, 0x68, 0x3d, - 0x67, 0x11, 0x19, 0xa6, 0x47, 0x0c, 0x7d, 0x0e, 0x4d, 0x1c, 0x45, 0x9c, 0x08, 0xe1, 0x3a, 0x5b, - 0xce, 0x76, 0x67, 0xf7, 0xbd, 0x87, 0x0b, 0x6b, 0xb4, 0x2b, 0x7b, 0x6c, 0x6c, 0xfc, 0xc2, 0x18, - 0x21, 0xa8, 0x71, 0x16, 0x13, 0xb7, 0xb2, 0xe5, 0x6c, 0xb7, 0x7d, 0xfd, 0x3d, 0xf8, 0x15, 0xc0, - 0x30, 0xa5, 0xf2, 0x10, 0x73, 0x9c, 0x08, 0x74, 0x07, 0x1a, 0xa9, 0x9a, 0xc5, 0xd3, 0x8e, 0xab, - 0xbe, 0x95, 0x90, 0x07, 0x5d, 0x21, 0x31, 0x97, 0x41, 0xa6, 0xed, 0xdc, 0xca, 0x56, 0x75, 0xbb, - 0xb3, 0xfb, 0xe1, 0xca, 0x69, 0xbf, 0x20, 0xe7, 0x5f, 0xe2, 0x38, 0x27, 0x87, 0x98, 0x72, 0xbf, - 0xa3, 0x87, 0x19, 0xef, 0x83, 0x5f, 0x00, 0x8c, 0x25, 0xa7, 0xe9, 0x74, 0x44, 0x85, 0x54, 0x73, - 0x9d, 0x2a, 0x3b, 0x15, 0x44, 0x75, 0xbb, 0xed, 0x5b, 0x09, 0x7d, 0x0a, 0x0d, 0x21, 0xb1, 0xcc, - 0x85, 0x5e, 0x67, 0x67, 0xf7, 0xfe, 0xca, 0x59, 0xc6, 0xda, 0xc4, 0xb7, 0xa6, 0x83, 0x3f, 0x55, - 0x60, 0x73, 0x21, 0xab, 0x36, 0x6f, 0xe8, 0x13, 0xa8, 0x4d, 0xb0, 0x20, 0x57, 0x26, 0xea, 0x99, - 0x98, 0xee, 0x61, 0x41, 0x7c, 0x6d, 0xa9, 0xb2, 0x14, 0x4d, 0x86, 0x9e, 0x9e, 0xbd, 0xea, 0xeb, - 0x6f, 0x34, 0x80, 0x6e, 0xc8, 0xe2, 0x98, 0x84, 0x92, 0xb2, 0x74, 0xe8, 0xb9, 0x55, 0xad, 0x5b, - 0xc0, 0x94, 0x4d, 0x86, 0xb9, 0xa4, 0x46, 0x14, 0x6e, 0x6d, 0xab, 0xaa, 0x6c, 0xca, 0x18, 0xfa, - 0x3e, 0xf4, 0x25, 0xc7, 0xa7, 0x24, 0x0e, 0x24, 0x4d, 0x88, 0x90, 0x38, 0xc9, 0xdc, 0xfa, 0x96, - 0xb3, 0x5d, 0xf3, 0xd7, 0x0d, 0xfe, 0xb2, 0x80, 0xd1, 0x0e, 0xdc, 0x9a, 0xe6, 0x98, 0xe3, 0x54, - 0x12, 0x52, 0xb2, 0x6e, 0x68, 0x6b, 0x34, 0x53, 0xcd, 0x07, 0xfc, 0x00, 0x36, 0x94, 0x19, 0xcb, - 0x65, 0xc9, 0xbc, 0xa9, 0xcd, 0xfb, 0x56, 0x31, 0x33, 0x1e, 0xfc, 0xd9, 0x81, 0xdb, 0x4b, 0xf9, - 0x12, 0x19, 0x4b, 0x05, 0xb9, 0x41, 0xc2, 0x6e, 0xb2, 0x61, 0xe8, 0x11, 0xd4, 0xd5, 0x97, 0x70, - 0xab, 0xd7, 0x2d, 0x25, 0x63, 0x3f, 0xf8, 0xa3, 0x03, 0x68, 0x9f, 0x13, 0x2c, 0xc9, 0xe3, 0x98, - 0xe2, 0x77, 0xd8, 0xe7, 0x6f, 0x42, 0x33, 0x9a, 0x04, 0x29, 0x4e, 0x8a, 0x03, 0xd1, 0x88, 0x26, - 0xcf, 0x71, 0x42, 0xd0, 0xf7, 0x60, 0x7d, 0xbe, 0xb1, 0xc6, 0xa0, 0xaa, 0x0d, 0x7a, 0x73, 0x58, - 0x1b, 0x6e, 0x42, 0x1d, 0xab, 0x35, 0xb8, 0x35, 0xad, 0x36, 0xc2, 0x40, 0x40, 0xdf, 0xe3, 0x2c, - 0xfb, 0x4f, 0xad, 0x6e, 0x36, 0x69, 0xb5, 0x3c, 0xe9, 0x1f, 0x1c, 0xd8, 0x78, 0x1c, 0x4b, 0xc2, - 0xbf, 0xa6, 0x49, 0xf9, 0x5b, 0xa5, 0xd8, 0xb5, 0x61, 0x1a, 0x91, 0xd7, 0xff, 0xcb, 0x05, 0xbe, - 0x0f, 0x70, 0x44, 0x49, 0x1c, 0x19, 0x1b, 0xb3, 0xca, 0xb6, 0x46, 0xb4, 0xba, 0x38, 0xfe, 0xf5, - 0x2b, 0x8e, 0x7f, 0x63, 0xc5, 0xf1, 0x77, 0xa1, 0xa9, 0x9d, 0x0c, 0x3d, 0x7d, 0xe8, 0xaa, 0x7e, - 0x21, 0x2a, 0xf2, 0x24, 0xaf, 0x25, 0xc7, 0x05, 0x79, 0xb6, 0xae, 0x4d, 0x9e, 0x7a, 0x98, 0x25, - 0xcf, 0x7f, 0xd4, 0x60, 0x6d, 0x4c, 0x30, 0x0f, 0x8f, 0x6f, 0x9e, 0xbc, 0x4d, 0xa8, 0x73, 0x72, - 0x32, 0xe3, 0x36, 0x23, 0xcc, 0x22, 0xae, 0x5e, 0x11, 0x71, 0xed, 0x1a, 0x84, 0x57, 0x5f, 0x41, - 0x78, 0x7d, 0xa8, 0x46, 0x22, 0xd6, 0x09, 0x6b, 0xfb, 0xea, 0x53, 0xd1, 0x54, 0x16, 0xe3, 0x90, - 0x1c, 0xb3, 0x38, 0x22, 0x3c, 0x98, 0x72, 0x96, 0x1b, 0x9a, 0xea, 0xfa, 0xfd, 0x92, 0xe2, 0x40, - 0xe1, 0xe8, 0x11, 0xb4, 0x22, 0x11, 0x07, 0xf2, 0x3c, 0x23, 0x6e, 0x6b, 0xcb, 0xd9, 0xee, 0x5d, - 0x12, 0xa6, 0x27, 0xe2, 0x97, 0xe7, 0x19, 0xf1, 0x9b, 0x91, 0xf9, 0x40, 0x9f, 0xc0, 0xa6, 0x20, - 0x9c, 0xe2, 0x98, 0xbe, 0x21, 0x51, 0x40, 0x5e, 0x67, 0x3c, 0xc8, 0x62, 0x9c, 0xba, 0x6d, 0x3d, - 0x11, 0x9a, 0xeb, 0x9e, 0xbc, 0xce, 0xf8, 0x61, 0x8c, 0x53, 0xb4, 0x0d, 0x7d, 0x96, 0xcb, 0x2c, - 0x97, 0x81, 0xde, 0x37, 0x11, 0xd0, 0xc8, 0x05, 0x1d, 0x51, 0xcf, 0xe0, 0x4f, 0x35, 0x3c, 0x8c, - 0x2e, 0x63, 0xe6, 0xee, 0xdb, 0x31, 0xf3, 0xda, 0x6a, 0x66, 0x46, 0x3d, 0xa8, 0xa4, 0x27, 0x6e, - 0x4f, 0xe7, 0xbb, 0x92, 0x9e, 0xa8, 0xdd, 0x91, 0x2c, 0x7b, 0xe5, 0xae, 0x9b, 0xdd, 0x51, 0xdf, - 0xe8, 0x03, 0x80, 0x84, 0x48, 0x4e, 0x43, 0x15, 0xab, 0xdb, 0xd7, 0xc9, 0x2d, 0x21, 0xe8, 0xdb, - 0xb0, 0x46, 0xa7, 0x29, 0xe3, 0xe4, 0x80, 0xb3, 0x33, 0x9a, 0x4e, 0xdd, 0x8d, 0x2d, 0x67, 0xbb, - 0xe5, 0x2f, 0x82, 0xe8, 0x1e, 0xb4, 0x72, 0xa1, 0x9a, 0x99, 0x84, 0xb8, 0x48, 0xfb, 0x98, 0xc9, - 0x83, 0xbf, 0x97, 0xaa, 0x4d, 0xe4, 0xb1, 0x14, 0xff, 0xad, 0x7b, 0x61, 0x56, 0xa2, 0xd5, 0x72, - 0x89, 0x3e, 0x80, 0x8e, 0x09, 0xcf, 0x94, 0x42, 0xed, 0x42, 0xc4, 0x0f, 0xa0, 0x93, 0xe6, 0x49, - 0x70, 0x92, 0x13, 0x4e, 0x89, 0xb0, 0x87, 0x17, 0xd2, 0x3c, 0x79, 0x61, 0x10, 0x74, 0x0b, 0xea, - 0x92, 0x65, 0xc1, 0x2b, 0x7b, 0x76, 0x55, 0x1e, 0xbf, 0x40, 0x3f, 0x86, 0x7b, 0x82, 0xe0, 0x98, - 0x44, 0x81, 0x20, 0xd3, 0x84, 0xa4, 0x72, 0xe8, 0x89, 0x40, 0xe8, 0xb0, 0x49, 0xe4, 0x36, 0xf5, - 0xee, 0xbb, 0xc6, 0x62, 0x3c, 0x33, 0x18, 0x5b, 0xbd, 0xaa, 0x83, 0xd0, 0x34, 0x69, 0x0b, 0xc3, - 0x5a, 0xba, 0x9b, 0x41, 0x73, 0xd5, 0x6c, 0xc0, 0x8f, 0xc0, 0x9d, 0xc6, 0x6c, 0x82, 0xe3, 0xe0, - 0xc2, 0xac, 0x6e, 0x5b, 0x4f, 0x76, 0xc7, 0xe8, 0xc7, 0x4b, 0x53, 0xaa, 0xf0, 0x44, 0x4c, 0x43, - 0x12, 0x05, 0x93, 0x98, 0x4d, 0x5c, 0xd0, 0x55, 0x0c, 0x06, 0xda, 0x8b, 0xd9, 0x44, 0x55, 0xaf, - 0x35, 0x50, 0x69, 0x08, 0x59, 0x9e, 0x4a, 0xb7, 0xa3, 0x23, 0xed, 0x19, 0xfc, 0x79, 0x9e, 0xec, - 0x2b, 0x14, 0x7d, 0x0b, 0xd6, 0xac, 0x25, 0x3b, 0x3a, 0x12, 0x44, 0xea, 0xba, 0xad, 0xfa, 0x5d, - 0x03, 0xfe, 0x4c, 0x63, 0xe8, 0x50, 0x91, 0xa9, 0x90, 0x8f, 0xa7, 0x53, 0x4e, 0xa6, 0x58, 0x1d, - 0x66, 0x5d, 0xaf, 0x9d, 0xdd, 0xef, 0x3e, 0x5c, 0xd9, 0x0d, 0x3f, 0xdc, 0x5f, 0xb4, 0xf6, 0x97, - 0x87, 0x0f, 0x4e, 0x60, 0x7d, 0xc9, 0x46, 0xf1, 0x07, 0xb7, 0x5d, 0x87, 0x2a, 0x7f, 0xdb, 0x72, - 0x2e, 0x60, 0x68, 0x0b, 0x3a, 0x82, 0xf0, 0x53, 0x1a, 0x1a, 0x13, 0xc3, 0x5b, 0x65, 0x48, 0xf1, - 0xae, 0x64, 0x12, 0xc7, 0xcf, 0x5f, 0xd8, 0x92, 0x29, 0xc4, 0xc1, 0x5f, 0x6b, 0xb0, 0xee, 0xab, - 0x12, 0x21, 0xa7, 0xe4, 0xff, 0x89, 0x33, 0x2f, 0xe3, 0xae, 0xc6, 0x5b, 0x71, 0x57, 0x73, 0x25, - 0x77, 0x7d, 0x07, 0x7a, 0xc9, 0x69, 0x18, 0x96, 0x78, 0xa8, 0xa5, 0x79, 0x68, 0x4d, 0xa1, 0xff, - 0xb2, 0xf9, 0x6c, 0xbf, 0x1d, 0xc5, 0xc1, 0x25, 0x14, 0xb7, 0x09, 0xf5, 0x98, 0x26, 0xb4, 0xa8, - 0x50, 0x23, 0x5c, 0x24, 0xad, 0xee, 0x2a, 0xd2, 0xba, 0x0b, 0x2d, 0x2a, 0x6c, 0x81, 0xaf, 0x69, - 0x83, 0x26, 0x15, 0xa6, 0xb2, 0x77, 0x60, 0x93, 0x93, 0x28, 0x0f, 0x49, 0x20, 0xd4, 0x51, 0x3f, - 0x62, 0x3c, 0x98, 0x10, 0x21, 0x35, 0x97, 0xb6, 0xfc, 0x0d, 0xa3, 0x1b, 0x4b, 0x96, 0x3d, 0x65, - 0x7c, 0x4f, 0x15, 0x43, 0x99, 0x00, 0xd7, 0x97, 0x08, 0xf0, 0xab, 0x6a, 0xb9, 0x78, 0xbe, 0x06, - 0x14, 0xf8, 0x11, 0x54, 0x69, 0x64, 0xba, 0xaa, 0xce, 0xae, 0xbb, 0xe8, 0xc7, 0x3e, 0x3e, 0x87, - 0x9e, 0xf0, 0x95, 0x11, 0xfa, 0x29, 0x74, 0x6c, 0x21, 0x44, 0x58, 0x62, 0x5d, 0x64, 0x9d, 0xdd, - 0x0f, 0x56, 0x8e, 0xd1, 0x95, 0xe1, 0x61, 0x89, 0x7d, 0xd3, 0x15, 0x09, 0xf5, 0x8d, 0x7e, 0x02, - 0xf7, 0x2f, 0x12, 0x23, 0xb7, 0xe9, 0x88, 0xdc, 0x86, 0xae, 0xad, 0xbb, 0xcb, 0xcc, 0x58, 0xe4, - 0x2b, 0x42, 0x3f, 0x84, 0xcd, 0x12, 0x35, 0xce, 0x07, 0x36, 0x35, 0x37, 0x96, 0x68, 0x73, 0x3e, - 0xe4, 0x2a, 0x72, 0x6c, 0x5d, 0x49, 0x8e, 0xff, 0x7e, 0xb2, 0xfa, 0xca, 0x81, 0xf6, 0x88, 0xe1, - 0x48, 0xf7, 0xaa, 0x37, 0xd8, 0xf6, 0xf7, 0xa0, 0x3d, 0x5b, 0xbd, 0xe5, 0x8d, 0x39, 0xa0, 0xb4, - 0xb3, 0x76, 0xd3, 0xf6, 0xa8, 0xa5, 0xfe, 0xb3, 0xd4, 0x47, 0xd6, 0x16, 0xfb, 0xc8, 0x07, 0xd0, - 0xa1, 0x6a, 0x41, 0x41, 0x86, 0xe5, 0xb1, 0xa1, 0x8e, 0xb6, 0x0f, 0x1a, 0x3a, 0x54, 0x88, 0x6a, - 0x34, 0x0b, 0x03, 0xdd, 0x68, 0x36, 0xae, 0xdd, 0x68, 0x5a, 0x27, 0xba, 0xd1, 0xfc, 0xb5, 0x03, - 0xa0, 0x03, 0x57, 0x65, 0x79, 0xd1, 0xa9, 0x73, 0x13, 0xa7, 0x8a, 0xd3, 0xd4, 0xc5, 0xc4, 0x49, - 0x8c, 0xe5, 0x7c, 0x6f, 0x85, 0x4d, 0x0e, 0x4a, 0xf3, 0xc4, 0x37, 0x2a, 0xbb, 0xaf, 0x62, 0xf0, - 0x5b, 0x07, 0x40, 0x17, 0xa7, 0x59, 0xc6, 0x32, 0xb9, 0x3a, 0x57, 0xb7, 0xe0, 0x95, 0xc5, 0xd4, - 0xed, 0x15, 0xa9, 0xbb, 0xe2, 0xcd, 0x39, 0x2b, 0x8f, 0x79, 0xf0, 0x36, 0xbb, 0xfa, 0x7b, 0xf0, - 0x3b, 0x07, 0xba, 0x76, 0x75, 0x66, 0x49, 0x0b, 0xbb, 0xec, 0x2c, 0xef, 0xb2, 0x6e, 0x59, 0x12, - 0xc6, 0xcf, 0x03, 0x41, 0xdf, 0x14, 0x37, 0x17, 0x18, 0x68, 0x4c, 0xdf, 0x10, 0xc5, 0x64, 0x3a, - 0x25, 0xec, 0x4c, 0x14, 0x37, 0x97, 0x4a, 0x03, 0x3b, 0x13, 0x8a, 0x4d, 0x39, 0x09, 0x49, 0x2a, - 0xe3, 0xf3, 0x20, 0x61, 0x11, 0x3d, 0xa2, 0x24, 0xd2, 0xd5, 0xd0, 0xf2, 0xfb, 0x85, 0xe2, 0x99, - 0xc5, 0xd5, 0x53, 0x1e, 0xd9, 0x9f, 0x45, 0xc5, 0x1f, 0xa7, 0x67, 0x62, 0x7a, 0x83, 0xaa, 0x55, - 0x29, 0x36, 0x7e, 0x54, 0x21, 0x9a, 0x9f, 0x3c, 0x6d, 0x7f, 0x01, 0x53, 0x9d, 0xe7, 0x8c, 0xdf, - 0x4d, 0x1e, 0x6b, 0x7e, 0x09, 0x51, 0x2b, 0x8f, 0xc8, 0x11, 0xce, 0xe3, 0xf2, 0x3d, 0x50, 0x33, - 0xf7, 0x80, 0x55, 0x2c, 0xfc, 0x84, 0xe8, 0xed, 0x73, 0x12, 0x91, 0x54, 0x52, 0x1c, 0xeb, 0x5f, - 0x5b, 0x65, 0x4a, 0x76, 0x16, 0x29, 0x19, 0x7d, 0x0c, 0x88, 0xa4, 0x21, 0x3f, 0xcf, 0x54, 0x05, - 0x65, 0x58, 0x88, 0x33, 0xc6, 0x23, 0xfb, 0x0a, 0xdc, 0x98, 0x69, 0x0e, 0xad, 0x02, 0xdd, 0x81, - 0x86, 0x24, 0x29, 0x4e, 0xa5, 0x3d, 0x63, 0x56, 0xb2, 0x37, 0x88, 0xc8, 0x33, 0xc2, 0x6d, 0x4e, - 0x9b, 0x54, 0x8c, 0x95, 0xa8, 0xde, 0x90, 0xe2, 0x18, 0xef, 0x7e, 0xf6, 0xf9, 0xdc, 0x7d, 0xdd, - 0xbc, 0x21, 0x0d, 0x5c, 0xf8, 0x1e, 0x3c, 0x81, 0x8d, 0x11, 0x15, 0xf2, 0x90, 0xc5, 0x34, 0x3c, - 0xbf, 0x71, 0x6f, 0x31, 0xf8, 0x8d, 0x03, 0xa8, 0xec, 0xc7, 0xfe, 0x82, 0x99, 0xdf, 0x1a, 0xce, - 0xf5, 0x6f, 0x8d, 0x0f, 0xa1, 0x9b, 0x69, 0x37, 0x01, 0x4d, 0x8f, 0x58, 0xb1, 0x7b, 0x1d, 0x83, - 0xa9, 0xdc, 0x0a, 0xf5, 0xf2, 0x55, 0xc9, 0x0c, 0x38, 0x8b, 0x89, 0xd9, 0xbc, 0xb6, 0xdf, 0x56, - 0x88, 0xaf, 0x80, 0xc1, 0x14, 0xee, 0x8e, 0x8f, 0xd9, 0xd9, 0x3e, 0x4b, 0x8f, 0xe8, 0x34, 0xe7, - 0x9a, 0x0a, 0xdf, 0xe1, 0x57, 0x82, 0x0b, 0xcd, 0x0c, 0x4b, 0x75, 0xa6, 0xec, 0x1e, 0x15, 0xe2, - 0xe0, 0xf7, 0x0e, 0xdc, 0x5b, 0x35, 0xd3, 0xbb, 0x84, 0x7f, 0x00, 0x6b, 0xa1, 0x71, 0x67, 0xbc, - 0x5d, 0xff, 0x17, 0xe5, 0xe2, 0xb8, 0xc1, 0x13, 0xa8, 0xf9, 0x58, 0x12, 0xb4, 0x03, 0x15, 0x2e, - 0xf5, 0x0a, 0x7a, 0xbb, 0x0f, 0x2e, 0x61, 0x0a, 0x65, 0xa8, 0xdf, 0x9d, 0x15, 0x2e, 0x51, 0x17, - 0x1c, 0xae, 0x23, 0x75, 0x7c, 0x87, 0x7f, 0xf4, 0x17, 0x07, 0x5a, 0x85, 0x1a, 0x6d, 0xc0, 0x9a, - 0xe7, 0x8d, 0xf6, 0x67, 0x5c, 0xd5, 0xff, 0x06, 0xea, 0x43, 0xd7, 0xf3, 0x46, 0x87, 0x45, 0xdf, - 0xd7, 0x77, 0x50, 0x17, 0x5a, 0x9e, 0x37, 0xd2, 0xe4, 0xd3, 0xaf, 0x58, 0xe9, 0x69, 0x9c, 0x8b, - 0xe3, 0x7e, 0x75, 0xe6, 0x20, 0xc9, 0xb0, 0x71, 0x50, 0x43, 0x6b, 0xd0, 0xf6, 0x9e, 0x8d, 0x86, - 0xa9, 0x20, 0x5c, 0xf6, 0xeb, 0x56, 0xf4, 0x48, 0x4c, 0x24, 0xe9, 0x37, 0xd0, 0x3a, 0x74, 0xbc, - 0x67, 0xa3, 0xbd, 0x3c, 0x7e, 0xa5, 0xee, 0xb1, 0x7e, 0x53, 0xeb, 0x5f, 0x8c, 0xcc, 0x53, 0xa4, - 0xdf, 0xd2, 0xee, 0x5f, 0x8c, 0xd4, 0xe3, 0xe8, 0xbc, 0xdf, 0xb6, 0x83, 0x7f, 0x9e, 0x69, 0x5f, - 0xb0, 0xf7, 0xe8, 0x97, 0x9f, 0x4d, 0xa9, 0x3c, 0xce, 0x27, 0x2a, 0x5f, 0x3b, 0x26, 0xf4, 0x8f, - 0x29, 0xb3, 0x5f, 0x3b, 0x45, 0xf8, 0x3b, 0x3a, 0x1b, 0x33, 0x31, 0x9b, 0x4c, 0x1a, 0x1a, 0xf9, - 0xf4, 0x9f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x4c, 0x78, 0xf5, 0x94, 0x43, 0x17, 0x00, 0x00, + // 1966 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x58, 0xcb, 0x6e, 0x1c, 0xb9, + 0x15, 0x4d, 0xf5, 0xbb, 0x6f, 0xb7, 0x5a, 0x2d, 0x5a, 0x76, 0xca, 0x8f, 0x19, 0x6b, 0x2a, 0x2f, + 0x65, 0x82, 0xb1, 0x26, 0x1a, 0xcc, 0x38, 0x8b, 0x20, 0x81, 0xa5, 0xb2, 0x85, 0xc6, 0xb4, 0x1d, + 0xb9, 0xda, 0x19, 0x20, 0xd9, 0x14, 0xd8, 0x55, 0x54, 0x8b, 0x71, 0x55, 0xb1, 0x44, 0xb2, 0x64, + 0xcb, 0xbb, 0x00, 0xd9, 0x05, 0xc8, 0x2e, 0x9b, 0x00, 0xc9, 0x1f, 0x64, 0x3d, 0xc8, 0x2a, 0x7f, + 0x90, 0x1f, 0xc9, 0x1f, 0xcc, 0x2a, 0xe0, 0xa3, 0xfa, 0xa5, 0x96, 0x22, 0xcb, 0x79, 0xcc, 0xec, + 0x8a, 0xe7, 0x1e, 0x5e, 0x92, 0x97, 0x97, 0x87, 0x97, 0x05, 0x3d, 0x9a, 0x49, 0xc2, 0x33, 0x9c, + 0x3c, 0xc8, 0x39, 0x93, 0x0c, 0xdd, 0x4c, 0x69, 0x72, 0x5a, 0x08, 0xd3, 0x7a, 0x50, 0x1a, 0xef, + 0x74, 0x23, 0x96, 0xa6, 0x2c, 0x33, 0xf0, 0x9d, 0xae, 0x88, 0x8e, 0x49, 0x8a, 0x4d, 0xcb, 0xbb, + 0x0b, 0xb7, 0x0f, 0x88, 0x7c, 0x41, 0x53, 0xf2, 0x82, 0x46, 0x2f, 0xf7, 0x8f, 0x71, 0x96, 0x91, + 0x24, 0x20, 0x27, 0x05, 0x11, 0xd2, 0x7b, 0x0f, 0xee, 0x1e, 0x10, 0x39, 0x92, 0x58, 0x52, 0x21, + 0x69, 0x24, 0x96, 0xcc, 0x37, 0xe1, 0xc6, 0x01, 0x91, 0x7e, 0xbc, 0x04, 0x7f, 0x01, 0xad, 0x67, + 0x2c, 0x26, 0x83, 0xec, 0x88, 0xa1, 0xcf, 0xa0, 0x89, 0xe3, 0x98, 0x13, 0x21, 0x5c, 0x67, 0xcb, + 0xd9, 0xee, 0xec, 0xde, 0x7b, 0xb0, 0x30, 0x47, 0x3b, 0xb3, 0x47, 0x86, 0x13, 0x94, 0x64, 0x84, + 0xa0, 0xc6, 0x59, 0x42, 0xdc, 0xca, 0x96, 0xb3, 0xdd, 0x0e, 0xf4, 0xb7, 0xf7, 0x1b, 0x80, 0x41, + 0x46, 0xe5, 0x21, 0xe6, 0x38, 0x15, 0xe8, 0x16, 0x34, 0x32, 0x35, 0x8a, 0xaf, 0x1d, 0x57, 0x03, + 0xdb, 0x42, 0x3e, 0x74, 0x85, 0xc4, 0x5c, 0x86, 0xb9, 0xe6, 0xb9, 0x95, 0xad, 0xea, 0x76, 0x67, + 0xf7, 0x83, 0x95, 0xc3, 0x7e, 0x4e, 0xce, 0xbe, 0xc0, 0x49, 0x41, 0x0e, 0x31, 0xe5, 0x41, 0x47, + 0x77, 0x33, 0xde, 0xbd, 0x5f, 0x01, 0x8c, 0x24, 0xa7, 0xd9, 0x64, 0x48, 0x85, 0x54, 0x63, 0x9d, + 0x2a, 0x9e, 0x5a, 0x44, 0x75, 0xbb, 0x1d, 0xd8, 0x16, 0xfa, 0x04, 0x1a, 0x42, 0x62, 0x59, 0x08, + 0x3d, 0xcf, 0xce, 0xee, 0xdd, 0x95, 0xa3, 0x8c, 0x34, 0x25, 0xb0, 0x54, 0xef, 0xaf, 0x15, 0xd8, + 0x5c, 0x88, 0xaa, 0x8d, 0x1b, 0xfa, 0x18, 0x6a, 0x63, 0x2c, 0xc8, 0xa5, 0x81, 0x7a, 0x2a, 0x26, + 0x7b, 0x58, 0x90, 0x40, 0x33, 0x55, 0x94, 0xe2, 0xf1, 0xc0, 0xd7, 0xa3, 0x57, 0x03, 0xfd, 0x8d, + 0x3c, 0xe8, 0x46, 0x2c, 0x49, 0x48, 0x24, 0x29, 0xcb, 0x06, 0xbe, 0x5b, 0xd5, 0xb6, 0x05, 0x4c, + 0x71, 0x72, 0xcc, 0x25, 0x35, 0x4d, 0xe1, 0xd6, 0xb6, 0xaa, 0x8a, 0x33, 0x8f, 0xa1, 0x1f, 0x42, + 0x5f, 0x72, 0x7c, 0x4a, 0x92, 0x50, 0xd2, 0x94, 0x08, 0x89, 0xd3, 0xdc, 0xad, 0x6f, 0x39, 0xdb, + 0xb5, 0x60, 0xdd, 0xe0, 0x2f, 0x4a, 0x18, 0xed, 0xc0, 0x8d, 0x49, 0x81, 0x39, 0xce, 0x24, 0x21, + 0x73, 0xec, 0x86, 0x66, 0xa3, 0xa9, 0x69, 0xd6, 0xe1, 0x47, 0xb0, 0xa1, 0x68, 0xac, 0x90, 0x73, + 0xf4, 0xa6, 0xa6, 0xf7, 0xad, 0x61, 0x4a, 0xf6, 0xbe, 0x74, 0xe0, 0xe6, 0x52, 0xbc, 0x44, 0xce, + 0x32, 0x41, 0xae, 0x11, 0xb0, 0xeb, 0x6c, 0x18, 0x7a, 0x08, 0x75, 0xf5, 0x25, 0xdc, 0xea, 0x55, + 0x53, 0xc9, 0xf0, 0xbd, 0xbf, 0x38, 0x80, 0xf6, 0x39, 0xc1, 0x92, 0x3c, 0x4a, 0x28, 0x7e, 0x87, + 0x7d, 0xfe, 0x36, 0x34, 0xe3, 0x71, 0x98, 0xe1, 0xb4, 0x3c, 0x10, 0x8d, 0x78, 0xfc, 0x0c, 0xa7, + 0x04, 0xfd, 0x00, 0xd6, 0x67, 0x1b, 0x6b, 0x08, 0x55, 0x4d, 0xe8, 0xcd, 0x60, 0x4d, 0xdc, 0x84, + 0x3a, 0x56, 0x73, 0x70, 0x6b, 0xda, 0x6c, 0x1a, 0x9e, 0x80, 0xbe, 0xcf, 0x59, 0xfe, 0xdf, 0x9a, + 0xdd, 0x74, 0xd0, 0xea, 0xfc, 0xa0, 0x7f, 0x76, 0x60, 0xe3, 0x51, 0x22, 0x09, 0xff, 0x9a, 0x06, + 0xe5, 0xef, 0x95, 0x72, 0xd7, 0x06, 0x59, 0x4c, 0x5e, 0xff, 0x3f, 0x27, 0xf8, 0x1e, 0xc0, 0x11, + 0x25, 0x49, 0x6c, 0x38, 0x66, 0x96, 0x6d, 0x8d, 0x68, 0x73, 0x79, 0xfc, 0xeb, 0x97, 0x1c, 0xff, + 0xc6, 0x8a, 0xe3, 0xef, 0x42, 0x53, 0x3b, 0x19, 0xf8, 0xfa, 0xd0, 0x55, 0x83, 0xb2, 0xa9, 0xc4, + 0x93, 0xbc, 0x96, 0x1c, 0x97, 0xe2, 0xd9, 0xba, 0xb2, 0x78, 0xea, 0x6e, 0x56, 0x3c, 0xff, 0x59, + 0x83, 0xb5, 0x11, 0xc1, 0x3c, 0x3a, 0xbe, 0x7e, 0xf0, 0x36, 0xa1, 0xce, 0xc9, 0xc9, 0x54, 0xdb, + 0x4c, 0x63, 0xba, 0xe2, 0xea, 0x25, 0x2b, 0xae, 0x5d, 0x41, 0xf0, 0xea, 0x2b, 0x04, 0xaf, 0x0f, + 0xd5, 0x58, 0x24, 0x3a, 0x60, 0xed, 0x40, 0x7d, 0x2a, 0x99, 0xca, 0x13, 0x1c, 0x91, 0x63, 0x96, + 0xc4, 0x84, 0x87, 0x13, 0xce, 0x0a, 0x23, 0x53, 0xdd, 0xa0, 0x3f, 0x67, 0x38, 0x50, 0x38, 0x7a, + 0x08, 0xad, 0x58, 0x24, 0xa1, 0x3c, 0xcb, 0x89, 0xdb, 0xda, 0x72, 0xb6, 0x7b, 0x17, 0x2c, 0xd3, + 0x17, 0xc9, 0x8b, 0xb3, 0x9c, 0x04, 0xcd, 0xd8, 0x7c, 0xa0, 0x8f, 0x61, 0x53, 0x10, 0x4e, 0x71, + 0x42, 0xdf, 0x90, 0x38, 0x24, 0xaf, 0x73, 0x1e, 0xe6, 0x09, 0xce, 0xdc, 0xb6, 0x1e, 0x08, 0xcd, + 0x6c, 0x8f, 0x5f, 0xe7, 0xfc, 0x30, 0xc1, 0x19, 0xda, 0x86, 0x3e, 0x2b, 0x64, 0x5e, 0xc8, 0x50, + 0xef, 0x9b, 0x08, 0x69, 0xec, 0x82, 0x5e, 0x51, 0xcf, 0xe0, 0x4f, 0x34, 0x3c, 0x88, 0x2f, 0x52, + 0xe6, 0xee, 0xdb, 0x29, 0xf3, 0xda, 0x6a, 0x65, 0x46, 0x3d, 0xa8, 0x64, 0x27, 0x6e, 0x4f, 0xc7, + 0xbb, 0x92, 0x9d, 0xa8, 0xdd, 0x91, 0x2c, 0x7f, 0xe9, 0xae, 0x9b, 0xdd, 0x51, 0xdf, 0xe8, 0x7d, + 0x80, 0x94, 0x48, 0x4e, 0x23, 0xb5, 0x56, 0xb7, 0xaf, 0x83, 0x3b, 0x87, 0xa0, 0xef, 0xc2, 0x1a, + 0x9d, 0x64, 0x8c, 0x93, 0x03, 0xce, 0x5e, 0xd1, 0x6c, 0xe2, 0x6e, 0x6c, 0x39, 0xdb, 0xad, 0x60, + 0x11, 0x44, 0x77, 0xa0, 0x55, 0x08, 0x55, 0xcc, 0xa4, 0xc4, 0x45, 0xda, 0xc7, 0xb4, 0xed, 0xfd, + 0x63, 0x2e, 0xdb, 0x44, 0x91, 0x48, 0xf1, 0xbf, 0xba, 0x17, 0xa6, 0x29, 0x5a, 0x9d, 0x4f, 0xd1, + 0xfb, 0xd0, 0x31, 0xcb, 0x33, 0xa9, 0x50, 0x3b, 0xb7, 0xe2, 0xfb, 0xd0, 0xc9, 0x8a, 0x34, 0x3c, + 0x29, 0x08, 0xa7, 0x44, 0xd8, 0xc3, 0x0b, 0x59, 0x91, 0x3e, 0x37, 0x08, 0xba, 0x01, 0x75, 0xc9, + 0xf2, 0xf0, 0xa5, 0x3d, 0xbb, 0x2a, 0x8e, 0x9f, 0xa3, 0x9f, 0xc2, 0x1d, 0x41, 0x70, 0x42, 0xe2, + 0x50, 0x90, 0x49, 0x4a, 0x32, 0x39, 0xf0, 0x45, 0x28, 0xf4, 0xb2, 0x49, 0xec, 0x36, 0xf5, 0xee, + 0xbb, 0x86, 0x31, 0x9a, 0x12, 0x46, 0xd6, 0xae, 0xf2, 0x20, 0x32, 0x45, 0xda, 0x42, 0xb7, 0x96, + 0xae, 0x66, 0xd0, 0xcc, 0x34, 0xed, 0xf0, 0x13, 0x70, 0x27, 0x09, 0x1b, 0xe3, 0x24, 0x3c, 0x37, + 0xaa, 0xdb, 0xd6, 0x83, 0xdd, 0x32, 0xf6, 0xd1, 0xd2, 0x90, 0x6a, 0x79, 0x22, 0xa1, 0x11, 0x89, + 0xc3, 0x71, 0xc2, 0xc6, 0x2e, 0xe8, 0x2c, 0x06, 0x03, 0xed, 0x25, 0x6c, 0xac, 0xb2, 0xd7, 0x12, + 0x54, 0x18, 0x22, 0x56, 0x64, 0xd2, 0xed, 0xe8, 0x95, 0xf6, 0x0c, 0xfe, 0xac, 0x48, 0xf7, 0x15, + 0x8a, 0xbe, 0x03, 0x6b, 0x96, 0xc9, 0x8e, 0x8e, 0x04, 0x91, 0x3a, 0x6f, 0xab, 0x41, 0xd7, 0x80, + 0xbf, 0xd0, 0x18, 0x3a, 0x54, 0x62, 0x2a, 0xe4, 0xa3, 0xc9, 0x84, 0x93, 0x09, 0x56, 0x87, 0x59, + 0xe7, 0x6b, 0x67, 0xf7, 0xfb, 0x0f, 0x56, 0x56, 0xc3, 0x0f, 0xf6, 0x17, 0xd9, 0xc1, 0x72, 0x77, + 0xef, 0x04, 0xd6, 0x97, 0x38, 0x4a, 0x3f, 0xb8, 0xad, 0x3a, 0x54, 0xfa, 0xdb, 0x92, 0x73, 0x01, + 0x43, 0x5b, 0xd0, 0x11, 0x84, 0x9f, 0xd2, 0xc8, 0x50, 0x8c, 0x6e, 0xcd, 0x43, 0x4a, 0x77, 0x25, + 0x93, 0x38, 0x79, 0xf6, 0xdc, 0xa6, 0x4c, 0xd9, 0xf4, 0x7e, 0x5b, 0x87, 0xf5, 0x40, 0xa5, 0x08, + 0x39, 0x25, 0xdf, 0x24, 0xcd, 0xbc, 0x48, 0xbb, 0x1a, 0x6f, 0xa5, 0x5d, 0xcd, 0x95, 0xda, 0xf5, + 0x3d, 0xe8, 0xa5, 0xa7, 0x51, 0x34, 0xa7, 0x43, 0x2d, 0xad, 0x43, 0x6b, 0x0a, 0xfd, 0xb7, 0xc5, + 0x67, 0xfb, 0xed, 0x24, 0x0e, 0x2e, 0x90, 0xb8, 0x4d, 0xa8, 0x27, 0x34, 0xa5, 0x65, 0x86, 0x9a, + 0xc6, 0x79, 0xd1, 0xea, 0xae, 0x12, 0xad, 0xdb, 0xd0, 0xa2, 0xc2, 0x26, 0xf8, 0x9a, 0x26, 0x34, + 0xa9, 0x30, 0x99, 0xfd, 0x18, 0xee, 0x53, 0x49, 0xb8, 0x4e, 0xae, 0x90, 0xbc, 0x96, 0x24, 0x13, + 0xea, 0x8b, 0x93, 0xb8, 0x88, 0x48, 0xc8, 0xb1, 0x24, 0x56, 0x56, 0xef, 0x4d, 0x69, 0x8f, 0x4b, + 0x56, 0xa0, 0x49, 0x01, 0x96, 0x64, 0x41, 0x16, 0xd7, 0x17, 0x65, 0x11, 0xed, 0xc0, 0xa6, 0x75, + 0x27, 0x94, 0x9a, 0x1c, 0x31, 0x1e, 0x8e, 0x89, 0x90, 0x5a, 0x82, 0x5b, 0xc1, 0x86, 0xb1, 0x8d, + 0x24, 0xcb, 0x9f, 0x30, 0xbe, 0xa7, 0x9e, 0x6d, 0x5f, 0x55, 0xe7, 0x73, 0xf0, 0x6b, 0xa0, 0xa4, + 0x1f, 0x42, 0x95, 0xc6, 0xa6, 0x38, 0xeb, 0xec, 0xba, 0x8b, 0x7e, 0xec, 0x1b, 0x76, 0xe0, 0x8b, + 0x40, 0x91, 0xd0, 0xcf, 0xa1, 0x63, 0xf3, 0x29, 0xc6, 0x12, 0xeb, 0x5c, 0xed, 0xec, 0xbe, 0xbf, + 0xb2, 0x8f, 0x4e, 0x30, 0x1f, 0x4b, 0x1c, 0x98, 0xe2, 0x4a, 0xa8, 0x6f, 0xf4, 0x33, 0xb8, 0x7b, + 0x5e, 0x5f, 0xb9, 0x0d, 0x47, 0xec, 0x36, 0x74, 0x8a, 0xde, 0x5e, 0x16, 0xd8, 0x32, 0x5e, 0x31, + 0xfa, 0x31, 0x6c, 0xce, 0x29, 0xec, 0xac, 0x63, 0x53, 0x4b, 0xec, 0x9c, 0xfa, 0xce, 0xba, 0x5c, + 0xa6, 0xb1, 0xad, 0x4b, 0x35, 0xf6, 0x3f, 0xaf, 0x79, 0x5f, 0x39, 0xd0, 0x1e, 0x32, 0x1c, 0xeb, + 0x92, 0xf7, 0x1a, 0xdb, 0x7e, 0x0f, 0xda, 0xd3, 0xd9, 0x5b, 0xf9, 0x99, 0x01, 0xca, 0x3a, 0xad, + 0x5a, 0x6d, 0xa9, 0x3b, 0x57, 0xc6, 0xce, 0x95, 0xa3, 0xb5, 0xc5, 0x72, 0xf4, 0x3e, 0x74, 0xa8, + 0x9a, 0x50, 0x98, 0x63, 0x79, 0x6c, 0x14, 0xa8, 0x1d, 0x80, 0x86, 0x0e, 0x15, 0xa2, 0xea, 0xd5, + 0x92, 0xa0, 0xeb, 0xd5, 0xc6, 0x95, 0xeb, 0x55, 0xeb, 0x44, 0xd7, 0xab, 0xbf, 0x73, 0x00, 0xf4, + 0xc2, 0x55, 0x5a, 0x9e, 0x77, 0xea, 0x5c, 0xc7, 0xa9, 0x92, 0x46, 0x75, 0xbf, 0x71, 0x92, 0x60, + 0x39, 0xdb, 0x5b, 0x61, 0x83, 0x83, 0xb2, 0x22, 0x0d, 0x8c, 0xc9, 0xee, 0xab, 0xf0, 0xfe, 0xe0, + 0x00, 0xe8, 0xe4, 0x34, 0xd3, 0x58, 0xd6, 0x68, 0xe7, 0xf2, 0x4a, 0xbe, 0xb2, 0x18, 0xba, 0xbd, + 0x32, 0x74, 0x97, 0x3c, 0x5d, 0xa7, 0xe9, 0x31, 0x5b, 0xbc, 0x8d, 0xae, 0xfe, 0xf6, 0xfe, 0xe8, + 0x40, 0xd7, 0xce, 0xce, 0x4c, 0x69, 0x61, 0x97, 0x9d, 0xe5, 0x5d, 0xd6, 0x95, 0x4f, 0xca, 0xf8, + 0x59, 0x28, 0xe8, 0x9b, 0xf2, 0x02, 0x04, 0x03, 0x8d, 0xe8, 0x1b, 0xa2, 0x04, 0x51, 0x87, 0x84, + 0xbd, 0x12, 0xe5, 0x05, 0xa8, 0xc2, 0xc0, 0x5e, 0x09, 0x25, 0xca, 0x9c, 0x44, 0x24, 0x93, 0xc9, + 0x59, 0x98, 0xb2, 0x98, 0x1e, 0x51, 0x12, 0xeb, 0x6c, 0x68, 0x05, 0xfd, 0xd2, 0xf0, 0xd4, 0xe2, + 0xde, 0x97, 0xea, 0x5d, 0x6d, 0x0e, 0x54, 0xf9, 0xe3, 0xea, 0xa9, 0x98, 0x5c, 0x23, 0x6b, 0x55, + 0x88, 0x8d, 0x1f, 0x95, 0x88, 0xe6, 0x5f, 0x51, 0x3b, 0x58, 0xc0, 0x54, 0x01, 0x3b, 0xbd, 0x26, + 0x4c, 0x1c, 0x6b, 0xc1, 0x1c, 0xa2, 0x66, 0x1e, 0x93, 0x23, 0x5c, 0x24, 0xf3, 0xd7, 0x49, 0xcd, + 0x5c, 0x27, 0xd6, 0xb0, 0xf0, 0x2f, 0xa3, 0xb7, 0xcf, 0x49, 0x4c, 0x32, 0x49, 0x71, 0xa2, 0xff, + 0x90, 0xcd, 0x6b, 0xb8, 0xb3, 0xa4, 0xe1, 0x1f, 0x01, 0x22, 0x59, 0xc4, 0xcf, 0x72, 0x95, 0x41, + 0x39, 0x16, 0xe2, 0x15, 0xe3, 0xb1, 0x7d, 0x4c, 0x6e, 0x4c, 0x2d, 0x87, 0xd6, 0x80, 0x6e, 0x41, + 0x43, 0x92, 0x0c, 0x67, 0xd2, 0x9e, 0x31, 0xdb, 0xb2, 0x17, 0x91, 0x28, 0x72, 0xc2, 0x6d, 0x4c, + 0x9b, 0x54, 0x8c, 0x54, 0x53, 0x3d, 0x45, 0xc5, 0x31, 0xde, 0xfd, 0xf4, 0xb3, 0x99, 0xfb, 0xba, + 0x79, 0x8a, 0x1a, 0xb8, 0xf4, 0xed, 0x3d, 0x86, 0x8d, 0x21, 0x15, 0xf2, 0x90, 0x25, 0x34, 0x3a, + 0xbb, 0x76, 0x89, 0xe2, 0xfd, 0xde, 0x01, 0x34, 0xef, 0xc7, 0xfe, 0xc9, 0x99, 0xdd, 0x1a, 0xce, + 0xd5, 0x6f, 0x8d, 0x0f, 0xa0, 0x9b, 0x6b, 0x37, 0x21, 0xcd, 0x8e, 0x58, 0xb9, 0x7b, 0x1d, 0x83, + 0xa9, 0xd8, 0x0a, 0xf5, 0x80, 0x56, 0xc1, 0x0c, 0x39, 0x4b, 0x88, 0xd9, 0xbc, 0x76, 0xd0, 0x56, + 0x48, 0xa0, 0x00, 0x6f, 0x02, 0xb7, 0x47, 0xc7, 0xec, 0xd5, 0x3e, 0xcb, 0x8e, 0xe8, 0xa4, 0x30, + 0xf7, 0xec, 0x3b, 0xfc, 0x91, 0x70, 0xa1, 0x99, 0x63, 0xa9, 0xce, 0x94, 0xdd, 0xa3, 0xb2, 0xe9, + 0xfd, 0xc9, 0x81, 0x3b, 0xab, 0x46, 0x7a, 0x97, 0xe5, 0x1f, 0xc0, 0x5a, 0x64, 0xdc, 0x19, 0x6f, + 0x57, 0xff, 0xd3, 0xb9, 0xd8, 0xcf, 0x7b, 0x0c, 0x35, 0x5d, 0x4d, 0xec, 0x40, 0x85, 0x4b, 0x3d, + 0x83, 0xde, 0xee, 0xfd, 0x0b, 0x94, 0x42, 0x11, 0xf5, 0xf3, 0xb5, 0xc2, 0x25, 0xea, 0x82, 0xc3, + 0xf5, 0x4a, 0x9d, 0xc0, 0xe1, 0x1f, 0xfe, 0xcd, 0x81, 0x56, 0x69, 0x46, 0x1b, 0xb0, 0xe6, 0xfb, + 0xc3, 0xfd, 0xa9, 0x56, 0xf5, 0xbf, 0x85, 0xfa, 0xd0, 0xf5, 0xfd, 0xe1, 0x61, 0x59, 0x3e, 0xf6, + 0x1d, 0xd4, 0x85, 0x96, 0xef, 0x0f, 0xb5, 0xf8, 0xf4, 0x2b, 0xb6, 0xf5, 0x24, 0x29, 0xc4, 0x71, + 0xbf, 0x3a, 0x75, 0x90, 0xe6, 0xd8, 0x38, 0xa8, 0xa1, 0x35, 0x68, 0xfb, 0x4f, 0x87, 0x83, 0x4c, + 0x10, 0x2e, 0xfb, 0x75, 0xdb, 0xf4, 0x49, 0x42, 0x24, 0xe9, 0x37, 0xd0, 0x3a, 0x74, 0xfc, 0xa7, + 0xc3, 0xbd, 0x22, 0x79, 0xa9, 0xee, 0xb1, 0x7e, 0x53, 0xdb, 0x9f, 0x0f, 0xcd, 0x8b, 0xa6, 0xdf, + 0xd2, 0xee, 0x9f, 0x0f, 0xd5, 0x1b, 0xeb, 0xac, 0xdf, 0xb6, 0x9d, 0x7f, 0x99, 0x6b, 0x5f, 0xb0, + 0xf7, 0xf0, 0xd7, 0x9f, 0x4e, 0xa8, 0x3c, 0x2e, 0xc6, 0x2a, 0x5e, 0x3b, 0x66, 0xe9, 0x1f, 0x51, + 0x66, 0xbf, 0x76, 0xca, 0xe5, 0xef, 0xe8, 0x68, 0x4c, 0x9b, 0xf9, 0x78, 0xdc, 0xd0, 0xc8, 0x27, + 0xff, 0x0a, 0x00, 0x00, 0xff, 0xff, 0x39, 0x3a, 0x8f, 0x34, 0x8a, 0x17, 0x00, 0x00, } diff --git a/internal/proto/planpb/plan.pb.go b/internal/proto/planpb/plan.pb.go index 2edfb4c927..06de0040e9 100644 --- a/internal/proto/planpb/plan.pb.go +++ b/internal/proto/planpb/plan.pb.go @@ -237,7 +237,6 @@ func (BinaryExpr_BinaryOp) EnumDescriptor() ([]byte, []int) { type GenericValue struct { // Types that are valid to be assigned to Val: - // // *GenericValue_BoolVal // *GenericValue_Int64Val // *GenericValue_FloatVal @@ -1298,7 +1297,6 @@ var xxx_messageInfo_AlwaysTrueExpr proto.InternalMessageInfo type Expr struct { // Types that are valid to be assigned to Expr: - // // *Expr_TermExpr // *Expr_UnaryExpr // *Expr_BinaryExpr @@ -1670,7 +1668,6 @@ func (m *QueryPlanNode) GetLimit() int64 { type PlanNode struct { // Types that are valid to be assigned to Node: - // // *PlanNode_VectorAnns // *PlanNode_Predicates // *PlanNode_Query diff --git a/internal/proto/proxypb/proxy.pb.go b/internal/proto/proxypb/proxy.pb.go index c5cf24fd78..60ba4e6a11 100644 --- a/internal/proto/proxypb/proxy.pb.go +++ b/internal/proto/proxypb/proxy.pb.go @@ -29,9 +29,8 @@ const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package type InvalidateCollMetaCacheRequest struct { // MsgType: - // - // DropCollection -> {meta cache, dml channels} - // Other -> {meta cache} + // DropCollection -> {meta cache, dml channels} + // Other -> {meta cache} Base *commonpb.MsgBase `protobuf:"bytes,1,opt,name=base,proto3" json:"base,omitempty"` DbName string `protobuf:"bytes,2,opt,name=db_name,json=dbName,proto3" json:"db_name,omitempty"` CollectionName string `protobuf:"bytes,3,opt,name=collection_name,json=collectionName,proto3" json:"collection_name,omitempty"` diff --git a/internal/proto/query_coord.proto b/internal/proto/query_coord.proto index 3d78ff01d6..868674cc6a 100644 --- a/internal/proto/query_coord.proto +++ b/internal/proto/query_coord.proto @@ -270,6 +270,7 @@ message FieldIndexInfo { int64 index_size = 8; int64 index_version = 9; int64 num_rows = 10; + string index_engine_version = 11; } enum LoadScope { diff --git a/internal/proto/querypb/query_coord.pb.go b/internal/proto/querypb/query_coord.pb.go index b8e7005d85..4b5be2890f 100644 --- a/internal/proto/querypb/query_coord.pb.go +++ b/internal/proto/querypb/query_coord.pb.go @@ -1771,6 +1771,7 @@ type FieldIndexInfo struct { IndexSize int64 `protobuf:"varint,8,opt,name=index_size,json=indexSize,proto3" json:"index_size,omitempty"` IndexVersion int64 `protobuf:"varint,9,opt,name=index_version,json=indexVersion,proto3" json:"index_version,omitempty"` NumRows int64 `protobuf:"varint,10,opt,name=num_rows,json=numRows,proto3" json:"num_rows,omitempty"` + IndexEngineVersion string `protobuf:"bytes,11,opt,name=index_engine_version,json=indexEngineVersion,proto3" json:"index_engine_version,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -1871,6 +1872,13 @@ func (m *FieldIndexInfo) GetNumRows() int64 { return 0 } +func (m *FieldIndexInfo) GetIndexEngineVersion() string { + if m != nil { + return m.IndexEngineVersion + } + return "" +} + type LoadSegmentsRequest struct { Base *commonpb.MsgBase `protobuf:"bytes,1,opt,name=base,proto3" json:"base,omitempty"` DstNodeID int64 `protobuf:"varint,2,opt,name=dst_nodeID,json=dstNodeID,proto3" json:"dst_nodeID,omitempty"` @@ -4574,307 +4582,308 @@ func init() { func init() { proto.RegisterFile("query_coord.proto", fileDescriptor_aab7cc9a69ed26e8) } var fileDescriptor_aab7cc9a69ed26e8 = []byte{ - // 4789 bytes of a gzipped FileDescriptorProto + // 4809 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x3c, 0x4b, 0x6f, 0x1c, 0x47, - 0x7a, 0xea, 0x79, 0x71, 0xe6, 0x9b, 0x57, 0xb3, 0x48, 0x4a, 0xb3, 0xb3, 0x92, 0x2c, 0xb7, 0xfc, - 0xe0, 0xca, 0x36, 0xa5, 0xa5, 0xd6, 0x5e, 0xed, 0xda, 0x86, 0x23, 0x91, 0x96, 0xcc, 0xb5, 0x4d, - 0x33, 0x4d, 0xca, 0x1b, 0x78, 0xbd, 0x3b, 0x6e, 0x4e, 0x17, 0x87, 0x0d, 0xf5, 0x63, 0xd4, 0xdd, - 0x43, 0x9a, 0x0e, 0x10, 0xe4, 0x90, 0x4b, 0x36, 0xd9, 0x20, 0x48, 0x0e, 0xc9, 0x21, 0xc8, 0x21, - 0x41, 0x80, 0x4d, 0x90, 0x5c, 0x82, 0x04, 0xc8, 0x21, 0x87, 0xdc, 0x72, 0xca, 0xeb, 0x94, 0x3f, - 0x90, 0xdc, 0x02, 0xe4, 0x92, 0x45, 0xe0, 0x5b, 0x50, 0x8f, 0x7e, 0x54, 0x77, 0x0d, 0xa7, 0xc9, - 0x91, 0xd6, 0x76, 0xb0, 0xb7, 0xe9, 0xaf, 0x1e, 0xdf, 0x57, 0x5f, 0x7d, 0xef, 0xaa, 0x1a, 0x58, - 0x7c, 0x3c, 0xc1, 0xfe, 0xc9, 0x60, 0xe8, 0x79, 0xbe, 0xb9, 0x36, 0xf6, 0xbd, 0xd0, 0x43, 0xc8, - 0xb1, 0xec, 0xa3, 0x49, 0xc0, 0xbe, 0xd6, 0x68, 0x7b, 0xbf, 0x35, 0xf4, 0x1c, 0xc7, 0x73, 0x19, - 0xac, 0xdf, 0x4a, 0xf7, 0xe8, 0x77, 0x2c, 0x37, 0xc4, 0xbe, 0x6b, 0xd8, 0x51, 0x6b, 0x30, 0x3c, - 0xc4, 0x8e, 0xc1, 0xbf, 0x1a, 0x4e, 0x30, 0xe2, 0x3f, 0x55, 0xd3, 0x08, 0x8d, 0x34, 0xaa, 0xfe, - 0xa2, 0xe5, 0x9a, 0xf8, 0xd3, 0x34, 0x48, 0xfb, 0x0d, 0x05, 0x2e, 0xee, 0x1e, 0x7a, 0xc7, 0x1b, - 0x9e, 0x6d, 0xe3, 0x61, 0x68, 0x79, 0x6e, 0xa0, 0xe3, 0xc7, 0x13, 0x1c, 0x84, 0xe8, 0x16, 0x54, - 0xf6, 0x8d, 0x00, 0xf7, 0x94, 0x6b, 0xca, 0x6a, 0x73, 0xfd, 0xf2, 0x9a, 0x40, 0x27, 0x27, 0xf0, - 0xfd, 0x60, 0x74, 0xcf, 0x08, 0xb0, 0x4e, 0x7b, 0x22, 0x04, 0x15, 0x73, 0x7f, 0x6b, 0xb3, 0x57, - 0xba, 0xa6, 0xac, 0x96, 0x75, 0xfa, 0x1b, 0x3d, 0x07, 0xed, 0x61, 0x3c, 0xf7, 0xd6, 0x66, 0xd0, - 0x2b, 0x5f, 0x2b, 0xaf, 0x96, 0x75, 0x11, 0xa8, 0xfd, 0xb8, 0x04, 0x97, 0x72, 0x64, 0x04, 0x63, - 0xcf, 0x0d, 0x30, 0xba, 0x0d, 0xb5, 0x20, 0x34, 0xc2, 0x49, 0xc0, 0x29, 0xf9, 0xba, 0x94, 0x92, - 0x5d, 0xda, 0x45, 0xe7, 0x5d, 0xf3, 0x68, 0x4b, 0x12, 0xb4, 0xe8, 0x9b, 0xb0, 0x6c, 0xb9, 0xef, - 0x63, 0xc7, 0xf3, 0x4f, 0x06, 0x63, 0xec, 0x0f, 0xb1, 0x1b, 0x1a, 0x23, 0x1c, 0xd1, 0xb8, 0x14, - 0xb5, 0xed, 0x24, 0x4d, 0xe8, 0x35, 0xb8, 0xc4, 0xf6, 0x30, 0xc0, 0xfe, 0x91, 0x35, 0xc4, 0x03, - 0xe3, 0xc8, 0xb0, 0x6c, 0x63, 0xdf, 0xc6, 0xbd, 0xca, 0xb5, 0xf2, 0x6a, 0x5d, 0x5f, 0xa1, 0xcd, - 0xbb, 0xac, 0xf5, 0x6e, 0xd4, 0x88, 0xbe, 0x01, 0xaa, 0x8f, 0x0f, 0x7c, 0x1c, 0x1c, 0x0e, 0xc6, - 0xbe, 0x37, 0xf2, 0x71, 0x10, 0xf4, 0xaa, 0x14, 0x4d, 0x97, 0xc3, 0x77, 0x38, 0x58, 0xfb, 0x33, - 0x05, 0x56, 0x08, 0x33, 0x76, 0x0c, 0x3f, 0xb4, 0x9e, 0xc2, 0x96, 0x68, 0xd0, 0x4a, 0xb3, 0xa1, - 0x57, 0xa6, 0x6d, 0x02, 0x8c, 0xf4, 0x19, 0x47, 0xe8, 0x09, 0xfb, 0x2a, 0x94, 0x54, 0x01, 0xa6, - 0xfd, 0x0b, 0x97, 0x9d, 0x34, 0x9d, 0xf3, 0xec, 0x59, 0x16, 0x67, 0x29, 0x8f, 0xf3, 0x3c, 0x3b, - 0x26, 0xe3, 0x7c, 0x45, 0xce, 0xf9, 0x7f, 0x2a, 0xc3, 0xca, 0x7b, 0x9e, 0x61, 0x26, 0x62, 0xf8, - 0xf3, 0xe7, 0xfc, 0x9b, 0x50, 0x63, 0x1a, 0xdd, 0xab, 0x50, 0x5c, 0xcf, 0x8b, 0xb8, 0xb8, 0xb6, - 0x27, 0x14, 0xee, 0x52, 0x80, 0xce, 0x07, 0xa1, 0xe7, 0xa1, 0xe3, 0xe3, 0xb1, 0x6d, 0x0d, 0x8d, - 0x81, 0x3b, 0x71, 0xf6, 0xb1, 0xdf, 0xab, 0x5e, 0x53, 0x56, 0xab, 0x7a, 0x9b, 0x43, 0xb7, 0x29, - 0x10, 0x7d, 0x02, 0xed, 0x03, 0x0b, 0xdb, 0xe6, 0x80, 0x9a, 0x84, 0xad, 0xcd, 0x5e, 0xed, 0x5a, - 0x79, 0xb5, 0xb9, 0xfe, 0xfa, 0x5a, 0xde, 0x1a, 0xad, 0x49, 0x39, 0xb2, 0x76, 0x9f, 0x0c, 0xdf, - 0x62, 0xa3, 0xdf, 0x76, 0x43, 0xff, 0x44, 0x6f, 0x1d, 0xa4, 0x40, 0xa8, 0x07, 0x0b, 0x9c, 0xbd, - 0xbd, 0x85, 0x6b, 0xca, 0x6a, 0x5d, 0x8f, 0x3e, 0xd1, 0x8b, 0xd0, 0xf5, 0x71, 0xe0, 0x4d, 0xfc, - 0x21, 0x1e, 0x8c, 0x7c, 0x6f, 0x32, 0x0e, 0x7a, 0xf5, 0x6b, 0xe5, 0xd5, 0x86, 0xde, 0x89, 0xc0, - 0x0f, 0x28, 0xb4, 0xff, 0x16, 0x2c, 0xe6, 0xb0, 0x20, 0x15, 0xca, 0x8f, 0xf0, 0x09, 0xdd, 0x88, - 0xb2, 0x4e, 0x7e, 0xa2, 0x65, 0xa8, 0x1e, 0x19, 0xf6, 0x04, 0x73, 0x56, 0xb3, 0x8f, 0xef, 0x96, - 0xee, 0x28, 0xda, 0x1f, 0x29, 0xd0, 0xd3, 0xb1, 0x8d, 0x8d, 0x00, 0x7f, 0x91, 0x5b, 0x7a, 0x11, - 0x6a, 0xae, 0x67, 0xe2, 0xad, 0x4d, 0xba, 0xa5, 0x65, 0x9d, 0x7f, 0x69, 0x9f, 0x2b, 0xb0, 0xfc, - 0x00, 0x87, 0x44, 0x0d, 0xac, 0x20, 0xb4, 0x86, 0xb1, 0x9e, 0xbf, 0x09, 0x65, 0x1f, 0x3f, 0xe6, - 0x94, 0xbd, 0x24, 0x52, 0x16, 0x9b, 0x7f, 0xd9, 0x48, 0x9d, 0x8c, 0x43, 0xcf, 0x42, 0xcb, 0x74, - 0xec, 0xc1, 0xf0, 0xd0, 0x70, 0x5d, 0x6c, 0x33, 0x45, 0x6a, 0xe8, 0x4d, 0xd3, 0xb1, 0x37, 0x38, - 0x08, 0x5d, 0x05, 0x08, 0xf0, 0xc8, 0xc1, 0x6e, 0x98, 0xd8, 0xe4, 0x14, 0x04, 0xdd, 0x80, 0xc5, - 0x03, 0xdf, 0x73, 0x06, 0xc1, 0xa1, 0xe1, 0x9b, 0x03, 0x1b, 0x1b, 0x26, 0xf6, 0x29, 0xf5, 0x75, - 0xbd, 0x4b, 0x1a, 0x76, 0x09, 0xfc, 0x3d, 0x0a, 0x46, 0xb7, 0xa1, 0x1a, 0x0c, 0xbd, 0x31, 0xa6, - 0x92, 0xd6, 0x59, 0xbf, 0x22, 0x93, 0xa1, 0x4d, 0x23, 0x34, 0x76, 0x49, 0x27, 0x9d, 0xf5, 0xd5, - 0xfe, 0xae, 0xc2, 0x54, 0xed, 0x4b, 0x6e, 0xe4, 0x52, 0xea, 0x58, 0x7d, 0x32, 0xea, 0x58, 0x2b, - 0xa4, 0x8e, 0x0b, 0xa7, 0xab, 0x63, 0x8e, 0x6b, 0x67, 0x51, 0xc7, 0xfa, 0x4c, 0x75, 0x6c, 0xc8, - 0xd4, 0x11, 0xbd, 0x0d, 0x5d, 0x16, 0x40, 0x58, 0xee, 0x81, 0x37, 0xb0, 0xad, 0x20, 0xec, 0x01, - 0x25, 0xf3, 0x4a, 0x56, 0x42, 0x4d, 0xfc, 0xe9, 0x1a, 0x43, 0xec, 0x1e, 0x78, 0x7a, 0xdb, 0x8a, - 0x7e, 0xbe, 0x67, 0x05, 0xe1, 0xfc, 0x5a, 0xfd, 0x0f, 0x89, 0x56, 0x7f, 0xd9, 0xa5, 0x27, 0xd1, - 0xfc, 0xaa, 0xa0, 0xf9, 0x7f, 0xae, 0xc0, 0xd7, 0x1e, 0xe0, 0x30, 0x26, 0x9f, 0x28, 0x32, 0xfe, - 0x92, 0xba, 0xf9, 0xbf, 0x52, 0xa0, 0x2f, 0xa3, 0x75, 0x1e, 0x57, 0xff, 0x11, 0x5c, 0x8c, 0x71, - 0x0c, 0x4c, 0x1c, 0x0c, 0x7d, 0x6b, 0x4c, 0xb7, 0x91, 0xda, 0xaa, 0xe6, 0xfa, 0x75, 0x99, 0xe0, - 0x67, 0x29, 0x58, 0x89, 0xa7, 0xd8, 0x4c, 0xcd, 0xa0, 0xfd, 0x44, 0x81, 0x15, 0x62, 0x1b, 0xb9, - 0x31, 0x23, 0x12, 0x78, 0x6e, 0xbe, 0x8a, 0x66, 0xb2, 0x94, 0x33, 0x93, 0x05, 0x78, 0x4c, 0x43, - 0xec, 0x2c, 0x3d, 0xf3, 0xf0, 0xee, 0x55, 0xa8, 0x12, 0x05, 0x8c, 0x58, 0xf5, 0x8c, 0x8c, 0x55, - 0x69, 0x64, 0xac, 0xb7, 0xe6, 0x32, 0x2a, 0x12, 0xbb, 0x3d, 0x87, 0xb8, 0x65, 0x97, 0x5d, 0x92, - 0x2c, 0xfb, 0xb7, 0x15, 0xb8, 0x94, 0x43, 0x38, 0xcf, 0xba, 0xdf, 0x80, 0x1a, 0xf5, 0x46, 0xd1, - 0xc2, 0x9f, 0x93, 0x2e, 0x3c, 0x85, 0x8e, 0x58, 0x1b, 0x9d, 0x8f, 0xd1, 0x3c, 0x50, 0xb3, 0x6d, - 0xc4, 0x4f, 0x72, 0x1f, 0x39, 0x70, 0x0d, 0x87, 0x31, 0xa0, 0xa1, 0x37, 0x39, 0x6c, 0xdb, 0x70, - 0x30, 0xfa, 0x1a, 0xd4, 0x89, 0xca, 0x0e, 0x2c, 0x33, 0xda, 0xfe, 0x05, 0xaa, 0xc2, 0x66, 0x80, - 0xae, 0x00, 0xd0, 0x26, 0xc3, 0x34, 0x7d, 0xe6, 0x42, 0x1b, 0x7a, 0x83, 0x40, 0xee, 0x12, 0x80, - 0xf6, 0x87, 0x0a, 0x5c, 0xdd, 0x3d, 0x71, 0x87, 0xdb, 0xf8, 0x78, 0xc3, 0xc7, 0x46, 0x88, 0x13, - 0xa3, 0xfd, 0x54, 0x19, 0x8f, 0xae, 0x41, 0x33, 0xa5, 0xbf, 0x5c, 0x24, 0xd3, 0x20, 0xed, 0xaf, - 0x15, 0x68, 0x11, 0x2f, 0xf2, 0x3e, 0x0e, 0x0d, 0x22, 0x22, 0xe8, 0x3b, 0xd0, 0xb0, 0x3d, 0xc3, - 0x1c, 0x84, 0x27, 0x63, 0x46, 0x4d, 0x27, 0x4b, 0x4d, 0xe2, 0x7a, 0xf6, 0x4e, 0xc6, 0x58, 0xaf, - 0xdb, 0xfc, 0x57, 0x21, 0x8a, 0xb2, 0x56, 0xa6, 0x2c, 0xb1, 0x94, 0xcf, 0x40, 0xd3, 0xc1, 0xa1, - 0x6f, 0x0d, 0x19, 0x11, 0x15, 0xba, 0x15, 0xc0, 0x40, 0x04, 0x91, 0xf6, 0x93, 0x1a, 0x5c, 0xfc, - 0xbe, 0x11, 0x0e, 0x0f, 0x37, 0x9d, 0x28, 0x8a, 0x39, 0x3f, 0x1f, 0x13, 0xbb, 0x5c, 0x4a, 0xdb, - 0xe5, 0x27, 0x66, 0xf7, 0x63, 0x1d, 0xad, 0xca, 0x74, 0x94, 0x24, 0xe6, 0x6b, 0x1f, 0x72, 0x31, - 0x4b, 0xe9, 0x68, 0x2a, 0xd8, 0xa8, 0x9d, 0x27, 0xd8, 0xd8, 0x80, 0x36, 0xfe, 0x74, 0x68, 0x4f, - 0x88, 0xbc, 0x52, 0xec, 0x2c, 0x8a, 0xb8, 0x2a, 0xc1, 0x9e, 0x36, 0x10, 0x2d, 0x3e, 0x68, 0x8b, - 0xd3, 0xc0, 0x64, 0xc1, 0xc1, 0xa1, 0x41, 0x43, 0x85, 0xe6, 0xfa, 0xb5, 0x69, 0xb2, 0x10, 0x09, - 0x10, 0x93, 0x07, 0xf2, 0x85, 0x2e, 0x43, 0x83, 0x87, 0x36, 0x5b, 0x9b, 0xbd, 0x06, 0x65, 0x5f, - 0x02, 0x40, 0x06, 0xb4, 0xb9, 0xf5, 0xe4, 0x14, 0xb2, 0x00, 0xe2, 0x0d, 0x19, 0x02, 0xf9, 0x66, - 0xa7, 0x29, 0x0f, 0x78, 0xa0, 0x13, 0xa4, 0x40, 0x24, 0xf3, 0xf7, 0x0e, 0x0e, 0x6c, 0xcb, 0xc5, - 0xdb, 0x6c, 0x87, 0x9b, 0x94, 0x08, 0x11, 0x48, 0xc2, 0xa1, 0x23, 0xec, 0x07, 0x96, 0xe7, 0xf6, - 0x5a, 0xb4, 0x3d, 0xfa, 0x94, 0x45, 0x39, 0xed, 0x73, 0x44, 0x39, 0x03, 0x58, 0xcc, 0x51, 0x2a, - 0x89, 0x72, 0xbe, 0x95, 0x8e, 0x72, 0x66, 0x6f, 0x55, 0x2a, 0x0a, 0xfa, 0xa9, 0x02, 0x2b, 0x0f, - 0xdd, 0x60, 0xb2, 0x1f, 0xb3, 0xe8, 0x8b, 0x51, 0x87, 0xac, 0x11, 0xad, 0xe4, 0x8c, 0xa8, 0xf6, - 0x3f, 0x55, 0xe8, 0xf2, 0x55, 0x10, 0xa9, 0xa1, 0x26, 0xe7, 0x32, 0x34, 0x62, 0x3f, 0xca, 0x19, - 0x92, 0x00, 0xb2, 0x36, 0xac, 0x94, 0xb3, 0x61, 0x85, 0x48, 0x8b, 0xa2, 0xa2, 0x4a, 0x2a, 0x2a, - 0xba, 0x02, 0x70, 0x60, 0x4f, 0x82, 0xc3, 0x41, 0x68, 0x39, 0x98, 0x47, 0x65, 0x0d, 0x0a, 0xd9, - 0xb3, 0x1c, 0x8c, 0xee, 0x42, 0x6b, 0xdf, 0x72, 0x6d, 0x6f, 0x34, 0x18, 0x1b, 0xe1, 0x61, 0xc0, - 0xd3, 0x62, 0xd9, 0xb6, 0xd0, 0x18, 0xf6, 0x1e, 0xed, 0xab, 0x37, 0xd9, 0x98, 0x1d, 0x32, 0x04, - 0x5d, 0x85, 0xa6, 0x3b, 0x71, 0x06, 0xde, 0xc1, 0xc0, 0xf7, 0x8e, 0x03, 0x9a, 0xfc, 0x96, 0xf5, - 0x86, 0x3b, 0x71, 0x3e, 0x38, 0xd0, 0xbd, 0x63, 0xe2, 0xc7, 0x1a, 0xc4, 0xa3, 0x05, 0xb6, 0x37, - 0x62, 0x89, 0xef, 0xec, 0xf9, 0x93, 0x01, 0x64, 0xb4, 0x89, 0xed, 0xd0, 0xa0, 0xa3, 0x1b, 0xc5, - 0x46, 0xc7, 0x03, 0xd0, 0x0b, 0xd0, 0x19, 0x7a, 0xce, 0xd8, 0xa0, 0x1c, 0xba, 0xef, 0x7b, 0x0e, - 0x55, 0xc0, 0xb2, 0x9e, 0x81, 0xa2, 0x0d, 0x68, 0x26, 0x4a, 0x10, 0xf4, 0x9a, 0x14, 0x8f, 0x26, - 0xd3, 0xd2, 0x54, 0x28, 0x4f, 0x04, 0x14, 0x62, 0x2d, 0x08, 0x88, 0x64, 0x44, 0xca, 0x1e, 0x58, - 0x9f, 0x61, 0xae, 0x68, 0x4d, 0x0e, 0xdb, 0xb5, 0x3e, 0xc3, 0x24, 0x3d, 0xb2, 0xdc, 0x00, 0xfb, - 0x61, 0x94, 0xac, 0xf6, 0xda, 0x54, 0x7c, 0xda, 0x0c, 0xca, 0x05, 0x1b, 0x6d, 0x42, 0x27, 0x08, - 0x0d, 0x3f, 0x1c, 0x8c, 0xbd, 0x80, 0x0a, 0x40, 0xaf, 0x43, 0x65, 0x3b, 0xa3, 0x92, 0x4e, 0x30, - 0x22, 0x82, 0xbd, 0xc3, 0x3b, 0xe9, 0x6d, 0x3a, 0x28, 0xfa, 0x24, 0xb3, 0x50, 0x4e, 0x24, 0xb3, - 0x74, 0x0b, 0xcd, 0x42, 0x07, 0xc5, 0xb3, 0xac, 0x92, 0x74, 0xc9, 0x30, 0x8d, 0x7d, 0x1b, 0x7f, - 0xc8, 0x2d, 0x88, 0x4a, 0x17, 0x96, 0x05, 0x6b, 0xff, 0x5d, 0x82, 0x8e, 0xc8, 0x1e, 0x62, 0x76, - 0x58, 0x56, 0x16, 0xc9, 0x7c, 0xf4, 0x49, 0x98, 0x85, 0x5d, 0x32, 0x9a, 0xa5, 0x80, 0x54, 0xe4, - 0xeb, 0x7a, 0x93, 0xc1, 0xe8, 0x04, 0x44, 0x74, 0xd9, 0xa6, 0x50, 0x3d, 0x2b, 0x53, 0x46, 0x35, - 0x28, 0x84, 0x86, 0x2a, 0x3d, 0x58, 0x88, 0xb2, 0x47, 0x26, 0xf0, 0xd1, 0x27, 0x69, 0xd9, 0x9f, - 0x58, 0x14, 0x2b, 0x13, 0xf8, 0xe8, 0x13, 0x6d, 0x42, 0x8b, 0x4d, 0x39, 0x36, 0x7c, 0xc3, 0x89, - 0xc4, 0xfd, 0x59, 0xa9, 0xc9, 0x78, 0x17, 0x9f, 0x7c, 0x48, 0xac, 0xcf, 0x8e, 0x61, 0xf9, 0x3a, - 0x13, 0x8f, 0x1d, 0x3a, 0x0a, 0xad, 0x82, 0xca, 0x66, 0x39, 0xb0, 0x6c, 0xcc, 0x15, 0x67, 0x81, - 0xa5, 0x90, 0x14, 0x7e, 0xdf, 0xb2, 0x31, 0xd3, 0x8d, 0x78, 0x09, 0x54, 0x20, 0xea, 0x4c, 0x35, - 0x28, 0x84, 0x8a, 0xc3, 0x75, 0x60, 0x56, 0x74, 0x10, 0xd9, 0x66, 0xe6, 0x40, 0x18, 0x8d, 0x9c, - 0xad, 0x34, 0x24, 0x9b, 0x38, 0x4c, 0xb9, 0x80, 0x2d, 0xc7, 0x9d, 0x38, 0x44, 0xb5, 0xb4, 0xdf, - 0xab, 0xc2, 0x12, 0xb1, 0x30, 0xdc, 0xd8, 0xcc, 0x11, 0x20, 0x5c, 0x01, 0x30, 0x83, 0x70, 0x20, - 0x58, 0xc5, 0x86, 0x19, 0x84, 0xdc, 0x7d, 0x7c, 0x27, 0xf2, 0xef, 0xe5, 0xe9, 0xe9, 0x4a, 0xc6, - 0xe2, 0xe5, 0x7d, 0xfc, 0xb9, 0xea, 0x7b, 0xd7, 0xa1, 0xcd, 0x73, 0x75, 0x21, 0xb1, 0x6c, 0x31, - 0xe0, 0xb6, 0xdc, 0x6e, 0xd7, 0xa4, 0x75, 0xc6, 0x94, 0x9f, 0x5f, 0x98, 0xcf, 0xcf, 0xd7, 0xb3, - 0x7e, 0xfe, 0x3e, 0x74, 0x45, 0x55, 0x8b, 0x6c, 0xd5, 0x0c, 0x5d, 0xeb, 0x08, 0xba, 0x16, 0xa4, - 0xdd, 0x34, 0x88, 0x6e, 0xfa, 0x3a, 0xb4, 0x5d, 0x8c, 0xcd, 0x41, 0xe8, 0x1b, 0x6e, 0x70, 0x80, - 0x7d, 0xea, 0xe6, 0xeb, 0x7a, 0x8b, 0x00, 0xf7, 0x38, 0x0c, 0xbd, 0x01, 0x40, 0xd7, 0xc8, 0xca, - 0x53, 0xad, 0xe9, 0xe5, 0x29, 0x2a, 0x34, 0xb4, 0x3c, 0x45, 0x99, 0x42, 0x7f, 0x3e, 0xa1, 0x48, - 0x40, 0xfb, 0xe7, 0x12, 0x5c, 0xe4, 0xe5, 0x8a, 0xf9, 0xe5, 0x72, 0x9a, 0xa7, 0x8e, 0x5c, 0x5d, - 0xf9, 0x94, 0x02, 0x40, 0xa5, 0x40, 0x30, 0x5b, 0x95, 0x04, 0xb3, 0x62, 0x12, 0x5c, 0xcb, 0x25, - 0xc1, 0x71, 0xfd, 0x6f, 0xa1, 0x78, 0xfd, 0x0f, 0x2d, 0x43, 0x95, 0x66, 0x66, 0x54, 0x76, 0x1a, - 0x3a, 0xfb, 0x28, 0xb4, 0xab, 0xda, 0x1f, 0x94, 0xa0, 0xbd, 0x8b, 0x0d, 0x7f, 0x78, 0x18, 0xf1, - 0xf1, 0xb5, 0x74, 0xbd, 0xf4, 0xb9, 0x29, 0xf5, 0x52, 0x61, 0xc8, 0x57, 0xa6, 0x50, 0x4a, 0x10, - 0x84, 0x5e, 0x68, 0xc4, 0x54, 0x0e, 0xdc, 0x89, 0xc3, 0x8b, 0x88, 0x5d, 0xda, 0xc0, 0x49, 0xdd, - 0x9e, 0x38, 0xda, 0x7f, 0x29, 0xd0, 0xfa, 0x65, 0x32, 0x4d, 0xc4, 0x98, 0x3b, 0x69, 0xc6, 0xbc, - 0x30, 0x85, 0x31, 0x3a, 0x49, 0xb2, 0xf0, 0x11, 0xfe, 0xca, 0xd5, 0x90, 0xff, 0x51, 0x81, 0x3e, - 0x49, 0xb1, 0x75, 0x66, 0x77, 0xe6, 0xd7, 0xae, 0xeb, 0xd0, 0x3e, 0x12, 0x82, 0xd9, 0x12, 0x15, - 0xce, 0xd6, 0x51, 0xba, 0x24, 0xa0, 0x83, 0x1a, 0x95, 0x74, 0xf9, 0x62, 0x23, 0x37, 0xf0, 0xa2, - 0x8c, 0xea, 0x0c, 0x71, 0xd4, 0x42, 0x74, 0x7d, 0x11, 0xa8, 0xfd, 0x8e, 0x02, 0x4b, 0x92, 0x8e, - 0xe8, 0x12, 0x2c, 0xf0, 0xf2, 0x03, 0x8f, 0x17, 0x98, 0xbe, 0x9b, 0x64, 0x7b, 0x92, 0x02, 0x9a, - 0x65, 0xe6, 0x23, 0x64, 0x93, 0x64, 0xd4, 0x71, 0xae, 0x65, 0xe6, 0xf6, 0xc7, 0x0c, 0x50, 0x1f, - 0xea, 0xdc, 0x9a, 0x46, 0x49, 0x6c, 0xfc, 0xad, 0x3d, 0x02, 0xf4, 0x00, 0x27, 0xbe, 0x6b, 0x1e, - 0x8e, 0x26, 0xf6, 0x26, 0x21, 0x34, 0x6d, 0x84, 0x4c, 0xed, 0x3f, 0x14, 0x58, 0x12, 0xb0, 0xcd, - 0x53, 0x26, 0x4a, 0xfc, 0x6b, 0xe9, 0x3c, 0xfe, 0x55, 0x28, 0x85, 0x94, 0xcf, 0x54, 0x0a, 0xb9, - 0x0a, 0x10, 0xf3, 0x3f, 0xe2, 0x68, 0x0a, 0xa2, 0xfd, 0xbd, 0x02, 0x17, 0xdf, 0x31, 0x5c, 0xd3, - 0x3b, 0x38, 0x98, 0x5f, 0x54, 0x37, 0x40, 0x48, 0x7b, 0x8b, 0x16, 0x03, 0xc5, 0x5c, 0xf9, 0x25, - 0x58, 0xf4, 0x99, 0x67, 0x32, 0x45, 0x59, 0x2e, 0xeb, 0x6a, 0xd4, 0x10, 0xcb, 0xe8, 0x5f, 0x96, - 0x00, 0x91, 0x55, 0xdf, 0x33, 0x6c, 0xc3, 0x1d, 0xe2, 0xf3, 0x93, 0xfe, 0x3c, 0x74, 0x84, 0x10, - 0x26, 0x3e, 0x9c, 0x4f, 0xc7, 0x30, 0x01, 0x7a, 0x17, 0x3a, 0xfb, 0x0c, 0xd5, 0xc0, 0xc7, 0x46, - 0xe0, 0xb9, 0x7c, 0x3b, 0xa4, 0x75, 0xbf, 0x3d, 0xdf, 0x1a, 0x8d, 0xb0, 0xbf, 0xe1, 0xb9, 0x26, - 0x8f, 0xda, 0xf7, 0x23, 0x32, 0xc9, 0x50, 0xa2, 0x0c, 0x49, 0x3c, 0x17, 0x6f, 0x4e, 0x1c, 0xd0, - 0x51, 0x56, 0x04, 0xd8, 0xb0, 0x13, 0x46, 0x24, 0xde, 0x50, 0x65, 0x0d, 0xbb, 0xd3, 0xcb, 0xbe, - 0x92, 0xf8, 0x4a, 0xfb, 0x1b, 0x05, 0x50, 0x9c, 0x9a, 0xd3, 0x5a, 0x06, 0xd5, 0xe8, 0xec, 0x50, - 0x45, 0xe2, 0x94, 0x2f, 0x43, 0xc3, 0x8c, 0x46, 0x72, 0x13, 0x94, 0x00, 0xa8, 0x8f, 0xa4, 0x44, - 0x0f, 0x88, 0xe4, 0x61, 0x33, 0x4a, 0x7d, 0x19, 0xf0, 0x3d, 0x0a, 0x13, 0xc3, 0xb3, 0x4a, 0x36, - 0x3c, 0x4b, 0x57, 0x35, 0xab, 0x42, 0x55, 0x53, 0xfb, 0x69, 0x09, 0x54, 0xea, 0x42, 0x36, 0x92, - 0xf2, 0x54, 0x21, 0xa2, 0xaf, 0x43, 0x9b, 0x5f, 0x6e, 0x11, 0x08, 0x6f, 0x3d, 0x4e, 0x4d, 0x86, - 0x6e, 0xc1, 0x32, 0xeb, 0xe4, 0xe3, 0x60, 0x62, 0x27, 0x59, 0x1f, 0x4b, 0x66, 0xd0, 0x63, 0xe6, - 0xbb, 0x48, 0x53, 0x34, 0xe2, 0x21, 0x5c, 0x1c, 0xd9, 0xde, 0xbe, 0x61, 0x0f, 0xc4, 0xed, 0x61, - 0x7b, 0x58, 0x40, 0xe2, 0x97, 0xd9, 0xf0, 0xdd, 0xf4, 0x1e, 0x06, 0xe8, 0x1e, 0xb4, 0x03, 0x8c, - 0x1f, 0x25, 0xa9, 0x60, 0xb5, 0x48, 0x2a, 0xd8, 0x22, 0x63, 0xa2, 0x2f, 0xed, 0x8f, 0x15, 0xe8, - 0x66, 0xce, 0x24, 0xb2, 0x85, 0x0b, 0x25, 0x5f, 0xb8, 0xb8, 0x03, 0x55, 0x62, 0xa9, 0x98, 0x6f, - 0xe9, 0xc8, 0x93, 0x6a, 0x71, 0x56, 0x9d, 0x0d, 0x40, 0x37, 0x61, 0x49, 0x72, 0xf7, 0x81, 0x6f, - 0x3f, 0xca, 0x5f, 0x7d, 0xd0, 0x7e, 0x56, 0x81, 0x66, 0x8a, 0x15, 0x33, 0x6a, 0x2e, 0x4f, 0xa4, - 0xb6, 0x3c, 0xed, 0xac, 0x9b, 0x88, 0x9c, 0x83, 0x1d, 0x96, 0xf7, 0xf1, 0x24, 0xd4, 0xc1, 0x0e, - 0xcd, 0xfa, 0xd2, 0x09, 0x5d, 0x4d, 0x48, 0xe8, 0x32, 0x29, 0xef, 0xc2, 0x29, 0x29, 0x6f, 0x5d, - 0x4c, 0x79, 0x05, 0x15, 0x6a, 0x64, 0x55, 0xa8, 0x68, 0x19, 0xe4, 0x16, 0x2c, 0x0d, 0x59, 0xed, - 0xfe, 0xde, 0xc9, 0x46, 0xdc, 0xc4, 0x83, 0x52, 0x59, 0x13, 0xba, 0x9f, 0x14, 0x38, 0xd9, 0x2e, - 0xb3, 0xa4, 0x43, 0x9e, 0x51, 0xf3, 0xbd, 0x61, 0x9b, 0x1c, 0x59, 0x66, 0xfa, 0x95, 0x2d, 0xc0, - 0xb4, 0xcf, 0x55, 0x80, 0x79, 0x06, 0x9a, 0x51, 0xa4, 0x42, 0x34, 0xbd, 0xc3, 0x8c, 0x5e, 0x64, - 0x06, 0xcc, 0x40, 0xb0, 0x03, 0x5d, 0xf1, 0x74, 0x23, 0x5b, 0x8f, 0x50, 0xf3, 0xf5, 0x88, 0x4b, - 0xb0, 0x60, 0x05, 0x83, 0x03, 0xe3, 0x11, 0xee, 0x2d, 0xd2, 0xd6, 0x9a, 0x15, 0xdc, 0x37, 0x1e, - 0x61, 0xed, 0x5f, 0xcb, 0xd0, 0x49, 0x1c, 0x6c, 0x61, 0x0b, 0x52, 0xe4, 0xfe, 0xcf, 0x36, 0xa8, - 0x49, 0xdc, 0x43, 0x39, 0x7c, 0x6a, 0x0e, 0x9e, 0x3d, 0x32, 0xec, 0x8e, 0x33, 0xfa, 0x2a, 0xb8, - 0xfb, 0xca, 0x99, 0xdc, 0xfd, 0x9c, 0x37, 0x03, 0x6e, 0xc3, 0x4a, 0xec, 0x7b, 0x85, 0x65, 0xb3, - 0x04, 0x6b, 0x39, 0x6a, 0xdc, 0x49, 0x2f, 0x7f, 0x8a, 0x09, 0x58, 0x98, 0x66, 0x02, 0xb2, 0x22, - 0x50, 0xcf, 0x89, 0x40, 0xfe, 0x82, 0x42, 0x43, 0x72, 0x41, 0x41, 0x7b, 0x08, 0x4b, 0xb4, 0xd8, - 0x1c, 0x0c, 0x7d, 0x6b, 0x1f, 0xc7, 0x29, 0x40, 0x91, 0x6d, 0xed, 0x43, 0x3d, 0x93, 0x45, 0xc4, - 0xdf, 0xda, 0x8f, 0x15, 0xb8, 0x98, 0x9f, 0x97, 0x4a, 0x4c, 0x62, 0x48, 0x14, 0xc1, 0x90, 0xfc, - 0x0a, 0x2c, 0xa5, 0x22, 0x4a, 0x61, 0xe6, 0x29, 0x11, 0xb8, 0x84, 0x70, 0x1d, 0x25, 0x73, 0x44, - 0x30, 0xed, 0x67, 0x4a, 0x5c, 0xb3, 0x27, 0xb0, 0x11, 0x3d, 0x10, 0x21, 0x7e, 0xcd, 0x73, 0x6d, - 0xcb, 0x8d, 0x0b, 0x2e, 0x7c, 0x8d, 0x0c, 0xc8, 0x0b, 0x2e, 0xef, 0x40, 0x97, 0x77, 0x8a, 0xdd, - 0x53, 0xc1, 0x80, 0xac, 0xc3, 0xc6, 0xc5, 0x8e, 0xe9, 0x79, 0xe8, 0xf0, 0x93, 0x8a, 0x08, 0x5f, - 0x59, 0x76, 0x7e, 0xf1, 0x3d, 0x50, 0xa3, 0x6e, 0x67, 0x75, 0x88, 0x5d, 0x3e, 0x30, 0x0e, 0xec, - 0x7e, 0x53, 0x81, 0x9e, 0xe8, 0x1e, 0x53, 0xcb, 0x3f, 0x7b, 0x78, 0xf7, 0xba, 0x78, 0x3e, 0xfd, - 0xfc, 0x29, 0xf4, 0x24, 0x78, 0xa2, 0x53, 0xea, 0xdf, 0x2d, 0xd1, 0xcb, 0x06, 0x24, 0xd5, 0xdb, - 0xb4, 0x82, 0xd0, 0xb7, 0xf6, 0x27, 0xf3, 0x9d, 0x98, 0x1a, 0xd0, 0x1c, 0x1e, 0xe2, 0xe1, 0xa3, - 0xb1, 0x67, 0x25, 0xbb, 0xf2, 0x96, 0x8c, 0xa6, 0xe9, 0x68, 0xd7, 0x36, 0x92, 0x19, 0xd8, 0x91, - 0x53, 0x7a, 0xce, 0xfe, 0x0f, 0x41, 0xcd, 0x76, 0x48, 0x9f, 0xf4, 0x34, 0xd8, 0x49, 0xcf, 0x6d, - 0xf1, 0xa4, 0x67, 0x46, 0xa4, 0x91, 0x3a, 0xe8, 0xf9, 0xdb, 0x12, 0x7c, 0x5d, 0x4a, 0xdb, 0x3c, - 0x59, 0xd2, 0xb4, 0x3a, 0xd2, 0x3d, 0xa8, 0x67, 0x92, 0xda, 0x17, 0x4e, 0xd9, 0x3f, 0x5e, 0x92, - 0x65, 0xa5, 0xc1, 0x20, 0x89, 0xad, 0x12, 0x85, 0xaf, 0x4c, 0x9f, 0x83, 0xeb, 0x9d, 0x30, 0x47, - 0x34, 0x0e, 0xdd, 0x85, 0x16, 0x2b, 0x18, 0x0c, 0x8e, 0x2c, 0x7c, 0x1c, 0x9d, 0xa3, 0x5e, 0x95, - 0x9a, 0x66, 0xda, 0xef, 0x43, 0x0b, 0x1f, 0xeb, 0x4d, 0x3b, 0xfe, 0x1d, 0x68, 0xbf, 0x5f, 0x01, - 0x48, 0xda, 0x48, 0x76, 0x96, 0xe8, 0x3c, 0x57, 0xe2, 0x14, 0x84, 0xc4, 0x12, 0x62, 0xe4, 0x1a, - 0x7d, 0x22, 0x3d, 0x39, 0xc7, 0x30, 0xad, 0x20, 0xe4, 0x7c, 0xb9, 0x79, 0x3a, 0x2d, 0x11, 0x8b, - 0xc8, 0x96, 0x71, 0x99, 0x09, 0x12, 0x08, 0x7a, 0x05, 0xd0, 0xc8, 0xf7, 0x8e, 0x2d, 0x77, 0x94, - 0xce, 0x37, 0x58, 0x5a, 0xb2, 0xc8, 0x5b, 0x52, 0x09, 0xc7, 0x8f, 0x40, 0xcd, 0x74, 0x8f, 0x58, - 0x72, 0x7b, 0x06, 0x19, 0x0f, 0x84, 0xb9, 0xb8, 0xf8, 0x76, 0x45, 0x0c, 0xf4, 0xd0, 0x74, 0xcf, - 0xf0, 0x47, 0x38, 0xda, 0x51, 0x1e, 0x87, 0x89, 0xc0, 0xfe, 0x00, 0xd4, 0xec, 0xaa, 0x24, 0x47, - 0x9a, 0xaf, 0x8a, 0x82, 0x7e, 0x9a, 0x3d, 0x22, 0xd3, 0xa4, 0x44, 0xbd, 0x6f, 0xc0, 0xb2, 0x8c, - 0x5e, 0x09, 0x92, 0x73, 0x6b, 0xd3, 0x5b, 0x71, 0x48, 0x4c, 0xf7, 0x61, 0x9a, 0x97, 0x49, 0x15, - 0x9e, 0x4b, 0x42, 0xe1, 0x59, 0xfb, 0xf5, 0x32, 0xa0, 0xbc, 0xf8, 0xa3, 0x0e, 0x94, 0xe2, 0x49, - 0x4a, 0x5b, 0x9b, 0x19, 0x71, 0x2b, 0xe5, 0xc4, 0xed, 0x32, 0x34, 0x62, 0xaf, 0xcf, 0x4d, 0x7c, - 0x02, 0x48, 0x0b, 0x63, 0x45, 0x14, 0xc6, 0x14, 0x61, 0x55, 0xb1, 0x22, 0x7e, 0x0b, 0x96, 0x6d, - 0x23, 0x08, 0x07, 0xac, 0xf0, 0x1e, 0x5a, 0x0e, 0x0e, 0x42, 0xc3, 0x19, 0xd3, 0xad, 0xac, 0xe8, - 0x88, 0xb4, 0x6d, 0x92, 0xa6, 0xbd, 0xa8, 0x05, 0xed, 0x45, 0xd1, 0x35, 0xb1, 0xbd, 0xfc, 0xb2, - 0xc0, 0xab, 0xc5, 0xd4, 0x3d, 0x29, 0x77, 0x33, 0x89, 0x6a, 0xc4, 0x61, 0x67, 0xff, 0x13, 0xe8, - 0x88, 0x8d, 0x92, 0xed, 0xbb, 0x23, 0x6e, 0x5f, 0x91, 0xc0, 0x36, 0xb5, 0x87, 0x87, 0x80, 0xf2, - 0xc6, 0x23, 0xcd, 0x33, 0x45, 0xe4, 0xd9, 0xac, 0xbd, 0x48, 0xf1, 0xb4, 0x2c, 0x6e, 0xf6, 0x9f, - 0x96, 0x01, 0x25, 0x11, 0x5c, 0x7c, 0x78, 0x5d, 0x24, 0xec, 0xb9, 0x09, 0x4b, 0xf9, 0xf8, 0x2e, - 0x0a, 0x6a, 0x51, 0x2e, 0xba, 0x93, 0x45, 0x62, 0x65, 0xd9, 0x55, 0xd1, 0xd7, 0x62, 0x73, 0xcf, - 0xc2, 0xd5, 0xab, 0x53, 0xcf, 0x33, 0x44, 0x8b, 0xff, 0xc3, 0xec, 0x15, 0x53, 0x66, 0x3f, 0xee, - 0x48, 0x4d, 0x73, 0x6e, 0xc9, 0x33, 0xef, 0x97, 0x0a, 0x81, 0x74, 0xed, 0x2c, 0x81, 0xf4, 0xfc, - 0x17, 0x42, 0xff, 0xbd, 0x04, 0x8b, 0x31, 0x23, 0xcf, 0xb4, 0x49, 0xb3, 0xef, 0x19, 0x3c, 0xe5, - 0x5d, 0xf9, 0x58, 0xbe, 0x2b, 0xdf, 0x3e, 0x35, 0x99, 0x29, 0xba, 0x29, 0xf3, 0x73, 0xf6, 0x33, - 0x58, 0xe0, 0x65, 0xe9, 0x9c, 0x81, 0x2b, 0x52, 0x2e, 0x58, 0x86, 0x2a, 0xb1, 0xa7, 0x51, 0x4d, - 0x91, 0x7d, 0x30, 0x96, 0xa6, 0x2f, 0x1c, 0x73, 0x1b, 0xd7, 0x16, 0xee, 0x1b, 0x6b, 0xbf, 0x55, - 0x06, 0xd8, 0x3d, 0x71, 0x87, 0x77, 0x99, 0x92, 0xde, 0x82, 0xca, 0xac, 0xeb, 0x69, 0xa4, 0x37, - 0x95, 0x2d, 0xda, 0xb3, 0xc0, 0xe6, 0x0a, 0x05, 0x91, 0x72, 0xb6, 0x20, 0x32, 0xad, 0x94, 0x31, - 0xdd, 0x04, 0x7f, 0x1b, 0x2a, 0xd4, 0x94, 0xb2, 0xdb, 0x5b, 0x85, 0x4e, 0x85, 0xe9, 0x00, 0xb4, - 0x0a, 0x91, 0x4b, 0xde, 0x72, 0x99, 0xcf, 0xa5, 0xe6, 0xb8, 0xac, 0x67, 0xc1, 0xe8, 0x05, 0xe8, - 0xb0, 0x42, 0x58, 0xdc, 0x91, 0xe5, 0x74, 0x19, 0x68, 0xde, 0xa3, 0x37, 0x24, 0x1e, 0x9d, 0xe0, - 0x35, 0x7d, 0x6f, 0x3c, 0x4e, 0x4d, 0xc7, 0x2a, 0x21, 0x59, 0xb0, 0xf6, 0x79, 0x09, 0x2e, 0x11, - 0xfe, 0x3e, 0x99, 0xa8, 0xbc, 0x88, 0xf0, 0xa4, 0xec, 0x79, 0x59, 0xb4, 0xe7, 0x77, 0x60, 0x81, - 0x95, 0x5b, 0xa2, 0xf8, 0xf2, 0xea, 0x34, 0x69, 0x60, 0xb2, 0xa3, 0x47, 0xdd, 0xe7, 0xcd, 0xd9, - 0x85, 0x33, 0xf3, 0xda, 0x7c, 0x67, 0xe6, 0x0b, 0xd9, 0xa2, 0x6c, 0x4a, 0xac, 0xea, 0xa2, 0x17, - 0x7a, 0x08, 0x6d, 0x3d, 0xad, 0x1a, 0x08, 0x41, 0x25, 0x75, 0x61, 0x95, 0xfe, 0xa6, 0x69, 0xb6, - 0x31, 0x36, 0x86, 0x56, 0x78, 0x42, 0xd9, 0x59, 0xd5, 0xe3, 0x6f, 0xb9, 0x1e, 0x6a, 0xff, 0xab, - 0xc0, 0xc5, 0xe8, 0x50, 0x95, 0x6b, 0xf9, 0xf9, 0x77, 0x74, 0x1d, 0x56, 0xb8, 0x4a, 0x67, 0x74, - 0x9b, 0x05, 0xd3, 0x4b, 0x0c, 0x26, 0x2e, 0x63, 0x1d, 0x56, 0x42, 0x2a, 0x5d, 0xd9, 0x31, 0x6c, - 0xbf, 0x97, 0x58, 0xa3, 0x38, 0xa6, 0xc8, 0xa1, 0xf6, 0x33, 0xec, 0x06, 0x16, 0x67, 0x2d, 0x57, - 0x52, 0x70, 0x27, 0x0e, 0x5f, 0xa5, 0x76, 0x0c, 0x97, 0xd9, 0x95, 0xf1, 0x7d, 0x91, 0xa2, 0xb9, - 0xce, 0x34, 0xa4, 0xeb, 0xce, 0xd8, 0xb4, 0x3f, 0x51, 0xe0, 0xca, 0x14, 0xcc, 0xf3, 0x64, 0x73, - 0xef, 0x49, 0xb1, 0x4f, 0xc9, 0xbd, 0x05, 0xbc, 0xec, 0xc2, 0x82, 0x48, 0xe4, 0xe7, 0x15, 0x58, - 0xcc, 0x75, 0x3a, 0xb3, 0xcc, 0xbd, 0x0c, 0x88, 0x6c, 0x42, 0xfc, 0x3c, 0x92, 0x96, 0x33, 0xb8, - 0xf3, 0x54, 0xdd, 0x89, 0x13, 0x3f, 0x8d, 0xdc, 0xf6, 0x4c, 0x8c, 0x2c, 0xd6, 0x9b, 0x9d, 0x68, - 0xc4, 0x3b, 0x57, 0x99, 0xfe, 0x0a, 0x26, 0x47, 0xe0, 0xda, 0xf6, 0xc4, 0x61, 0x87, 0x1f, 0x7c, - 0x97, 0x99, 0x43, 0x24, 0xa8, 0x04, 0x30, 0x3a, 0x80, 0x45, 0x7a, 0x3f, 0x6f, 0x12, 0x8e, 0x3c, - 0x92, 0x50, 0x51, 0xba, 0x98, 0xdb, 0xfd, 0x6e, 0x61, 0x4c, 0x1f, 0xf0, 0xd1, 0x84, 0x78, 0x9e, - 0x53, 0xb9, 0x22, 0x34, 0xc2, 0x63, 0xb9, 0x43, 0xcf, 0x89, 0xf1, 0xd4, 0xce, 0x88, 0x67, 0x8b, - 0x8f, 0x16, 0xf1, 0xa4, 0xa1, 0xfd, 0x0d, 0x58, 0x91, 0x2e, 0x7d, 0x96, 0xa3, 0xaf, 0xa6, 0x33, - 0xaf, 0x7b, 0xb0, 0x2c, 0x5b, 0xd5, 0x39, 0xe6, 0xc8, 0x51, 0x7c, 0x96, 0x39, 0xb4, 0xbf, 0x28, - 0x41, 0x7b, 0x13, 0xdb, 0x38, 0xc4, 0x4f, 0xf7, 0xcc, 0x39, 0x77, 0x80, 0x5e, 0xce, 0x1f, 0xa0, - 0xe7, 0x6e, 0x03, 0x54, 0x24, 0xb7, 0x01, 0xae, 0xc4, 0x97, 0x20, 0xc8, 0x2c, 0x55, 0x31, 0x86, - 0x30, 0xd1, 0xeb, 0xd0, 0x1a, 0xfb, 0x96, 0x63, 0xf8, 0x27, 0x83, 0x47, 0xf8, 0x24, 0xe0, 0x4e, - 0xa3, 0x27, 0x75, 0x3b, 0x5b, 0x9b, 0x81, 0xde, 0xe4, 0xbd, 0xdf, 0xc5, 0x27, 0xf4, 0x82, 0x45, - 0x9c, 0xc6, 0xb1, 0x1b, 0x75, 0x15, 0x3d, 0x05, 0xb9, 0xf1, 0x12, 0x34, 0xe2, 0x8b, 0x4b, 0xa8, - 0x0e, 0x95, 0xfb, 0x13, 0xdb, 0x56, 0x2f, 0xa0, 0x06, 0x54, 0x69, 0xa2, 0xa7, 0x2a, 0xe4, 0x27, - 0x8d, 0xfd, 0xd4, 0xd2, 0x8d, 0x5f, 0x82, 0x46, 0x7c, 0x81, 0x02, 0x35, 0x61, 0xe1, 0xa1, 0xfb, - 0xae, 0xeb, 0x1d, 0xbb, 0xea, 0x05, 0xb4, 0x00, 0xe5, 0xbb, 0xb6, 0xad, 0x2a, 0xa8, 0x0d, 0x8d, - 0xdd, 0xd0, 0xc7, 0x06, 0xd9, 0x3e, 0xb5, 0x84, 0x3a, 0x00, 0xef, 0x58, 0x41, 0xe8, 0xf9, 0xd6, - 0xd0, 0xb0, 0xd5, 0xf2, 0x8d, 0xcf, 0xa0, 0x23, 0xd6, 0xd3, 0x51, 0x0b, 0xea, 0xdb, 0x5e, 0xf8, - 0xf6, 0xa7, 0x56, 0x10, 0xaa, 0x17, 0x48, 0xff, 0x6d, 0x2f, 0xdc, 0xf1, 0x71, 0x80, 0xdd, 0x50, - 0x55, 0x10, 0x40, 0xed, 0x03, 0x77, 0xd3, 0x0a, 0x1e, 0xa9, 0x25, 0xb4, 0xc4, 0x8f, 0xca, 0x0c, - 0x7b, 0x8b, 0x17, 0xa9, 0xd5, 0x32, 0x19, 0x1e, 0x7f, 0x55, 0x90, 0x0a, 0xad, 0xb8, 0xcb, 0x83, - 0x9d, 0x87, 0x6a, 0x95, 0x51, 0x4f, 0x7e, 0xd6, 0x6e, 0x98, 0xa0, 0x66, 0x8f, 0x78, 0xc9, 0x9c, - 0x6c, 0x11, 0x31, 0x48, 0xbd, 0x40, 0x56, 0xc6, 0xcf, 0xd8, 0x55, 0x05, 0x75, 0xa1, 0x99, 0x3a, - 0xb1, 0x56, 0x4b, 0x04, 0xf0, 0xc0, 0x1f, 0x0f, 0xb9, 0x6c, 0x31, 0x12, 0x88, 0xa0, 0x6e, 0x12, - 0x4e, 0x54, 0x6e, 0xdc, 0x83, 0x7a, 0x94, 0x9f, 0x90, 0xae, 0x9c, 0x45, 0xe4, 0x53, 0xbd, 0x80, - 0x16, 0xa1, 0x2d, 0x3c, 0xbd, 0x53, 0x15, 0x84, 0xa0, 0x23, 0x3e, 0x8e, 0x55, 0x4b, 0x37, 0xd6, - 0x01, 0x92, 0x38, 0x9f, 0x90, 0xb3, 0xe5, 0x1e, 0x19, 0xb6, 0x65, 0x32, 0xda, 0x48, 0x13, 0xe1, - 0x2e, 0xe5, 0x0e, 0xd3, 0x59, 0xb5, 0x74, 0xe3, 0x4d, 0xa8, 0x47, 0xb1, 0x2b, 0x81, 0xeb, 0xd8, - 0xf1, 0x8e, 0x30, 0xdb, 0x99, 0x5d, 0x1c, 0xb2, 0x7d, 0xbc, 0xeb, 0x60, 0xd7, 0x54, 0x4b, 0x84, - 0x8c, 0x87, 0x63, 0xd3, 0x08, 0xa3, 0x6b, 0xa6, 0x6a, 0x79, 0xfd, 0x3f, 0x97, 0x00, 0xd8, 0x99, - 0xad, 0xe7, 0xf9, 0x26, 0xb2, 0xe9, 0xdd, 0x8d, 0x0d, 0xcf, 0x19, 0x7b, 0x6e, 0x74, 0xa0, 0x14, - 0xa0, 0xb5, 0x4c, 0x89, 0x84, 0x7d, 0xe4, 0x3b, 0x72, 0xde, 0xf4, 0x9f, 0x93, 0xf6, 0xcf, 0x74, - 0xd6, 0x2e, 0x20, 0x87, 0x62, 0xdb, 0xb3, 0x1c, 0xbc, 0x67, 0x0d, 0x1f, 0xc5, 0x07, 0xbd, 0xd3, - 0x1f, 0xad, 0x66, 0xba, 0x46, 0xf8, 0xae, 0x4b, 0xf1, 0xed, 0x86, 0xbe, 0xe5, 0x8e, 0x22, 0xef, - 0xa8, 0x5d, 0x40, 0x8f, 0x33, 0x4f, 0x66, 0x23, 0x84, 0xeb, 0x45, 0x5e, 0xc9, 0x9e, 0x0f, 0xa5, - 0x0d, 0xdd, 0xcc, 0x7f, 0x13, 0xa0, 0x1b, 0xf2, 0xb7, 0x47, 0xb2, 0xff, 0x51, 0xe8, 0xbf, 0x54, - 0xa8, 0x6f, 0x8c, 0xcd, 0x82, 0x8e, 0xf8, 0xa8, 0x1e, 0x7d, 0x63, 0xda, 0x04, 0xb9, 0xd7, 0x8f, - 0xfd, 0x1b, 0x45, 0xba, 0xc6, 0xa8, 0x3e, 0x62, 0xe2, 0x3b, 0x0b, 0x95, 0xf4, 0xc1, 0x69, 0xff, - 0xb4, 0xc0, 0x44, 0xbb, 0x80, 0x3e, 0x21, 0x31, 0x44, 0xe6, 0x8d, 0x26, 0x7a, 0x59, 0xee, 0xf7, - 0xe4, 0x4f, 0x39, 0x67, 0x61, 0xf8, 0x28, 0xab, 0x7c, 0xd3, 0xa9, 0xcf, 0x3d, 0xfe, 0x2e, 0x4e, - 0x7d, 0x6a, 0xfa, 0xd3, 0xa8, 0x3f, 0x33, 0x06, 0x9b, 0xa5, 0x53, 0x92, 0xd7, 0x61, 0x59, 0x51, - 0x4e, 0xb2, 0x99, 0xe9, 0x4f, 0xc9, 0x66, 0x61, 0x9b, 0x50, 0x25, 0xcd, 0x5e, 0x56, 0x78, 0x65, - 0xca, 0x31, 0x88, 0xfc, 0x59, 0x6a, 0x7f, 0xad, 0x68, 0xf7, 0xb4, 0x2c, 0x8b, 0x2f, 0x1f, 0xe5, - 0x5b, 0x24, 0x7d, 0xad, 0x29, 0x97, 0x65, 0xf9, 0x43, 0x4a, 0xed, 0x02, 0xda, 0x13, 0x4c, 0x3d, - 0x7a, 0x61, 0x9a, 0x28, 0x88, 0xb7, 0x97, 0x66, 0xf1, 0xed, 0x57, 0x01, 0x31, 0x4d, 0x75, 0x0f, - 0xac, 0xd1, 0xc4, 0x37, 0x98, 0x18, 0x4f, 0x33, 0x6e, 0xf9, 0xae, 0x11, 0x9a, 0x6f, 0x9e, 0x61, - 0x44, 0xbc, 0xa4, 0x01, 0xc0, 0x03, 0x1c, 0xbe, 0x4f, 0x9f, 0xc0, 0x05, 0xd9, 0x15, 0x25, 0xf6, - 0x9b, 0x77, 0x88, 0x50, 0xbd, 0x38, 0xb3, 0x5f, 0x8c, 0x60, 0x1f, 0x9a, 0x0f, 0x48, 0x7e, 0x45, - 0x63, 0xc6, 0x00, 0x4d, 0x1d, 0x19, 0xf5, 0x88, 0x50, 0xac, 0xce, 0xee, 0x98, 0x36, 0x9e, 0x99, - 0x57, 0xa0, 0x68, 0xea, 0xc6, 0xe6, 0xdf, 0xa6, 0xca, 0x8d, 0xe7, 0x94, 0x67, 0xa5, 0x6c, 0x45, - 0xf4, 0x28, 0xee, 0x1d, 0x6c, 0xd8, 0xe1, 0xe1, 0x94, 0x15, 0xa5, 0x7a, 0x9c, 0xbe, 0x22, 0xa1, - 0x63, 0x8c, 0x03, 0xc3, 0x12, 0xd3, 0x42, 0x31, 0x31, 0xbd, 0x29, 0x9f, 0x22, 0xdf, 0xb3, 0xa0, - 0xe8, 0x19, 0xb0, 0xb8, 0xe9, 0x7b, 0x63, 0x11, 0xc9, 0x2b, 0x52, 0x24, 0xb9, 0x7e, 0x05, 0x51, - 0x7c, 0x1f, 0x5a, 0x51, 0xfe, 0x4f, 0x33, 0x16, 0x39, 0x17, 0xd2, 0x5d, 0x0a, 0x4e, 0xfc, 0x31, - 0x74, 0x33, 0x85, 0x05, 0xf9, 0xa6, 0xcb, 0xab, 0x0f, 0xb3, 0x66, 0x3f, 0x06, 0x44, 0x9f, 0xf6, - 0x8a, 0xff, 0x4e, 0x20, 0x8f, 0x6f, 0xf2, 0x1d, 0x23, 0x24, 0x37, 0x0b, 0xf7, 0x8f, 0x77, 0xfe, - 0xd7, 0x60, 0x45, 0x9a, 0xbc, 0x67, 0x0d, 0x02, 0xbf, 0xae, 0x7c, 0x4a, 0x85, 0x21, 0x6b, 0x10, - 0x4e, 0x1d, 0x11, 0xe1, 0x5f, 0xff, 0x37, 0x04, 0x0d, 0x1a, 0xe7, 0xd1, 0xdd, 0xfa, 0x45, 0x98, - 0xf7, 0x64, 0xc3, 0xbc, 0x8f, 0xa1, 0x9b, 0x79, 0x72, 0x2a, 0x17, 0x5a, 0xf9, 0xbb, 0xd4, 0x02, - 0xd1, 0x8a, 0xf8, 0x5a, 0x53, 0xee, 0x0a, 0xa5, 0x2f, 0x3a, 0x67, 0xcd, 0xfd, 0x21, 0x7b, 0xce, - 0x1d, 0x9f, 0xe6, 0xbe, 0x38, 0xf5, 0xf0, 0x41, 0xbc, 0x76, 0xfc, 0xc5, 0x47, 0x41, 0x5f, 0xed, - 0x08, 0xf4, 0x63, 0xe8, 0x66, 0x1e, 0xf6, 0xc8, 0x25, 0x46, 0xfe, 0xfa, 0x67, 0xd6, 0xec, 0x3f, - 0xc7, 0xe0, 0xc9, 0x84, 0x25, 0xc9, 0x3b, 0x0a, 0xb4, 0x36, 0x2d, 0x10, 0x95, 0x3f, 0xb8, 0x98, - 0xbd, 0xa0, 0xb6, 0xa0, 0xa6, 0x59, 0x7f, 0x93, 0x10, 0x99, 0xfd, 0x5b, 0xa3, 0xfe, 0xcb, 0xc5, - 0xfe, 0x03, 0x29, 0x5e, 0xd0, 0x2e, 0xd4, 0xd8, 0x73, 0x1f, 0xf4, 0xac, 0xfc, 0x10, 0x26, 0xf5, - 0x14, 0xa8, 0x3f, 0xeb, 0xc1, 0x50, 0x30, 0xb1, 0x43, 0x42, 0xff, 0x0f, 0xa0, 0xc3, 0x40, 0x31, - 0x83, 0x9e, 0xe0, 0xe4, 0xbb, 0x50, 0xa5, 0xa6, 0x1d, 0x49, 0x0f, 0x14, 0xd2, 0x8f, 0x7a, 0xfa, - 0xb3, 0xdf, 0xf1, 0x24, 0x14, 0x37, 0xe9, 0x48, 0x56, 0xd5, 0x79, 0x92, 0x53, 0xdf, 0x52, 0xd0, - 0x0f, 0xa0, 0xcd, 0x26, 0x8f, 0xb8, 0xf1, 0x24, 0x29, 0x1f, 0xc2, 0x52, 0x8a, 0xf2, 0xa7, 0x81, - 0xe2, 0x96, 0xf2, 0xff, 0x3c, 0xba, 0xff, 0x94, 0x3e, 0xaa, 0xc9, 0x5e, 0x1b, 0x43, 0x6b, 0x67, - 0xbb, 0xfb, 0xd6, 0xbf, 0x59, 0xb8, 0x7f, 0x8c, 0xf9, 0x47, 0xa0, 0x66, 0x8f, 0x0a, 0xd1, 0x4b, - 0xd3, 0x6c, 0x89, 0x0c, 0xe7, 0x0c, 0x43, 0xf2, 0x3d, 0xa8, 0xb1, 0x1a, 0xb1, 0x5c, 0x01, 0x85, - 0xfa, 0xf1, 0x8c, 0xb9, 0xee, 0x7d, 0xeb, 0xa3, 0xf5, 0x91, 0x15, 0x1e, 0x4e, 0xf6, 0x49, 0xcb, - 0x4d, 0xd6, 0xf5, 0x15, 0xcb, 0xe3, 0xbf, 0x6e, 0x46, 0x7b, 0x79, 0x93, 0x8e, 0xbe, 0x49, 0x11, - 0x8c, 0xf7, 0xf7, 0x6b, 0xf4, 0xf3, 0xf6, 0xff, 0x05, 0x00, 0x00, 0xff, 0xff, 0xb4, 0xc4, 0x63, - 0x89, 0xd0, 0x53, 0x00, 0x00, + 0x7a, 0x9a, 0x17, 0x39, 0xf3, 0xcd, 0xab, 0x59, 0x24, 0xa5, 0xd9, 0x59, 0x49, 0x96, 0x5b, 0x7e, + 0x70, 0x65, 0x9b, 0xd2, 0x52, 0x6b, 0xaf, 0x76, 0x6d, 0xc3, 0x91, 0x48, 0x4b, 0xe6, 0xda, 0xa6, + 0x95, 0xa6, 0xe4, 0x0d, 0xbc, 0xde, 0x1d, 0x37, 0xa7, 0x8b, 0xc3, 0x86, 0xfa, 0x31, 0xea, 0xee, + 0x21, 0x4d, 0x07, 0x08, 0x72, 0xc8, 0x25, 0x9b, 0x6c, 0x10, 0x24, 0x87, 0xe4, 0x10, 0x04, 0x48, + 0x82, 0x00, 0x9b, 0x20, 0xb9, 0x04, 0x09, 0x90, 0x43, 0x0e, 0xb9, 0xe5, 0x94, 0xd7, 0x29, 0x7f, + 0x20, 0xb9, 0xe5, 0x98, 0x45, 0xe0, 0x5b, 0x50, 0xaf, 0xee, 0xae, 0xee, 0x1a, 0x4e, 0x93, 0x23, + 0xad, 0xed, 0x60, 0x6f, 0xd3, 0x5f, 0x3d, 0xbe, 0xaf, 0xbe, 0x57, 0x7d, 0xdf, 0x57, 0x55, 0x03, + 0x4b, 0x8f, 0x27, 0x38, 0x38, 0x1e, 0x0c, 0x7d, 0x3f, 0xb0, 0xd6, 0xc7, 0x81, 0x1f, 0xf9, 0x08, + 0xb9, 0xb6, 0x73, 0x38, 0x09, 0xd9, 0xd7, 0x3a, 0x6d, 0xef, 0xb7, 0x86, 0xbe, 0xeb, 0xfa, 0x1e, + 0x83, 0xf5, 0x5b, 0xe9, 0x1e, 0xfd, 0x8e, 0xed, 0x45, 0x38, 0xf0, 0x4c, 0x47, 0xb4, 0x86, 0xc3, + 0x03, 0xec, 0x9a, 0xfc, 0xab, 0xe1, 0x86, 0x23, 0xfe, 0x53, 0xb3, 0xcc, 0xc8, 0x4c, 0xa3, 0xea, + 0x2f, 0xd9, 0x9e, 0x85, 0x3f, 0x4d, 0x83, 0xf4, 0xdf, 0x28, 0xc1, 0xf9, 0xdd, 0x03, 0xff, 0x68, + 0xd3, 0x77, 0x1c, 0x3c, 0x8c, 0x6c, 0xdf, 0x0b, 0x0d, 0xfc, 0x78, 0x82, 0xc3, 0x08, 0xdd, 0x80, + 0xea, 0x9e, 0x19, 0xe2, 0x5e, 0xe9, 0x4a, 0x69, 0xad, 0xb9, 0x71, 0x71, 0x5d, 0xa2, 0x93, 0x13, + 0xf8, 0x7e, 0x38, 0xba, 0x63, 0x86, 0xd8, 0xa0, 0x3d, 0x11, 0x82, 0xaa, 0xb5, 0xb7, 0xbd, 0xd5, + 0x2b, 0x5f, 0x29, 0xad, 0x55, 0x0c, 0xfa, 0x1b, 0x3d, 0x07, 0xed, 0x61, 0x3c, 0xf7, 0xf6, 0x56, + 0xd8, 0xab, 0x5c, 0xa9, 0xac, 0x55, 0x0c, 0x19, 0xa8, 0xff, 0xb8, 0x0c, 0x17, 0x72, 0x64, 0x84, + 0x63, 0xdf, 0x0b, 0x31, 0xba, 0x09, 0x0b, 0x61, 0x64, 0x46, 0x93, 0x90, 0x53, 0xf2, 0x75, 0x25, + 0x25, 0xbb, 0xb4, 0x8b, 0xc1, 0xbb, 0xe6, 0xd1, 0x96, 0x15, 0x68, 0xd1, 0x37, 0x61, 0xc5, 0xf6, + 0xde, 0xc7, 0xae, 0x1f, 0x1c, 0x0f, 0xc6, 0x38, 0x18, 0x62, 0x2f, 0x32, 0x47, 0x58, 0xd0, 0xb8, + 0x2c, 0xda, 0xee, 0x27, 0x4d, 0xe8, 0x35, 0xb8, 0xc0, 0x64, 0x18, 0xe2, 0xe0, 0xd0, 0x1e, 0xe2, + 0x81, 0x79, 0x68, 0xda, 0x8e, 0xb9, 0xe7, 0xe0, 0x5e, 0xf5, 0x4a, 0x65, 0xad, 0x6e, 0xac, 0xd2, + 0xe6, 0x5d, 0xd6, 0x7a, 0x5b, 0x34, 0xa2, 0x6f, 0x80, 0x16, 0xe0, 0xfd, 0x00, 0x87, 0x07, 0x83, + 0x71, 0xe0, 0x8f, 0x02, 0x1c, 0x86, 0xbd, 0x1a, 0x45, 0xd3, 0xe5, 0xf0, 0xfb, 0x1c, 0xac, 0xff, + 0x79, 0x09, 0x56, 0x09, 0x33, 0xee, 0x9b, 0x41, 0x64, 0x3f, 0x05, 0x91, 0xe8, 0xd0, 0x4a, 0xb3, + 0xa1, 0x57, 0xa1, 0x6d, 0x12, 0x8c, 0xf4, 0x19, 0x0b, 0xf4, 0x84, 0x7d, 0x55, 0x4a, 0xaa, 0x04, + 0xd3, 0xff, 0x95, 0xeb, 0x4e, 0x9a, 0xce, 0x79, 0x64, 0x96, 0xc5, 0x59, 0xce, 0xe3, 0x3c, 0x8b, + 0xc4, 0x54, 0x9c, 0xaf, 0xaa, 0x39, 0xff, 0xcf, 0x15, 0x58, 0x7d, 0xcf, 0x37, 0xad, 0x44, 0x0d, + 0x7f, 0xfe, 0x9c, 0x7f, 0x13, 0x16, 0x98, 0x45, 0xf7, 0xaa, 0x14, 0xd7, 0xf3, 0x32, 0x2e, 0x6e, + 0xed, 0x09, 0x85, 0xbb, 0x14, 0x60, 0xf0, 0x41, 0xe8, 0x79, 0xe8, 0x04, 0x78, 0xec, 0xd8, 0x43, + 0x73, 0xe0, 0x4d, 0xdc, 0x3d, 0x1c, 0xf4, 0x6a, 0x57, 0x4a, 0x6b, 0x35, 0xa3, 0xcd, 0xa1, 0x3b, + 0x14, 0x88, 0x3e, 0x81, 0xf6, 0xbe, 0x8d, 0x1d, 0x6b, 0x40, 0x5d, 0xc2, 0xf6, 0x56, 0x6f, 0xe1, + 0x4a, 0x65, 0xad, 0xb9, 0xf1, 0xfa, 0x7a, 0xde, 0x1b, 0xad, 0x2b, 0x39, 0xb2, 0x7e, 0x97, 0x0c, + 0xdf, 0x66, 0xa3, 0xdf, 0xf6, 0xa2, 0xe0, 0xd8, 0x68, 0xed, 0xa7, 0x40, 0xa8, 0x07, 0x8b, 0x9c, + 0xbd, 0xbd, 0xc5, 0x2b, 0xa5, 0xb5, 0xba, 0x21, 0x3e, 0xd1, 0x8b, 0xd0, 0x0d, 0x70, 0xe8, 0x4f, + 0x82, 0x21, 0x1e, 0x8c, 0x02, 0x7f, 0x32, 0x0e, 0x7b, 0xf5, 0x2b, 0x95, 0xb5, 0x86, 0xd1, 0x11, + 0xe0, 0x7b, 0x14, 0xda, 0x7f, 0x0b, 0x96, 0x72, 0x58, 0x90, 0x06, 0x95, 0x47, 0xf8, 0x98, 0x0a, + 0xa2, 0x62, 0x90, 0x9f, 0x68, 0x05, 0x6a, 0x87, 0xa6, 0x33, 0xc1, 0x9c, 0xd5, 0xec, 0xe3, 0xbb, + 0xe5, 0x5b, 0x25, 0xfd, 0x8f, 0x4a, 0xd0, 0x33, 0xb0, 0x83, 0xcd, 0x10, 0x7f, 0x91, 0x22, 0x3d, + 0x0f, 0x0b, 0x9e, 0x6f, 0xe1, 0xed, 0x2d, 0x2a, 0xd2, 0x8a, 0xc1, 0xbf, 0xf4, 0xcf, 0x4b, 0xb0, + 0x72, 0x0f, 0x47, 0xc4, 0x0c, 0xec, 0x30, 0xb2, 0x87, 0xb1, 0x9d, 0xbf, 0x09, 0x95, 0x00, 0x3f, + 0xe6, 0x94, 0xbd, 0x24, 0x53, 0x16, 0xbb, 0x7f, 0xd5, 0x48, 0x83, 0x8c, 0x43, 0xcf, 0x42, 0xcb, + 0x72, 0x9d, 0xc1, 0xf0, 0xc0, 0xf4, 0x3c, 0xec, 0x30, 0x43, 0x6a, 0x18, 0x4d, 0xcb, 0x75, 0x36, + 0x39, 0x08, 0x5d, 0x06, 0x08, 0xf1, 0xc8, 0xc5, 0x5e, 0x94, 0xf8, 0xe4, 0x14, 0x04, 0x5d, 0x83, + 0xa5, 0xfd, 0xc0, 0x77, 0x07, 0xe1, 0x81, 0x19, 0x58, 0x03, 0x07, 0x9b, 0x16, 0x0e, 0x28, 0xf5, + 0x75, 0xa3, 0x4b, 0x1a, 0x76, 0x09, 0xfc, 0x3d, 0x0a, 0x46, 0x37, 0xa1, 0x16, 0x0e, 0xfd, 0x31, + 0xa6, 0x9a, 0xd6, 0xd9, 0xb8, 0xa4, 0xd2, 0xa1, 0x2d, 0x33, 0x32, 0x77, 0x49, 0x27, 0x83, 0xf5, + 0xd5, 0xff, 0xbe, 0xca, 0x4c, 0xed, 0x4b, 0xee, 0xe4, 0x52, 0xe6, 0x58, 0x7b, 0x32, 0xe6, 0xb8, + 0x50, 0xc8, 0x1c, 0x17, 0x4f, 0x36, 0xc7, 0x1c, 0xd7, 0x4e, 0x63, 0x8e, 0xf5, 0x99, 0xe6, 0xd8, + 0x50, 0x99, 0x23, 0x7a, 0x1b, 0xba, 0x2c, 0x80, 0xb0, 0xbd, 0x7d, 0x7f, 0xe0, 0xd8, 0x61, 0xd4, + 0x03, 0x4a, 0xe6, 0xa5, 0xac, 0x86, 0x5a, 0xf8, 0xd3, 0x75, 0x86, 0xd8, 0xdb, 0xf7, 0x8d, 0xb6, + 0x2d, 0x7e, 0xbe, 0x67, 0x87, 0xd1, 0xfc, 0x56, 0xfd, 0x8f, 0x89, 0x55, 0x7f, 0xd9, 0xb5, 0x27, + 0xb1, 0xfc, 0x9a, 0x64, 0xf9, 0x7f, 0x51, 0x82, 0xaf, 0xdd, 0xc3, 0x51, 0x4c, 0x3e, 0x31, 0x64, + 0xfc, 0x25, 0xdd, 0xe6, 0xff, 0xba, 0x04, 0x7d, 0x15, 0xad, 0xf3, 0x6c, 0xf5, 0x1f, 0xc1, 0xf9, + 0x18, 0xc7, 0xc0, 0xc2, 0xe1, 0x30, 0xb0, 0xc7, 0x54, 0x8c, 0xd4, 0x57, 0x35, 0x37, 0xae, 0xaa, + 0x14, 0x3f, 0x4b, 0xc1, 0x6a, 0x3c, 0xc5, 0x56, 0x6a, 0x06, 0xfd, 0x27, 0x25, 0x58, 0x25, 0xbe, + 0x91, 0x3b, 0x33, 0xa2, 0x81, 0x67, 0xe6, 0xab, 0xec, 0x26, 0xcb, 0x39, 0x37, 0x59, 0x80, 0xc7, + 0x34, 0xc4, 0xce, 0xd2, 0x33, 0x0f, 0xef, 0x5e, 0x85, 0x1a, 0x31, 0x40, 0xc1, 0xaa, 0x67, 0x54, + 0xac, 0x4a, 0x23, 0x63, 0xbd, 0x75, 0x8f, 0x51, 0x91, 0xf8, 0xed, 0x39, 0xd4, 0x2d, 0xbb, 0xec, + 0xb2, 0x62, 0xd9, 0xbf, 0x5d, 0x82, 0x0b, 0x39, 0x84, 0xf3, 0xac, 0xfb, 0x0d, 0x58, 0xa0, 0xbb, + 0x91, 0x58, 0xf8, 0x73, 0xca, 0x85, 0xa7, 0xd0, 0x11, 0x6f, 0x63, 0xf0, 0x31, 0xba, 0x0f, 0x5a, + 0xb6, 0x8d, 0xec, 0x93, 0x7c, 0x8f, 0x1c, 0x78, 0xa6, 0xcb, 0x18, 0xd0, 0x30, 0x9a, 0x1c, 0xb6, + 0x63, 0xba, 0x18, 0x7d, 0x0d, 0xea, 0xc4, 0x64, 0x07, 0xb6, 0x25, 0xc4, 0xbf, 0x48, 0x4d, 0xd8, + 0x0a, 0xd1, 0x25, 0x00, 0xda, 0x64, 0x5a, 0x56, 0xc0, 0xb6, 0xd0, 0x86, 0xd1, 0x20, 0x90, 0xdb, + 0x04, 0xa0, 0xff, 0x61, 0x09, 0x2e, 0xef, 0x1e, 0x7b, 0xc3, 0x1d, 0x7c, 0xb4, 0x19, 0x60, 0x33, + 0xc2, 0x89, 0xd3, 0x7e, 0xaa, 0x8c, 0x47, 0x57, 0xa0, 0x99, 0xb2, 0x5f, 0xae, 0x92, 0x69, 0x90, + 0xfe, 0x37, 0x25, 0x68, 0x91, 0x5d, 0xe4, 0x7d, 0x1c, 0x99, 0x44, 0x45, 0xd0, 0x77, 0xa0, 0xe1, + 0xf8, 0xa6, 0x35, 0x88, 0x8e, 0xc7, 0x8c, 0x9a, 0x4e, 0x96, 0x9a, 0x64, 0xeb, 0x79, 0x70, 0x3c, + 0xc6, 0x46, 0xdd, 0xe1, 0xbf, 0x0a, 0x51, 0x94, 0xf5, 0x32, 0x15, 0x85, 0xa7, 0x7c, 0x06, 0x9a, + 0x2e, 0x8e, 0x02, 0x7b, 0xc8, 0x88, 0xa8, 0x52, 0x51, 0x00, 0x03, 0x11, 0x44, 0xfa, 0x4f, 0x16, + 0xe0, 0xfc, 0xf7, 0xcd, 0x68, 0x78, 0xb0, 0xe5, 0x8a, 0x28, 0xe6, 0xec, 0x7c, 0x4c, 0xfc, 0x72, + 0x39, 0xed, 0x97, 0x9f, 0x98, 0xdf, 0x8f, 0x6d, 0xb4, 0xa6, 0xb2, 0x51, 0x92, 0x98, 0xaf, 0x7f, + 0xc8, 0xd5, 0x2c, 0x65, 0xa3, 0xa9, 0x60, 0x63, 0xe1, 0x2c, 0xc1, 0xc6, 0x26, 0xb4, 0xf1, 0xa7, + 0x43, 0x67, 0x42, 0xf4, 0x95, 0x62, 0x67, 0x51, 0xc4, 0x65, 0x05, 0xf6, 0xb4, 0x83, 0x68, 0xf1, + 0x41, 0xdb, 0x9c, 0x06, 0xa6, 0x0b, 0x2e, 0x8e, 0x4c, 0x1a, 0x2a, 0x34, 0x37, 0xae, 0x4c, 0xd3, + 0x05, 0xa1, 0x40, 0x4c, 0x1f, 0xc8, 0x17, 0xba, 0x08, 0x0d, 0x1e, 0xda, 0x6c, 0x6f, 0xf5, 0x1a, + 0x94, 0x7d, 0x09, 0x00, 0x99, 0xd0, 0xe6, 0xde, 0x93, 0x53, 0xc8, 0x02, 0x88, 0x37, 0x54, 0x08, + 0xd4, 0xc2, 0x4e, 0x53, 0x1e, 0xf2, 0x40, 0x27, 0x4c, 0x81, 0x48, 0xe6, 0xef, 0xef, 0xef, 0x3b, + 0xb6, 0x87, 0x77, 0x98, 0x84, 0x9b, 0x94, 0x08, 0x19, 0x48, 0xc2, 0xa1, 0x43, 0x1c, 0x84, 0xb6, + 0xef, 0xf5, 0x5a, 0xb4, 0x5d, 0x7c, 0xaa, 0xa2, 0x9c, 0xf6, 0x19, 0xa2, 0x9c, 0x01, 0x2c, 0xe5, + 0x28, 0x55, 0x44, 0x39, 0xdf, 0x4a, 0x47, 0x39, 0xb3, 0x45, 0x95, 0x8a, 0x82, 0x7e, 0x5a, 0x82, + 0xd5, 0x87, 0x5e, 0x38, 0xd9, 0x8b, 0x59, 0xf4, 0xc5, 0x98, 0x43, 0xd6, 0x89, 0x56, 0x73, 0x4e, + 0x54, 0xff, 0x9f, 0x1a, 0x74, 0xf9, 0x2a, 0x88, 0xd6, 0x50, 0x97, 0x73, 0x11, 0x1a, 0xf1, 0x3e, + 0xca, 0x19, 0x92, 0x00, 0xb2, 0x3e, 0xac, 0x9c, 0xf3, 0x61, 0x85, 0x48, 0x13, 0x51, 0x51, 0x35, + 0x15, 0x15, 0x5d, 0x02, 0xd8, 0x77, 0x26, 0xe1, 0xc1, 0x20, 0xb2, 0x5d, 0xcc, 0xa3, 0xb2, 0x06, + 0x85, 0x3c, 0xb0, 0x5d, 0x8c, 0x6e, 0x43, 0x6b, 0xcf, 0xf6, 0x1c, 0x7f, 0x34, 0x18, 0x9b, 0xd1, + 0x41, 0xc8, 0xd3, 0x62, 0x95, 0x58, 0x68, 0x0c, 0x7b, 0x87, 0xf6, 0x35, 0x9a, 0x6c, 0xcc, 0x7d, + 0x32, 0x04, 0x5d, 0x86, 0xa6, 0x37, 0x71, 0x07, 0xfe, 0xfe, 0x20, 0xf0, 0x8f, 0x42, 0x9a, 0xfc, + 0x56, 0x8c, 0x86, 0x37, 0x71, 0x3f, 0xd8, 0x37, 0xfc, 0x23, 0xb2, 0x8f, 0x35, 0xc8, 0x8e, 0x16, + 0x3a, 0xfe, 0x88, 0x25, 0xbe, 0xb3, 0xe7, 0x4f, 0x06, 0x90, 0xd1, 0x16, 0x76, 0x22, 0x93, 0x8e, + 0x6e, 0x14, 0x1b, 0x1d, 0x0f, 0x40, 0x2f, 0x40, 0x67, 0xe8, 0xbb, 0x63, 0x93, 0x72, 0xe8, 0x6e, + 0xe0, 0xbb, 0xd4, 0x00, 0x2b, 0x46, 0x06, 0x8a, 0x36, 0xa1, 0x99, 0x18, 0x41, 0xd8, 0x6b, 0x52, + 0x3c, 0xba, 0xca, 0x4a, 0x53, 0xa1, 0x3c, 0x51, 0x50, 0x88, 0xad, 0x20, 0x24, 0x9a, 0x21, 0x8c, + 0x3d, 0xb4, 0x3f, 0xc3, 0xdc, 0xd0, 0x9a, 0x1c, 0xb6, 0x6b, 0x7f, 0x86, 0x49, 0x7a, 0x64, 0x7b, + 0x21, 0x0e, 0x22, 0x91, 0xac, 0xf6, 0xda, 0x54, 0x7d, 0xda, 0x0c, 0xca, 0x15, 0x1b, 0x6d, 0x41, + 0x27, 0x8c, 0xcc, 0x20, 0x1a, 0x8c, 0xfd, 0x90, 0x2a, 0x40, 0xaf, 0x43, 0x75, 0x3b, 0x63, 0x92, + 0x6e, 0x38, 0x22, 0x8a, 0x7d, 0x9f, 0x77, 0x32, 0xda, 0x74, 0x90, 0xf8, 0x24, 0xb3, 0x50, 0x4e, + 0x24, 0xb3, 0x74, 0x0b, 0xcd, 0x42, 0x07, 0xc5, 0xb3, 0xac, 0x91, 0x74, 0xc9, 0xb4, 0xcc, 0x3d, + 0x07, 0x7f, 0xc8, 0x3d, 0x88, 0x46, 0x17, 0x96, 0x05, 0xeb, 0x7f, 0x52, 0x81, 0x8e, 0xcc, 0x1e, + 0xe2, 0x76, 0x58, 0x56, 0x26, 0x74, 0x5e, 0x7c, 0x12, 0x66, 0x61, 0x8f, 0x8c, 0x66, 0x29, 0x20, + 0x55, 0xf9, 0xba, 0xd1, 0x64, 0x30, 0x3a, 0x01, 0x51, 0x5d, 0x26, 0x14, 0x6a, 0x67, 0x15, 0xca, + 0xa8, 0x06, 0x85, 0xd0, 0x50, 0xa5, 0x07, 0x8b, 0x22, 0x7b, 0x64, 0x0a, 0x2f, 0x3e, 0x49, 0xcb, + 0xde, 0xc4, 0xa6, 0x58, 0x99, 0xc2, 0x8b, 0x4f, 0xb4, 0x05, 0x2d, 0x36, 0xe5, 0xd8, 0x0c, 0x4c, + 0x57, 0xa8, 0xfb, 0xb3, 0x4a, 0x97, 0xf1, 0x2e, 0x3e, 0xfe, 0x90, 0x78, 0x9f, 0xfb, 0xa6, 0x1d, + 0x18, 0x4c, 0x3d, 0xee, 0xd3, 0x51, 0x68, 0x0d, 0x34, 0x36, 0xcb, 0xbe, 0xed, 0x60, 0x6e, 0x38, + 0x8b, 0x2c, 0x85, 0xa4, 0xf0, 0xbb, 0xb6, 0x83, 0x99, 0x6d, 0xc4, 0x4b, 0xa0, 0x0a, 0x51, 0x67, + 0xa6, 0x41, 0x21, 0x54, 0x1d, 0xae, 0x02, 0xf3, 0xa2, 0x03, 0xe1, 0x9b, 0xd9, 0x06, 0xc2, 0x68, + 0xe4, 0x6c, 0xa5, 0x21, 0xd9, 0xc4, 0x65, 0xc6, 0x05, 0x6c, 0x39, 0xde, 0xc4, 0xa5, 0xa6, 0x75, + 0x03, 0x56, 0xd8, 0x78, 0xec, 0x8d, 0x6c, 0x0f, 0xc7, 0xd3, 0x34, 0x29, 0xaf, 0x10, 0x6d, 0x7b, + 0x9b, 0x36, 0x09, 0x19, 0xfd, 0x5e, 0x0d, 0x96, 0x89, 0x4f, 0xe2, 0xee, 0x69, 0x8e, 0x90, 0xe2, + 0x12, 0x80, 0x15, 0x46, 0x03, 0xc9, 0x8f, 0x36, 0xac, 0x30, 0xe2, 0x1b, 0xce, 0x77, 0x44, 0x44, + 0x50, 0x99, 0x9e, 0xe0, 0x64, 0x7c, 0x64, 0x3e, 0x2a, 0x38, 0x53, 0x45, 0xf0, 0x2a, 0xb4, 0x79, + 0x76, 0x2f, 0xa5, 0xa2, 0x2d, 0x06, 0xdc, 0x51, 0x7b, 0xfa, 0x05, 0x65, 0x65, 0x32, 0x15, 0x19, + 0x2c, 0xce, 0x17, 0x19, 0xd4, 0xb3, 0x91, 0xc1, 0x5d, 0xe8, 0xca, 0xc6, 0x29, 0xbc, 0xdb, 0x0c, + 0xeb, 0xec, 0x48, 0xd6, 0x19, 0xa6, 0x37, 0x76, 0x90, 0x37, 0xf6, 0xab, 0xd0, 0xf6, 0x30, 0xb6, + 0x06, 0x51, 0x60, 0x7a, 0xe1, 0x3e, 0x0e, 0xa8, 0x56, 0xd4, 0x8d, 0x16, 0x01, 0x3e, 0xe0, 0x30, + 0xf4, 0x06, 0x00, 0x5d, 0x23, 0x2b, 0x68, 0xb5, 0xa6, 0x17, 0xb4, 0xa8, 0xd2, 0xd0, 0x82, 0x16, + 0x65, 0x0a, 0xfd, 0xf9, 0x84, 0x62, 0x07, 0xfd, 0x5f, 0xca, 0x70, 0x9e, 0x17, 0x38, 0xe6, 0xd7, + 0xcb, 0x69, 0x7b, 0xbb, 0xd8, 0x1c, 0x2b, 0x27, 0x94, 0x0c, 0xaa, 0x05, 0xc2, 0xdf, 0x9a, 0x22, + 0xfc, 0x95, 0xd3, 0xe6, 0x85, 0x5c, 0xda, 0x1c, 0x57, 0x0c, 0x17, 0x8b, 0x57, 0x0c, 0xd1, 0x0a, + 0xd4, 0x68, 0x2e, 0x47, 0x75, 0xa7, 0x61, 0xb0, 0x8f, 0x42, 0x52, 0xd5, 0xff, 0xa0, 0x0c, 0xed, + 0x5d, 0x6c, 0x06, 0xc3, 0x03, 0xc1, 0xc7, 0xd7, 0xd2, 0x15, 0xd6, 0xe7, 0xa6, 0x54, 0x58, 0xa5, + 0x21, 0x5f, 0x99, 0xd2, 0x2a, 0x41, 0x10, 0xf9, 0x91, 0x19, 0x53, 0x39, 0xf0, 0x26, 0x2e, 0x2f, + 0x3b, 0x76, 0x69, 0x03, 0x27, 0x75, 0x67, 0xe2, 0xea, 0xff, 0x5d, 0x82, 0xd6, 0x2f, 0x93, 0x69, + 0x04, 0x63, 0x6e, 0xa5, 0x19, 0xf3, 0xc2, 0x14, 0xc6, 0x18, 0x24, 0x2d, 0xc3, 0x87, 0xf8, 0x2b, + 0x57, 0x75, 0xfe, 0xa7, 0x12, 0xf4, 0x49, 0x52, 0x6e, 0x30, 0xbf, 0x33, 0xbf, 0x75, 0x5d, 0x85, + 0xf6, 0xa1, 0x14, 0xfe, 0x96, 0xa9, 0x72, 0xb6, 0x0e, 0xd3, 0x45, 0x04, 0x03, 0x34, 0x51, 0x04, + 0xe6, 0x8b, 0x15, 0xdb, 0xc0, 0x8b, 0x2a, 0xaa, 0x33, 0xc4, 0x51, 0x0f, 0xd1, 0x0d, 0x64, 0xa0, + 0xfe, 0x3b, 0x25, 0x58, 0x56, 0x74, 0x44, 0x17, 0x60, 0x91, 0x17, 0x2c, 0x78, 0x84, 0xc1, 0xec, + 0xdd, 0x22, 0xe2, 0x49, 0x4a, 0x6e, 0xb6, 0x95, 0x8f, 0xa9, 0x2d, 0x92, 0x83, 0xc7, 0xd9, 0x99, + 0x95, 0x93, 0x8f, 0x15, 0xa2, 0x3e, 0xd4, 0xb9, 0x37, 0x15, 0x69, 0x6f, 0xfc, 0xad, 0x3f, 0x02, + 0x74, 0x0f, 0x27, 0x7b, 0xd7, 0x3c, 0x1c, 0x4d, 0xfc, 0x4d, 0x42, 0x68, 0xda, 0x09, 0x59, 0xfa, + 0x7f, 0x96, 0x60, 0x59, 0xc2, 0x36, 0x4f, 0x61, 0x29, 0xd9, 0x5f, 0xcb, 0x67, 0xd9, 0x5f, 0xa5, + 0xe2, 0x49, 0xe5, 0x54, 0xc5, 0x93, 0xcb, 0x00, 0x31, 0xff, 0x05, 0x47, 0x53, 0x10, 0xfd, 0x1f, + 0x4a, 0x70, 0xfe, 0x1d, 0xd3, 0xb3, 0xfc, 0xfd, 0xfd, 0xf9, 0x55, 0x75, 0x13, 0xa4, 0x44, 0xb9, + 0x68, 0xf9, 0x50, 0xce, 0xae, 0x5f, 0x82, 0xa5, 0x80, 0xed, 0x4c, 0x96, 0xac, 0xcb, 0x15, 0x43, + 0x13, 0x0d, 0xb1, 0x8e, 0xfe, 0x55, 0x19, 0x10, 0x59, 0xf5, 0x1d, 0xd3, 0x31, 0xbd, 0x21, 0x3e, + 0x3b, 0xe9, 0xcf, 0x43, 0x47, 0x0a, 0x61, 0xe2, 0xe3, 0xfc, 0x74, 0x0c, 0x13, 0xa2, 0x77, 0xa1, + 0xb3, 0xc7, 0x50, 0x0d, 0x02, 0x6c, 0x86, 0xbe, 0xc7, 0xc5, 0xa1, 0xac, 0x14, 0x3e, 0x08, 0xec, + 0xd1, 0x08, 0x07, 0x9b, 0xbe, 0x67, 0xf1, 0x38, 0x7f, 0x4f, 0x90, 0x49, 0x86, 0x12, 0x63, 0x48, + 0xe2, 0xb9, 0x58, 0x38, 0x71, 0x40, 0x47, 0x59, 0x11, 0x62, 0xd3, 0x49, 0x18, 0x91, 0xec, 0x86, + 0x1a, 0x6b, 0xd8, 0x9d, 0x5e, 0x28, 0x56, 0xc4, 0x57, 0xfa, 0xdf, 0x96, 0x00, 0xc5, 0xc9, 0x3c, + 0xad, 0x7e, 0x50, 0x8b, 0xce, 0x0e, 0x2d, 0x29, 0x36, 0xe5, 0x8b, 0xd0, 0xb0, 0xc4, 0x48, 0xee, + 0x82, 0x12, 0x00, 0xdd, 0x23, 0x29, 0xd1, 0x03, 0xa2, 0x79, 0xd8, 0x12, 0xc9, 0x32, 0x03, 0xbe, + 0x47, 0x61, 0x72, 0x78, 0x56, 0xcd, 0x86, 0x67, 0xe9, 0x3a, 0x68, 0x4d, 0xaa, 0x83, 0xea, 0x3f, + 0x2d, 0x83, 0x46, 0xb7, 0x90, 0xcd, 0xa4, 0xa0, 0x55, 0x88, 0xe8, 0xab, 0xd0, 0xe6, 0xd7, 0x61, + 0x24, 0xc2, 0x5b, 0x8f, 0x53, 0x93, 0x91, 0x90, 0x9e, 0x75, 0x0a, 0x70, 0x38, 0x71, 0x92, 0x3c, + 0x91, 0xa5, 0x3f, 0xe8, 0x31, 0xdb, 0xbb, 0x48, 0x93, 0x18, 0xf1, 0x10, 0xce, 0x8f, 0x1c, 0x7f, + 0xcf, 0x74, 0x06, 0xb2, 0x78, 0x98, 0x0c, 0x0b, 0x68, 0xfc, 0x0a, 0x1b, 0xbe, 0x9b, 0x96, 0x61, + 0x88, 0xee, 0x40, 0x3b, 0xc4, 0xf8, 0x51, 0x92, 0x3c, 0xd6, 0x8a, 0x24, 0x8f, 0x2d, 0x32, 0x46, + 0x7c, 0xe9, 0x7f, 0x5c, 0x82, 0x6e, 0xe6, 0x14, 0x23, 0x5b, 0xea, 0x28, 0xe5, 0x4b, 0x1d, 0xb7, + 0xa0, 0x46, 0x3c, 0x15, 0xdb, 0x5b, 0x3a, 0xea, 0x34, 0x5c, 0x9e, 0xd5, 0x60, 0x03, 0xd0, 0x75, + 0x58, 0x56, 0xdc, 0x96, 0xe0, 0xe2, 0x47, 0xf9, 0xcb, 0x12, 0xfa, 0xcf, 0xaa, 0xd0, 0x4c, 0xb1, + 0x62, 0x46, 0x95, 0xe6, 0x89, 0x54, 0xa3, 0xa7, 0x9d, 0x8e, 0x13, 0x95, 0x73, 0xb1, 0xcb, 0x32, + 0x45, 0x9e, 0xb6, 0xba, 0xd8, 0xa5, 0x79, 0x62, 0x3a, 0x05, 0x5c, 0x90, 0x53, 0x40, 0x39, 0x49, + 0x5e, 0x3c, 0x21, 0x49, 0xae, 0xcb, 0x49, 0xb2, 0x64, 0x42, 0x8d, 0xac, 0x09, 0x15, 0x2d, 0x9c, + 0xdc, 0x80, 0xe5, 0x21, 0xab, 0xf6, 0xdf, 0x39, 0xde, 0x8c, 0x9b, 0x78, 0x50, 0xaa, 0x6a, 0x42, + 0x77, 0x93, 0x92, 0x28, 0x93, 0x32, 0x4b, 0x3a, 0xd4, 0x39, 0x38, 0x97, 0x0d, 0x13, 0xb2, 0xf0, + 0xcc, 0xf4, 0x2b, 0x5b, 0xb2, 0x69, 0x9f, 0xa9, 0x64, 0xf3, 0x0c, 0x34, 0x45, 0xa4, 0x42, 0x2c, + 0xbd, 0xc3, 0x9c, 0x9e, 0x70, 0x03, 0x56, 0x28, 0xf9, 0x81, 0xae, 0x7c, 0x1e, 0x92, 0xad, 0x60, + 0x68, 0xf9, 0x0a, 0xc6, 0x05, 0x58, 0xb4, 0xc3, 0xc1, 0xbe, 0xf9, 0x08, 0xf7, 0x96, 0x68, 0xeb, + 0x82, 0x1d, 0xde, 0x35, 0x1f, 0x61, 0xfd, 0xdf, 0x2a, 0xd0, 0x49, 0x36, 0xd8, 0xc2, 0x1e, 0xa4, + 0xc8, 0x8d, 0xa1, 0x1d, 0xd0, 0x92, 0xb8, 0x87, 0x72, 0xf8, 0xc4, 0x1c, 0x3c, 0x7b, 0xc8, 0xd8, + 0x1d, 0x67, 0xec, 0x55, 0xda, 0xee, 0xab, 0xa7, 0xda, 0xee, 0xe7, 0xbc, 0x4b, 0x70, 0x13, 0x56, + 0xe3, 0xbd, 0x57, 0x5a, 0x36, 0x4b, 0xb0, 0x56, 0x44, 0xe3, 0xfd, 0xf4, 0xf2, 0xa7, 0xb8, 0x80, + 0xc5, 0x69, 0x2e, 0x20, 0xab, 0x02, 0xf5, 0x9c, 0x0a, 0xe4, 0xaf, 0x34, 0x34, 0x14, 0x57, 0x1a, + 0xf4, 0x87, 0xb0, 0x4c, 0xcb, 0xd3, 0xe1, 0x30, 0xb0, 0xf7, 0x70, 0x9c, 0x02, 0x14, 0x11, 0x6b, + 0x1f, 0xea, 0x99, 0x2c, 0x22, 0xfe, 0xd6, 0x7f, 0x5c, 0x82, 0xf3, 0xf9, 0x79, 0xa9, 0xc6, 0x24, + 0x8e, 0xa4, 0x24, 0x39, 0x92, 0x5f, 0x81, 0xe5, 0x54, 0x44, 0x29, 0xcd, 0x3c, 0x25, 0x02, 0x57, + 0x10, 0x6e, 0xa0, 0x64, 0x0e, 0x01, 0xd3, 0x7f, 0x56, 0x8a, 0xab, 0xfc, 0x04, 0x36, 0xa2, 0x47, + 0x28, 0x64, 0x5f, 0xf3, 0x3d, 0xc7, 0xf6, 0xe2, 0x82, 0x0b, 0x5f, 0x23, 0x03, 0xf2, 0x82, 0xcb, + 0x3b, 0xd0, 0xe5, 0x9d, 0xe2, 0xed, 0xa9, 0x60, 0x40, 0xd6, 0x61, 0xe3, 0xe2, 0x8d, 0xe9, 0x79, + 0xe8, 0xf0, 0xb3, 0x0d, 0x81, 0xaf, 0xa2, 0x3a, 0xf1, 0xf8, 0x1e, 0x68, 0xa2, 0xdb, 0x69, 0x37, + 0xc4, 0x2e, 0x1f, 0x18, 0x07, 0x76, 0xbf, 0x59, 0x82, 0x9e, 0xbc, 0x3d, 0xa6, 0x96, 0x7f, 0xfa, + 0xf0, 0xee, 0x75, 0xf9, 0x44, 0xfb, 0xf9, 0x13, 0xe8, 0x49, 0xf0, 0x88, 0x73, 0xed, 0xdf, 0x2d, + 0xd3, 0xeb, 0x09, 0x24, 0xd5, 0xdb, 0xb2, 0xc3, 0x28, 0xb0, 0xf7, 0x26, 0xf3, 0x9d, 0xb1, 0x9a, + 0xd0, 0x1c, 0x1e, 0xe0, 0xe1, 0xa3, 0xb1, 0x6f, 0x27, 0x52, 0x79, 0x4b, 0x45, 0xd3, 0x74, 0xb4, + 0xeb, 0x9b, 0xc9, 0x0c, 0xec, 0x90, 0x2a, 0x3d, 0x67, 0xff, 0x87, 0xa0, 0x65, 0x3b, 0xa4, 0xcf, + 0x86, 0x1a, 0xec, 0x6c, 0xe8, 0xa6, 0x7c, 0x36, 0x34, 0x23, 0xd2, 0x48, 0x1d, 0x0d, 0xfd, 0x5d, + 0x19, 0xbe, 0xae, 0xa4, 0x6d, 0x9e, 0x2c, 0x69, 0x5a, 0x1d, 0xe9, 0x0e, 0xd4, 0x33, 0x49, 0xed, + 0x0b, 0x27, 0xc8, 0x8f, 0xd7, 0x5d, 0x59, 0x69, 0x30, 0x4c, 0x62, 0xab, 0xc4, 0xe0, 0xab, 0xd3, + 0xe7, 0xe0, 0x76, 0x27, 0xcd, 0x21, 0xc6, 0xa1, 0xdb, 0xd0, 0x62, 0x05, 0x83, 0xc1, 0xa1, 0x8d, + 0x8f, 0xc4, 0xc9, 0xeb, 0x65, 0xa5, 0x6b, 0xa6, 0xfd, 0x3e, 0xb4, 0xf1, 0x91, 0xd1, 0x74, 0xe2, + 0xdf, 0xa1, 0xfe, 0xfb, 0x55, 0x80, 0xa4, 0x8d, 0x64, 0x67, 0x89, 0xcd, 0x73, 0x23, 0x4e, 0x41, + 0x48, 0x2c, 0x21, 0x47, 0xae, 0xe2, 0x13, 0x19, 0xc9, 0xc9, 0x87, 0x65, 0x87, 0x11, 0xe7, 0xcb, + 0xf5, 0x93, 0x69, 0x11, 0x2c, 0x22, 0x22, 0xe3, 0x3a, 0x13, 0x26, 0x10, 0xf4, 0x0a, 0xa0, 0x51, + 0xe0, 0x1f, 0xd9, 0xde, 0x28, 0x9d, 0x6f, 0xb0, 0xb4, 0x64, 0x89, 0xb7, 0xa4, 0x12, 0x8e, 0x1f, + 0x81, 0x96, 0xe9, 0x2e, 0x58, 0x72, 0x73, 0x06, 0x19, 0xf7, 0xa4, 0xb9, 0xb8, 0xfa, 0x76, 0x65, + 0x0c, 0xf4, 0x98, 0xf5, 0x81, 0x19, 0x8c, 0xb0, 0x90, 0x28, 0x8f, 0xc3, 0x64, 0x60, 0x7f, 0x00, + 0x5a, 0x76, 0x55, 0x8a, 0x43, 0xd0, 0x57, 0x65, 0x45, 0x3f, 0xc9, 0x1f, 0x91, 0x69, 0x52, 0xaa, + 0xde, 0x37, 0x61, 0x45, 0x45, 0xaf, 0x02, 0xc9, 0x99, 0xad, 0xe9, 0xad, 0x38, 0x24, 0xa6, 0x72, + 0x98, 0xb6, 0xcb, 0xa4, 0x0a, 0xcf, 0x65, 0xa9, 0xf0, 0xac, 0xff, 0x7a, 0x05, 0x50, 0x5e, 0xfd, + 0x51, 0x07, 0xca, 0xf1, 0x24, 0xe5, 0xed, 0xad, 0x8c, 0xba, 0x95, 0x73, 0xea, 0x76, 0x11, 0x1a, + 0xf1, 0xae, 0xcf, 0x5d, 0x7c, 0x02, 0x48, 0x2b, 0x63, 0x55, 0x56, 0xc6, 0x14, 0x61, 0x35, 0xb9, + 0x22, 0x7e, 0x03, 0x56, 0x1c, 0x33, 0x8c, 0x06, 0xac, 0xf0, 0x1e, 0xd9, 0x2e, 0x0e, 0x23, 0xd3, + 0x1d, 0x53, 0x51, 0x56, 0x0d, 0x44, 0xda, 0xb6, 0x48, 0xd3, 0x03, 0xd1, 0x82, 0x1e, 0x88, 0xe8, + 0x9a, 0xf8, 0x5e, 0x7e, 0xbd, 0xe0, 0xd5, 0x62, 0xe6, 0x9e, 0x94, 0xbb, 0x99, 0x46, 0x35, 0xe2, + 0xb0, 0xb3, 0xff, 0x09, 0x74, 0xe4, 0x46, 0x85, 0xf8, 0x6e, 0xc9, 0xe2, 0x2b, 0x12, 0xd8, 0xa6, + 0x64, 0x78, 0x00, 0x28, 0xef, 0x3c, 0xd2, 0x3c, 0x2b, 0xc9, 0x3c, 0x9b, 0x25, 0x8b, 0x14, 0x4f, + 0x2b, 0xb2, 0xb0, 0xff, 0xac, 0x02, 0x28, 0x89, 0xe0, 0xe2, 0xe3, 0xee, 0x22, 0x61, 0xcf, 0x75, + 0x58, 0xce, 0xc7, 0x77, 0x22, 0xa8, 0x45, 0xb9, 0xe8, 0x4e, 0x15, 0x89, 0x55, 0x54, 0x97, 0x4b, + 0x5f, 0x8b, 0xdd, 0x3d, 0x0b, 0x57, 0x2f, 0x4f, 0x3d, 0xcf, 0x90, 0x3d, 0xfe, 0x0f, 0xb3, 0x97, + 0x52, 0x99, 0xff, 0xb8, 0xa5, 0x74, 0xcd, 0xb9, 0x25, 0xcf, 0xbc, 0x91, 0x2a, 0x05, 0xd2, 0x0b, + 0xa7, 0x09, 0xa4, 0xe7, 0xbf, 0x42, 0xfa, 0x1f, 0x65, 0x58, 0x8a, 0x19, 0x79, 0x2a, 0x21, 0xcd, + 0xbe, 0x99, 0xf0, 0x94, 0xa5, 0xf2, 0xb1, 0x5a, 0x2a, 0xdf, 0x3e, 0x31, 0x99, 0x29, 0x2a, 0x94, + 0xf9, 0x39, 0xfb, 0x19, 0x2c, 0xf2, 0xb2, 0x74, 0xce, 0xc1, 0x15, 0x29, 0x17, 0xac, 0x40, 0x8d, + 0xf8, 0x53, 0x51, 0x53, 0x64, 0x1f, 0x8c, 0xa5, 0xe9, 0x2b, 0xca, 0xdc, 0xc7, 0xb5, 0xa5, 0x1b, + 0xca, 0xfa, 0x6f, 0x55, 0x00, 0x76, 0x8f, 0xbd, 0xe1, 0x6d, 0x66, 0xa4, 0x37, 0xa0, 0x3a, 0xeb, + 0x42, 0x1b, 0xe9, 0x4d, 0x75, 0x8b, 0xf6, 0x2c, 0x20, 0x5c, 0xa9, 0x20, 0x52, 0xc9, 0x16, 0x44, + 0xa6, 0x95, 0x32, 0xa6, 0xbb, 0xe0, 0x6f, 0x43, 0x95, 0xba, 0x52, 0x76, 0xdf, 0xab, 0xd0, 0xa9, + 0x30, 0x1d, 0x80, 0xd6, 0x40, 0x6c, 0xc9, 0xdb, 0x1e, 0xdb, 0x73, 0xa9, 0x3b, 0xae, 0x18, 0x59, + 0x30, 0x7a, 0x01, 0x3a, 0xac, 0x10, 0x16, 0x77, 0x64, 0x39, 0x5d, 0x06, 0x9a, 0xdf, 0xd1, 0x1b, + 0x8a, 0x1d, 0x9d, 0xe0, 0xb5, 0x02, 0x7f, 0x3c, 0x4e, 0x4d, 0xc7, 0x2a, 0x21, 0x59, 0xb0, 0xfe, + 0x79, 0x19, 0x2e, 0x10, 0xfe, 0x3e, 0x99, 0xa8, 0xbc, 0x88, 0xf2, 0xa4, 0xfc, 0x79, 0x45, 0xf6, + 0xe7, 0xb7, 0x60, 0x91, 0x95, 0x5b, 0x44, 0x7c, 0x79, 0x79, 0x9a, 0x36, 0x30, 0xdd, 0x31, 0x44, + 0xf7, 0x79, 0x73, 0x76, 0xe9, 0xcc, 0x7c, 0x61, 0xbe, 0x33, 0xf3, 0xc5, 0x6c, 0x51, 0x36, 0xa5, + 0x56, 0x75, 0x79, 0x17, 0x7a, 0x08, 0x6d, 0x23, 0x6d, 0x1a, 0x08, 0x41, 0x35, 0x75, 0xc5, 0x95, + 0xfe, 0xa6, 0x69, 0xb6, 0x39, 0x36, 0x87, 0x76, 0x74, 0x4c, 0xd9, 0x59, 0x33, 0xe2, 0x6f, 0xb5, + 0x1d, 0xea, 0xff, 0x5b, 0x82, 0xf3, 0xe2, 0x50, 0x95, 0x5b, 0xf9, 0xd9, 0x25, 0xba, 0x01, 0xab, + 0xdc, 0xa4, 0x33, 0xb6, 0xcd, 0x82, 0xe9, 0x65, 0x06, 0x93, 0x97, 0xb1, 0x01, 0xab, 0x11, 0xd5, + 0xae, 0xec, 0x18, 0x26, 0xef, 0x65, 0xd6, 0x28, 0x8f, 0x29, 0x72, 0xa8, 0xfd, 0x0c, 0xbb, 0xb3, + 0xc5, 0x59, 0xcb, 0x8d, 0x14, 0xbc, 0x89, 0xcb, 0x57, 0xa9, 0x1f, 0xc1, 0x45, 0x76, 0xc9, 0x7c, + 0x4f, 0xa6, 0x68, 0xae, 0x33, 0x0d, 0xe5, 0xba, 0x33, 0x3e, 0xed, 0x4f, 0x4b, 0x70, 0x69, 0x0a, + 0xe6, 0x79, 0xb2, 0xb9, 0xf7, 0x94, 0xd8, 0xa7, 0xe4, 0xde, 0x12, 0x5e, 0x76, 0x61, 0x41, 0x26, + 0xf2, 0xf3, 0x2a, 0x2c, 0xe5, 0x3a, 0x9d, 0x5a, 0xe7, 0x5e, 0x06, 0x44, 0x84, 0x10, 0x3f, 0xa8, + 0xa4, 0xe5, 0x0c, 0xbe, 0x79, 0x6a, 0xde, 0xc4, 0x8d, 0x1f, 0x53, 0xee, 0xf8, 0x16, 0x46, 0x36, + 0xeb, 0xcd, 0x4e, 0x34, 0x62, 0xc9, 0x55, 0xa7, 0xbf, 0x9b, 0xc9, 0x11, 0xb8, 0xbe, 0x33, 0x71, + 0xd9, 0xe1, 0x07, 0x97, 0x32, 0xdb, 0x10, 0x09, 0x2a, 0x09, 0x8c, 0xf6, 0x61, 0x89, 0xde, 0xe8, + 0x9b, 0x44, 0x23, 0x9f, 0x24, 0x54, 0x94, 0x2e, 0xb6, 0xed, 0x7e, 0xb7, 0x30, 0xa6, 0x0f, 0xf8, + 0x68, 0x42, 0x3c, 0xcf, 0xa9, 0x3c, 0x19, 0x2a, 0xf0, 0xd8, 0xde, 0xd0, 0x77, 0x63, 0x3c, 0x0b, + 0xa7, 0xc4, 0xb3, 0xcd, 0x47, 0xcb, 0x78, 0xd2, 0xd0, 0xfe, 0x26, 0xac, 0x2a, 0x97, 0x3e, 0x6b, + 0xa3, 0xaf, 0xa5, 0x33, 0xaf, 0x3b, 0xb0, 0xa2, 0x5a, 0xd5, 0x19, 0xe6, 0xc8, 0x51, 0x7c, 0x9a, + 0x39, 0xf4, 0xbf, 0x2c, 0x43, 0x7b, 0x0b, 0x3b, 0x38, 0xc2, 0x4f, 0xf7, 0xcc, 0x39, 0x77, 0x80, + 0x5e, 0xc9, 0x1f, 0xa0, 0xe7, 0x6e, 0x03, 0x54, 0x15, 0xb7, 0x01, 0x2e, 0xc5, 0x97, 0x20, 0xc8, + 0x2c, 0x35, 0x39, 0x86, 0xb0, 0xd0, 0xeb, 0xd0, 0x1a, 0x07, 0xb6, 0x6b, 0x06, 0xc7, 0x83, 0x47, + 0xf8, 0x38, 0xe4, 0x9b, 0x46, 0x4f, 0xb9, 0xed, 0x6c, 0x6f, 0x85, 0x46, 0x93, 0xf7, 0x7e, 0x17, + 0x1f, 0xd3, 0x0b, 0x16, 0x71, 0x1a, 0xc7, 0xee, 0xe0, 0x55, 0x8d, 0x14, 0xe4, 0xda, 0x4b, 0xd0, + 0x88, 0x2f, 0x2e, 0xa1, 0x3a, 0x54, 0xef, 0x4e, 0x1c, 0x47, 0x3b, 0x87, 0x1a, 0x50, 0xa3, 0x89, + 0x9e, 0x56, 0x22, 0x3f, 0x69, 0xec, 0xa7, 0x95, 0xaf, 0xfd, 0x12, 0x34, 0xe2, 0x0b, 0x14, 0xa8, + 0x09, 0x8b, 0x0f, 0xbd, 0x77, 0x3d, 0xff, 0xc8, 0xd3, 0xce, 0xa1, 0x45, 0xa8, 0xdc, 0x76, 0x1c, + 0xad, 0x84, 0xda, 0xd0, 0xd8, 0x8d, 0x02, 0x6c, 0x12, 0xf1, 0x69, 0x65, 0xd4, 0x01, 0x78, 0xc7, + 0x0e, 0x23, 0x3f, 0xb0, 0x87, 0xa6, 0xa3, 0x55, 0xae, 0x7d, 0x06, 0x1d, 0xb9, 0x9e, 0x8e, 0x5a, + 0x50, 0xdf, 0xf1, 0xa3, 0xb7, 0x3f, 0xb5, 0xc3, 0x48, 0x3b, 0x47, 0xfa, 0xef, 0xf8, 0xd1, 0xfd, + 0x00, 0x87, 0xd8, 0x8b, 0xb4, 0x12, 0x02, 0x58, 0xf8, 0xc0, 0xdb, 0xb2, 0xc3, 0x47, 0x5a, 0x19, + 0x2d, 0xf3, 0xa3, 0x32, 0xd3, 0xd9, 0xe6, 0x45, 0x6a, 0xad, 0x42, 0x86, 0xc7, 0x5f, 0x55, 0xa4, + 0x41, 0x2b, 0xee, 0x72, 0xef, 0xfe, 0x43, 0xad, 0xc6, 0xa8, 0x27, 0x3f, 0x17, 0xae, 0x59, 0xa0, + 0x65, 0x8f, 0x78, 0xc9, 0x9c, 0x6c, 0x11, 0x31, 0x48, 0x3b, 0x47, 0x56, 0xc6, 0xcf, 0xd8, 0xb5, + 0x12, 0xea, 0x42, 0x33, 0x75, 0x62, 0xad, 0x95, 0x09, 0xe0, 0x5e, 0x30, 0x1e, 0x72, 0xdd, 0x62, + 0x24, 0x10, 0x45, 0xdd, 0x22, 0x9c, 0xa8, 0x5e, 0xbb, 0x03, 0x75, 0x91, 0x9f, 0x90, 0xae, 0x9c, + 0x45, 0xe4, 0x53, 0x3b, 0x87, 0x96, 0xa0, 0x2d, 0x3d, 0xd6, 0xd3, 0x4a, 0x08, 0x41, 0x47, 0x7e, + 0x4e, 0xab, 0x95, 0xaf, 0x6d, 0x00, 0x24, 0x71, 0x3e, 0x21, 0x67, 0xdb, 0x3b, 0x34, 0x1d, 0xdb, + 0x62, 0xb4, 0x91, 0x26, 0xc2, 0x5d, 0xca, 0x1d, 0x66, 0xb3, 0x5a, 0xf9, 0xda, 0x9b, 0x50, 0x17, + 0xb1, 0x2b, 0x81, 0x1b, 0xd8, 0xf5, 0x0f, 0x31, 0x93, 0xcc, 0x2e, 0x8e, 0x98, 0x1c, 0x6f, 0xbb, + 0xd8, 0xb3, 0xb4, 0x32, 0x21, 0xe3, 0xe1, 0xd8, 0x32, 0x23, 0x71, 0xe9, 0x51, 0xab, 0x6c, 0xfc, + 0xd7, 0x32, 0x00, 0x3b, 0xb3, 0xf5, 0xfd, 0xc0, 0x42, 0x0e, 0xbd, 0xbb, 0xb1, 0xe9, 0xbb, 0x63, + 0xdf, 0x13, 0x07, 0x4a, 0x21, 0x5a, 0xcf, 0x94, 0x48, 0xd8, 0x47, 0xbe, 0x23, 0xe7, 0x4d, 0xff, + 0x39, 0x65, 0xff, 0x4c, 0x67, 0xfd, 0x1c, 0x72, 0x29, 0xb6, 0x07, 0xb6, 0x8b, 0x1f, 0xd8, 0xc3, + 0x47, 0xf1, 0x41, 0xef, 0xf4, 0x67, 0xae, 0x99, 0xae, 0x02, 0xdf, 0x55, 0x25, 0xbe, 0xdd, 0x28, + 0xb0, 0xbd, 0x91, 0xd8, 0x1d, 0xf5, 0x73, 0xe8, 0x71, 0xe6, 0x91, 0xad, 0x40, 0xb8, 0x51, 0xe4, + 0x5d, 0xed, 0xd9, 0x50, 0x3a, 0xd0, 0xcd, 0xfc, 0x9b, 0x01, 0xba, 0xa6, 0x7e, 0xad, 0xa4, 0xfa, + 0xe7, 0x85, 0xfe, 0x4b, 0x85, 0xfa, 0xc6, 0xd8, 0x6c, 0xe8, 0xc8, 0xcf, 0xf0, 0xd1, 0x37, 0xa6, + 0x4d, 0x90, 0x7b, 0x2f, 0xd9, 0xbf, 0x56, 0xa4, 0x6b, 0x8c, 0xea, 0x23, 0xa6, 0xbe, 0xb3, 0x50, + 0x29, 0x9f, 0xa8, 0xf6, 0x4f, 0x0a, 0x4c, 0xf4, 0x73, 0xe8, 0x13, 0x12, 0x43, 0x64, 0x5e, 0x75, + 0xa2, 0x97, 0xd5, 0xfb, 0x9e, 0xfa, 0xf1, 0xe7, 0x2c, 0x0c, 0x1f, 0x65, 0x8d, 0x6f, 0x3a, 0xf5, + 0xb9, 0xe7, 0xe2, 0xc5, 0xa9, 0x4f, 0x4d, 0x7f, 0x12, 0xf5, 0xa7, 0xc6, 0xe0, 0xb0, 0x74, 0x4a, + 0xf1, 0x9e, 0x2c, 0xab, 0xca, 0x49, 0x36, 0x33, 0xfd, 0xf1, 0xd9, 0x2c, 0x6c, 0x13, 0x6a, 0xa4, + 0xd9, 0xcb, 0x0a, 0xaf, 0x4c, 0x39, 0x06, 0x51, 0x3f, 0x64, 0xed, 0xaf, 0x17, 0xed, 0x9e, 0xd6, + 0x65, 0xf9, 0xad, 0xa4, 0x5a, 0x44, 0xca, 0xf7, 0x9d, 0x6a, 0x5d, 0x56, 0x3f, 0xbd, 0xd4, 0xcf, + 0xa1, 0x07, 0x92, 0xab, 0x47, 0x2f, 0x4c, 0x53, 0x05, 0xf9, 0xf6, 0xd2, 0x2c, 0xbe, 0xfd, 0x2a, + 0x20, 0x66, 0xa9, 0xde, 0xbe, 0x3d, 0x9a, 0x04, 0x26, 0x53, 0xe3, 0x69, 0xce, 0x2d, 0xdf, 0x55, + 0xa0, 0xf9, 0xe6, 0x29, 0x46, 0xc4, 0x4b, 0x1a, 0x00, 0xdc, 0xc3, 0xd1, 0xfb, 0xf4, 0xd1, 0x5c, + 0x98, 0x5d, 0x51, 0xe2, 0xbf, 0x79, 0x07, 0x81, 0xea, 0xc5, 0x99, 0xfd, 0x62, 0x04, 0x7b, 0xd0, + 0xbc, 0x47, 0xf2, 0x2b, 0x1a, 0x33, 0x86, 0x68, 0xea, 0x48, 0xd1, 0x43, 0xa0, 0x58, 0x9b, 0xdd, + 0x31, 0xed, 0x3c, 0x33, 0xef, 0x46, 0xd1, 0x54, 0xc1, 0xe6, 0x5f, 0xb3, 0xaa, 0x9d, 0xe7, 0x94, + 0x87, 0xa8, 0x6c, 0x45, 0xf4, 0x28, 0xee, 0x1d, 0x6c, 0x3a, 0xd1, 0xc1, 0x94, 0x15, 0xa5, 0x7a, + 0x9c, 0xbc, 0x22, 0xa9, 0x63, 0x8c, 0x03, 0xc3, 0x32, 0xb3, 0x42, 0x39, 0x31, 0xbd, 0xae, 0x9e, + 0x22, 0xdf, 0xb3, 0xa0, 0xea, 0x99, 0xb0, 0xb4, 0x15, 0xf8, 0x63, 0x19, 0xc9, 0x2b, 0x4a, 0x24, + 0xb9, 0x7e, 0x05, 0x51, 0x7c, 0x1f, 0x5a, 0x22, 0xff, 0xa7, 0x19, 0x8b, 0x9a, 0x0b, 0xe9, 0x2e, + 0x05, 0x27, 0xfe, 0x18, 0xba, 0x99, 0xc2, 0x82, 0x5a, 0xe8, 0xea, 0xea, 0xc3, 0xac, 0xd9, 0x8f, + 0x00, 0xd1, 0xc7, 0xc0, 0xf2, 0xff, 0x19, 0xa8, 0xe3, 0x9b, 0x7c, 0x47, 0x81, 0xe4, 0x7a, 0xe1, + 0xfe, 0xb1, 0xe4, 0x7f, 0x0d, 0x56, 0x95, 0xc9, 0x7b, 0xd6, 0x21, 0xf0, 0xeb, 0xca, 0x27, 0x54, + 0x18, 0xb2, 0x0e, 0xe1, 0xc4, 0x11, 0x02, 0xff, 0xc6, 0xbf, 0x23, 0x68, 0xd0, 0x38, 0x8f, 0x4a, + 0xeb, 0x17, 0x61, 0xde, 0x93, 0x0d, 0xf3, 0x3e, 0x86, 0x6e, 0xe6, 0x91, 0xaa, 0x5a, 0x69, 0xd5, + 0x2f, 0x59, 0x0b, 0x44, 0x2b, 0xf2, 0xfb, 0x4e, 0xf5, 0x56, 0xa8, 0x7c, 0x03, 0x3a, 0x6b, 0xee, + 0x0f, 0xd9, 0x03, 0xf0, 0xf8, 0x34, 0xf7, 0xc5, 0xa9, 0x87, 0x0f, 0xf2, 0xb5, 0xe3, 0x2f, 0x3e, + 0x0a, 0xfa, 0x6a, 0x47, 0xa0, 0x1f, 0x43, 0x37, 0xf3, 0xb0, 0x47, 0xad, 0x31, 0xea, 0xd7, 0x3f, + 0xb3, 0x66, 0xff, 0x39, 0x06, 0x4f, 0x16, 0x2c, 0x2b, 0xde, 0x51, 0xa0, 0xf5, 0x69, 0x81, 0xa8, + 0xfa, 0xc1, 0xc5, 0xec, 0x05, 0xb5, 0x25, 0x33, 0xcd, 0xee, 0x37, 0x09, 0x91, 0xd9, 0x3f, 0x42, + 0xea, 0xbf, 0x5c, 0xec, 0x5f, 0x93, 0xe2, 0x05, 0xed, 0xc2, 0x02, 0x7b, 0xee, 0x83, 0x9e, 0x55, + 0x1f, 0xc2, 0xa4, 0x9e, 0x02, 0xf5, 0x67, 0x3d, 0x18, 0x0a, 0x27, 0x4e, 0x44, 0xe8, 0xff, 0x01, + 0x74, 0x18, 0x28, 0x66, 0xd0, 0x13, 0x9c, 0x7c, 0x17, 0x6a, 0xd4, 0xb5, 0x23, 0xe5, 0x81, 0x42, + 0xfa, 0x51, 0x4f, 0x7f, 0xf6, 0x3b, 0x9e, 0x84, 0xe2, 0x26, 0x1d, 0xc9, 0xaa, 0x3a, 0x4f, 0x72, + 0xea, 0x1b, 0x25, 0xf4, 0x03, 0x68, 0xb3, 0xc9, 0x05, 0x37, 0x9e, 0x24, 0xe5, 0x43, 0x58, 0x4e, + 0x51, 0xfe, 0x34, 0x50, 0xdc, 0x28, 0xfd, 0x3f, 0x8f, 0xee, 0x3f, 0xa5, 0x8f, 0x6a, 0xb2, 0xd7, + 0xc6, 0xd0, 0xfa, 0xe9, 0xee, 0xbe, 0xf5, 0xaf, 0x17, 0xee, 0x1f, 0x63, 0xfe, 0x11, 0x68, 0xd9, + 0xa3, 0x42, 0xf4, 0xd2, 0x34, 0x5f, 0xa2, 0xc2, 0x39, 0xc3, 0x91, 0x7c, 0x0f, 0x16, 0x58, 0x8d, + 0x58, 0x6d, 0x80, 0x52, 0xfd, 0x78, 0xc6, 0x5c, 0x77, 0xbe, 0xf5, 0xd1, 0xc6, 0xc8, 0x8e, 0x0e, + 0x26, 0x7b, 0xa4, 0xe5, 0x3a, 0xeb, 0xfa, 0x8a, 0xed, 0xf3, 0x5f, 0xd7, 0x85, 0x2c, 0xaf, 0xd3, + 0xd1, 0xd7, 0x29, 0x82, 0xf1, 0xde, 0xde, 0x02, 0xfd, 0xbc, 0xf9, 0x7f, 0x01, 0x00, 0x00, 0xff, + 0xff, 0x58, 0xcf, 0x74, 0x0f, 0x02, 0x54, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/internal/proto/rootcoordpb/root_coord.pb.go b/internal/proto/rootcoordpb/root_coord.pb.go index ff74594ed2..7d16956e9b 100644 --- a/internal/proto/rootcoordpb/root_coord.pb.go +++ b/internal/proto/rootcoordpb/root_coord.pb.go @@ -793,28 +793,28 @@ type RootCoordClient interface { GetComponentStates(ctx context.Context, in *milvuspb.GetComponentStatesRequest, opts ...grpc.CallOption) (*milvuspb.ComponentStates, error) GetTimeTickChannel(ctx context.Context, in *internalpb.GetTimeTickChannelRequest, opts ...grpc.CallOption) (*milvuspb.StringResponse, error) GetStatisticsChannel(ctx context.Context, in *internalpb.GetStatisticsChannelRequest, opts ...grpc.CallOption) (*milvuspb.StringResponse, error) - // * + //* // @brief This method is used to create collection // // @param CreateCollectionRequest, use to provide collection information to be created. // // @return Status CreateCollection(ctx context.Context, in *milvuspb.CreateCollectionRequest, opts ...grpc.CallOption) (*commonpb.Status, error) - // * + //* // @brief This method is used to delete collection. // // @param DropCollectionRequest, collection name is going to be deleted. // // @return Status DropCollection(ctx context.Context, in *milvuspb.DropCollectionRequest, opts ...grpc.CallOption) (*commonpb.Status, error) - // * + //* // @brief This method is used to test collection existence. // // @param HasCollectionRequest, collection name is going to be tested. // // @return BoolResponse HasCollection(ctx context.Context, in *milvuspb.HasCollectionRequest, opts ...grpc.CallOption) (*milvuspb.BoolResponse, error) - // * + //* // @brief This method is used to get collection schema. // // @param DescribeCollectionRequest, target collection name. @@ -825,28 +825,28 @@ type RootCoordClient interface { CreateAlias(ctx context.Context, in *milvuspb.CreateAliasRequest, opts ...grpc.CallOption) (*commonpb.Status, error) DropAlias(ctx context.Context, in *milvuspb.DropAliasRequest, opts ...grpc.CallOption) (*commonpb.Status, error) AlterAlias(ctx context.Context, in *milvuspb.AlterAliasRequest, opts ...grpc.CallOption) (*commonpb.Status, error) - // * + //* // @brief This method is used to list all collections. // // @return StringListResponse, collection name list ShowCollections(ctx context.Context, in *milvuspb.ShowCollectionsRequest, opts ...grpc.CallOption) (*milvuspb.ShowCollectionsResponse, error) AlterCollection(ctx context.Context, in *milvuspb.AlterCollectionRequest, opts ...grpc.CallOption) (*commonpb.Status, error) - // * + //* // @brief This method is used to create partition // // @return Status CreatePartition(ctx context.Context, in *milvuspb.CreatePartitionRequest, opts ...grpc.CallOption) (*commonpb.Status, error) - // * + //* // @brief This method is used to drop partition // // @return Status DropPartition(ctx context.Context, in *milvuspb.DropPartitionRequest, opts ...grpc.CallOption) (*commonpb.Status, error) - // * + //* // @brief This method is used to test partition existence. // // @return BoolResponse HasPartition(ctx context.Context, in *milvuspb.HasPartitionRequest, opts ...grpc.CallOption) (*milvuspb.BoolResponse, error) - // * + //* // @brief This method is used to show partition information // // @param ShowPartitionRequest, target collection name. @@ -854,7 +854,7 @@ type RootCoordClient interface { // @return StringListResponse ShowPartitions(ctx context.Context, in *milvuspb.ShowPartitionsRequest, opts ...grpc.CallOption) (*milvuspb.ShowPartitionsResponse, error) ShowPartitionsInternal(ctx context.Context, in *milvuspb.ShowPartitionsRequest, opts ...grpc.CallOption) (*milvuspb.ShowPartitionsResponse, error) - // rpc DescribeSegment(milvus.DescribeSegmentRequest) returns (milvus.DescribeSegmentResponse) {} + // rpc DescribeSegment(milvus.DescribeSegmentRequest) returns (milvus.DescribeSegmentResponse) {} ShowSegments(ctx context.Context, in *milvuspb.ShowSegmentsRequest, opts ...grpc.CallOption) (*milvuspb.ShowSegmentsResponse, error) AllocTimestamp(ctx context.Context, in *AllocTimestampRequest, opts ...grpc.CallOption) (*AllocTimestampResponse, error) AllocID(ctx context.Context, in *AllocIDRequest, opts ...grpc.CallOption) (*AllocIDResponse, error) @@ -1327,28 +1327,28 @@ type RootCoordServer interface { GetComponentStates(context.Context, *milvuspb.GetComponentStatesRequest) (*milvuspb.ComponentStates, error) GetTimeTickChannel(context.Context, *internalpb.GetTimeTickChannelRequest) (*milvuspb.StringResponse, error) GetStatisticsChannel(context.Context, *internalpb.GetStatisticsChannelRequest) (*milvuspb.StringResponse, error) - // * + //* // @brief This method is used to create collection // // @param CreateCollectionRequest, use to provide collection information to be created. // // @return Status CreateCollection(context.Context, *milvuspb.CreateCollectionRequest) (*commonpb.Status, error) - // * + //* // @brief This method is used to delete collection. // // @param DropCollectionRequest, collection name is going to be deleted. // // @return Status DropCollection(context.Context, *milvuspb.DropCollectionRequest) (*commonpb.Status, error) - // * + //* // @brief This method is used to test collection existence. // // @param HasCollectionRequest, collection name is going to be tested. // // @return BoolResponse HasCollection(context.Context, *milvuspb.HasCollectionRequest) (*milvuspb.BoolResponse, error) - // * + //* // @brief This method is used to get collection schema. // // @param DescribeCollectionRequest, target collection name. @@ -1359,28 +1359,28 @@ type RootCoordServer interface { CreateAlias(context.Context, *milvuspb.CreateAliasRequest) (*commonpb.Status, error) DropAlias(context.Context, *milvuspb.DropAliasRequest) (*commonpb.Status, error) AlterAlias(context.Context, *milvuspb.AlterAliasRequest) (*commonpb.Status, error) - // * + //* // @brief This method is used to list all collections. // // @return StringListResponse, collection name list ShowCollections(context.Context, *milvuspb.ShowCollectionsRequest) (*milvuspb.ShowCollectionsResponse, error) AlterCollection(context.Context, *milvuspb.AlterCollectionRequest) (*commonpb.Status, error) - // * + //* // @brief This method is used to create partition // // @return Status CreatePartition(context.Context, *milvuspb.CreatePartitionRequest) (*commonpb.Status, error) - // * + //* // @brief This method is used to drop partition // // @return Status DropPartition(context.Context, *milvuspb.DropPartitionRequest) (*commonpb.Status, error) - // * + //* // @brief This method is used to test partition existence. // // @return BoolResponse HasPartition(context.Context, *milvuspb.HasPartitionRequest) (*milvuspb.BoolResponse, error) - // * + //* // @brief This method is used to show partition information // // @param ShowPartitionRequest, target collection name. @@ -1388,7 +1388,7 @@ type RootCoordServer interface { // @return StringListResponse ShowPartitions(context.Context, *milvuspb.ShowPartitionsRequest) (*milvuspb.ShowPartitionsResponse, error) ShowPartitionsInternal(context.Context, *milvuspb.ShowPartitionsRequest) (*milvuspb.ShowPartitionsResponse, error) - // rpc DescribeSegment(milvus.DescribeSegmentRequest) returns (milvus.DescribeSegmentResponse) {} + // rpc DescribeSegment(milvus.DescribeSegmentRequest) returns (milvus.DescribeSegmentResponse) {} ShowSegments(context.Context, *milvuspb.ShowSegmentsRequest) (*milvuspb.ShowSegmentsResponse, error) AllocTimestamp(context.Context, *AllocTimestampRequest) (*AllocTimestampResponse, error) AllocID(context.Context, *AllocIDRequest) (*AllocIDResponse, error) diff --git a/internal/querycoordv2/meta/coordinator_broker.go b/internal/querycoordv2/meta/coordinator_broker.go index 50237682be..43315d4cee 100644 --- a/internal/querycoordv2/meta/coordinator_broker.go +++ b/internal/querycoordv2/meta/coordinator_broker.go @@ -226,16 +226,17 @@ func (broker *CoordinatorBroker) GetIndexInfo(ctx context.Context, collectionID indexes := make([]*querypb.FieldIndexInfo, 0) for _, info := range segmentInfo.GetIndexInfos() { indexes = append(indexes, &querypb.FieldIndexInfo{ - FieldID: info.GetFieldID(), - EnableIndex: true, - IndexName: info.GetIndexName(), - IndexID: info.GetIndexID(), - BuildID: info.GetBuildID(), - IndexParams: info.GetIndexParams(), - IndexFilePaths: info.GetIndexFilePaths(), - IndexSize: int64(info.GetSerializedSize()), - IndexVersion: info.GetIndexVersion(), - NumRows: info.GetNumRows(), + FieldID: info.GetFieldID(), + EnableIndex: true, + IndexName: info.GetIndexName(), + IndexID: info.GetIndexID(), + BuildID: info.GetBuildID(), + IndexParams: info.GetIndexParams(), + IndexFilePaths: info.GetIndexFilePaths(), + IndexSize: int64(info.GetSerializedSize()), + IndexVersion: info.GetIndexVersion(), + NumRows: info.GetNumRows(), + IndexEngineVersion: info.GetIndexEngineVersion(), }) } diff --git a/internal/querynodev2/segments/load_index_info.go b/internal/querynodev2/segments/load_index_info.go index 026de64a5e..e93312a4e1 100644 --- a/internal/querynodev2/segments/load_index_info.go +++ b/internal/querynodev2/segments/load_index_info.go @@ -87,6 +87,10 @@ func (li *LoadIndexInfo) appendLoadIndexInfo(indexInfo *querypb.FieldIndexInfo, } } + if err := li.appendIndexEngineVersion(indexInfo.GetIndexEngineVersion()); err != nil { + return err + } + err = li.appendIndexData(indexPaths) return err } @@ -148,3 +152,11 @@ func (li *LoadIndexInfo) appendIndexData(indexKeys []string) error { status := C.AppendIndexV2(li.cLoadIndexInfo) return HandleCStatus(&status, "AppendIndex failed") } + +func (li *LoadIndexInfo) appendIndexEngineVersion(indexEngineVersion string) error { + cIndexEngineVersion := C.CString(indexEngineVersion) + defer C.free(unsafe.Pointer(cIndexEngineVersion)) + + status := C.AppendIndexEngineVersionToLoadInfo(li.cLoadIndexInfo, cIndexEngineVersion) + return HandleCStatus(&status, "AppendIndexEngineVersion failed") +} diff --git a/internal/querynodev2/segments/segment_loader.go b/internal/querynodev2/segments/segment_loader.go index b99cd6063e..ed1e64c74f 100644 --- a/internal/querynodev2/segments/segment_loader.go +++ b/internal/querynodev2/segments/segment_loader.go @@ -673,6 +673,7 @@ func (loader *segmentLoader) loadFieldsIndex(ctx context.Context, zap.Int64("segment", segment.segmentID), zap.Int64("fieldID", fieldID), zap.Any("binlog", fieldInfo.FieldBinlog.Binlogs), + zap.String("index_engine_version", fieldInfo.IndexInfo.GetIndexEngineVersion()), ) segment.AddIndex(fieldID, fieldInfo) diff --git a/internal/util/indexcgowrapper/build_index_info.go b/internal/util/indexcgowrapper/build_index_info.go index e8feaf7ec8..9a3f4b78ea 100644 --- a/internal/util/indexcgowrapper/build_index_info.go +++ b/internal/util/indexcgowrapper/build_index_info.go @@ -150,3 +150,11 @@ func (bi *BuildIndexInfo) AppendInsertFile(filePath string) error { status := C.AppendInsertFilePath(bi.cBuildIndexInfo, cInsertFilePath) return HandleCStatus(&status, "appendInsertFile failed") } + +func (bi *BuildIndexInfo) AppendIndexEngineVersion(indexEngineVersion string) error { + cIndexEngineVersion := C.CString(indexEngineVersion) + defer C.free(unsafe.Pointer(cIndexEngineVersion)) + + status := C.AppendIndexEngineVersionToBuildInfo(bi.cBuildIndexInfo, cIndexEngineVersion) + return HandleCStatus(&status, "AppendIndexEngineVersion failed") +} diff --git a/pkg/util/paramtable/component_param.go b/pkg/util/paramtable/component_param.go index 278637fba9..be89fdbf86 100644 --- a/pkg/util/paramtable/component_param.go +++ b/pkg/util/paramtable/component_param.go @@ -216,6 +216,8 @@ type commonConfig struct { EnableLockMetrics ParamItem `refreshable:"false"` LockSlowLogInfoThreshold ParamItem `refreshable:"true"` LockSlowLogWarnThreshold ParamItem `refreshable:"true"` + + IndexEngineVersion ParamItem `refreshable:"true"` } func (p *commonConfig) init(base *BaseTable) { @@ -612,6 +614,15 @@ like the old password verification when updating the credential`, Export: true, } p.LockSlowLogWarnThreshold.Init(base.mgr) + + p.IndexEngineVersion = ParamItem{ + Key: "common.indexEngineVersion", + Version: "2.3.2", + DefaultValue: "knowhere-v0", + Doc: "version of index engine", + Export: true, + } + p.IndexEngineVersion.Init(base.mgr) } type traceConfig struct { diff --git a/scripts/core_build.sh b/scripts/core_build.sh index 2386552bfe..f07f06855f 100755 --- a/scripts/core_build.sh +++ b/scripts/core_build.sh @@ -105,8 +105,9 @@ BUILD_DISK_ANN="OFF" USE_ASAN="OFF" OPEN_SIMD="OFF" USE_DYNAMIC_SIMD="OFF" +INDEX_ENGINE="KNOWHERE" -while getopts "p:d:t:s:f:n:i:y:a:ulrcghzmebZ" arg; do +while getopts "p:d:t:s:f:n:i:y:a:x:ulrcghzmebZ" arg; do case $arg in f) CUSTOM_THIRDPARTY_PATH=$OPTARG @@ -170,6 +171,9 @@ while getopts "p:d:t:s:f:n:i:y:a:ulrcghzmebZ" arg; do Z) BUILD_WITHOUT_AZURE="on" ;; + x) + INDEX_ENGINE=$OPTARG + ;; h) # help echo " @@ -290,8 +294,9 @@ ${CMAKE_EXTRA_ARGS} \ -DBUILD_DISK_ANN=${BUILD_DISK_ANN} \ -DUSE_ASAN=${USE_ASAN} \ -DOPEN_SIMD=${OPEN_SIMD} \ --DUSE_DYNAMIC_SIMD=${USE_DYNAMIC_SIMD} --DCPU_ARCH=${CPU_ARCH} " +-DUSE_DYNAMIC_SIMD=${USE_DYNAMIC_SIMD} \ +-DCPU_ARCH=${CPU_ARCH} \ +-DINDEX_ENGINE=${INDEX_ENGINE} " if [ -z "$BUILD_WITHOUT_AZURE" ]; then CMAKE_CMD=${CMAKE_CMD}"-DAZURE_BUILD_DIR=${AZURE_BUILD_DIR} \ -DVCPKG_TARGET_TRIPLET=${VCPKG_TARGET_TRIPLET} " diff --git a/tests/scripts/values/cardinal.yaml b/tests/scripts/values/cardinal.yaml new file mode 100644 index 0000000000..37068dd892 --- /dev/null +++ b/tests/scripts/values/cardinal.yaml @@ -0,0 +1,4 @@ +extraConfigFiles: + user.yaml: |+ + common: + indexEngineVersion: "cardinal-v0"