From 5db4a0489ec6251d11a1061bd742edcbc0924c0d Mon Sep 17 00:00:00 2001 From: foxspy Date: Mon, 25 Sep 2023 21:39:27 +0800 Subject: [PATCH] dynamic index version control (#27335) Co-authored-by: longjiquan --- configs/milvus.yaml | 2 - internal/core/src/common/Types.h | 1 + internal/core/src/config/ConfigKnowhere.cpp | 11 + internal/core/src/config/ConfigKnowhere.h | 7 + internal/core/src/index/IndexInfo.h | 2 +- internal/core/src/index/Utils.cpp | 6 +- internal/core/src/index/Utils.h | 2 +- internal/core/src/index/VectorDiskIndex.cpp | 2 +- internal/core/src/index/VectorDiskIndex.h | 2 +- internal/core/src/index/VectorIndex.h | 7 +- internal/core/src/index/VectorMemIndex.cpp | 2 +- internal/core/src/index/VectorMemIndex.h | 2 +- internal/core/src/indexbuilder/index_c.cpp | 15 +- internal/core/src/indexbuilder/index_c.h | 2 +- internal/core/src/indexbuilder/types.h | 2 +- internal/core/src/segcore/FieldIndexing.cpp | 4 +- internal/core/src/segcore/Types.h | 2 +- internal/core/src/segcore/load_index_c.cpp | 8 +- internal/core/src/segcore/load_index_c.h | 2 +- internal/core/src/segcore/segcore_init_c.cpp | 10 + internal/core/src/segcore/segcore_init_c.h | 6 + .../core/thirdparty/knowhere/CMakeLists.txt | 2 +- .../unittest/bench/bench_indexbuilder.cpp | 2 +- internal/core/unittest/test_array_expr.cpp | 2 +- internal/core/unittest/test_c_api.cpp | 61 +- internal/core/unittest/test_expr.cpp | 2 +- internal/core/unittest/test_index_wrapper.cpp | 3 +- internal/core/unittest/test_indexing.cpp | 10 +- internal/core/unittest/test_sealed.cpp | 10 +- internal/core/unittest/test_utils/DataGen.h | 2 +- internal/datacoord/index_builder.go | 21 +- .../datacoord/index_engine_version_manager.go | 95 +++ .../index_engine_version_manager_test.go | 50 ++ internal/datacoord/index_service.go | 46 +- internal/datacoord/server.go | 48 +- internal/indexnode/indexnode_service.go | 3 +- internal/indexnode/task.go | 2 +- internal/metastore/model/segment_index.go | 104 +-- internal/proto/index_coord.proto | 9 +- internal/proto/indexpb/index_coord.pb.go | 346 +++++----- internal/proto/query_coord.proto | 3 +- internal/proto/querypb/query_coord.pb.go | 629 +++++++++--------- .../querycoordv2/meta/coordinator_broker.go | 23 +- .../querynodev2/segments/load_index_info.go | 7 +- .../querynodev2/segments/segment_loader.go | 3 +- internal/querynodev2/server.go | 12 +- .../util/indexcgowrapper/build_index_info.go | 5 +- internal/util/sessionutil/session_util.go | 94 ++- pkg/util/paramtable/component_param.go | 11 - tests/scripts/values/cardinal.yaml | 4 - 50 files changed, 1013 insertions(+), 693 deletions(-) create mode 100644 internal/datacoord/index_engine_version_manager.go create mode 100644 internal/datacoord/index_engine_version_manager_test.go delete mode 100644 tests/scripts/values/cardinal.yaml diff --git a/configs/milvus.yaml b/configs/milvus.yaml index 96f018320affe..eec18547040fe 100644 --- a/configs/milvus.yaml +++ b/configs/milvus.yaml @@ -523,8 +523,6 @@ 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/src/common/Types.h b/internal/core/src/common/Types.h index ef61907e18274..1a16d8825f2dd 100644 --- a/internal/core/src/common/Types.h +++ b/internal/core/src/common/Types.h @@ -165,6 +165,7 @@ using BinarySet = knowhere::BinarySet; using Dataset = knowhere::DataSet; using DatasetPtr = knowhere::DataSetPtr; using MetricType = knowhere::MetricType; +using IndexVersion = knowhere::IndexVersion; // TODO :: type define milvus index type(vector index type and scalar index type) using IndexType = knowhere::IndexType; diff --git a/internal/core/src/config/ConfigKnowhere.cpp b/internal/core/src/config/ConfigKnowhere.cpp index 2e291db8b371a..269d8b4911ae5 100644 --- a/internal/core/src/config/ConfigKnowhere.cpp +++ b/internal/core/src/config/ConfigKnowhere.cpp @@ -21,6 +21,7 @@ #include "glog/logging.h" #include "log/Log.h" #include "knowhere/comp/knowhere_config.h" +#include "knowhere/version.h" namespace milvus::config { @@ -85,4 +86,14 @@ KnowhereInitSearchThreadPool(const uint32_t num_threads) { } } +int32_t +GetMinimalIndexVersion() { + return knowhere::Version::GetMinimalVersion().VersionNumber(); +} + +int32_t +GetCurrentIndexVersion() { + return knowhere::Version::GetCurrentVersion().VersionNumber(); +} + } // namespace milvus::config diff --git a/internal/core/src/config/ConfigKnowhere.h b/internal/core/src/config/ConfigKnowhere.h index d76a898946480..c7584f2e7d96c 100644 --- a/internal/core/src/config/ConfigKnowhere.h +++ b/internal/core/src/config/ConfigKnowhere.h @@ -30,4 +30,11 @@ KnowhereInitBuildThreadPool(const uint32_t); void KnowhereInitSearchThreadPool(const uint32_t); + +int32_t +GetMinimalIndexVersion(); + +int32_t +GetCurrentIndexVersion(); + } // namespace milvus::config diff --git a/internal/core/src/index/IndexInfo.h b/internal/core/src/index/IndexInfo.h index c63a98bb3c1cd..1742d6eb04450 100644 --- a/internal/core/src/index/IndexInfo.h +++ b/internal/core/src/index/IndexInfo.h @@ -24,7 +24,7 @@ struct CreateIndexInfo { DataType field_type; IndexType index_type; MetricType metric_type; - std::string index_engine_version; + IndexVersion index_engine_version; }; } // namespace milvus::index diff --git a/internal/core/src/index/Utils.cpp b/internal/core/src/index/Utils.cpp index 880718e9de1fa..8193241a96010 100644 --- a/internal/core/src/index/Utils.cpp +++ b/internal/core/src/index/Utils.cpp @@ -120,11 +120,13 @@ GetIndexTypeFromConfig(const Config& config) { return index_type.value(); } -std::string +IndexVersion GetIndexEngineVersionFromConfig(const Config& config) { auto index_engine_version = GetValueFromConfig(config, INDEX_ENGINE_VERSION); - return index_engine_version.has_value() ? index_engine_version.value() : ""; + AssertInfo(index_engine_version.has_value(), + "index_engine not exist in config"); + return (std::stoi(index_engine_version.value())); } // TODO :: too ugly diff --git a/internal/core/src/index/Utils.h b/internal/core/src/index/Utils.h index 201b329f8e4fc..adc0b34595e7a 100644 --- a/internal/core/src/index/Utils.h +++ b/internal/core/src/index/Utils.h @@ -100,7 +100,7 @@ GetMetricTypeFromConfig(const Config& config); std::string GetIndexTypeFromConfig(const Config& config); -std::string +IndexVersion GetIndexEngineVersionFromConfig(const Config& config); storage::FieldDataMeta diff --git a/internal/core/src/index/VectorDiskIndex.cpp b/internal/core/src/index/VectorDiskIndex.cpp index ef3109a4c1740..195c0a6e701a6 100644 --- a/internal/core/src/index/VectorDiskIndex.cpp +++ b/internal/core/src/index/VectorDiskIndex.cpp @@ -36,7 +36,7 @@ template VectorDiskAnnIndex::VectorDiskAnnIndex( const IndexType& index_type, const MetricType& metric_type, - const std::string& version, + const IndexVersion& version, const storage::FileManagerContext& file_manager_context) : VectorIndex(index_type, metric_type) { file_manager_ = diff --git a/internal/core/src/index/VectorDiskIndex.h b/internal/core/src/index/VectorDiskIndex.h index 87c04220cbb66..1631faa91af8f 100644 --- a/internal/core/src/index/VectorDiskIndex.h +++ b/internal/core/src/index/VectorDiskIndex.h @@ -30,7 +30,7 @@ class VectorDiskAnnIndex : public VectorIndex { explicit VectorDiskAnnIndex( const IndexType& index_type, const MetricType& metric_type, - const std::string& version, + const IndexVersion& version, const storage::FileManagerContext& file_manager_context); BinarySet Serialize(const Config& config) override { // deprecated diff --git a/internal/core/src/index/VectorIndex.h b/internal/core/src/index/VectorIndex.h index 5b16c8a0e192e..3bd3948f04e99 100644 --- a/internal/core/src/index/VectorIndex.h +++ b/internal/core/src/index/VectorIndex.h @@ -91,11 +91,12 @@ class VectorIndex : public IndexBase { } void - CheckCompatible(const std::string& version) { + CheckCompatible(const IndexVersion& version) { std::string err_msg = - "version not support : " + version + + "version not support : " + std::to_string(version) + " , knowhere current version " + - knowhere::Version::GetCurrentVersion().VersionCode(); + std::to_string( + knowhere::Version::GetCurrentVersion().VersionNumber()); AssertInfo( knowhere::Version::VersionSupport(knowhere::Version(version)), err_msg); diff --git a/internal/core/src/index/VectorMemIndex.cpp b/internal/core/src/index/VectorMemIndex.cpp index 45493b3f3b301..59d268d35d3ea 100644 --- a/internal/core/src/index/VectorMemIndex.cpp +++ b/internal/core/src/index/VectorMemIndex.cpp @@ -51,7 +51,7 @@ namespace milvus::index { VectorMemIndex::VectorMemIndex( const IndexType& index_type, const MetricType& metric_type, - const std::string& version, + const IndexVersion& version, const storage::FileManagerContext& file_manager_context) : VectorIndex(index_type, metric_type) { AssertInfo(!is_unsupported(index_type, metric_type), diff --git a/internal/core/src/index/VectorMemIndex.h b/internal/core/src/index/VectorMemIndex.h index ca848023a0567..40c6e1b65d8c5 100644 --- a/internal/core/src/index/VectorMemIndex.h +++ b/internal/core/src/index/VectorMemIndex.h @@ -32,7 +32,7 @@ class VectorMemIndex : public VectorIndex { explicit VectorMemIndex( const IndexType& index_type, const MetricType& metric_type, - const std::string& version, + const IndexVersion& version, const storage::FileManagerContext& file_manager_context = storage::FileManagerContext()); diff --git a/internal/core/src/indexbuilder/index_c.cpp b/internal/core/src/indexbuilder/index_c.cpp index 6f53ecc483a89..e6a1e901e62aa 100644 --- a/internal/core/src/indexbuilder/index_c.cpp +++ b/internal/core/src/indexbuilder/index_c.cpp @@ -53,8 +53,8 @@ CreateIndex(enum CDataType dtype, config[param.key()] = param.value(); } - config[milvus::index::INDEX_ENGINE_VERSION] = - knowhere::Version::GetDefaultVersion().VersionCode(); + config[milvus::index::INDEX_ENGINE_VERSION] = std::to_string( + knowhere::Version::GetCurrentVersion().VersionNumber()); auto& index_factory = milvus::indexbuilder::IndexFactory::GetInstance(); auto index = @@ -90,13 +90,11 @@ 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; + auto engine_version = build_index_info->index_engine_version; index_info.index_engine_version = engine_version; - config[milvus::index::INDEX_ENGINE_VERSION] = engine_version; + config[milvus::index::INDEX_ENGINE_VERSION] = + std::to_string(engine_version); // get metric type if (milvus::datatype_is_vector(field_type)) { @@ -459,10 +457,9 @@ AppendInsertFilePath(CBuildIndexInfo c_build_index_info, CStatus AppendIndexEngineVersionToBuildInfo(CBuildIndexInfo c_load_index_info, - const char* c_index_engine_version) { + int32_t 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(); diff --git a/internal/core/src/indexbuilder/index_c.h b/internal/core/src/indexbuilder/index_c.h index 1b0d9b74c238e..3ff479f17456e 100644 --- a/internal/core/src/indexbuilder/index_c.h +++ b/internal/core/src/indexbuilder/index_c.h @@ -88,7 +88,7 @@ AppendInsertFilePath(CBuildIndexInfo c_build_index_info, const char* file_path); CStatus AppendIndexEngineVersionToBuildInfo(CBuildIndexInfo c_load_index_info, - const char* c_index_engine_version); + int32_t 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 2149646a8cd77..0e3f8cf6e8e4d 100644 --- a/internal/core/src/indexbuilder/types.h +++ b/internal/core/src/indexbuilder/types.h @@ -33,5 +33,5 @@ struct BuildIndexInfo { std::vector insert_files; milvus::storage::StorageConfig storage_config; milvus::Config config; - std::string index_engine_version; + int32_t 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 e9b6ff38a7718..deafdf3c0727d 100644 --- a/internal/core/src/segcore/FieldIndexing.cpp +++ b/internal/core/src/segcore/FieldIndexing.cpp @@ -36,7 +36,7 @@ VectorFieldIndexing::VectorFieldIndexing(const FieldMeta& field_meta, index_ = std::make_unique( config_->GetIndexType(), config_->GetMetricType(), - knowhere::Version::GetCurrentVersion().VersionCode()); + knowhere::Version::GetCurrentVersion().VersionNumber()); } void @@ -58,7 +58,7 @@ VectorFieldIndexing::BuildIndexRange(int64_t ack_beg, auto indexing = std::make_unique( knowhere::IndexEnum::INDEX_FAISS_IVFFLAT, knowhere::metric::L2, - knowhere::Version::GetCurrentVersion().VersionCode()); + knowhere::Version::GetCurrentVersion().VersionNumber()); 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 5e378cc77008f..187671e55f8ae 100644 --- a/internal/core/src/segcore/Types.h +++ b/internal/core/src/segcore/Types.h @@ -42,7 +42,7 @@ struct LoadIndexInfo { std::map index_params; std::vector index_files; index::IndexBasePtr index; - std::string index_engine_version; + IndexVersion 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 660601372c3c2..416382be3ca55 100644 --- a/internal/core/src/segcore/load_index_c.cpp +++ b/internal/core/src/segcore/load_index_c.cpp @@ -211,10 +211,7 @@ 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; + auto engine_version = load_index_info->index_engine_version; milvus::index::CreateIndexInfo index_info; index_info.field_type = load_index_info->field_type; @@ -326,11 +323,10 @@ AppendIndexInfo(CLoadIndexInfo c_load_index_info, CStatus AppendIndexEngineVersionToLoadInfo(CLoadIndexInfo c_load_index_info, - const char* c_index_engine_version) { + int32_t 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(); diff --git a/internal/core/src/segcore/load_index_c.h b/internal/core/src/segcore/load_index_c.h index f6998ad09b24a..2ef8f467978cf 100644 --- a/internal/core/src/segcore/load_index_c.h +++ b/internal/core/src/segcore/load_index_c.h @@ -60,7 +60,7 @@ AppendIndexV2(CLoadIndexInfo c_load_index_info); CStatus AppendIndexEngineVersionToLoadInfo(CLoadIndexInfo c_load_index_info, - const char* c_index_engine_version); + int32_t index_engine_version); CStatus CleanLoadedIndex(CLoadIndexInfo c_load_index_info); diff --git a/internal/core/src/segcore/segcore_init_c.cpp b/internal/core/src/segcore/segcore_init_c.cpp index 87a02bcac12ec..fefe455c25786 100644 --- a/internal/core/src/segcore/segcore_init_c.cpp +++ b/internal/core/src/segcore/segcore_init_c.cpp @@ -77,4 +77,14 @@ SegcoreCloseGlog() { } } +extern "C" int32_t +GetCurrentIndexVersion() { + return milvus::config::GetCurrentIndexVersion(); +} + +extern "C" int32_t +GetMinimalIndexVersion() { + return milvus::config::GetMinimalIndexVersion(); +} + } // namespace milvus::segcore diff --git a/internal/core/src/segcore/segcore_init_c.h b/internal/core/src/segcore/segcore_init_c.h index 24a8abdab38e2..ace8e9e723f75 100644 --- a/internal/core/src/segcore/segcore_init_c.h +++ b/internal/core/src/segcore/segcore_init_c.h @@ -43,6 +43,12 @@ SegcoreSetKnowhereSearchThreadPoolNum(const uint32_t num_threads); void SegcoreCloseGlog(); +int32_t +GetCurrentIndexVersion(); + +int32_t +GetMinimalIndexVersion(); + #ifdef __cplusplus } #endif diff --git a/internal/core/thirdparty/knowhere/CMakeLists.txt b/internal/core/thirdparty/knowhere/CMakeLists.txt index 917043ce449ab..5909054aede6b 100644 --- a/internal/core/thirdparty/knowhere/CMakeLists.txt +++ b/internal/core/thirdparty/knowhere/CMakeLists.txt @@ -11,7 +11,7 @@ # or implied. See the License for the specific language governing permissions and limitations under the License. #------------------------------------------------------------------------------- -set( KNOWHERE_VERSION b724230 ) +set( KNOWHERE_VERSION 87190cf ) set( GIT_REPOSITORY "https://github.com/zilliztech/knowhere.git") if ( INDEX_ENGINE STREQUAL "cardinal" ) set( KNOWHERE_VERSION main) diff --git a/internal/core/unittest/bench/bench_indexbuilder.cpp b/internal/core/unittest/bench/bench_indexbuilder.cpp index 23556632479f0..1b5c91a48786e 100644 --- a/internal/core/unittest/bench/bench_indexbuilder.cpp +++ b/internal/core/unittest/bench/bench_indexbuilder.cpp @@ -61,7 +61,7 @@ IndexBuilder_build(benchmark::State& state) { config[param.key()] = param.value(); } config[milvus::index::INDEX_ENGINE_VERSION] = - knowhere::Version::GetCurrentVersion().VersionCode(); + std::to_string(knowhere::Version::GetCurrentVersion().VersionNumber()); auto is_binary = state.range(2); auto dataset = GenDataset(NB, metric_type, is_binary); diff --git a/internal/core/unittest/test_array_expr.cpp b/internal/core/unittest/test_array_expr.cpp index ecd27bf7fb078..0b03e1d180983 100644 --- a/internal/core/unittest/test_array_expr.cpp +++ b/internal/core/unittest/test_array_expr.cpp @@ -1531,7 +1531,7 @@ TEST(Expr, TestArrayInTerm) { return false; }}, }; - + std::string raw_plan_tmp = R"(vector_anns: < field_id: 100 predicates: < diff --git a/internal/core/unittest/test_c_api.cpp b/internal/core/unittest/test_c_api.cpp index 351d7d3b6daa7..aefb97d454867 100644 --- a/internal/core/unittest/test_c_api.cpp +++ b/internal/core/unittest/test_c_api.cpp @@ -249,7 +249,8 @@ generate_index(void* raw_data, IndexType index_type, int64_t dim, int64_t N) { - auto engine_version = knowhere::Version::GetCurrentVersion().VersionCode(); + auto engine_version = + knowhere::Version::GetCurrentVersion().VersionNumber(); CreateIndexInfo create_index_info{ field_type, index_type, metric_type, engine_version}; auto indexing = milvus::index::IndexFactory::GetInstance().CreateIndex( @@ -1600,7 +1601,7 @@ TEST(CApiTest, LoadIndexInfo) { auto [raw_data, timestamps, uids] = generate_data(N); auto indexing = knowhere::IndexFactory::Instance().Create( knowhere::IndexEnum::INDEX_FAISS_IVFSQ8, - knowhere::Version::GetCurrentVersion().VersionCode()); + knowhere::Version::GetCurrentVersion().VersionNumber()); auto conf = knowhere::Json{{knowhere::meta::METRIC_TYPE, knowhere::metric::L2}, {knowhere::meta::DIM, DIM}, @@ -1633,7 +1634,9 @@ 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()); + AppendIndexEngineVersionToLoadInfo( + c_load_index_info, + knowhere::Version::GetCurrentVersion().VersionNumber()); status = AppendIndex(c_load_index_info, c_binary_set); ASSERT_EQ(status.error_code, Success); DeleteLoadIndexInfo(c_load_index_info); @@ -1648,7 +1651,7 @@ TEST(CApiTest, LoadIndexSearch) { auto [raw_data, timestamps, uids] = generate_data(N); auto indexing = knowhere::IndexFactory::Instance().Create( knowhere::IndexEnum::INDEX_FAISS_IVFSQ8, - knowhere::Version::GetCurrentVersion().VersionCode()); + knowhere::Version::GetCurrentVersion().VersionNumber()); auto conf = knowhere::Json{{knowhere::meta::METRIC_TYPE, knowhere::metric::L2}, {knowhere::meta::DIM, DIM}, @@ -1674,7 +1677,7 @@ TEST(CApiTest, LoadIndexSearch) { load_index_info.index = std::make_unique( index_params["index_type"], knowhere::metric::L2, - knowhere::Version::GetCurrentVersion().VersionCode()); + knowhere::Version::GetCurrentVersion().VersionNumber()); load_index_info.index->Load(binary_set); // search @@ -1792,7 +1795,9 @@ 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()); + AppendIndexEngineVersionToLoadInfo( + c_load_index_info, + knowhere::Version::GetCurrentVersion().VersionNumber()); 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); @@ -1932,7 +1937,9 @@ 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()); + AppendIndexEngineVersionToLoadInfo( + c_load_index_info, + knowhere::Version::GetCurrentVersion().VersionNumber()); AppendIndex(c_load_index_info, (CBinarySet)&binary_set); // load index for vec field, load raw data for scalar field @@ -2102,7 +2109,9 @@ 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()); + AppendIndexEngineVersionToLoadInfo( + c_load_index_info, + knowhere::Version::GetCurrentVersion().VersionNumber()); AppendIndex(c_load_index_info, (CBinarySet)&binary_set); // load index for vec field, load raw data for scalar field @@ -2274,7 +2283,9 @@ 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()); + AppendIndexEngineVersionToLoadInfo( + c_load_index_info, + knowhere::Version::GetCurrentVersion().VersionNumber()); AppendIndex(c_load_index_info, (CBinarySet)&binary_set); // load index for vec field, load raw data for scalar field @@ -2438,7 +2449,9 @@ 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()); + AppendIndexEngineVersionToLoadInfo( + c_load_index_info, + knowhere::Version::GetCurrentVersion().VersionNumber()); AppendIndex(c_load_index_info, (CBinarySet)&binary_set); // load index for vec field, load raw data for scalar field @@ -2603,7 +2616,9 @@ 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()); + AppendIndexEngineVersionToLoadInfo( + c_load_index_info, + knowhere::Version::GetCurrentVersion().VersionNumber()); AppendIndex(c_load_index_info, (CBinarySet)&binary_set); // load index for vec field, load raw data for scalar field @@ -2774,7 +2789,9 @@ 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()); + AppendIndexEngineVersionToLoadInfo( + c_load_index_info, + knowhere::Version::GetCurrentVersion().VersionNumber()); AppendIndex(c_load_index_info, (CBinarySet)&binary_set); // load index for vec field, load raw data for scalar field @@ -2945,7 +2962,9 @@ 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()); + AppendIndexEngineVersionToLoadInfo( + c_load_index_info, + knowhere::Version::GetCurrentVersion().VersionNumber()); AppendIndex(c_load_index_info, (CBinarySet)&binary_set); // load index for vec field, load raw data for scalar field @@ -3110,7 +3129,9 @@ 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()); + AppendIndexEngineVersionToLoadInfo( + c_load_index_info, + knowhere::Version::GetCurrentVersion().VersionNumber()); AppendIndex(c_load_index_info, (CBinarySet)&binary_set); // load index for vec field, load raw data for scalar field @@ -3298,7 +3319,9 @@ 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()); + AppendIndexEngineVersionToLoadInfo( + c_load_index_info, + knowhere::Version::GetCurrentVersion().VersionNumber()); AppendIndex(c_load_index_info, (CBinarySet)&binary_set); // load index for vec field, load raw data for scalar field @@ -3469,7 +3492,9 @@ 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()); + AppendIndexEngineVersionToLoadInfo( + c_load_index_info, + knowhere::Version::GetCurrentVersion().VersionNumber()); AppendIndex(c_load_index_info, (CBinarySet)&binary_set); auto query_dataset = knowhere::GenDataSet(num_queries, DIM, query_ptr); @@ -3694,7 +3719,9 @@ 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()); + AppendIndexEngineVersionToLoadInfo( + c_load_index_info, + knowhere::Version::GetCurrentVersion().VersionNumber()); AppendIndex(c_load_index_info, (CBinarySet)&binary_set); // load vec index diff --git a/internal/core/unittest/test_expr.cpp b/internal/core/unittest/test_expr.cpp index 51ef8b231276f..cf3aa29f11bb3 100644 --- a/internal/core/unittest/test_expr.cpp +++ b/internal/core/unittest/test_expr.cpp @@ -801,7 +801,7 @@ TEST(Expr, TestUnaryRangeJson) { proto::plan::Array val; std::vector nested_path; }; - + proto::plan::Array arr; arr.set_same_type(true); proto::plan::GenericValue int_val1; diff --git a/internal/core/unittest/test_index_wrapper.cpp b/internal/core/unittest/test_index_wrapper.cpp index 7d9058f4ae2e8..f466becaab168 100644 --- a/internal/core/unittest/test_index_wrapper.cpp +++ b/internal/core/unittest/test_index_wrapper.cpp @@ -134,7 +134,8 @@ TEST_P(IndexWrapperTest, BuildAndQuery) { storage::FileManagerContext file_manager_context( field_data_meta, index_meta, chunk_manager); - config[milvus::index::INDEX_ENGINE_VERSION] = knowhere::Version::GetCurrentVersion().VersionCode(); + config[milvus::index::INDEX_ENGINE_VERSION] = + std::to_string(knowhere::Version::GetCurrentVersion().VersionNumber()); auto index = milvus::indexbuilder::IndexFactory::GetInstance().CreateIndex( vec_field_data_type, config, file_manager_context); diff --git a/internal/core/unittest/test_indexing.cpp b/internal/core/unittest/test_indexing.cpp index 90237531adc3e..0498314c698c0 100644 --- a/internal/core/unittest/test_indexing.cpp +++ b/internal/core/unittest/test_indexing.cpp @@ -224,7 +224,7 @@ TEST(Indexing, Naive) { 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(); + knowhere::Version::GetCurrentVersion().VersionNumber(); auto index = milvus::index::IndexFactory::GetInstance().CreateIndex( create_index_info, milvus::storage::FileManagerContext()); @@ -389,7 +389,7 @@ TEST_P(IndexTest, BuildAndQuery) { 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(); + knowhere::Version::GetCurrentVersion().VersionNumber(); index::IndexBasePtr index; milvus::storage::FieldDataMeta field_data_meta{1, 2, 3, 100}; @@ -442,7 +442,7 @@ TEST_P(IndexTest, Mmap) { 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(); + knowhere::Version::GetCurrentVersion().VersionNumber(); index::IndexBasePtr index; milvus::storage::FieldDataMeta field_data_meta{1, 2, 3, 100}; @@ -499,7 +499,7 @@ TEST_P(IndexTest, GetVector) { 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(); + knowhere::Version::GetCurrentVersion().VersionNumber(); index::IndexBasePtr index; milvus::storage::FieldDataMeta field_data_meta{1, 2, 3, 100}; @@ -578,7 +578,7 @@ TEST(Indexing, SearchDiskAnnWithInvalidParam) { 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(); + knowhere::Version::GetCurrentVersion().VersionNumber(); int64_t collection_id = 1; int64_t partition_id = 2; diff --git a/internal/core/unittest/test_sealed.cpp b/internal/core/unittest/test_sealed.cpp index 68dedcb616da3..a065e4a706a1d 100644 --- a/internal/core/unittest/test_sealed.cpp +++ b/internal/core/unittest/test_sealed.cpp @@ -90,7 +90,7 @@ TEST(Sealed, without_predicate) { 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(); + knowhere::Version::GetCurrentVersion().VersionNumber(); auto indexing = milvus::index::IndexFactory::GetInstance().CreateIndex( create_index_info, milvus::storage::FileManagerContext()); @@ -205,7 +205,7 @@ TEST(Sealed, with_predicate) { 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(); + knowhere::Version::GetCurrentVersion().VersionNumber(); auto indexing = milvus::index::IndexFactory::GetInstance().CreateIndex( create_index_info, milvus::storage::FileManagerContext()); @@ -311,7 +311,7 @@ TEST(Sealed, with_predicate_filter_all) { 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(); + knowhere::Version::GetCurrentVersion().VersionNumber(); auto ivf_indexing = milvus::index::IndexFactory::GetInstance().CreateIndex( create_index_info, milvus::storage::FileManagerContext()); @@ -351,7 +351,7 @@ TEST(Sealed, with_predicate_filter_all) { 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(); + knowhere::Version::GetCurrentVersion().VersionNumber(); auto hnsw_indexing = milvus::index::IndexFactory::GetInstance().CreateIndex( create_index_info, milvus::storage::FileManagerContext()); hnsw_indexing->BuildWithDataset(database, hnsw_conf); @@ -1224,7 +1224,7 @@ TEST(Sealed, GetVectorFromChunkCache) { auto indexing = std::make_unique( index_type, metric_type, - knowhere::Version::GetCurrentVersion().VersionCode()); + knowhere::Version::GetCurrentVersion().VersionNumber()); indexing->BuildWithDataset(ds, conf); auto segment_sealed = CreateSealedSegment(schema); diff --git a/internal/core/unittest/test_utils/DataGen.h b/internal/core/unittest/test_utils/DataGen.h index d495c005ccad0..90139146794ed 100644 --- a/internal/core/unittest/test_utils/DataGen.h +++ b/internal/core/unittest/test_utils/DataGen.h @@ -912,7 +912,7 @@ GenVecIndexing(int64_t N, int64_t dim, const float* vec) { auto indexing = std::make_unique( knowhere::IndexEnum::INDEX_FAISS_IVFFLAT, knowhere::metric::L2, - knowhere::Version::GetCurrentVersion().VersionCode()); + knowhere::Version::GetCurrentVersion().VersionNumber()); indexing->BuildWithDataset(database, conf); return indexing; } diff --git a/internal/datacoord/index_builder.go b/internal/datacoord/index_builder.go index 5af90cc8b1b3c..a26437215b85f 100644 --- a/internal/datacoord/index_builder.go +++ b/internal/datacoord/index_builder.go @@ -292,16 +292,17 @@ 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, - IndexEngineVersion: meta.IndexEngineVersion, + 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, + CurrentIndexVersion: meta.CurrentIndexVersion, + MinimalIndexVersion: meta.MinimalIndexVersion, } 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_engine_version_manager.go b/internal/datacoord/index_engine_version_manager.go new file mode 100644 index 0000000000000..82944705cdc97 --- /dev/null +++ b/internal/datacoord/index_engine_version_manager.go @@ -0,0 +1,95 @@ +package datacoord + +import ( + "math" + "sync" + + "go.uber.org/zap" + + "github.com/milvus-io/milvus/internal/util/sessionutil" + "github.com/milvus-io/milvus/pkg/log" +) + +type IndexEngineVersionManager struct { + mu sync.Mutex + versions map[int64]sessionutil.IndexEngineVersion +} + +func newIndexEngineVersionManager() *IndexEngineVersionManager { + return &IndexEngineVersionManager{ + versions: map[int64]sessionutil.IndexEngineVersion{}, + } +} + +func (m *IndexEngineVersionManager) Startup(sessions map[string]*sessionutil.Session) { + m.mu.Lock() + defer m.mu.Unlock() + + for _, session := range sessions { + m.addOrUpdate(session) + } +} + +func (m *IndexEngineVersionManager) AddNode(session *sessionutil.Session) { + m.mu.Lock() + defer m.mu.Unlock() + + m.addOrUpdate(session) +} + +func (m *IndexEngineVersionManager) RemoveNode(session *sessionutil.Session) { + m.mu.Lock() + defer m.mu.Unlock() + + delete(m.versions, session.ServerID) +} + +func (m *IndexEngineVersionManager) Update(session *sessionutil.Session) { + m.mu.Lock() + defer m.mu.Unlock() + + m.addOrUpdate(session) +} + +func (m *IndexEngineVersionManager) addOrUpdate(session *sessionutil.Session) { + log.Info("addOrUpdate version", zap.Int64("nodeId", session.ServerID), zap.Int32("minimal", session.IndexEngineVersion.MinimalIndexVersion), zap.Int32("current", session.IndexEngineVersion.CurrentIndexVersion)) + m.versions[session.ServerID] = session.IndexEngineVersion +} + +func (m *IndexEngineVersionManager) GetCurrentIndexEngineVersion() int32 { + m.mu.Lock() + defer m.mu.Unlock() + + if len(m.versions) == 0 { + log.Info("index versions is empty") + return 0 + } + + current := int32(math.MaxInt32) + for _, version := range m.versions { + if version.CurrentIndexVersion < current { + current = version.CurrentIndexVersion + } + } + log.Info("Merged current version", zap.Int32("current", current)) + return current +} + +func (m *IndexEngineVersionManager) GetMinimalIndexEngineVersion() int32 { + m.mu.Lock() + defer m.mu.Unlock() + + if len(m.versions) == 0 { + log.Info("index versions is empty") + return 0 + } + + minimal := int32(0) + for _, version := range m.versions { + if version.MinimalIndexVersion > minimal { + minimal = version.MinimalIndexVersion + } + } + log.Info("Merged minimal version", zap.Int32("minimal", minimal)) + return minimal +} diff --git a/internal/datacoord/index_engine_version_manager_test.go b/internal/datacoord/index_engine_version_manager_test.go new file mode 100644 index 0000000000000..781fe6e7deda9 --- /dev/null +++ b/internal/datacoord/index_engine_version_manager_test.go @@ -0,0 +1,50 @@ +package datacoord + +import ( + "testing" + + "github.com/stretchr/testify/assert" + + "github.com/milvus-io/milvus/internal/util/sessionutil" +) + +func Test_IndexEngineVersionManager_GetMergedIndexVersion(t *testing.T) { + m := newIndexEngineVersionManager() + + // empty + assert.Zero(t, m.GetCurrentIndexEngineVersion()) + + // startup + m.Startup(map[string]*sessionutil.Session{ + "1": { + ServerID: 1, + IndexEngineVersion: sessionutil.IndexEngineVersion{CurrentIndexVersion: 20, MinimalIndexVersion: 0}, + }, + }) + assert.Equal(t, int32(20), m.GetCurrentIndexEngineVersion()) + assert.Equal(t, int32(0), m.GetMinimalIndexEngineVersion()) + + // add node + m.AddNode(&sessionutil.Session{ + ServerID: 2, + IndexEngineVersion: sessionutil.IndexEngineVersion{CurrentIndexVersion: 10, MinimalIndexVersion: 5}, + }) + assert.Equal(t, int32(10), m.GetCurrentIndexEngineVersion()) + assert.Equal(t, int32(5), m.GetMinimalIndexEngineVersion()) + + // update + m.Update(&sessionutil.Session{ + ServerID: 2, + IndexEngineVersion: sessionutil.IndexEngineVersion{CurrentIndexVersion: 5, MinimalIndexVersion: 2}, + }) + assert.Equal(t, int32(5), m.GetCurrentIndexEngineVersion()) + assert.Equal(t, int32(2), m.GetMinimalIndexEngineVersion()) + + // remove + m.RemoveNode(&sessionutil.Session{ + ServerID: 2, + IndexEngineVersion: sessionutil.IndexEngineVersion{CurrentIndexVersion: 5, MinimalIndexVersion: 3}, + }) + assert.Equal(t, int32(20), m.GetCurrentIndexEngineVersion()) + assert.Equal(t, int32(0), m.GetMinimalIndexEngineVersion()) +} diff --git a/internal/datacoord/index_service.go b/internal/datacoord/index_service.go index 48b2dbb27ff04..88a3a07122850 100644 --- a/internal/datacoord/index_service.go +++ b/internal/datacoord/index_service.go @@ -51,24 +51,25 @@ func (s *Server) startIndexService(ctx context.Context) { } func (s *Server) createIndexForSegment(segment *SegmentInfo, indexID UniqueID) error { - indexEngineVersion := Params.CommonCfg.IndexEngineVersion.GetValue() + indexEngineVersion := s.IndexEngineVersionManager.GetCurrentIndexEngineVersion() log.Info("create index for segment", zap.Int64("segmentID", segment.ID), zap.Int64("indexID", indexID), - zap.String("index_engine_version", indexEngineVersion), + zap.Int32("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, - IndexEngineVersion: indexEngineVersion, + SegmentID: segment.ID, + CollectionID: segment.CollectionID, + PartitionID: segment.PartitionID, + NumRows: segment.NumOfRows, + IndexID: indexID, + BuildID: buildID, + CreateTime: uint64(segment.ID), + WriteHandoff: false, + CurrentIndexVersion: s.IndexEngineVersionManager.GetCurrentIndexEngineVersion(), + MinimalIndexVersion: s.IndexEngineVersionManager.GetMinimalIndexEngineVersion(), } if err = s.meta.AddSegmentIndex(segIndex); err != nil { return err @@ -736,17 +737,18 @@ 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, - IndexEngineVersion: segIdx.IndexEngineVersion, + 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, + CurrentIndexVersion: segIdx.CurrentIndexVersion, + MinimalIndexVersion: segIdx.MinimalIndexVersion, }) } } diff --git a/internal/datacoord/server.go b/internal/datacoord/server.go index 451b934ee8c63..dbde677b29e54 100644 --- a/internal/datacoord/server.go +++ b/internal/datacoord/server.go @@ -135,6 +135,7 @@ type Server struct { dnEventCh <-chan *sessionutil.SessionEvent inEventCh <-chan *sessionutil.SessionEvent // qcEventCh <-chan *sessionutil.SessionEvent + qnEventCh <-chan *sessionutil.SessionEvent enableActiveStandBy bool activateFunc func() error @@ -145,8 +146,9 @@ type Server struct { // indexCoord types.IndexCoord // segReferManager *SegmentReferenceManager - indexBuilder *indexBuilder - indexNodeManager *IndexNodeManager + indexBuilder *indexBuilder + indexNodeManager *IndexNodeManager + IndexEngineVersionManager *IndexEngineVersionManager // manage ways that data coord access other coord broker Broker @@ -523,6 +525,15 @@ func (s *Server) initServiceDiscovery() error { } s.inEventCh = s.session.WatchServices(typeutil.IndexNodeRole, inRevision+1, nil) + s.IndexEngineVersionManager = newIndexEngineVersionManager() + qnSessions, qnRevision, err := s.session.GetSessions(typeutil.QueryNodeRole) + if err != nil { + log.Warn("DataCoord get QueryNode sessions failed", zap.Error(err)) + return err + } + s.IndexEngineVersionManager.Startup(qnSessions) + s.qnEventCh = s.session.WatchServicesWithVersionRange(typeutil.QueryNodeRole, r, qnRevision+1, nil) + return nil } @@ -818,6 +829,19 @@ func (s *Server) watchService(ctx context.Context) { }() return } + case event, ok := <-s.qnEventCh: + if !ok { + s.stopServiceWatch() + return + } + if err := s.handleSessionEvent(ctx, typeutil.QueryNodeRole, event); err != nil { + go func() { + if err := s.Stop(); err != nil { + log.Warn("DataCoord server stop error", zap.Error(err)) + } + }() + return + } } } } @@ -881,6 +905,26 @@ func (s *Server) handleSessionEvent(ctx context.Context, role string, event *ses log.Warn("receive unknown service event type", zap.Any("type", event.EventType)) } + case typeutil.QueryNodeRole: + switch event.EventType { + case sessionutil.SessionAddEvent: + log.Info("received querynode register", + zap.String("address", event.Session.Address), + zap.Int64("serverID", event.Session.ServerID)) + s.IndexEngineVersionManager.AddNode(event.Session) + case sessionutil.SessionDelEvent: + log.Info("received querynode unregister", + zap.String("address", event.Session.Address), + zap.Int64("serverID", event.Session.ServerID)) + s.IndexEngineVersionManager.RemoveNode(event.Session) + case sessionutil.SessionUpdateEvent: + serverID := event.Session.ServerID + log.Info("received querynode SessionUpdateEvent", zap.Int64("serverID", serverID)) + s.IndexEngineVersionManager.Update(event.Session) + default: + log.Warn("receive unknown service event type", + zap.Any("type", event.EventType)) + } } return nil diff --git a/internal/indexnode/indexnode_service.go b/internal/indexnode/indexnode_service.go index c2d28b8cd2b32..2bd0f84eb3250 100644 --- a/internal/indexnode/indexnode_service.go +++ b/internal/indexnode/indexnode_service.go @@ -63,7 +63,8 @@ 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()), + zap.Int32("current_index_version", req.GetCurrentIndexVersion()), + zap.Int32("minimal_index_version", req.GetMinimalIndexVersion()), ) 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 343cc100b1aef..198d57bce221b 100644 --- a/internal/indexnode/task.go +++ b/internal/indexnode/task.go @@ -337,7 +337,7 @@ func (it *indexBuildTask) BuildIndex(ctx context.Context) error { } } - if err := buildIndexInfo.AppendIndexEngineVersion(it.req.GetIndexEngineVersion()); err != nil { + if err := buildIndexInfo.AppendIndexEngineVersion(it.req.GetCurrentIndexVersion()); err != nil { log.Ctx(ctx).Warn("append index engine version failed", zap.Error(err)) return err } diff --git a/internal/metastore/model/segment_index.go b/internal/metastore/model/segment_index.go index 31b5278a88860..2ebe50ade7fae 100644 --- a/internal/metastore/model/segment_index.go +++ b/internal/metastore/model/segment_index.go @@ -22,8 +22,9 @@ type SegmentIndex struct { IndexFileKeys []string IndexSize uint64 // deprecated - WriteHandoff bool - IndexEngineVersion string + WriteHandoff bool + CurrentIndexVersion int32 + MinimalIndexVersion int32 } func UnmarshalSegmentIndexModel(segIndex *indexpb.SegmentIndex) *SegmentIndex { @@ -32,22 +33,23 @@ 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, - IndexEngineVersion: segIndex.GetIndexEngineVersion(), + 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, + CurrentIndexVersion: segIndex.GetCurrentIndexVersion(), + MinimalIndexVersion: segIndex.GetMinimalIndexVersion(), } } @@ -57,42 +59,44 @@ 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, - IndexEngineVersion: segIdx.IndexEngineVersion, + 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, + CurrentIndexVersion: segIdx.CurrentIndexVersion, + MinimalIndexVersion: segIdx.MinimalIndexVersion, } } 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, - IndexEngineVersion: segIndex.IndexEngineVersion, + 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, + CurrentIndexVersion: segIndex.CurrentIndexVersion, + MinimalIndexVersion: segIndex.MinimalIndexVersion, } } diff --git a/internal/proto/index_coord.proto b/internal/proto/index_coord.proto index 31ecbacf198fb..a3b6e037dc7b7 100644 --- a/internal/proto/index_coord.proto +++ b/internal/proto/index_coord.proto @@ -83,7 +83,8 @@ message SegmentIndex { uint64 create_time = 13; uint64 serialize_size = 14; bool write_handoff = 15; - string index_engine_version = 16; + int32 current_index_version = 16; + int32 minimal_index_version = 17; } message RegisterNodeRequest { @@ -153,7 +154,8 @@ message IndexFilePathInfo { uint64 serialized_size = 8; int64 index_version = 9; int64 num_rows = 10; - string index_engine_version = 11; + int32 current_index_version = 11; + int32 minimal_index_version = 12; } message SegmentInfo { @@ -225,7 +227,8 @@ message CreateJobRequest { repeated common.KeyValuePair index_params = 9; repeated common.KeyValuePair type_params = 10; int64 num_rows = 11; - string index_engine_version = 12; + int32 current_index_version = 12; + int32 minimal_index_version = 13; } message QueryJobsRequest { diff --git a/internal/proto/indexpb/index_coord.pb.go b/internal/proto/indexpb/index_coord.pb.go index 79b2570fcf3c7..ddce6cdc40ef3 100644 --- a/internal/proto/indexpb/index_coord.pb.go +++ b/internal/proto/indexpb/index_coord.pb.go @@ -236,7 +236,8 @@ 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"` + CurrentIndexVersion int32 `protobuf:"varint,16,opt,name=current_index_version,json=currentIndexVersion,proto3" json:"current_index_version,omitempty"` + MinimalIndexVersion int32 `protobuf:"varint,17,opt,name=minimal_index_version,json=minimalIndexVersion,proto3" json:"minimal_index_version,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -372,11 +373,18 @@ func (m *SegmentIndex) GetWriteHandoff() bool { return false } -func (m *SegmentIndex) GetIndexEngineVersion() string { +func (m *SegmentIndex) GetCurrentIndexVersion() int32 { if m != nil { - return m.IndexEngineVersion + return m.CurrentIndexVersion } - return "" + return 0 +} + +func (m *SegmentIndex) GetMinimalIndexVersion() int32 { + if m != nil { + return m.MinimalIndexVersion + } + return 0 } type RegisterNodeRequest struct { @@ -901,7 +909,8 @@ 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"` + CurrentIndexVersion int32 `protobuf:"varint,11,opt,name=current_index_version,json=currentIndexVersion,proto3" json:"current_index_version,omitempty"` + MinimalIndexVersion int32 `protobuf:"varint,12,opt,name=minimal_index_version,json=minimalIndexVersion,proto3" json:"minimal_index_version,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -1002,11 +1011,18 @@ func (m *IndexFilePathInfo) GetNumRows() int64 { return 0 } -func (m *IndexFilePathInfo) GetIndexEngineVersion() string { +func (m *IndexFilePathInfo) GetCurrentIndexVersion() int32 { if m != nil { - return m.IndexEngineVersion + return m.CurrentIndexVersion } - return "" + return 0 +} + +func (m *IndexFilePathInfo) GetMinimalIndexVersion() int32 { + if m != nil { + return m.MinimalIndexVersion + } + return 0 } type SegmentInfo struct { @@ -1533,7 +1549,8 @@ 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"` + CurrentIndexVersion int32 `protobuf:"varint,12,opt,name=current_index_version,json=currentIndexVersion,proto3" json:"current_index_version,omitempty"` + MinimalIndexVersion int32 `protobuf:"varint,13,opt,name=minimal_index_version,json=minimalIndexVersion,proto3" json:"minimal_index_version,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -1641,11 +1658,18 @@ func (m *CreateJobRequest) GetNumRows() int64 { return 0 } -func (m *CreateJobRequest) GetIndexEngineVersion() string { +func (m *CreateJobRequest) GetCurrentIndexVersion() int32 { if m != nil { - return m.IndexEngineVersion + return m.CurrentIndexVersion } - return "" + return 0 +} + +func (m *CreateJobRequest) GetMinimalIndexVersion() int32 { + if m != nil { + return m.MinimalIndexVersion + } + return 0 } type QueryJobsRequest struct { @@ -2197,154 +2221,156 @@ func init() { func init() { proto.RegisterFile("index_coord.proto", fileDescriptor_f9e019eb3fda53c2) } var fileDescriptor_f9e019eb3fda53c2 = []byte{ - // 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, + // 2377 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x5a, 0xdd, 0x6e, 0x1c, 0x49, + 0xf5, 0x4f, 0xbb, 0xc7, 0xf6, 0xf4, 0xe9, 0x19, 0x7f, 0x54, 0x9c, 0xff, 0x7f, 0x32, 0xc9, 0x12, + 0xa7, 0xb3, 0x49, 0x0c, 0x22, 0x4e, 0xf0, 0xb2, 0x68, 0x41, 0x80, 0xe4, 0xd8, 0x9b, 0x64, 0x92, + 0x4d, 0x64, 0xda, 0x51, 0x24, 0x56, 0x88, 0xa6, 0x67, 0xba, 0xc6, 0xae, 0x75, 0x4f, 0xd7, 0xa4, + 0xab, 0x3a, 0x89, 0x83, 0x84, 0xe0, 0x82, 0x0b, 0xd0, 0x4a, 0x08, 0xb4, 0x12, 0x2f, 0xc0, 0xd5, + 0x3e, 0x02, 0x37, 0xdc, 0x70, 0x85, 0xb8, 0xe2, 0x1e, 0xf1, 0x04, 0xbc, 0x03, 0xaa, 0x8f, 0xee, + 0xe9, 0xee, 0xe9, 0xf1, 0x4c, 0x6c, 0x23, 0x24, 0xb8, 0x9b, 0x3a, 0x75, 0xea, 0xa3, 0xcf, 0xf9, + 0x9d, 0x73, 0x7e, 0xa7, 0x34, 0xb0, 0x4a, 0xa2, 0x00, 0xbf, 0xf1, 0x7a, 0x94, 0xc6, 0xc1, 0xe6, + 0x30, 0xa6, 0x9c, 0x22, 0x34, 0x20, 0xe1, 0xab, 0x84, 0xa9, 0xd1, 0xa6, 0x9c, 0x6f, 0x37, 0x7a, + 0x74, 0x30, 0xa0, 0x91, 0x92, 0xb5, 0x97, 0x48, 0xc4, 0x71, 0x1c, 0xf9, 0xa1, 0x1e, 0x37, 0xf2, + 0x2b, 0x9c, 0xbf, 0xd7, 0xc0, 0xea, 0x88, 0x55, 0x9d, 0xa8, 0x4f, 0x91, 0x03, 0x8d, 0x1e, 0x0d, + 0x43, 0xdc, 0xe3, 0x84, 0x46, 0x9d, 0xdd, 0x96, 0xb1, 0x6e, 0x6c, 0x98, 0x6e, 0x41, 0x86, 0x5a, + 0xb0, 0xd8, 0x27, 0x38, 0x0c, 0x3a, 0xbb, 0xad, 0x39, 0x39, 0x9d, 0x0e, 0xd1, 0x7b, 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, 0xaf, 0x03, 0x1a, 0xe2, + 0x28, 0x20, 0xd1, 0x81, 0xde, 0x51, 0xda, 0xa1, 0x29, 0xed, 0xb0, 0xa2, 0x67, 0xa4, 0xbe, 0x30, + 0x87, 0xf3, 0x4b, 0x03, 0xe0, 0x81, 0xc4, 0x87, 0xbc, 0xcb, 0x77, 0x53, 0x88, 0x90, 0xa8, 0x4f, + 0x25, 0xbc, 0xec, 0xad, 0xf7, 0x36, 0xc7, 0x31, 0xbc, 0x99, 0x61, 0x52, 0x23, 0x48, 0xc2, 0xb3, + 0x05, 0x8b, 0x01, 0x0e, 0x31, 0xc7, 0x81, 0x84, 0x5e, 0xdd, 0x4d, 0x87, 0xe8, 0x1a, 0xd8, 0xbd, + 0x18, 0x0b, 0xcb, 0x71, 0xa2, 0xb1, 0x57, 0x73, 0x41, 0x89, 0x9e, 0x93, 0x01, 0x76, 0xfe, 0x59, + 0x83, 0xc6, 0x3e, 0x3e, 0x18, 0xe0, 0x88, 0xab, 0x9b, 0xcc, 0x02, 0xf5, 0x75, 0xb0, 0x87, 0x7e, + 0xcc, 0x89, 0x56, 0x51, 0x70, 0xcf, 0x8b, 0xd0, 0x55, 0xb0, 0x98, 0xde, 0x75, 0x57, 0x9e, 0x6a, + 0xba, 0x23, 0x01, 0xba, 0x0c, 0xf5, 0x28, 0x19, 0x28, 0x03, 0x69, 0xc8, 0x47, 0xc9, 0x40, 0xc2, + 0x24, 0x17, 0x0c, 0xf3, 0xc5, 0x60, 0x68, 0xc1, 0x62, 0x37, 0x21, 0x32, 0xbe, 0x16, 0xd4, 0x8c, + 0x1e, 0xa2, 0xff, 0x83, 0x85, 0x88, 0x06, 0xb8, 0xb3, 0xab, 0x61, 0xa9, 0x47, 0xe8, 0x06, 0x34, + 0x95, 0x51, 0x5f, 0xe1, 0x98, 0x11, 0x1a, 0x69, 0x50, 0x2a, 0x24, 0xbf, 0x50, 0xb2, 0xd3, 0xe2, + 0xf2, 0x1a, 0xd8, 0xe3, 0x58, 0x84, 0xfe, 0x08, 0x81, 0xb7, 0x60, 0x59, 0x1d, 0xde, 0x27, 0x21, + 0xf6, 0x8e, 0xf0, 0x31, 0x6b, 0xd9, 0xeb, 0xe6, 0x86, 0xe5, 0xaa, 0x3b, 0x3d, 0x20, 0x21, 0x7e, + 0x82, 0x8f, 0x59, 0xde, 0x77, 0x8d, 0x13, 0x7d, 0xd7, 0x2c, 0xfb, 0x0e, 0xdd, 0x84, 0x25, 0x86, + 0x63, 0xe2, 0x87, 0xe4, 0x2d, 0xf6, 0x18, 0x79, 0x8b, 0x5b, 0x4b, 0x52, 0xa7, 0x99, 0x49, 0xf7, + 0xc9, 0x5b, 0x2c, 0xcc, 0xf0, 0x3a, 0x26, 0x1c, 0x7b, 0x87, 0x7e, 0x14, 0xd0, 0x7e, 0xbf, 0xb5, + 0x2c, 0xcf, 0x69, 0x48, 0xe1, 0x23, 0x25, 0x43, 0x5b, 0x70, 0xa9, 0x97, 0xc4, 0x31, 0x8e, 0xb8, + 0x57, 0xb4, 0xd9, 0xca, 0xba, 0xb1, 0x31, 0xef, 0x5e, 0xd4, 0x93, 0x9d, 0xbc, 0xe9, 0xb6, 0xe0, + 0xd2, 0x80, 0x44, 0x64, 0xe0, 0x87, 0xa5, 0x35, 0xab, 0x6a, 0x8d, 0x9e, 0xcc, 0xaf, 0x71, 0x7e, + 0x6f, 0xc0, 0x45, 0x17, 0x1f, 0x10, 0xc6, 0x71, 0xfc, 0x8c, 0x06, 0xd8, 0xc5, 0x2f, 0x13, 0xcc, + 0x38, 0xba, 0x07, 0xb5, 0xae, 0xcf, 0xb0, 0x86, 0xfe, 0xd5, 0x4a, 0x2f, 0x3c, 0x65, 0x07, 0xf7, + 0x7d, 0x86, 0x5d, 0xa9, 0x89, 0xbe, 0x05, 0x8b, 0x7e, 0x10, 0xc4, 0x98, 0x31, 0x09, 0xc0, 0x49, + 0x8b, 0xb6, 0x95, 0x8e, 0x9b, 0x2a, 0xe7, 0xd0, 0x62, 0xe6, 0xd1, 0xe2, 0xfc, 0xc6, 0x80, 0xb5, + 0xe2, 0xcd, 0xd8, 0x90, 0x46, 0x0c, 0xa3, 0x0f, 0x60, 0x41, 0xf8, 0x3c, 0x61, 0xfa, 0x72, 0x57, + 0x2a, 0xcf, 0xd9, 0x97, 0x2a, 0xae, 0x56, 0x15, 0xa9, 0x9b, 0x44, 0x84, 0xa7, 0x69, 0x45, 0xdd, + 0xf0, 0x7a, 0x39, 0xa2, 0x75, 0x01, 0xea, 0x44, 0x84, 0xab, 0x2c, 0xe2, 0x02, 0xc9, 0x7e, 0x3b, + 0x3f, 0x84, 0xb5, 0x87, 0x98, 0xe7, 0xb0, 0xa7, 0x6d, 0x35, 0x4b, 0x88, 0x16, 0x6b, 0xce, 0x5c, + 0xa9, 0xe6, 0x38, 0x7f, 0x30, 0xe0, 0x52, 0x69, 0xef, 0xb3, 0x7c, 0x6d, 0x16, 0x44, 0x73, 0x67, + 0x09, 0x22, 0xb3, 0x1c, 0x44, 0xce, 0xcf, 0x0d, 0xb8, 0xf2, 0x10, 0xf3, 0x7c, 0x82, 0x3a, 0x67, + 0x4b, 0xa0, 0xaf, 0x00, 0x64, 0x89, 0x89, 0xb5, 0xcc, 0x75, 0x73, 0xc3, 0x74, 0x73, 0x12, 0xe7, + 0x57, 0x06, 0xac, 0x8e, 0x9d, 0x5f, 0xcc, 0x6f, 0x46, 0x39, 0xbf, 0xfd, 0xbb, 0xcc, 0xf1, 0x3b, + 0x03, 0xae, 0x56, 0x9b, 0xe3, 0x2c, 0xce, 0xfb, 0x9e, 0x5a, 0x84, 0x05, 0x4a, 0x45, 0xf1, 0xbb, + 0x59, 0x55, 0x77, 0xc6, 0xcf, 0xd4, 0x8b, 0x9c, 0xcf, 0x4d, 0x40, 0x3b, 0x32, 0x29, 0xa9, 0xea, + 0xf6, 0x0e, 0xae, 0x39, 0x35, 0x65, 0x2a, 0x11, 0xa3, 0xda, 0x79, 0x10, 0xa3, 0xf9, 0x53, 0x11, + 0xa3, 0xab, 0x60, 0x89, 0xec, 0xcc, 0xb8, 0x3f, 0x18, 0xca, 0xba, 0x54, 0x73, 0x47, 0x82, 0x71, + 0x1a, 0xb2, 0x38, 0x23, 0x0d, 0xa9, 0x9f, 0x96, 0x86, 0x38, 0x6f, 0xe0, 0x62, 0x1a, 0xd8, 0x92, + 0x26, 0xbc, 0x83, 0x3b, 0x8a, 0xa1, 0x30, 0x57, 0x0e, 0x85, 0x29, 0x4e, 0x71, 0xfe, 0x61, 0xc2, + 0x6a, 0x27, 0xad, 0x6d, 0x7b, 0x3e, 0x3f, 0x94, 0xdc, 0xe4, 0xe4, 0x48, 0x99, 0x8c, 0x80, 0x1c, + 0x11, 0x30, 0x27, 0x12, 0x81, 0x5a, 0x91, 0x08, 0x14, 0x2f, 0x38, 0x5f, 0x46, 0xcd, 0xf9, 0x50, + 0xe1, 0x0d, 0x58, 0xc9, 0x15, 0xf6, 0xa1, 0xcf, 0x0f, 0x05, 0x1d, 0x16, 0x95, 0x7d, 0x89, 0xe4, + 0xbf, 0x9e, 0xa1, 0xdb, 0xb0, 0x9c, 0x55, 0xe2, 0x40, 0x15, 0xe8, 0xba, 0x44, 0xc8, 0xa8, 0x6c, + 0x07, 0x69, 0x85, 0x2e, 0x16, 0x50, 0xab, 0x82, 0xa8, 0xe4, 0x49, 0x13, 0x14, 0x49, 0xd3, 0xc4, + 0xe2, 0x6d, 0x9f, 0xa2, 0x78, 0x37, 0x26, 0x17, 0xef, 0x3f, 0x1a, 0x60, 0x67, 0x89, 0x60, 0xc6, + 0xb6, 0xa8, 0xe0, 0xff, 0xb9, 0xb2, 0xff, 0xaf, 0x43, 0x03, 0x47, 0x7e, 0x37, 0xc4, 0x3a, 0x3e, + 0x4c, 0x15, 0x1f, 0x4a, 0xa6, 0xe2, 0xe3, 0x01, 0xd8, 0x23, 0x6a, 0x9c, 0xc6, 0xfa, 0xcd, 0x89, + 0xdc, 0x38, 0x0f, 0x3e, 0x17, 0x32, 0x8e, 0xcc, 0x9c, 0x5f, 0xcf, 0x8d, 0xca, 0xa9, 0x8a, 0x8c, + 0xb3, 0x24, 0xcd, 0x1f, 0x41, 0x43, 0x7f, 0x85, 0xa2, 0xec, 0x2a, 0x75, 0x7e, 0xbb, 0xea, 0x5a, + 0x55, 0x87, 0x6e, 0xe6, 0xcc, 0xf8, 0x71, 0xc4, 0xe3, 0x63, 0xd7, 0x66, 0x23, 0x49, 0xdb, 0x83, + 0x95, 0xb2, 0x02, 0x5a, 0x01, 0xf3, 0x08, 0x1f, 0x6b, 0x1b, 0x8b, 0x9f, 0xa2, 0xcc, 0xbc, 0x12, + 0x18, 0xd5, 0xec, 0xe2, 0xda, 0x89, 0x79, 0xbb, 0x4f, 0x5d, 0xa5, 0xfd, 0x9d, 0xb9, 0x8f, 0x0c, + 0xe7, 0x0b, 0x03, 0x56, 0x76, 0x63, 0x3a, 0x7c, 0xe7, 0x94, 0xed, 0x40, 0x23, 0xc7, 0xf3, 0xd3, + 0x2c, 0x51, 0x90, 0x4d, 0x4b, 0xde, 0x97, 0xa1, 0x1e, 0xc4, 0x74, 0xe8, 0xf9, 0x61, 0x28, 0x03, + 0x58, 0x50, 0xde, 0x98, 0x0e, 0xb7, 0xc3, 0xd0, 0x79, 0x0d, 0x6b, 0xbb, 0x98, 0xf5, 0x62, 0xd2, + 0x7d, 0xf7, 0x62, 0x32, 0xa5, 0xce, 0x17, 0x12, 0xb5, 0x59, 0x4a, 0xd4, 0xce, 0xe7, 0x06, 0x5c, + 0x2a, 0x9d, 0x7c, 0x16, 0x74, 0x7c, 0xbf, 0x88, 0x59, 0x05, 0x8e, 0x29, 0xfd, 0x5c, 0x1e, 0xab, + 0xbe, 0xac, 0xf3, 0x72, 0xee, 0xbe, 0xc8, 0x6d, 0x7b, 0x31, 0x3d, 0x90, 0x2c, 0xf6, 0xfc, 0x18, + 0xe0, 0x9f, 0x0d, 0x78, 0x6f, 0xc2, 0x19, 0x67, 0xf9, 0xf2, 0xf2, 0x43, 0xc1, 0xdc, 0xb4, 0x87, + 0x02, 0xb3, 0xfc, 0x50, 0x50, 0xdd, 0x47, 0xd7, 0x26, 0xf4, 0xd1, 0x5f, 0x98, 0xd0, 0xdc, 0xe7, + 0x34, 0xf6, 0x0f, 0xf0, 0x0e, 0x8d, 0xfa, 0xe4, 0x40, 0x94, 0x87, 0xb4, 0x2f, 0x30, 0xe4, 0x47, + 0x67, 0xcc, 0xff, 0x3a, 0x34, 0xfc, 0x5e, 0x0f, 0x33, 0x26, 0xda, 0x31, 0x9d, 0x8d, 0x2c, 0xd7, + 0x56, 0xb2, 0x27, 0x42, 0x84, 0xbe, 0x06, 0xab, 0x0c, 0xf7, 0x62, 0xcc, 0xbd, 0x91, 0xa6, 0x46, + 0xf0, 0xb2, 0x9a, 0xd8, 0x4e, 0xb5, 0x45, 0x23, 0x91, 0x30, 0xbc, 0xbf, 0xff, 0x89, 0x46, 0xb1, + 0x1e, 0x09, 0x1a, 0xd7, 0x4d, 0x7a, 0x47, 0x98, 0xe7, 0xcb, 0x10, 0x28, 0x91, 0x84, 0xe2, 0x15, + 0xb0, 0x62, 0x4a, 0xb9, 0xac, 0x1d, 0x92, 0x33, 0x58, 0x6e, 0x5d, 0x08, 0x44, 0xda, 0xd2, 0xbb, + 0x76, 0xb6, 0x9f, 0x6a, 0xae, 0xa0, 0x47, 0xa2, 0xe7, 0xee, 0x6c, 0x3f, 0xfd, 0x38, 0x0a, 0x86, + 0x94, 0x44, 0x5c, 0x16, 0x12, 0xcb, 0xcd, 0x8b, 0xc4, 0xe7, 0x31, 0x65, 0x09, 0x4f, 0xd0, 0x1c, + 0x59, 0x44, 0x2c, 0xd7, 0xd6, 0xb2, 0xe7, 0xc7, 0x43, 0x2c, 0x6a, 0x57, 0xc2, 0xb0, 0xf7, 0x8a, + 0xc4, 0x3c, 0xf1, 0x43, 0xef, 0x90, 0x32, 0x2e, 0x6b, 0x49, 0xdd, 0x5d, 0x4a, 0x18, 0x7e, 0xa1, + 0xc4, 0x8f, 0x28, 0xe3, 0xe2, 0x1a, 0x31, 0x3e, 0x48, 0x6b, 0x88, 0xe5, 0xea, 0x91, 0xe8, 0x39, + 0x7b, 0x21, 0x4d, 0x02, 0x6f, 0x18, 0xd3, 0x57, 0x24, 0xc0, 0xb1, 0xac, 0x17, 0x96, 0xdb, 0x94, + 0xd2, 0x3d, 0x2d, 0x74, 0xfe, 0x52, 0x83, 0x15, 0x45, 0x0a, 0x1f, 0xd3, 0x6e, 0x8a, 0xda, 0xab, + 0x60, 0xf5, 0xc2, 0x44, 0xf4, 0x57, 0x1a, 0xb2, 0x96, 0x3b, 0x12, 0x08, 0xd3, 0xe7, 0xeb, 0x6a, + 0x8c, 0xfb, 0xe4, 0x8d, 0x76, 0xd1, 0xf2, 0xa8, 0xb0, 0x4a, 0x71, 0x9e, 0x02, 0x98, 0x63, 0x14, + 0x20, 0xf0, 0xb9, 0xaf, 0xeb, 0x72, 0x4d, 0xd6, 0x65, 0x4b, 0x48, 0x54, 0x49, 0x1e, 0xab, 0xb4, + 0xf3, 0x15, 0x95, 0x36, 0x47, 0x3d, 0x16, 0x8a, 0xd4, 0xa3, 0x18, 0x53, 0x8b, 0xe5, 0x1c, 0xf3, + 0x08, 0x96, 0x52, 0x0f, 0xf4, 0x24, 0x18, 0xa5, 0x9b, 0x2a, 0xfa, 0x3e, 0x99, 0x99, 0xf3, 0xa8, + 0x75, 0x9b, 0xac, 0x00, 0xe2, 0x32, 0x55, 0xb1, 0x4e, 0x45, 0x55, 0x4a, 0x34, 0x19, 0x4e, 0x43, + 0x93, 0xf3, 0xb4, 0xc3, 0x9e, 0x91, 0x76, 0x34, 0x4e, 0x41, 0x3b, 0x9a, 0x93, 0x69, 0xc7, 0x27, + 0xb0, 0xf2, 0x83, 0x04, 0xc7, 0xc7, 0x8f, 0x69, 0x97, 0xcd, 0x86, 0xa5, 0x36, 0xd4, 0x35, 0x20, + 0xd2, 0x0a, 0x95, 0x8d, 0x9d, 0xbf, 0x19, 0xd0, 0x94, 0xdb, 0x3f, 0xf7, 0xd9, 0x51, 0xfa, 0x7c, + 0x96, 0xa2, 0xc9, 0x28, 0xa2, 0xe9, 0x94, 0x8d, 0x5c, 0xc5, 0xdb, 0x8f, 0x59, 0xf5, 0xf6, 0x53, + 0x41, 0x10, 0x6b, 0x95, 0x04, 0xb1, 0xd4, 0x19, 0xce, 0x8f, 0x75, 0x86, 0x5f, 0x1a, 0xb0, 0x9a, + 0xb3, 0xd1, 0x59, 0x32, 0x78, 0xc1, 0xb2, 0x73, 0x65, 0xcb, 0xde, 0x2f, 0x56, 0x36, 0xb3, 0x0a, + 0x52, 0xb9, 0xca, 0x96, 0xda, 0xb8, 0x50, 0xdd, 0x9e, 0xc0, 0xb2, 0xe0, 0x1e, 0xe7, 0xe3, 0xce, + 0xbf, 0x1a, 0xb0, 0xf8, 0x98, 0x76, 0xa5, 0x23, 0xf3, 0x58, 0x35, 0x8a, 0x58, 0x5d, 0x01, 0x33, + 0x20, 0x03, 0x5d, 0x8e, 0xc4, 0x4f, 0x11, 0xcb, 0x8c, 0xfb, 0x31, 0x1f, 0xbd, 0x8c, 0x0a, 0x66, + 0x2a, 0x24, 0xf2, 0x71, 0xed, 0x32, 0xd4, 0x71, 0x14, 0xa8, 0x49, 0xdd, 0x66, 0xe0, 0x28, 0x90, + 0x53, 0xe7, 0xd3, 0x39, 0xae, 0xc1, 0xfc, 0x90, 0x8e, 0x5e, 0x33, 0xd5, 0xc0, 0x59, 0x03, 0xf4, + 0x10, 0xf3, 0xc7, 0xb4, 0x2b, 0xbc, 0x92, 0x9a, 0xc7, 0xf9, 0xd3, 0x9c, 0xec, 0xea, 0x46, 0xe2, + 0xb3, 0x38, 0xd8, 0x81, 0xa6, 0xaa, 0xbf, 0x9f, 0xd1, 0xae, 0x17, 0x25, 0xa9, 0x51, 0x6c, 0x29, + 0x7c, 0x4c, 0xbb, 0xcf, 0x92, 0x01, 0xba, 0x03, 0x17, 0x49, 0x24, 0x72, 0xbc, 0xa4, 0x04, 0x99, + 0xa6, 0xb2, 0xd2, 0x0a, 0x89, 0x52, 0xb2, 0xa0, 0xd5, 0x6f, 0xc1, 0x32, 0x8e, 0x5e, 0x26, 0x38, + 0xc1, 0x99, 0xaa, 0xb2, 0x59, 0x53, 0x8b, 0xb5, 0x9e, 0x28, 0xfd, 0x3e, 0x3b, 0xf2, 0x58, 0x48, + 0x39, 0xd3, 0xb9, 0xd7, 0x12, 0x92, 0x7d, 0x21, 0x40, 0x1f, 0x81, 0x25, 0x96, 0x2b, 0x68, 0xa9, + 0xee, 0xec, 0x4a, 0x15, 0xb4, 0xb4, 0xbf, 0xdd, 0xfa, 0x67, 0xea, 0x07, 0x13, 0x01, 0xa2, 0xfb, + 0x88, 0x80, 0xb0, 0x23, 0x5d, 0x3a, 0x41, 0x89, 0x76, 0x09, 0x3b, 0x72, 0x7e, 0x0c, 0x97, 0xf3, + 0xef, 0x5d, 0x84, 0x71, 0xd2, 0x3b, 0x4f, 0x3a, 0xf5, 0x5b, 0x03, 0xda, 0x55, 0x07, 0xfc, 0x07, + 0x59, 0xe4, 0xd6, 0x2f, 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, 0xb7, 0x35, 0x32, 0xc5, + 0xce, 0xa1, 0x1f, 0x45, 0x38, 0x44, 0x5b, 0x13, 0xde, 0x40, 0xab, 0x94, 0xd3, 0x33, 0x6f, 0x54, + 0x9e, 0xb9, 0xcf, 0x63, 0x12, 0x1d, 0xa4, 0x26, 0x76, 0x2e, 0xa0, 0xe7, 0x60, 0xe7, 0x1e, 0xa2, + 0xd0, 0xad, 0x2a, 0x4b, 0x8d, 0xbf, 0x54, 0xb5, 0x4f, 0xf2, 0x85, 0x73, 0x01, 0xf5, 0xa1, 0x59, + 0x78, 0x29, 0x45, 0x1b, 0x27, 0x35, 0x79, 0xf9, 0xe7, 0xc9, 0xf6, 0x57, 0x67, 0xd0, 0xcc, 0x6e, + 0xff, 0x53, 0x65, 0xb0, 0xb1, 0xa7, 0xc6, 0xbb, 0x13, 0x36, 0x99, 0xf4, 0x28, 0xda, 0xbe, 0x37, + 0xfb, 0x82, 0xec, 0xf0, 0x60, 0xf4, 0x91, 0x2a, 0xa0, 0x6e, 0x4f, 0xef, 0x64, 0xd5, 0x69, 0x1b, + 0xb3, 0xb6, 0xbc, 0xce, 0x05, 0xb4, 0x07, 0x56, 0xd6, 0x74, 0xa2, 0xf7, 0xab, 0x16, 0x96, 0x7b, + 0xd2, 0x19, 0x9c, 0x53, 0x68, 0xdb, 0xaa, 0x9d, 0x53, 0xd5, 0x53, 0x56, 0x3b, 0xa7, 0xb2, 0x07, + 0x74, 0x2e, 0xa0, 0x44, 0xc6, 0x4e, 0x29, 0xba, 0xd1, 0x9d, 0x69, 0xfe, 0x2d, 0xa4, 0x99, 0xf6, + 0xe6, 0xac, 0xea, 0xd9, 0xb1, 0x3f, 0x1b, 0xbd, 0xd2, 0x17, 0x7a, 0x34, 0x74, 0xef, 0xa4, 0xad, + 0xaa, 0x5a, 0xc6, 0xf6, 0x37, 0xde, 0x61, 0x45, 0x0e, 0x93, 0x68, 0xff, 0x90, 0xbe, 0x56, 0xa4, + 0x34, 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, + 0x2f, 0x17, 0xf4, 0xff, 0x08, 0x9e, 0xd1, 0x00, 0xff, 0xf7, 0xa7, 0xe0, 0x3d, 0xb0, 0xb2, 0xb6, + 0xaf, 0x3a, 0xc2, 0xcb, 0x5d, 0xe1, 0xb4, 0x08, 0xff, 0x14, 0xac, 0x8c, 0xd8, 0x56, 0xef, 0x58, + 0xee, 0x0d, 0xda, 0x37, 0xa7, 0x68, 0x65, 0xb7, 0x7d, 0x06, 0xf5, 0x94, 0x88, 0xa2, 0x1b, 0x93, + 0xd2, 0x51, 0x7e, 0xe7, 0x29, 0x77, 0xfd, 0x09, 0xd8, 0x39, 0x96, 0x56, 0x5d, 0x80, 0xc6, 0xd9, + 0x5d, 0xfb, 0xf6, 0x54, 0xbd, 0xff, 0x8d, 0x80, 0xbc, 0xff, 0xcd, 0x4f, 0xb7, 0x0e, 0x08, 0x3f, + 0x4c, 0xba, 0xc2, 0xb2, 0x77, 0x95, 0xe6, 0x1d, 0x42, 0xf5, 0xaf, 0xbb, 0xe9, 0x2d, 0xef, 0xca, + 0x9d, 0xee, 0x4a, 0x3b, 0x0d, 0xbb, 0xdd, 0x05, 0x39, 0xfc, 0xe0, 0x5f, 0x01, 0x00, 0x00, 0xff, + 0xff, 0x92, 0xba, 0x38, 0x00, 0x06, 0x24, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/internal/proto/query_coord.proto b/internal/proto/query_coord.proto index 868674cc6a2de..5ac90483419c6 100644 --- a/internal/proto/query_coord.proto +++ b/internal/proto/query_coord.proto @@ -270,7 +270,8 @@ message FieldIndexInfo { int64 index_size = 8; int64 index_version = 9; int64 num_rows = 10; - string index_engine_version = 11; + int32 current_index_version = 11; + int32 minimal_index_version = 12; } enum LoadScope { diff --git a/internal/proto/querypb/query_coord.pb.go b/internal/proto/querypb/query_coord.pb.go index 4b5be2890f5c7..0f677994374e2 100644 --- a/internal/proto/querypb/query_coord.pb.go +++ b/internal/proto/querypb/query_coord.pb.go @@ -251,7 +251,7 @@ func (SyncType) EnumDescriptor() ([]byte, []int) { return fileDescriptor_aab7cc9a69ed26e8, []int{6} } -// --------------------QueryCoord grpc request and response proto------------------ +//--------------------QueryCoord grpc request and response proto------------------ type ShowCollectionsRequest struct { Base *commonpb.MsgBase `protobuf:"bytes,1,opt,name=base,proto3" json:"base,omitempty"` // Not useful for now @@ -1336,7 +1336,7 @@ func (m *SyncNewCreatedPartitionRequest) GetPartitionID() int64 { return 0 } -// -----------------query node grpc request and response proto---------------- +//-----------------query node grpc request and response proto---------------- type LoadMetaInfo struct { LoadType LoadType `protobuf:"varint,1,opt,name=load_type,json=loadType,proto3,enum=milvus.proto.query.LoadType" json:"load_type,omitempty"` CollectionID int64 `protobuf:"varint,2,opt,name=collectionID,proto3" json:"collectionID,omitempty"` @@ -1771,7 +1771,8 @@ 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"` + CurrentIndexVersion int32 `protobuf:"varint,11,opt,name=current_index_version,json=currentIndexVersion,proto3" json:"current_index_version,omitempty"` + MinimalIndexVersion int32 `protobuf:"varint,12,opt,name=minimal_index_version,json=minimalIndexVersion,proto3" json:"minimal_index_version,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -1872,11 +1873,18 @@ func (m *FieldIndexInfo) GetNumRows() int64 { return 0 } -func (m *FieldIndexInfo) GetIndexEngineVersion() string { +func (m *FieldIndexInfo) GetCurrentIndexVersion() int32 { if m != nil { - return m.IndexEngineVersion + return m.CurrentIndexVersion } - return "" + return 0 +} + +func (m *FieldIndexInfo) GetMinimalIndexVersion() int32 { + if m != nil { + return m.MinimalIndexVersion + } + return 0 } type LoadSegmentsRequest struct { @@ -2496,7 +2504,7 @@ func (m *GetLoadInfoResponse) GetPartitions() []int64 { return nil } -// ----------------request auto triggered by QueryCoord----------------- +//----------------request auto triggered by QueryCoord----------------- type HandoffSegmentsRequest struct { Base *commonpb.MsgBase `protobuf:"bytes,1,opt,name=base,proto3" json:"base,omitempty"` SegmentInfos []*SegmentInfo `protobuf:"bytes,2,rep,name=segmentInfos,proto3" json:"segmentInfos,omitempty"` @@ -3193,7 +3201,7 @@ func (m *UnsubscribeChannelInfo) GetCollectionChannels() []*UnsubscribeChannels return nil } -// ---- synchronize messages proto between QueryCoord and QueryNode ----- +//---- synchronize messages proto between QueryCoord and QueryNode ----- type SegmentChangeInfo struct { OnlineNodeID int64 `protobuf:"varint,1,opt,name=online_nodeID,json=onlineNodeID,proto3" json:"online_nodeID,omitempty"` OnlineSegments []*SegmentInfo `protobuf:"bytes,2,rep,name=online_segments,json=onlineSegments,proto3" json:"online_segments,omitempty"` @@ -4582,308 +4590,309 @@ func init() { func init() { proto.RegisterFile("query_coord.proto", fileDescriptor_aab7cc9a69ed26e8) } var fileDescriptor_aab7cc9a69ed26e8 = []byte{ - // 4809 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x3c, 0x4b, 0x6f, 0x1c, 0x47, - 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, + // 4825 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x3c, 0x4b, 0x73, 0x1c, 0xc7, + 0x79, 0x9c, 0x7d, 0x61, 0xf7, 0xdb, 0xd7, 0xa0, 0x01, 0x90, 0xeb, 0x35, 0x49, 0x51, 0x43, 0x3d, + 0x60, 0x4a, 0x02, 0x69, 0xd0, 0x92, 0x69, 0x4b, 0x2a, 0x85, 0x04, 0x44, 0x0a, 0x96, 0x04, 0x21, + 0x03, 0x50, 0x4e, 0xc9, 0xb2, 0x57, 0x83, 0x9d, 0xc6, 0x62, 0x8a, 0xf3, 0x58, 0xce, 0xcc, 0x02, + 0x82, 0x52, 0x95, 0xca, 0x21, 0x97, 0x38, 0x71, 0x2a, 0x95, 0x1c, 0x92, 0x43, 0x2a, 0x87, 0xa4, + 0x52, 0xe5, 0xa4, 0x92, 0x4b, 0x2a, 0xa9, 0xca, 0x21, 0x87, 0xdc, 0x72, 0xca, 0xeb, 0xe4, 0x3f, + 0x90, 0xdc, 0x72, 0x8c, 0x2b, 0xa5, 0x5b, 0xaa, 0x1f, 0xf3, 0xe8, 0x99, 0x5e, 0xec, 0x00, 0x4b, + 0x5a, 0x52, 0xca, 0xb7, 0x9d, 0xaf, 0x1f, 0xdf, 0xd7, 0xdf, 0xab, 0xbf, 0xef, 0xeb, 0xee, 0x85, + 0xc5, 0xc7, 0x13, 0xec, 0x9f, 0x0c, 0x86, 0x9e, 0xe7, 0x9b, 0x6b, 0x63, 0xdf, 0x0b, 0x3d, 0x84, + 0x1c, 0xcb, 0x3e, 0x9a, 0x04, 0xec, 0x6b, 0x8d, 0xb6, 0xf7, 0x5b, 0x43, 0xcf, 0x71, 0x3c, 0x97, + 0xc1, 0xfa, 0xad, 0x74, 0x8f, 0x7e, 0xc7, 0x72, 0x43, 0xec, 0xbb, 0x86, 0x1d, 0xb5, 0x06, 0xc3, + 0x43, 0xec, 0x18, 0xfc, 0xab, 0xe1, 0x04, 0x23, 0xfe, 0x53, 0x35, 0x8d, 0xd0, 0x48, 0xa3, 0xea, + 0x2f, 0x5a, 0xae, 0x89, 0x3f, 0x4d, 0x83, 0xb4, 0xdf, 0x52, 0xe0, 0xe2, 0xee, 0xa1, 0x77, 0xbc, + 0xe1, 0xd9, 0x36, 0x1e, 0x86, 0x96, 0xe7, 0x06, 0x3a, 0x7e, 0x3c, 0xc1, 0x41, 0x88, 0x6e, 0x41, + 0x65, 0xdf, 0x08, 0x70, 0x4f, 0xb9, 0xa6, 0xac, 0x36, 0xd7, 0x2f, 0xaf, 0x09, 0x74, 0x72, 0x02, + 0xdf, 0x0f, 0x46, 0xf7, 0x8c, 0x00, 0xeb, 0xb4, 0x27, 0x42, 0x50, 0x31, 0xf7, 0xb7, 0x36, 0x7b, + 0xa5, 0x6b, 0xca, 0x6a, 0x59, 0xa7, 0xbf, 0xd1, 0x73, 0xd0, 0x1e, 0xc6, 0x73, 0x6f, 0x6d, 0x06, + 0xbd, 0xf2, 0xb5, 0xf2, 0x6a, 0x59, 0x17, 0x81, 0xda, 0x8f, 0x4b, 0x70, 0x29, 0x47, 0x46, 0x30, + 0xf6, 0xdc, 0x00, 0xa3, 0xdb, 0x50, 0x0b, 0x42, 0x23, 0x9c, 0x04, 0x9c, 0x92, 0xaf, 0x4b, 0x29, + 0xd9, 0xa5, 0x5d, 0x74, 0xde, 0x35, 0x8f, 0xb6, 0x24, 0x41, 0x8b, 0xbe, 0x09, 0xcb, 0x96, 0xfb, + 0x3e, 0x76, 0x3c, 0xff, 0x64, 0x30, 0xc6, 0xfe, 0x10, 0xbb, 0xa1, 0x31, 0xc2, 0x11, 0x8d, 0x4b, + 0x51, 0xdb, 0x4e, 0xd2, 0x84, 0x5e, 0x83, 0x4b, 0x4c, 0x86, 0x01, 0xf6, 0x8f, 0xac, 0x21, 0x1e, + 0x18, 0x47, 0x86, 0x65, 0x1b, 0xfb, 0x36, 0xee, 0x55, 0xae, 0x95, 0x57, 0xeb, 0xfa, 0x0a, 0x6d, + 0xde, 0x65, 0xad, 0x77, 0xa3, 0x46, 0xf4, 0x0d, 0x50, 0x7d, 0x7c, 0xe0, 0xe3, 0xe0, 0x70, 0x30, + 0xf6, 0xbd, 0x91, 0x8f, 0x83, 0xa0, 0x57, 0xa5, 0x68, 0xba, 0x1c, 0xbe, 0xc3, 0xc1, 0xda, 0x5f, + 0x28, 0xb0, 0x42, 0x98, 0xb1, 0x63, 0xf8, 0xa1, 0xf5, 0x14, 0x44, 0xa2, 0x41, 0x2b, 0xcd, 0x86, + 0x5e, 0x99, 0xb6, 0x09, 0x30, 0xd2, 0x67, 0x1c, 0xa1, 0x27, 0xec, 0xab, 0x50, 0x52, 0x05, 0x98, + 0xf6, 0x6f, 0x5c, 0x77, 0xd2, 0x74, 0xce, 0x23, 0xb3, 0x2c, 0xce, 0x52, 0x1e, 0xe7, 0x79, 0x24, + 0x26, 0xe3, 0x7c, 0x45, 0xce, 0xf9, 0x7f, 0x29, 0xc3, 0xca, 0x7b, 0x9e, 0x61, 0x26, 0x6a, 0xf8, + 0x8b, 0xe7, 0xfc, 0x9b, 0x50, 0x63, 0x16, 0xdd, 0xab, 0x50, 0x5c, 0xcf, 0x8b, 0xb8, 0xb8, 0xb5, + 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, 0xba, 0x84, 0xad, 0xcd, 0x5e, 0xed, 0x5a, + 0x79, 0xb5, 0xb9, 0xfe, 0xfa, 0x5a, 0xde, 0x1b, 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, 0x15, 0x44, + 0x59, 0x27, 0x3f, 0xd1, 0x32, 0x54, 0x8f, 0x0c, 0x7b, 0x82, 0x39, 0xab, 0xd9, 0xc7, 0x77, 0x4b, + 0x77, 0x14, 0xed, 0x4f, 0x14, 0xe8, 0xe9, 0xd8, 0xc6, 0x46, 0x80, 0xbf, 0x48, 0x91, 0x5e, 0x84, + 0x9a, 0xeb, 0x99, 0x78, 0x6b, 0x93, 0x8a, 0xb4, 0xac, 0xf3, 0x2f, 0xed, 0x73, 0x05, 0x96, 0x1f, + 0xe0, 0x90, 0x98, 0x81, 0x15, 0x84, 0xd6, 0x30, 0xb6, 0xf3, 0x37, 0xa1, 0xec, 0xe3, 0xc7, 0x9c, + 0xb2, 0x97, 0x44, 0xca, 0x62, 0xf7, 0x2f, 0x1b, 0xa9, 0x93, 0x71, 0xe8, 0x59, 0x68, 0x99, 0x8e, + 0x3d, 0x18, 0x1e, 0x1a, 0xae, 0x8b, 0x6d, 0x66, 0x48, 0x0d, 0xbd, 0x69, 0x3a, 0xf6, 0x06, 0x07, + 0xa1, 0xab, 0x00, 0x01, 0x1e, 0x39, 0xd8, 0x0d, 0x13, 0x9f, 0x9c, 0x82, 0xa0, 0x1b, 0xb0, 0x78, + 0xe0, 0x7b, 0xce, 0x20, 0x38, 0x34, 0x7c, 0x73, 0x60, 0x63, 0xc3, 0xc4, 0x3e, 0xa5, 0xbe, 0xae, + 0x77, 0x49, 0xc3, 0x2e, 0x81, 0xbf, 0x47, 0xc1, 0xe8, 0x36, 0x54, 0x83, 0xa1, 0x37, 0xc6, 0x54, + 0xd3, 0x3a, 0xeb, 0x57, 0x64, 0x3a, 0xb4, 0x69, 0x84, 0xc6, 0x2e, 0xe9, 0xa4, 0xb3, 0xbe, 0xda, + 0x3f, 0x54, 0x98, 0xa9, 0x7d, 0xc9, 0x9d, 0x5c, 0xca, 0x1c, 0xab, 0x4f, 0xc6, 0x1c, 0x6b, 0x85, + 0xcc, 0x71, 0xe1, 0x74, 0x73, 0xcc, 0x71, 0xed, 0x2c, 0xe6, 0x58, 0x9f, 0x69, 0x8e, 0x0d, 0x99, + 0x39, 0xa2, 0xb7, 0xa1, 0xcb, 0x02, 0x08, 0xcb, 0x3d, 0xf0, 0x06, 0xb6, 0x15, 0x84, 0x3d, 0xa0, + 0x64, 0x5e, 0xc9, 0x6a, 0xa8, 0x89, 0x3f, 0x5d, 0x63, 0x88, 0xdd, 0x03, 0x4f, 0x6f, 0x5b, 0xd1, + 0xcf, 0xf7, 0xac, 0x20, 0x9c, 0xdf, 0xaa, 0xff, 0x29, 0xb1, 0xea, 0x2f, 0xbb, 0xf6, 0x24, 0x96, + 0x5f, 0x15, 0x2c, 0xff, 0x2f, 0x15, 0xf8, 0xda, 0x03, 0x1c, 0xc6, 0xe4, 0x13, 0x43, 0xc6, 0x5f, + 0xd2, 0x6d, 0xfe, 0x6f, 0x14, 0xe8, 0xcb, 0x68, 0x9d, 0x67, 0xab, 0xff, 0x08, 0x2e, 0xc6, 0x38, + 0x06, 0x26, 0x0e, 0x86, 0xbe, 0x35, 0xa6, 0x62, 0xa4, 0xbe, 0xaa, 0xb9, 0x7e, 0x5d, 0xa6, 0xf8, + 0x59, 0x0a, 0x56, 0xe2, 0x29, 0x36, 0x53, 0x33, 0x68, 0x3f, 0x51, 0x60, 0x85, 0xf8, 0x46, 0xee, + 0xcc, 0x88, 0x06, 0x9e, 0x9b, 0xaf, 0xa2, 0x9b, 0x2c, 0xe5, 0xdc, 0x64, 0x01, 0x1e, 0xd3, 0x10, + 0x3b, 0x4b, 0xcf, 0x3c, 0xbc, 0x7b, 0x15, 0xaa, 0xc4, 0x00, 0x23, 0x56, 0x3d, 0x23, 0x63, 0x55, + 0x1a, 0x19, 0xeb, 0xad, 0xb9, 0x8c, 0x8a, 0xc4, 0x6f, 0xcf, 0xa1, 0x6e, 0xd9, 0x65, 0x97, 0x24, + 0xcb, 0xfe, 0x5d, 0x05, 0x2e, 0xe5, 0x10, 0xce, 0xb3, 0xee, 0x37, 0xa0, 0x46, 0x77, 0xa3, 0x68, + 0xe1, 0xcf, 0x49, 0x17, 0x9e, 0x42, 0x47, 0xbc, 0x8d, 0xce, 0xc7, 0x68, 0x1e, 0xa8, 0xd9, 0x36, + 0xb2, 0x4f, 0xf2, 0x3d, 0x72, 0xe0, 0x1a, 0x0e, 0x63, 0x40, 0x43, 0x6f, 0x72, 0xd8, 0xb6, 0xe1, + 0x60, 0xf4, 0x35, 0xa8, 0x13, 0x93, 0x1d, 0x58, 0x66, 0x24, 0xfe, 0x05, 0x6a, 0xc2, 0x66, 0x80, + 0xae, 0x00, 0xd0, 0x26, 0xc3, 0x34, 0x7d, 0xb6, 0x85, 0x36, 0xf4, 0x06, 0x81, 0xdc, 0x25, 0x00, + 0xed, 0x8f, 0x15, 0xb8, 0xba, 0x7b, 0xe2, 0x0e, 0xb7, 0xf1, 0xf1, 0x86, 0x8f, 0x8d, 0x10, 0x27, + 0x4e, 0xfb, 0xa9, 0x32, 0x1e, 0x5d, 0x83, 0x66, 0xca, 0x7e, 0xb9, 0x4a, 0xa6, 0x41, 0xda, 0xdf, + 0x2a, 0xd0, 0x22, 0xbb, 0xc8, 0xfb, 0x38, 0x34, 0x88, 0x8a, 0xa0, 0xef, 0x40, 0xc3, 0xf6, 0x0c, + 0x73, 0x10, 0x9e, 0x8c, 0x19, 0x35, 0x9d, 0x2c, 0x35, 0xc9, 0xd6, 0xb3, 0x77, 0x32, 0xc6, 0x7a, + 0xdd, 0xe6, 0xbf, 0x0a, 0x51, 0x94, 0xf5, 0x32, 0x65, 0x89, 0xa7, 0x7c, 0x06, 0x9a, 0x0e, 0x0e, + 0x7d, 0x6b, 0xc8, 0x88, 0xa8, 0x50, 0x51, 0x00, 0x03, 0x11, 0x44, 0xda, 0x4f, 0x6a, 0x70, 0xf1, + 0xfb, 0x46, 0x38, 0x3c, 0xdc, 0x74, 0xa2, 0x28, 0xe6, 0xfc, 0x7c, 0x4c, 0xfc, 0x72, 0x29, 0xed, + 0x97, 0x9f, 0x98, 0xdf, 0x8f, 0x6d, 0xb4, 0x2a, 0xb3, 0x51, 0x92, 0x98, 0xaf, 0x7d, 0xc8, 0xd5, + 0x2c, 0x65, 0xa3, 0xa9, 0x60, 0xa3, 0x76, 0x9e, 0x60, 0x63, 0x03, 0xda, 0xf8, 0xd3, 0xa1, 0x3d, + 0x21, 0xfa, 0x4a, 0xb1, 0xb3, 0x28, 0xe2, 0xaa, 0x04, 0x7b, 0xda, 0x41, 0xb4, 0xf8, 0xa0, 0x2d, + 0x4e, 0x03, 0xd3, 0x05, 0x07, 0x87, 0x06, 0x0d, 0x15, 0x9a, 0xeb, 0xd7, 0xa6, 0xe9, 0x42, 0xa4, + 0x40, 0x4c, 0x1f, 0xc8, 0x17, 0xba, 0x0c, 0x0d, 0x1e, 0xda, 0x6c, 0x6d, 0xf6, 0x1a, 0x94, 0x7d, + 0x09, 0x00, 0x19, 0xd0, 0xe6, 0xde, 0x93, 0x53, 0xc8, 0x02, 0x88, 0x37, 0x64, 0x08, 0xe4, 0xc2, + 0x4e, 0x53, 0x1e, 0xf0, 0x40, 0x27, 0x48, 0x81, 0x48, 0xe6, 0xef, 0x1d, 0x1c, 0xd8, 0x96, 0x8b, + 0xb7, 0x99, 0x84, 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, 0x8b, 0x2a, 0x15, 0x05, 0xfd, 0x54, 0x81, 0x95, 0x87, + 0x6e, 0x30, 0xd9, 0x8f, 0x59, 0xf4, 0xc5, 0x98, 0x43, 0xd6, 0x89, 0x56, 0x72, 0x4e, 0x54, 0xfb, + 0x9f, 0x2a, 0x74, 0xf9, 0x2a, 0x88, 0xd6, 0x50, 0x97, 0x73, 0x19, 0x1a, 0xf1, 0x3e, 0xca, 0x19, + 0x92, 0x00, 0xb2, 0x3e, 0xac, 0x94, 0xf3, 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, 0x99, 0x58, 0x68, 0x0c, 0x7b, 0x8f, 0xf6, 0xd5, 0x9b, 0x6c, 0xcc, 0x0e, 0x19, 0x82, + 0xae, 0x42, 0xd3, 0x9d, 0x38, 0x03, 0xef, 0x60, 0xe0, 0x7b, 0xc7, 0x01, 0x4d, 0x7e, 0xcb, 0x7a, + 0xc3, 0x9d, 0x38, 0x1f, 0x1c, 0xe8, 0xde, 0x31, 0xd9, 0xc7, 0x1a, 0x64, 0x47, 0x0b, 0x6c, 0x6f, + 0xc4, 0x12, 0xdf, 0xd9, 0xf3, 0x27, 0x03, 0xc8, 0x68, 0x13, 0xdb, 0xa1, 0x41, 0x47, 0x37, 0x8a, + 0x8d, 0x8e, 0x07, 0xa0, 0x17, 0xa0, 0x33, 0xf4, 0x9c, 0xb1, 0x41, 0x39, 0x74, 0xdf, 0xf7, 0x1c, + 0x6a, 0x80, 0x65, 0x3d, 0x03, 0x45, 0x1b, 0xd0, 0x4c, 0x8c, 0x20, 0xe8, 0x35, 0x29, 0x1e, 0x4d, + 0x66, 0xa5, 0xa9, 0x50, 0x9e, 0x28, 0x28, 0xc4, 0x56, 0x10, 0x10, 0xcd, 0x88, 0x8c, 0x3d, 0xb0, + 0x3e, 0xc3, 0xdc, 0xd0, 0x9a, 0x1c, 0xb6, 0x6b, 0x7d, 0x86, 0x49, 0x7a, 0x64, 0xb9, 0x01, 0xf6, + 0xc3, 0x28, 0x59, 0xed, 0xb5, 0xa9, 0xfa, 0xb4, 0x19, 0x94, 0x2b, 0x36, 0xda, 0x84, 0x4e, 0x10, + 0x1a, 0x7e, 0x38, 0x18, 0x7b, 0x01, 0x55, 0x80, 0x5e, 0x87, 0xea, 0x76, 0xc6, 0x24, 0x9d, 0x60, + 0x44, 0x14, 0x7b, 0x87, 0x77, 0xd2, 0xdb, 0x74, 0x50, 0xf4, 0x49, 0x66, 0xa1, 0x9c, 0x48, 0x66, + 0xe9, 0x16, 0x9a, 0x85, 0x0e, 0x8a, 0x67, 0x59, 0x25, 0xe9, 0x92, 0x61, 0x1a, 0xfb, 0x36, 0xfe, + 0x90, 0x7b, 0x10, 0x95, 0x2e, 0x2c, 0x0b, 0xd6, 0x7e, 0x56, 0x86, 0x8e, 0xc8, 0x1e, 0xe2, 0x76, + 0x58, 0x56, 0x16, 0xe9, 0x7c, 0xf4, 0x49, 0x98, 0x85, 0x5d, 0x32, 0x9a, 0xa5, 0x80, 0x54, 0xe5, + 0xeb, 0x7a, 0x93, 0xc1, 0xe8, 0x04, 0x44, 0x75, 0x99, 0x50, 0xa8, 0x9d, 0x95, 0x29, 0xa3, 0x1a, + 0x14, 0x42, 0x43, 0x95, 0x1e, 0x2c, 0x44, 0xd9, 0x23, 0x53, 0xf8, 0xe8, 0x93, 0xb4, 0xec, 0x4f, + 0x2c, 0x8a, 0x95, 0x29, 0x7c, 0xf4, 0x89, 0x36, 0xa1, 0xc5, 0xa6, 0x1c, 0x1b, 0xbe, 0xe1, 0x44, + 0xea, 0xfe, 0xac, 0xd4, 0x65, 0xbc, 0x8b, 0x4f, 0x3e, 0x24, 0xde, 0x67, 0xc7, 0xb0, 0x7c, 0x9d, + 0xa9, 0xc7, 0x0e, 0x1d, 0x85, 0x56, 0x41, 0x65, 0xb3, 0x1c, 0x58, 0x36, 0xe6, 0x86, 0xb3, 0xc0, + 0x52, 0x48, 0x0a, 0xbf, 0x6f, 0xd9, 0x98, 0xd9, 0x46, 0xbc, 0x04, 0xaa, 0x10, 0x75, 0x66, 0x1a, + 0x14, 0x42, 0xd5, 0xe1, 0x3a, 0x30, 0x2f, 0x3a, 0x88, 0x7c, 0x33, 0xdb, 0x40, 0x18, 0x8d, 0x9c, + 0xad, 0x34, 0x24, 0x9b, 0x38, 0xcc, 0xb8, 0x80, 0x2d, 0xc7, 0x9d, 0x38, 0xd4, 0xb4, 0xd6, 0x61, + 0x65, 0x38, 0xf1, 0x7d, 0xb6, 0xbd, 0xa4, 0xe7, 0x69, 0xd2, 0xa4, 0x7b, 0x89, 0x37, 0x6e, 0xa5, + 0xa7, 0x5b, 0x87, 0x15, 0xc7, 0x72, 0x2d, 0xc7, 0xb0, 0x33, 0x63, 0x5a, 0x6c, 0x0c, 0x6f, 0x4c, + 0x8f, 0xd1, 0xfe, 0xa0, 0x0a, 0x4b, 0xc4, 0x93, 0x71, 0xa7, 0x36, 0x47, 0x20, 0x72, 0x05, 0xc0, + 0x0c, 0xc2, 0x81, 0xe0, 0x7d, 0x1b, 0x66, 0x10, 0xf2, 0x6d, 0xea, 0x3b, 0x51, 0x1c, 0x51, 0x9e, + 0x9e, 0x16, 0x65, 0x3c, 0x6b, 0x3e, 0x96, 0x38, 0x57, 0x1d, 0xf1, 0x3a, 0xb4, 0x79, 0x4d, 0x40, + 0x48, 0x60, 0x5b, 0x0c, 0xb8, 0x2d, 0xdf, 0x1f, 0x6a, 0xd2, 0x7a, 0x66, 0x2a, 0x9e, 0x58, 0x98, + 0x2f, 0x9e, 0xa8, 0x67, 0xe3, 0x89, 0xfb, 0xd0, 0x15, 0x4d, 0x3a, 0xf2, 0x89, 0x33, 0x6c, 0xba, + 0x23, 0xd8, 0x74, 0x90, 0x0e, 0x07, 0x40, 0x0c, 0x07, 0xae, 0x43, 0xdb, 0xc5, 0xd8, 0x1c, 0x84, + 0xbe, 0xe1, 0x06, 0x07, 0xd8, 0xa7, 0xaa, 0x54, 0xd7, 0x5b, 0x04, 0xb8, 0xc7, 0x61, 0xe8, 0x0d, + 0x00, 0xba, 0x46, 0x56, 0x06, 0x6b, 0x4d, 0x2f, 0x83, 0x51, 0xa5, 0xa1, 0x65, 0x30, 0xca, 0x14, + 0xfa, 0xf3, 0x09, 0x45, 0x1c, 0xda, 0xbf, 0x96, 0xe0, 0x22, 0x2f, 0x8b, 0xcc, 0xaf, 0x97, 0xd3, + 0x22, 0x82, 0x68, 0x4b, 0x2d, 0x9f, 0x52, 0x68, 0xa8, 0x14, 0x08, 0x9a, 0xab, 0x92, 0xa0, 0x59, + 0x4c, 0xb6, 0x6b, 0xb9, 0x64, 0x3b, 0xae, 0x33, 0x2e, 0x14, 0xaf, 0x33, 0xa2, 0x65, 0xa8, 0xd2, + 0x0c, 0x90, 0xea, 0x4e, 0x43, 0x67, 0x1f, 0x85, 0xa4, 0xaa, 0xfd, 0x51, 0x09, 0xda, 0xbb, 0xd8, + 0xf0, 0x87, 0x87, 0x11, 0x1f, 0x5f, 0x4b, 0xd7, 0x65, 0x9f, 0x9b, 0x52, 0x97, 0x15, 0x86, 0x7c, + 0x65, 0x0a, 0xb2, 0x04, 0x41, 0xe8, 0x85, 0x46, 0x4c, 0xe5, 0xc0, 0x9d, 0x38, 0xbc, 0x58, 0xd9, + 0xa5, 0x0d, 0x9c, 0xd4, 0xed, 0x89, 0xa3, 0xfd, 0xb7, 0x02, 0xad, 0x5f, 0x25, 0xd3, 0x44, 0x8c, + 0xb9, 0x93, 0x66, 0xcc, 0x0b, 0x53, 0x18, 0xa3, 0x93, 0x64, 0x0e, 0x1f, 0xe1, 0xaf, 0x5c, 0xad, + 0xfa, 0x9f, 0x15, 0xe8, 0x93, 0x54, 0x5e, 0x67, 0x7e, 0x67, 0x7e, 0xeb, 0xba, 0x0e, 0xed, 0x23, + 0x21, 0x68, 0x2e, 0x51, 0xe5, 0x6c, 0x1d, 0xa5, 0x4b, 0x0f, 0x3a, 0xa8, 0x51, 0xe9, 0x98, 0x2f, + 0x36, 0xda, 0x06, 0x5e, 0x94, 0x51, 0x9d, 0x21, 0x8e, 0x7a, 0x88, 0xae, 0x2f, 0x02, 0xb5, 0xdf, + 0x53, 0x60, 0x49, 0xd2, 0x11, 0x5d, 0x82, 0x05, 0x5e, 0xe6, 0xe0, 0x71, 0x09, 0xb3, 0x77, 0x93, + 0x88, 0x27, 0x29, 0xd4, 0x59, 0x66, 0x3e, 0x12, 0x37, 0x49, 0xe6, 0x1e, 0xe7, 0x74, 0x66, 0x4e, + 0x3e, 0x66, 0x80, 0xfa, 0x50, 0xe7, 0xde, 0x34, 0x4a, 0x96, 0xe3, 0x6f, 0xed, 0x11, 0xa0, 0x07, + 0x38, 0xd9, 0xbb, 0xe6, 0xe1, 0x68, 0xe2, 0x6f, 0x12, 0x42, 0xd3, 0x4e, 0xc8, 0xd4, 0xfe, 0x53, + 0x81, 0x25, 0x01, 0xdb, 0x3c, 0xe5, 0xa8, 0x64, 0x7f, 0x2d, 0x9d, 0x67, 0x7f, 0x15, 0x4a, 0x2e, + 0xe5, 0x33, 0x95, 0x5c, 0xae, 0x02, 0xc4, 0xfc, 0x8f, 0x38, 0x9a, 0x82, 0x68, 0xff, 0xa8, 0xc0, + 0xc5, 0x77, 0x0c, 0xd7, 0xf4, 0x0e, 0x0e, 0xe6, 0x57, 0xd5, 0x0d, 0x10, 0xd2, 0xeb, 0xa2, 0x45, + 0x47, 0x31, 0x27, 0x7f, 0x09, 0x16, 0x7d, 0xb6, 0x33, 0x99, 0xa2, 0x2e, 0x97, 0x75, 0x35, 0x6a, + 0x88, 0x75, 0xf4, 0xaf, 0x4b, 0x80, 0xc8, 0xaa, 0xef, 0x19, 0xb6, 0xe1, 0x0e, 0xf1, 0xf9, 0x49, + 0x7f, 0x1e, 0x3a, 0x42, 0x08, 0x13, 0x5f, 0x02, 0x48, 0xc7, 0x30, 0x01, 0x7a, 0x17, 0x3a, 0xfb, + 0x0c, 0xd5, 0xc0, 0xc7, 0x46, 0xe0, 0xb9, 0x5c, 0x1c, 0xd2, 0xfa, 0xe2, 0x9e, 0x6f, 0x8d, 0x46, + 0xd8, 0xdf, 0xf0, 0x5c, 0x93, 0x67, 0x07, 0xfb, 0x11, 0x99, 0x64, 0x28, 0x31, 0x86, 0x24, 0x9e, + 0x8b, 0x85, 0x13, 0x07, 0x74, 0x94, 0x15, 0x01, 0x36, 0xec, 0x84, 0x11, 0xc9, 0x6e, 0xa8, 0xb2, + 0x86, 0xdd, 0xe9, 0xe5, 0x65, 0x49, 0x7c, 0xa5, 0xfd, 0x9d, 0x02, 0x28, 0x2e, 0x01, 0xd0, 0x9a, + 0x09, 0xb5, 0xe8, 0xec, 0x50, 0x45, 0xb2, 0x29, 0x5f, 0x86, 0x86, 0x19, 0x8d, 0xe4, 0x2e, 0x28, + 0x01, 0xd0, 0x3d, 0x92, 0x12, 0x3d, 0x20, 0x9a, 0x87, 0xcd, 0x28, 0xc5, 0x66, 0xc0, 0xf7, 0x28, + 0x4c, 0x0c, 0xcf, 0x2a, 0xd9, 0xf0, 0x2c, 0x5d, 0x3d, 0xad, 0x0a, 0xd5, 0x53, 0xed, 0xa7, 0x25, + 0x50, 0xe9, 0x16, 0xb2, 0x91, 0x94, 0xc1, 0x0a, 0x11, 0x7d, 0x1d, 0xda, 0xfc, 0x12, 0x8d, 0x40, + 0x78, 0xeb, 0x71, 0x6a, 0x32, 0x74, 0x0b, 0x96, 0x59, 0x27, 0x1f, 0x07, 0x13, 0x3b, 0xc9, 0x2e, + 0x59, 0xd2, 0x84, 0x1e, 0xb3, 0xbd, 0x8b, 0x34, 0x45, 0x23, 0x1e, 0xc2, 0xc5, 0x91, 0xed, 0xed, + 0x1b, 0xf6, 0x40, 0x14, 0x0f, 0x93, 0x61, 0x01, 0x8d, 0x5f, 0x66, 0xc3, 0x77, 0xd3, 0x32, 0x0c, + 0xd0, 0x3d, 0x68, 0x07, 0x18, 0x3f, 0x4a, 0x52, 0xce, 0x6a, 0x91, 0x94, 0xb3, 0x45, 0xc6, 0x44, + 0x5f, 0xda, 0x9f, 0x2a, 0xd0, 0xcd, 0x9c, 0x7d, 0x64, 0x0b, 0x24, 0x4a, 0xbe, 0x40, 0x72, 0x07, + 0xaa, 0xc4, 0x53, 0xb1, 0xbd, 0xa5, 0x23, 0x4f, 0xde, 0xc5, 0x59, 0x75, 0x36, 0x00, 0xdd, 0x84, + 0x25, 0xc9, 0x1d, 0x0b, 0x2e, 0x7e, 0x94, 0xbf, 0x62, 0xa1, 0xfd, 0xbc, 0x02, 0xcd, 0x14, 0x2b, + 0x66, 0xd4, 0x76, 0x9e, 0x48, 0x0d, 0x7b, 0xda, 0x99, 0x3a, 0x51, 0x39, 0x07, 0x3b, 0x2c, 0xbf, + 0xe4, 0xc9, 0xae, 0x83, 0x1d, 0x9a, 0x5d, 0xa6, 0x13, 0xc7, 0x9a, 0x98, 0x38, 0x8a, 0xa9, 0xf5, + 0xc2, 0x29, 0xa9, 0x75, 0x5d, 0x4c, 0xad, 0x05, 0x13, 0x6a, 0x64, 0x4d, 0xa8, 0x68, 0xb9, 0xe5, + 0x16, 0x2c, 0x0d, 0xd9, 0x19, 0xc1, 0xbd, 0x93, 0x8d, 0xb8, 0x89, 0x07, 0xa5, 0xb2, 0x26, 0x74, + 0x3f, 0x29, 0xa4, 0x32, 0x29, 0xb3, 0xa4, 0x43, 0x9e, 0xb9, 0x73, 0xd9, 0x30, 0x21, 0x47, 0x9e, + 0x99, 0x7e, 0x65, 0x0b, 0x3d, 0xed, 0x73, 0x15, 0x7a, 0x9e, 0x81, 0x66, 0x14, 0xa9, 0x10, 0x4b, + 0xef, 0x30, 0xa7, 0x17, 0xb9, 0x01, 0x33, 0x10, 0xfc, 0x40, 0x57, 0x3c, 0x45, 0xc9, 0xd6, 0x3d, + 0xd4, 0x7c, 0xdd, 0xe3, 0x12, 0x2c, 0x58, 0xc1, 0xe0, 0xc0, 0x78, 0x84, 0x7b, 0x8b, 0xb4, 0xb5, + 0x66, 0x05, 0xf7, 0x8d, 0x47, 0x58, 0xfb, 0xf7, 0x32, 0x74, 0x92, 0x0d, 0xb6, 0xb0, 0x07, 0x29, + 0x72, 0xcf, 0x68, 0x1b, 0xd4, 0x24, 0xee, 0xa1, 0x1c, 0x3e, 0x35, 0x07, 0xcf, 0x1e, 0x4d, 0x76, + 0xc7, 0x19, 0x7b, 0x15, 0xb6, 0xfb, 0xca, 0x99, 0xb6, 0xfb, 0x39, 0x6f, 0x20, 0xdc, 0x86, 0x95, + 0x78, 0xef, 0x15, 0x96, 0xcd, 0x12, 0xac, 0xe5, 0xa8, 0x71, 0x27, 0xbd, 0xfc, 0x29, 0x2e, 0x60, + 0x61, 0x9a, 0x0b, 0xc8, 0xaa, 0x40, 0x3d, 0xa7, 0x02, 0xf9, 0x8b, 0x10, 0x0d, 0xc9, 0x45, 0x08, + 0xed, 0x21, 0x2c, 0xd1, 0xa2, 0x76, 0x30, 0xf4, 0xad, 0x7d, 0x1c, 0xa7, 0x00, 0x45, 0xc4, 0xda, + 0x87, 0x7a, 0x26, 0x8b, 0x88, 0xbf, 0xb5, 0x1f, 0x2b, 0x70, 0x31, 0x3f, 0x2f, 0xd5, 0x98, 0xc4, + 0x91, 0x28, 0x82, 0x23, 0xf9, 0x35, 0x58, 0x4a, 0x45, 0x94, 0xc2, 0xcc, 0x53, 0x22, 0x70, 0x09, + 0xe1, 0x3a, 0x4a, 0xe6, 0x88, 0x60, 0xda, 0xcf, 0x95, 0xf8, 0x6c, 0x80, 0xc0, 0x46, 0xf4, 0xe0, + 0x85, 0xec, 0x6b, 0x9e, 0x6b, 0x5b, 0x6e, 0x5c, 0x70, 0xe1, 0x6b, 0x64, 0x40, 0x5e, 0x70, 0x79, + 0x07, 0xba, 0xbc, 0x53, 0xbc, 0x3d, 0x15, 0x0c, 0xc8, 0x3a, 0x6c, 0x5c, 0xbc, 0x31, 0x3d, 0x0f, + 0x1d, 0x7e, 0x22, 0x12, 0xe1, 0x2b, 0xcb, 0xce, 0x49, 0xbe, 0x07, 0x6a, 0xd4, 0xed, 0xac, 0x1b, + 0x62, 0x97, 0x0f, 0x8c, 0x03, 0xbb, 0xdf, 0x56, 0xa0, 0x27, 0x6e, 0x8f, 0xa9, 0xe5, 0x9f, 0x3d, + 0xbc, 0x7b, 0x5d, 0x3c, 0x07, 0x7f, 0xfe, 0x14, 0x7a, 0x12, 0x3c, 0xd1, 0x69, 0xf8, 0xef, 0x97, + 0xe8, 0xa5, 0x06, 0x92, 0xea, 0x6d, 0x5a, 0x41, 0xe8, 0x5b, 0xfb, 0x93, 0xf9, 0x4e, 0x66, 0x0d, + 0x68, 0x0e, 0x0f, 0xf1, 0xf0, 0xd1, 0xd8, 0xb3, 0x12, 0xa9, 0xbc, 0x25, 0xa3, 0x69, 0x3a, 0xda, + 0xb5, 0x8d, 0x64, 0x06, 0x76, 0xb4, 0x95, 0x9e, 0xb3, 0xff, 0x43, 0x50, 0xb3, 0x1d, 0xd2, 0x27, + 0x4a, 0x0d, 0x76, 0xa2, 0x74, 0x5b, 0x3c, 0x51, 0x9a, 0x11, 0x69, 0xa4, 0x0e, 0x94, 0xfe, 0xbe, + 0x04, 0x5f, 0x97, 0xd2, 0x36, 0x4f, 0x96, 0x34, 0xad, 0x8e, 0x74, 0x0f, 0xea, 0x99, 0xa4, 0xf6, + 0x85, 0x53, 0xe4, 0xc7, 0xeb, 0xae, 0xac, 0x34, 0x18, 0x24, 0xb1, 0x55, 0x62, 0xf0, 0x95, 0xe9, + 0x73, 0x70, 0xbb, 0x13, 0xe6, 0x88, 0xc6, 0xa1, 0xbb, 0xd0, 0x62, 0x05, 0x83, 0xc1, 0x91, 0x85, + 0x8f, 0xa3, 0xf3, 0xda, 0xab, 0x52, 0xd7, 0x4c, 0xfb, 0x7d, 0x68, 0xe1, 0x63, 0xbd, 0x69, 0xc7, + 0xbf, 0x03, 0xed, 0x0f, 0x2b, 0x00, 0x49, 0x1b, 0xc9, 0xce, 0x12, 0x9b, 0xe7, 0x46, 0x9c, 0x82, + 0x90, 0x58, 0x42, 0x8c, 0x5c, 0xa3, 0x4f, 0xa4, 0x27, 0xe7, 0x25, 0xa6, 0x15, 0x84, 0x9c, 0x2f, + 0x37, 0x4f, 0xa7, 0x25, 0x62, 0x11, 0x11, 0x19, 0xd7, 0x99, 0x20, 0x81, 0xa0, 0x57, 0x00, 0x8d, + 0x7c, 0xef, 0xd8, 0x72, 0x47, 0xe9, 0x7c, 0x83, 0xa5, 0x25, 0x8b, 0xbc, 0x25, 0x95, 0x70, 0xfc, + 0x08, 0xd4, 0x4c, 0xf7, 0x88, 0x25, 0xb7, 0x67, 0x90, 0xf1, 0x40, 0x98, 0x8b, 0xab, 0x6f, 0x57, + 0xc4, 0x40, 0x0f, 0x67, 0xf7, 0x0c, 0x7f, 0x84, 0x23, 0x89, 0xf2, 0x38, 0x4c, 0x04, 0xf6, 0x07, + 0xa0, 0x66, 0x57, 0x25, 0x39, 0x3a, 0x7d, 0x55, 0x54, 0xf4, 0xd3, 0xfc, 0x11, 0x99, 0x26, 0xa5, + 0xea, 0x7d, 0x03, 0x96, 0x65, 0xf4, 0x4a, 0x90, 0x9c, 0xdb, 0x9a, 0xde, 0x8a, 0x43, 0x62, 0x2a, + 0x87, 0x69, 0xbb, 0x4c, 0xaa, 0xf0, 0x5c, 0x12, 0x0a, 0xcf, 0xda, 0x6f, 0x96, 0x01, 0xe5, 0xd5, + 0x1f, 0x75, 0xa0, 0x14, 0x4f, 0x52, 0xda, 0xda, 0xcc, 0xa8, 0x5b, 0x29, 0xa7, 0x6e, 0x97, 0xa1, + 0x11, 0xef, 0xfa, 0xdc, 0xc5, 0x27, 0x80, 0xb4, 0x32, 0x56, 0x44, 0x65, 0x4c, 0x11, 0x56, 0x15, + 0x2b, 0xe2, 0xb7, 0x60, 0xd9, 0x36, 0x82, 0x70, 0xc0, 0x0a, 0xef, 0xa1, 0xe5, 0xe0, 0x20, 0x34, + 0x9c, 0x31, 0x15, 0x65, 0x45, 0x47, 0xa4, 0x6d, 0x93, 0x34, 0xed, 0x45, 0x2d, 0x68, 0x2f, 0x8a, + 0xae, 0x89, 0xef, 0xe5, 0x97, 0x12, 0x5e, 0x2d, 0x66, 0xee, 0x49, 0xb9, 0x9b, 0x69, 0x54, 0x23, + 0x0e, 0x3b, 0xfb, 0x9f, 0x40, 0x47, 0x6c, 0x94, 0x88, 0xef, 0x8e, 0x28, 0xbe, 0x22, 0x81, 0x6d, + 0x4a, 0x86, 0x87, 0x80, 0xf2, 0xce, 0x23, 0xcd, 0x33, 0x45, 0xe4, 0xd9, 0x2c, 0x59, 0xa4, 0x78, + 0x5a, 0x16, 0x85, 0xfd, 0xe7, 0x65, 0x40, 0x49, 0x04, 0x17, 0x1f, 0x92, 0x17, 0x09, 0x7b, 0x6e, + 0xc2, 0x52, 0x3e, 0xbe, 0x8b, 0x82, 0x5a, 0x94, 0x8b, 0xee, 0x64, 0x91, 0x58, 0x59, 0x76, 0x25, + 0xf5, 0xb5, 0xd8, 0xdd, 0xb3, 0x70, 0xf5, 0xea, 0xd4, 0xf3, 0x0c, 0xd1, 0xe3, 0xff, 0x30, 0x7b, + 0x95, 0x95, 0xf9, 0x8f, 0x3b, 0x52, 0xd7, 0x9c, 0x5b, 0xf2, 0xcc, 0x7b, 0xac, 0x42, 0x20, 0x5d, + 0x3b, 0x4b, 0x20, 0x3d, 0xff, 0xc5, 0xd3, 0x9f, 0x95, 0x60, 0x31, 0x66, 0xe4, 0x99, 0x84, 0x34, + 0xfb, 0x3e, 0xc3, 0x53, 0x96, 0xca, 0xc7, 0x72, 0xa9, 0x7c, 0xfb, 0xd4, 0x64, 0xa6, 0xa8, 0x50, + 0xe6, 0xe7, 0xec, 0x67, 0xb0, 0xc0, 0xcb, 0xd2, 0x39, 0x07, 0x57, 0xa4, 0x5c, 0xb0, 0x0c, 0x55, + 0xe2, 0x4f, 0xa3, 0x9a, 0x22, 0xfb, 0x60, 0x2c, 0x4d, 0x5f, 0x6c, 0xe6, 0x3e, 0xae, 0x2d, 0xdc, + 0x6b, 0xd6, 0x7e, 0xa7, 0x0c, 0xb0, 0x7b, 0xe2, 0x0e, 0xef, 0x32, 0x23, 0xbd, 0x05, 0x95, 0x59, + 0xd7, 0xe0, 0x48, 0x6f, 0xaa, 0x5b, 0xb4, 0x67, 0x01, 0xe1, 0x0a, 0x05, 0x91, 0x72, 0xb6, 0x20, + 0x32, 0xad, 0x94, 0x31, 0xdd, 0x05, 0x7f, 0x1b, 0x2a, 0xd4, 0x95, 0xb2, 0x5b, 0x62, 0x85, 0x4e, + 0x85, 0xe9, 0x00, 0xb4, 0x0a, 0xd1, 0x96, 0xbc, 0xe5, 0xb2, 0x3d, 0x97, 0xba, 0xe3, 0xb2, 0x9e, + 0x05, 0xa3, 0x17, 0xa0, 0xc3, 0x0a, 0x61, 0x71, 0x47, 0x96, 0xd3, 0x65, 0xa0, 0xf9, 0x1d, 0xbd, + 0x21, 0xd9, 0xd1, 0x09, 0x5e, 0xd3, 0xf7, 0xc6, 0xe3, 0xd4, 0x74, 0xac, 0x12, 0x92, 0x05, 0x6b, + 0x9f, 0x97, 0xe0, 0x12, 0xe1, 0xef, 0x93, 0x89, 0xca, 0x8b, 0x28, 0x4f, 0xca, 0x9f, 0x97, 0x45, + 0x7f, 0x7e, 0x07, 0x16, 0x58, 0xb9, 0x25, 0x8a, 0x2f, 0xaf, 0x4e, 0xd3, 0x06, 0xa6, 0x3b, 0x7a, + 0xd4, 0x7d, 0xde, 0x9c, 0x5d, 0x38, 0x33, 0xaf, 0xcd, 0x77, 0x66, 0xbe, 0x90, 0x2d, 0xca, 0xa6, + 0xd4, 0xaa, 0x2e, 0xee, 0x42, 0x0f, 0xa1, 0xad, 0xa7, 0x4d, 0x03, 0x21, 0xa8, 0xa4, 0x2e, 0xc6, + 0xd2, 0xdf, 0x34, 0xcd, 0x36, 0xc6, 0xc6, 0xd0, 0x0a, 0x4f, 0x28, 0x3b, 0xab, 0x7a, 0xfc, 0x2d, + 0xb7, 0x43, 0xed, 0x7f, 0x15, 0xb8, 0x18, 0x1d, 0xaa, 0x72, 0x2b, 0x3f, 0xbf, 0x44, 0xd7, 0x61, + 0x85, 0x9b, 0x74, 0xc6, 0xb6, 0x59, 0x30, 0xbd, 0xc4, 0x60, 0xe2, 0x32, 0xd6, 0x61, 0x25, 0xa4, + 0xda, 0x95, 0x1d, 0xc3, 0xe4, 0xbd, 0xc4, 0x1a, 0xc5, 0x31, 0x45, 0x0e, 0xb5, 0x9f, 0x61, 0x37, + 0xbd, 0x38, 0x6b, 0xb9, 0x91, 0x82, 0x3b, 0x71, 0xf8, 0x2a, 0xb5, 0x63, 0xb8, 0xcc, 0xae, 0xa6, + 0xef, 0x8b, 0x14, 0xcd, 0x75, 0xa6, 0x21, 0x5d, 0x77, 0xc6, 0xa7, 0xfd, 0x99, 0x02, 0x57, 0xa6, + 0x60, 0x9e, 0x27, 0x9b, 0x7b, 0x4f, 0x8a, 0x7d, 0x4a, 0xee, 0x2d, 0xe0, 0x65, 0x17, 0x16, 0x44, + 0x22, 0x3f, 0xaf, 0xc0, 0x62, 0xae, 0xd3, 0x99, 0x75, 0xee, 0x65, 0x40, 0x44, 0x08, 0xf1, 0x33, + 0x4c, 0x5a, 0xce, 0xe0, 0x9b, 0xa7, 0xea, 0x4e, 0x9c, 0xf8, 0x09, 0xe6, 0xb6, 0x67, 0x62, 0x64, + 0xb1, 0xde, 0xec, 0x44, 0x23, 0x96, 0x5c, 0x65, 0xfa, 0x6b, 0x9b, 0x1c, 0x81, 0x6b, 0xdb, 0x13, + 0x87, 0x1d, 0x7e, 0x70, 0x29, 0xb3, 0x0d, 0x91, 0xa0, 0x12, 0xc0, 0xe8, 0x00, 0x16, 0xe9, 0x3d, + 0xc0, 0x49, 0x38, 0xf2, 0x48, 0x42, 0x45, 0xe9, 0x62, 0xdb, 0xee, 0x77, 0x0b, 0x63, 0xfa, 0x80, + 0x8f, 0x26, 0xc4, 0xf3, 0x9c, 0xca, 0x15, 0xa1, 0x11, 0x1e, 0xcb, 0x1d, 0x7a, 0x4e, 0x8c, 0xa7, + 0x76, 0x46, 0x3c, 0x5b, 0x7c, 0xb4, 0x88, 0x27, 0x0d, 0xed, 0x6f, 0xc0, 0x8a, 0x74, 0xe9, 0xb3, + 0x36, 0xfa, 0x6a, 0x3a, 0xf3, 0xba, 0x07, 0xcb, 0xb2, 0x55, 0x9d, 0x63, 0x8e, 0x1c, 0xc5, 0x67, + 0x99, 0x43, 0xfb, 0xab, 0x12, 0xb4, 0x37, 0xb1, 0x8d, 0x43, 0xfc, 0x74, 0xcf, 0x9c, 0x73, 0x07, + 0xe8, 0xe5, 0xfc, 0x01, 0x7a, 0xee, 0x36, 0x40, 0x45, 0x72, 0x1b, 0xe0, 0x4a, 0x7c, 0x09, 0x82, + 0xcc, 0x52, 0x15, 0x63, 0x08, 0x13, 0xbd, 0x0e, 0xad, 0xb1, 0x6f, 0x39, 0x86, 0x7f, 0x32, 0x78, + 0x84, 0x4f, 0x02, 0xbe, 0x69, 0xf4, 0xa4, 0xdb, 0xce, 0xd6, 0x66, 0xa0, 0x37, 0x79, 0xef, 0x77, + 0xf1, 0x09, 0xbd, 0x60, 0x11, 0xa7, 0x71, 0xec, 0xe6, 0x5e, 0x45, 0x4f, 0x41, 0x6e, 0xbc, 0x04, + 0x8d, 0xf8, 0xe2, 0x12, 0xaa, 0x43, 0xe5, 0xfe, 0xc4, 0xb6, 0xd5, 0x0b, 0xa8, 0x01, 0x55, 0x9a, + 0xe8, 0xa9, 0x0a, 0xf9, 0x49, 0x63, 0x3f, 0xb5, 0x74, 0xe3, 0x57, 0xa0, 0x11, 0x5f, 0xa0, 0x40, + 0x4d, 0x58, 0x78, 0xe8, 0xbe, 0xeb, 0x7a, 0xc7, 0xae, 0x7a, 0x01, 0x2d, 0x40, 0xf9, 0xae, 0x6d, + 0xab, 0x0a, 0x6a, 0x43, 0x63, 0x37, 0xf4, 0xb1, 0x41, 0xc4, 0xa7, 0x96, 0x50, 0x07, 0xe0, 0x1d, + 0x2b, 0x08, 0x3d, 0xdf, 0x1a, 0x1a, 0xb6, 0x5a, 0xbe, 0xf1, 0x19, 0x74, 0xc4, 0x7a, 0x3a, 0x6a, + 0x41, 0x7d, 0xdb, 0x0b, 0xdf, 0xfe, 0xd4, 0x0a, 0x42, 0xf5, 0x02, 0xe9, 0xbf, 0xed, 0x85, 0x3b, + 0x3e, 0x0e, 0xb0, 0x1b, 0xaa, 0x0a, 0x02, 0xa8, 0x7d, 0xe0, 0x6e, 0x5a, 0xc1, 0x23, 0xb5, 0x84, + 0x96, 0xf8, 0x51, 0x99, 0x61, 0x6f, 0xf1, 0x22, 0xb5, 0x5a, 0x26, 0xc3, 0xe3, 0xaf, 0x0a, 0x52, + 0xa1, 0x15, 0x77, 0x79, 0xb0, 0xf3, 0x50, 0xad, 0x32, 0xea, 0xc9, 0xcf, 0xda, 0x0d, 0x13, 0xd4, + 0xec, 0x11, 0x2f, 0x99, 0x93, 0x2d, 0x22, 0x06, 0xa9, 0x17, 0xc8, 0xca, 0xf8, 0x19, 0xbb, 0xaa, + 0xa0, 0x2e, 0x34, 0x53, 0x27, 0xd6, 0x6a, 0x89, 0x00, 0x1e, 0xf8, 0xe3, 0x21, 0xd7, 0x2d, 0x46, + 0x02, 0x51, 0xd4, 0x4d, 0xc2, 0x89, 0xca, 0x8d, 0x7b, 0x50, 0x8f, 0xf2, 0x13, 0xd2, 0x95, 0xb3, + 0x88, 0x7c, 0xaa, 0x17, 0xd0, 0x22, 0xb4, 0x85, 0x27, 0x7e, 0xaa, 0x82, 0x10, 0x74, 0xc4, 0x47, + 0xb8, 0x6a, 0xe9, 0xc6, 0x3a, 0x40, 0x12, 0xe7, 0x13, 0x72, 0xb6, 0xdc, 0x23, 0xc3, 0xb6, 0x4c, + 0x46, 0x1b, 0x69, 0x22, 0xdc, 0xa5, 0xdc, 0x61, 0x36, 0xab, 0x96, 0x6e, 0xbc, 0x09, 0xf5, 0x28, + 0x76, 0x25, 0x70, 0x1d, 0x3b, 0xde, 0x11, 0x66, 0x92, 0xd9, 0xc5, 0x21, 0x93, 0xe3, 0x5d, 0x07, + 0xbb, 0xa6, 0x5a, 0x22, 0x64, 0x3c, 0x1c, 0x9b, 0x46, 0x18, 0x5d, 0x67, 0x55, 0xcb, 0xeb, 0xff, + 0xb5, 0x04, 0xc0, 0xce, 0x6c, 0x3d, 0xcf, 0x37, 0x91, 0x4d, 0xef, 0x6e, 0x6c, 0x78, 0xce, 0xd8, + 0x73, 0xa3, 0x03, 0xa5, 0x00, 0xad, 0x65, 0x4a, 0x24, 0xec, 0x23, 0xdf, 0x91, 0xf3, 0xa6, 0xff, + 0x9c, 0xb4, 0x7f, 0xa6, 0xb3, 0x76, 0x01, 0x39, 0x14, 0xdb, 0x9e, 0xe5, 0xe0, 0x3d, 0x6b, 0xf8, + 0x28, 0x3e, 0xe8, 0x9d, 0xfe, 0x38, 0x36, 0xd3, 0x35, 0xc2, 0x77, 0x5d, 0x8a, 0x6f, 0x37, 0xf4, + 0x2d, 0x77, 0x14, 0xed, 0x8e, 0xda, 0x05, 0xf4, 0x38, 0xf3, 0x34, 0x37, 0x42, 0xb8, 0x5e, 0xe4, + 0x35, 0xee, 0xf9, 0x50, 0xda, 0xd0, 0xcd, 0xfc, 0x07, 0x02, 0xba, 0x21, 0x7f, 0xe3, 0x24, 0xfb, + 0xbf, 0x86, 0xfe, 0x4b, 0x85, 0xfa, 0xc6, 0xd8, 0x2c, 0xe8, 0x88, 0x8f, 0xf7, 0xd1, 0x37, 0xa6, + 0x4d, 0x90, 0x7b, 0x65, 0xd9, 0xbf, 0x51, 0xa4, 0x6b, 0x8c, 0xea, 0x23, 0xa6, 0xbe, 0xb3, 0x50, + 0x49, 0x1f, 0xb6, 0xf6, 0x4f, 0x0b, 0x4c, 0xb4, 0x0b, 0xe8, 0x13, 0x12, 0x43, 0x64, 0xde, 0x82, + 0xa2, 0x97, 0xe5, 0xfb, 0x9e, 0xfc, 0xc9, 0xe8, 0x2c, 0x0c, 0x1f, 0x65, 0x8d, 0x6f, 0x3a, 0xf5, + 0xb9, 0x47, 0xe6, 0xc5, 0xa9, 0x4f, 0x4d, 0x7f, 0x1a, 0xf5, 0x67, 0xc6, 0x60, 0xb3, 0x74, 0x4a, + 0xf2, 0x0a, 0x2d, 0xab, 0xca, 0x49, 0x36, 0x33, 0xfd, 0xc9, 0xda, 0x2c, 0x6c, 0x13, 0x6a, 0xa4, + 0xd9, 0xcb, 0x0a, 0xaf, 0x4c, 0x39, 0x06, 0x91, 0x3f, 0x7f, 0xed, 0xaf, 0x15, 0xed, 0x9e, 0xd6, + 0x65, 0xf1, 0x85, 0xa5, 0x5c, 0x44, 0xd2, 0x57, 0xa1, 0x72, 0x5d, 0x96, 0x3f, 0xd8, 0xd4, 0x2e, + 0xa0, 0x3d, 0xc1, 0xd5, 0xa3, 0x17, 0xa6, 0xa9, 0x82, 0x78, 0x7b, 0x69, 0x16, 0xdf, 0x7e, 0x1d, + 0x10, 0xb3, 0x54, 0xf7, 0xc0, 0x1a, 0x4d, 0x7c, 0x83, 0xa9, 0xf1, 0x34, 0xe7, 0x96, 0xef, 0x1a, + 0xa1, 0xf9, 0xe6, 0x19, 0x46, 0xc4, 0x4b, 0x1a, 0x00, 0x3c, 0xc0, 0xe1, 0xfb, 0xf4, 0xa9, 0x5d, + 0x90, 0x5d, 0x51, 0xe2, 0xbf, 0x79, 0x87, 0x08, 0xd5, 0x8b, 0x33, 0xfb, 0xc5, 0x08, 0xf6, 0xa1, + 0xf9, 0x80, 0xe4, 0x57, 0x34, 0x66, 0x0c, 0xd0, 0xd4, 0x91, 0x51, 0x8f, 0x08, 0xc5, 0xea, 0xec, + 0x8e, 0x69, 0xe7, 0x99, 0x79, 0x6d, 0x8a, 0xa6, 0x0a, 0x36, 0xff, 0x06, 0x56, 0xee, 0x3c, 0xa7, + 0x3c, 0x5f, 0x65, 0x2b, 0xa2, 0x47, 0x71, 0xef, 0x60, 0xc3, 0x0e, 0x0f, 0xa7, 0xac, 0x28, 0xd5, + 0xe3, 0xf4, 0x15, 0x09, 0x1d, 0x63, 0x1c, 0x18, 0x96, 0x98, 0x15, 0x8a, 0x89, 0xe9, 0x4d, 0xf9, + 0x14, 0xf9, 0x9e, 0x05, 0x55, 0xcf, 0x80, 0xc5, 0x4d, 0xdf, 0x1b, 0x8b, 0x48, 0x5e, 0x91, 0x22, + 0xc9, 0xf5, 0x2b, 0x88, 0xe2, 0xfb, 0xd0, 0x8a, 0xf2, 0x7f, 0x9a, 0xb1, 0xc8, 0xb9, 0x90, 0xee, + 0x52, 0x70, 0xe2, 0x8f, 0xa1, 0x9b, 0x29, 0x2c, 0xc8, 0x85, 0x2e, 0xaf, 0x3e, 0xcc, 0x9a, 0xfd, + 0x18, 0x10, 0x7d, 0x42, 0x2c, 0xfe, 0x0b, 0x82, 0x3c, 0xbe, 0xc9, 0x77, 0x8c, 0x90, 0xdc, 0x2c, + 0xdc, 0x3f, 0x96, 0xfc, 0x6f, 0xc0, 0x8a, 0x34, 0x79, 0xcf, 0x3a, 0x04, 0x7e, 0x5d, 0xf9, 0x94, + 0x0a, 0x43, 0xd6, 0x21, 0x9c, 0x3a, 0x22, 0xc2, 0xbf, 0xfe, 0x1f, 0x08, 0x1a, 0x34, 0xce, 0xa3, + 0xd2, 0xfa, 0x65, 0x98, 0xf7, 0x64, 0xc3, 0xbc, 0x8f, 0xa1, 0x9b, 0x79, 0xda, 0x2a, 0x57, 0x5a, + 0xf9, 0xfb, 0xd7, 0x02, 0xd1, 0x8a, 0xf8, 0x2a, 0x54, 0xbe, 0x15, 0x4a, 0x5f, 0x8e, 0xce, 0x9a, + 0xfb, 0x43, 0xf6, 0x6c, 0x3c, 0x3e, 0xcd, 0x7d, 0x71, 0xea, 0xe1, 0x83, 0x78, 0xed, 0xf8, 0x8b, + 0x8f, 0x82, 0xbe, 0xda, 0x11, 0xe8, 0xc7, 0xd0, 0xcd, 0x3c, 0xec, 0x91, 0x6b, 0x8c, 0xfc, 0xf5, + 0xcf, 0xac, 0xd9, 0x7f, 0x81, 0xc1, 0x93, 0x09, 0x4b, 0x92, 0x77, 0x14, 0x68, 0x6d, 0x5a, 0x20, + 0x2a, 0x7f, 0x70, 0x31, 0x7b, 0x41, 0x6d, 0xc1, 0x4c, 0xb3, 0xfb, 0x4d, 0x42, 0x64, 0xf6, 0xef, + 0x93, 0xfa, 0x2f, 0x17, 0xfb, 0xaf, 0xa5, 0x78, 0x41, 0xbb, 0x50, 0x63, 0xcf, 0x7d, 0xd0, 0xb3, + 0xf2, 0x43, 0x98, 0xd4, 0x53, 0xa0, 0xfe, 0xac, 0x07, 0x43, 0xc1, 0xc4, 0x0e, 0x09, 0xfd, 0x3f, + 0x80, 0x0e, 0x03, 0xc5, 0x0c, 0x7a, 0x82, 0x93, 0xef, 0x42, 0x95, 0xba, 0x76, 0x24, 0x3d, 0x50, + 0x48, 0x3f, 0xea, 0xe9, 0xcf, 0x7e, 0xc7, 0x93, 0x50, 0xdc, 0xa4, 0x23, 0x59, 0x55, 0xe7, 0x49, + 0x4e, 0x7d, 0x4b, 0x41, 0x3f, 0x80, 0x36, 0x9b, 0x3c, 0xe2, 0xc6, 0x93, 0xa4, 0x7c, 0x08, 0x4b, + 0x29, 0xca, 0x9f, 0x06, 0x8a, 0x5b, 0xca, 0xff, 0xf3, 0xe8, 0xfe, 0x53, 0xfa, 0xa8, 0x26, 0x7b, + 0x6d, 0x0c, 0xad, 0x9d, 0xed, 0xee, 0x5b, 0xff, 0x66, 0xe1, 0xfe, 0x31, 0xe6, 0x1f, 0x81, 0x9a, + 0x3d, 0x2a, 0x44, 0x2f, 0x4d, 0xf3, 0x25, 0x32, 0x9c, 0x33, 0x1c, 0xc9, 0xf7, 0xa0, 0xc6, 0x6a, + 0xc4, 0x72, 0x03, 0x14, 0xea, 0xc7, 0x33, 0xe6, 0xba, 0xf7, 0xad, 0x8f, 0xd6, 0x47, 0x56, 0x78, + 0x38, 0xd9, 0x27, 0x2d, 0x37, 0x59, 0xd7, 0x57, 0x2c, 0x8f, 0xff, 0xba, 0x19, 0xc9, 0xf2, 0x26, + 0x1d, 0x7d, 0x93, 0x22, 0x18, 0xef, 0xef, 0xd7, 0xe8, 0xe7, 0xed, 0xff, 0x0b, 0x00, 0x00, 0xff, + 0xff, 0xf9, 0x7b, 0x39, 0xe5, 0x38, 0x54, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/internal/querycoordv2/meta/coordinator_broker.go b/internal/querycoordv2/meta/coordinator_broker.go index 43315d4cee765..eebdfc817bb67 100644 --- a/internal/querycoordv2/meta/coordinator_broker.go +++ b/internal/querycoordv2/meta/coordinator_broker.go @@ -226,17 +226,18 @@ 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(), - IndexEngineVersion: info.GetIndexEngineVersion(), + 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(), + CurrentIndexVersion: info.GetCurrentIndexVersion(), + MinimalIndexVersion: info.GetMinimalIndexVersion(), }) } diff --git a/internal/querynodev2/segments/load_index_info.go b/internal/querynodev2/segments/load_index_info.go index e93312a4e14df..125203d86bb2e 100644 --- a/internal/querynodev2/segments/load_index_info.go +++ b/internal/querynodev2/segments/load_index_info.go @@ -87,7 +87,7 @@ func (li *LoadIndexInfo) appendLoadIndexInfo(indexInfo *querypb.FieldIndexInfo, } } - if err := li.appendIndexEngineVersion(indexInfo.GetIndexEngineVersion()); err != nil { + if err := li.appendIndexEngineVersion(indexInfo.GetCurrentIndexVersion()); err != nil { return err } @@ -153,9 +153,8 @@ func (li *LoadIndexInfo) appendIndexData(indexKeys []string) error { return HandleCStatus(&status, "AppendIndex failed") } -func (li *LoadIndexInfo) appendIndexEngineVersion(indexEngineVersion string) error { - cIndexEngineVersion := C.CString(indexEngineVersion) - defer C.free(unsafe.Pointer(cIndexEngineVersion)) +func (li *LoadIndexInfo) appendIndexEngineVersion(indexEngineVersion int32) error { + cIndexEngineVersion := C.int32_t(indexEngineVersion) 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 ed1e64c74f695..cc6f7aa87efd0 100644 --- a/internal/querynodev2/segments/segment_loader.go +++ b/internal/querynodev2/segments/segment_loader.go @@ -673,7 +673,8 @@ 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()), + zap.Int32("current_index_version", fieldInfo.IndexInfo.GetCurrentIndexVersion()), + zap.Int32("minimal_index_version", fieldInfo.IndexInfo.GetMinimalIndexVersion()), ) segment.AddIndex(fieldID, fieldInfo) diff --git a/internal/querynodev2/server.go b/internal/querynodev2/server.go index e4e355c4530fa..2f139366615ad 100644 --- a/internal/querynodev2/server.go +++ b/internal/querynodev2/server.go @@ -145,7 +145,12 @@ func NewQueryNode(ctx context.Context, factory dependency.Factory) *QueryNode { } func (node *QueryNode) initSession() error { - node.session = sessionutil.NewSession(node.ctx, paramtable.Get().EtcdCfg.MetaRootPath.GetValue(), node.etcdCli) + minimalIndexVersion, currentIndexVersion := getIndexEngineVersion() + node.session = sessionutil.NewSession(node.ctx, + paramtable.Get().EtcdCfg.MetaRootPath.GetValue(), + node.etcdCli, + sessionutil.WithIndexEngineVersion(minimalIndexVersion, currentIndexVersion), + ) if node.session == nil { return fmt.Errorf("session is nil, the etcd client connection may have failed") } @@ -241,6 +246,11 @@ func (node *QueryNode) InitSegcore() error { return nil } +func getIndexEngineVersion() (minimal, current int32) { + cMinimal, cCurrent := C.GetMinimalIndexVersion(), C.GetCurrentIndexVersion() + return int32(cMinimal), int32(cCurrent) +} + func (node *QueryNode) CloseSegcore() { // safe stop initcore.CleanRemoteChunkManager() diff --git a/internal/util/indexcgowrapper/build_index_info.go b/internal/util/indexcgowrapper/build_index_info.go index 9a3f4b78ea027..31014face3288 100644 --- a/internal/util/indexcgowrapper/build_index_info.go +++ b/internal/util/indexcgowrapper/build_index_info.go @@ -151,9 +151,8 @@ func (bi *BuildIndexInfo) AppendInsertFile(filePath string) error { return HandleCStatus(&status, "appendInsertFile failed") } -func (bi *BuildIndexInfo) AppendIndexEngineVersion(indexEngineVersion string) error { - cIndexEngineVersion := C.CString(indexEngineVersion) - defer C.free(unsafe.Pointer(cIndexEngineVersion)) +func (bi *BuildIndexInfo) AppendIndexEngineVersion(indexEngineVersion int32) error { + cIndexEngineVersion := C.int32_t(indexEngineVersion) status := C.AppendIndexEngineVersionToBuildInfo(bi.cBuildIndexInfo, cIndexEngineVersion) return HandleCStatus(&status, "AppendIndexEngineVersion failed") diff --git a/internal/util/sessionutil/session_util.go b/internal/util/sessionutil/session_util.go index b73fa3be721a6..9d83aaa1a954a 100644 --- a/internal/util/sessionutil/session_util.go +++ b/internal/util/sessionutil/session_util.go @@ -78,6 +78,11 @@ const ( SessionUpdateEvent ) +type IndexEngineVersion struct { + MinimalIndexVersion int32 `json:"MinimalIndexVersion,omitempty"` + CurrentIndexVersion int32 `json:"CurrentIndexVersion,omitempty"` +} + // Session is a struct to store service's session, including ServerID, ServerName, // Address. // Exclusive indicates that this server can only start one. @@ -89,13 +94,14 @@ type Session struct { keepAliveCancel context.CancelFunc keepAliveCtx context.Context - ServerID int64 `json:"ServerID,omitempty"` - ServerName string `json:"ServerName,omitempty"` - Address string `json:"Address,omitempty"` - Exclusive bool `json:"Exclusive,omitempty"` - Stopping bool `json:"Stopping,omitempty"` - TriggerKill bool - Version semver.Version `json:"Version,omitempty"` + ServerID int64 `json:"ServerID,omitempty"` + ServerName string `json:"ServerName,omitempty"` + Address string `json:"Address,omitempty"` + Exclusive bool `json:"Exclusive,omitempty"` + Stopping bool `json:"Stopping,omitempty"` + TriggerKill bool + Version semver.Version `json:"Version,omitempty"` + IndexEngineVersion IndexEngineVersion `json:"IndexEngineVersion,omitempty"` liveChOnce sync.Once liveCh chan struct{} @@ -134,6 +140,14 @@ func WithResueNodeID(b bool) SessionOption { return func(session *Session) { session.reuseNodeID = b } } +// WithIndexEngineVersion should be only used by querynode. +func WithIndexEngineVersion(minimal, current int32) SessionOption { + return func(session *Session) { + session.IndexEngineVersion.MinimalIndexVersion = minimal + session.IndexEngineVersion.CurrentIndexVersion = current + } +} + func (s *Session) apply(opts ...SessionOption) { for _, opt := range opts { opt(s) @@ -143,14 +157,15 @@ func (s *Session) apply(opts ...SessionOption) { // UnmarshalJSON unmarshal bytes to Session. func (s *Session) UnmarshalJSON(data []byte) error { var raw struct { - ServerID int64 `json:"ServerID,omitempty"` - ServerName string `json:"ServerName,omitempty"` - Address string `json:"Address,omitempty"` - Exclusive bool `json:"Exclusive,omitempty"` - Stopping bool `json:"Stopping,omitempty"` - TriggerKill bool - Version string `json:"Version"` - LeaseID *clientv3.LeaseID `json:"LeaseID,omitempty"` + ServerID int64 `json:"ServerID,omitempty"` + ServerName string `json:"ServerName,omitempty"` + Address string `json:"Address,omitempty"` + Exclusive bool `json:"Exclusive,omitempty"` + Stopping bool `json:"Stopping,omitempty"` + TriggerKill bool + Version string `json:"Version"` + IndexEngineVersion string `json:"IndexEngineVersion,omitempty"` + LeaseID *clientv3.LeaseID `json:"LeaseID,omitempty"` } err := json.Unmarshal(data, &raw) if err != nil { @@ -164,6 +179,17 @@ func (s *Session) UnmarshalJSON(data []byte) error { } } + if raw.IndexEngineVersion != "" { + json.Unmarshal([]byte(raw.IndexEngineVersion), &s.IndexEngineVersion) + if err != nil { + return err + } + } else { + // set zero when queryNode not register knowhere version + s.IndexEngineVersion.MinimalIndexVersion = 0 + s.IndexEngineVersion.CurrentIndexVersion = 0 + } + s.ServerID = raw.ServerID s.ServerName = raw.ServerName s.Address = raw.Address @@ -177,24 +203,30 @@ func (s *Session) UnmarshalJSON(data []byte) error { // MarshalJSON marshals session to bytes. func (s *Session) MarshalJSON() ([]byte, error) { verStr := s.Version.String() + indexVerStr, err := json.Marshal(s.IndexEngineVersion) + if err != nil { + return nil, err + } return json.Marshal(&struct { - ServerID int64 `json:"ServerID,omitempty"` - ServerName string `json:"ServerName,omitempty"` - Address string `json:"Address,omitempty"` - Exclusive bool `json:"Exclusive,omitempty"` - Stopping bool `json:"Stopping,omitempty"` - TriggerKill bool - Version string `json:"Version"` - LeaseID *clientv3.LeaseID `json:"LeaseID,omitempty"` + ServerID int64 `json:"ServerID,omitempty"` + ServerName string `json:"ServerName,omitempty"` + Address string `json:"Address,omitempty"` + Exclusive bool `json:"Exclusive,omitempty"` + Stopping bool `json:"Stopping,omitempty"` + TriggerKill bool + Version string `json:"Version"` + IndexEngineVersion string `json:"IndexEngineVersion,omitempty"` + LeaseID *clientv3.LeaseID `json:"LeaseID,omitempty"` }{ - ServerID: s.ServerID, - ServerName: s.ServerName, - Address: s.Address, - Exclusive: s.Exclusive, - Stopping: s.Stopping, - TriggerKill: s.TriggerKill, - Version: verStr, - LeaseID: s.leaseID, + ServerID: s.ServerID, + ServerName: s.ServerName, + Address: s.Address, + Exclusive: s.Exclusive, + Stopping: s.Stopping, + TriggerKill: s.TriggerKill, + Version: verStr, + IndexEngineVersion: string(indexVerStr), + LeaseID: s.leaseID, }) } diff --git a/pkg/util/paramtable/component_param.go b/pkg/util/paramtable/component_param.go index be89fdbf86edb..278637fba9c4a 100644 --- a/pkg/util/paramtable/component_param.go +++ b/pkg/util/paramtable/component_param.go @@ -216,8 +216,6 @@ 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) { @@ -614,15 +612,6 @@ 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/tests/scripts/values/cardinal.yaml b/tests/scripts/values/cardinal.yaml deleted file mode 100644 index 37068dd8920ef..0000000000000 --- a/tests/scripts/values/cardinal.yaml +++ /dev/null @@ -1,4 +0,0 @@ -extraConfigFiles: - user.yaml: |+ - common: - indexEngineVersion: "cardinal-v0"