From 97a3ab12a2f82017c92411f7c02e6cda7dbeb14f Mon Sep 17 00:00:00 2001 From: Qiu Jian Date: Wed, 27 Oct 2021 10:47:28 +0800 Subject: [PATCH] support sqlite --- cmd/climc/shell/misc/version.go | 33 +- go.mod | 4 +- go.sum | 9 +- pkg/ansibleserver/service/service.go | 8 +- pkg/appsrv/workers.go | 4 + pkg/cloudcommon/database.go | 7 +- pkg/cloudcommon/db/db_dispatcher.go | 2 +- pkg/cloudcommon/db/i18n.go | 27 +- pkg/cloudcommon/db/models.go | 4 +- pkg/cloudcommon/db/opslog.go | 15 +- pkg/cloudcommon/db/resourcebase_test.go | 2 + pkg/cloudcommon/db/taskman/tasks.go | 5 +- pkg/cloudcommon/options/options.go | 2 +- pkg/cloudevent/service/service.go | 6 +- pkg/cloudid/service/service.go | 6 +- pkg/cloudnet/service/service.go | 8 +- pkg/cloudproxy/service/service.go | 7 +- pkg/compute/models/billingresource.go | 2 +- pkg/compute/models/cloudaccounts.go | 14 +- pkg/compute/models/cloudregions.go | 2 +- pkg/compute/models/purge.go | 18 +- pkg/compute/service/service.go | 8 +- pkg/devtool/service/service.go | 6 +- pkg/image/service/service.go | 8 +- pkg/keystone/models/domains.go | 1 + pkg/keystone/service/service.go | 5 +- pkg/logger/service/service.go | 8 +- pkg/mcclient/modulebase/stats.go | 39 + pkg/monitor/service/service.go | 7 +- pkg/notify/service/service.go | 8 +- pkg/scheduledtask/models/scheduled_tasks.go | 2 +- pkg/scheduledtask/service/service.go | 5 +- pkg/util/splitable/insert.go | 2 +- pkg/util/splitable/splitable.go | 10 +- pkg/util/splitable/sync.go | 2 +- .../clickhouse-go/bootstrap_test.go | 96 - .../clickhouse-go/clickhouse_columnar_test.go | 261 - .../clickhouse-go/clickhouse_compress_test.go | 154 - .../clickhouse_custom_types_test.go | 221 - .../clickhouse_decimal128_test.go | 223 - .../clickhouse-go/clickhouse_decimal_test.go | 97 - .../clickhouse-go/clickhouse_direct_test.go | 260 - .../clickhouse-go/clickhouse_naive_test.go | 27 - .../clickhouse-go/clickhouse_negative_test.go | 39 - .../clickhouse_nullable_array_test.go | 262 - .../clickhouse-go/clickhouse_nullable_test.go | 316 - .../clickhouse-go/clickhouse_test.go | 2231 --- .../clickhouse-go/examples/columnar.go | 120 - .../clickhouse-go/examples/direct.go | 64 - .../clickhouse-go/examples/external_data.go | 90 - .../clickhouse-go/examples/multiple.go | 72 - .../clickhouse-go/examples/simple.go | 76 - .../ClickHouse/clickhouse-go/examples/sqlx.go | 78 - .../ClickHouse/clickhouse-go/go.test.sh | 0 .../ClickHouse/clickhouse-go/helpers_test.go | 65 - .../ClickHouse/clickhouse-go/issues_test.go | 268 - .../lib/binary/binary_benchmark_test.go | 129 - .../clickhouse-go/lib/binary/binary_test.go | 463 - .../clickhouse-go/lib/binary/compress_test.go | 107 - .../lib/cityhash102/cityhash_test.go | 65 - .../lib/cityhash102/testdata/cityhash.cpp | 365 - .../lib/cityhash102/testdata/hashs.txt | 1000 -- .../lib/codegen/nullable_appender/main.go | 81 - .../lib/column/column_benchmark_test.go | 282 - .../clickhouse-go/lib/column/column_test.go | 746 - .../clickhouse-go/lib/column/decimal_test.go | 350 - .../clickhouse-go/lib/column/ip_test.go | 133 - .../clickhouse-go/lib/column/uuid_test.go | 80 - .../clickhouse-go/lib/lz4/lz4_test.go | 69 - .../clickhouse-go/lib/lz4/testdata/pg1661.txt | 13052 ---------------- .../clickhouse-go/lib/types/uuid_test.go | 37 - .../clickhouse-go/word_matcher_test.go | 39 - vendor/github.com/cloudflare/golz4/.gitignore | 22 + vendor/github.com/cloudflare/golz4/LICENSE | 27 + vendor/github.com/cloudflare/golz4/Makefile | 14 + vendor/github.com/cloudflare/golz4/README.md | 4 + vendor/github.com/cloudflare/golz4/doc.go | 4 + vendor/github.com/cloudflare/golz4/lz4.go | 55 + vendor/github.com/cloudflare/golz4/lz4_hc.go | 38 + vendor/github.com/cloudflare/golz4/sample.txt | 143 + vendor/modules.txt | 19 +- .../yunion.io/x/pkg/util/regutils/regutils.go | 18 + .../x/pkg/util/timeutils/timeutils.go | 22 + .../yunion.io/x/sqlchemy/.circleci/config.yml | 22 - .../.github/ISSUE_TEMPLATE/bug_report.md | 21 - .../.github/ISSUE_TEMPLATE/feature_request.md | 14 - .../.github/ISSUE_TEMPLATE/support-request.md | 10 - .../sqlchemy/.github/pull_request_template.md | 1 - .../x/sqlchemy/.github/workflows/codecov.yml | 41 - vendor/yunion.io/x/sqlchemy/README.md | 41 +- vendor/yunion.io/x/sqlchemy/backends.go | 22 +- .../backends/clickhouse/clickhouse.go | 184 +- .../x/sqlchemy/backends/clickhouse/column.go | 646 + .../backends/clickhouse/columninfo.go | 168 + .../x/sqlchemy/backends/clickhouse/consts.go | 23 + .../x/sqlchemy/backends/clickhouse/doc.go | 15 + .../{constraint_test.go => backends/doc.go} | 2 +- .../yunion.io/x/sqlchemy/backends/loader.go | 14 + .../x/sqlchemy/backends/mysql/column.go | 631 + .../x/sqlchemy/backends/mysql/columninfo.go | 39 +- .../backends/mysql/columninfo_test.go | 152 - .../x/sqlchemy/backends/mysql/const.go | 45 + .../x/sqlchemy/backends/mysql/doc.go | 15 + .../x/sqlchemy/backends/mysql/errors.go | 30 + .../x/sqlchemy/backends/mysql/mysql.go | 158 +- .../x/sqlchemy/backends/mysql/parse.go | 62 + .../x/sqlchemy/backends/sqlite/column.go | 506 + .../x/sqlchemy/backends/sqlite/columninfo.go | 71 + .../x/sqlchemy/backends/sqlite/doc.go | 15 + .../x/sqlchemy/backends/sqlite/parse.go | 45 + .../x/sqlchemy/backends/sqlite/sqlite.go | 149 +- vendor/yunion.io/x/sqlchemy/backends_base.go | 8 + vendor/yunion.io/x/sqlchemy/backends_mock.go | 150 + vendor/yunion.io/x/sqlchemy/case.go | 2 +- vendor/yunion.io/x/sqlchemy/column.go | 14 +- vendor/yunion.io/x/sqlchemy/column_test.go | 8 - .../yunion.io/x/sqlchemy/conditions_test.go | 71 - vendor/yunion.io/x/sqlchemy/constraint.go | 1 - vendor/yunion.io/x/sqlchemy/debug.go | 7 +- vendor/yunion.io/x/sqlchemy/fetch.go | 2 +- vendor/yunion.io/x/sqlchemy/field_update.go | 97 +- vendor/yunion.io/x/sqlchemy/functions.go | 11 +- vendor/yunion.io/x/sqlchemy/inc.go | 74 +- vendor/yunion.io/x/sqlchemy/index.go | 13 +- vendor/yunion.io/x/sqlchemy/insert.go | 125 +- vendor/yunion.io/x/sqlchemy/insert_test.go | 80 - vendor/yunion.io/x/sqlchemy/locales/doc.go | 1 - .../yunion.io/x/sqlchemy/locales/locales.go | 80 - .../locales/zh-CN/messages.gotext.json | 65 - vendor/yunion.io/x/sqlchemy/main_test.go | 30 - vendor/yunion.io/x/sqlchemy/parser.go | 2 +- vendor/yunion.io/x/sqlchemy/query_test.go | 58 - vendor/yunion.io/x/sqlchemy/rawquery.go | 3 - vendor/yunion.io/x/sqlchemy/reflect_test.go | 117 - vendor/yunion.io/x/sqlchemy/sql.go | 48 +- vendor/yunion.io/x/sqlchemy/sqltest/main.go | 267 - vendor/yunion.io/x/sqlchemy/sync.go | 6 +- vendor/yunion.io/x/sqlchemy/table.go | 49 +- vendor/yunion.io/x/sqlchemy/template_test.go | 54 - vendor/yunion.io/x/sqlchemy/update.go | 82 +- 140 files changed, 3926 insertions(+), 23421 deletions(-) create mode 100644 pkg/mcclient/modulebase/stats.go delete mode 100644 vendor/github.com/ClickHouse/clickhouse-go/bootstrap_test.go delete mode 100644 vendor/github.com/ClickHouse/clickhouse-go/clickhouse_columnar_test.go delete mode 100644 vendor/github.com/ClickHouse/clickhouse-go/clickhouse_compress_test.go delete mode 100644 vendor/github.com/ClickHouse/clickhouse-go/clickhouse_custom_types_test.go delete mode 100644 vendor/github.com/ClickHouse/clickhouse-go/clickhouse_decimal128_test.go delete mode 100644 vendor/github.com/ClickHouse/clickhouse-go/clickhouse_decimal_test.go delete mode 100644 vendor/github.com/ClickHouse/clickhouse-go/clickhouse_direct_test.go delete mode 100644 vendor/github.com/ClickHouse/clickhouse-go/clickhouse_naive_test.go delete mode 100644 vendor/github.com/ClickHouse/clickhouse-go/clickhouse_negative_test.go delete mode 100644 vendor/github.com/ClickHouse/clickhouse-go/clickhouse_nullable_array_test.go delete mode 100644 vendor/github.com/ClickHouse/clickhouse-go/clickhouse_nullable_test.go delete mode 100644 vendor/github.com/ClickHouse/clickhouse-go/clickhouse_test.go delete mode 100644 vendor/github.com/ClickHouse/clickhouse-go/examples/columnar.go delete mode 100644 vendor/github.com/ClickHouse/clickhouse-go/examples/direct.go delete mode 100644 vendor/github.com/ClickHouse/clickhouse-go/examples/external_data.go delete mode 100644 vendor/github.com/ClickHouse/clickhouse-go/examples/multiple.go delete mode 100644 vendor/github.com/ClickHouse/clickhouse-go/examples/simple.go delete mode 100644 vendor/github.com/ClickHouse/clickhouse-go/examples/sqlx.go mode change 100755 => 100644 vendor/github.com/ClickHouse/clickhouse-go/go.test.sh delete mode 100644 vendor/github.com/ClickHouse/clickhouse-go/helpers_test.go delete mode 100644 vendor/github.com/ClickHouse/clickhouse-go/issues_test.go delete mode 100644 vendor/github.com/ClickHouse/clickhouse-go/lib/binary/binary_benchmark_test.go delete mode 100644 vendor/github.com/ClickHouse/clickhouse-go/lib/binary/binary_test.go delete mode 100644 vendor/github.com/ClickHouse/clickhouse-go/lib/binary/compress_test.go delete mode 100644 vendor/github.com/ClickHouse/clickhouse-go/lib/cityhash102/cityhash_test.go delete mode 100644 vendor/github.com/ClickHouse/clickhouse-go/lib/cityhash102/testdata/cityhash.cpp delete mode 100644 vendor/github.com/ClickHouse/clickhouse-go/lib/cityhash102/testdata/hashs.txt delete mode 100644 vendor/github.com/ClickHouse/clickhouse-go/lib/codegen/nullable_appender/main.go delete mode 100644 vendor/github.com/ClickHouse/clickhouse-go/lib/column/column_benchmark_test.go delete mode 100644 vendor/github.com/ClickHouse/clickhouse-go/lib/column/column_test.go delete mode 100644 vendor/github.com/ClickHouse/clickhouse-go/lib/column/decimal_test.go delete mode 100644 vendor/github.com/ClickHouse/clickhouse-go/lib/column/ip_test.go delete mode 100644 vendor/github.com/ClickHouse/clickhouse-go/lib/column/uuid_test.go delete mode 100644 vendor/github.com/ClickHouse/clickhouse-go/lib/lz4/lz4_test.go delete mode 100644 vendor/github.com/ClickHouse/clickhouse-go/lib/lz4/testdata/pg1661.txt delete mode 100644 vendor/github.com/ClickHouse/clickhouse-go/lib/types/uuid_test.go delete mode 100644 vendor/github.com/ClickHouse/clickhouse-go/word_matcher_test.go create mode 100644 vendor/github.com/cloudflare/golz4/.gitignore create mode 100644 vendor/github.com/cloudflare/golz4/LICENSE create mode 100644 vendor/github.com/cloudflare/golz4/Makefile create mode 100644 vendor/github.com/cloudflare/golz4/README.md create mode 100644 vendor/github.com/cloudflare/golz4/doc.go create mode 100644 vendor/github.com/cloudflare/golz4/lz4.go create mode 100644 vendor/github.com/cloudflare/golz4/lz4_hc.go create mode 100644 vendor/github.com/cloudflare/golz4/sample.txt delete mode 100644 vendor/yunion.io/x/sqlchemy/.circleci/config.yml delete mode 100644 vendor/yunion.io/x/sqlchemy/.github/ISSUE_TEMPLATE/bug_report.md delete mode 100644 vendor/yunion.io/x/sqlchemy/.github/ISSUE_TEMPLATE/feature_request.md delete mode 100644 vendor/yunion.io/x/sqlchemy/.github/ISSUE_TEMPLATE/support-request.md delete mode 100644 vendor/yunion.io/x/sqlchemy/.github/pull_request_template.md delete mode 100644 vendor/yunion.io/x/sqlchemy/.github/workflows/codecov.yml create mode 100644 vendor/yunion.io/x/sqlchemy/backends/clickhouse/column.go create mode 100644 vendor/yunion.io/x/sqlchemy/backends/clickhouse/columninfo.go create mode 100644 vendor/yunion.io/x/sqlchemy/backends/clickhouse/consts.go create mode 100644 vendor/yunion.io/x/sqlchemy/backends/clickhouse/doc.go rename vendor/yunion.io/x/sqlchemy/{constraint_test.go => backends/doc.go} (90%) create mode 100644 vendor/yunion.io/x/sqlchemy/backends/mysql/column.go delete mode 100644 vendor/yunion.io/x/sqlchemy/backends/mysql/columninfo_test.go create mode 100644 vendor/yunion.io/x/sqlchemy/backends/mysql/const.go create mode 100644 vendor/yunion.io/x/sqlchemy/backends/mysql/doc.go create mode 100644 vendor/yunion.io/x/sqlchemy/backends/mysql/errors.go create mode 100644 vendor/yunion.io/x/sqlchemy/backends/mysql/parse.go create mode 100644 vendor/yunion.io/x/sqlchemy/backends/sqlite/column.go create mode 100644 vendor/yunion.io/x/sqlchemy/backends/sqlite/columninfo.go create mode 100644 vendor/yunion.io/x/sqlchemy/backends/sqlite/doc.go create mode 100644 vendor/yunion.io/x/sqlchemy/backends/sqlite/parse.go create mode 100644 vendor/yunion.io/x/sqlchemy/backends_mock.go delete mode 100644 vendor/yunion.io/x/sqlchemy/column_test.go delete mode 100644 vendor/yunion.io/x/sqlchemy/conditions_test.go delete mode 100644 vendor/yunion.io/x/sqlchemy/insert_test.go delete mode 100644 vendor/yunion.io/x/sqlchemy/locales/doc.go delete mode 100644 vendor/yunion.io/x/sqlchemy/locales/locales.go delete mode 100644 vendor/yunion.io/x/sqlchemy/locales/zh-CN/messages.gotext.json delete mode 100644 vendor/yunion.io/x/sqlchemy/main_test.go delete mode 100644 vendor/yunion.io/x/sqlchemy/query_test.go delete mode 100644 vendor/yunion.io/x/sqlchemy/reflect_test.go delete mode 100644 vendor/yunion.io/x/sqlchemy/sqltest/main.go delete mode 100644 vendor/yunion.io/x/sqlchemy/template_test.go diff --git a/cmd/climc/shell/misc/version.go b/cmd/climc/shell/misc/version.go index 1384ec263a..2fa6f686f2 100644 --- a/cmd/climc/shell/misc/version.go +++ b/cmd/climc/shell/misc/version.go @@ -23,6 +23,7 @@ import ( "yunion.io/x/onecloud/pkg/cloudprovider" "yunion.io/x/onecloud/pkg/mcclient" + "yunion.io/x/onecloud/pkg/mcclient/modulebase" modules "yunion.io/x/onecloud/pkg/mcclient/modules" "yunion.io/x/onecloud/pkg/mcclient/modules/identity" ) @@ -32,7 +33,7 @@ func init() { SERVICE string `help:"Service type"` } R(&VersionOptions{}, "version-show", "query backend service for its version", func(s *mcclient.ClientSession, args *VersionOptions) error { - body, err := modules.GetVersion(s, args.SERVICE) + body, err := modulebase.GetVersion(s, args.SERVICE) if err != nil { return err } @@ -40,6 +41,36 @@ func init() { return nil }) + type StatsOptions struct { + SERVICE string `help:"Service type"` + } + R(&StatsOptions{}, "api-stats-show", "query backend service for its stats", func(s *mcclient.ClientSession, args *StatsOptions) error { + body, err := modulebase.GetStats(s, "stats", args.SERVICE) + if err != nil { + return err + } + printObject(body) + return nil + }) + R(&StatsOptions{}, "db-stats-show", "query backend service for its db stats", func(s *mcclient.ClientSession, args *StatsOptions) error { + body, err := modulebase.GetStats(s, "db_stats", args.SERVICE) + if err != nil { + return err + } + stats, _ := body.Get("db_stats") + printObject(stats) + return nil + }) + R(&StatsOptions{}, "worker-stats-show", "query backend service for its worker stats", func(s *mcclient.ClientSession, args *StatsOptions) error { + body, err := modulebase.GetStats(s, "worker_stats", args.SERVICE) + if err != nil { + return err + } + data, _ := body.GetArray("workers") + printList(&modulebase.ListResult{Data: data}, nil) + return nil + }) + type VersionListOptions struct { } R(&VersionListOptions{}, "version-list", "query all backend service version", func(s *mcclient.ClientSession, args *VersionListOptions) error { diff --git a/go.mod b/go.mod index 11cf256d41..eccae617d9 100644 --- a/go.mod +++ b/go.mod @@ -155,8 +155,8 @@ require ( yunion.io/x/jsonutils v0.0.0-20211105163012-d846c05a3c9a yunion.io/x/log v0.0.0-20201210064738-43181789dc74 yunion.io/x/ovsdb v0.0.0-20200526071744-27bf0940cbc7 - yunion.io/x/pkg v0.0.0-20210918114143-ce839f862c5f + yunion.io/x/pkg v0.0.0-20211116020154-6a76ba2f7e97 yunion.io/x/s3cli v0.0.0-20190917004522-13ac36d8687e - yunion.io/x/sqlchemy v0.0.0-20210827024030-22a1e669b4f8 + yunion.io/x/sqlchemy v0.0.0-20211116231750-5ec40db49db1 yunion.io/x/structarg v0.0.0-20200720093445-9f850fa222ce ) diff --git a/go.sum b/go.sum index 1779990c22..e44352f7c9 100644 --- a/go.sum +++ b/go.sum @@ -147,6 +147,7 @@ github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+Ce github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bitly/go-simplejson v0.5.0 h1:6IH+V8/tVMab511d5bn4M7EwGXZf9Hj6i2xSwkNEM+Y= github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= +github.com/bkaradzic/go-lz4 v1.0.0 h1:RXc4wYsyz985CkXXeX04y4VnZFGG8Rd43pRaHsOXAKk= github.com/bkaradzic/go-lz4 v1.0.0/go.mod h1:0YdlkowM3VswSROI7qDxhRvJ3sLhlFrRRwjwegp5jy4= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4YnC6+E63dPcxHo2sUxDIu8g3QgEJdRY= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= @@ -950,11 +951,11 @@ yunion.io/x/ovsdb v0.0.0-20200526071744-27bf0940cbc7/go.mod h1:0vLkNEhlmA64HViPB yunion.io/x/pkg v0.0.0-20190620104149-945c25821dbf/go.mod h1:t6rEGG2sQ4J7DhFxSZVOTjNd0YO/KlfWQyK1W4tog+E= yunion.io/x/pkg v0.0.0-20190628082551-f4033ba2ea30/go.mod h1:t6rEGG2sQ4J7DhFxSZVOTjNd0YO/KlfWQyK1W4tog+E= yunion.io/x/pkg v0.0.0-20200814072949-4f1b541857d6/go.mod h1:t6rEGG2sQ4J7DhFxSZVOTjNd0YO/KlfWQyK1W4tog+E= -yunion.io/x/pkg v0.0.0-20210918114143-ce839f862c5f h1:maply0f3AsvoXqkpTKkb6/tZFbRAT/rdkk1Cw3FkoB8= -yunion.io/x/pkg v0.0.0-20210918114143-ce839f862c5f/go.mod h1:t6rEGG2sQ4J7DhFxSZVOTjNd0YO/KlfWQyK1W4tog+E= +yunion.io/x/pkg v0.0.0-20211116020154-6a76ba2f7e97 h1:lY+5NlWwO2aIkfNnVOGKHmZvMt6m4ZuGtarIjwNfUsg= +yunion.io/x/pkg v0.0.0-20211116020154-6a76ba2f7e97/go.mod h1:t6rEGG2sQ4J7DhFxSZVOTjNd0YO/KlfWQyK1W4tog+E= yunion.io/x/s3cli v0.0.0-20190917004522-13ac36d8687e h1:v+EzIadodSwkdZ/7bremd7J8J50Cise/HCylsOJngmo= yunion.io/x/s3cli v0.0.0-20190917004522-13ac36d8687e/go.mod h1:0iFKpOs1y4lbCxeOmq3Xx/0AcQoewVPwj62eRluioEo= -yunion.io/x/sqlchemy v0.0.0-20210827024030-22a1e669b4f8 h1:6SMLWaCXu1ZdB4eiS1uLuS34iJSCGElzaWhLrJLouBM= -yunion.io/x/sqlchemy v0.0.0-20210827024030-22a1e669b4f8/go.mod h1:FTdwPdGhMgh4E+UFXc9klI1Ok34fMuybTT+jLhOaIjI= +yunion.io/x/sqlchemy v0.0.0-20211116231750-5ec40db49db1 h1:WxvTLANfa01EFTORGY2GapbdjQkuLaQ/CwMDdBy632U= +yunion.io/x/sqlchemy v0.0.0-20211116231750-5ec40db49db1/go.mod h1:FTdwPdGhMgh4E+UFXc9klI1Ok34fMuybTT+jLhOaIjI= yunion.io/x/structarg v0.0.0-20200720093445-9f850fa222ce h1:kU8xE7O5uZ1GSJVMZHoJ+jrNL7csUQHYGyAPW9QfNpE= yunion.io/x/structarg v0.0.0-20200720093445-9f850fa222ce/go.mod h1:EP6NSv2C0zzqBDTKumv8hPWLb3XvgMZDHQRfyuOrQng= diff --git a/pkg/ansibleserver/service/service.go b/pkg/ansibleserver/service/service.go index 4c891dcafe..3e9950f8f7 100644 --- a/pkg/ansibleserver/service/service.go +++ b/pkg/ansibleserver/service/service.go @@ -17,9 +17,8 @@ package service import ( "os" - _ "github.com/go-sql-driver/mysql" - "yunion.io/x/log" + _ "yunion.io/x/sqlchemy/backends" "yunion.io/x/onecloud/pkg/ansibleserver/models" "yunion.io/x/onecloud/pkg/ansibleserver/options" @@ -43,9 +42,12 @@ func StartService() { models.InitPlaybookWorker() app := common_app.InitApp(baseOpts, false) + + cloudcommon.InitDB(dbOpts) + InitHandlers(app) - db.EnsureAppInitSyncDB(app, dbOpts, models.InitDB) + db.EnsureAppSyncDB(app, dbOpts, models.InitDB) defer cloudcommon.CloseDB() common_app.ServeForever(app, baseOpts) diff --git a/pkg/appsrv/workers.go b/pkg/appsrv/workers.go index b8cef02f3e..197ea6a0b4 100644 --- a/pkg/appsrv/workers.go +++ b/pkg/appsrv/workers.go @@ -281,6 +281,8 @@ type SWorkerManagerStates struct { MaxWorkerCnt int ActiveWorkerCnt int DetachWorkerCnt int + DbWorker bool + AllowOverflow bool } func (s SWorkerManagerStates) IsBusy() bool { @@ -299,6 +301,8 @@ func (wm *SWorkerManager) getState() SWorkerManagerStates { state.MaxWorkerCnt = wm.workerCount state.ActiveWorkerCnt = wm.activeWorker.size() state.DetachWorkerCnt = wm.detachedWorker.size() + state.DbWorker = wm.dbWorker + state.AllowOverflow = wm.ignoreOverflow return state } diff --git a/pkg/cloudcommon/database.go b/pkg/cloudcommon/database.go index e3f8fe929d..d23ddeafa3 100644 --- a/pkg/cloudcommon/database.go +++ b/pkg/cloudcommon/database.go @@ -58,11 +58,16 @@ func InitDB(options *common_options.DBOptions) { if err != nil { log.Fatalf("Invalid SqlConnection string: %s error: %v", options.SqlConnection, err) } + log.Infof("database dialect: %s sqlStr: %s", dialect, sqlStr) dbConn, err := sql.Open(dialect, sqlStr) if err != nil { panic(err) } - sqlchemy.SetDefaultDB(dbConn) + backend := sqlchemy.MySQLBackend + if dialect == "sqlite3" { + backend = sqlchemy.SQLiteBackend + } + sqlchemy.SetDBWithNameBackend(dbConn, sqlchemy.DefaultDB, backend) dialect, sqlStr, err = options.GetClickhouseConnStr() if err == nil { diff --git a/pkg/cloudcommon/db/db_dispatcher.go b/pkg/cloudcommon/db/db_dispatcher.go index 3c359a8e96..644c0b3d1e 100644 --- a/pkg/cloudcommon/db/db_dispatcher.go +++ b/pkg/cloudcommon/db/db_dispatcher.go @@ -145,7 +145,7 @@ func listItemsQueryByColumn(manager IModelManager, q *sqlchemy.SQuery, userCred } } else if len(arrV) > 1 { for i := range arrV { - arrV[i] = colSpec.ConvertFromString(arrV[i]) + arrV[i] = sqlchemy.GetStringValue(colSpec.ConvertFromString(arrV[i])) } q = q.In(fn, arrV) } else if len(arrV) == 1 { diff --git a/pkg/cloudcommon/db/i18n.go b/pkg/cloudcommon/db/i18n.go index 769897502d..a825c893a1 100644 --- a/pkg/cloudcommon/db/i18n.go +++ b/pkg/cloudcommon/db/i18n.go @@ -17,9 +17,8 @@ package db import ( "context" - "github.com/pkg/errors" - "yunion.io/x/log" + "yunion.io/x/pkg/errors" "yunion.io/x/pkg/util/compare" "yunion.io/x/onecloud/pkg/i18n" @@ -272,16 +271,20 @@ func (manager *SI18nManager) newFromI18n(ctx context.Context, userCred mcclient. } func (self *SI18n) updateFromI18n(ctx context.Context, userCred mcclient.TokenCredential, entry IModelI18nEntry) error { - _, err := Update(self, func() error { - self.KeyValue = entry.GetKeyValue() - self.Cn = entry.Lookup(i18n.I18N_TAG_CHINESE) - self.En = entry.Lookup(i18n.I18N_TAG_ENGLISH) - - return nil - }) - if err != nil { - log.Infof("updateFromI18n error %s", err) - return err + zh := entry.Lookup(i18n.I18N_TAG_CHINESE) + en := entry.Lookup(i18n.I18N_TAG_ENGLISH) + log.Debugf("updateFromI18n %#v %s %s", self, zh, en) + if self.Cn != zh || self.En != en { + _, err := Update(self, func() error { + self.KeyValue = entry.GetKeyValue() + self.Cn = zh + self.En = en + return nil + }) + if err != nil { + log.Infof("updateFromI18n error %s", err) + return err + } } return nil diff --git a/pkg/cloudcommon/db/models.go b/pkg/cloudcommon/db/models.go index 3960ca31cb..f1ed269ee9 100644 --- a/pkg/cloudcommon/db/models.go +++ b/pkg/cloudcommon/db/models.go @@ -138,8 +138,8 @@ func CheckSync(autoSync bool) bool { return inSync } -func EnsureAppInitSyncDB(app *appsrv.Application, opt *common_options.DBOptions, modelInitDBFunc func() error) { - cloudcommon.InitDB(opt) +func EnsureAppSyncDB(app *appsrv.Application, opt *common_options.DBOptions, modelInitDBFunc func() error) { + // cloudcommon.InitDB(opt) if !CheckSync(opt.AutoSyncTable) { log.Fatalf("database schema not in sync!") diff --git a/pkg/cloudcommon/db/opslog.go b/pkg/cloudcommon/db/opslog.go index 2be61a948f..bfec09aa49 100644 --- a/pkg/cloudcommon/db/opslog.go +++ b/pkg/cloudcommon/db/opslog.go @@ -28,6 +28,7 @@ import ( "yunion.io/x/pkg/errors" "yunion.io/x/pkg/util/reflectutils" "yunion.io/x/pkg/util/stringutils" + "yunion.io/x/pkg/util/timeutils" "yunion.io/x/sqlchemy" "yunion.io/x/onecloud/pkg/apis" @@ -77,6 +78,7 @@ var _ IModelManager = (*SOpsLogManager)(nil) var _ IModel = (*SOpsLog)(nil) var opslogQueryWorkerMan *appsrv.SWorkerManager +var opslogWriteWorkerMan *appsrv.SWorkerManager func init() { OpsLog = &SOpsLogManager{NewModelBaseManagerWithSplitable( @@ -91,7 +93,8 @@ func init() { )} OpsLog.SetVirtualObject(OpsLog) - opslogQueryWorkerMan = appsrv.NewWorkerManager("opslog_query_worker", 2, 1024, true) + opslogQueryWorkerMan = appsrv.NewWorkerManager("opslog_query_worker", 2, 512, true) + opslogWriteWorkerMan = appsrv.NewWorkerManager("opslog_write_worker", 1, 2048, true) } func (manager *SOpsLogManager) CustomizeHandlerInfo(info *appsrv.SHandlerInfo) { @@ -188,12 +191,20 @@ func (manager *SOpsLogManager) LogEvent(model IModel, action string, notes inter } } - err := manager.TableSpec().Insert(context.Background(), opslog) + opslogWriteWorkerMan.Run(opslog, nil, nil) +} + +func (opslog *SOpsLog) Run() { + err := OpsLog.TableSpec().Insert(context.Background(), opslog) if err != nil { log.Errorf("fail to insert opslog: %s", err) } } +func (opslog *SOpsLog) Dump() string { + return fmt.Sprintf("[%s] %s %s", timeutils.CompactTime(opslog.OpsTime), opslog.Action, opslog.Notes) +} + func combineNotes(ctx context.Context, m2 IModel, notes jsonutils.JSONObject) *jsonutils.JSONDict { desc := m2.GetShortDesc(ctx) if notes != nil { diff --git a/pkg/cloudcommon/db/resourcebase_test.go b/pkg/cloudcommon/db/resourcebase_test.go index 83c0b4b001..7bac5523d9 100644 --- a/pkg/cloudcommon/db/resourcebase_test.go +++ b/pkg/cloudcommon/db/resourcebase_test.go @@ -18,6 +18,7 @@ import ( "testing" "yunion.io/x/pkg/utils" + "yunion.io/x/sqlchemy" "yunion.io/x/onecloud/pkg/mcclient" "yunion.io/x/onecloud/pkg/util/rbacutils" @@ -32,6 +33,7 @@ func (tk *omniToken) IsAllow(scope rbacutils.TRbacScope, service string, resourc } func TestListFields(t *testing.T) { + sqlchemy.SetupMockDatabaseBackend() man := NewResourceBaseManager( &SResourceBase{}, "tbl", diff --git a/pkg/cloudcommon/db/taskman/tasks.go b/pkg/cloudcommon/db/taskman/tasks.go index 8d37d262f0..3c30c390d3 100644 --- a/pkg/cloudcommon/db/taskman/tasks.go +++ b/pkg/cloudcommon/db/taskman/tasks.go @@ -592,12 +592,15 @@ func (self *STask) GetRequestContext() appctx.AppContextData { } func (self *STask) SaveRequestContext(data *appctx.AppContextData) { + jsonData := jsonutils.Marshal(data) + log.Debugf("SaveRequestContext %s param %s", jsonData, self.Params) _, err := db.Update(self, func() error { params := self.Params.CopyExcludes(REQUEST_CONTEXT_KEY) - params.Add(jsonutils.Marshal(data), REQUEST_CONTEXT_KEY) + params.Add(jsonData, REQUEST_CONTEXT_KEY) self.Params = params return nil }) + log.Debugf("Params: %s", self.Params) if err != nil { log.Errorf("save_request_context fail %s", err) } diff --git a/pkg/cloudcommon/options/options.go b/pkg/cloudcommon/options/options.go index 0511fdc701..0a8654e57c 100644 --- a/pkg/cloudcommon/options/options.go +++ b/pkg/cloudcommon/options/options.go @@ -123,7 +123,7 @@ type CommonOptions struct { AdminDomain string `help:"Admin user domain" default:"Default"` AdminPassword string `help:"Admin password" alias:"admin-passwd"` AdminProject string `help:"Admin project" default:"system" alias:"admin-tenant-name"` - AdminProjectDomain string `help:"Domain of Admin project" default:"default"` + AdminProjectDomain string `help:"Domain of Admin project" default:"Default"` AuthTokenCacheSize uint32 `help:"Auth token Cache Size" default:"2048"` TenantCacheExpireSeconds int `help:"expire seconds of cached tenant/domain info. defailt 15 minutes" default:"900"` diff --git a/pkg/cloudevent/service/service.go b/pkg/cloudevent/service/service.go index 6454ac9a10..02922db21e 100644 --- a/pkg/cloudevent/service/service.go +++ b/pkg/cloudevent/service/service.go @@ -18,9 +18,8 @@ import ( "os" "time" - _ "github.com/go-sql-driver/mysql" - "yunion.io/x/log" + _ "yunion.io/x/sqlchemy/backends" api "yunion.io/x/onecloud/pkg/apis/cloudevent" "yunion.io/x/onecloud/pkg/cloudcommon" @@ -49,9 +48,10 @@ func StartService() { baseOpts := &opts.BaseOptions app := common_app.InitApp(baseOpts, false) + cloudcommon.InitDB(dbOpts) InitHandlers(app) - db.EnsureAppInitSyncDB(app, dbOpts, models.InitDB) + db.EnsureAppSyncDB(app, dbOpts, models.InitDB) defer cloudcommon.CloseDB() if !opts.IsSlaveNode { diff --git a/pkg/cloudid/service/service.go b/pkg/cloudid/service/service.go index ba2f3b23f7..3b622322e9 100644 --- a/pkg/cloudid/service/service.go +++ b/pkg/cloudid/service/service.go @@ -19,6 +19,7 @@ import ( "time" "yunion.io/x/log" + _ "yunion.io/x/sqlchemy/backends" api "yunion.io/x/onecloud/pkg/apis/cloudid" "yunion.io/x/onecloud/pkg/cloudcommon" @@ -47,9 +48,12 @@ func StartService() { common_options.StartOptionManager(opts, opts.ConfigSyncPeriodSeconds, api.SERVICE_TYPE, api.SERVICE_VERSION, options.OnOptionsChange) app := common_app.InitApp(baseOpts, false) + + cloudcommon.InitDB(dbOpts) + InitHandlers(app) - db.EnsureAppInitSyncDB(app, dbOpts, models.InitDB) + db.EnsureAppSyncDB(app, dbOpts, models.InitDB) defer cloudcommon.CloseDB() err := saml.InitSAML(app, api.SAML_IDP_PREFIX) diff --git a/pkg/cloudnet/service/service.go b/pkg/cloudnet/service/service.go index 63f9747fb0..3482c642f6 100644 --- a/pkg/cloudnet/service/service.go +++ b/pkg/cloudnet/service/service.go @@ -17,9 +17,8 @@ package service import ( "os" - _ "github.com/go-sql-driver/mysql" - "yunion.io/x/log" + _ "yunion.io/x/sqlchemy/backends" "yunion.io/x/onecloud/pkg/cloudcommon" common_app "yunion.io/x/onecloud/pkg/cloudcommon/app" @@ -42,9 +41,12 @@ func StartService() { baseOpts := &opts.BaseOptions app := common_app.InitApp(baseOpts, false) + + cloudcommon.InitDB(dbOpts) + InitHandlers(app) - db.EnsureAppInitSyncDB(app, dbOpts, models.InitDB) + db.EnsureAppSyncDB(app, dbOpts, models.InitDB) defer cloudcommon.CloseDB() common_app.ServeForever(app, baseOpts) diff --git a/pkg/cloudproxy/service/service.go b/pkg/cloudproxy/service/service.go index 5d4cfc6eb6..2722a1efb9 100644 --- a/pkg/cloudproxy/service/service.go +++ b/pkg/cloudproxy/service/service.go @@ -15,7 +15,7 @@ package service import ( - _ "github.com/go-sql-driver/mysql" + _ "yunion.io/x/sqlchemy/backends" "yunion.io/x/onecloud/pkg/cloudcommon" common_app "yunion.io/x/onecloud/pkg/cloudcommon/app" @@ -32,9 +32,12 @@ func StartService() { ) app := common_app.InitApp(baseOpts, false) + + cloudcommon.InitDB(dbOpts) + InitHandlers(app) - db.EnsureAppInitSyncDB(app, dbOpts, models.InitDB) + db.EnsureAppSyncDB(app, dbOpts, models.InitDB) defer cloudcommon.CloseDB() common_app.ServeForever(app, baseOpts) diff --git a/pkg/compute/models/billingresource.go b/pkg/compute/models/billingresource.go index 52300afa29..46912cbc24 100644 --- a/pkg/compute/models/billingresource.go +++ b/pkg/compute/models/billingresource.go @@ -254,7 +254,7 @@ func CheckBillingResourceExpireAt(ctx context.Context, userCred mcclient.TokenCr bq := BillingResourceCheckManager.Query("resource_id").Equals("resource_type", manager.Keyword()).Equals("advance_days", advanceDay).SubQuery() q = q.LeftJoin(bq, sqlchemy.Equals(q.Field("id"), bq.Field("resource_id"))) - q = q.IsNull("resource_id") + q = q.Filter(sqlchemy.IsNull(bq.Field("resource_id"))) vp := reflect.New(v.Type()) vp.Elem().Set(v) diff --git a/pkg/compute/models/cloudaccounts.go b/pkg/compute/models/cloudaccounts.go index c06eead815..0ee6946321 100644 --- a/pkg/compute/models/cloudaccounts.go +++ b/pkg/compute/models/cloudaccounts.go @@ -1867,12 +1867,14 @@ func (account *SCloudaccount) markAllProvidersDicconnected(ctx context.Context, } func (account *SCloudaccount) markAccountConnected(ctx context.Context, userCred mcclient.TokenCredential) error { - _, err := db.UpdateWithLock(ctx, account, func() error { - account.ErrorCount = 0 - return nil - }) - if err != nil { - return err + if account.ErrorCount != 0 { + _, err := db.UpdateWithLock(ctx, account, func() error { + account.ErrorCount = 0 + return nil + }) + if err != nil { + return err + } } return account.SetStatus(userCred, api.CLOUD_PROVIDER_CONNECTED, "") } diff --git a/pkg/compute/models/cloudregions.go b/pkg/compute/models/cloudregions.go index 66cf557c47..1de8745f8e 100644 --- a/pkg/compute/models/cloudregions.go +++ b/pkg/compute/models/cloudregions.go @@ -522,7 +522,7 @@ func (self *SCloudregion) syncWithCloudRegion(ctx context.Context, userCred mccl return nil }) - if err != nil { + if err != nil && errors.Cause(err) != sqlchemy.ErrNoDataToUpdate { log.Errorf("syncWithCloudRegion %s", err) return err } diff --git a/pkg/compute/models/purge.go b/pkg/compute/models/purge.go index 938770acd3..e74971f0bd 100644 --- a/pkg/compute/models/purge.go +++ b/pkg/compute/models/purge.go @@ -390,14 +390,18 @@ func (lb *SLoadbalancer) purge(ctx context.Context, userCred mcclient.TokenCrede lb.DeletePreventionOff(lb, userCred) - _, err := db.UpdateWithLock(ctx, lb, func() error { - //避免 purge backendgroups 时循环依赖 - lb.BackendGroupId = "" - return nil - }) + var err error - if err != nil { - return fmt.Errorf("loadbalancer %s(%s): clear up backend group error: %v", lb.Name, lb.Id, err) + if lb.BackendGroupId != "" { + _, err = db.UpdateWithLock(ctx, lb, func() error { + //避免 purge backendgroups 时循环依赖 + lb.BackendGroupId = "" + return nil + }) + + if err != nil { + return fmt.Errorf("loadbalancer %s(%s): clear up backend group error: %v", lb.Name, lb.Id, err) + } } err = lb.detachAllNetworks(ctx, userCred) diff --git a/pkg/compute/service/service.go b/pkg/compute/service/service.go index d0bd8cd76e..68defac263 100644 --- a/pkg/compute/service/service.go +++ b/pkg/compute/service/service.go @@ -21,10 +21,9 @@ import ( "path/filepath" "time" - _ "github.com/go-sql-driver/mysql" - "yunion.io/x/log" "yunion.io/x/pkg/errors" + _ "yunion.io/x/sqlchemy/backends" api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudcommon" @@ -77,8 +76,11 @@ func StartService() { app := app_common.InitApp(baseOpts, true) + cloudcommon.InitDB(dbOpts) + InitHandlers(app) - db.EnsureAppInitSyncDB(app, dbOpts, models.InitDB) + + db.EnsureAppSyncDB(app, dbOpts, models.InitDB) defer cloudcommon.CloseDB() options.InitNameSyncResources() diff --git a/pkg/devtool/service/service.go b/pkg/devtool/service/service.go index 61cc5f9f8a..5e86609a04 100644 --- a/pkg/devtool/service/service.go +++ b/pkg/devtool/service/service.go @@ -17,9 +17,8 @@ package service import ( "os" - _ "github.com/go-sql-driver/mysql" - "yunion.io/x/log" + _ "yunion.io/x/sqlchemy/backends" api "yunion.io/x/onecloud/pkg/apis/devtool" "yunion.io/x/onecloud/pkg/cloudcommon" @@ -51,8 +50,9 @@ func StartService() { } app := app_common.InitApp(&opts.BaseOptions, false) + cloudcommon.InitDB(dbOpts) InitHandlers(app) - db.EnsureAppInitSyncDB(app, dbOpts, models.InitDB) + db.EnsureAppSyncDB(app, dbOpts, models.InitDB) models.InitializeCronjobs() diff --git a/pkg/image/service/service.go b/pkg/image/service/service.go index 8ffdda05c3..9e14c30305 100644 --- a/pkg/image/service/service.go +++ b/pkg/image/service/service.go @@ -21,9 +21,8 @@ import ( "strings" "time" - _ "github.com/go-sql-driver/mysql" - "yunion.io/x/log" + _ "yunion.io/x/sqlchemy/backends" api "yunion.io/x/onecloud/pkg/apis/image" "yunion.io/x/onecloud/pkg/cloudcommon" @@ -94,9 +93,12 @@ func StartService() { } app := app_common.InitApp(baseOpts, true) + + cloudcommon.InitDB(dbOpts) + InitHandlers(app) - db.EnsureAppInitSyncDB(app, dbOpts, models.InitDB) + db.EnsureAppSyncDB(app, dbOpts, models.InitDB) common_options.StartOptionManager(opts, opts.ConfigSyncPeriodSeconds, api.SERVICE_TYPE, api.SERVICE_VERSION, options.OnOptionsChange) diff --git a/pkg/keystone/models/domains.go b/pkg/keystone/models/domains.go index 2d2cd8d9d8..03c31e7681 100644 --- a/pkg/keystone/models/domains.go +++ b/pkg/keystone/models/domains.go @@ -142,6 +142,7 @@ func (manager *SDomainManager) FetchDomain(domainId string, domainName string) ( if len(domainId) == 0 && len(domainName) == 0 { domainId = api.DEFAULT_DOMAIN_ID } + log.Debugf("FetchDomain id %s name %s", domainId, domainName) if len(domainId) > 0 { return manager.FetchDomainById(domainId) } else { diff --git a/pkg/keystone/service/service.go b/pkg/keystone/service/service.go index a563914cd2..1a74bac44e 100644 --- a/pkg/keystone/service/service.go +++ b/pkg/keystone/service/service.go @@ -72,8 +72,11 @@ func StartService() { app := app_common.InitApp(&opts.BaseOptions, true) + cloudcommon.InitDB(&opts.DBOptions) + InitHandlers(app) - db.EnsureAppInitSyncDB(app, &opts.DBOptions, models.InitDB) + + db.EnsureAppSyncDB(app, &opts.DBOptions, models.InitDB) app_common.InitBaseAuth(&opts.BaseOptions) diff --git a/pkg/logger/service/service.go b/pkg/logger/service/service.go index 43de56d710..e48221ad21 100644 --- a/pkg/logger/service/service.go +++ b/pkg/logger/service/service.go @@ -17,9 +17,8 @@ package service import ( "os" - _ "github.com/go-sql-driver/mysql" - "yunion.io/x/log" + _ "yunion.io/x/sqlchemy/backends" api "yunion.io/x/onecloud/pkg/apis/logger" "yunion.io/x/onecloud/pkg/cloudcommon" @@ -47,9 +46,12 @@ func StartService() { }) app := app_common.InitApp(baseOpts, true) + + cloudcommon.InitDB(dbOpts) + initHandlers(app) - db.EnsureAppInitSyncDB(app, dbOpts, models.InitDB) + db.EnsureAppSyncDB(app, dbOpts, models.InitDB) defer cloudcommon.CloseDB() // models.StartNotifyToWebsocketWorker() diff --git a/pkg/mcclient/modulebase/stats.go b/pkg/mcclient/modulebase/stats.go new file mode 100644 index 0000000000..4c15c20127 --- /dev/null +++ b/pkg/mcclient/modulebase/stats.go @@ -0,0 +1,39 @@ +// Copyright 2019 Yunion +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package modulebase + +import ( + "io/ioutil" + + "yunion.io/x/jsonutils" + "yunion.io/x/pkg/errors" + + "yunion.io/x/onecloud/pkg/mcclient" +) + +// path: stats, db_stats, worker_stats +func GetStats(s *mcclient.ClientSession, path string, serviceType string) (jsonutils.JSONObject, error) { + man := NewBaseManager(serviceType, "", "", nil, nil) + resp, err := man.rawBaseUrlRequest(s, "GET", "/"+path, nil, nil) + if err != nil { + return nil, errors.Wrap(err, "man.rawBaseUrlRequest") + } + defer resp.Body.Close() + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + return nil, errors.Wrap(err, "ioutil.ReadAll") + } + return jsonutils.Parse(body) +} diff --git a/pkg/monitor/service/service.go b/pkg/monitor/service/service.go index bbe94411a5..0600a29c6c 100644 --- a/pkg/monitor/service/service.go +++ b/pkg/monitor/service/service.go @@ -19,10 +19,10 @@ import ( "os" "time" - _ "github.com/go-sql-driver/mysql" "golang.org/x/sync/errgroup" "yunion.io/x/log" + _ "yunion.io/x/sqlchemy/backends" "yunion.io/x/onecloud/pkg/cloudcommon" common_app "yunion.io/x/onecloud/pkg/cloudcommon/app" @@ -56,9 +56,12 @@ func StartService() { baseOpts := &opts.BaseOptions app := common_app.InitApp(baseOpts, false) + + cloudcommon.InitDB(dbOpts) + InitHandlers(app) - db.EnsureAppInitSyncDB(app, dbOpts, models.InitDB) + db.EnsureAppSyncDB(app, dbOpts, models.InitDB) defer cloudcommon.CloseDB() go startServices() diff --git a/pkg/notify/service/service.go b/pkg/notify/service/service.go index 353953eab2..ee1b80e967 100644 --- a/pkg/notify/service/service.go +++ b/pkg/notify/service/service.go @@ -18,9 +18,8 @@ import ( "os" "time" - _ "github.com/go-sql-driver/mysql" - "yunion.io/x/log" + _ "yunion.io/x/sqlchemy/backends" api "yunion.io/x/onecloud/pkg/apis/notify" "yunion.io/x/onecloud/pkg/cloudcommon" @@ -52,10 +51,13 @@ func StartService() { // init handler applicaion := app.InitApp(baseOpts, true) + + cloudcommon.InitDB(dbOpts) + InitHandlers(applicaion) // init database - db.EnsureAppInitSyncDB(applicaion, dbOpts, models.InitDB) + db.EnsureAppSyncDB(applicaion, dbOpts, models.InitDB) defer cloudcommon.CloseDB() err := models.ReceiverManager.StartWatchUserInKeystone() diff --git a/pkg/scheduledtask/models/scheduled_tasks.go b/pkg/scheduledtask/models/scheduled_tasks.go index 090f9fc91d..d81bd4a8c1 100644 --- a/pkg/scheduledtask/models/scheduled_tasks.go +++ b/pkg/scheduledtask/models/scheduled_tasks.go @@ -551,7 +551,7 @@ func (stm *SScheduledTaskManager) Timer(ctx context.Context, userCred mcclient.T if timerQueue == nil { timerQueue = make(chan struct{}, sop.Options.ScheduledTaskQueueSize) } - log.Infof("queueSize: %s", sop.Options.ScheduledTaskQueueSize) + log.Infof("queueSize: %d", sop.Options.ScheduledTaskQueueSize) // 60 is for fault tolerance interval := 60 + 30 timeScope := stm.timeScope(time.Now(), time.Duration(interval)*time.Second) diff --git a/pkg/scheduledtask/service/service.go b/pkg/scheduledtask/service/service.go index 0eb32724f3..000a9709fc 100644 --- a/pkg/scheduledtask/service/service.go +++ b/pkg/scheduledtask/service/service.go @@ -42,9 +42,12 @@ func StartService() { }) applicaion := app.InitApp(baseOpts, true) + + cloudcommon.InitDB(dbOpts) + InitHandlers(applicaion) - db.EnsureAppInitSyncDB(applicaion, dbOpts, nil) + db.EnsureAppSyncDB(applicaion, dbOpts, nil) defer cloudcommon.CloseDB() cron := cronman.InitCronJobManager(true, 4) diff --git a/pkg/util/splitable/insert.go b/pkg/util/splitable/insert.go index 87d2bd3c76..ab1651eb69 100644 --- a/pkg/util/splitable/insert.go +++ b/pkg/util/splitable/insert.go @@ -67,7 +67,7 @@ func (t *SSplitTableSpec) Insert(dt interface{}) error { if lastMeta.StartDate.IsZero() { indexCol := t.tableSpec.ColumnSpec(t.indexField) _, err = t.metaSpec.Update(&lastMeta, func() error { - lastMeta.Start = indexCol.(*sqlchemy.SIntegerColumn).AutoIncrementOffset + lastMeta.Start = indexCol.AutoIncrementOffset() lastMeta.StartDate = lastDate return nil }) diff --git a/pkg/util/splitable/splitable.go b/pkg/util/splitable/splitable.go index ea4d1351c5..f32c0db30f 100644 --- a/pkg/util/splitable/splitable.go +++ b/pkg/util/splitable/splitable.go @@ -122,25 +122,23 @@ func (t *SSplitTableSpec) Fetch(dt interface{}) error { func NewSplitTableSpec(s interface{}, name string, indexField string, dateField string, maxDuration time.Duration, maxSegments int, dbName sqlchemy.DBName) (*SSplitTableSpec, error) { spec := sqlchemy.NewTableSpecFromStructWithDBName(s, name, dbName) - indexCol := spec.ColumnSpec(indexField) + /*indexCol := spec.ColumnSpec(indexField) if indexCol == nil { return nil, errors.Wrapf(errors.ErrNotFound, "indexField %s not found", indexField) } if !indexCol.IsPrimary() { return nil, errors.Wrapf(errors.ErrInvalidStatus, "indexField %s not primary", indexField) } - if intCol, ok := indexCol.(*sqlchemy.SIntegerColumn); !ok { - return nil, errors.Wrapf(errors.ErrInvalidStatus, "indexField %s not integer", indexField) - } else if !intCol.IsAutoIncrement { + if !indexCol.IsAutoIncrement() { return nil, errors.Wrapf(errors.ErrInvalidStatus, "indexField %s not auto_increment", indexField) } dateCol := spec.ColumnSpec(dateField) if dateCol == nil { return nil, errors.Wrapf(errors.ErrNotFound, "dateField %s not found", dateField) } - if _, ok := dateCol.(*sqlchemy.SDateTimeColumn); !ok { + if !dateCol.IsDateTime() { return nil, errors.Wrapf(errors.ErrInvalidStatus, "dateField %s not datetime column", dateField) - } + }*/ metaSpec := sqlchemy.NewTableSpecFromStructWithDBName(&STableMetadata{}, fmt.Sprintf("%s_metadata", name), dbName) diff --git a/pkg/util/splitable/sync.go b/pkg/util/splitable/sync.go index 815ae42faa..4b28884f2f 100644 --- a/pkg/util/splitable/sync.go +++ b/pkg/util/splitable/sync.go @@ -130,7 +130,7 @@ func (spec *SSplitTableSpec) SyncSQL() []string { now := time.Now() meta := STableMetadata{ Table: fmt.Sprintf("%s_%d", spec.tableName, now.Unix()), - Start: indexCol.(*sqlchemy.SIntegerColumn).AutoIncrementOffset, + Start: indexCol.AutoIncrementOffset(), } // insert the first meta sql := fmt.Sprintf("INSERT INTO `%s`(`table`, `deleted`, `created_at`) VALUES('%s', 0, '%s')", spec.metaSpec.Name(), meta.Table, timeutils.MysqlTime(now)) diff --git a/vendor/github.com/ClickHouse/clickhouse-go/bootstrap_test.go b/vendor/github.com/ClickHouse/clickhouse-go/bootstrap_test.go deleted file mode 100644 index 358eb8b5ee..0000000000 --- a/vendor/github.com/ClickHouse/clickhouse-go/bootstrap_test.go +++ /dev/null @@ -1,96 +0,0 @@ -package clickhouse - -import ( - "database/sql/driver" - "reflect" - "testing" - "time" -) - -func Test_bootstrap_Open(t *testing.T) { - type args struct { - dsn string - } - tests := []struct { - name string - d *bootstrap - args args - want driver.Conn - wantErr bool - }{ - { - name: "Return nil connection when error occured", - d: &bootstrap{}, - args: args{dsn: "rubbish"}, - want: nil, - wantErr: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - d := &bootstrap{} - got, err := d.Open(tt.args.dsn) - if (err != nil) != tt.wantErr { - t.Errorf("bootstrap.Open() error = %v, wantErr %v", err, tt.wantErr) - return - } - if !reflect.DeepEqual(got, tt.want) { - t.Errorf("bootstrap.Open() = %#v, want %v", got, tt.want) - } - }) - } -} - -func TestOpen(t *testing.T) { - type args struct { - dsn string - } - tests := []struct { - name string - args args - want driver.Conn - wantErr bool - }{ - { - name: "Return nil connection when error occured", - want: nil, - wantErr: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - got, err := Open(tt.args.dsn) - if (err != nil) != tt.wantErr { - t.Errorf("Open() error = %v, wantErr %v", err, tt.wantErr) - return - } - if !reflect.DeepEqual(got, tt.want) { - t.Errorf("Open() = %#v, want %v", got, tt.want) - } - }) - } -} - -func Test_now(t *testing.T) { - tests := []struct { - name string - sleepDuration time.Duration - want time.Time - }{ - { - name: "1 second", - sleepDuration: time.Second, - want: time.Unix(1, 0), - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - time.Sleep(tt.sleepDuration) - time.Sleep(time.Millisecond) - got := now() - if !got.Equal(tt.want) { - t.Errorf("now() = %s, want %s", got.Format(time.RFC3339), tt.want.Format(time.RFC3339)) - } - }) - } -} diff --git a/vendor/github.com/ClickHouse/clickhouse-go/clickhouse_columnar_test.go b/vendor/github.com/ClickHouse/clickhouse-go/clickhouse_columnar_test.go deleted file mode 100644 index d17ddf2aa0..0000000000 --- a/vendor/github.com/ClickHouse/clickhouse-go/clickhouse_columnar_test.go +++ /dev/null @@ -1,261 +0,0 @@ -package clickhouse_test - -import ( - "database/sql/driver" - "github.com/ClickHouse/clickhouse-go" - "github.com/ClickHouse/clickhouse-go/lib/data" - "github.com/stretchr/testify/assert" - "net" - "reflect" - "testing" - "time" -) - -func Test_ColumnarInsert(t *testing.T) { - const ( - ddl = ` - CREATE TABLE clickhouse_test_columnar_insert ( - uint8 UInt8, - uint8_null Nullable(UInt8), - uint16 UInt16, - uint16_null Nullable(UInt16), - uint32 UInt32, - uint32_null Nullable(UInt32), - uint64 UInt64, - uint64_null Nullable(UInt64), - float32 Float32, - float32_null Nullable(Float32), - float64 Float64, - float64_null Nullable(Float64), - string String, - string_null Nullable(String), - fString FixedString(2), - fString_null Nullable(FixedString(2)), - date Date, - date_null Nullable(Date), - datetime DateTime, - datetime_null Nullable(DateTime), - enum8 Enum8 ('a' = 1, 'b' = 2), - enum8_null Nullable(Enum8 ('a' = 1, 'b' = 2)), - enum16 Enum16('c' = 1, 'd' = 2), - enum16_null Nullable(Enum16('c' = 1, 'd' = 2)), - array Array(String), - arrayArray Array(Array(String)), - arrayWithValue Array(UInt64), - arrayWithValueFast Array(UInt64), - ipv4 IPv4, - ipv6 IPv6 - ) Engine=Memory - ` - dml = ` - INSERT INTO clickhouse_test_columnar_insert ( - uint8, - uint8_null, - uint16, - uint16_null, - uint32, - uint32_null, - uint64, - uint64_null, - float32, - float32_null, - float64, - float64_null, - string, - string_null, - fString, - fString_null, - date, - date_null, - datetime, - datetime_null, - enum8, - enum8_null, - enum16, - enum16_null, - array, - arrayArray, - arrayWithValue, - arrayWithValueFast, - ipv4, - ipv6 - ) VALUES ( - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ? - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ? - )` - ) - if connect, err := clickhouse.OpenDirect("tcp://127.0.0.1:9000?debug=true"); assert.NoError(t, err) { - { - connect.Begin() - stmt, _ := connect.Prepare("DROP TABLE IF EXISTS clickhouse_test_columnar_insert") - stmt.Exec([]driver.Value{}) - connect.Commit() - } - { - if _, err := connect.Begin(); assert.NoError(t, err) { - if stmt, err := connect.Prepare(ddl); assert.NoError(t, err) { - if _, err := stmt.Exec([]driver.Value{}); assert.NoError(t, err) { - assert.NoError(t, connect.Commit()) - } - } - } - } - { - if _, err := connect.Begin(); assert.NoError(t, err) { - if _, err := connect.Prepare(dml); assert.NoError(t, err) { - block, err := connect.Block() - assert.NoError(t, err) - block.Reserve() - block.NumRows = 100 - - for i := 0; i < 100; i++ { - block.WriteUInt8(0, uint8(i)) - block.WriteUInt8Nullable(1, nil) - block.WriteUInt16(2, uint16(i)) - block.WriteUInt16Nullable(3, nil) - block.WriteUInt32(4, uint32(i)) - block.WriteUInt32Nullable(5, nil) - block.WriteUInt64(6, uint64(i)) - block.WriteUInt64Nullable(7, nil) - - block.WriteFloat32(8, float32(i)) - block.WriteFloat32Nullable(9, nil) - block.WriteFloat64(10, float64(i)) - block.WriteFloat64Nullable(11, nil) - - block.WriteString(12, "string") - block.WriteStringNullable(13, nil) - block.WriteFixedString(14, []byte("CH")) - block.WriteFixedStringNullable(15, nil) - block.WriteDate(16, time.Now()) - block.WriteDateNullable(17, nil) - block.WriteDateTime(18, time.Now()) - block.WriteDateTimeNullable(19, nil) - - block.WriteUInt8(20, 1) - block.WriteUInt8Nullable(21, nil) - block.WriteUInt16(22, 2) - block.WriteUInt16Nullable(23, nil) - block.WriteArray(24, []string{"A", "B", "C"}) - - block.WriteArray(25, [][]string{[]string{"A", "B"}, []string{"CC", "DD", "EE"}}) - block.WriteArrayWithValue(26, newUint64SliceValueSimple([]uint64{1, 2, 3})) - block.WriteArrayWithValue(27, newUint64SliceValueFast([]uint64{10, 20, 30})) - block.WriteIP(28, net.ParseIP("213.180.204.62")) - block.WriteIP(29, net.ParseIP("2606:4700:5c::a29f:2e07")) - if !assert.NoError(t, err) { - return - } - } - - assert.NoError(t, connect.Commit()) - } - } - } - } -} - -type uint64Value struct { - value uint64 -} - -func (v *uint64Value) Kind() reflect.Kind { - return reflect.String -} - -func (v *uint64Value) Len() int { - panic("uint64 has no length") -} - -func (v *uint64Value) Index(i int) data.Value { - panic("uint64 has no index") -} - -func (v *uint64Value) Interface() interface{} { - return v.value -} - -type uint64SliceValueSimple struct { - uint64Slice []uint64 -} - -func newUint64SliceValueSimple(v []uint64) *uint64SliceValueSimple { - return &uint64SliceValueSimple{uint64Slice: v} -} - -func (v *uint64SliceValueSimple) Kind() reflect.Kind { - return reflect.Slice -} - -func (v *uint64SliceValueSimple) Len() int { - return len(v.uint64Slice) -} - -func (v *uint64SliceValueSimple) Index(i int) data.Value { - return &uint64Value{value: v.uint64Slice[i]} -} - -func (v *uint64SliceValueSimple) Interface() interface{} { - return v.uint64Slice -} - -type uint64SliceValueFast struct { - uint64Slice []uint64 - uint64Value *uint64Value - value data.Value -} - -func newUint64SliceValueFast(v []uint64) *uint64SliceValueFast { - var uint64Value uint64Value - return &uint64SliceValueFast{ - uint64Slice: v, - uint64Value: &uint64Value, - value: &uint64Value, - } -} - -func (v *uint64SliceValueFast) Kind() reflect.Kind { - return reflect.Slice -} - -func (v *uint64SliceValueFast) Len() int { - return len(v.uint64Slice) -} - -func (v *uint64SliceValueFast) Index(i int) data.Value { - v.uint64Value.value = v.uint64Slice[i] - // NB: This avoids the CPU cost of converting *uint64Value to data.Value. - return v.value -} - -func (v *uint64SliceValueFast) Interface() interface{} { - return v.uint64Slice -} diff --git a/vendor/github.com/ClickHouse/clickhouse-go/clickhouse_compress_test.go b/vendor/github.com/ClickHouse/clickhouse-go/clickhouse_compress_test.go deleted file mode 100644 index 57938ab499..0000000000 --- a/vendor/github.com/ClickHouse/clickhouse-go/clickhouse_compress_test.go +++ /dev/null @@ -1,154 +0,0 @@ -package clickhouse_test - -import ( - "database/sql" - "fmt" - "testing" - "time" - - "github.com/stretchr/testify/assert" -) - -func Test_Compress(t *testing.T) { - const ( - ddl = ` - CREATE TABLE clickhouse_test_compress ( - int8 Int8, - int16 Int16, - int32 Int32, - int64 Int64, - uint8 UInt8, - uint16 UInt16, - uint32 UInt32, - uint64 UInt64, - float32 Float32, - float64 Float64, - string String, - fString FixedString(2), - date Date, - datetime DateTime - ) Engine=Memory - ` - dml = ` - INSERT INTO clickhouse_test_compress ( - int8, - int16, - int32, - int64, - uint8, - uint16, - uint32, - uint64, - float32, - float64, - string, - fString, - date, - datetime - ) VALUES ( - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ? - ) - ` - query = ` - SELECT - int8, - int16, - int32, - int64, - uint8, - uint16, - uint32, - uint64, - float32, - float64, - string, - fString, - date, - datetime - FROM clickhouse_test_compress - ` - ) - if connect, err := sql.Open("clickhouse", "tcp://127.0.0.1:9000?debug=true&compress=1"); assert.NoError(t, err) && assert.NoError(t, connect.Ping()) { - if _, err := connect.Exec("DROP TABLE IF EXISTS clickhouse_test_compress"); assert.NoError(t, err) { - if _, err := connect.Exec(ddl); assert.NoError(t, err) { - if tx, err := connect.Begin(); assert.NoError(t, err) { - if stmt, err := tx.Prepare(dml); assert.NoError(t, err) { - for i := 1; i <= 10; i++ { - _, err = stmt.Exec( - -1*i, -2*i, -4*i, -8*i, // int - uint8(1*i), uint16(2*i), uint32(4*i), uint64(8*i), // uint - 1.32*float32(i), 1.64*float64(i), //float - fmt.Sprintf("string %d", i), // string - "RU", //fixedstring, - time.Now(), //date - time.Now(), //datetime - ) - if !assert.NoError(t, err) { - return - } - } - } else { - return - } - if assert.NoError(t, tx.Commit()) { - var item struct { - Int8 int8 - Int16 int16 - Int32 int32 - Int64 int64 - UInt8 uint8 - UInt16 uint16 - UInt32 uint32 - UInt64 uint64 - Float32 float32 - Float64 float64 - String string - FixedString string - Date time.Time - DateTime time.Time - } - if rows, err := connect.Query(query); assert.NoError(t, err) { - var count int - for rows.Next() { - count++ - err := rows.Scan( - &item.Int8, - &item.Int16, - &item.Int32, - &item.Int64, - &item.UInt8, - &item.UInt16, - &item.UInt32, - &item.UInt64, - &item.Float32, - &item.Float64, - &item.String, - &item.FixedString, - &item.Date, - &item.DateTime, - ) - if !assert.NoError(t, err) { - return - } - } - assert.Equal(t, int(10), count) - } - } - } - } - } - } -} diff --git a/vendor/github.com/ClickHouse/clickhouse-go/clickhouse_custom_types_test.go b/vendor/github.com/ClickHouse/clickhouse-go/clickhouse_custom_types_test.go deleted file mode 100644 index 783b265b9c..0000000000 --- a/vendor/github.com/ClickHouse/clickhouse-go/clickhouse_custom_types_test.go +++ /dev/null @@ -1,221 +0,0 @@ -package clickhouse_test - -import ( - "database/sql" - "database/sql/driver" - "fmt" - "testing" - - "github.com/stretchr/testify/assert" -) - -func Test_Custom_Types(t *testing.T) { - type ( - T_Int8 int8 - T_Int16 int16 - T_Int32 int32 - T_Int64 int64 - T_UInt8 uint8 - T_UInt16 uint16 - T_UInt32 uint32 - T_UInt64 uint64 - T_Float32 float32 - T_Float64 float64 - T_String string - T_FixedString string - ) - const ( - ddl = ` - CREATE TABLE clickhouse_test_custom_types ( - int8 Int8, - int16 Int16, - int32 Int32, - int64 Int64, - uint8 UInt8, - uint16 UInt16, - uint32 UInt32, - uint64 UInt64, - float32 Float32, - float64 Float64, - string String, - fString FixedString(2) - ) Engine=Memory - ` - dml = ` - INSERT INTO clickhouse_test_custom_types ( - int8, - int16, - int32, - int64, - uint8, - uint16, - uint32, - uint64, - float32, - float64, - string, - fString - ) VALUES ( - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ? - ) - ` - query = ` - SELECT - int8, - int16, - int32, - int64, - uint8, - uint16, - uint32, - uint64, - float32, - float64, - string, - fString - FROM clickhouse_test_custom_types - ` - ) - if connect, err := sql.Open("clickhouse", "tcp://127.0.0.1:9000?debug=true"); assert.NoError(t, err) && assert.NoError(t, connect.Ping()) { - if _, err := connect.Exec("DROP TABLE IF EXISTS clickhouse_test_custom_types"); assert.NoError(t, err) { - if _, err := connect.Exec(ddl); assert.NoError(t, err) { - if tx, err := connect.Begin(); assert.NoError(t, err) { - if stmt, err := tx.Prepare(dml); assert.NoError(t, err) { - for i := 1; i <= 10; i++ { - _, err = stmt.Exec( - T_Int8(-1*i), - T_Int16(-2*i), - T_Int32(-4*i), - T_Int64(-8*i), // int - T_UInt8(1*i), - T_UInt16(2*i), - T_UInt32(4*i), - T_UInt64(8*i), // uint - T_Float32(1.32*float32(i)), - T_Float64(1.64*float64(i)), //float - T_String(fmt.Sprintf("string %d", i)), // string - T_FixedString("RU"), //fixedstring, - - ) - if !assert.NoError(t, err) { - return - } - } - } else { - return - } - if assert.NoError(t, tx.Commit()) { - var item struct { - Int8 T_Int8 - Int16 T_Int16 - Int32 T_Int32 - Int64 T_Int64 - UInt8 T_UInt8 - UInt16 T_UInt16 - UInt32 T_UInt32 - UInt64 T_UInt64 - Float32 T_Float32 - Float64 T_Float64 - String T_String - FixedString T_FixedString - } - if rows, err := connect.Query(query); assert.NoError(t, err) { - var count int - for rows.Next() { - count++ - err := rows.Scan( - &item.Int8, - &item.Int16, - &item.Int32, - &item.Int64, - &item.UInt8, - &item.UInt16, - &item.UInt32, - &item.UInt64, - &item.Float32, - &item.Float64, - &item.String, - &item.FixedString, - ) - if !assert.NoError(t, err) { - return - } - } - assert.Equal(t, int(10), count) - } - } - } - } - } - } -} - -type PointType struct { - x int32 - y int32 - z int32 -} - -func (p PointType) Value() (driver.Value, error) { - return fmt.Sprintf("%v,%v,%v", p.x, p.y, p.z), nil -} - -func (p *PointType) Scan(v interface{}) error { - var src string - switch v := v.(type) { - case string: - src = v - case []byte: - src = string(v) - default: - return fmt.Errorf("unexpected type '%T'", v) - } - if _, err := fmt.Sscanf(src, "%d,%d,%d", &p.x, &p.y, &p.z); err != nil { - return err - } - return nil -} - -func Test_Scan_Value(t *testing.T) { - const ( - ddl = ` - CREATE TABLE clickhouse_test_scan_value ( - Value String - ) Engine = Memory - ` - ) - - point := PointType{1, 2, 3} - if connect, err := sql.Open("clickhouse", "tcp://127.0.0.1:9000?debug=true"); assert.NoError(t, err) && assert.NoError(t, connect.Ping()) { - if _, err := connect.Exec("DROP TABLE IF EXISTS clickhouse_test_scan_value"); assert.NoError(t, err) { - if _, err := connect.Exec(ddl); assert.NoError(t, err) { - if tx, err := connect.Begin(); assert.NoError(t, err) { - if stmt, err := tx.Prepare(`INSERT INTO clickhouse_test_scan_value VALUES (?)`); assert.NoError(t, err) { - if _, err = stmt.Exec(point); !assert.NoError(t, err) { - return - } - } else { - return - } - if assert.NoError(t, tx.Commit()) { - var p PointType - if err := connect.QueryRow(`SELECT Value FROM clickhouse_test_scan_value`).Scan(&p); assert.NoError(t, err) { - assert.Equal(t, point, p) - } - } - } - } - } - } -} diff --git a/vendor/github.com/ClickHouse/clickhouse-go/clickhouse_decimal128_test.go b/vendor/github.com/ClickHouse/clickhouse-go/clickhouse_decimal128_test.go deleted file mode 100644 index 239276d4cb..0000000000 --- a/vendor/github.com/ClickHouse/clickhouse-go/clickhouse_decimal128_test.go +++ /dev/null @@ -1,223 +0,0 @@ -package clickhouse_test - -import ( - "bytes" - "database/sql" - "database/sql/driver" - "encoding/binary" - "math" - "testing" - - "github.com/ClickHouse/clickhouse-go" - "github.com/stretchr/testify/assert" -) - -func Test_Decimal128(t *testing.T) { - const ( - ddl = ` - CREATE TABLE clickhouse_test_decimal128 ( - decimal Decimal(38,0), - decimalNullable Nullable(Decimal(38,0)) - ) Engine=Memory; - ` - dml = ` - INSERT INTO clickhouse_test_decimal128 ( - decimal, - decimalNullable - ) VALUES ( - ?, - ? - ) - ` - query = ` - SELECT - decimal, - decimalNullable - FROM clickhouse_test_decimal128 - ` - ) - - var ( - zero int64 = 0 - negativeOne int64 = -1 - minInt64 int64 = math.MinInt64 - maxInt64 int64 = math.MaxInt64 - ) - - minDecimal128 := getMinDecimal128Bytes() - maxDecimal128 := getMaxDecimal128Bytes() - - if connect, err := clickhouse.OpenDirect("tcp://127.0.0.1:9000?debug=true"); assert.NoError(t, err) { - { - connect.Begin() - stmt, _ := connect.Prepare("DROP TABLE IF EXISTS clickhouse_test_decimal128") - stmt.Exec([]driver.Value{}) - connect.Commit() - } - { - if _, err := connect.Begin(); assert.NoError(t, err) { - if stmt, err := connect.Prepare(ddl); assert.NoError(t, err) { - if _, err := stmt.Exec([]driver.Value{}); assert.NoError(t, err) { - assert.NoError(t, connect.Commit()) - } - } - } - } - { - if _, err := connect.Begin(); assert.NoError(t, err) { - if _, err := connect.Prepare(dml); assert.NoError(t, err) { - block, err := connect.Block() - assert.NoError(t, err) - - // 1. - err = block.AppendRow([]driver.Value{zero, nil}) - assert.NoError(t, err) - - // 2. - err = block.AppendRow([]driver.Value{negativeOne, &zero}) - assert.NoError(t, err) - - // 3. - err = block.AppendRow([]driver.Value{minInt64, &minInt64}) - assert.NoError(t, err) - - // 4. - err = block.AppendRow([]driver.Value{maxInt64, &maxInt64}) - assert.NoError(t, err) - - // 5. - err = block.AppendRow([]driver.Value{minDecimal128, &minDecimal128}) - assert.NoError(t, err) - - // 6. - err = block.AppendRow([]driver.Value{maxDecimal128, &maxDecimal128}) - assert.NoError(t, err) - - assert.NoError(t, connect.Commit()) - } - } - } - } - if connect, err := sql.Open("clickhouse", "tcp://127.0.0.1:9000?debug=true"); assert.NoError(t, err) { - if rows, err := connect.Query(query); assert.NoError(t, err) { - assert.NoError(t, err) - i := 0 - for rows.Next() { - i++ - var decimal []byte - var decimalNullable *[]byte = nil - - switch i { - case 1: - if err := rows.Scan( - &decimal, - &decimalNullable, - ); assert.NoError(t, err) { - assert.Equal(t, 0, bytes.Compare(int64ToDecimal128Bytes(zero), decimal)) - assert.Nil(t, decimalNullable) - } - - case 2: - if err := rows.Scan( - &decimal, - &decimalNullable, - ); assert.NoError(t, err) { - assert.Equal(t, 0, bytes.Compare(int64ToDecimal128Bytes(negativeOne), decimal)) - assert.Equal(t, 0, bytes.Compare(int64ToDecimal128Bytes(zero), *decimalNullable)) - } - - case 3: - if err := rows.Scan( - &decimal, - &decimalNullable, - ); assert.NoError(t, err) { - assert.Equal(t, 0, bytes.Compare(int64ToDecimal128Bytes(minInt64), decimal)) - assert.Equal(t, 0, bytes.Compare(int64ToDecimal128Bytes(minInt64), *decimalNullable)) - } - - case 4: - if err := rows.Scan( - &decimal, - &decimalNullable, - ); assert.NoError(t, err) { - assert.Equal(t, 0, bytes.Compare(int64ToDecimal128Bytes(maxInt64), decimal)) - assert.Equal(t, 0, bytes.Compare(int64ToDecimal128Bytes(maxInt64), *decimalNullable)) - } - - case 5: - if err := rows.Scan( - &decimal, - &decimalNullable, - ); assert.NoError(t, err) { - assert.Equal(t, 0, bytes.Compare(minDecimal128, decimal)) - assert.Equal(t, 0, bytes.Compare(minDecimal128, *decimalNullable)) - } - - case 6: - if err := rows.Scan( - &decimal, - &decimalNullable, - ); assert.NoError(t, err) { - assert.Equal(t, 0, bytes.Compare(maxDecimal128, decimal)) - assert.Equal(t, 0, bytes.Compare(maxDecimal128, *decimalNullable)) - } - } - } - } - } -} - -// -99999999999999999999999999999999999999 -func getMinDecimal128Bytes() []byte { - return []byte{ - 0x01, - 0x00, - 0x00, - 0x00, - 0xc0, - 0xdd, - 0x75, - 0xf6, - 0x85, - 0x3b, - 0x79, - 0xa5, - 0x57, - 0xb3, - 0xc4, - 0xb4, - } -} - -// 99999999999999999999999999999999999999 -func getMaxDecimal128Bytes() []byte { - return []byte{ - 0xff, - 0xff, - 0xff, - 0xff, - 0x3f, - 0x22, - 0x8a, - 0x09, - 0x7a, - 0xc4, - 0x86, - 0x5a, - 0xa8, - 0x4c, - 0x3b, - 0x4b, - } -} - -func int64ToDecimal128Bytes(v int64) []byte { - bytes := make([]byte, 16) - sign := 0 - if v < 0 { - sign = -1 - } - binary.LittleEndian.PutUint64(bytes[:8], uint64(v)) - binary.LittleEndian.PutUint64(bytes[8:], uint64(sign)) - return bytes -} diff --git a/vendor/github.com/ClickHouse/clickhouse-go/clickhouse_decimal_test.go b/vendor/github.com/ClickHouse/clickhouse-go/clickhouse_decimal_test.go deleted file mode 100644 index dff4d6dd32..0000000000 --- a/vendor/github.com/ClickHouse/clickhouse-go/clickhouse_decimal_test.go +++ /dev/null @@ -1,97 +0,0 @@ -package clickhouse_test - -import ( - "database/sql" - "github.com/stretchr/testify/assert" - "testing" -) - -func Test_Decimal(t *testing.T) { - const ( - ddl = ` - CREATE TABLE clickhouse_test_nullable ( - decimal Decimal(18,5), - decimalNullable Nullable(Decimal(15,3)) - ) Engine=Memory; - ` - dml = ` - INSERT INTO clickhouse_test_nullable ( - decimal, - decimalNullable - ) VALUES ( - ?, - ? - ) - ` - query = ` - SELECT - decimal, - decimalNullable - FROM clickhouse_test_nullable - ` - ) - if connect, err := sql.Open("clickhouse", "tcp://127.0.0.1:9000?debug=true"); assert.NoError(t, err) { - if tx, err := connect.Begin(); assert.NoError(t, err) { - if _, err := connect.Exec("DROP TABLE IF EXISTS clickhouse_test_nullable"); assert.NoError(t, err) { - if _, err := tx.Exec(ddl); assert.NoError(t, err) { - if tx, err := connect.Begin(); assert.NoError(t, err) { - if stmt, err := tx.Prepare(dml); assert.NoError(t, err) { - for i := 0; i < 10; i++ { - if _, err := stmt.Exec( - 16.55, - nil, - ); !assert.NoError(t, err) { - t.Fatal(err) - } - } - } - if err := tx.Commit(); !assert.NoError(t, err) { - t.Fatal(err) - } - } - if rows, err := connect.Query(query); assert.NoError(t, err) { - columnTypes, err := rows.ColumnTypes() - assert.NoError(t, err) - for i, column := range columnTypes { - switch i { - case 0: - nullable, nullableOk := column.Nullable() - assert.False(t, nullable) - assert.True(t, nullableOk) - - precision, scale, ok := column.DecimalSize() - assert.Equal(t, int64(5), scale) - assert.Equal(t, int64(18), precision) - assert.True(t, ok) - case 1: - nullable, nullableOk := column.Nullable() - assert.True(t, nullable) - assert.True(t, nullableOk) - - precision, scale, ok := column.DecimalSize() - assert.Equal(t, int64(3), scale) - assert.Equal(t, int64(15), precision) - assert.True(t, ok) - } - } - for rows.Next() { - var ( - decimal = new(int) - decimalNullable = new(int) - ) - if err := rows.Scan( - &decimal, - &decimalNullable, - ); assert.NoError(t, err) { - if assert.NotNil(t, decimal) { - assert.Equal(t, int(1655000), *decimal) - } - assert.Nil(t, decimalNullable) - } - } - } - } - } - } - } -} diff --git a/vendor/github.com/ClickHouse/clickhouse-go/clickhouse_direct_test.go b/vendor/github.com/ClickHouse/clickhouse-go/clickhouse_direct_test.go deleted file mode 100644 index 0151edaf43..0000000000 --- a/vendor/github.com/ClickHouse/clickhouse-go/clickhouse_direct_test.go +++ /dev/null @@ -1,260 +0,0 @@ -package clickhouse_test - -import ( - "database/sql/driver" - "fmt" - - // "fmt" - "net" - "testing" - "time" - - "github.com/ClickHouse/clickhouse-go" - "github.com/ClickHouse/clickhouse-go/lib/column" - "github.com/ClickHouse/clickhouse-go/lib/types" - "github.com/stretchr/testify/assert" -) - -func Test_DirectInsert(t *testing.T) { - const ( - ddl = ` - CREATE TABLE clickhouse_test_direct_insert ( - int8 Int8, - int16 Int16, - int32 Int32, - int64 Int64, - uint8 UInt8, - uint16 UInt16, - uint32 UInt32, - uint64 UInt64, - float32 Float32, - float64 Float64, - string String, - fString FixedString(2), - date Date, - datetime DateTime, - enum8 Enum8 ('a' = 1, 'b' = 2), - enum16 Enum16('c' = 1, 'd' = 2), - uuid FixedString(16), - ip FixedString(16) - ) Engine=Memory - ` - dml = ` - INSERT INTO clickhouse_test_direct_insert ( - int8, - int16, - int32, - int64, - uint8, - uint16, - uint32, - uint64, - float32, - float64, - string, - fString, - date, - datetime, - enum8, - enum16, - uuid, - ip - ) VALUES ( - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ? - ) - ` - ) - if connect, err := clickhouse.Open("tcp://127.0.0.1:9000?debug=true"); assert.NoError(t, err) { - { - var ( - tx, _ = connect.Begin() - stmt, _ = connect.Prepare("DROP TABLE IF EXISTS clickhouse_test_direct_insert") - ) - stmt.Exec([]driver.Value{}) - tx.Commit() - } - { - if tx, err := connect.Begin(); assert.NoError(t, err) { - if stmt, err := connect.Prepare(ddl); assert.NoError(t, err) { - if _, err := stmt.Exec([]driver.Value{}); assert.NoError(t, err) { - assert.NoError(t, tx.Commit()) - } - } - } - } - { - if tx, err := connect.Begin(); assert.NoError(t, err) { - if stmt, err := connect.Prepare(dml); assert.NoError(t, err) { - for i := 0; i < 100; i++ { - _, err := stmt.Exec([]driver.Value{ - int8(i), - int16(i), - int32(i), - int64(i), - - uint8(i), - uint16(i), - uint32(i), - uint64(i), - - float32(i), - float64(i), - - "string", - "CH", - time.Now(), - time.Now(), - - "a", - "d", - - types.UUID("123e4567-e89b-12d3-a456-426655440000"), - column.IP(net.ParseIP("127.0.0.1")), - }) - if !assert.NoError(t, err) { - return - } - } - assert.NoError(t, tx.Commit()) - } - } - } - } -} - -func Test_DirectArrayT(t *testing.T) { - const ( - ddl = ` - CREATE TABLE clickhouse_test_direct_array ( - int8 Array(Int8), - int16 Array(Int16), - int32 Array(Int32), - int64 Array(Int64), - uint8 Array(UInt8), - uint16 Array(UInt16), - uint32 Array(UInt32), - uint64 Array(UInt64), - float32 Array(Float32), - float64 Array(Float64), - string Array(String), - fString Array(FixedString(2)), - date Array(Date), - datetime Array(DateTime), - enum8 Array(Enum8 ('a' = 1, 'b' = 2)), - enum16 Array(Enum16('c' = 1, 'd' = 2)), - ipv4 Array(IPv4), - ipv6 Array(IPv6) - ) Engine=Memory - ` - dml = ` - INSERT INTO clickhouse_test_direct_array ( - int8, - int16, - int32, - int64, - uint8, - uint16, - uint32, - uint64, - float32, - float64, - string, - fString, - date, - datetime, - enum8, - enum16, - ipv4, - ipv6 - ) VALUES ( - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ? - ) - ` - ) - - if connect, err := clickhouse.Open("tcp://127.0.0.1:9000?debug=true"); assert.NoError(t, err) { - { - var ( - tx, _ = connect.Begin() - stmt, _ = connect.Prepare("DROP TABLE IF EXISTS clickhouse_test_direct_array") - ) - stmt.Exec([]driver.Value{}) - tx.Commit() - } - { - if tx, err := connect.Begin(); assert.NoError(t, err) { - if stmt, err := connect.Prepare(ddl); assert.NoError(t, err) { - if _, err := stmt.Exec([]driver.Value{}); assert.NoError(t, err) { - assert.NoError(t, tx.Commit()) - } - } - } - } - { - if tx, err := connect.Begin(); assert.NoError(t, err) { - if stmt, err := connect.Prepare(dml); assert.NoError(t, err) { - for i := 0; i < 100; i++ { - _, err := stmt.Exec([]driver.Value{ - clickhouse.Array([]int8{1, 2, 3}), - clickhouse.Array([]int16{5, 6, 7}), - clickhouse.Array([]int32{8, 9, 10}), - clickhouse.Array([]int64{11, 12, 13}), - clickhouse.Array([]uint8{14, 15, 16}), - clickhouse.Array([]uint16{17, 18, 19}), - clickhouse.Array([]uint32{20, 21, 22}), - clickhouse.Array([]uint64{23, 24, 25}), - clickhouse.Array([]float32{32.1, 32.2}), - clickhouse.Array([]float64{64.1, 64.2}), - clickhouse.Array([]string{fmt.Sprintf("A_%d", i), "B", "C"}), - clickhouse.ArrayFixedString(2, []string{"RU", "EN", "DE"}), - clickhouse.ArrayDate([]time.Time{time.Now(), time.Now()}), - clickhouse.ArrayDateTime([]time.Time{time.Now(), time.Now()}), - clickhouse.Array([]string{"a", "b"}), - clickhouse.Array([]string{"c", "d"}), - clickhouse.Array([]string{"1.2.3.4", "2.2.3.4"}), - clickhouse.Array([]string{"2001:0db8:85a3:0000:0000:8a2e:0370:7334"}), - }) - if !assert.NoError(t, err) { - return - } - } - assert.NoError(t, tx.Commit()) - } - } - } - } -} diff --git a/vendor/github.com/ClickHouse/clickhouse-go/clickhouse_naive_test.go b/vendor/github.com/ClickHouse/clickhouse-go/clickhouse_naive_test.go deleted file mode 100644 index d8138759cb..0000000000 --- a/vendor/github.com/ClickHouse/clickhouse-go/clickhouse_naive_test.go +++ /dev/null @@ -1,27 +0,0 @@ -package clickhouse - -import ( - "fmt" - "testing" - - "github.com/stretchr/testify/assert" -) - -func Test_Naive_Result(t *testing.T) { - var result result - if _, err := result.LastInsertId(); assert.Error(t, err) { - if rows, err := result.RowsAffected(); assert.Error(t, err) { - assert.Equal(t, int64(0), rows) - } - } -} - -func Test_Naive_Exception(t *testing.T) { - exception := Exception{ - Code: 42, - Message: "test", - } - if assert.Implements(t, (*error)(nil), &exception) { - assert.Equal(t, fmt.Sprintf("code: %d, message: %s", exception.Code, exception.Message), exception.Error()) - } -} diff --git a/vendor/github.com/ClickHouse/clickhouse-go/clickhouse_negative_test.go b/vendor/github.com/ClickHouse/clickhouse-go/clickhouse_negative_test.go deleted file mode 100644 index f0519751b7..0000000000 --- a/vendor/github.com/ClickHouse/clickhouse-go/clickhouse_negative_test.go +++ /dev/null @@ -1,39 +0,0 @@ -package clickhouse_test - -import ( - "database/sql" - "testing" - - "github.com/ClickHouse/clickhouse-go" - "github.com/stretchr/testify/assert" -) - -func Test_Negative_OpenConnectAndPing(t *testing.T) { - if connect, err := sql.Open("clickhouse", ""); assert.NoError(t, err) { - assert.Error(t, connect.Ping()) - } - if connect, err := sql.Open("clickhouse", "tcp://127.0.0.1:10000"); assert.NoError(t, err) { - assert.Error(t, connect.Ping()) - } - if connect, err := sql.Open("clickhouse", "tcp://127.0.0.1:9000?username=invalid"); assert.NoError(t, err) { - if err := connect.Ping(); assert.Error(t, err) { - if exception, ok := err.(*clickhouse.Exception); assert.True(t, ok) { - assert.Truef(t, exception.Code == int32(192) || exception.Code == int32(516), "Not equal. Expected: 192 or 516. Actual: %n", exception.Code) - } - } - } - if connect, err := sql.Open("clickhouse", "tcp://127.0.0.1:9000?password=invalid"); assert.NoError(t, err) { - if err := connect.Ping(); assert.Error(t, err) { - if exception, ok := err.(*clickhouse.Exception); assert.True(t, ok) { - assert.Truef(t, exception.Code == int32(192) || exception.Code == int32(516), "Not equal. Expected: 192 or 516. Actual: %n", exception.Code) - } - } - } - if connect, err := sql.Open("clickhouse", "tcp://127.0.0.1:9000?database=invalid"); assert.NoError(t, err) { - if err := connect.Ping(); assert.Error(t, err) { - if exception, ok := err.(*clickhouse.Exception); assert.True(t, ok) { - assert.Equal(t, int32(81), exception.Code) - } - } - } -} diff --git a/vendor/github.com/ClickHouse/clickhouse-go/clickhouse_nullable_array_test.go b/vendor/github.com/ClickHouse/clickhouse-go/clickhouse_nullable_array_test.go deleted file mode 100644 index be4ce9a615..0000000000 --- a/vendor/github.com/ClickHouse/clickhouse-go/clickhouse_nullable_array_test.go +++ /dev/null @@ -1,262 +0,0 @@ -package clickhouse - -import ( - "database/sql" - "net" - - "github.com/stretchr/testify/assert" - - "testing" - "time" -) - -func Test_NullableArray(t *testing.T) { - const ( - ddl = ` - CREATE TABLE clickhouse_test_nullable_array - ( - arr_decimal Array(Nullable(Decimal(15, 3))), - arr_int8 Array(Nullable(Int8)), - arr_int16 Array(Nullable(Int16)), - arr_int32 Array(Nullable(Int32)), - arr_int64 Array(Nullable(Int64)), - arr_uint8 Array(Nullable(UInt8)), - arr_uint16 Array(Nullable(UInt16)), - arr_uint32 Array(Nullable(UInt32)), - arr_uint64 Array(Nullable(UInt64)), - arr_float32 Array(Nullable(Float32)), - arr_float64 Array(Nullable(Float64)), - arr_ipv6 Array(Nullable(IPv6)), - arr_ipv4 Array(Nullable(IPv4)), - arr_string Array(Nullable(String)), - arr_arr_string Array(Array(Nullable(String))), - arr_date Array(Nullable(Date)), - arr_datetime Array(Nullable(DateTime)), - arr_enum8_str Array(Nullable(Enum8('a8' = 1, 'b8' = 2))), - arr_enum8_int Array(Nullable(Enum8('a8' = 1, 'b8' = 2))), - arr_enum16_str Array(Nullable(Enum16('a16' = 1, 'b16' = 2))), - arr_enum16_int Array(Nullable(Enum16('a16' = 1, 'b16' = 2))) - ) Engine = Memory; - ` - dml = ` - INSERT INTO clickhouse_test_nullable_array (arr_decimal, - arr_int8, - arr_int16, - arr_int32, - arr_int64, - arr_uint8, - arr_uint16, - arr_uint32, - arr_uint64, - arr_float32, - arr_float64, - arr_ipv6, - arr_ipv4, - arr_string, - arr_arr_string, - arr_date, - arr_datetime, - arr_enum8_str, - arr_enum8_int, - arr_enum16_str, - arr_enum16_int) - VALUES (?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?); - ` - query = ` - SELECT - * - FROM clickhouse_test_nullable_array - ` - ) - - decV := 16.55 - int64Dec := int64(16550) - int8V := int8(123) - int16V := int16(1231) - int32V := int32(12312) - int64V := int64(123123) - - uint8V := uint8(123) - uint16V := uint16(1231) - uint32V := uint32(12312) - uint64V := uint64(123123) - - float32V := float32(123.123) - float64V := 123123.123123 - - stringV := "123123" - - ipv6V := net.ParseIP("2001:0db8:85a3:0000:0000:8a2e:0370:7334") - ipv4V := net.ParseIP("123.123.123.123") - - timeV, _ := time.Parse("2006-01-02 15:04:05", "2021-07-11 00:00:00") - dateV, _ := time.Parse("2006-01-02", "2021-07-11") - - enum8VA := "a8" - enum8VB := "b8" - - enum8V1 := int8(1) - enum8V2 := int8(2) - - enum16VA := "a16" - enum16VB := "b16" - - enum16V1 := int16(1) - enum16V2 := int16(2) - - var timeNil *time.Time - - if connect, err := sql.Open("clickhouse", "tcp://127.0.0.1:9000?debug=true"); assert.NoError(t, err) { - if tx, err := connect.Begin(); assert.NoError(t, err) { - if _, err := connect.Exec("DROP TABLE IF EXISTS clickhouse_test_nullable_array"); assert.NoError(t, err) { - if _, err := tx.Exec(ddl); assert.NoError(t, err) { - if tx, err := connect.Begin(); assert.NoError(t, err) { - stmt, err := tx.Prepare(dml) - if assert.NoError(t, err) { - for i := 0; i < 10; i++ { - if _, err := stmt.Exec( - []*float64{&decV, nil, &decV}, - []*int8{&int8V, nil, &int8V}, - []*int16{&int16V, nil, &int16V}, - []*int32{&int32V, nil, &int32V}, - []*int64{&int64V, nil, &int64V}, - - []*uint8{&uint8V, nil, &uint8V}, - []*uint16{&uint16V, nil, &uint16V}, - []*uint32{&uint32V, nil, &uint32V}, - []*uint64{&uint64V, nil, &uint64V}, - - []*float32{&float32V, nil, &float32V}, - []*float64{&float64V, nil, &float64V}, - - []*net.IP{&ipv6V, nil, &ipv6V}, - []*net.IP{&ipv4V, nil, &ipv4V}, - - []*string{&stringV, nil, &stringV}, - [][]*string{{&stringV, nil, &stringV}}, - - []*time.Time{&dateV, nil, &dateV}, - []*time.Time{&timeV, nil, &timeV}, - - []*string{&enum8VA, nil, &enum8VB}, - []*int8{&enum8V1, nil, &enum8V2}, - []*string{&enum16VA, nil, &enum16VB}, - []*int16{&enum16V1, nil, &enum16V2}, - ); !assert.NoError(t, err) { - t.Fatal(err) - } - } - } - if err := tx.Commit(); !assert.NoError(t, err) { - t.Fatal(err) - } - } - if rows, err := connect.Query(query); assert.NoError(t, err) { - for i := 0; i < 10; i++ { - rows.Next() - var ( - ArrDecimal = make([]*int64, 0) - ArrInt8 = make([]*int8, 0) - ArrInt16 = make([]*int16, 0) - ArrInt32 = make([]*int32, 0) - ArrInt64 = make([]*int64, 0) - ArrUInt8 = make([]*uint8, 0) - ArrUInt16 = make([]*uint16, 0) - ArrUInt32 = make([]*uint32, 0) - ArrUInt64 = make([]*uint64, 0) - ArrFloat32 = make([]*float32, 0) - ArrFloat64 = make([]*float64, 0) - ArrIpv6 = make([]*net.IP, 0) - ArrIpv4 = make([]*net.IP, 0) - ArrString = make([]*string, 0) - ArrArrString = make([][]*string, 0) - ArrDate = make([]*time.Time, 0) - ArrDateTime = make([]*time.Time, 0) - ArrEnum8Str = make([]*string, 0) - ArrEnum8Int8 = make([]*string, 0) - ArrEnum16Str = make([]*string, 0) - ArrEnum16Int16 = make([]*string, 0) - ) - if err := rows.Scan( - &ArrDecimal, - &ArrInt8, - &ArrInt16, - &ArrInt32, - &ArrInt64, - &ArrUInt8, - &ArrUInt16, - &ArrUInt32, - &ArrUInt64, - &ArrFloat32, - &ArrFloat64, - &ArrIpv6, - &ArrIpv4, - &ArrString, - &ArrArrString, - &ArrDate, - &ArrDateTime, - &ArrEnum8Str, - &ArrEnum8Int8, - &ArrEnum16Str, - &ArrEnum16Int16, - ); assert.NoError(t, err) { - assert.Equal(t, ArrDecimal, []*int64{&int64Dec, nil, &int64Dec}) - assert.Equal(t, ArrInt8, []*int8{&int8V, nil, &int8V}) - assert.Equal(t, ArrInt16, []*int16{&int16V, nil, &int16V}) - assert.Equal(t, ArrInt32, []*int32{&int32V, nil, &int32V}) - assert.Equal(t, ArrInt64, []*int64{&int64V, nil, &int64V}) - - assert.Equal(t, ArrUInt8, []*uint8{&uint8V, nil, &uint8V}) - assert.Equal(t, ArrUInt16, []*uint16{&uint16V, nil, &uint16V}) - assert.Equal(t, ArrUInt32, []*uint32{&uint32V, nil, &uint32V}) - assert.Equal(t, ArrUInt64, []*uint64{&uint64V, nil, &uint64V}) - - assert.Equal(t, ArrFloat32, []*float32{&float32V, nil, &float32V}) - assert.Equal(t, ArrFloat64, []*float64{&float64V, nil, &float64V}) - - assert.Equal(t, ArrIpv6, []*net.IP{&ipv6V, nil, &ipv6V}) - assert.Equal(t, ArrIpv4, []*net.IP{&ipv4V, nil, &ipv4V}) - - assert.Equal(t, ArrString, []*string{&stringV, nil, &stringV}) - assert.Equal(t, ArrArrString, [][]*string{{&stringV, nil, &stringV}}) - - assert.True(t, len(ArrDate) == 3) - assert.True(t, len(ArrDateTime) == 3) - assert.Equal(t, ArrDate[1], timeNil) - assert.Equal(t, ArrDateTime[1], timeNil) - - assert.Equal(t, ArrEnum8Int8, []*string{&enum8VA, nil, &enum8VB}) - assert.Equal(t, ArrEnum16Int16, []*string{&enum16VA, nil, &enum16VB}) - assert.Equal(t, ArrEnum8Str, []*string{&enum8VA, nil, &enum8VB}) - assert.Equal(t, ArrEnum16Str, []*string{&enum16VA, nil, &enum16VB}) - } else { - t.Fatal(err) - } - } - } else { - t.Fatal(err) - } - } - } - } - } -} diff --git a/vendor/github.com/ClickHouse/clickhouse-go/clickhouse_nullable_test.go b/vendor/github.com/ClickHouse/clickhouse-go/clickhouse_nullable_test.go deleted file mode 100644 index 9e82299bb4..0000000000 --- a/vendor/github.com/ClickHouse/clickhouse-go/clickhouse_nullable_test.go +++ /dev/null @@ -1,316 +0,0 @@ -package clickhouse_test - -import ( - "database/sql" - "testing" - "time" - - "github.com/stretchr/testify/assert" -) - -func Test_Nullable(t *testing.T) { - const ( - ddl = ` - CREATE TABLE clickhouse_test_nullable ( - int8 Nullable(Int8), - int16 Nullable(Int16), - int32 Nullable(Int32), - int64 Nullable(Int64), - uint8 Nullable(UInt8), - uint16 Nullable(UInt16), - uint32 Nullable(UInt32), - uint64 Nullable(UInt64), - float32 Nullable(Float32), - float64 Nullable(Float64), - string Nullable(String), - fString Nullable(FixedString(2)), - date Nullable(Date), - datetime Nullable(DateTime), - enum8 Nullable(Enum8 ('a' = 1, 'b' = 2)), - enum16 Nullable(Enum16('c' = 1, 'd' = 2)) - ) Engine=Memory; - ` - dml = ` - INSERT INTO clickhouse_test_nullable ( - int8, - int16, - int32, - int64, - uint8, - uint16, - uint32, - uint64, - float32, - float64, - string, - fString, - date, - datetime, - enum8, - enum16 - ) VALUES ( - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ? - ) - ` - query = ` - SELECT - int8, - int16, - int32, - int64, - uint8, - uint16, - uint32, - uint64, - float32, - float64, - string, - fString, - date, - datetime, - enum8, - enum16 - FROM clickhouse_test_nullable - ` - ) - if connect, err := sql.Open("clickhouse", "tcp://127.0.0.1:9000?debug=true"); assert.NoError(t, err) { - if tx, err := connect.Begin(); assert.NoError(t, err) { - if _, err := connect.Exec("DROP TABLE IF EXISTS clickhouse_test_nullable"); assert.NoError(t, err) { - if _, err := tx.Exec(ddl); assert.NoError(t, err) { - if tx, err := connect.Begin(); assert.NoError(t, err) { - if stmt, err := tx.Prepare(dml); assert.NoError(t, err) { - for i := 0; i < 10; i++ { - if _, err := stmt.Exec( - 8, - 16, - 32, - 64, - 18, - 116, - 132, - 165, - 1.1, - 2.2, - "RU", - "UA", - time.Now(), - time.Now(), - "a", - "c", - ); !assert.NoError(t, err) { - t.Fatal(err) - } - } - } - if err := tx.Commit(); !assert.NoError(t, err) { - t.Fatal(err) - } - } - if rows, err := connect.Query(query); assert.NoError(t, err) { - for rows.Next() { - var ( - Int8 = new(int8) - Int16 = new(int16) - Int32 = new(int32) - Int64 = new(int64) - UInt8 = new(uint8) - UInt16 = new(uint16) - UInt32 = new(uint32) - UInt64 = new(uint64) - Float32 = new(float32) - Float64 = new(float64) - String = new(string) - FString = new(string) - Date = new(time.Time) - DateTime = new(time.Time) - Enum8 = new(string) - Enum16 = new(string) - ) - if err := rows.Scan( - &Int8, - &Int16, - &Int32, - &Int64, - &UInt8, - &UInt16, - &UInt32, - &UInt64, - &Float32, - &Float64, - &String, - &FString, - &Date, - &DateTime, - &Enum8, - &Enum16, - ); assert.NoError(t, err) { - if assert.NotNil(t, Int8) { - assert.Equal(t, int8(8), *Int8) - } - if assert.NotNil(t, Int16) { - assert.Equal(t, int16(16), *Int16) - } - if assert.NotNil(t, Int32) { - assert.Equal(t, int32(32), *Int32) - } - if assert.NotNil(t, Int64) { - assert.Equal(t, int64(64), *Int64) - } - - if assert.NotNil(t, String) { - assert.Equal(t, "RU", *String) - } - if assert.NotNil(t, FString) { - assert.Equal(t, "UA", *FString) - } - t.Log( - *Int8, - *Int16, - *Int32, - *Int64, - *UInt8, - *UInt16, - *UInt32, - *UInt64, - *Float32, - *Float64, - *String, - *FString, - *Date, - *DateTime, - *Enum8, - *Enum16, - ) - } - } - } - } - } - } - } - - if connect, err := sql.Open("clickhouse", "tcp://127.0.0.1:9000?debug=true"); assert.NoError(t, err) { - if tx, err := connect.Begin(); assert.NoError(t, err) { - if _, err := connect.Exec("DROP TABLE IF EXISTS clickhouse_test_nullable"); assert.NoError(t, err) { - if _, err := tx.Exec(ddl); assert.NoError(t, err) { - if tx, err := connect.Begin(); assert.NoError(t, err) { - if stmt, err := tx.Prepare(dml); assert.NoError(t, err) { - if _, err := stmt.Exec( - new(int8), - 16, - new(int32), - 64, - 18, - 116, - 132, - 165, - 1.1, - 2.2, - nil, - "UA", - time.Now(), - time.Now(), - "a", - "c", - ); !assert.NoError(t, err) { - t.Fatal(err) - } - } - if err := tx.Commit(); !assert.NoError(t, err) { - t.Fatal(err) - } - } - if rows, err := connect.Query(query); assert.NoError(t, err) { - if assert.True(t, rows.Next()) { - var ( - Int8 = new(int8) - Int16 = new(int16) - Int32 = new(int32) - Int64 = new(int64) - UInt8 = new(uint8) - UInt16 = new(uint16) - UInt32 = new(uint32) - UInt64 = new(uint64) - Float32 = new(float32) - Float64 = new(float64) - String = new(string) - FString = new(string) - Date = new(time.Time) - DateTime = new(time.Time) - Enum8 = new(string) - Enum16 = new(string) - ) - if err := rows.Scan( - &Int8, - &Int16, - &Int32, - &Int64, - &UInt8, - &UInt16, - &UInt32, - &UInt64, - &Float32, - &Float64, - &String, - &FString, - &Date, - &DateTime, - &Enum8, - &Enum16, - ); assert.NoError(t, err) { - if assert.NotNil(t, Int8) { - if assert.Equal(t, int8(0), *Int8) && assert.NotNil(t, Int16) { - assert.Equal(t, int16(16), *Int16) - } - } - if assert.NotNil(t, Int32) { - if assert.Equal(t, int32(0), *Int32) && assert.NotNil(t, Int64) { - assert.Equal(t, int64(64), *Int64) - } - } - if assert.Nil(t, String) { - if assert.NotNil(t, FString) { - assert.Equal(t, "UA", *FString) - } - } - t.Log( - Int8, - *Int16, - Int32, - *Int64, - *UInt8, - *UInt16, - *UInt32, - *UInt64, - *Float32, - *Float64, - String, - *FString, - *Date, - *DateTime, - *Enum8, - *Enum16, - ) - } - } - } - } - } - } - } -} diff --git a/vendor/github.com/ClickHouse/clickhouse-go/clickhouse_test.go b/vendor/github.com/ClickHouse/clickhouse-go/clickhouse_test.go deleted file mode 100644 index 411c6f357f..0000000000 --- a/vendor/github.com/ClickHouse/clickhouse-go/clickhouse_test.go +++ /dev/null @@ -1,2231 +0,0 @@ -package clickhouse_test - -import ( - "context" - "crypto/tls" - "database/sql" - "database/sql/driver" - "fmt" - "net" - "reflect" - "strings" - "testing" - "time" - - "github.com/ClickHouse/clickhouse-go" - "github.com/ClickHouse/clickhouse-go/lib/column" - "github.com/ClickHouse/clickhouse-go/lib/types" - "github.com/stretchr/testify/assert" -) - -const ( - tlsName = "default_tls" -) - -func Test_OpenConnectAndPing(t *testing.T) { - if connect, err := sql.Open("clickhouse", "tcp://127.0.0.1:9000?debug=true"); assert.NoError(t, err) { - assert.NoError(t, connect.Ping()) - } -} - -func Test_RegisterTLSConfig(t *testing.T) { - tlsConfig := &tls.Config{} - - connect, err := sql.Open("clickhouse", "tcp://127.0.0.1:9000?debug=true&tls_config="+tlsName) - assert.NoError(t, err) - assert.EqualError(t, connect.Ping(), "invalid tls_config - no config registered under name default_tls") - - err = clickhouse.RegisterTLSConfig(tlsName, tlsConfig) - assert.NoError(t, err) - - connect, err = sql.Open("clickhouse", "tcp://127.0.0.1:9000?debug=true&secure=false&tls_config="+tlsName) - assert.NoError(t, err) - assert.NoError(t, connect.Ping()) - - connect, err = sql.Open("clickhouse", "tcp://127.0.0.1:9000?debug=true&tls_config="+tlsName) - assert.NoError(t, err) - assert.EqualError(t, connect.Ping(), "tls: first record does not look like a TLS handshake") - - clickhouse.DeregisterTLSConfig(tlsName) - - connect, err = sql.Open("clickhouse", "tcp://127.0.0.1:9000?debug=true&tls_config="+tlsName) - assert.NoError(t, err) - assert.EqualError(t, connect.Ping(), "invalid tls_config - no config registered under name default_tls") -} - -func Test_CreateTable(t *testing.T) { - const ddl = ` - CREATE TABLE clickhouse_test_create_table ( - click_id FixedString(64), - click_time DateTime - ) Engine=Memory - ` - if connect, err := sql.Open("clickhouse", "tcp://127.0.0.1:9000?debug=true"); assert.NoError(t, err) { - if _, err := connect.Exec("DROP TABLE IF EXISTS clickhouse_test_create_table"); assert.NoError(t, err) { - if _, err := connect.Exec(ddl); assert.NoError(t, err) { - if _, err := connect.Exec(ddl); assert.Error(t, err) { - if exception, ok := err.(*clickhouse.Exception); assert.True(t, ok) { - assert.Equal(t, int32(57), exception.Code) - } - } - } - } - } -} - -func Test_Insert(t *testing.T) { - const ( - ddl = ` - CREATE TABLE clickhouse_test_insert ( - int8 Int8, - int16 Int16, - int32 Int32, - int64 Int64, - uint8 UInt8, - uint16 UInt16, - uint32 UInt32, - uint64 UInt64, - float32 Float32, - float64 Float64, - string String, - fString FixedString(2), - date Date, - datetime DateTime, - datetime64 DateTime64, - ipv4 IPv4, - ipv6 IPv6, - ipv4str FixedString(16), - ipv6str FixedString(16) - ) Engine=Memory - ` - dml = ` - INSERT INTO clickhouse_test_insert ( - int8, - int16, - int32, - int64, - uint8, - uint16, - uint32, - uint64, - float32, - float64, - string, - fString, - date, - datetime, - datetime64, - ipv4, - ipv6, - ipv4str, - ipv6str - ) VALUES ( - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ? - ) - ` - query = ` - SELECT - int8, - int16, - int32, - int64, - uint8, - uint16, - uint32, - uint64, - float32, - float64, - string, - fString, - date, - datetime, - datetime64, - ipv4, - ipv6, - ipv4str, - ipv6str - FROM clickhouse_test_insert - ` - ) - if connect, err := sql.Open("clickhouse", "tcp://127.0.0.1:9000?debug=true"); assert.NoError(t, err) && assert.NoError(t, connect.Ping()) { - if _, err := connect.Exec("DROP TABLE IF EXISTS clickhouse_test_insert"); assert.NoError(t, err) { - if _, err := connect.Exec(ddl); assert.NoError(t, err) { - if tx, err := connect.Begin(); assert.NoError(t, err) { - if stmt, err := tx.Prepare(dml); assert.NoError(t, err) { - for i := 1; i <= 10; i++ { - _, err = stmt.Exec( - -1*i, -2*i, -4*i, -8*i, // int - uint8(1*i), uint16(2*i), uint32(4*i), uint64(8*i), // uint - 1.32*float32(i), 1.64*float64(i), //float - fmt.Sprintf("string %d", i), // string - "RU", //fixedstring, - time.Now(), //date - time.Now(), //datetime - time.Now(), //datetime64 - "1.2.3.4", // ipv4 - "2001:0db8:85a3:0000:0000:8a2e:0370:7334", //ipv6 - column.IP(net.ParseIP("127.0.0.1").To4()), - column.IP(net.ParseIP("2001:0db8:85a3:0000:0000:8a2e:0370:7334")), - ) - if !assert.NoError(t, err) { - return - } - } - } else { - return - } - if assert.NoError(t, tx.Commit()) { - var item struct { - Int8 int8 - Int16 int16 - Int32 int32 - Int64 int64 - UInt8 uint8 - UInt16 uint16 - UInt32 uint32 - UInt64 uint64 - Float32 float32 - Float64 float64 - String string - FixedString string - Date time.Time - DateTime time.Time - DateTime64 time.Time - Ipv6 column.IP - Ipv4 column.IP - Ipv4str column.IP - Ipv6str column.IP - } - if rows, err := connect.Query(query); assert.NoError(t, err) { - var count int - for rows.Next() { - count++ - err := rows.Scan( - &item.Int8, - &item.Int16, - &item.Int32, - &item.Int64, - &item.UInt8, - &item.UInt16, - &item.UInt32, - &item.UInt64, - &item.Float32, - &item.Float64, - &item.String, - &item.FixedString, - &item.Date, - &item.DateTime, - &item.DateTime64, - &item.Ipv4, - &item.Ipv6, - &item.Ipv4str, - &item.Ipv6str, - ) - if !assert.NoError(t, err) { - return - } - } - assert.Equal(t, int(10), count) - } - } - } - } - } - } -} - -func Test_InsertBatch(t *testing.T) { - const ( - ddl = ` - CREATE TABLE clickhouse_test_insert_batch ( - int8 Int8, - int16 Int16, - int32 Int32, - int64 Int64, - uint8 UInt8, - uint16 UInt16, - uint32 UInt32, - uint64 UInt64, - float32 Float32, - float64 Float64, - string String, - fString FixedString(2), - date Date, - datetime DateTime, - arrayString Array(String) - ) Engine=Memory - ` - dml = ` - INSERT INTO clickhouse_test_insert_batch ( - int8, - int16, - int32, - int64, - uint8, - uint16, - uint32, - uint64, - float32, - float64, - string, - fString, - date, - datetime, - arrayString - ) VALUES ( - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ? - ) - ` - query = `SELECT COUNT(*) FROM clickhouse_test_insert_batch` - ) - if connect, err := sql.Open("clickhouse", "tcp://127.0.0.1:9000?debug=true&block_size=11"); assert.NoError(t, err) && assert.NoError(t, connect.Ping()) { - if _, err := connect.Exec("DROP TABLE IF EXISTS clickhouse_test_insert_batch"); assert.NoError(t, err) { - if _, err := connect.Exec(ddl); assert.NoError(t, err) { - if tx, err := connect.Begin(); assert.NoError(t, err) { - if stmt, err := tx.Prepare(dml); assert.NoError(t, err) { - for i := 1; i <= 1000; i++ { - _, err = stmt.Exec( - -1*i, -2*i, -4*i, -8*i, // int - uint8(1*i), uint16(2*i), uint32(4*i), uint64(8*i), // uint - 1.32*float32(i), 1.64*float64(i), //float - fmt.Sprintf("string %d ", i), // string - "RU", //fixedstring, - time.Now(), //date - time.Now(), //datetime - []string{"A", "B", "C"}, - ) - if !assert.NoError(t, err) { - return - } - } - } - if assert.NoError(t, tx.Commit()) { - if rows, err := connect.Query(query); assert.NoError(t, err) { - var count int - for rows.Next() { - err := rows.Scan(&count) - if !assert.NoError(t, err) { - return - } - } - assert.Equal(t, int(1000), count) - } - } - } - } - } - } -} - -func Test_Select(t *testing.T) { - const ( - ddl = ` - CREATE TABLE clickhouse_test_select ( - id Int32, - code FixedString(2), - date Date, - datetime DateTime - ) Engine=Memory - ` - dml = ` - INSERT INTO clickhouse_test_select VALUES (?, ?, ?, ?) - ` - ) - - if connect, err := sql.Open("clickhouse", "tcp://127.0.0.1:9000?debug=true"); assert.NoError(t, err) && assert.NoError(t, connect.Ping()) { - if _, err := connect.Exec("DROP TABLE IF EXISTS clickhouse_test_select"); assert.NoError(t, err) { - if _, err := connect.Exec(ddl); assert.NoError(t, err) { - if tx, err := connect.Begin(); assert.NoError(t, err) { - if stmt, err := tx.Prepare(dml); assert.NoError(t, err) { - if _, err := stmt.Exec(1, "RU", types.Date(time.Date(2017, 1, 20, 0, 0, 0, 0, time.Local)), time.Date(2017, 1, 20, 13, 0, 0, 0, time.Local)); !assert.NoError(t, err) { - return - } - if _, err := stmt.Exec(2, "UA", time.Date(2017, 1, 20, 0, 0, 0, 0, time.UTC), time.Date(2017, 1, 20, 14, 0, 0, 0, time.Local)); !assert.NoError(t, err) { - return - } - if _, err := stmt.Exec(3, "DE", time.Date(2017, 1, 19, 0, 0, 0, 0, time.UTC), time.Date(2017, 1, 20, 14, 0, 0, 0, time.Local)); !assert.NoError(t, err) { - return - } - if _, err := stmt.Exec(4, "US", time.Date(2017, 1, 19, 0, 0, 0, 0, time.UTC), time.Date(2017, 1, 20, 13, 0, 0, 0, time.Local)); !assert.NoError(t, err) { - return - } - if assert.NoError(t, tx.Commit()) { - if row := connect.QueryRow("SELECT COUNT(*) FROM clickhouse_test_select"); assert.NotNil(t, row) { - var count int - if err := row.Scan(&count); assert.NoError(t, err) { - assert.Equal(t, int(4), count) - } - } - if row := connect.QueryRow("SELECT COUNT(*) FROM clickhouse_test_select WHERE date = ?", time.Date(2017, 1, 20, 0, 0, 0, 0, time.UTC)); assert.NotNil(t, row) { - var count int - if err := row.Scan(&count); assert.NoError(t, err) { - assert.Equal(t, int(2), count) - } - } - if row := connect.QueryRow("SELECT COUNT(*) FROM clickhouse_test_select WHERE datetime = ?", time.Date(2017, 1, 20, 14, 0, 0, 0, time.Local)); assert.NotNil(t, row) { - var count int - if err := row.Scan(&count); assert.NoError(t, err) { - assert.Equal(t, int(2), count) - } - } - if row := connect.QueryRow("SELECT COUNT(*) FROM clickhouse_test_select WHERE id IN (?, ?, ?)", 1, 3, 4); assert.NotNil(t, row) { - var count int - if err := row.Scan(&count); assert.NoError(t, err) { - assert.Equal(t, int(3), count) - } - } - if row := connect.QueryRow("SELECT COUNT(*) FROM clickhouse_test_select WHERE code IN (?, ?, ?)", "US", "DE", "RU"); assert.NotNil(t, row) { - var count int - if err := row.Scan(&count); assert.NoError(t, err) { - assert.Equal(t, int(3), count) - } - } - if row := connect.QueryRow("SELECT COUNT(*) FROM clickhouse_test_select WHERE id BETWEEN ? AND ?", 0, 3); assert.NotNil(t, row) { - var count int - if err := row.Scan(&count); assert.NoError(t, err) { - assert.Equal(t, int(3), count) - } - } - if rows, err := connect.Query("SELECT id FROM clickhouse_test_select ORDER BY id LIMIT ?", 1); assert.NoError(t, err) { - i := 0 - for rows.Next() { - var ( - id int32 - ) - if err := rows.Scan(&id); assert.NoError(t, err) { - if i == 0 { - assert.Equal(t, id, int32(1)) - } else { - t.Error("Should return exactly one record") - } - } - i++ - } - rows.Close() - } - if rows, err := connect.Query("SELECT id FROM clickhouse_test_select ORDER BY id LIMIT ?,?", 1, 2); assert.NoError(t, err) { - i := 0 - for rows.Next() { - var ( - id int32 - ) - if err := rows.Scan(&id); assert.NoError(t, err) { - if i == 0 { - assert.Equal(t, id, int32(2)) - } else if i == 1 { - assert.Equal(t, id, int32(3)) - } else { - t.Error("Should return exactly two records") - } - } - i++ - } - rows.Close() - } - if rows, err := connect.Query("SELECT id FROM clickhouse_test_select ORDER BY id LIMIT ? OFFSET ?", 2, 1); assert.NoError(t, err) { - i := 0 - for rows.Next() { - var ( - id int32 - ) - if err := rows.Scan(&id); assert.NoError(t, err) { - if i == 0 { - assert.Equal(t, id, int32(2)) - } else if i == 1 { - assert.Equal(t, id, int32(3)) - } else { - t.Error("Should return exactly two records") - } - } - i++ - } - rows.Close() - } - } - - { - row1 := connect.QueryRow("SELECT COUNT(*) /* ROW1 */ FROM clickhouse_test_select WHERE date = ?", time.Date(2017, 1, 20, 0, 0, 0, 0, time.UTC)) - row2 := connect.QueryRow("SELECT COUNT(*) /* ROW2 */ FROM clickhouse_test_select WHERE datetime = ?", time.Date(2017, 1, 20, 14, 0, 0, 0, time.Local)) - - if assert.NotNil(t, row2) { - var count int - if err := row2.Scan(&count); assert.NoError(t, err) { - assert.Equal(t, int(2), count) - } - } - - if assert.NotNil(t, row1) { - var count int - if err := row1.Scan(&count); assert.NoError(t, err) { - assert.Equal(t, int(2), count) - } - } - } - } - } - } - } - } -} - -func Test_SimpleSelect(t *testing.T) { - if connect, err := sql.Open("clickhouse", "tcp://127.0.0.1:9000?debug=true"); assert.NoError(t, err) && assert.NoError(t, connect.Ping()) { - if rows, err := connect.Query("SELECT a FROM (SELECT 1 AS a UNION ALL SELECT 2 AS a UNION ALL SELECT 3 AS a) ORDER BY a ASC"); assert.NoError(t, err) { - defer rows.Close() - var cnt int - for rows.Next() { - cnt++ - var value int - if assert.NoError(t, rows.Scan(&value)) { - assert.Equal(t, cnt, value) - } - } - assert.Equal(t, int(3), cnt) - } - if row := connect.QueryRow("SELECT min(a) FROM (SELECT 1 AS a UNION ALL SELECT 2 AS a UNION ALL SELECT 3 AS a)"); assert.NotNil(t, row) { - var min int64 - if assert.NoError(t, row.Scan(&min)) { - assert.Equal(t, int64(1), min) - } - } - if row := connect.QueryRow("SELECT max(a) FROM (SELECT 1 AS a UNION ALL SELECT 2 AS a UNION ALL SELECT 3 AS a)"); assert.NotNil(t, row) { - var max int64 - if assert.NoError(t, row.Scan(&max)) { - assert.Equal(t, int64(3), max) - } - } - if row := connect.QueryRow("SELECT sum(a) FROM (SELECT 1 AS a UNION ALL SELECT 2 AS a UNION ALL SELECT 3 AS a)"); assert.NotNil(t, row) { - var sum int64 - if assert.NoError(t, row.Scan(&sum)) { - assert.Equal(t, int64(6), sum) - } - } - if row := connect.QueryRow("SELECT median(a) FROM (SELECT 1 AS a UNION ALL SELECT 2 AS a UNION ALL SELECT 3 AS a)"); assert.NotNil(t, row) { - var median float64 - if assert.NoError(t, row.Scan(&median)) { - assert.Equal(t, float64(2), median) - } - } - } -} - -func Test_ArrayT(t *testing.T) { - const ( - ddl = ` - CREATE TABLE clickhouse_test_array ( - int8 Array(Int8), - int16 Array(Int16), - int32 Array(Int32), - int64 Array(Int64), - uint8 Array(UInt8), - uint16 Array(UInt16), - uint32 Array(UInt32), - uint64 Array(UInt64), - float32 Array(Float32), - float64 Array(Float64), - string Array(String), - fString Array(FixedString(2)), - date Array(Date), - datetime Array(DateTime), - enum8 Array(Enum8 ('a' = 1, 'b' = 2)), - enum16 Array(Enum16('c' = 1, 'd' = 2)), - ipv4 Array(IPv4), - ipv6 Array(IPv6) - ) Engine=Memory - ` - dml = ` - INSERT INTO clickhouse_test_array ( - int8, - int16, - int32, - int64, - uint8, - uint16, - uint32, - uint64, - float32, - float64, - string, - fString, - date, - datetime, - enum8, - enum16, - ipv4, - ipv6 - ) VALUES ( - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ? - ?, - ?, - ?, - ?, - ?, - ? - ) - ` - query = ` - SELECT - int8, - int16, - int32, - int64, - uint8, - uint16, - uint32, - uint64, - float32, - float64, - string, - fString, - date, - datetime, - ipv4, - ipv6 - FROM clickhouse_test_array - ` - ) - if connect, err := sql.Open("clickhouse", "tcp://127.0.0.1:9000?debug=true"); assert.NoError(t, err) && assert.NoError(t, connect.Ping()) { - if _, err := connect.Exec("DROP TABLE IF EXISTS clickhouse_test_array"); assert.NoError(t, err) { - if _, err := connect.Exec(ddl); assert.NoError(t, err) { - if tx, err := connect.Begin(); assert.NoError(t, err) { - if stmt, err := tx.Prepare(dml); assert.NoError(t, err) { - for i := 1; i <= 10; i++ { - _, err = stmt.Exec( - []int8{1, 2, 3}, - []int16{5, 6, 7}, - []int32{8, 9, 10}, - []int64{11, 12, 13}, - clickhouse.Array([]uint8{14, 15, 16}), - []uint16{17, 18, 19}, - []uint32{20, 21, 22}, - []uint64{23, 24, 25}, - []float32{32.1, 32.2}, - []float64{64.1, 64.2}, - []string{fmt.Sprintf("A_%d", i), "B", "C"}, - []string{"RU", "EN", "DE"}, - []time.Time{time.Now(), time.Now()}, - []time.Time{time.Now(), time.Now()}, - []string{"a", "b"}, - []string{"c", "d"}, - []string{"127.0.0.1", "1.2.3.4"}, - []string{"2001:0db8:85a3:0000:0000:8a2e:0370:7334"}, - ) - if !assert.NoError(t, err) { - return - } - _, err = stmt.Exec( - []int8{100, 101, 102, 103, 104, 105}, - []int16{200, 201}, - []int32{300, 301, 302, 303}, - []int64{400, 401, 402}, - clickhouse.Array([]uint8{250, 251, 252, 253, 254}), - []uint16{1000, 1001, 1002, 1003, 1004}, - []uint32{2001, 2002}, - []uint64{3000}, - []float32{1000.1, 100.1, 2000}, - []float64{640, 8, 650.9, 703.5, 800}, - []string{fmt.Sprintf("D_%d", i), "E", "F", "G"}, - []string{"UA", "GB"}, - []time.Time{time.Now(), time.Now(), time.Now(), time.Now()}, - []time.Time{time.Now(), time.Now()}, - []string{"a", "b"}, - []string{"c", "d"}, - []string{"127.0.0.1", "1.2.3.4"}, - []string{"2001:0db8:85a3:0000:0000:8a2e:0370:7334"}, - ) - if !assert.NoError(t, err) { - return - } - } - } - if assert.NoError(t, tx.Commit()) { - var item struct { - Int8 []int8 - Int16 []int16 - Int32 []int32 - Int64 []int64 - UInt8 []uint8 - UInt16 []uint16 - UInt32 []uint32 - UInt64 []uint64 - Float32 []float32 - Float64 []float64 - String []string - FixedString []string - Date []time.Time - DateTime []time.Time - Ipv4 []column.IP - Ipv6 []column.IP - } - if rows, err := connect.Query(query); assert.NoError(t, err) { - var count int - for rows.Next() { - count++ - err := rows.Scan( - &item.Int8, - &item.Int16, - &item.Int32, - &item.Int64, - &item.UInt8, - &item.UInt16, - &item.UInt32, - &item.UInt64, - &item.Float32, - &item.Float64, - &item.String, - &item.FixedString, - &item.Date, - &item.DateTime, - &item.Ipv4, - &item.Ipv6, - ) - if !assert.NoError(t, err) { - return - } - t.Logf("Int8=%v, Int16=%v, Int32=%v, Int64=%v", - item.Int8, - item.Int16, - item.Int32, - item.Int64, - ) - t.Logf("UInt8=%v, UInt16=%v, UInt32=%v, UInt64=%v", - item.UInt8, - item.UInt16, - item.UInt32, - item.UInt64, - ) - t.Logf("Float32=%v, Float64=%v", - item.Float32, - item.Float64, - ) - t.Logf("String=%v, FixedString=%v", - item.String, - item.FixedString, - ) - t.Logf("Date=%v, DateTime=%v", - item.Date, - item.DateTime, - ) - t.Logf("Ipv4=%v, Ipv6=%v", - item.Ipv4, - item.Ipv6, - ) - } - assert.Equal(t, int(20), count) - } - } - } - } - } - } -} - -func Test_Insert_FixedString(t *testing.T) { - const ( - ddl = ` - CREATE TABLE clickhouse_test_fixed_string ( - str2 FixedString(2), - str5 FixedString(5), - str10 FixedString(10) - ) Engine=Memory - ` - dml = `INSERT INTO clickhouse_test_fixed_string VALUES (?, ?, ?)` - query = `SELECT str2, str5, str10 FROM clickhouse_test_fixed_string` - ) - if connect, err := sql.Open("clickhouse", "tcp://127.0.0.1:9000?debug=true"); assert.NoError(t, err) && assert.NoError(t, connect.Ping()) { - if _, err := connect.Exec("DROP TABLE IF EXISTS clickhouse_test_fixed_string"); assert.NoError(t, err) { - if _, err := connect.Exec(ddl); assert.NoError(t, err) { - if tx, err := connect.Begin(); assert.NoError(t, err) { - if stmt, err := tx.Prepare(dml); assert.NoError(t, err) { - if _, err := stmt.Exec(strings.Repeat("a", 2), strings.Repeat("b", 5), strings.Repeat("c", 10)); assert.NoError(t, err) { - if _, err := stmt.Exec("A", "B", "C"); assert.NoError(t, err) { - assert.NoError(t, tx.Commit()) - } - } - } - } - } - } - } -} - -func Test_With_Totals(t *testing.T) { - const ( - ddl = ` - CREATE TABLE clickhouse_test_with_totals ( - country FixedString(2) - ) Engine=Memory - ` - dml = `INSERT INTO clickhouse_test_with_totals (country) VALUES (?)` - query = ` - SELECT - country, - COUNT(*) - FROM clickhouse_test_with_totals - GROUP BY country - WITH TOTALS - ` - ) - if connect, err := sql.Open("clickhouse", "tcp://127.0.0.1:9000?debug=true"); assert.NoError(t, err) && assert.NoError(t, connect.Ping()) { - if _, err := connect.Exec("DROP TABLE IF EXISTS clickhouse_test_with_totals"); assert.NoError(t, err) { - if _, err := connect.Exec(ddl); assert.NoError(t, err) { - if tx, err := connect.Begin(); assert.NoError(t, err) { - if stmt, err := tx.Prepare(dml); assert.NoError(t, err) { - if _, err := stmt.Exec("RU"); !assert.NoError(t, err) { - return - } - if _, err := stmt.Exec("EN"); !assert.NoError(t, err) { - return - } - if _, err := stmt.Exec("RU"); !assert.NoError(t, err) { - return - } - if _, err := stmt.Exec("RU"); !assert.NoError(t, err) { - return - } - if _, err := stmt.Exec("EN"); !assert.NoError(t, err) { - return - } - if _, err := stmt.Exec("RU"); !assert.NoError(t, err) { - return - } - } - if assert.NoError(t, tx.Commit()) { - var item struct { - Country string - Count int64 - } - if rows, err := connect.Query(query); assert.NoError(t, err) { - var count int - for rows.Next() { - count++ - err := rows.Scan( - &item.Country, - &item.Count, - ) - if !assert.NoError(t, err) { - return - } - switch item.Country { - case "RU": - if !assert.Equal(t, int64(4), item.Count) { - return - } - case "EN": - if !assert.Equal(t, int64(2), item.Count) { - return - } - } - } - - if assert.Equal(t, int(2), count) && assert.True(t, rows.NextResultSet()) { - var count int - for rows.Next() { - count++ - err := rows.Scan( - &item.Country, - &item.Count, - ) - if !assert.NoError(t, err) { - return - } - - if assert.Equal(t, "\x00\x00", item.Country) { - assert.Equal(t, int64(6), item.Count) - } - } - assert.Equal(t, int(1), count) - } - } - } - } - } - } - } -} - -func Test_Tx(t *testing.T) { - if connect, err := sql.Open("clickhouse", "tcp://127.0.0.1:9000?debug=true"); assert.NoError(t, err) { - if tx, err := connect.Begin(); assert.NoError(t, err) { - _, err = tx.Query("SELECT 1") - if assert.NoError(t, err) { - if !assert.NoError(t, tx.Rollback()) { - return - } - } - if _, err := tx.Query("SELECT 2"); assert.Error(t, err) { - assert.Equal(t, sql.ErrTxDone, err) - } - } - } -} - -func Test_Temporary_Table(t *testing.T) { - const ( - ddl = ` - CREATE TEMPORARY TABLE clickhouse_test_temporary_table ( - ID UInt64 - ); - ` - ) - if connect, err := sql.Open("clickhouse", "tcp://127.0.0.1:9000?debug=true"); assert.NoError(t, err) { - if tx, err := connect.Begin(); assert.NoError(t, err) { - if _, err := tx.Exec(ddl); assert.NoError(t, err) { - if _, err := tx.Exec("INSERT INTO clickhouse_test_temporary_table (ID) SELECT number AS ID FROM system.numbers LIMIT 10"); assert.NoError(t, err) { - if rows, err := tx.Query("SELECT ID AS ID FROM clickhouse_test_temporary_table"); assert.NoError(t, err) { - var count int - for rows.Next() { - var num int - if err := rows.Scan(&num); !assert.NoError(t, err) { - return - } - count++ - } - if _, err = tx.Query("SELECT ID AS ID1 FROM clickhouse_test_temporary_table"); assert.NoError(t, err) { - if _, err = connect.Query("SELECT ID AS ID2 FROM clickhouse_test_temporary_table"); assert.Error(t, err) { - if exception, ok := err.(*clickhouse.Exception); assert.True(t, ok) { - assert.Equal(t, int32(60), exception.Code) - } - } - } - if assert.Equal(t, int(10), count) { - if assert.NoError(t, tx.Commit()) { - assert.NoError(t, connect.Close()) - } - } - } - } - } - } - } -} - -func Test_Select_External_Tables(t *testing.T) { - const ( - ddl = ` - CREATE TABLE clickhouse_test_select_external_tables ( - string1 String, - string2 String - ) Engine=Memory - ` - dml = ` - INSERT INTO clickhouse_test_select_external_tables ( - string1, - string2 - ) VALUES ( - ?, - ? - ) - ` - query = `SELECT COUNT(*) FROM clickhouse_test_select_external_tables WHERE string1 IN ? AND string2 IN ? AND string1 NOT IN (SELECT c1 FROM ?)` - queryNamed = `SELECT COUNT(*) FROM clickhouse_test_select_external_tables WHERE string1 IN @e1 AND string2 IN @e2 AND string1 NOT IN (SELECT c1 FROM @e3)` - queryJoin = `SELECT COUNT(*) FROM clickhouse_test_select_external_tables AS ctset JOIN ? AS ext ON ctset.string1 = ext.c1` - ) - if connect, err := sql.Open("clickhouse", "tcp://127.0.0.1:9000?debug=true"); assert.NoError(t, err) && assert.NoError(t, connect.Ping()) { - if _, err := connect.Exec("DROP TABLE IF EXISTS clickhouse_test_select_external_tables"); assert.NoError(t, err) { - if _, err := connect.Exec(ddl); assert.NoError(t, err) { - if tx, err := connect.Begin(); assert.NoError(t, err) { - if stmt, err := tx.Prepare(dml); assert.NoError(t, err) { - for i := 1; i <= 1000; i++ { - _, err = stmt.Exec( - fmt.Sprintf("string %d", i), // string1 - fmt.Sprintf("string %d", i), // string2 - ) - if !assert.NoError(t, err) { - return - } - } - } - - col, err := column.Factory("c1", "String", nil) - if err != nil { - t.Error(err) - return - } - externalTable1 := clickhouse.ExternalTable{ - Name: "e1", - Values: [][]driver.Value{ - {"string 1"}, - {"string 2"}, - }, - Columns: []column.Column{ - col, - }, - } - externalTable2 := clickhouse.ExternalTable{ - Name: "e2", - Values: [][]driver.Value{ - {"string 1"}, - {"string 2"}, - }, - Columns: []column.Column{ - col, - }, - } - externalTable3 := clickhouse.ExternalTable{ - Name: "e3", - Values: [][]driver.Value{ - {"string 1"}, - }, - Columns: []column.Column{ - col, - }, - } - if assert.NoError(t, tx.Commit()) { - if rows, err := connect.Query(query, externalTable1, externalTable2, externalTable3); assert.NoError(t, err) { - var count int - for rows.Next() { - err := rows.Scan(&count) - if !assert.NoError(t, err) { - return - } - } - assert.Equal(t, 1, count) - } - if rows, err := connect.Query(queryNamed, sql.Named("e1", externalTable1), - sql.Named("e2", externalTable2), sql.Named("e3", externalTable3)); assert.NoError(t, err) { - var count int - for rows.Next() { - err := rows.Scan(&count) - if !assert.NoError(t, err) { - return - } - } - assert.Equal(t, 1, count) - } - if rows, err := connect.Query(queryJoin, externalTable1); assert.NoError(t, err) { - var count int - for rows.Next() { - err := rows.Scan(&count) - if !assert.NoError(t, err) { - return - } - } - assert.Equal(t, 2, count) - } - } - } - } - } - } -} - -func Test_Enum(t *testing.T) { - const ( - ddl = ` - CREATE TABLE clickhouse_test_enum ( - enum8 Enum8 ('a' = 1, 'b' = 2), - enum16 Enum16('c' = 1, 'd' = 2), - arr_enum8 Array(Enum8 ('a' = 1, 'b' = 2)), - arr_enum16 Array(Enum16('c' = 1, 'd' = 2)) - ) Engine=Memory - ` - dml = `INSERT INTO clickhouse_test_enum VALUES (?, ?, ?, ?)` - ) - if connect, err := sql.Open("clickhouse", "tcp://127.0.0.1:9000?debug=true"); assert.NoError(t, err) && assert.NoError(t, connect.Ping()) { - if _, err := connect.Exec("DROP TABLE IF EXISTS clickhouse_test_enum"); assert.NoError(t, err) { - if _, err := connect.Exec(ddl); assert.NoError(t, err) { - if tx, err := connect.Begin(); assert.NoError(t, err) { - if stmt, err := tx.Prepare(dml); assert.NoError(t, err) { - if _, err := stmt.Exec("a", "c", []string{"a", "b"}, []string{"c", "d"}); !assert.NoError(t, err) { - return - } - if _, err := stmt.Exec("b", "d", []string{"b", "a"}, []string{"d", "c"}); !assert.NoError(t, err) { - return - } - } - if err := tx.Commit(); !assert.NoError(t, err) { - return - } - } - } - } - if rows, err := connect.Query("SELECT enum8, enum16, arr_enum8, arr_enum16 FROM clickhouse_test_enum"); assert.NoError(t, err) { - for rows.Next() { - var ( - a, b string - c, d []string - ) - if err := rows.Scan(&a, &b, &c, &d); assert.NoError(t, err) { - t.Log(a, b, c, d) - } - } - } - } -} - -func Test_Ternary_Operator(t *testing.T) { - const ( - ddl = ` - CREATE TABLE clickhouse_ternary_operator ( - a UInt8, - b UInt8 - ) Engine=Memory - ` - dml = `INSERT INTO clickhouse_ternary_operator VALUES (?, ?)` - ) - if connect, err := sql.Open("clickhouse", "tcp://127.0.0.1:9000?debug=true"); assert.NoError(t, err) && assert.NoError(t, connect.Ping()) { - if _, err := connect.Exec("DROP TABLE IF EXISTS clickhouse_ternary_operator"); assert.NoError(t, err) { - if _, err := connect.Exec(ddl); assert.NoError(t, err) { - if tx, err := connect.Begin(); assert.NoError(t, err) { - if stmt, err := tx.Prepare(dml); assert.NoError(t, err) { - if _, err := stmt.Exec(1, 0); !assert.NoError(t, err) { - return - } - } - if err := tx.Commit(); !assert.NoError(t, err) { - return - } - } - } - } - if rows, err := connect.Query("SELECT a ? '+' : '-', b ? '+' : '-' FROM clickhouse_ternary_operator WHERE a = ? AND b < ?", 1, 2); assert.NoError(t, err) { - for rows.Next() { - var ( - a, b string - ) - if err := rows.Scan(&a, &b); assert.NoError(t, err) { - assert.Equal(t, "+", a) - assert.Equal(t, "-", b) - } - } - } - if rows, err := connect.Query("SELECT a, b FROM clickhouse_ternary_operator WHERE a = ? AND b < ?", 1, 2); assert.NoError(t, err) { - for rows.Next() { - var ( - a, b int - ) - if err := rows.Scan(&a, &b); assert.NoError(t, err) { - assert.Equal(t, 1, a) - assert.Equal(t, 0, b) - } - } - } - if rows, err := connect.Query(` - SELECT - a ? - '+' : '-', - b ? '+' : '-' , - a, b - FROM clickhouse_ternary_operator - WHERE a = ? AND b < ? AND a IN(?, - ? - ) OR b = 0 OR b > ?`, 1, 2, 1, 100, -1); assert.NoError(t, err) { - for rows.Next() { - var ( - a, b string - c, d int - ) - if err := rows.Scan(&a, &b, &c, &d); assert.NoError(t, err) { - assert.Equal(t, "+", a) - assert.Equal(t, "-", b) - } - } - } - } -} - -func Test_UUID(t *testing.T) { - const ( - ddl = ` - CREATE TABLE clickhouse_test_uuid ( - UUID FixedString(16), - Builtin UUID - ) Engine=Memory; - ` - ) - if connect, err := sql.Open("clickhouse", "tcp://127.0.0.1:9000?debug=true"); assert.NoError(t, err) { - if tx, err := connect.Begin(); assert.NoError(t, err) { - if _, err := connect.Exec("DROP TABLE IF EXISTS clickhouse_test_uuid"); assert.NoError(t, err) { - if _, err := tx.Exec(ddl); assert.NoError(t, err) { - if tx, err := connect.Begin(); assert.NoError(t, err) { - if stmt, err := tx.Prepare("INSERT INTO clickhouse_test_uuid VALUES(?)"); assert.NoError(t, err) { - if _, err := stmt.Exec(types.UUID("123e4567-e89b-12d3-a456-426655440000"), "123e4567-e89b-12d3-a456-426655440000"); !assert.NoError(t, err) { - t.Fatal(err) - } - } - if err := tx.Commit(); !assert.NoError(t, err) { - t.Fatal(err) - } - } - - if rows, err := connect.Query("SELECT UUID, UUIDNumToString(UUID), Builtin FROM clickhouse_test_uuid"); assert.NoError(t, err) { - if assert.True(t, rows.Next()) { - var ( - uuid types.UUID - uuidStr string - builtinUUID string - ) - if err := rows.Scan(&uuid, &uuidStr, &builtinUUID); assert.NoError(t, err) { - if assert.Equal(t, "123e4567-e89b-12d3-a456-426655440000", uuidStr) { - assert.Equal(t, types.UUID("123e4567-e89b-12d3-a456-426655440000"), uuid) - assert.Equal(t, "123e4567-e89b-12d3-a456-426655440000", builtinUUID) - } - } - } - } - } - } - } - } -} - -func Test_IP(t *testing.T) { - const ( - ddl = ` - CREATE TABLE clickhouse_test_ip ( - OldIPv4 FixedString(16), - OldIPv6 FixedString(16), - IPv4 IPv4, - IPv6 IPv6 - ) Engine=Memory; - ` - ) - var ( - ipv4 = net.ParseIP("127.0.0.1") - ipv6 = net.ParseIP("2001:0db8:0000:0000:0000:ff00:0042:8329") - ) - if connect, err := sql.Open("clickhouse", "tcp://127.0.0.1:9000?debug=true"); assert.NoError(t, err) { - if tx, err := connect.Begin(); assert.NoError(t, err) { - if _, err := connect.Exec("DROP TABLE IF EXISTS clickhouse_test_ip"); assert.NoError(t, err) { - if _, err := tx.Exec(ddl); assert.NoError(t, err) { - if tx, err := connect.Begin(); assert.NoError(t, err) { - if stmt, err := tx.Prepare("INSERT INTO clickhouse_test_ip VALUES(?, ?, ?, ?)"); assert.NoError(t, err) { - if _, err := stmt.Exec(column.IP(ipv4), column.IP(ipv6), ipv4, ipv6); !assert.NoError(t, err) { - t.Fatal(err) - } - } - if err := tx.Commit(); !assert.NoError(t, err) { - t.Fatal(err) - } - } - if rows, err := connect.Query("SELECT OldIPv4, OldIPv6, IPv4, IPv6 FROM clickhouse_test_ip"); assert.NoError(t, err) { - if assert.True(t, rows.Next()) { - var ( - oldIPv4, oldIPv6 column.IP - v4, v6 net.IP - ) - if err := rows.Scan(&oldIPv4, &oldIPv6, &v4, &v6); assert.NoError(t, err) { - assert.Equal(t, net.IP(oldIPv4), ipv4) - assert.Equal(t, net.IP(oldIPv6), ipv6) - assert.Equal(t, v4, ipv4) - assert.Equal(t, v6, ipv6) - } - } - } - } - } - } - } -} - -func Test_Context_Timeout(t *testing.T) { - if connect, err := sql.Open("clickhouse", "tcp://127.0.0.1:9000?debug=true"); assert.NoError(t, err) && assert.NoError(t, connect.Ping()) { - { - ctx, cancel := context.WithTimeout(context.Background(), time.Millisecond*20) - defer cancel() - if row := connect.QueryRowContext(ctx, "SELECT 1, sleep(2)"); assert.NotNil(t, row) { - var a, b int - assert.Equal(t, driver.ErrBadConn, row.Scan(&a, &b)) - } - } - { - ctx, cancel := context.WithTimeout(context.Background(), time.Second) - defer cancel() - if row := connect.QueryRowContext(ctx, "SELECT 1, sleep(0.1)"); assert.NotNil(t, row) { - var value, value2 int - if assert.NoError(t, row.Scan(&value, &value2)) { - assert.Equal(t, int(1), value) - } - } - } - } -} - -func Test_Ping_Context_Timeout(t *testing.T) { - if connect, err := sql.Open("clickhouse", "tcp://127.0.0.1:9000?debug=true"); assert.NoError(t, err) && assert.NoError(t, connect.Ping()) { - { - ctx, cancel := context.WithTimeout(context.Background(), time.Nanosecond) - defer cancel() - if err := connect.PingContext(ctx); assert.Error(t, err) { - assert.Equal(t, context.DeadlineExceeded, err) - } - } - { - ctx, cancel := context.WithTimeout(context.Background(), time.Millisecond*20) - defer cancel() - if row := connect.QueryRowContext(ctx, "SELECT 1, sleep(2)"); assert.NotNil(t, row) { - var a, b int - assert.Equal(t, driver.ErrBadConn, row.Scan(&a, &b)) - } - } - { - ctx, cancel := context.WithTimeout(context.Background(), time.Second) - defer cancel() - if row := connect.QueryRowContext(ctx, "SELECT 1, sleep(0.1)"); assert.NotNil(t, row) { - var value, value2 int - if assert.NoError(t, row.Scan(&value, &value2)) { - assert.Equal(t, int(1), value) - } - } - } - } -} - -func Test_Timeout(t *testing.T) { - if connect, err := sql.Open("clickhouse", "tcp://127.0.0.1:9000?debug=true&read_timeout=0.2"); assert.NoError(t, err) && assert.NoError(t, connect.Ping()) { - { - if row := connect.QueryRow("SELECT 1, sleep(2)"); assert.NotNil(t, row) { - var a, b int - assert.Equal(t, driver.ErrBadConn, row.Scan(&a, &b)) - } - } - { - ctx, cancel := context.WithTimeout(context.Background(), time.Second) - defer cancel() - if row := connect.QueryRowContext(ctx, "SELECT 1, sleep(0.1)"); assert.NotNil(t, row) { - var value, value2 int - if assert.NoError(t, row.Scan(&value, &value2)) { - assert.Equal(t, int(1), value) - } - } - } - } -} - -func Test_InArray(t *testing.T) { - const ( - ddl = ` - CREATE TABLE clickhouse_test_in_array ( - Value String - ) Engine=Memory - ` - dml = ` - INSERT INTO clickhouse_test_in_array (Value) VALUES (?) - ` - query = ` - SELECT - groupArray(Value) - FROM clickhouse_test_in_array WHERE Value IN(?) - ` - ) - if connect, err := sql.Open("clickhouse", "tcp://127.0.0.1:9000?debug=true"); assert.NoError(t, err) && assert.NoError(t, connect.Ping()) { - if _, err := connect.Exec("DROP TABLE IF EXISTS clickhouse_test_in_array"); assert.NoError(t, err) { - if _, err := connect.Exec(ddl); assert.NoError(t, err) { - if tx, err := connect.Begin(); assert.NoError(t, err) { - if stmt, err := tx.Prepare(dml); assert.NoError(t, err) { - for _, v := range []string{"A", "B", "C"} { - _, err = stmt.Exec(v) - if !assert.NoError(t, err) { - return - } - } - } else { - return - } - if assert.NoError(t, tx.Commit()) { - var value []string - if err := connect.QueryRow(query, []string{"A", "C"}).Scan(&value); assert.NoError(t, err) { - if !assert.NoError(t, err) { - return - } - } - assert.Equal(t, []string{"A", "C"}, value) - - } - } - } - } - } -} - -func TestArrayArrayT(t *testing.T) { - const ( - ddl = ` - CREATE TABLE clickhouse_test_array_array_t ( - String1 Array(Array(String)), - String2 Array(Array(Array(String))), - Int32 Array(Array(Int32)) - ) Engine=Memory - ` - dml = ` - INSERT INTO clickhouse_test_array_array_t (String1, String2, Int32) VALUES (?) - ` - query = ` - SELECT - String1, - String2, - Int32 - FROM clickhouse_test_array_array_t - ` - ) - - items := []struct { - String1, String2, Int32 interface{} - }{ - { - [][]string{ - []string{"A"}, - []string{"BC"}, - []string{"DEF"}, - }, - [][][]string{ - [][]string{ - []string{"X"}, - []string{"Y"}, - }, - [][]string{ - []string{"ZZ"}, - }, - }, - [][]int32{ - []int32{1}, - []int32{2, 3}, - }, - }, - { - [][][]byte{ - [][]byte{[]byte("AA")}, - [][]byte{[]byte("BB")}, - [][]byte{[]byte("C4C")}, - }, - [][][][]byte{ - [][][]byte{ - [][]byte{[]byte("XX"), []byte("YY")}, - }, - }, - [][]int32{ - []int32{4, 5, 6}, - }, - }, - } - - if connect, err := sql.Open("clickhouse", "tcp://127.0.0.1:9000?debug=true"); assert.NoError(t, err) && assert.NoError(t, connect.Ping()) { - if _, err := connect.Exec("DROP TABLE IF EXISTS clickhouse_test_array_array_t"); assert.NoError(t, err) { - if _, err := connect.Exec(ddl); assert.NoError(t, err) { - if tx, err := connect.Begin(); assert.NoError(t, err) { - if stmt, err := tx.Prepare(dml); assert.NoError(t, err) { - for _, item := range items { - _, err = stmt.Exec(item.String1, item.String2, item.Int32) - if !assert.NoError(t, err) { - return - } - } - - } - if assert.NoError(t, tx.Commit()) { - var result struct { - String1 [][]string - String2 [][][]string - Int32 [][]int32 - } - - row := connect.QueryRow(query) - if err := row.Scan(&result.String1, &result.String2, &result.Int32); assert.NoError(t, err) { - assert.Equal(t, items[0].String1, result.String1) - assert.Equal(t, items[0].String2, result.String2) - assert.Equal(t, items[0].Int32, result.Int32) - } - } - } - } - } - } -} - -func Test_LikeQuery(t *testing.T) { - const ( - ddl = ` - CREATE TABLE clickhouse_test_like ( - firstName String, - lastName String - ) Engine=Memory - ` - dml = ` - INSERT INTO clickhouse_test_like ( - firstName, - lastName - ) VALUES ( - ?, - ? - ) - ` - query = ` - SELECT - firstName, - lastName - FROM clickhouse_test_like - WHERE firstName LIKE ? and lastName LIKE ? - ` - ) - if connect, err := sql.Open("clickhouse", "tcp://127.0.0.1:9000?debug=true"); assert.NoError(t, err) && assert.NoError(t, connect.Ping()) { - if _, err := connect.Exec("DROP TABLE IF EXISTS clickhouse_test_like"); assert.NoError(t, err) { - if _, err := connect.Exec(ddl); assert.NoError(t, err) { - if tx, err := connect.Begin(); assert.NoError(t, err) { - if stmt, err := tx.Prepare(dml); assert.NoError(t, err) { - var names = []struct { - First string - Last string - }{ - {First: "JeanPierre", Last: "Baltasar"}, {First: "DonPierre", Last: "Baltasar"}, - } - for i := range names { - _, err = stmt.Exec( - names[i].First, - names[i].Last, - ) - if !assert.NoError(t, err) { - return - } - } - } - if assert.NoError(t, tx.Commit()) { - var tests = []struct { - Param1 string - Param2 string - ExpectedFirst string - ExpectedLast string - }{ - { - Param1: "Don%", - Param2: "%lta%", - ExpectedFirst: "DonPierre", - ExpectedLast: "Baltasar", - }, - { - Param1: "%eanP%", - Param2: "%asar", - ExpectedFirst: "JeanPierre", - ExpectedLast: "Baltasar", - }, - { - Param1: "Don", - Param2: "%asar", - ExpectedFirst: "", - ExpectedLast: "", - }, - { - Param1: "Jean%", - Param2: "%", - ExpectedFirst: "JeanPierre", - ExpectedLast: "Baltasar", - }, - { - Param1: "%", - Param2: "Baptiste", - ExpectedFirst: "", - ExpectedLast: "", - }, - } - - for _, test := range tests { - var result struct { - FirstName string - LastName string - } - if rows, err := connect.Query(query, test.Param1, test.Param2); assert.NoError(t, err) { - - for rows.Next() { - err := rows.Scan( - &result.FirstName, - &result.LastName, - ) - if !assert.NoError(t, err) { - return - } - } - assert.Equal(t, test.ExpectedFirst, result.FirstName) - assert.Equal(t, test.ExpectedLast, result.LastName) - } - } - } - } - } - } - } -} - -func Test_NullableScan(t *testing.T) { - const ( - ddl = ` - CREATE TABLE clickhouse_test_scan_nullable ( - int8N Nullable(Int8), - int16N Nullable(Int16), - int32N Nullable(Int32), - int64N Nullable(Int64), - uint8N Nullable(UInt8), - uint16N Nullable(UInt16), - uint32N Nullable(UInt32), - uint64N Nullable(UInt64), - float32N Nullable(Float32), - float64N Nullable(Float64), - string Nullable(String) - ) Engine=Memory; - ` - dml = ` - INSERT INTO clickhouse_test_scan_nullable ( - int8N, - int16N, - int32N, - int64N, - uint8N, - uint16N, - uint32N, - uint64N, - float32N, - float64N, - string - ) VALUES ( - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ? - ) - ` - query = ` - SELECT - int8N, - int16N, - int32N, - int64N, - uint8N, - uint16N, - uint32N, - uint64N, - float32N, - float64N, - string - FROM clickhouse_test_scan_nullable - ` - ) - - if connect, err := sql.Open("clickhouse", "tcp://127.0.0.1:9000?debug=true"); assert.NoError(t, err) { - if tx, err := connect.Begin(); assert.NoError(t, err) { - if _, err := connect.Exec("DROP TABLE IF EXISTS clickhouse_test_scan_nullable"); assert.NoError(t, err) { - if _, err := tx.Exec(ddl); assert.NoError(t, err) { - if tx, err := connect.Begin(); assert.NoError(t, err) { - if stmt, err := tx.Prepare(dml); assert.NoError(t, err) { - if _, err := stmt.Exec( - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - ); !assert.NoError(t, err) { - t.Fatal(err) - } - } - if err := tx.Commit(); !assert.NoError(t, err) { - t.Fatal(err) - } - } - if rows, err := connect.Query(query); assert.NoError(t, err) { - if columns, err := rows.ColumnTypes(); assert.NoError(t, err) { - values := make([]interface{}, len(columns)) - for i, c := range columns { - values[i] = reflect.New(c.ScanType()).Interface() - } - - for i := 0; rows.Next(); i++ { - if err := rows.Scan(values...); assert.NoError(t, err) { - t.Log(values) - } - } - } - } - } - } - } - } -} - -func Test_Tuple(t *testing.T) { - const ( - ddl = ` - CREATE TABLE clickhouse_test_tuple ( - int8 Int8, - int16 Int16, - int32 Int32, - int64 Int64, - uint8 UInt8, - uint16 UInt16, - uint32 UInt32, - uint64 UInt64, - float32 Float32, - float64 Float64, - string String, - fString FixedString(2), - date Date, - datetime DateTime, - enum8 Enum8 ('a' = 1, 'b' = 2), - enum16 Enum16('c' = 1, 'd' = 2), - array Array(String), - arrayArray Array(Array(String)), - int8N Nullable(Int8), - int16N Nullable(Int16), - int32N Nullable(Int32), - int64N Nullable(Int64), - uint8N Nullable(UInt8), - uint16N Nullable(UInt16), - uint32N Nullable(UInt32), - uint64N Nullable(UInt64), - float32N Nullable(Float32), - float64N Nullable(Float64), - stringN Nullable(String), - fStringN Nullable(FixedString(2)), - dateN Nullable(Date), - datetimeN Nullable(DateTime), - enum8N Nullable(Enum8 ('a' = 1, 'b' = 2)), - enum16N Nullable(Enum16('c' = 1, 'd' = 2)) - ) Engine=Memory; - ` - dml = ` - INSERT INTO clickhouse_test_tuple ( - int8, - int16, - int32, - int64, - uint8, - uint16, - uint32, - uint64, - float32, - float64, - string, - fString, - date, - datetime, - enum8, - enum16, - array, - arrayArray, - int8N, - int16N, - int32N, - int64N, - uint8N, - uint16N, - uint32N, - uint64N, - float32N, - float64N, - stringN, - fStringN, - dateN, - datetimeN, - enum8N, - enum16N - ) VALUES ( - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ? - ) - ` - query = ` - SELECT - ( - int8, - int16, - int32, - int64, - uint8, - uint16, - uint32, - uint64, - float32, - float64, - string, - fString, - date, - datetime, - enum8, - enum16, - array, - (6.2, 'test'), - int8N, - int16N, - int32N, - int64N, - uint8N, - uint16N, - uint32N, - uint64N, - float32N, - float64N, - stringN, - fStringN, - dateN, - datetimeN, - enum8N, - enum16N - ) - FROM clickhouse_test_tuple - ` - ) - - if connect, err := sql.Open("clickhouse", "tcp://127.0.0.1:9000?debug=true"); assert.NoError(t, err) { - if tx, err := connect.Begin(); assert.NoError(t, err) { - if _, err := connect.Exec("DROP TABLE IF EXISTS clickhouse_test_tuple"); assert.NoError(t, err) { - if _, err := tx.Exec(ddl); assert.NoError(t, err) { - if tx, err := connect.Begin(); assert.NoError(t, err) { - if stmt, err := tx.Prepare(dml); assert.NoError(t, err) { - for i := 0; i < 10; i++ { - if _, err := stmt.Exec( - 8, - 16, - 32, - 64, - 18, - 116, - 132, - 165, - 1.1, - 2.2, - "RU", - "CN", - time.Now(), - time.Now(), - "a", - "c", - []string{"A", "B", "C"}, - [][]string{{"A", "B"}, {"CC", "DD", "EE"}}, - new(int8), - 16, - new(int32), - 64, - 18, - 116, - 132, - 165, - 1.1, - 2.2, - nil, - "CN", - time.Now(), - time.Now(), - "a", - "c", - ); !assert.NoError(t, err) { - t.Fatal(err) - } - } - } - if err := tx.Commit(); !assert.NoError(t, err) { - t.Fatal(err) - } - } - if rows, err := connect.Query(query); assert.NoError(t, err) { - for i := 0; rows.Next(); i++ { - var ( - tuple []interface{} - ) - if err := rows.Scan( - &tuple, - ); assert.NoError(t, err) { - if assert.IsType(t, int8(8), tuple[0]) { - assert.Equal(t, int8(8), tuple[0].(int8)) - } - if assert.IsType(t, int16(16), tuple[1]) { - assert.Equal(t, int16(16), tuple[1].(int16)) - } - if assert.IsType(t, int32(32), tuple[2]) { - assert.Equal(t, int32(32), tuple[2].(int32)) - } - if assert.IsType(t, int64(64), tuple[3]) { - assert.Equal(t, int64(64), tuple[3].(int64)) - } - if assert.IsType(t, uint8(18), tuple[4]) { - assert.Equal(t, uint8(18), tuple[4].(uint8)) - } - if assert.IsType(t, uint16(116), tuple[5]) { - assert.Equal(t, uint16(116), tuple[5].(uint16)) - } - if assert.IsType(t, uint32(132), tuple[6]) { - assert.Equal(t, uint32(132), tuple[6].(uint32)) - } - if assert.IsType(t, uint64(165), tuple[7]) { - assert.Equal(t, uint64(165), tuple[7].(uint64)) - } - if assert.IsType(t, float32(1.1), tuple[8]) { - assert.Equal(t, float32(1.1), tuple[8].(float32)) - } - if assert.IsType(t, float64(2.2), tuple[9]) { - assert.Equal(t, float64(2.2), tuple[9].(float64)) - } - if assert.IsType(t, "RU", tuple[10]) { - assert.Equal(t, "RU", tuple[10].(string)) - } - if assert.IsType(t, "CN", tuple[11]) { - assert.Equal(t, "CN", tuple[11].(string)) - } - if assert.IsType(t, time.Now(), tuple[12]) { - // nothing - } - if assert.IsType(t, time.Now(), tuple[13]) { - // nothing - } - if assert.IsType(t, "a", tuple[14]) { - assert.Equal(t, "a", tuple[14].(string)) - } - if assert.IsType(t, "c", tuple[15]) { - assert.Equal(t, "c", tuple[15].(string)) - } - if assert.IsType(t, []string{"A", "B", "C"}, tuple[16]) { - assert.Equal(t, []string{"A", "B", "C"}, tuple[16].([]string)) - } - if assert.IsType(t, []interface{}{}, tuple[17]) { - assert.Equal(t, []interface{}{6.2, "test"}, tuple[17].([]interface{})) - } - - if assert.IsType(t, int8(0), tuple[18]) { - assert.Equal(t, int8(0), tuple[18].(int8)) - } - if assert.IsType(t, int16(16), tuple[19]) { - assert.Equal(t, int16(16), tuple[19].(int16)) - } - if assert.IsType(t, int32(0), tuple[20]) { - assert.Equal(t, int32(0), tuple[20].(int32)) - } - if assert.IsType(t, int64(64), tuple[21]) { - assert.Equal(t, int64(64), tuple[21].(int64)) - } - if assert.IsType(t, uint8(18), tuple[22]) { - assert.Equal(t, uint8(18), tuple[22].(uint8)) - } - if assert.IsType(t, uint16(116), tuple[23]) { - assert.Equal(t, uint16(116), tuple[23].(uint16)) - } - if assert.IsType(t, uint32(132), tuple[24]) { - assert.Equal(t, uint32(132), tuple[24].(uint32)) - } - if assert.IsType(t, uint64(165), tuple[25]) { - assert.Equal(t, uint64(165), tuple[25].(uint64)) - } - if assert.IsType(t, float32(1.1), tuple[26]) { - assert.Equal(t, float32(1.1), tuple[26].(float32)) - } - if assert.IsType(t, float64(2.2), tuple[27]) { - assert.Equal(t, float64(2.2), tuple[27].(float64)) - } - if assert.Nil(t, tuple[28]) { - if assert.IsType(t, "CN", tuple[29]) { - assert.Equal(t, "CN", tuple[29].(string)) - } - } - - t.Log(tuple) - } - } - } - } - } - } - } -} - -func Test_ReadHistogram(t *testing.T) { - const ( - ddl = ` - CREATE TABLE clickhouse_test_histogram ( - int8 Int8, - int16 Int16, - int32 Int32, - int64 Int64, - uint8 UInt8, - uint16 UInt16, - uint32 UInt32, - uint64 UInt64, - float32 Float32, - float64 Float64, - int8N Nullable(Int8), - int16N Nullable(Int16), - int32N Nullable(Int32), - int64N Nullable(Int64), - uint8N Nullable(UInt8), - uint16N Nullable(UInt16), - uint32N Nullable(UInt32), - uint64N Nullable(UInt64), - float32N Nullable(Float32), - float64N Nullable(Float64) - ) Engine=Memory; - ` - dml = ` - INSERT INTO clickhouse_test_histogram ( - int8, - int16, - int32, - int64, - uint8, - uint16, - uint32, - uint64, - float32, - float64, - int8N, - int16N, - int32N, - int64N, - uint8N, - uint16N, - uint32N, - uint64N, - float32N, - float64N - ) VALUES ( - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ?, - ? - ) - ` - query = ` - SELECT - histogram(5)(int8), - histogram(5)(int16), - histogram(5)(int32), - histogram(5)(int64), - histogram(5)(uint8), - histogram(5)(uint16), - histogram(5)(uint32), - histogram(5)(uint64), - histogram(5)(float32), - histogram(5)(float64), - histogram(5)(int8N), - histogram(5)(int16N), - histogram(5)(int32N), - histogram(5)(int64N), - histogram(5)(uint8N), - histogram(5)(uint16N), - histogram(5)(uint32N), - histogram(5)(uint64N), - histogram(5)(float32N), - histogram(5)(float64N) - FROM clickhouse_test_histogram - ` - ) - - if connect, err := sql.Open("clickhouse", "tcp://127.0.0.1:9000?debug=true"); assert.NoError(t, err) { - if tx, err := connect.Begin(); assert.NoError(t, err) { - if _, err := connect.Exec("DROP TABLE IF EXISTS clickhouse_test_histogram"); assert.NoError(t, err) { - if _, err := tx.Exec(ddl); assert.NoError(t, err) { - if tx, err := connect.Begin(); assert.NoError(t, err) { - if stmt, err := tx.Prepare(dml); assert.NoError(t, err) { - for i := 0; i < 10; i++ { - if _, err := stmt.Exec( - 8+i, - 16+i, - 32+i, - 64+i, - 18+i, - 116+i, - 132+i, - 165+i, - 1.1+float64(i), - 2.2+float64(i), - new(int8), - 16+i, - new(int32), - 64+i, - 18+i, - 116+i, - nil, - 165+i, - 1.1+float64(i), - 2.2+float64(i), - ); !assert.NoError(t, err) { - t.Fatal(err) - } - } - } - if err := tx.Commit(); !assert.NoError(t, err) { - t.Fatal(err) - } - } - if rows, err := connect.Query(query); assert.NoError(t, err) { - for i := 0; rows.Next(); i++ { - histos := make([][][]interface{}, 20) - histoPtrs := make([]interface{}, 20) - for i := range histos { - histoPtrs[i] = &histos[i] - } - if err := rows.Scan(histoPtrs...); assert.NoError(t, err) { - for _, histo := range histos { - assert.IsType(t, [][]interface{}{}, histo) - for _, bucket := range histo { - assert.IsType(t, []interface{}{}, bucket) - for _, f := range bucket { - assert.IsType(t, float64(0), f) - } - } - } - t.Log(histos) - } - } - } - } - } - } - } -} - -func Test_ReadArrayArrayTuple(t *testing.T) { - const ( - query = ` - select - [ - [(1.0, 2.0, 3.0)], - [(4.0, 5.0, 6.0), (7.0, 8.0, 9.0)], - [(10.0, 11.0, 12.0), (13.0, 14.0, 15.0), (16.0, 17.0, 18.0), (19.0, 20.0, 21.0), (22.0, 23.0, 24.0)] - ], - number - from numbers(2) - group by number; - ` - ) - - if connect, err := sql.Open("clickhouse", "tcp://127.0.0.1:9000?debug=true"); assert.NoError(t, err) { - if tx, err := connect.Begin(); assert.NoError(t, err) { - if rows, err := tx.Query(query); assert.NoError(t, err) { - for i := 0; rows.Next(); i++ { - var ( - histArr [][][]interface{} - group string - ) - if err := rows.Scan(&histArr, &group); assert.NoError(t, err) { - assert.Len(t, histArr, 3) - assert.Len(t, histArr[0], 1) - assert.Len(t, histArr[0][0], 3) - assert.Equal(t, []interface{}{1.0, 2.0, 3.0}, histArr[0][0]) - assert.Len(t, histArr[1], 2) - assert.Len(t, histArr[1][0], 3) - assert.Len(t, histArr[1][1], 3) - assert.Equal(t, []interface{}{4.0, 5.0, 6.0}, histArr[1][0]) - assert.Equal(t, []interface{}{7.0, 8.0, 9.0}, histArr[1][1]) - assert.Len(t, histArr[2], 5) - assert.Len(t, histArr[2][0], 3) - assert.Len(t, histArr[2][1], 3) - assert.Len(t, histArr[2][2], 3) - assert.Len(t, histArr[2][3], 3) - assert.Len(t, histArr[2][4], 3) - assert.Equal(t, []interface{}{10.0, 11.0, 12.0}, histArr[2][0]) - assert.Equal(t, []interface{}{13.0, 14.0, 15.0}, histArr[2][1]) - assert.Equal(t, []interface{}{16.0, 17.0, 18.0}, histArr[2][2]) - assert.Equal(t, []interface{}{19.0, 20.0, 21.0}, histArr[2][3]) - assert.Equal(t, []interface{}{22.0, 23.0, 24.0}, histArr[2][4]) - for _, histo := range histArr { - for _, tup := range histo { - for _, f := range tup { - assert.IsType(t, float64(0), f) - } - } - } - - t.Log(histArr, group) - } - } - } - } - } -} diff --git a/vendor/github.com/ClickHouse/clickhouse-go/examples/columnar.go b/vendor/github.com/ClickHouse/clickhouse-go/examples/columnar.go deleted file mode 100644 index f11d63c1cb..0000000000 --- a/vendor/github.com/ClickHouse/clickhouse-go/examples/columnar.go +++ /dev/null @@ -1,120 +0,0 @@ -package main - -import ( - "database/sql/driver" - "log" - "sync" - "time" - - "github.com/ClickHouse/clickhouse-go" - data "github.com/ClickHouse/clickhouse-go/lib/data" -) - -func main() { - connect, err := clickhouse.OpenDirect("tcp://127.0.0.1:9000?username=&debug=true&compress=1") - if err != nil { - log.Fatal(err) - } - { - connect.Begin() - stmt, _ := connect.Prepare(` - CREATE TABLE IF NOT EXISTS example ( - os_id UInt8, - action_day Date, - tags Array(String), - categories Array(UInt8) - ) engine=Memory - `) - - if _, err := stmt.Exec([]driver.Value{}); err != nil { - log.Fatal(err) - } - - if err := connect.Commit(); err != nil { - log.Fatal(err) - } - } - { - connect.Begin() - connect.Prepare("INSERT INTO example (os_id, action_day, tags, categories) VALUES (?, ?, ?, ?)") - - block, err := connect.Block() - if err != nil { - log.Fatal(err) - } - - blocks := []*data.Block{block, block.Copy()} - - var wg sync.WaitGroup - wg.Add(len(blocks)) - - for i := range blocks { - b := blocks[i] - go func() { - defer wg.Done() - writeBatch(b, 1000) - if err := connect.WriteBlock(b); err != nil { - log.Fatal(err) - } - }() - } - - wg.Wait() - - if err := connect.Commit(); err != nil { - log.Fatal(err) - } - } - { - connect.Begin() - stmt, _ := connect.Prepare(`SELECT count() FROM example`) - - rows, err := stmt.Query([]driver.Value{}) - if err != nil { - log.Fatal(err) - } - - columns := rows.Columns() - row := make([]driver.Value, 1) - for rows.Next(row) == nil { - for i, c := range columns { - log.Print(c, " : ", row[i]) - } - } - - if err := connect.Commit(); err != nil { - log.Fatal(err) - } - } - { - connect.Begin() - stmt, _ := connect.Prepare(`DROP TABLE example`) - if _, err := stmt.Exec([]driver.Value{}); err != nil { - log.Fatal(err) - } - if err := connect.Commit(); err != nil { - log.Fatal(err) - } - } -} - -func writeBatch(block *data.Block, n int) { - block.Reserve() - block.NumRows += uint64(n) - - for i := 0; i < n; i++ { - block.WriteUInt8(0, uint8(10+i)) - } - - for i := 0; i < n; i++ { - block.WriteDate(1, time.Now()) - } - - for i := 0; i < n; i++ { - block.WriteArray(2, clickhouse.Array([]string{"A", "B", "C"})) - } - - for i := 0; i < n; i++ { - block.WriteArray(3, clickhouse.Array([]uint8{1, 2, 3, 4, 5})) - } -} diff --git a/vendor/github.com/ClickHouse/clickhouse-go/examples/direct.go b/vendor/github.com/ClickHouse/clickhouse-go/examples/direct.go deleted file mode 100644 index d0a1c00110..0000000000 --- a/vendor/github.com/ClickHouse/clickhouse-go/examples/direct.go +++ /dev/null @@ -1,64 +0,0 @@ -package main - -import ( - "database/sql/driver" - "log" - "time" - - "github.com/ClickHouse/clickhouse-go" -) - -func main() { - connect, err := clickhouse.Open("tcp://127.0.0.1:9000?username=&debug=true") - if err != nil { - log.Fatal(err) - } - { - tx, _ := connect.Begin() - stmt, _ := connect.Prepare(` - CREATE TABLE IF NOT EXISTS example ( - country_code FixedString(2), - os_id UInt8, - browser_id UInt8, - categories Array(Int16), - action_day Date, - action_time DateTime - ) engine=Memory - `) - - if _, err := stmt.Exec([]driver.Value{}); err != nil { - log.Fatal(err) - } - tx.Commit() - } - { - tx, _ := connect.Begin() - stmt, _ := connect.Prepare("INSERT INTO example (country_code, os_id, browser_id, categories, action_day, action_time) VALUES (?, ?, ?, ?, ?, ?)") - for i := 0; i < 100; i++ { - if _, err := stmt.Exec([]driver.Value{ - "CZ", - uint8(10 + i), - uint8(100 + i), - clickhouse.Array([]int16{1, 2, 3}), - time.Now(), - time.Now(), - }); err != nil { - log.Fatal(err) - } - } - - if err := tx.Commit(); err != nil { - log.Fatal(err) - } - } - - { - tx, _ := connect.Begin() - stmt, _ := connect.Prepare(`DROP TABLE example`) - - if _, err := stmt.Exec([]driver.Value{}); err != nil { - log.Fatal(err) - } - tx.Commit() - } -} diff --git a/vendor/github.com/ClickHouse/clickhouse-go/examples/external_data.go b/vendor/github.com/ClickHouse/clickhouse-go/examples/external_data.go deleted file mode 100644 index bf46eeaca5..0000000000 --- a/vendor/github.com/ClickHouse/clickhouse-go/examples/external_data.go +++ /dev/null @@ -1,90 +0,0 @@ -package main - -import ( - "database/sql" - "database/sql/driver" - "fmt" - "github.com/ClickHouse/clickhouse-go/lib/column" - "log" - "time" - - "github.com/ClickHouse/clickhouse-go" -) - -func main() { - connect, err := sql.Open("clickhouse", "tcp://127.0.0.1:9000?username=&compress=true&debug=true") - checkErr(err) - if err := connect.Ping(); err != nil { - if exception, ok := err.(*clickhouse.Exception); ok { - fmt.Printf("[%d] %s \n%s\n", exception.Code, exception.Message, exception.StackTrace) - } else { - fmt.Println(err) - } - return - } - - _, err = connect.Exec(` - CREATE TABLE IF NOT EXISTS example ( - country_code FixedString(2), - os_id UInt8, - browser_id UInt8, - categories Array(Int16), - action_day Date, - action_time DateTime - ) engine=Memory - `) - - checkErr(err) - tx, err := connect.Begin() - checkErr(err) - stmt, err := tx.Prepare("INSERT INTO example (country_code, os_id, browser_id, categories, action_day, action_time) VALUES (?, ?, ?, ?, ?, ?)") - checkErr(err) - - for i := 0; i < 100; i++ { - if _, err := stmt.Exec( - "RU", - 10+i, - 100+i, - []int16{1, 2, 3}, - time.Now(), - time.Now(), - ); err != nil { - log.Fatal(err) - } - } - checkErr(tx.Commit()) - - col, err := column.Factory("country_code", "String", nil) - checkErr(err) - countriesExternalTable := clickhouse.ExternalTable{ - Name: "countries", - Values: [][]driver.Value{ - {"RU"}, - }, - Columns: []column.Column{col}, - } - - rows, err := connect.Query("SELECT country_code, os_id, browser_id, categories, action_day, action_time "+ - "FROM example WHERE country_code IN ?", countriesExternalTable) - checkErr(err) - for rows.Next() { - var ( - country string - os, browser uint8 - categories []int16 - actionDay, actionTime time.Time - ) - checkErr(rows.Scan(&country, &os, &browser, &categories, &actionDay, &actionTime)) - log.Printf("country: %s, os: %d, browser: %d, categories: %v, action_day: %s, action_time: %s", country, os, browser, categories, actionDay, actionTime) - } - - if _, err := connect.Exec("DROP TABLE example"); err != nil { - log.Fatal(err) - } -} - -func checkErr(err error) { - if err != nil { - log.Fatal(err) - } -} diff --git a/vendor/github.com/ClickHouse/clickhouse-go/examples/multiple.go b/vendor/github.com/ClickHouse/clickhouse-go/examples/multiple.go deleted file mode 100644 index 00456cdbbf..0000000000 --- a/vendor/github.com/ClickHouse/clickhouse-go/examples/multiple.go +++ /dev/null @@ -1,72 +0,0 @@ -package main - -import ( - "database/sql" - "fmt" - "log" - "time" - - "github.com/ClickHouse/clickhouse-go" -) - -func main() { - connect, err := sql.Open("clickhouse", "tcp://127.0.0.1:9000?username=&debug=true") - checkErr(err) - if err := connect.Ping(); err != nil { - if exception, ok := err.(*clickhouse.Exception); ok { - fmt.Printf("[%d] %s \n%s\n", exception.Code, exception.Message, exception.StackTrace) - } else { - fmt.Println(err) - } - return - } - - for i := 0; i < 10; i++ { - connect.Exec(fmt.Sprintf("DROP TABLE IF EXISTS example_%d", i)) - _, err = connect.Exec(fmt.Sprintf(` - CREATE TABLE example_%d ( - country_code FixedString(2), - os_id UInt8, - browser_id UInt8, - categories Array(Int16), - action_day Date, - action_time DateTime - ) engine=Memory - `, i)) - - checkErr(err) - } - for i := 0; i < 10; i++ { - go func(i int) { - for { - tx, err := connect.Begin() - checkErr(err) - stmt, err := tx.Prepare(fmt.Sprintf("INSERT INTO example_%d (country_code, os_id, browser_id, categories, action_day, action_time) VALUES (?, ?, ?, ?, ?, ?)", i)) - checkErr(err) - - for i := 0; i < 100; i++ { - if _, err := stmt.Exec( - "RU", - 10+i, - 100+i, - []int16{1, 2, 3}, - time.Now(), - time.Now(), - ); err != nil { - log.Fatal(err) - } - } - checkErr(tx.Commit()) - time.Sleep(time.Second) - } - }(i) - } - - <-time.Tick(time.Minute) -} - -func checkErr(err error) { - if err != nil { - log.Fatal(err) - } -} diff --git a/vendor/github.com/ClickHouse/clickhouse-go/examples/simple.go b/vendor/github.com/ClickHouse/clickhouse-go/examples/simple.go deleted file mode 100644 index d1886f644e..0000000000 --- a/vendor/github.com/ClickHouse/clickhouse-go/examples/simple.go +++ /dev/null @@ -1,76 +0,0 @@ -package main - -import ( - "database/sql" - "fmt" - "log" - "time" - - "github.com/ClickHouse/clickhouse-go" -) - -func main() { - connect, err := sql.Open("clickhouse", "tcp://127.0.0.1:9000?username=&compress=true&debug=true") - checkErr(err) - if err := connect.Ping(); err != nil { - if exception, ok := err.(*clickhouse.Exception); ok { - fmt.Printf("[%d] %s \n%s\n", exception.Code, exception.Message, exception.StackTrace) - } else { - fmt.Println(err) - } - return - } - - _, err = connect.Exec(` - CREATE TABLE IF NOT EXISTS example ( - country_code FixedString(2), - os_id UInt8, - browser_id UInt8, - categories Array(Int16), - action_day Date, - action_time DateTime - ) engine=Memory - `) - - checkErr(err) - tx, err := connect.Begin() - checkErr(err) - stmt, err := tx.Prepare("INSERT INTO example (country_code, os_id, browser_id, categories, action_day, action_time) VALUES (?, ?, ?, ?, ?, ?)") - checkErr(err) - - for i := 0; i < 100; i++ { - if _, err := stmt.Exec( - "RU", - 10+i, - 100+i, - []int16{1, 2, 3}, - time.Now(), - time.Now(), - ); err != nil { - log.Fatal(err) - } - } - checkErr(tx.Commit()) - rows, err := connect.Query("SELECT country_code, os_id, browser_id, categories, action_day, action_time FROM example") - checkErr(err) - for rows.Next() { - var ( - country string - os, browser uint8 - categories []int16 - actionDay, actionTime time.Time - ) - checkErr(rows.Scan(&country, &os, &browser, &categories, &actionDay, &actionTime)) - log.Printf("country: %s, os: %d, browser: %d, categories: %v, action_day: %s, action_time: %s", country, os, browser, categories, actionDay, actionTime) - } - - if _, err := connect.Exec("DROP TABLE example"); err != nil { - log.Fatal(err) - } -} - -func checkErr(err error) { - if err != nil { - log.Fatal(err) - } -} diff --git a/vendor/github.com/ClickHouse/clickhouse-go/examples/sqlx.go b/vendor/github.com/ClickHouse/clickhouse-go/examples/sqlx.go deleted file mode 100644 index f61c9be570..0000000000 --- a/vendor/github.com/ClickHouse/clickhouse-go/examples/sqlx.go +++ /dev/null @@ -1,78 +0,0 @@ -package main - -import ( - "fmt" - "log" - "time" - - "github.com/jmoiron/sqlx" - "github.com/ClickHouse/clickhouse-go" -) - -func main() { - connect, err := sqlx.Open("clickhouse", "tcp://127.0.0.1:9000?compress=true&debug=true") - checkErr(err) - if err := connect.Ping(); err != nil { - if exception, ok := err.(*clickhouse.Exception); ok { - fmt.Printf("[%d] %s \n%s\n", exception.Code, exception.Message, exception.StackTrace) - } else { - fmt.Println(err) - } - return - } - _, err = connect.Exec(` - CREATE TABLE IF NOT EXISTS example ( - country_code FixedString(2), - os_id UInt8, - browser_id UInt8, - categories Array(Int16), - action_day Date, - action_time DateTime - ) engine=Memory - `) - - checkErr(err) - tx, err := connect.Begin() - checkErr(err) - stmt, err := tx.Prepare("INSERT INTO example (country_code, os_id, browser_id, categories, action_day, action_time) VALUES (?, ?, ?, ?, ?, ?)") - checkErr(err) - - for i := 0; i < 100; i++ { - if _, err := stmt.Exec( - "RU", - 10+i, - 100+i, - []int16{1, 2, 3}, - time.Now(), - time.Now(), - ); err != nil { - log.Fatal(err) - } - } - checkErr(tx.Commit()) - - var items []struct { - CountryCode string `db:"country_code"` - OsID uint8 `db:"os_id"` - BrowserID uint8 `db:"browser_id"` - Categories []int16 `db:"categories"` - ActionTime time.Time `db:"action_time"` - ActionDay time.Time `db:"action_day"` - } - - checkErr(connect.Select(&items, "SELECT country_code, os_id, browser_id, categories, action_time, action_day FROM example")) - - for _, item := range items { - log.Printf("country: %s, os: %d, browser: %d, categories: %v, action_time: %s", item.CountryCode, item.OsID, item.BrowserID, item.Categories, item.ActionTime) - } - - if _, err := connect.Exec("DROP TABLE example"); err != nil { - log.Fatal(err) - } -} - -func checkErr(err error) { - if err != nil { - log.Fatal(err) - } -} diff --git a/vendor/github.com/ClickHouse/clickhouse-go/go.test.sh b/vendor/github.com/ClickHouse/clickhouse-go/go.test.sh old mode 100755 new mode 100644 diff --git a/vendor/github.com/ClickHouse/clickhouse-go/helpers_test.go b/vendor/github.com/ClickHouse/clickhouse-go/helpers_test.go deleted file mode 100644 index cf84f575fe..0000000000 --- a/vendor/github.com/ClickHouse/clickhouse-go/helpers_test.go +++ /dev/null @@ -1,65 +0,0 @@ -package clickhouse - -import ( - "testing" - - "github.com/stretchr/testify/assert" -) - -func Test_NumInput(t *testing.T) { - for query, num := range map[string]int{ - "SELECT * FROM example WHERE os_id = 42": 0, - "SELECT * FROM example WHERE email = 'name@mail'": 0, - "SELECT * FROM example WHERE email = 'na`me@mail'": 0, - "SELECT * FROM example WHERE email = 'na`m`e@mail'": 0, - "SELECT * FROM example WHERE email = 'na`m`e@m`ail'": 0, - "SELECT * FROM example WHERE os_id = @os_id AND browser_id = @os_id": 1, - "SELECT * FROM example WHERE os_id = @os_id AND browser_id = @os_id2": 2, - "SELECT * FROM example WHERE os_id in (@os_id,@browser_id) browser_id = @browser_id": 2, - "SELECT * FROM example WHERE os_id IN (@os_id, @browser_id) AND browser_id = @browser_id": 2, - "SELECT * FROM example WHERE os_id = ? AND browser_id = ?": 2, - "SELECT * FROM example WHERE os_id in (?,?) browser_id = ?": 3, - "SELECT * FROM example WHERE os_id IN (?, ?) AND browser_id = ?": 3, - "SELECT a ? '+' : '-'": 0, - "SELECT a ? '+' : '-' FROM example WHERE a = ? AND b IN(?)": 2, - `SELECT - a ? '+' : '-' - FROM example WHERE a = 42 and b in( - ?, - ?, - ? - ) - `: 3, - "SELECT * from EXAMPLE LIMIT ?": 1, - "SELECT * from EXAMPLE LIMIT ?, ?": 2, - "SELECT * from EXAMPLE LIMIT ? OFFSET ?": 2, - "SELECT * from EXAMPLE WHERE os_id like ?": 1, - "SELECT * FROM example WHERE a BETWEEN ? AND ?": 2, - "SELECT * FROM example WHERE a BETWEEN ? AND ? AND b = ?": 3, - "SELECT * FROM example WHERE a = ? AND b BETWEEN ? AND ?": 3, - "SELECT * FROM example WHERE a BETWEEN ? AND ? AND b BETWEEN ? AND ?": 4, - "SELECT replace(a, '\\'', '\"') FROM example WHERE b = ?": 1, - "SELECT * FROM example WHERE counter % ? = 0": 1, - "SELECT * FROM example WHERE modulo(counter, ?) = 0": 1, - } { - assert.Equal(t, num, numInput(query), query) - } -} - -func Benchmark_NumInput(b *testing.B) { - b.ReportAllocs() - for i := 0; i < b.N; i++ { - numInput("SELECT * FROM example WHERE os_id in (@os_id,@browser_id) browser_id = @browser_id") - } -} - -func Test_Quote(t *testing.T) { - for expected, value := range map[string]interface{}{ - "'a'": "a", - "1": 1, - "'a', 'b', 'c'": []string{"a", "b", "c"}, - "1, 2, 3, 4, 5": []int{1, 2, 3, 4, 5}, - } { - assert.Equal(t, expected, quote(value)) - } -} diff --git a/vendor/github.com/ClickHouse/clickhouse-go/issues_test.go b/vendor/github.com/ClickHouse/clickhouse-go/issues_test.go deleted file mode 100644 index dd6b30b3df..0000000000 --- a/vendor/github.com/ClickHouse/clickhouse-go/issues_test.go +++ /dev/null @@ -1,268 +0,0 @@ -// +build go1.8 - -package clickhouse - -import ( - "database/sql" - "testing" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -func Test_Issue38_uint64_support(t *testing.T) { - const ( - ddl = ` - CREATE TABLE clickhouse_test_uint64_support ( - A UInt64, - B UInt64, - C UInt64 - ) Engine=Memory - ` - dml = ` - INSERT INTO clickhouse_test_uint64_support ( - A, - B, - C - ) VALUES ( - ?, - ?, - ? - ) - ` - query = ` - SELECT - A, - B, - C - FROM clickhouse_test_uint64_support - ` - ) - if connect, err := sql.Open("clickhouse", "tcp://127.0.0.1:9000?debug=true"); assert.NoError(t, err) && assert.NoError(t, connect.Ping()) { - if _, err := connect.Exec("DROP TABLE IF EXISTS clickhouse_test_uint64_support"); assert.NoError(t, err) { - if _, err := connect.Exec(ddl); assert.NoError(t, err) { - if tx, err := connect.Begin(); assert.NoError(t, err) { - var maxUint64 uint64 = 1<<64 - 1 - if stmt, err := tx.Prepare(dml); assert.NoError(t, err) { - - _, err = stmt.Exec( - maxUint64, - maxUint64-1, - maxUint64-2, - ) - if !assert.NoError(t, err) { - return - } - - } - if assert.NoError(t, tx.Commit()) { - var item struct { - A uint64 - B uint64 - C uint64 - } - if rows, err := connect.Query(query); assert.NoError(t, err) { - - for rows.Next() { - err := rows.Scan( - &item.A, - &item.B, - &item.C, - ) - if !assert.NoError(t, err) { - return - } - } - assert.Equal(t, maxUint64, item.A) - assert.Equal(t, maxUint64-1, item.B) - assert.Equal(t, maxUint64-2, item.C) - } - } - } - } - } - } -} - -func Test_Issue42_Plain_SQL_Support(t *testing.T) { - const ( - ddl = ` - CREATE TABLE dbr_people ( - id UInt64, - name String, - email String - ) Engine=Memory - ` - dml = "INSERT INTO `dbr_people` (`id`,`name`,`email`) VALUES (?, ?, ?)" - query = "SELECT `id`,`name`,`email` FROM `dbr_people` WHERE `email` = 'jonathan@uservoice.com'" - ) - - if connect, err := sql.Open("clickhouse", "tcp://127.0.0.1:9000?debug=true"); assert.NoError(t, err) && assert.NoError(t, connect.Ping()) { - if _, err := connect.Exec("DROP TABLE IF EXISTS `dbr_people`"); assert.NoError(t, err) { - if _, err := connect.Exec(ddl); assert.NoError(t, err) { - if tx, err := connect.Begin(); assert.NoError(t, err) { - - if stmt, err := tx.Prepare(dml); assert.NoError(t, err) { - _, err = stmt.Exec( - 258, - "jonathan", - "jonathan@uservoice.com", - ) - if !assert.NoError(t, err) { - return - } - - } - if assert.NoError(t, tx.Commit()) { - var item struct { - ID uint64 - Name string - Email string - } - if rows, err := connect.Query(query); assert.NoError(t, err) { - - for rows.Next() { - err := rows.Scan( - &item.ID, - &item.Name, - &item.Email, - ) - if !assert.NoError(t, err) { - return - } - } - assert.Equal(t, uint64(258), item.ID) - assert.Equal(t, "jonathan", item.Name) - assert.Equal(t, "jonathan@uservoice.com", item.Email) - } - } - } - } - } - } -} - -func TestBytes(t *testing.T) { - connect, err := sql.Open("clickhouse", "tcp://127.0.0.1:9000?debug=true") - require.NoError(t, err) - require.NoError(t, connect.Ping()) - defer connect.Close() - - _, err = connect.Exec(`DROP TABLE IF EXISTS TestBytes`) - require.NoError(t, err) - _, err = connect.Exec(`CREATE TABLE TestBytes (s String) Engine=Memory`) - require.NoError(t, err) - - tx, err := connect.Begin() - require.NoError(t, err) - defer tx.Rollback() - - _, err = tx.Exec(`INSERT INTO TestBytes (s) VALUES (?)`, []byte("foo")) - assert.NoError(t, err) -} - -func TestNullableEnumWithoutLeadZero(t *testing.T) { - const ( - ddl = ` - CREATE TABLE test_nullable_enum_without_lead_zero ( - value Nullable(Enum8('A' = 1, 'B' = 2)), - value2 Nullable(Enum16('A' = 1, 'B' = 2)) - ) Engine=Memory - ` - dml = "INSERT INTO test_nullable_enum_without_lead_zero (value, value2) VALUES (?, ?)" - query = "SELECT value, value2 FROM test_nullable_enum_without_lead_zero" - ) - var data = [][]interface{}{ - {"A", nil}, - {"A", "B"}, - {nil, "B"}, - } - if connect, err := sql.Open("clickhouse", "tcp://127.0.0.1:9000?debug=true"); assert.NoError(t, err) && assert.NoError(t, connect.Ping()) { - if _, err := connect.Exec("DROP TABLE IF EXISTS test_nullable_enum_without_lead_zero"); assert.NoError(t, err) { - if _, err := connect.Exec(ddl); assert.NoError(t, err) { - if tx, err := connect.Begin(); assert.NoError(t, err) { - - if stmt, err := tx.Prepare(dml); assert.NoError(t, err) { - for _, v := range data { - if _, err = stmt.Exec(v...); !assert.NoError(t, err) { - return - } - } - - } - if assert.NoError(t, tx.Commit()) { - var item struct { - Value *string - Value2 *string - } - if rows, err := connect.Query(query); assert.NoError(t, err) { - var i int - for rows.Next() { - err := rows.Scan( - &item.Value, - &item.Value2, - ) - if !assert.NoError(t, err) { - return - } - switch v := item.Value; true { - case v != nil: - if !assert.Equal(t, data[i][0], *v) { - return - } - default: - if !assert.Equal(t, (*string)(nil), v) { - return - } - } - switch v := item.Value2; true { - case v != nil: - if !assert.Equal(t, data[i][1], *v) { - return - } - default: - if !assert.Equal(t, (*string)(nil), v) { - return - } - } - i++ - } - } - } - } - } - } - } -} - -func TestQuerySettings(t *testing.T) { - for i := 0; i < len(querySettingList); i++ { - for j := i + 1; j < len(querySettingList); j++ { - require.NotEqual(t, querySettingList[i].name, querySettingList[j].name) - } - } - - settings := "" - for _, info := range querySettingList { - settings += "&" + info.name + "=" - switch info.qsType { - case uintQS, intQS, timeQS: - settings += "1000" - case boolQS: - settings += "false" - } - } - - connect, err := sql.Open( - "clickhouse", - "tcp://127.0.0.1:9000?debug=true"+settings, - ) - require.Nil(t, err) - require.Nil(t, connect.Ping()) - defer connect.Close() - - _, err = connect.Query(`SELECT * FROM system.parts`) - if err != nil { - require.NotContains(t, err.Error(), "Unknown setting") - } -} diff --git a/vendor/github.com/ClickHouse/clickhouse-go/lib/binary/binary_benchmark_test.go b/vendor/github.com/ClickHouse/clickhouse-go/lib/binary/binary_benchmark_test.go deleted file mode 100644 index 3b9d928c0e..0000000000 --- a/vendor/github.com/ClickHouse/clickhouse-go/lib/binary/binary_benchmark_test.go +++ /dev/null @@ -1,129 +0,0 @@ -package binary - -import ( - "fmt" - "io/ioutil" - "math" - "testing" - "time" -) - -func Benchmark_Encoder_Uvarint(b *testing.B) { - encoder := NewEncoder(ioutil.Discard) - b.ReportAllocs() - for i := 0; i < b.N; i++ { - encoder.Uvarint(math.MaxUint64) - } -} - -func Benchmark_Encoder_Boolean(b *testing.B) { - encoder := NewEncoder(ioutil.Discard) - b.ReportAllocs() - for i := 0; i < b.N; i++ { - encoder.Bool(true) - } -} - -func Benchmark_Encoder_Int8(b *testing.B) { - encoder := NewEncoder(ioutil.Discard) - b.ReportAllocs() - for i := 0; i < b.N; i++ { - encoder.Int8(127) - } -} - -func Benchmark_Encoder_Int16(b *testing.B) { - encoder := NewEncoder(ioutil.Discard) - b.ReportAllocs() - for i := 0; i < b.N; i++ { - encoder.Int16(32767) - } -} - -func Benchmark_Encoder_Int32(b *testing.B) { - encoder := NewEncoder(ioutil.Discard) - b.ReportAllocs() - for i := 0; i < b.N; i++ { - encoder.Int32(2147483647) - } -} - -func Benchmark_Encoder_Int64(b *testing.B) { - encoder := NewEncoder(ioutil.Discard) - b.ReportAllocs() - for i := 0; i < b.N; i++ { - encoder.Int64(9223372036854775807) - } -} - -func Benchmark_Encoder_UInt8(b *testing.B) { - encoder := NewEncoder(ioutil.Discard) - b.ReportAllocs() - for i := 0; i < b.N; i++ { - encoder.UInt8(255) - } -} - -func Benchmark_Encoder_UInt16(b *testing.B) { - encoder := NewEncoder(ioutil.Discard) - b.ReportAllocs() - for i := 0; i < b.N; i++ { - encoder.UInt16(65535) - } -} - -func Benchmark_Encoder_UInt32(b *testing.B) { - encoder := NewEncoder(ioutil.Discard) - b.ReportAllocs() - for i := 0; i < b.N; i++ { - encoder.UInt32(4294967295) - } -} - -func Benchmark_Encoder_UInt64(b *testing.B) { - encoder := NewEncoder(ioutil.Discard) - b.ReportAllocs() - for i := 0; i < b.N; i++ { - encoder.UInt64(18446744073709551615) - } -} - -func Benchmark_Encoder_Float32(b *testing.B) { - encoder := NewEncoder(ioutil.Discard) - b.ReportAllocs() - for i := 0; i < b.N; i++ { - encoder.Float32(2147483647) - } -} - -func Benchmark_Encoder_Float64(b *testing.B) { - encoder := NewEncoder(ioutil.Discard) - b.ReportAllocs() - for i := 0; i < b.N; i++ { - encoder.Float64(2147483647) - } -} - -func Benchmark_Encoder_String(b *testing.B) { - var ( - str = fmt.Sprintf("str_%d", time.Now().Unix()) - encoder = NewEncoder(ioutil.Discard) - ) - b.ResetTimer() - b.ReportAllocs() - for i := 0; i < b.N; i++ { - encoder.String(str) - } -} - -func Benchmark_Encoder_RawString(b *testing.B) { - var ( - str = []byte(fmt.Sprintf("str_%d", time.Now().Unix())) - encoder = NewEncoder(ioutil.Discard) - ) - b.ResetTimer() - b.ReportAllocs() - for i := 0; i < b.N; i++ { - encoder.RawString(str) - } -} diff --git a/vendor/github.com/ClickHouse/clickhouse-go/lib/binary/binary_test.go b/vendor/github.com/ClickHouse/clickhouse-go/lib/binary/binary_test.go deleted file mode 100644 index 94299cc3e7..0000000000 --- a/vendor/github.com/ClickHouse/clickhouse-go/lib/binary/binary_test.go +++ /dev/null @@ -1,463 +0,0 @@ -package binary - -import ( - "bytes" - "fmt" - "io" - "math" - "testing" - "time" - - "github.com/stretchr/testify/assert" -) - -type testErrorReadWriter struct{} - -func (*testErrorReadWriter) Read([]byte) (int, error) { return 0, io.EOF } -func (*testErrorReadWriter) Write([]byte) (int, error) { return 0, io.EOF } - -func Test_Uvarint(t *testing.T) { - var ( - buf bytes.Buffer - encoder = NewEncoder(&buf) - decoder = NewDecoder(&buf) - ) - - for i := 1; i < 1000000000000000; i *= 42 { - if err := encoder.Uvarint(uint64(i)); assert.NoError(t, err) { - if v, err := decoder.Uvarint(); assert.NoError(t, err) { - assert.Equal(t, uint64(i), v) - } - } - } - - if err := encoder.Uvarint(math.MaxUint64); assert.NoError(t, err) { - if v, err := decoder.Uvarint(); assert.NoError(t, err) { - assert.Equal(t, uint64(math.MaxUint64), v) - } - } - - if err := NewEncoder(&testErrorReadWriter{}).Uvarint(0); assert.Error(t, err) { - assert.Equal(t, io.EOF, err) - } - - if v, err := NewDecoder(&testErrorReadWriter{}).Uvarint(); assert.Error(t, err) { - if assert.Equal(t, io.EOF, err) { - assert.Equal(t, uint64(0), v) - } - } -} - -func Test_Boolean(t *testing.T) { - var ( - buf bytes.Buffer - encoder = NewEncoder(&buf) - decoder = NewDecoder(&buf) - ) - - if err := encoder.Bool(false); assert.NoError(t, err) { - if v, err := decoder.Bool(); assert.NoError(t, err) { - assert.False(t, v) - } - } - - if err := encoder.Bool(true); assert.NoError(t, err) { - if v, err := decoder.Bool(); assert.NoError(t, err) { - assert.True(t, v) - } - } - - if err := NewEncoder(&testErrorReadWriter{}).Bool(true); assert.Error(t, err) { - assert.Equal(t, io.EOF, err) - } - - if v, err := NewDecoder(&testErrorReadWriter{}).Bool(); assert.Error(t, err) { - if assert.Equal(t, io.EOF, err) { - assert.Equal(t, false, v) - } - } -} - -func Test_Int8(t *testing.T) { - var ( - buf bytes.Buffer - encoder = NewEncoder(&buf) - decoder = NewDecoder(&buf) - ) - - for i := -128; i <= 127; i++ { - if err := encoder.Int8(int8(i)); assert.NoError(t, err) { - if v, err := decoder.Int8(); assert.NoError(t, err) { - assert.Equal(t, int8(i), v) - } - } - } - - if err := encoder.Int8(math.MinInt8); assert.NoError(t, err) { - if v, err := decoder.Int8(); assert.NoError(t, err) { - assert.Equal(t, int8(math.MinInt8), v) - } - } - - if err := encoder.Int8(math.MaxInt8); assert.NoError(t, err) { - if v, err := decoder.Int8(); assert.NoError(t, err) { - assert.Equal(t, int8(math.MaxInt8), v) - } - } - - if err := NewEncoder(&testErrorReadWriter{}).Int8(0); assert.Error(t, err) { - assert.Equal(t, io.EOF, err) - } - - if v, err := NewDecoder(&testErrorReadWriter{}).Int8(); assert.Error(t, err) { - if assert.Equal(t, io.EOF, err) { - assert.Equal(t, int8(0), v) - } - } -} - -func Test_Int16(t *testing.T) { - var ( - buf bytes.Buffer - encoder = NewEncoder(&buf) - decoder = NewDecoder(&buf) - ) - - for i := -32768; i <= 32767; i += 10 { - if err := encoder.Int16(int16(i)); assert.NoError(t, err) { - if v, err := decoder.Int16(); assert.NoError(t, err) { - assert.Equal(t, int16(i), v) - } - } - } - - if err := encoder.Int16(math.MinInt16); assert.NoError(t, err) { - if v, err := decoder.Int16(); assert.NoError(t, err) { - assert.Equal(t, int16(math.MinInt16), v) - } - } - - if err := encoder.Int16(math.MaxInt16); assert.NoError(t, err) { - if v, err := decoder.Int16(); assert.NoError(t, err) { - assert.Equal(t, int16(math.MaxInt16), v) - } - } - - if err := NewEncoder(&testErrorReadWriter{}).Int16(0); assert.Error(t, err) { - assert.Equal(t, io.EOF, err) - } - - if v, err := NewDecoder(&testErrorReadWriter{}).Int16(); assert.Error(t, err) { - if assert.Equal(t, io.EOF, err) { - assert.Equal(t, int16(0), v) - } - } -} -func Test_Int32(t *testing.T) { - var ( - buf bytes.Buffer - encoder = NewEncoder(&buf) - decoder = NewDecoder(&buf) - ) - - for i := -2147483648; i <= 2147483647; i += 100000 { - if err := encoder.Int32(int32(i)); assert.NoError(t, err) { - if v, err := decoder.Int32(); assert.NoError(t, err) { - assert.Equal(t, int32(i), v) - } - } - } - - if err := encoder.Int32(math.MinInt32); assert.NoError(t, err) { - if v, err := decoder.Int32(); assert.NoError(t, err) { - assert.Equal(t, int32(math.MinInt32), v) - } - } - - if err := encoder.Int32(math.MaxInt32); assert.NoError(t, err) { - if v, err := decoder.Int32(); assert.NoError(t, err) { - assert.Equal(t, int32(math.MaxInt32), v) - } - } - - if err := NewEncoder(&testErrorReadWriter{}).Int32(0); assert.Error(t, err) { - assert.Equal(t, io.EOF, err) - } - - if v, err := NewDecoder(&testErrorReadWriter{}).Int32(); assert.Error(t, err) { - if assert.Equal(t, io.EOF, err) { - assert.Equal(t, int32(0), v) - } - } -} - -func Test_Int64(t *testing.T) { - var ( - buf bytes.Buffer - encoder = NewEncoder(&buf) - decoder = NewDecoder(&buf) - ) - - for i := -2147483648; i <= 2147483647*2; i += 100000 { - if err := encoder.Int64(int64(i)); assert.NoError(t, err) { - if v, err := decoder.Int64(); assert.NoError(t, err) { - assert.Equal(t, int64(i), v) - } - } - } - - if err := encoder.Int64(math.MinInt64); assert.NoError(t, err) { - if v, err := decoder.Int64(); assert.NoError(t, err) { - assert.Equal(t, int64(math.MinInt64), v) - } - } - - if err := encoder.Int64(math.MaxInt64); assert.NoError(t, err) { - if v, err := decoder.Int64(); assert.NoError(t, err) { - assert.Equal(t, int64(math.MaxInt64), v) - } - } - - if err := NewEncoder(&testErrorReadWriter{}).Int64(0); assert.Error(t, err) { - assert.Equal(t, io.EOF, err) - } - - if v, err := NewDecoder(&testErrorReadWriter{}).Int64(); assert.Error(t, err) { - if assert.Equal(t, io.EOF, err) { - assert.Equal(t, int64(0), v) - } - } -} - -func Test_UInt8(t *testing.T) { - var ( - buf bytes.Buffer - encoder = NewEncoder(&buf) - decoder = NewDecoder(&buf) - ) - - for i := 0; i <= 255; i++ { - if err := encoder.UInt8(uint8(i)); assert.NoError(t, err) { - if v, err := decoder.UInt8(); assert.NoError(t, err) { - assert.Equal(t, uint8(i), v) - } - } - } - - if err := encoder.UInt8(math.MaxUint8); assert.NoError(t, err) { - if v, err := decoder.UInt8(); assert.NoError(t, err) { - assert.Equal(t, uint8(math.MaxUint8), v) - } - } - - if err := NewEncoder(&testErrorReadWriter{}).UInt8(0); assert.Error(t, err) { - assert.Equal(t, io.EOF, err) - } - - if v, err := NewDecoder(&testErrorReadWriter{}).UInt8(); assert.Error(t, err) { - if assert.Equal(t, io.EOF, err) { - assert.Equal(t, uint8(0), v) - } - } -} - -func Test_UInt16(t *testing.T) { - var ( - buf bytes.Buffer - encoder = NewEncoder(&buf) - decoder = NewDecoder(&buf) - ) - - for i := 0; i <= 65535; i += 10 { - if err := encoder.UInt16(uint16(i)); assert.NoError(t, err) { - if v, err := decoder.UInt16(); assert.NoError(t, err) { - assert.Equal(t, uint16(i), v) - } - } - } - - if err := encoder.UInt16(math.MaxUint16); assert.NoError(t, err) { - if v, err := decoder.UInt16(); assert.NoError(t, err) { - assert.Equal(t, uint16(math.MaxUint16), v) - } - } - - if err := NewEncoder(&testErrorReadWriter{}).UInt16(0); assert.Error(t, err) { - assert.Equal(t, io.EOF, err) - } - - if v, err := NewDecoder(&testErrorReadWriter{}).UInt16(); assert.Error(t, err) { - if assert.Equal(t, io.EOF, err) { - assert.Equal(t, uint16(0), v) - } - } -} -func Test_UInt32(t *testing.T) { - var ( - buf bytes.Buffer - encoder = NewEncoder(&buf) - decoder = NewDecoder(&buf) - ) - - for i := 0; i <= 4294967295; i += 100000 { - if err := encoder.UInt32(uint32(i)); assert.NoError(t, err) { - if v, err := decoder.UInt32(); assert.NoError(t, err) { - assert.Equal(t, uint32(i), v) - } - } - } - - if err := encoder.UInt32(math.MaxUint32); assert.NoError(t, err) { - if v, err := decoder.UInt32(); assert.NoError(t, err) { - assert.Equal(t, uint32(math.MaxUint32), v) - } - } - - if err := NewEncoder(&testErrorReadWriter{}).UInt32(0); assert.Error(t, err) { - assert.Equal(t, io.EOF, err) - } - - if v, err := NewDecoder(&testErrorReadWriter{}).UInt32(); assert.Error(t, err) { - if assert.Equal(t, io.EOF, err) { - assert.Equal(t, uint32(0), v) - } - } -} - -func Test_UInt64(t *testing.T) { - var ( - buf bytes.Buffer - encoder = NewEncoder(&buf) - decoder = NewDecoder(&buf) - ) - - for i := 0; i <= 4294967295*2; i += 100000 { - if err := encoder.UInt64(uint64(i)); assert.NoError(t, err) { - if v, err := decoder.UInt64(); assert.NoError(t, err) { - assert.Equal(t, uint64(i), v) - } - } - } - - if err := encoder.UInt64(math.MaxUint64); assert.NoError(t, err) { - if v, err := decoder.UInt64(); assert.NoError(t, err) { - assert.Equal(t, uint64(math.MaxUint64), v) - } - } - - if err := NewEncoder(&testErrorReadWriter{}).UInt64(0); assert.Error(t, err) { - assert.Equal(t, io.EOF, err) - } - - if v, err := NewDecoder(&testErrorReadWriter{}).UInt64(); assert.Error(t, err) { - if assert.Equal(t, io.EOF, err) { - assert.Equal(t, uint64(0), v) - } - } -} - -func Test_Float32(t *testing.T) { - var ( - buf bytes.Buffer - encoder = NewEncoder(&buf) - decoder = NewDecoder(&buf) - ) - - for i := -2147483648; i <= 2147483647; i += 100000 { - if err := encoder.Float32(float32(i)); assert.NoError(t, err) { - if v, err := decoder.Float32(); assert.NoError(t, err) { - assert.Equal(t, float32(i), v) - } - } - } - - if err := encoder.Float32(math.MinInt32); assert.NoError(t, err) { - if v, err := decoder.Float32(); assert.NoError(t, err) { - assert.Equal(t, float32(math.MinInt32), v) - } - } - - if err := encoder.Float32(math.MaxInt32); assert.NoError(t, err) { - if v, err := decoder.Float32(); assert.NoError(t, err) { - assert.Equal(t, float32(math.MaxInt32), v) - } - } - - if err := NewEncoder(&testErrorReadWriter{}).Float32(0); assert.Error(t, err) { - assert.Equal(t, io.EOF, err) - } - - if v, err := NewDecoder(&testErrorReadWriter{}).Float32(); assert.Error(t, err) { - if assert.Equal(t, io.EOF, err) { - assert.Equal(t, float32(0), v) - } - } -} - -func Test_Float64(t *testing.T) { - var ( - buf bytes.Buffer - encoder = NewEncoder(&buf) - decoder = NewDecoder(&buf) - ) - - for i := -2147483648; i <= 2147483647*2; i += 100000 { - if err := encoder.Float64(float64(i)); assert.NoError(t, err) { - if v, err := decoder.Float64(); assert.NoError(t, err) { - assert.Equal(t, float64(i), v) - } - } - } - - if err := encoder.Float64(math.MinInt64); assert.NoError(t, err) { - if v, err := decoder.Float64(); assert.NoError(t, err) { - assert.Equal(t, float64(math.MinInt64), v) - } - } - - if err := encoder.Float64(math.MaxInt32); assert.NoError(t, err) { - if v, err := decoder.Float64(); assert.NoError(t, err) { - assert.Equal(t, float64(math.MaxInt32), v) - } - } - - if err := NewEncoder(&testErrorReadWriter{}).Float64(0); assert.Error(t, err) { - assert.Equal(t, io.EOF, err) - } - - if v, err := NewDecoder(&testErrorReadWriter{}).Float64(); assert.Error(t, err) { - if assert.Equal(t, io.EOF, err) { - assert.Equal(t, float64(0), v) - } - } -} - -func Test_String(t *testing.T) { - var ( - buf bytes.Buffer - str = fmt.Sprintf("str_%d", time.Now().Unix()) - encoder = NewEncoder(&buf) - decoder = NewDecoder(&buf) - ) - - if err := encoder.String(str); assert.NoError(t, err) { - if v, err := decoder.String(); assert.NoError(t, err) { - assert.Equal(t, str, v) - } - } -} - -func Test_RawString(t *testing.T) { - var ( - buf bytes.Buffer - str = []byte(fmt.Sprintf("str_%d", time.Now().Unix())) - encoder = NewEncoder(&buf) - decoder = NewDecoder(&buf) - ) - - if err := encoder.RawString(str); assert.NoError(t, err) { - if v, err := decoder.String(); assert.NoError(t, err) { - assert.Equal(t, string(str), v) - } - } -} diff --git a/vendor/github.com/ClickHouse/clickhouse-go/lib/binary/compress_test.go b/vendor/github.com/ClickHouse/clickhouse-go/lib/binary/compress_test.go deleted file mode 100644 index ecc3a6de93..0000000000 --- a/vendor/github.com/ClickHouse/clickhouse-go/lib/binary/compress_test.go +++ /dev/null @@ -1,107 +0,0 @@ -package binary - -import ( - "log" - "math/rand" - "testing" - - "github.com/stretchr/testify/assert" - - bklz4 "github.com/bkaradzic/go-lz4" - cflz4 "github.com/cloudflare/golz4" - ownlz4 "github.com/ClickHouse/clickhouse-go/lib/lz4" - pilz4 "github.com/pierrec/lz4" -) - -func Test_CompressCorrect(t *testing.T) { - var cases = [][]byte{genBytes(5), genBytes(25), genBytes(255), genBytes(2555), genBytes(25555)} - - for _, c := range cases { - // cfRes is the correct answer - cfRes := GetCfEncode(c) - - ownRes := GetOwnEncode(c) - bkRes := GetBkEncode(c) - piRes := GetPiEncode(c) - - assert.Equal(t, cfRes, ownRes, "own not matched") - assert.Equal(t, cfRes, bkRes, "bk not matched") - assert.NotEqual(t, cfRes, piRes, "pi matched") - } -} - -func Benchmark_CompressCf(b *testing.B) { - var c = genBytes(1 << 10) - for i := 0; i < b.N; i++ { - GetCfEncode(c) - } -} - -// Poor performance mostly due to https://github.com/bkaradzic/go-lz4/issues/21 -func Benchmark_CompressBk(b *testing.B) { - var c = genBytes(1 << 10) - for i := 0; i < b.N; i++ { - GetBkEncode(c) - } -} - -func Benchmark_CompressOwn(b *testing.B) { - var c = genBytes(1 << 10) - for i := 0; i < b.N; i++ { - GetOwnEncode(c) - } -} - -func genBytes(n int) []byte { - var res = make([]byte, n) - - for i := 0; i < n; i++ { - res[i] = byte(rand.Int() % 122) - } - return res -} - -func GetCfEncode(in []byte) []byte { - b := cflz4.CompressBound(in) - out := make([]byte, b) - compressedSize, err := cflz4.Compress(in, out) - if err != nil { - log.Fatal(err) - } - return out[:compressedSize] -} - -func GetBkEncode(in []byte) []byte { - b := bklz4.CompressBound(len(in)) - out := make([]byte, b) - out2, err := bklz4.Encode(out, in) - if err != nil { - log.Fatal(err) - } - - // here we should skip 4 bytes - // go-lz4 saves a uint32 with the original uncompressed length at the beginning of the encoded buffer. They may get in the way of interoperability with other implementations. - return out2[4:] -} - -func GetPiEncode(in []byte) []byte { - b := pilz4.CompressBlockBound(len(in)) - out := make([]byte, b) - - var hashTable = make([]int, 65536) - compressedSize, err := pilz4.CompressBlock(in, out, hashTable) - if err != nil { - log.Fatal(err) - } - return out[:compressedSize] -} - -func GetOwnEncode(in []byte) []byte { - b := ownlz4.CompressBound(len(in)) - out := make([]byte, b) - compressedSize, err := ownlz4.Encode(out, in) - if err != nil { - log.Fatal(err) - } - return out[:compressedSize] -} diff --git a/vendor/github.com/ClickHouse/clickhouse-go/lib/cityhash102/cityhash_test.go b/vendor/github.com/ClickHouse/clickhouse-go/lib/cityhash102/cityhash_test.go deleted file mode 100644 index 311c685b2c..0000000000 --- a/vendor/github.com/ClickHouse/clickhouse-go/lib/cityhash102/cityhash_test.go +++ /dev/null @@ -1,65 +0,0 @@ -package cityhash102 - -import ( - "bufio" - "os" - "strconv" - "strings" - "testing" -) - -const ( - kSeed0 uint64 = 1234567 - kSeed1 uint64 = k0 -) - -type TestCase struct { - key string - lower uint64 - upper uint64 -} - -var testdata = []TestCase{} - -func buildData(t *testing.T) { - f, err := os.Open("testdata/hashs.txt") - if err != nil { - t.Fatal(err) - } - scanner := bufio.NewScanner(f) - - var lower uint64 - var upper uint64 - for scanner.Scan() { - strs := strings.Split(scanner.Text(), ",") - - lower, _ = strconv.ParseUint(strs[1], 16, 64) - upper, _ = strconv.ParseUint(strs[2], 16, 64) - - testdata = append(testdata, TestCase{strs[0], lower, upper}) - } -} - -func check(str string, expected, actual uint64, t *testing.T) { - if expected != actual { - t.Errorf("ERROR: %s expected 0x%x but got 0x%x\n", str, expected, actual) - } -} - -func test(str string, lower uint64, upper uint64, t *testing.T) { - var u Uint128 = CityHash128([]byte(str), uint32(len(str))) - - check(str, lower, u.Lower64(), t) - check(str, upper, u.Higher64(), t) -} - -func Test_Hash(t *testing.T) { - buildData(t) - - var i int - for i = 0; i < len(testdata); i++ { - t.Logf("INFO: offset = %d, length = %d", i, len(testdata)) - test(testdata[i].key, testdata[i].lower, testdata[i].upper, t) - } - return -} diff --git a/vendor/github.com/ClickHouse/clickhouse-go/lib/cityhash102/testdata/cityhash.cpp b/vendor/github.com/ClickHouse/clickhouse-go/lib/cityhash102/testdata/cityhash.cpp deleted file mode 100644 index 44f551aa6d..0000000000 --- a/vendor/github.com/ClickHouse/clickhouse-go/lib/cityhash102/testdata/cityhash.cpp +++ /dev/null @@ -1,365 +0,0 @@ - -#include -#include -#include -#include -#include - -typedef uint8_t uint8; -typedef uint32_t uint32; -typedef uint64_t uint64; -typedef std::pair uint128; - -using namespace std; - -uint64 Uint128Low64(const uint128& x) { return x.first; } -uint64 Uint128High64(const uint128& x) { return x.second; } - -// Hash function for a byte array. -uint64 CityHash64(const char *buf, size_t len); - -// Hash function for a byte array. For convenience, a 64-bit seed is also -// hashed into the result. -uint64 CityHash64WithSeed(const char *buf, size_t len, uint64 seed); - -// Hash function for a byte array. For convenience, two seeds are also -// hashed into the result. -uint64 CityHash64WithSeeds(const char *buf, size_t len, - uint64 seed0, uint64 seed1); - -// Hash function for a byte array. -uint128 CityHash128(const char *s, size_t len); - -// Hash function for a byte array. For convenience, a 128-bit seed is also -// hashed into the result. -uint128 CityHash128WithSeed(const char *s, size_t len, uint128 seed); - - - uint64 Hash128to64(const uint128& x) { - // Murmur-inspired hashing. - const uint64 kMul = 0x9ddfea08eb382d69ULL; - uint64 a = (Uint128Low64(x) ^ Uint128High64(x)) * kMul; - a ^= (a >> 47); - uint64 b = (Uint128High64(x) ^ a) * kMul; - b ^= (b >> 47); - b *= kMul; - return b; -} - - -#define uint32_in_expected_order(x) (x) -#define uint64_in_expected_order(x) (x) - -static uint64 UNALIGNED_LOAD64(const char *p) { - uint64 result; - memcpy(&result, p, sizeof(result)); - return result; -} - -static uint32 UNALIGNED_LOAD32(const char *p) { - uint32 result; - memcpy(&result, p, sizeof(result)); - return result; -} - -static uint64 Fetch64(const char *p) { - return uint64_in_expected_order(UNALIGNED_LOAD64(p)); -} - -static uint32 Fetch32(const char *p) { - return uint32_in_expected_order(UNALIGNED_LOAD32(p)); -} - -// Some primes between 2^63 and 2^64 for various uses. -static const uint64 k0 = 0xc3a5c85c97cb3127ULL; -static const uint64 k1 = 0xb492b66fbe98f273ULL; -static const uint64 k2 = 0x9ae16a3b2f90404fULL; -static const uint64 k3 = 0xc949d7c7509e6557ULL; - -// Bitwise right rotate. Normally this will compile to a single -// instruction, especially if the shift is a manifest constant. -static uint64 Rotate(uint64 val, int shift) { - // Avoid shifting by 64: doing so yields an undefined result. - return shift == 0 ? val : ((val >> shift) | (val << (64 - shift))); -} - -// Equivalent to Rotate(), but requires the second arg to be non-zero. -// On x86-64, and probably others, it's possible for this to compile -// to a single instruction if both args are already in registers. -static uint64 RotateByAtLeast1(uint64 val, int shift) { - return (val >> shift) | (val << (64 - shift)); -} - -static uint64 ShiftMix(uint64 val) { - return val ^ (val >> 47); -} - -static uint64 HashLen16(uint64 u, uint64 v) { - return Hash128to64(uint128(u, v)); -} - -static uint64 HashLen0to16(const char *s, size_t len) { - if (len > 8) { - uint64 a = Fetch64(s); - uint64 b = Fetch64(s + len - 8); - return HashLen16(a, RotateByAtLeast1(b + len, len)) ^ b; - } - if (len >= 4) { - uint64 a = Fetch32(s); - return HashLen16(len + (a << 3), Fetch32(s + len - 4)); - } - if (len > 0) { - uint8 a = s[0]; - uint8 b = s[len >> 1]; - uint8 c = s[len - 1]; - uint32 y = static_cast(a) + (static_cast(b) << 8); - uint32 z = len + (static_cast(c) << 2); - return ShiftMix(y * k2 ^ z * k3) * k2; - } - return k2; -} - -// This probably works well for 16-byte strings as well, but it may be overkill -// in that case. -static uint64 HashLen17to32(const char *s, size_t len) { - uint64 a = Fetch64(s) * k1; - uint64 b = Fetch64(s + 8); - uint64 c = Fetch64(s + len - 8) * k2; - uint64 d = Fetch64(s + len - 16) * k0; - return HashLen16(Rotate(a - b, 43) + Rotate(c, 30) + d, - a + Rotate(b ^ k3, 20) - c + len); -} - -// Return a 16-byte hash for 48 bytes. Quick and dirty. -// Callers do best to use "random-looking" values for a and b. -static pair WeakHashLen32WithSeeds( - uint64 w, uint64 x, uint64 y, uint64 z, uint64 a, uint64 b) { - a += w; - b = Rotate(b + a + z, 21); - uint64 c = a; - a += x; - a += y; - b += Rotate(a, 44); - return make_pair(a + z, b + c); -} - -// Return a 16-byte hash for s[0] ... s[31], a, and b. Quick and dirty. -static pair WeakHashLen32WithSeeds( - const char* s, uint64 a, uint64 b) { - return WeakHashLen32WithSeeds(Fetch64(s), - Fetch64(s + 8), - Fetch64(s + 16), - Fetch64(s + 24), - a, - b); -} - -// Return an 8-byte hash for 33 to 64 bytes. -static uint64 HashLen33to64(const char *s, size_t len) { - uint64 z = Fetch64(s + 24); - uint64 a = Fetch64(s) + (len + Fetch64(s + len - 16)) * k0; - uint64 b = Rotate(a + z, 52); - uint64 c = Rotate(a, 37); - a += Fetch64(s + 8); - c += Rotate(a, 7); - a += Fetch64(s + 16); - uint64 vf = a + z; - uint64 vs = b + Rotate(a, 31) + c; - a = Fetch64(s + 16) + Fetch64(s + len - 32); - z = Fetch64(s + len - 8); - b = Rotate(a + z, 52); - c = Rotate(a, 37); - a += Fetch64(s + len - 24); - c += Rotate(a, 7); - a += Fetch64(s + len - 16); - uint64 wf = a + z; - uint64 ws = b + Rotate(a, 31) + c; - uint64 r = ShiftMix((vf + ws) * k2 + (wf + vs) * k0); - return ShiftMix(r * k0 + vs) * k2; -} - -uint64 CityHash64(const char *s, size_t len) { - if (len <= 32) { - if (len <= 16) { - return HashLen0to16(s, len); - } else { - return HashLen17to32(s, len); - } - } else if (len <= 64) { - return HashLen33to64(s, len); - } - - // For strings over 64 bytes we hash the end first, and then as we - // loop we keep 56 bytes of state: v, w, x, y, and z. - uint64 x = Fetch64(s); - uint64 y = Fetch64(s + len - 16) ^ k1; - uint64 z = Fetch64(s + len - 56) ^ k0; - pair v = WeakHashLen32WithSeeds(s + len - 64, len, y); - pair w = WeakHashLen32WithSeeds(s + len - 32, len * k1, k0); - z += ShiftMix(v.second) * k1; - x = Rotate(z + x, 39) * k1; - y = Rotate(y, 33) * k1; - - // Decrease len to the nearest multiple of 64, and operate on 64-byte chunks. - len = (len - 1) & ~static_cast(63); - do { - x = Rotate(x + y + v.first + Fetch64(s + 16), 37) * k1; - y = Rotate(y + v.second + Fetch64(s + 48), 42) * k1; - x ^= w.second; - y ^= v.first; - z = Rotate(z ^ w.first, 33); - v = WeakHashLen32WithSeeds(s, v.second * k1, x + w.first); - w = WeakHashLen32WithSeeds(s + 32, z + w.second, y); - std::swap(z, x); - s += 64; - len -= 64; - } while (len != 0); - return HashLen16(HashLen16(v.first, w.first) + ShiftMix(y) * k1 + z, - HashLen16(v.second, w.second) + x); -} - -uint64 CityHash64WithSeed(const char *s, size_t len, uint64 seed) { - return CityHash64WithSeeds(s, len, k2, seed); -} - -uint64 CityHash64WithSeeds(const char *s, size_t len, - uint64 seed0, uint64 seed1) { - return HashLen16(CityHash64(s, len) - seed0, seed1); -} - -// A subroutine for CityHash128(). Returns a decent 128-bit hash for strings -// of any length representable in ssize_t. Based on City and Murmur. -static uint128 CityMurmur(const char *s, size_t len, uint128 seed) { - uint64 a = Uint128Low64(seed); - uint64 b = Uint128High64(seed); - uint64 c = 0; - uint64 d = 0; - ssize_t l = len - 16; - if (l <= 0) { // len <= 16 - a = ShiftMix(a * k1) * k1; - c = b * k1 + HashLen0to16(s, len); - d = ShiftMix(a + (len >= 8 ? Fetch64(s) : c)); - } else { // len > 16 - c = HashLen16(Fetch64(s + len - 8) + k1, a); - d = HashLen16(b + len, c + Fetch64(s + len - 16)); - a += d; - do { - a ^= ShiftMix(Fetch64(s) * k1) * k1; - a *= k1; - b ^= a; - c ^= ShiftMix(Fetch64(s + 8) * k1) * k1; - c *= k1; - d ^= c; - s += 16; - l -= 16; - } while (l > 0); - } - a = HashLen16(a, c); - b = HashLen16(d, b); - return uint128(a ^ b, HashLen16(b, a)); -} - -uint128 CityHash128WithSeed(const char *s, size_t len, uint128 seed) { - if (len < 128) { - return CityMurmur(s, len, seed); - } - - // We expect len >= 128 to be the common case. Keep 56 bytes of state: - // v, w, x, y, and z. - pair v, w; - uint64 x = Uint128Low64(seed); - uint64 y = Uint128High64(seed); - uint64 z = len * k1; - v.first = Rotate(y ^ k1, 49) * k1 + Fetch64(s); - v.second = Rotate(v.first, 42) * k1 + Fetch64(s + 8); - w.first = Rotate(y + z, 35) * k1 + x; - w.second = Rotate(x + Fetch64(s + 88), 53) * k1; - - // This is the same inner loop as CityHash64(), manually unrolled. - do { - x = Rotate(x + y + v.first + Fetch64(s + 16), 37) * k1; - y = Rotate(y + v.second + Fetch64(s + 48), 42) * k1; - - x ^= w.second; - y ^= v.first; - z = Rotate(z ^ w.first, 33); - v = WeakHashLen32WithSeeds(s, v.second * k1, x + w.first); - w = WeakHashLen32WithSeeds(s + 32, z + w.second, y); - std::swap(z, x); - s += 64; - x = Rotate(x + y + v.first + Fetch64(s + 16), 37) * k1; - y = Rotate(y + v.second + Fetch64(s + 48), 42) * k1; - x ^= w.second; - y ^= v.first; - z = Rotate(z ^ w.first, 33); - v = WeakHashLen32WithSeeds(s, v.second * k1, x + w.first); - w = WeakHashLen32WithSeeds(s + 32, z + w.second, y); - std::swap(z, x); - s += 64; - len -= 128; - - } while (len >= 128); - y += Rotate(w.first, 37) * k0 + z; - x += Rotate(v.first + z, 49) * k0; - - // If 0 < len < 128, hash up to 4 chunks of 32 bytes each from the end of s. - for (size_t tail_done = 0; tail_done < len; ) { - tail_done += 32; - y = Rotate(y - x, 42) * k0 + v.second; - w.first += Fetch64(s + len - tail_done + 16); - x = Rotate(x, 49) * k0 + w.first; - w.first += v.first; - v = WeakHashLen32WithSeeds(s + len - tail_done, v.first, v.second); - } - // At this point our 48 bytes of state should contain more than - // enough information for a strong 128-bit hash. We use two - // different 48-byte-to-8-byte hashes to get a 16-byte final result. - x = HashLen16(x, v.first); - y = HashLen16(y, w.first); - return uint128(HashLen16(x + v.second, w.second) + y, - HashLen16(x + w.second, y + v.second)); -} - -uint128 CityHash128(const char *s, size_t len) { - if (len >= 16) { - return CityHash128WithSeed(s + 16, - len - 16, - uint128(Fetch64(s) ^ k3, - Fetch64(s + 8))); - } else if (len >= 8) { - return CityHash128WithSeed(NULL, - 0, - uint128(Fetch64(s) ^ (len * k0), - Fetch64(s + len - 8) ^ k1)); - } else { - return CityHash128WithSeed(s, len, uint128(k0, k1)); - } -} - -std::string random_string( size_t length ) -{ - auto randchar = []() -> char - { - const char charset[] = - "0123456789" - "ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "abcdefghijklmnopqrstuvwxyz"; - const size_t max_index = (sizeof(charset) - 1); - return charset[ rand() % max_index ]; - }; - std::string str(length,0); - std::generate_n( str.begin(), length, randchar ); - return str; -} - -// g++ cityhash.cpp && ./a.out > hashs.txt -int main() -{ - for (int i = 0; i < 1000; i++) - { - auto str = random_string( rand() % 1000 + 1); - auto res = CityHash128(str.c_str(), str.size() ); - printf("%s,%lx,%lx\n", str.data() , res.first, res.second); - } - -} \ No newline at end of file diff --git a/vendor/github.com/ClickHouse/clickhouse-go/lib/cityhash102/testdata/hashs.txt b/vendor/github.com/ClickHouse/clickhouse-go/lib/cityhash102/testdata/hashs.txt deleted file mode 100644 index 3592b5bb9b..0000000000 --- a/vendor/github.com/ClickHouse/clickhouse-go/lib/cityhash102/testdata/hashs.txt +++ /dev/null @@ -1,1000 +0,0 @@ -PN2qmWqBlQ9wQj99nsQzldVI5ZuGXbEWRK5RhRXdCdG5nG5azdNMK66MuCV6GXi5xr84P2R391UXaLHbavJvFZGfO47XWS2qVOw5lxuBEBNue7b9PZS0hoI6pgabi9UOuSpM2Tlh01vOzwvSikHFswuzleht6xGbotuQQgmO6GkdAqwedXNRRadbLMZROaAfZDAWhxgqRqcM1fdhRxRZYw3GFhPr6BInZITSBQOgwxhHxrhytFUloiivhOmebpblnTipx7wXZAqJZR5Y4M9k8AIyGE9CpuXkn1XvnFttynI1MguokYDeWl5noesnB4mh19PM6Dph2Nh722AggBfUKJEdmm09Z1uFII2PNfTdMjJFB59lvpzORCPO4yy5dZ4yR2nIGRwH4cYCroORc958dBikjYDvOcFEzUEcMGNuUgtShrdNIwenrKHe3wXIoqLf5wyihrXUKPqBV6CnbV3qbB580J4Frwx5ufHb1WO8AK6OoG9srCTR2TPgNtjKi6dr2pLqJrfl5g8wfQJLpdUysdbsItlPgtJdFWAT0TZ8CS6LSudyKLegw2lpp0wnUeHkbOkq49TiNXwEkRtFwXosRt1ppttVm7hh1yBOrKj4wdwQfPWJYBjHJC4tiABnProph7hr28r0r3br9a5Faq0jWkt6JVcJZhmnvkMetnUTTTKwXLWVIgLxA7VSuh4aMiLlABuNbP2eJ2iVhtZBNao7LlKeBJje5Ul0fVQ9Uy7yswksDRtj0DS51lu6AcNnLIwJmDzYC5OpkOMawQSo9ZHPHpXN6AZXvJMHdbQy9ekd,fbfb933e3e1e572b,67715470bb29988b -XorDIofsU6kEqmWwhLoXHK49iRJt7rtRMwDyKeh2WG4QnhYakXELplAzACK0vfcydE54ZUcRV55ktDtEzrpWXRwslVYACxUPGhAkSlBMlQVdA6S4Af4Re76Rw2Go6EHKPSFLEj6u5IYXtPVKbzFdcEsqrwmJ1sFQLN4lgLnhbzcKd7uucE9jrWsRw3y5L05DIIWDsCMUU5LZeKHNbYXy6FQacon9yrSOjc0426A0ETHn7pu7Hw4yud2WLqldBMkvhlilT6fCgW8ESjZiwjnc7wCmHC816mZmDX1w0qhjZC90e6s83M9mx1urN3GjSranp1VPNwEsQLfi6jyYwsVaGQhWSBWPa3EgY2cqBOI9aB3YH5VqvfBbrIIUycgHlGtPSuxREndEsBEvBHpkWTiHE5VK3ufzBTxhYf7WbnkmjOG3DU7SNggeujYfyjLNlekIRjM8124C3lxUmI90FyiHZC2aRnkHsnCA1fkE49pDdaZGtFLF0AIB9fUO8icEzhp593RvAQLhUfM9kvehSraUFdayHgyLxVOOUsTGJAhTsI6S6lvG8T1EIVYLDINDDvt8k2k9eLtOkz8uRAmyUv6jrUacHfxAZitw2E6hBDuhCJxnax6RRq1vKRpHo8YTnUIFxDfX,5cf6f209a66e0730,7473903e51a4f -TSDGQtM27SmjL0naFMqcQ3ETsYKbDbrBeIj,5a568f460b784901,8194e9a0cefb22fd -9LAn077EyiXFQ36AvkRy0oZhRgJ0kHh8Ml7kZGxHVlISfRa209zmSlTPcSRWPwpOlrYyYi7Dc9CZMb8GvB5ehih7cGHQ829hPV6r76B118U14fhZDoOIWwdpRGgQZ4pHUMVeNZnIbjRo5BYp6mHhX4TFe6A1xa7m8rQBOy4mmO6ThTBYUcJjbsKfy99zXwtjdXrZRLqAWL3w4VCUdlxt1X0NgsCWD5Pz3ZxOEOQtLZK3xBEN0kwx4Ayfve8f5BVBwuI7FmlHPhX4xodzjLWqi5iWxhFzddVewBeg3LaL68CBt3MMiataikWBMkUFPGcyeyBgeIV7gv1plRJlpomPudsAK8F5YzQCSkqG7Z6NDdg9qYTNOQKqmJlTjTzUuNbidum4qDTppbK4OH1xDmy6UElG85clUSo1L7cKgfOX8BeywJ4k2LvWuvrN,8e9671c6e9d39ba6,8c9a5b6eef5c37d0 -84CRSqvk5zXuR9FvrRkSlnJ9n3vJcw5vorqvhmcmPKQppGZanHc3SGuTXf1rUUORpRGMJL1SNQ0wUkYn6cnB8iBLqKFmXjtjbEfBQcN81qV4lSLJBC4lkmUdb2SkP,2bf935b2f4c4ba91,e309e9e8f60de6e5 -dSuVrKcDPbNrYbVLAAMtu6pnxJwswDsnMxnTuLtB00QANVT1DigXui1OtNHuT143YFLyohKWvHSONRHkzWnq2iqKPgod8Ld7O1CK0jYql8r8hKZnCCT9LV27K2ovfA7gtUcLZdcowuoPRhMNYc2ThhTmg8vrtQUg9Z4dn9oirYbXyiO0bwkCPq2Hs2oMF4IKlKmNcMm009Nn6BMYymAJREv63Ihy1fjXx3QXItn95ZbIWr4dLx2dim7UPHOxTQoZnn3H7y3SuSAQoDFxFLoRY4tzZjhaBnng14pBryp686qg31oRI8AFVMwvnKHynBJYINKHV27tNP20PZtqUnGAaDVksSOXrcqVahybF38Wh2QP6mUnfEwpd8KSnbX1a5UfoibCy71lwyuRX91XhUORvCOGCptoTH0Kn7X5lrtpphrgncJVX82LZiItmEeRMGquS8GuRb5TrZUfJRTuot2RuZ2kLiJRaOJRGckHTZN2JZSXH7fgfHQKpJxuVuXesV91JQtLZ3RlpMluJbhn0YU3Kei4hTiK62eDURphpTc2F8LrfJ3rjsE2AHlX42pMwfcZXLrLevXLNTR5woBtFtd25auwaEnne9Q1moRAzGv47zE4804sr21C2ixaRoPVyy4BrJQPXyPDPrM5QwXltecTGNLjZya70ODap7tnwVXALEVHS4iGNNkuWuP86CDNwzbKidBhViixmjBEdB1pHr0EQEIihAoj993HG8GaNw6w1ib4myEsbxtW2hO1Z4ZNAUR6yFhcx1kd,3e44ce73326da543,5ea69e53269d237e -jEnk9QgQGoRl1gvbQvcJfBgm7ChdM1uHia61deNSLOYPtOun3i9GVvL2kEWViVft9eMq4puRkCf3CGqRmnjACX6wJ3LNfqFQY1zN1lBYHortCvELUz1xZa3w5nAkN7EBt5KqWZyWDoHH9URO8lUITx5yAJlyg24S5VOANXnyHTXnxUFCUxpqlKate2wABGEMRHia95umOLV8Cu0G1JuvMJqw0tOHPAwmLiIGjRgs2Rp5t0cRLGBXREbu87Kn8nfOjhSxpYPaXQRLZu7w3KUDP9bxgHPicIJ3SA6ekInJl5HdIHnsxwggUp5mGL,9721f5ef1703d2ff,269a728cf88407a3 -uLhm6orsUiYmSX8dHTB9iSNGpQUcb9d5uAAPav13VD7SNtimxa9nws1PKfLZJy2N1HqY5OivofVJcraX0j52RuELbPczwFLcxFu4y62hKq3W0X6Q9be9n6kPSZrTojIDuJp2HeVCGxOAEbUS6fB0JKhCw5AE4fBTvsqe4gwgJ3F3ckydiYYo1Lcmi1sAtdBVOCo08Q5zBBgQsNKONFHBMG21UmhHB2qfhdtDBM8MTxx5pu7SAmMamSKK0k32yFKW2hLVLDk10OmYxmOuEwDhFwqIBMum8HDU3jAONgh36QTGWcygHjnJ5rCUMDcDeIoVwEpsfTWRtAfdhEWnSYHouyxL8LfWc2C4GdosiSH1TbnVZvNZvLdOZmsTi5663nhgTcmWrLLTLjYV6LnjTEhUqYS8ddxtYo0l0Dq0N9hKkg81xwpuJzK1PgueVbfEdJD1RBgQNZ82Bo0Qk1RWrdgnOMpErvFzbrOxzixPi3TZY1kSQwwvNc8c1etRz35HqBLdwi1r0TgdvjyD7lIS8gUFmGOo9E9pRMhHN1dFCoFGFW57N9cnBSAhiLMAPNXEy0jRxaLWYCmUUSlY7suFCfrgErkCLmgizszBwnWp6M8THD1JXm6NtuNuRPfzx93hkCu0UpHlvbsLXPn0HHtFZ5YdJdf58QojJxaWCpszpoAuaCH2z4HWvxVp2Y1lzuEtWVuJU8YwITDtpJwAtPgh9uFloor9o0NIStgT6m5NwaQGsqXDv0aZUOvm0uyu1ZoyBPt7FbK2waAWzJrC7bHV1sOF,43ec223c131a611a,e616eba0ea808270 -eMejf196Zv1TiWH90RX8KMEWZWiwaq8J5CTXaRla1Syj9Cq9KV8d6lssZGkT4Li9C2WM3WOC7sTTCIU62vgfthbJxksfTqKJ1zrS06dwjOOR5DHHGGJ8NRCbbgOltEUvfPSG8idsNYfNI9MfIkfBgQHML6ARTR51FttUujc4VfFYzeVy5fETwp5zgPxlIxemhD2YYv21gM8SVALjLcsRM8BVLxbYyaBnx59J42aDU21cLlG4sTjBBX3li4RJ7rmZ9mvzUdgxJSdjY83TK8m2w1MOo5lkiWl4v02yAahWXXrQsqBpQqnyvEvSTDg17Bm9SVFRVpKiZXGBNHQweswFnJqonaK5bogoYZm53OHLUzpQjdLx5SGkNMsJx634vcLQOBkhHr6rhm0WUxHYYT0M7XHZjZul2NmlX2Ax,5f7656af275b0206,a4ad21fed066a394 -mQ3VevA84wjHkvcfRb7NPJN3x5UXMH3rPwfCDBFqKCRin8IEe3rgMyBgLXQB3jcvWsMOvlK2jbS2puIaeVY9oIoQCOZVOZu7TYpS93ehMxEvJge9M8xVkp5KMpPToxVjHr1MLFjwQWfwoE1b9ZZiGU98AB5qwaUmMaQHZz0Z0hjHNfx1d9Frk8jjXuAVHQ37xlIZMGJYIIJqXLpEWOmakSawkP0cWO4TDm37jOMCVAvoSYFiOpXvlK66oxmTSOjKy81sw8LXHfX75xv3t4DWSpzqbZXxrkZAiXpMDVNCTGoDyExlQD7bcF22d0nXZVALzgjD5q5bOscDhY0q8qPTe9UI3EkH8MLexuWwkiQyH7EYfUkUs1eZJGDWOe11xDYIOylCwLHJ6Wc4WI8lK5aXOoz4FYfYy51Qwbo3rmDEpNGrnBATmmSxjOvPHKH3PcgemNq3XvlJ80pYeQpkh33HylFZfk1i874QtUxviqk4T9nDZEgEoHLdX0419KBdlImLThVrhp32dhb4J6SXfJz6mYIJtgVfAeuagwV5adG8QT5TNvTKwQBzeUhztxyGTTJePFIXxgL7Y8GJePOtL7u8DpBsSCmsCO0WDulS77wU94bGcYQvqaxtSDMVDZpRELxzsUJvDjaa4jP1AvyUF8K2J8s0Zo2pxvfDSxjvWAW7ZF7KTK1W95lxEOWJHODt4A5hFklfXOROny8c9WIjqnj1dIHD9iqrZuFr58KdUkp9DygYJHulm4KHajmiJE,d36e3f277c76e286,869fba4051f29977 -nzfV70Xjdoxvw29sA0bGR3ZKzEsTFnCqTYODHJW5sTHCMCgMs0ppWKRQQzoOhANolqZeueAwUdOdfa551VGjKQyrSzrAhgXQ78urAI8YF0V3e1wRuh67HQRv4TVFgMkdJywZG8mIXHVmYjaLFBsHnKu8N031gt9zBccAAZKoyxArJICx5qi7n7PHUSCiRlr7NNsApOljUI2syr9SxneCS6ixNQ496Igot2ADmlCDyeI64AEDDUuj4GbOmfaeC190N2gRJbKKwJIUsXPTlLuIu83TrmRtBCycrNvtpwGK,d1a6ff2eb1ee6e5f,1ca81f18d7f66412 -O0XSJeqbLzMSSUOA96wrpVfy7FPUM40hmkaRVF3JYd1RVVTtZUX8vr0PfcRKVDtTX9gmXEVTXlo59QWsPRxtQfSN1SkGPJvwEIndrWt3yIF,8df30cba53a75ac6,620e1abc75cb4f77 -AeWrRDVCFP9Blv8UHkykiS1Nqt8FCcT1nCOywcCC7POPhFi8K4RmCwJZsQcCE81jzj6FlQWvbUpWM0dfG2Vz0mGKDpuqUQNC5p40Kep1XroNe543f53d5FRXbfnzKspiASdZpERgMMoMgFZs3pDoWqMIB6M66RT9Lo7MIjhRxGhn0rwnenDeAM7BuZseQFfL2kUqTwA5HsVapgiQ1zy6aIbvFkbEk2wlCE1DY7TRtNHJLImz1CLN0Pd7LWO8XwrPgOcVhBhTKeE5SFZQRkOVWtYeIf3Gf2zrdMCKUi4hgGQVCSNMYEXjVygq9SaQudFZYEMI5944K5TYmj9tuTw0YiXybh9aZGFFVAzxHrY0haIFUijsFs8Jky8wgSgkvYES2K6goMzNW6I5vgTn9lzt7haMWtj9IA9TZTiUch1Vn3uHIwtM6pyUGzdNShVlQGxyLJag2qERUljdJvZ2qsJHhykmPL1zYkGNNz5XX2JXcGMdm7oZZ8S8MQVSSRzvyhBwCjpHy9A2W4R1S4orgIKBnAze9hjNoTBnBU3nNTuVSyWW2Y6HQXrsPaniMXZQSrNqIJwMGab3yOjmNNfPYMXzWjjcKu2tC9hiYJIAuUJLTs5JKg2Y2F8Jr7u1F6lfSWqbxummkHTIiJ7z1xYMjU2XQdhAvQwP3fi5,ac054cf6b95256cf,95f7add11577d356 -4FPZGujDmHQQF9z7TlCmJdmgK3GAVVobEDoRX2ndFntHsMfAT4eqtaFU7BPdwPyFqP5nrASCTompWuKrIU5Y5wByqgR8OE3RFjeHMZQLLFkbSoHWjoSWR04FuRsqlreZI75LvNheU8ekL2s3FIDJMh5uOk5xsnFGc2rH4bYhNOFiv6pxhu6gwWQB5TMJrMVWgbiStZ4941wOevgATTLQTOPIpTPyyzL6GJ2Kf6AcwQWpJ2NrlymLkATGb76vB4SwDJug2FZI098chQXwRCmDHAcHIOomQGCXv7VnAmKlRjhIq1lM1D4tt39rruSQG1SV61D3TfQsTM8TUcfpnDH9FUQM0YiNovL77gtEGgg8lgXngTVySyRgnYFT2hlqNbKx976ea8QhHjjBLbVhnSRqcouZ2oHTuK4TKx3Cjd0PbYeXepMU0Jbuor2PGr9yaPX8G5rapxXIJvRS4pdGcywvyUC4HRolrEwPDKmG5uHdY9swndujBJmBv2HPWBDfJjSreqhQoXc5TzJljRwW6wd2hP9rTds6dkfKIfypFVsuNOhHMUGR4RRP5wEUt9TihyxpQYIaGL9rKh7dEC22mwwQS2UchzdMq0xXsJ6ONDbOWZnsmBK5pI6rmRdmqlvOzpHwSEl4wyWKojByBqyL05f3EKHTmVRjLmtQ6IKptP6eLMP4bN3JD0jVqrBZgnfLoqxz8YvS6PUjEoDZzu2UZnrWEn9rI0xtVshW88gO8Rn81YWOy9ppu1P4LqBW99NUjKQywJx611ZU2rcZBFXO6CgLgsf9Rx6sDxS0BQKL9biwBRD37byCK2zA9SrIDheWPwqljNrfS7zfOzL9rRrJUDV7DQ8EHjIp2NEGblAsuF7CUyj540JTMRgMCYDdvzYHw3xdXR,93088cd782bfb998,1592c8f4c407623f -AEcDwyPpyiKGoi3YcGHg786nZ6opArqDNBznAjzIijEh1T95BrUSJR9JKfcaIxzRpYC1jBTgUJalZRg01X09YWz6B2nD2KU6tj24xTnqLxO0lX8NeZSaPSXfQZrezJI8FRsqwUHq3GHkjQnjrSBhZBlNWGl2WBC89mbg2sSSHCk2Le10Dt16XbYmFXOKcpcjEMDJW9aJn9NndbfhCRrEWW1nitmVosbNyaHz2Yms7X86pe4s88QQe5KvxozCQ0qBygTtiVkA5IFavPLS1KrMg4I5i8iNnH86EwcLymGpT3L7XfpWIXRwR4AHi8XWPrWGyIq9Tuknt5qTcE8MgmIkATISIvAXedq0Qez5nGQbhjUtmrWJl8ZRqEeecVuy0cn6cmAUUxRmZ9Z79XzEQo0ritOkEwrXDbsdCf2ByKm8m3kOpDIUB2uFTYAZZQlgHElXK82Od7kHTjGeYQYI0GqcRSQgrzOBxCoOcuhOKkplygqr8QYzg9x2DKghIylesjNc3p5fRSXD1rcKQ5DlFTDdras1r9lxQQ3DZw1iBzkaFvq2lUPCYsKvbjVkWL,2dbec9170436ed8e,ba68853150bb8632 -hJMf2LCSwkeeJygRv43gqidteLAVJxNhankikMp0vaqAtYkGVz0n80r0YywjJLpnndphKh0h1W06Xys6BZVQsnh2vK8HDd7sV6mY5kjYQmN4xiaiZ41PbYESZY8un6Qr4FOdCOKaFiPI2NSC2guy3uBaUMiZqyZEbFGhW2kzKlYmlsboQr06dwD0KQ8Hlv8EW4q35kVXov3S4msj1EcQf9NUFIudc5Svwx3dDfDWlecJtiQr0w4fpfVqU8uRbvECo2C1RXKUeoitSWe1QRwXNZ3nr0csCIVJcrOAVLpfppu3FyJujH5HS3WabcJ42uKnfYtVJOOnfln2xYSy7lpO9XbmMK97hGrYMHpMYcimFDaHRww6VQwzR3OeQe7PbhSOi9MjkTI8rFPcvUNc0YyES4556PI0PBbJcpenJM3VVhgIG8uZG9H0dA70npmduL7VyP9zcSsHkj1OambdnHRr7nVdXbGIv5hVmQiafHlJV0YovvMty9TezycOosdEBLFpZKlreGpCz89XTPIZxH3GhorUxfNy36XivggYU1we1W0SZBk1dXYMpeubyZoyDHeoXQ3BM755Qx8GpsH0aAWg3nN60LBOz7ALNKfDzXHp5R2Qp1zfZBFuY3i1ZvOKm3QuEYnJZEboynKmQp1acLHVxcAaQYVFV32BkkkJx3QgbxTwYJtVACpuLJ4JNYTukhWepDpXrWB7Za8TamR70UDanjCupAUNYD4iaddbXeeo8vwsHupNxt1RLw3vMGQThDuAERqmZTqpDj4uhbJ4l6vltHU9168oEiJnCKEHDdBaDT20DW6d9SyXmojXq9G9f13WbfF33tM2x727QYLo63pytebzhFW5OAJHPVW7AUCnXaWaAlGscDSaFMm9Z9oTBOQWZdDDtvOdysOMmDtYyNpnEBcDW4zj9bgv9gS5BFyKQwrGNMcQSCytjh2mmeTfADOi1SFSF12I5e0CD2NdkKqpDMOypx,d4f2e16fee9cb90a,62f8e3084056e318 -oKTYL4SNSUU8GKrt7fCVmXpb8vVtrtLn7jce9nGlpM8Q8rW6XabHdid6L8y02zMyWcE0lFhY95uYr6Acbi8zzZ3dRAMPN9dmelrtYodxvde5wrLycqSqHSQOwp8Kkv0Qi6eY6L9VRbUpGaTCHr2KdRLPIm2fmsj8WZESqiIifJ36976Gt41xpNjTBETRkWD0mADeJbmQZxPfJgmuwowvkeWxnctd3zIgFDQomdar1kVld4NB9K8DpeAPK6KmpQ7viVUc1czEP3OmVxOXqdBdjr04fBDoybw3i6ainuJCDY8hA7NFFDaQYztHohq0YgE8OY8FqZP9wnWMBQmQmhC3QboHZ2rBhxdH7tefn6h3vGoSVIGm5p4pqXKSN4nNTuawC0dP1UOfpWqk7Bd9JshLfvXQIId35yqtkCIXQP5po0VPWMWqveg3aXJW8Mg3ydBBLJPWJm8tOhcHkVeBETST0boGeJlAdgJYe1cqdnXQs5NK0rKyMpMIQ3m64cLONDD9FgTUDijwKHhrTrKSPJS7KDFOfn0Mr0VQYKiPV9qrmkrc1nfFnJrUPFvI7gWCDhUc7IGhEngiiCE5FYuOMkYHOKKmEHVXxtwcPpDeJtrKQxQwQD4SUD0HRWOijw3yCMorUBrRKZMdqo7cdu9iEck7NB5IvtW3boMHouV6TgBUzWmHA0KWkbdD1unUHbDxXu2u2nv8gCr2FaggYw4dBX0IG1YCxYfiwKBKHeTuVldlOjWgPucRcOWkTujEuOri4afOMBAqHyvcghFfhgHvQ3o8CRDtt4du0riCYstmf05UWl5cKdwOOOxE1G6I20tjzVhMnPyhKJqbzwv0vNnXsSn9WXn71odb6fSt3o1nKeDoPpiGvKEANjzGpQtSb1Pl1uotjHZcqpU67CJNWwrGeaMIz8GoDzJJcQDvPUx3xDeKPYKLMKZIznr1BXu4hnEeclEGginmR5B5ZVJE2MkEbN,9c30a32290a1cc1e,2347b022637c2b8d -3Nv7DSqKym,a15c18688f33289,a992a0eb969152cc -3WSBfhcl4UIxKts8AdZ0mOphyQJaCDdivd5PnObHGsuZ6vDkclQrjJ2VDRZ2W4iO1q5pDC8GqIRlbvZB0htKrPEnDCScE6Yih4LpPF5W5B4pO7mGqSlNyVUxWAPFGJUJT8wXvA1EYE3FUiNvIhAS0PZzoAqnmWsfzKSIRLge0V8gUI9mYA18KwdAg5P8HKEmx40P55LKc2l8QBvC0H9MRDDqnUQ5HKch7RmztXsaGq4sIltXuAl94Iv1uceF0bJw47XDk1olWVuXbFr7BfwOkdUotYx7rTEq5lSFdVdPmnbjsjo1gwgUOufGXnXytwqga50mjCuXKvrjGaRjxmNF9ZgD0NfMhdNRSa5rna7kT6eA0ZzFkFd4HqXDqUg8F2kvx00Mnqz9ky4eZdMih1lTgk6whavTjPNQ4jWYAwx4DfGlnYhJUoyO4qieikRhszbSi4AsSFGVgFj41Bq5tDfnILvWHeNrdmHb8S29H3ZZ6Rak7HtLYbjRLESvoYWYHpE4Tux5haWsOAX3oEg0qsxfKowbg5TgLiF5aB3uJIMlNeEXo9V32rMyluQLUFE4VAylsMy74RV2XZDYfKeyUhiTNThBrkN6Oxh1Z7tCz8evvC1bPs564I28hjbx42sl4Eu1hoiVREamQSzgts0BXw7Fcv68FLeVwRkNQcylNmM197WeooACGyBV8Jto2JCooHKJIbsJRyfxTPjPDhH2ciYHunFuGTuqPH1oMOLRv95cew68FtXTiYAoiqIzMcCkiTuZ9uIltnl8XlxDIjYBg9mtlWsva0SU6ShVk1Dlpvl6TWB4y,a88e6406227b18fb,1752dcff3a9ed011 -y2JxfVmFTDCc5E8j6SyJ,55dbda31fd73db4f,e93b771a2f3821ea -C1jqUKztl2qZBs1SuGLPCIZlFafCOVUS82I0NqcDt3jkAdeGukEdleFFkaJbqbWSBFfFvzkK53fxnlFL51iKtbtlX5C1s4yhRm8itsYgDBF8HUxOTspOuNdm90rI8H2yU9E7vnBUfFSRHZI3yReF9KasHGnMtcC64qAmzs9IJ2mDvmlBPN3Bt8DCRt43bc9xVCoWgqrw6m1YcZHmr9XDIOEe7iKQePq1CRh3o9OSo3dXTcwMEfmHDn0AtAKtWkyU9PeF2lahMK2nyj6mJHgIAmWMFhMPyncmnYS5o6OpKtNIoSuynusUMUVebKeJyA5yaClPuYemU43QnVN7kzFrCwvLWKJkn5qkeupl8lifEdurSuw1e47NwDHNfIP5F8vy7JLxY4T1ZuDHORFwYe31crGrcyoKHSHNhzQX8ujjDMKbqX3hszMdly72Y60xOvFKrKjzJOYTvtza5a6DAP18BLi2xx5SzOPTeoYAlkgJ1tfLVZXY5PnyRl7LewFxUMSfp48OEUhn5RT3aFufPr6S0KBI3tHfpED8N7PwrVwh8rdYac7lLITNE88xyVRspJi1WmOCdQPjRgllyKBJibwXMO8YRJwrfpcYtp2bi1eni0VaRpfdhdLA552rtVE5vYUVQXfFfjfBTcYWuCFc2Qtu7TiVTkGlsv5pG6I6QU85AgkD9QoGfqp2rHAVyfhc1SdU,24c7045a66c8f290,9b6b9b602de3e77c -I44Ds58prfpxsteODYvMtWO87Dd7dTE9LomUQWRl94fye48YczZsgIucA4wsT9qkKgLogz3dZqMhM7XKriHpcOiX7PITnDp9euW6m8y36HWxLRx0lyBh3STyqHP0P8D5JYLuaEa7h6RxJ2cl2v8TM4EWx9yNn9cS14KOcjb50Oq6Tn69Jm49AiMAX7j04LkSoNuBMqKUi0q0m4ccskR2Nzkjf96PwIhBFnbUw7sFx0PD3xSiBNNL1NKBDcOfuDO1mXgOJXxJbAskMfch7PWD1r9GeFYB2VfEAsLDhw35f2ctxhrfHePdxxgg4kPdzHsjftEf2U4dIUzpiCdRRXuLtYXCeP2URuuOF7iKPrJXYCIO8k4Vmwq5h8CIKHRf9TZIaWDsaMFOKmSuZoFgag5pc4X2yzMnKm19qCTkstcRXdJTSJ6XbErcXnNfV6eRXyV1NcKNDbFgxTcJmT2t1kcgglsTSAqWKQxhUf0WVBlVRamRGl1lB7vvFz1tZdkOk5YcjIDiLuRPO,d73a8ac4ea513a04,509189bd0ffb9be0 -WBGZrSyBfxUWG3PvZZTeMMauloKm59Yaf1VdrZMSxHUJU1NsdtMMUEIK0SC6cqQ9tQxqG2KvqXgRCpfQjwXwoV9rkRYkaNxIfPZ4yimK1wOuG6vhcIGeG2bQ9pQBBzYJ0hx0gsVu5UntmI5nq7H1wwVgy8XRCCbBZAxqfnLGMDZi5wThb5hcLcLa9fp22bS7y8nQI3dGdJQSXbTVc9HtBexVVYRBiA2DThbfWwXx2fAmODAzQmljHUBMBLEU4WRFwV8Ug31LMq3L5P6fQI5PAaAoAgJ9qNPzl9PIslNiBDIQBjQwIuDvGU3hzuniFEHNb1CLkwuyDakDNnNfTZLNngCMuRuC1E2pEzwW8O41lgMV3Zr87k,ccfcdeea6f0623ae,3a85cb0e5abe445 -VhMg4jESCsk6Bp74QBlV2aYiA4bZvBha6fcOOO2pMYdJeWjIbbMuJLVYpa2CKbmJgHdSLnhPEkAI7wKZWHelavKImg0fZwjyq1K8d3z0pCOikGamcfu84g27b1FdROHIYF1bd5faFIkpin0ez0LzjJC0L0KNB1GG9JnUMpLa7SZx1n4nbhcnOWt4fJTxeTuN5onR820x6LfVGlfOZHNosXUVFNyP,8b4a0125a9a3dd48,6eb6fffd0d60f07 -SIIuCEPeTrDqKEpC8iuVrIGdc1Rrk7Rnm3YOUTRtkMV7ptJwEXtdtawB0RklchzqSgUxxEa9tD4rOe16Gq5JBrz20Oumo1B2twLMMSsKZITwKMfysRccGWzrmtXOvqNPU2fYvJG1SLwycK6NIQGSaYWZ3Vr86jelRxKoSswPy8V52lO4QlYPhw9R4FsOSdBivG7P9xKD9AWCB8iPB2LWkIlQOoTnG8atv8CjiPAYe6ooWulYqoz8l0HP0YRy0cbmqo3w5C0K2zURn8lclVNg34yV8QuVjeuL2XKBOdHmZoASrG2yI9EpDnUkFVlnClhPExIV1HvrFf2SZFbB2auOn8Sol8VKbfYgpSHZs0RPNFNqvLPpI3uBNT4RLqcnAsB6KkVbwGh1Hn9hZEvSsRGRFO6efQYC5x8wmy5T21Q62oar7Hg5ICfRBEgUlj1ffHbZroB7jK2kivM74FI34FpbDCAafmrGVSm3l5hbXPV3xHvhiXbQPLvCusJcunuVDwJFULLt6nuZ78JEhiOzghkPBipozcFO7QcUDjkXrfL8VmcYvCnCrFkrOpv1rfXts6UC9zxK6poXnwknnIDun1hz6HtVBWfoimxiL0yrZoWUIrt9hWCCH9XJ41TNdHSpaWVS9oFGgd9TJlM4p5QDx0yVKrQirWxD0bf6HZZchwcRE4kETlFtoBIht9jSBSVXfMmyARxANXsNWwD6VwtUaZ6RnqS3mtvfjXhhn8ns9cucojmyEdxm,c708e488b29a3e00,ca7639eb58878052 -uqZZRrgu7jyrhUrFQRWdtrZ86YM9NN8fCxbhrcqD5YE3YWsuffiE6ojG0agbTTKdoIXolGoEDoAwNcuNAWxDiGd7tZZLncEJr8k1VgPH2QQ2pUJCdDbYAbtupfQUonvTuOratJzC7f8yk1An84mR5QWqJTcpyfaZJUqJzwGrwxt2s1Eb7MEMLZtr9qxyohUIkZY8sXbjnil120t4HzHtdEiwFyZkoTe9RMlnisuYuVO3A4SSzQ3yXMl8bMwNCwGYZwDnQPl7dB2FQwpotf60QK34vqHXYcUvk90F7S5oTu8tbnqdWimUu60v5q8RcxbWvnY5XIZp2E4DKUB5krkaAARnrH34bbJU094ACQoNSIl4qXYpkhVwBuvHadw6lmPM87q6j01HpLbA2KHIBmkc6Z0CSBmZgRbe8MGSJHfxrdzhQ98DOT1NZkJPe4GAPJUKz5b0rNC0NjLnppor35kMyom9sH1H809Wl49natYqCZqHRftHYC1WHxyy4yNmosDIB2HZvlQUyNibhIUO4s6bpKPrMGfpKmhbHYEQ4okY00qCYtTDZ5A7KTsJOMKMhbuHBIKFq6Wa5KV3l17Dc1VyKI1R5msuTjH1hp3U41YDx3IbV2Rr71pTwr7cJDPqcTIUdUX41laD6jrtsbb8BvNDsFKsWqKZvyYXYArI2PIMOsMiMDI9Uh94nl3pgUCIy5,dc95a55694a07f82,ebddd04784c7bb3c -XzxAlpy8gNH9SMWYHk4KYe6Vjy3ZDqa2mCa1Tkb0IQFqJM7mlXrL1lteumnauo3xyROF5oAM6SnE8oTCJizjQT0DDyDTh6RNDFgTTlUWf28oc17Zaiiy342ghXJ2cCVH2Zg0R5OWRWezLZuTgIXKJ0hxDpRFhnGpdY5OOGBbAmdc8ehudnhfAkq4dON52tQ1oyeMblAAKAJocS5D2ua0keioXNmX5ThezRCfCk7LoBLpy3eEKMEKDEs3twSwXOrYabke8ZLbjBtF3VRJ8WUOrngyboBmlfOsiZzzfct2KECVpQpf7llwaPFQyoh7c6SO6vTxBKhi0oQHHgOkysX8H5mcQXYth0qxJT6qpEBplvUXXjV0j9Zr3XoLG3iKNOtpFQr1j8DWKN0HjiuGLsHf3QibwaPdJdfTJ0YISHsI1rv9wUnd,e8833fe49c9095d3,a0e4d79a9d94046f -oL1LzbAcoLw1KhiUlAedOD6g0pseDMBSzjrHhJnteDrEyozuGOwHt8SZQ7eLGLDz1hjDQmJyxSBpb7AMadKDsl4M6KKwd1pciNCg3hZ3Rf1y0r2t5vSzAh5l62wcmY13rK1dwtO23WgViUxuhiAiUm4xVHi7OuXrSBFgX0ps42rlLYopxbxVM1hZGx0PuIhvdxEQeJW9Lb9H7HPQEGHsKFOFaKenqIWflNuJonPMj8gZSCjJyH6mDAaX4lwKDvRPIRjToXFBOQk7Nqcb82ra8sksEHRGgTsXp4RkcMIxghc9NsL9JaH2YAIhyYN8eMVGqKW9PQIWfOyrO0e5OXvSpZbgbgySCBIHSINF9ZvcBP2lsYXfG0uqe9Nfvk5ole6AfYBQDtbD5OBuEvhD2ZOV0MbqWPPQlOswWtY6dURDZuSIMCniNYp6rIy2LmM1WD2IrOz49w9SUsWWnTZBnGahmK83GBBXXueLjFbm6sp5os7gJ4R68WC0ymon1hoGV31FbUywu52R3xII5U5sdbb1nTOFS82C6hyirT5RBUilslCU4dSdBIzW1uWRTOpQguhT2EFR5WnAWmgCaIJL5Z6qv6TiY6C7HSCOzYzJE0IJNm0KhQ6zPHL290AQLw4EP6RPFSwCGxncETwbn9zqXT7ACjImSC0NRcO5MAVHSzTDd0QVw0ddwRr5OeANKSxinj5RfsrPkjCJklYyLMsOI9BwvU5JDlAjkSypzwA,1df1290eeec37fb7,312a9f374ccbfbd4 -B8jJ7OlcuxrvSbY8ES5Nqs79zDs0Xr6TK0RbGLWL5FhsIC1kb14vgouZygWNRGsjHn905vBiZ9WPj2NF0yw9e4ZFQFxZUPSRGdGYlmM09M87TFk6N49MhkXGhdnco3ekBF4IhP5P0xsyj9OgHdkYJfj1CCVJIwlxUobBx76EncZgWElPtp6eIV48zFukZNd2UPRGG89tTXLBFdTM0ZJR0aWFdJUnWV1cUBvtqyHqN7EiuFId56YS2dCcqc1kNsUrebrj0yiye5hM4QA9aYsseG1FXGYLfQ90ZOSu7GG4mUx35Ti6bNhlSjEeLudt49hjOLOtsLOLNFYqDRyRj67MUXhYZ4nly3bRY6ZDyQ1Rz9mW5zgPeeKnreKGhI0GuBpHEWbVBX2XN5jzomV4puZ0rxZr4KowdLxPl82dxdfbPvF7EtXcMOW0jHaDjmT1bbhiyyChMDhCYuZo2KhxAfaQfjNZDDlNUaVedE5o6u5q30jJ6d8Wa5cjRrmxZJb0gRUXX9tK2i9nhAYn0N2fJ4FnegdVPduGLY54O5O4RohM5YgO34QUunR6mKIFJffetF3NePDOrCKeaWVnUrRojPqmqBUvVUewTtX694b6Nu2X0oBVxlKrsKBUNZx8TMkjy2y4QEt3RU5vWrwib560a6iEeSERoSE901vQcwj3SA0jc5xWIiX5kkCoJhYH2UqvabignUl2LoRMMN2geXbahgo5mIKhpVp7AC9fKSMTdGdZfx8fqz1bvMJgeLwJZaT8WFO41Oo6rvwrmEV2dMaoxnR44jIoTDt7ujo3HrY5mITBDj4CIjw2JYfGhJKfX4ndiGWvJ4sZTT2dJS2qK1tWMqp1uIOiSDfxwqixXee6iXAfVXpC0tPaAkwF5oJmiWyOOJXIDFATiJz8muEl1Xe6E5CKiy9rJ3XjOJRKHiGeWI7IDiuFfH1nYelMxJUMpMkt3vPHdK40zFdqs0TIgz,1f28e451cd2a76b0,336b79df4de059f -z91LOexvoJ4BzqdxRxJrUVscG1RPo3JLYMz00gWZn9rX1xS4xilRgwxItKfcZUrgxpPs6e6Zzc62vE02z3Jt1oHHWo5KuspuwWlHOkwtjeiBorL4aJeZc1g99NKF7u87t5CtDSVQcwEWziLZGACjjCBH6YFUw9Hn72C93bNhgXjNHI17KdlJZmbKuODc50VHRADpoAPcogSNA9ibFB79bfrM9Mo5lTA5nIn7H3KlqjHsIyTsLV4wrfbPeEbzCvciNrL3rDRamKsCTOMJ71yO6HbOLV3AcUziCWVJJVfkgT0tCtGXyYrNMDXxPcwsbA3Ukc9gZm7mGBD7X1vhjIzo2NyDi48kzLSMtvZYeZSbJWNUe6Puk97aGrrOrGakqcamZQEvWS6IQid97H1nxn7cB75s8qb6UQKm4nqllmCQ2a0I3JPjfy37z0LgzecNGn7J1emhOab21ikREt06pI3GE5es0LgVKXiqKRJXH9gDbrQ8NZJiSJANDV1YMeNBB9fgClVwxJpAVZL5Pgq7uWvHovZCZaTz78Dd0cEyrIrbLOHly1zJvp8LMbdfYj80zOkQp15d6mMXwFI3bbSBYI7fZxBa5Pxq679J0nJQeCMwLymxsRjHBbBzsFzxzB6QKVa8pCsWn1qLTF8KDRk276Xr2JLSB04IVK7aAmMKdO4U8BovPuNMfM8GPunAhDVh6hnsIgZ5hwSSZM7qJBTPbCF5ilms5,db49a9575bc5f22,5d620f758ebdfb1b -7mTTT6bIjc4YCHR7CzaCEMPVLW8X45VXIP0mLKMa3o02oxzvRbhhsxA5g2F2h3j2HIWOU5KuCdTpa9jHMAcR6ycgqjGp5orJ3oSiUkbWIKD7sFf4b0FOjxyhZC1l9OxVCvhLEmwYOIUnk96W1rUDymnRWjBENk6qZcgvqFP7QW3lZ2d3uAj9UfG4imrboQOI6YOZ1FfI0idyGSBPPDauI1YmJ00NQeKgvlJKfGqhkMfx7GpctTYDbdzIwpZcC5yv4LTU9ZCQ6dikAdAs1MWExAmz1XIYFpM5pVe51gNAZe5iGUZhYrUdREgvFfoQji4knyppUOsEtoIQyumuyztxDhk,fbeba60cf3e6d2d1,3f7538ecb45bc0a0 -U1CrDtwcstTB5M3V1nb0rpMlrPClHHkaXaJaHJqrjeSFBS2lwTEt1AR5YNVuoHG2pdQX9owJE3qw4U9nxpauNdhJ5rP5YIdlQEGyfTAPbu8rKu8LySqm0iiTlBCISm4GYr02WhglbtX85WYkxZG62kKH4pcOPdRlcI9pzXqDbJjWAyIWNJ6jo8CBC7EjikfpIrvMmmGpk4aBctyvIstduU2C5fO38M3qP2U6r0f3rz5YaPrZtnsmdFW0Huus6uy8XvLJUvWNvd7NS4nsMioSxTg2thFLeud1KBaQh3N7NcWywYlLz9yPe7sJgw5KfIV4yXbtck7lSnruhzT,778670ae6955ccb8,e8863fe5e03f7528 -xhlfDBIpUVWscEiysyuQjOr5k1Bui9fKnrLf7PlOnyFvygZ3RvErlwGG9Lk0RCfVxGYLsrdIRQQrYnHv0TkB8rB0ifJ8c99VK9vwLAMeVl2P4iE0QdoUYPMbF5IpmZ7AUE86nEThRlQPnjFA42wntpDqjdS9JXBESX4lrJF8aBTnorP19X1eQeaqP4L,d66465ace73ca33b,b2f69f428822c00 -f3PTbyzmDIlsXhTmNIxE6I7B8x7UJ7MSmWkSkWLhTGdIhvcYAFVtyg76T7eWbkuu0o3ez9VFmHDdI6k8WGS9GkXaX1xQ28EWQruxrIEyI3L8CnsxUQudXjw4oqN3JJkE3h1P5JhiW1cdne4mRk4q3ps3SK,7f50346fbdf984c8,adeeed6907ad90d7 -6JPYn41IS5kg2Zs1CyYUpMDLGhUBg3UXIOc67wGJqe3zn2taigNq8C2aEjFng27lX6rXxGnWlOgwSqBzBMIcIlfR6TRBnCjz0b0pJdM1gHh6DyAUXVcjzqtkPte0C9VO0a2VPNp1jjZYEhVTr7u04Vll3z3opQI3TrrXv4ZmwwBPLSrSkRg4Z9XXIDhUextBulG5nSPuboTjf5a1SZXxzMVP6sWV5l3YW3SLu70Qp9nU7GmM6OF9iIAihpYK43aR3OI1wmE869KD0oFvJ3X268Ik5wFQEIpfWoPkoCOAF9kfhcGAgCAlA643pZGjo7JXUJMu8cf7tiYrnSTycvDIlKuuH4R6s0izqeHYhV0nFBZeyJk3MkLBVf5LnFC8srBGhEZOvOpGjrMtxhV8XF2EVunNlRx0fgEuHl9AOt0au3XvzcKXq5PtzZpnl0VO252vYQ8Z1jvPjl9tuAhS9XH3hQw6IGls4xnGkVnOX6bNWzCOF4yEdMVz8VejFCVPfJ1pC0eK2LM6Dh3bMVrpcmQ1Y601CXJkEQ59R71eNjydvJ8BsZIBSbgDZalBm3sZURu4C5xUwxs4G1hqSG0kOzkPGjzehUHf06UDkEg47FRpvxCnUe3NW1aoLocKcreRmUBi7hAplPIHb8rF4CzbfdGHsc19fQhIfT5eHWIq24hRe2uHW0HlC3TOJee1RmzONUF44iMIuTHPENlKEHk939qoH88Gm6in0rtGOyRc1uw2G4APKwAYPC8YtvzQxIaiV2UY2C4LUPMngEkBYhkFkzdKTs6gkmIGKj7ttHG9iBBv6BvIqpZ4q2TKBlt5tN8cvGccLLBNG8mfASFMR6nZccMdk9iIOVzDLPPZncmkS1BivzKLaZYlshW8JMQKXwniedUaaQhmP8Okg0R0GqxDItbP,b1348f3a35078677,2805dc3d804648e2 -xuL6FbTV0K06AmpHsatYhKPfJBnkow0CxLMHObDYlJ009dMPofuIgu17xHvof1Tdx5PwVegm6eVYUoTjPzMFvkn6H0QJCJTRgcGHto1OLQgMyHEiyA3HDYtdkhoMsdz6RRA6D02RSzkHly8MiBmXZxpBTKV9x0ChnTCZGQEGmPSbNYi4pIqGtDJCZv73YhDGqLsZP6qS2CziGAi8bSv6bcB20i0h8nfFiRrogSYTRuus4a43Ckv83FXx9ZYrEvGJGFsqv5otw7YWuEtLfQETcw8RWJpwVT6LLuz50wJnCUuqEsHOhTV5gw2x2lu773eyjmvuQvw5UHBzBozhNbz228E5TL37Kb3yyyi41YhhY9y4Xn7xI9HoUAGBqABKRm88WBgYL69kQFlkb69G02OUdd7FsGFmVJoDjN2PTcHMku5XI915qJOibVmktA2OgbDuiphZ8Lx3BTA88WfFoFCpwWoLk1YVw1A2BsqgeX78vCpmTM2urS3DAESsCDY1iuBoBAauQIBqnbGSqBKp9ZLsyuUljcKKHlbnug5BCpBLQ5DP6pPjhd5qf87KgwNK44uWpH4ibfKrN3Sao43MMTjfcV7mnKTdyteXoBLqZTrpCoo4chlXR2GoOZPQ11sI7oHa57b9hjnytj9j1vsdUetk08wePNoSFZsC2CNnkb9VsdkZtlG,6f326229a497ded4,6a36ffc67a7389 -te0jhRcTfuigAOoaFsjwSruJiY8zVBME0RusmX2vv4olJrxgIYJ3Dow9hh2om52dqcfVrcKzt4mj5SRtV20ERtmx7M2HacLsp6loonymphr6ECSFvuvk1jyFxUtUEzWGKuOLJ5ETye6ZrGTrKj6O1D3mmyZaKwU5cOkM9ZNM8Qek8QtsGz4wUZHDiDmbvvRRoQKBJXXiWdRChAAtJFRISlyH4G63k1dvX5mwgVrJjCHuHY3qru2KVG1kgrfmXnxDuXDDXkjQt4E9IOMHVpwDKPWHffcEugYD6yEcWUYlnkuaGGqDrXa1SqhiBKMhoujWuBoBCo2g1MOjrZ5zPJVrbct8fu4fas1nRCsEPgLbUqYWZhc1ZwHXdifytJdSRBTOpDIwfQmHRTkebQFEfRhc3l9FJigrvKEhRUVfH5SgY05JDmrZXKuXPinzxzTLi59ejzuLJReq2bPwJso9MtFyO7hWG86FlIIa1PG1c7uQTQvc8ezczpFDsndNGreDqc8ZxCnjNHrRlwbXn4eyn9yagxQSVfL4eSAibylqi9HlSnIZxa4QlbP1Vllo7gnRawbvEZhN330gFAWgH8tsW9l65xPHq9FuJLO4JsVb4L8nwATUXNLd57xMtEBYvawgt0DsdtCYwU4lI1yHzMEZ2arPYp7LfyIE9SXK4AC0,d78d069d55123ef4,9c25eeca9ac0e274 -BhqCElxbJCp7owRPQyQUA5CLS6vC72xA8UiiqiwpKYbiNJcwCoyZrN6PXz6WZFcsjI772zr97BwgC5LS6h5V1fOxXAN1nO14AWfMC7EVZE90qF5t3ldiS8oGUE8nQhMWivZvEhyNw8YoC0nWIGbv5NbHixAEhnxzZK8YwmHVqCSIvO7fcTM0E6h2plAvq4j8a6Gq93XzYaiRpeScikHkwamQ1FR2wOJrwWf4qjegt4CEjIPGLxOUtnvTPpPXTwaiRiYBDqmoVPI7eo6exsoN7hugR1ZvGJSDyWBB672MlH2w1xbzi2lhhhyKsKsPrUY8kIvrg3kaimRg54B00LplNh0HuwKpoMJe1cCi3JtfEpy4lvRZKChpyn1GRIrIIuaXbWLmh3mxgK5DSbXl8Y4g9ftOiuiBa1SDkWW,128c54a23ac00e7a,dafbf6aeb1a98596 -KGyJxwkhajyTJTvvDv1wF4Jsw1RwUVzdvC0FOkwQfm0LHMMBYC6unFduOuNMGPWHLTVVNqXGkkboxJZvc36dKJzs8AYzeitNQ7FtMo2yeYObfzGQ6eg9dM7rBkN8ToxcntYfZErCrWKXLeOgwigxLQbf8tbB8nffcKQjHWtuy330bvZLrvBSduhspW5GZyc07vUaD5AAXuaWGZN4f1XtfngZ2ABpDXTg5q0hJzSR0e2zYJ06GcTcD5Jk80Mm7lLepbfhHUuhCUTVzZ5LDgF0tMlz6CTxy35XbqdZInYqGZ2gHcJ1sM6WajGakhiwpnEpUXqvCL4NTmNG4lAVilMXPWYSpefohOYIYUrbXcjVCaJYeNR9LGB3iNzlThjdWwvwbQDB8TXkYjYGH5i4xIzhW21EflA6WEZIzB8ESebVLLnUTXM3yivYaOiGdwlFhmshHXuB8PXGiIhzfiYocWyYkDM2vX3KqcQ4RWL5ZhJdp8tzRCop5Afibr6lhHP1c88MktQn61f9uksLwuUiyDzwUwYAtCIgRp9RlUmlLFbaiJwrz4zMd3ESW6EFovqIHOyLl7f1PBeBXEFpjpwWwUtdZYrzXCh3doqPYfVAR80uKJ2yxPwEq4WSUDYGOPjP2caUx5Fy0vJ0G1GJcOxuHTKyCp3gyLCkcE4oeIlyDn8tTwrfNhlS8K8svAWMAjDpcRBfpguvGtLD25mUjufg0NFkbgeILfi1NX1csIpyLWRieJnJyrW6938pyorGuBr0FZTYdChPXNvJ0h3lRmahgxKnpYG3jeV5r1ezm1NOe1JRMJq5V1oyjyT5UNbBxPzVlaMN7zG4NL0ZzTgX6vRdEBSeGeGb6zZuNcu444CFvt5AJniilQgiP1Ql1F8LtRbSyPhqb2Q8hrRUbCLa4sbQLSHhAjI4e6qkAonZEX8lmEE5xdZ5F,9a56225cd8e7b5b2,6036f03dae95b96 -I,3a4a285c94f1936e,18115b183f326829 -1GDZFNupXwtgvSiXtIqtd2xgL2uDz3m81k96q4K8UOdScFtubeWH6jv3QjI3eS7DOdzg4Y3mwgZKRP7hvoQySdK6YpcRsTyavHZgYj5vbnQNXMuHJA3kGAfXFGFGxNMo12BIdTyw6sFftf5pAjQ0UXAlz1PgRx3BA8cp1DIWhbvormCnD2H5Nb6QzEQLjj08uRk47vbwH6XbvjnbNeUMhRvSCpPYWmI5iGlkahB9x8QVq1K8WJz96v8PAm1xKhMRCVdFNncxUuogxEgnrRd6I6Z9vZ7Qj2f3wfny10PYochxTxpqAAXtARbQ60Lqr57MvBEJmlQtej51y34ctbH1GuyBIN56YZVpnaO2gsymaf79rUKdjo0R8QruFmPxYfY8ydQm7D7Lnl,84442a0baa9b9139,5cd90baf918cdbab -WU9LBFgS0c2eTOSHYhoyW2RfnQWcH93AvqUv9VRRzJWFNyBzsPKhc7Ys5ft8TjH9HCA9z4Zs6gXFp5Op2mt4po1Zt8xFlRkzSpjFNR6ou60rapy0WVBjbx460OrdXSXSFr8wFpzbvRimunrgNsZ82guMcNsHxTDgxUGVtZEsJJoGefqahZXFJLOXN6hC5aWnKjnj03EjmCUP05YPc5OxvyoEYvq215T1JTKpsCrgUaQKZTZjJLWm6VpdIhKooswdvjOcoQWATgzIZFCVi6LcVJPzfqhLz1nrzfeOpR19ScQErrRbdcRCMLg6SQb5qI27FtiabstjHtWg0P7GiG7zNqlmp4TTMFKZhnb1Bns0jpdoXPQXXKfymh20gqz90AroU9dnFpPKU15oPzUKwaig9m3RYa4vAe1m4fVp5zkmp9MjxhGcvbRjayJyyGPkRRfB53SJKvXExvqcyWlfMIZd3xDfAMlMAGRyPJGbKwTurYMKY5SwMQV2EWT7u8V80qViaEZYMBrEZdKykX5Df4x2J4P2m68ymssLSF0pO8jaYjo0yYPVK5iIQ5xVcSDIfCh79rHCtk,8c15302a86ea3090,3c3164c9ab6c1b4 -texTyqgyv9jW5PK0BF7vC0OBk0agXr04sR4nZcO4HzklK6Q631MWnu2sXkDGKcQZo9wtxRfMsxvqhmuWjd0AVbWY1PFMNv8NkUH3VnkLiIzuq7h4J4prCngDN0SlPLlw9z2jxeqBZOgnHFGBjn3BLbSg3A7lwMhlqPTotwWWQ1qNSwHXI3eZt1FeSGuaYSDFKaBa0qktVnZ92ZzroqM4YCCPTvxBAd3Yvaacgxf989OwJDVCipDLYcDj5oNhfZyPRnf2atJ89NhwEbFADFxYxnjxnlXVfvXiP48aLf6FvaiV2qbYmQtlBmC8GUreWOIZarekCwmUD0RIBFnXobBxxlgM1BQwV75r2OcH4xNkeSckP2LsbLHzG07uUrgROPscCeTz0wrqMegWkHaBfqvbOBdDBvWzdHxgz3qrtaITKnny3rhOfxEtEA5FGaM0amABC7bXTu,8f6fb52f1f493976,8035ae5d0fa7b9dc -5jjxMxwWuQl7NfvS0ijJ1gNbEE2lqGvl650NZSoufpfDPFEsEppboI,a3337f702af1524e,46de3ae14ad10eed -UzOMu6dCWR2J59f7jhI9xCn2grPCwOZCGz0OJD8odevrrvE3XsdO06WoXPKxSRmGLtDCkgQKiVV8IPtLGrPVWesX5T505AZ3S8ZhXulIRiRzqwihAqHShjN3IHCIkip2fkJsmTV383PXjbFaa1ba3xIXyfOsEFMgBaFTIpR7L6akcGuxhmmdDNk0rS7WTLH01VmBQAv6RrdespnXHF1GpCNBS3N4KSxMR6XvLTh220cuxqrFObNVpgX1LN2Tg4ri4B3uerzCLudx3QYRdRYsq42CcLse2BnHAl20bqPfg3PMr,2ff66ce5f3a1e66b,e0c2135455da69c1 -d07UlAliXZoRq2taRYNCLD9mxHYkaCga66A8RqwYW5H4MDkvoBCVDrhdh7Gw6akmWBTRKethk0C0PhMSpjBnCcTpwLFLtmrGIIk87J4Li0hcMBJPUu9FMltrET6pq2Ao79sKZmfQrTNTwE6QDuajvo8JCrVKxy9ht9ql09r2lxjOnSVha5MlxE2CtkCNioKX185ZwrPhfrvHxNLsBuwxP66cOtRVfIsf8kYhnzZvAE3C4CplTEHxQ4bud8ZwsIiWGTyeGYupZS0cae6A76cDlChCsXDmgS9JpgH6rDgSwWijjahBYpCNFEI09XbsBhyr0WXsTM4Kg2Cu6cHoCuodbk8uu336bY9yqBmSgK4dnZetnh7rHNQYOpNMp04p0WFjFrAZyKXWVNhaeQ7QVnJ3oBhkyPPAhAMwCIqazEXQJpkIzwR8ApPYdeL6d84YXcKzfXZznsWUVaGqr0iR9bAyvwbKZnSSNT8cR7A4VUlcyWkGhw09OMQtK4CVOb3ogo1VEKr2H6gBHAkHf6XSw7bSVrT43TF8gLD0MGbndRkJvyBYIllE681wUHyFYutdwB6z3wudBRZykF5Pnc68apKX4bmesG29ReHjCucyq8z8rorAnRK2GMhp7qzz7mJ9CkazeeVK7czVu2Xb9VPgHx2Uj4BMgm6PVregT1uCGbCkxPvNTWmuxN9p0Qwm3kUUxzJ1ZEvWeQju5hnTb6sLI96kTlvqJXPXpQ0pris4XRj8Wyg7BNbd7V8WXMw0tIQxVzBfNPVt4XaPQufabvoK1xYaA8dTtMXz4zHa5Fy2ltRXkFC8ih,bf02277dbcd84c7e,9b50a571b3f5bc44 -NXRi4mS8Zyw3tX2reAOMYMHhSY84j3Pa8l,291c83b1c3400d91,e8ede9ea34accade -8rw4afvlEtQcW8hC80EZXWXRd7hZvym4GqJLGh1O1LLI0PEbYbHbQzcHBGQARkKCuKlX1xYagYZl7kY4w4xnMZvUOTnZkfCY81KmCERBizVfIT2yY1Mv46PKMxcLnUApUUep3rxFSFMzk5X9T30UX2qR32c58iaFxNEsEWIj9gbFtK4DVoIt22AAy54thFxDvEUzycAHJs7w9xGAbE8d6Zn25FJ7nIDJMnWFcD08DsNRVMMUameVTa6NRfSgpIpxXaru4JjgxkTvB1Yd39r4,302e76f2f3af537c,338eccafe68786ce -TRui1uYvYrT7XUIOkO4U9P2nJo1In88pKBDrFhg6xZ,c23658ca1a24ae36,7ed5932036c5d38d -9HayKslIsI2Bd4xx0Rd7k43ERiKw6QtkcozSO2FxVeD4lA1Ghz7Svcl6Seq570diAq7SA6JakSdjG3bBI9s0Wr5AcZMIXr5kG4429FyZXjnzdc5BtULaiKqFRl8qobrisXp66xYFkYx7cb4X6BoTy7WYYwuLxUPPeBtgsNOCfSwPN910gmxVECIIZy5dboUnnwmi3Ox0u4GfilcNjLD0I48gGKHf5pRpEHLCKhx8e2nbXOnzTjEp8upHGg9ibiYV8CnrSMcARyKO8aCXGEns3ywLzWbNUJGIDJAGLBENlcjan7AFJ71IzGjKqQP5TQpa8CyZbwVHkSasXqZ7I1GW2mXSZxiCjlQDnqu5Av9KSmCZtXBWh16o5dAl9XbFcxYz4YZTWNovyHTVg7sRHArR9k8UXRBCu1MjN8ojLKuvifjNkMdL3zaHPrk4r5zu3EZy51R2fuZRHe7hRNfMF5RM1Ax62rZEvNKBsnYlJpI6VKbAbJawICziCZG6sg211dh1YNOrpsDvRirQvCAsuJS3ZODhio74oETFiq2shpezkfVPGjF4qkKfiM2Vhh62v7opw5kTp0KywdQBiwOJUaPBj2putgiCJ8HIlxBI3x0NjYrmev4Atguj8agPfGJLTCi9UfFCaKog935xbZIf6zoDZ6ZPPcYTb03ggn5ydUFdlxt86PlNOPMffAtmVlhUC0SHTdZJP4vmH0lxCt3C68IfbX73z9kZBMUdGFT4UtAZIuIGWQqibcnXiKBa20w67IoEFl4bIINQj4lEBrhQFCQa34D5p6SPnv64hXUwHwKpyKoZ3fv1zXpFznJ0MN9yLRWMbYc8oggbhvSR8eoKAXV6Djv8LcvX5TsaaLdqyghb1gwqRgoMo3Cx2n3r2kzr1O24AKckJJLpLgKxGYoYMa3MZu18PBnyWe2wWF,6a256ced418cf2e3,df6901e464a078 -dOuLJZssKnNos22gJGMB9TFXATQs7nvzNNuBVHiWKpSqgloeA2BazAqcFHMBcCZzBkNCb7EEbYNhKlojO3Fl90NOPzSLDDOKohyjOZeN06EiZEXp4UR0nD5MtcWOnqLwzKPyei2lgl6tgtlBhvU4C1dp0GVo8Z8Yd4PRDQSaWII8hQ9zB9dqe8EWBkpImdiI6f2TDnHWvpiRpYIYgoYvnO2XHwDuY5VpHGAzVrxotgf4M0mEonbs7g7uLAC4xtFQNjYS2iAp4HNA72LwPOatIyb7vZGhgRjkZkg3hdYFI4OjrrTNa8RfTxpH0Sd54LDbqc8b1hlAYJrpQjw4z48nAv5qcJca95qXcmjCcY7oiA6Xwz97JMdrGWNaudBGbTpE2hUfsB04MC90KwTFnJt1W8LWD9XjyGwIihEyqJ7pIyCxycLpOLIIuFDOjLhBJ1HMOJx1dSdsABZbAMI4BIMtE5fwfAJCWswdrYY5OqqCzkIgXzPVCnC1HVrdFoFFkQ7AoB0PJAUFa6b1Qux1IEdF7v6fHtuIBACnxAs2vEqplyWqemGg32KuGNLJVoJb6Yyp,cadaf5f269c003bb,6bf6b9a0df5f18f2 -ptxtAITXfDymQ1ik1YicxEtRv2ShlvHk6o5lxCEnxtD6G5vS553QsdhrHbOBm8xwTOdkSfdjwvarQRlJTLiP7xoWFZAF8qNsSfEczJEcS6CfDpCU2fvuZk9bRowApTaE9ESlsLfqKfMStmd1jNtIAGh8rR2cDzmmTyAo4x3Lh3NdLmI9FZdQ8Bojpuxb0Gsn1KnzNgdFfkKE7IkxjAGngVoJYlfeRL43r3nACbe8RG7zZqvt1gFvuHKkC2gxbFM3CalBO9HFz4dcKoGm12obPLuu4kkkvAPDIf8pJ7ONWl4aRayZxqwO4rNVp3xPGzs4Xq0txDl36bU1TVC8aJHkhOh2X3gvhTm8UzN63YhXYDsKFd9zmv6gc8ICsGNUr2eQlt5gJBno3UnPoR4TaEHuQ1tNuPA7BkwyBEiBhTHfOIfqLq8LPpHhDfbno37NCTHGblvHeMujGB3IfrRf6yVZ8HbyyxItjMoua74wfC95Ai07yShc4uGjJRqC6ipqaicpNqOs96hF8DQtKQw64AeAdIe69jU65TCtnckAKvXMGLHBYBHloDkZJxSTfZDJmOx6Zt1py7aKZadBMvUEYgYEdUWklsMfXXbi8FKXSv85n8HuKffgcju7wOp48jsx50C9nFT2lwJ9F,379ee208c6ff0116,d7668c8fbbc6352f -htjFlmVPq57DsqK2XkQgVxnwnjPVhgzBUTDZ2sU6JWiSiMwDsicyQhSZ59wwFIwkrZojouEZfMEAWtUhQPhJNvkniw2m70g8UgJ8tqnxNfbtLMOGJOxNlUbpWq8uguBSfMpUv699vyzLILK6m8BV8aAAzsBZXlQVd7WULJ0D82i83asWr8yOtjJVKpsK2ohMgJ7ktHkK1ikdhK2Tor6tA5t9avkdVgbuZup9sg3KiCeqFxA5LhLmVnzK8O0CtxQa0dbHtVXKBSpsFPgCwtWvqn3Y289t63EsuIT784vwDpdH5Xn07Ehy8CjeXn69DWkxKZo2QwNicVjJkZozD8nYbxsORthjbSntyqX90kk96N4Ivytyr8Q3CBe1OhlymlwXl75G3Cq4aO88TBQnqmzj04fVSkiRyPAvoS3kIt62YD4vBJ0UBSNEBApJzi9K2seUbTeblRJAML6J4rDJ0I7zjohhPgDhAyvmE7PwIdAh6iS1h7afQV63JINfFTo4zktAmTVdeG3qa5kmJBNTlCVgx7vbv2sfi15sTbdvSQ1EvifzheZ16orXYkqlQI4ck5XjI6RLooTZmGwh0tQpDVnrHh3OjO2269DLDGKDc44B0cnPQsfpZPHQskEc66L2cZeTrNq2H7y1amz6V9pwckMjYdn2t87d2Kx9kErHwFkLITa5wOLNtTmcIFVSth8VoBgBQbuELN2huqeNAUUgtcMqsWmbzNNnrg7QCjiw0Y8pbAOIQ8sQyN98SE5kqxIdtNbr4N9wnmePRzcTRWWi04MG2g0wcL5pTKSgpc2kDFhdUcbzeY2CTiuTBTu4ckFLRq,4b6ffae51132d989,4803da1024f9e2a2 -c8wAaVmsx28gqfj35VDtNXueV4cz0fuqntni8wGdkqTbjb8zgDstPlZr04at0aYbRYFxVKB6PkiRpmyoqLgCAjMKd5IvtgVUjiFufLtw9O6Cg8iUEQvMVm8mt6NplPNBpTvw742D6y86TlEzr0S2lDhQGaF7G30rq5r3O2T5FQZVVKTR2dfK9LCdh2DBH25rQNl5NYdzfAhoaN8aEi8tFUuVJDAdh8bF4SAjNigwV08i9cgBxZCqWDxbmxfyT718lJ5RjURwdZWx21MaDECXcxupWXrefzeHh9K2T3LMtyiCTOxVd2xrTSt0SaPvjVKKgYQy5IQIrx1vI,51593f1d0eda3cec,3a6a0ee70cdf47fa -siNTMuhu2fGPbAS4sOKcAL0iYusEaLoHyrEBaNoe01gnEN45MFPz9aVLOeyJdMxsMluCnUdOIWUvF4XGmrSStB70eAD5b4oWWMY9c3LTqZs3vPe55Qwynwxu2UPgtaKAUoBqwgt5xlQWIEZyxXHr0A6Zdfr6029bvj2JmM8V5NKZvPzZlo5wVUI73qbiwN8NmJmiRUv1y1zwroG7hJ4IalTA8R1R7dcpEFfLRr85QN19kYeBqpxdmLZh9pzOgXFGGemxJhtSu7UMsx7nRDRia8eDeJZUijdKzOAK72NTVYHf0GU55asjsVYcdnRtDr1jGESS7eQUzialf2aVdtlvRukM7ueGiKmGb23heUaRQLYhJNlEF0eHYedvaAX4Twz0klyZTtGgz2Uj8KKJdrJfsY7VyiQty2TealhFLSqyxgOmzkMabMASYhkUCGSVqfjc6lDn7eBiwgMlcR4soKryOa8ZFbfqErZck6sQ5YnBXlPtoW6jQQ7YJO9YSe2UOgl9HFZroAcFHbejnLxlXNVYRPpHLOMtKARG5a2oRC6mA4hiMp6zRTVF8lqSBthrOiC78Pyd0kUx1Y0T7,45c2b1f509ab9308,54affc580893810a -sDGOJDHlrLWfmMc121Ck4zhHrUP9spx9KP9IMSWrn5kLBGOsuS5xWVudgFHS8U9G3wkj4PWsriCilgCrB2P6ah1EJutq1HyWVF7kkmqUC6V0Ds68ahX6zLPzH7K3akl6frYG8YB29jwS7fh5lLNd2YEHSwFQoZwNHZJI1lSJU936pdYISCnFNXhBWLTYOO22D0usO,acc73b45c1d05743,b89e056954b8a4b6 -sdSdkF8N32WmEaNRBLbfvsCk8Q0l2MScTdeP9Q6WO5LuItI6GoyWlm6e973AxpAQleVYqjDt2LtuyWdvOLOJntTsUNoSTN0tW31zTIMdHwwANTDhIFgUnx5B0NeJPjOmfgmEzCqEByVI8qOtsgeS0O3D1uQkxaCvUVSJDjYrCCm6V9DyNFLNVSwjnUK8sp18nQBbfnvTBLLHt3wuiZ8NaVpxV3aK6pLXn43lGA2RJQcFkZZmAEsHtCsPv9qRFiwbFGkuacFIIRiPwtW7tJp7OBhRAIFwIalSTyld2vH0PnAxybPAbfPgwdTPPsYldp7lVCuwYzb1yWh3W78FQl3Natr7HJqahMfGsevv9lFXxMs4Y3hIxsWbrn2shBo7yOzMTH6rIssovY2A9p9bPYgil21g42gzd515Gg3wAY3pEd8aFVNHnoTtSdMUzZ7O51kHArU9kBI2Q1PYBYJ8c8IWAAS2rFeh0cCHwlbv8a81d2VorVv83uxpQkAQ1jPlEY6l8f0jCOtbxLTtRrq9lUpRx1erFvvYlOMqpAmikI6v3StEXUR8ZJoZs5oF6kzeI5kIyeJghAA8uMV2Kv3pZNiW7noQL1kEdyXjzJBwc8dhEV4GuxkjGpK4FZdPNGkGwVua9NVSjGZ0Mr2CMvM1D6Sf8kd1W6k4AfSRQ1LspIVLyKJTWBczB9G6I70rWpjV0i1MERwDMIPj08uaD4zVXfR2bFnYDRVpB8FfvWImKu1yfxMAIrGmyNcVJVtQppF1f5CT8Af2Obx3sZHLsaE8DbfMFPAJscbv5GTeTc5I9vIETrqbmTmaDhubrVYe9W81rMi63VaJOwY96QF3ZwCw0tSwuLFTksGVdZYELz9lLIvkzMRzOL5MFizdA6jhEgSIBhFa43FY4NbM6OJJu4HCnWVUpjgSGgNvwUZjrE5rUWK8RuQaG,6456691cf39d2ad8,a60de5c64b0ca77 -YIQevIQQikyCfgGY6tDeWwLBOUbG8fkj1kIbVr6TGrSxPbcC5LFqLPn6EALEWxan90aNrjKxiyZSE2UDzloUlhSOa28cF6o3PT79hpq9P72zUr3rBmoQwWAnZwhGuKm2zgdZmPlOjfzTaPvMgkOog0FGQXOpw6,8c90603ffc9c2da5,468c8b815e7b1472 -lJqD5zsgOp57IlIakLUKTPpRHS6C7R6B2F0BVq005aiuGkiXCMd8tT6KrtYaszFGf298bq5s5RUicLor3jrV3aiVV2d2zIWFJiG8220SL2iEKEhgrQDJVudaAo7y2qUl9n4dQasLIx9MWxDkE0kqtxh1OCr5eY28kuQzBjShmD175xJe4C3pmgymwY2e3HofpVrzoSUVLd2lJfd8FmrjKI0cjR6aHv3K,d86100387c01769a,d99c468f0095df6a -Y9GuviPvANqFcOgNAfZuzBVjBe9yEgIOGrXYNhnVi3RnK395TRkldFdNwSZ1XmT5fEAYz5IU4AQxS47yVmHlMUN5H2pckHjvdD6ffLzrOBKOp2ftDXGJsy4UbFCGN3AwjtlYMfX9LBpGcpIJDvpcYNTBBxdoT4eVnTALXkHTL1bXKxbccVy71s1uqZ0rrwcgO5Q6cUo84tqtr7nxBnDUXpt408gRQVvnDLJBhbRVnlNG5pT3we3UUGZGgWhIe8ab3KTR8nCBwKYguBSAiQV2XoZtrOQp9KQoU2yjphZqntqARCc5UQofFBTbwHbvvNz4T8VDa3C8J4uTFt8qImP3dI6Xn8pQ6GtcrREv1Lc2deCfzKa4qTzLfjlmx8flnV7MouFClapIxPgTIDIOV7ytT44VqZTpmwGfEw55Y5zyR86ZyMR98ZXWX7I1G3b2tThfV0RAERnPVONnC8dHdZ65Om,731af062de534178,b5265c1df42f78c -iQCx90dRqkrct5LYR7hTEvFsyDDBcN17oGkJEMoyLJ6SISwv9RARw19a4P2A1PeXCP9KgcckJUlYSyepTjVEhDjJzZj1Ot9H22R2c0z6PHnwopHtE7kTM8aw,ee6a0a75def23283,c1b704bd7b1e968c -Qb3DHjDdNyJuAKZfeob0wcAdtDmPd4W6kETohOFroefvSeOXpPCq1W3483VkOU6lVxkDn1FGJ7N6q1VJNHLY00lyYs0yoD6n4d1c1SdODUdP4kLpWQxdyJGbfFeCqmMDMadU9fMtnawmQ1VknzNhFAeA7BzZAQsAVXU86TzoDnHHIBOtCN3XzXHxiNkkyDd5GLFNrUwMEO3KHDdL3YyNzhM4ZsFNgvDlAFz1lg7ZdnwWa99F0HDzOjV7b5pCD6ttu5Jf96oV29M8DTatbNILoKP3BqK0DVg0PkUMI9IL4fbN0hgU3InkbCXysT019FJSXT9gXMBmBValyphr2c,277c37cd1361133f,c8dd311324e7290 -j64j6fbe7cz1uDGM8hKxxOEJYkCPY8euGLNllqh8fkL9xzPKuA3zGDJIECd7HGKfLECepxidASFhh55EMQKv5InM2An1CpVG4nWoRL3O5zAHaEDifMp73GazUrrc0zPyXdDiTTuLWQlZZUSIRcgqMfHCCS3yvjn5afgYxuZnhmkFS9kcUqt8wNVOofGQM6Fjs2FJEupcaVUDMWVkyZj17ORDLYG88QT8Gwm2otaxFd0YH0DxrHEnSD1QllLeKSmfxoay9CZtaoYrpH9ciMWxHHvsQiuzYindBNUBdst322eHuMnwUgxsMroiMyZF37Ln18z8xVH1nrvUYDrf1RNw3zT8zH3vaj8BpMj7o6GKfNMRTIRSqWyyyHj5ab5afesKl2mhPMRINcZdqU1lZ3XLnSTw813tUTYjAenym8mPxQYSTtGUAGeEBOATr0Rzxb6wgzOVYoB6u3xQKlRh4kcN3KNqS09i9kGQ0hwTA5fXnhh6a7b13VqkExLvFoifHWLdkFLiLtOT8Gjzzwbflu8d138B4JMtTKyNPoaEq9pOoRgXewSsiBI6PiU206kdGWVLmZbGNy8O0,b36036bf27e2c619,87d3121c8281db4e -oKIkSDx4SQX4XXsE0s6yPN2wqwsY5d4PGfhrzJ2U7jLrCrcaVXgrxBHuLVkKbWXD5kNgK7K85zZvSPE6sHSpfuAXsUBQwRsOMNxdQcPwfxskUcCFbXvVzdzdQTAKjdfsnqT1jxruOnAr6zrGXk2R3UnUvsgY9Tx7IhyLsqGUtRTe7Qxeka8gZraHutyQ99VCPDIEdvNGtlpObS1RHwgjvxYTYmZmd1jiXd63pIg2izmReNoC8nba8f0WOAbxPcHHGHH3AWGS2tlMBMpQuEvz7S3TJoVP876LFvm4P2mIw38Ae3fiYV1yl3DCD7p9I3BzmrKSExJCnJOiSs7h7ZAI8xqmHtq95HSSBGgtnSsIvvzZmhLSFgk3Mz7mQGySL49fzCI1HqY0xqe9EqWxD25C1yw1EQqx1IOCsV4bWoaijqcclkcxxYn09ciDKxIlFh8IHkBRh5rMkllb2paE3KRDV2QZJOAN7kXGTCeLkhxgKg1acZN2OlafBXflEYSbdYnQ1Rcs4Q2ziUhvTwQqRAmG7EcerAMTE06RH2Q2bp5mrQEL8Q5uTM6iirHi8syEzrh0cxs1coIc4DhuxYB9o1y3cZz874JHTEJt2FjpNAs7dDlYJu,2bf59a0ec5713180,6dfb81207fdc28ef -H2JgbtjB1ZOhJuBn6Tl1gWUxKvlVoCB7rphXMKubHL09b8hUJoa26VW57QqYd9YToba7li2EOLA5JhhlSZyZXuKXopetrPVcgtchT1gURtScfXMdFRpUMp2Oo1erIBpLnvjRaJNvF5uZrNqcnXOcM9k9FyM43j2JNNPYnbQgBTkV8CLQ5gZRqQQ69pXYs3zLO55rYrLDl5asfB1JdurDSORzG0N11LdMQ04PsZYAuAE3Jzb17HLhLyxelfhKOqSq83EbL6HkkS0ulO4MLTefp7dCWXfpdhmTVR5waDuixFZHGYpw4l9DcLqop6BgaEOzC,512104f122ca7fcc,eeb5408e11dcef9d -m0nF3pZ4UJC,d877b187ad4b19d5,c11eca27072916b7 -2GqsuC8WhFOxwsev6Qq3XHi8ObtFEp9i2eRw6aWaeUD4vEzMyAw53fvCD6OQX8QrE42QWTdVtPupLlr625DPyUknoiiX5L0H34cwyIskgpaRzORGQkaWxort4bQCDfQq4jvI7k97UyMtURSiIraPPf3pPBCslcGt22Xql2MXuhRxR74XBEHlqm4BoFB5XOSmHpGLlhVHjuzBXOXs6raq71F28MCLbgAKqvwvCkq1llTnoOUtbASxPyo0UEJrfZSxH2A7jybFEZ9FAO96O0CopCuZY2SkDNoLD2wVnUSLt9UUHyVuh7cYuLII1ynVjr2uV6cicVVJQyOuvNRg1HxLBpdMg8UB717UBOYmufpd31MaBtazi,258c500cbd8ca7f2,bacd8fd530a36c2d -SLQYSJA969BryJffAXk5MOLVXZa4bhBlRtL1uZsX6bZRYNvLCCyRJhgU3dFuDuTxHQ0my0Za7U3Oq1r2Dl5B2FpaTwEUUTIKXMYD5Nfd9G6vvBgfL4pVCY1qVWYeeh7UzBLEmgzYbzuwomIyYdBJpFNu2OqjDhyxzsZYQz1lsFJiHGINW8ajVKasqo4g3DKfbbEtClfM4KwkVbS52ti3uaJbChZIMYwBoYL0KQzskJrZrfGEkrIVqC2ndDUDZh9ZNsv5yAO0AiTpcZonD1FC3yiS8fgMY7BXNh8ld2JP0BdTbP5cngPADpQFkaPEXDRQlZQc735Wa9rUgvIRdSYsDQgK1hkxNQHfPgYQiPqcVDyluB0V4yxwOu0VNZyaFz2zkq5PufaD6jSycoychrUSe28Zj3UJtb89gHZ02G3PsLxnAsoagX38dmbLMBZjjOTAkKSW0rmlFA8XgQfvIoyXCQmiQGSC18CV7fm6fOqmLzSUQ03RF7UqXVs6jjls4KBuTeNJPMzsBPUdSsrmMKn4HGfMCgy9Om1W1sBFVOpKkqMkW1MygobnssljyRzn16jxYe6QHuaZizcwUzVU502pPZTzxcQkBACoYggn9nc8MjaMbjZou5utEIEDLsdGyiKK2xxG0s21XJrJc1pvpsWbZZm40mDKmWpkEomv6u7tWvkcf9f8LIU7OCJxkl7Oh83cNMtNOf7y8gwFg26QTEvf71DJQKwMANMWzzpibFDRPgoh3ELR2KPMk4x8qQhUZtr0MMDBvdLzS1CGf9jmAHL7ygGxIbxfcoERRRjTsEZMzJTnn6dBGDsClHw6PQHnUAqSmhc188u3uiAr24WXe6KmpU,9b210cd40748acdb,6a2722e468810047 -U74tVrh78mfE0HiVSmhIbyCkBwXfwXxCIe8mZKP5Bx,e1d9f8b4bb87c129,c5f2cb320f84c133 -OFDPuy6oSJzkuCfCxfG224mfjPPcftMKUmjMK3vImfLcFMCOGDuFYX3qVGjIqwtd3qgnFnLGq2LyKBrF3NCBlEzvnDZaaKG1vOsHYXf0f96gNAGZg98aKNz8Si9MC7iSbMz7yymrIJnxWerwcX3zoMUlAQpv3EKOZKfn76PPXisJ59RBSERyBVpQWHtBN1WbMdkH57DLNogLLz91qshO1nS5LIYYWwljcQMfq2T8F4QUMV0UUkvxw14x8k3az7vwm7dNDvjrvfImwoA,a938b7d226fc23e0,4f8f40cfa378d96e -IGRS8dd8NPg1iSUIQr1QI9nJh07hK9YFxl088OTBPLtquz3Xdv6GzkezEYvenXAVW5zqoviiHrGpPeg1s7GN1bs37cW8vm1whiW39hR61jiUZpvnQXI4UfZXry0ukFZToMTVVNgim8gtgf12WBZowMBgXQhCAWc5G2kWOVrepCQQkOE39clE2D9p4fU9Jzb7htHlZuD35yRNP3iRNFNnJkKwJZm62YTxanBhAj5LrgTrsHy3IWVyXmLaVYZf2tmmEguDFk8ePWSUfzjHuAOrp27M59wSbsBtsZtMrh2aMo6VFURM559pqSBSyccjTFIUBFNPqMbp49fueTyYaxdZSBh31E6ygNYNhswPHjOlInAcSDOwWGfv8JY5j82zGqQb8SBZc8EjivzrfHn7vvPnCN5I35Wg71q6eGtkHWVDV1HArDGfsa8O7e8gKxR5zUsFLa2rz2tAoiFbpTi1Jh2pqqDXfmMPZLiMChR2g2pKSOvLo1w7mWz79fxWsGq5qUK6KQG37clGmOWFYiY4lsXe4ruLIxCo1OtGAlWZ59mKGjMKDRfJd2dWIIHycSI1dc0qknJDkPOEY94xMFePpLDtPkYo0P0pzN7VAqowOjhPCW24kwDY4ZSE79oDAfUcmJ4XMQZN6HpkUVnsGyBlr1JtFzrjMbi4wg44Lwym8ov1b3bweRZfVCGs8UH0FykfD5aEbXasYim0DDbK0ui5CJQBhxHVfuOI8ThuqYAWTp6PdqTap42hE70Y8QFydprInr1qcG46qHK6fQQQuH0T7k8oxMbqHrZCCKY6j50RDzZLRcHc9LdVtUSLdzhO2TluctTchxqIPfmQHMhi3hcALtwZPauJpmh8LV,504e5e66e164bed6,ed3b3921e01e58ef -v5SmNvmCWsMM6qb0lCCZtjDoLKjg5FzhWTlXEarcu4c8rAAdfjeHJybJnnbcJtqM8KlvgtRL42z1uGd3SOH3Kw4n9Iw8gyswFM73q5sqmBgpw4zzf1GmklKJUXoJ2wUY8VwwRNNp9zsg0B3GFBzWSwnanG0D5mm1JcQcNUwZYlt0MwsmiTTxqHMmRD2hLpfTlzL3ibfs0AbUj14FVU5HFOdqWbC7esTqm9GkysDuqeoh6rgESN6ATTy5rDxbxXZL8cWh76sbStJFPE9Oy7kJAWsU1IZKLCIDteiJKq7heh0bYBXzAQPDvVAog02p4Bsb07SrDvEfgf,f92176898e9eef9a,3e7b656aed75e3d0 -WNDuBBAd81ApePof6G36rOO27dkfSoD7EJF0cuGTFLSx9SFoAMfVEU2dLjGNmzYewh7IGaw0TO4aU504Hoq67K4gmKNQay0XQ9CC6dLQPcSbe2DyyfFeHT0AG3d3F6VA7omGAN9VZYoLwLdURZ0oojWo5qCWVdO7y5LOqXnGMknKMnAs8qjp0X3bne8tUWZSOcfCJYzAjU0JD0wszUgrNe6paqcpiK3xAVMystVPV6VdSnTAdoY4ubIG1pWBFRzeGxtqkA1JMvHrcvrDK3UItfhMSiZV02q5maZ5QDpxAeMwJiIGH13O6y6DDP4FQnCMN31SzXQkWTIRlOsOPE27grIxvHwG6LwqRZw8cnGS2QT3aIt54hxpY8M4YH4jCWkpWMBUNTJknMZSXvrwIEgTGo4kk5cPwTKFTkTzqmUpQcKSgBLG0Rf69dMLmyuLCEixfRpyVFhZ8Cz05JNxjaqfTbPmnjxPUEeOr0sIJ1YX8RSfR3Jcnuj473j69VpWFqCPclFvf7OmUjFdtDjdiRA,18acf6dbd1a9a25c,4b669a2e2a08ac57 -sqok8SkK3BYUDnOSIEdpR7UImPWqo7fL8lAlEEyStUNh3dQz6YLQEHeJpil7UQCeij7PeHeOYjAqsrz2IPwJVYc2vXFDVmMIcNjunor2UpyJEspW2aOK78Uo878hTvjzAyC8GDNTepZrkNfs0gHBXCuq62y5PtZiyNQKx7zoJspvUmkpl7Sn7SUgJQh2sSADQQ8LTSXhIg9PTY6EuE4m0SHJ2xLVL0gf3I2Z7McxjGFsFHTWdzo9qN2KTsiOPz5YoWVX8E35gBxwDFYS8mDzzP3ls6QV6sMeWIQiVy8tNAFdfVhXdvBFxwk0zcv6Am5m94czV9m6YokXrbJwZffYjKwUh1tVxnPwqHFetxyw3KNUXH622CEnJ7ImRvJu2whcyBsfHWw6V62wxnG7AOmm3ukK5P6ORH9bfcJk4XGpeTAKHZtk7e5EP72YlOFI7FIMkP3aTnzADXHDbtfCE15dR2frTzNYxIwNMYV2rAZVNaypcg3VeA3Oy611VSTAjWFpmjocnEgEVovpCKGasi8aOCr2ayFUdPaNBGDdIuUkLXhDBB3mjbwbu7M4kSS1ibACRnpHh5nH1PlVBGiBc7GJqgGl4xOrlNjW8GtABKLdHErB2y5cZeFFd10KNcvIkRiuowzPfUYPNqyG4pRI,dfd612a4d003d114,44c596b9c9cf0809 -W0Q8Y5oMqB4rqFNbT6zOd1DqQtNMcgZND8kJtWMFKgZgKXdXTHwBJgyIWOexi0n121n4MQPwyn4Mc7xFZGYOgdr4I2mQ7gxTdHK2Q3RRNpD0v2W66PCKaKstukVOtefOFUeltyJu4YbDBKH8RyaYPtUw5ZzSNsLO26WmhdmBrC9AaoEGWEXk6PPrqEBaglvrb7qhFoPGgDU0LBiC3JQBbY73GGThO9DuR7JFjHTLp6jsGT68Y9GeVAXypJ3efkPeHnzjtBIG2bbO5SvtMxqCnkAdtDLV9FJFbURflhB6UYSuwEX0uqNisKFD917Tv7qotzb,e2327793ff944a76,582c69416c8999da -I4RmO0oZ8ND5AGPof6LqDryFQLVSGzNMWtKmuEMqWDisQXPQ4LfXP3Tvk37ErrGyVHrXTpadEPdTt0lgY9uUvq2NN5XC6CYGkQLtyRwFUZiUMy8ihNliHrfAcA60NXAB9QGYmJhI1vAyUMQaCZaC6wFLNsWuM3sSVxlE7991mQoGhgQU809OTyQf6WlECGTWnWoR7AdsxlW2jlhkLVonVTrk85gV57M0zc4q28VWHfMKIxDuM8x20wzBqtyM0xNJA1f3aN8jEIt7adszAvtZqg3e54HtUbbG99seM6Z53gnVXLpEGHt6zsGS0eMYH55VPOvDFB7keKdm8NWkESYWxZgm8zU1SIIBIBzYZm1C41gVpzF2CXTs7FlEUU83aOyYbf1ZnhLfFm5sWHYJlkR04JM5Ft5qPUeDDgnj8fFiYHhwFSZzIc4pMf8kcfE3eZTDxDpQ0AootA1RhXgupUfVgS,3adbe2d8d9d116a4,e6258dae2e917390 -TRaFdYesazUjKtgFG2DU1B5lEkMxBhuVDA6btR5rUu2v6ASdtXrhf8rkhFKSLntzv3NuNbH2FGUarNBHEXHG6TmjUbukC7BFx9ldVYqsgJ2tNVBwwkR2CPXTUB7ujjShfmvKtNVghkJEg0VIkMK5OCw3cTbYJouL07U7w4EMxuaFyYyGShpOr1kEt1JaxVrzWEkOm7PBADxtv8fumegokFYfRqv71JhgcBtjSCvnw8bga1JWlnyaO80XVz0oshnCjBSouvZ0riNyJFaaZugNTc,bb2565db61ba05a3,c4a05ffd3ded928 -t6P3sKcctem8OlUd7nKWXJPGvaeZIqb7AYLUNbek1zjuEdwBII9Qp0MDbB6AKDgfDsdx9A5xYHpwYRftjiRzRnlnaA4JGYs5KAVjogApKBZSBJ0G9FHHQQB3iulqVxCZ9ubet5CMvoogAL1j23SvCZYAliAXVzlDpLxQEnjk2c0H0BWdqYCyyPFLZAjtEgPr9LJuRtsT8Vz6slU1rmDOQKLQNKQf0pwamBspPQytqsabIFEkDI8K8sAOkxh53CO6JHaOpriQ3BcejWujCLGr8n5c2JkYOkp5QmUAkYttQBreryyt2ejbK8D6XA8seFV2fKy1nAHZF00AWrHruPyeAJwHmDdSoWvQNjRBwTx9C0JZIJ0p2OADhaXLDQFBkcHKCWIBEkcatOcBzNkxIrcclU3UVlpcXjiE5B2XaheYh3azt2Zljn1lO6Y47GGAYUzPbFjZkib4vcRaR6jC7NtWJLv7picYLgviaSwSaymPiQYgR6a5XEEd6FR5Cl9RTJj0FiRhOM2zYWUoHWSqHMF6tZuI,263e85074f3aba5a,2b99c89fb97f8933 -C6VV3qFgI7QDVOv4zcnATi4VLiv5xF97ye4i9ZrbgatICvKZW1Rn0d9Tr1OyOusuwFLk1ZP6RAbpcecmYbYDfdi8i3EkWLuz3K2QmkA9UbkhUY9XfLpuBhNCl6ICsnc0vyhOWqNor8AkdVdy5Lk7TCfT6Sago898gEm7HA6ynivLLAufYHMaj0cqLdfeb3ZrL7IPHu2CiCyGw8wYIHsTvWnnc3p9jcyPO4bOM9WdyKgvT3MQQbrcHxyEnxROEscmT3Ji2WwIG2sQj05LiZJqEkTwvG0RMKODWy86IY4cy2jiZ4TxOoWFRv3QIkS2PC2hhYLgg5rYETJYDY9xZBZLYlubIppEjob9rfnld6rz32RTxLvozIhYgLfwp4QaogkbUio5MB0QCjOSPVm43TDRCYAkvkP6co3gy9vMSWIsZjHAON73LuzChIIXzd464u0Vf1799Q3XTDg14AESZSJ1kA28gQHYDwupkLzsD1nyrQ2XSqkrxvFqHSAwojAiEspTb7uaGB6X0Yx1gQPSld2SrMSvtkaNO8lKRuf9WPx7PNGIz7geZKpTUZxm1c4GBftwlR4BHSJvbG55Dd1NSpHdPXD1J6TOX32bz3Tmb1CRcXrzF1zUkBGlpyUCgNv4Qq4g57vGNZgI1sFy,cd79e8a7584e2a4e,91f582399e626c0b -osfVEmxtNO5dSCdpKptlpeexMoHTDXSDN9hz474y6aSNOJ8RJ7uiVL7QnXcbR6jjbW00oMj9jZosHrhmKHTIk3sNMRgTVKQxZaJHBYaD35q7YFmOqGkWfgmHvffdEk9p5SZTJ3vw7PwAcMuppt6aQPN4B4nF2YFOScUbg2IQBnNCQY2AuqhtXH9luCgaDQyIjAWf2vQiLGkYhK4ncVZlvpe3uizEGUixho76Bvk7oyltb4oIq0nR8emYKTKsRXoF4rSPCV1AFWlIxGNRGe3YHgQl7NPtAgfEzPP0NrHUlNegrJ3iS8wgK8kFaRAmIv9MgpZcv9ABDbEFVJsuWXL2KIP9P2qI20klmp5YsyZjqAIFu3lXbIhLR4cGW1q1P3Y415DhAxWGh2XMPyg9JY2iKPO4EciQ4WdBbu3AoX5RpdMSEFfCVKAiN1Do9dTwFgysZO6TwD6WxXioTADt3rd8dISbhGbIr5Uip8rYAJzeNWa4lKpyRscKG9Ig8sa7rFnljgd4VNvwRoIWlc0toq59U4hh3mcSFP1cD6nHusabT6OmMnSbwSjLtASb7vDylH2cPtVN2jNYQn7HzjNIEz7aqrVZLOINt3s7jCGhzu0tJ7soCcWLCOuaB5vg3hO0Y8gX14a1GUjLEDcbm6iXyVrxpCnD7CbJAeoxMN6hNqmYenBJdUMchKxTKM8mOEv7h2jB1od6KoBBKMDCcWlwHRr0X28d2xGQHoiNXvJg0JoLPdxZnOSf8eGt2dm9wQjbR1QOlVmveTKl2Hm5CoCyiD5vZgQZ08b43iVxhJDxXUMC0ZmlUJeHuAG8KwOWMIeKs8psVXESaSS9HI9J0Up95E5LjcDwPQnc9VpZ2SmsCM6XOMDXQl,884f38be68500e05,aad6b071fc11da38 -GxUk0s77dKquKi5Fv3mUhv8gAPB384oYHYrYoQmWOUCxQE7PgsRxYcbGuSmYCAU42DUpOEXCiqIfPXWVLcc94F04muN84RQ2w05EHQBa9EhbS0wIwqGOnzq6tKatDo80VJP2rPpzm6Ib611JS1J3VB0FrqdWt9L48UTP4DNTvwO6Bi1qBKvvOUH1UTsjeurYGwSwqQYfagldnSYFneVVX0oS7mtVZY24XafJXuOf58QuipKouRAYlkZJ61urNdx7f7,63602f6373d46f44,dae7bd5a3acbfbdb -cbkAIoSCvvp67NyDl1JpYz7J9wzGZ0rgb9F4MoNnn6jALz8YcXVk5sETydjbLxnwvqecC3THwFV1HW1auxehgYzSnL6YtMt572sTdKDDNbsTIdOkCqWiZfhMXU58bGd2GpnvnMoevY7RTjiCLrvThrJ9VVtCHlr3qBeNt5mjvLCn01VxJPZkXaPIENfpqp59feNXCmy2a6WQzdQhep2mPZsx5wrJM7LiDtWtEJPizZyART21cY4eIHGDLDaMTjynJFpm1JvqBnKy7g03KDo1LXnyMIfHYC9IJqalKTZfCeeVz4pDXdwiq9l9Kl5TwrhWjdI9OTArNEo55OQAD89TOXpLlvUtLF96qRGCGVqINN154XrHcKiyTVCvQ1hYNTuJ6SNIEHgcHZ83CoOkOnq5OewmDr9f795M2toYmd8GEoraM1NxS7jdL3MkhG7RLoCaP9jbnbHpPy1yJ9QFw9fIFYolz2GiWu4banBMsSg853v2bIseAcFaEreXeXXWrSH2qOpxkndJPlGiBSD2qkgRGoZ2VFd2gaf3oPKKIITGvyb6CXUZ8PMSgQMf9Y6ebgT3UXOSBRYhE7i7X2SH6L7WpzjBgEnmD5yPtSpPHCuSfhp93NtnI9MtpP0RIilTu6sDuSqgCqppnrMg1Psyx3m3C2RitvKZx2JLEH6ZBfngh6DwNGIfoYhmBlaxDJjmexLeuG32HCUfkKjtVVPwNSVl52lL2NlnGjkRCG1t6b7girGdIwCOWTbL2dbfX89bAJbdxSrtiO,5f93fb7fef1da357,ae36ade9824806d9 -hp9aTIvz8cShfHvl2mo2K2kLqw3C2bOjT9qu3,838762b858defe85,76237b7fba7bc2cd -NAdNwdz1QXDFEOhD7U4uSpLnk70CrhkCv61kfbwxmbxmijdyfRZwlMg3RVaWbdFrmsXEUBhGT654TQbLgw6I3WLnoq6SQLpIk26l8mLUjSW4GojMuC0f74odwHXFqZX86ruTz27obf6W0DfZDpncdnD4JcFBoYudrC4Vlh4CVzhMu15drmrr8JmjFAT4JA3lhDSQtrIOc4nS8ZeIJqnNpm5Tno3zqVvrX87P1xvZ3ihTbFjKNOLJ7EhUAGi2xH3S14kQzZgpzG7JO9VXXgppfWjh59q1gBb7CLvRFEioxMlgqXjQu8IW0aaXR2ccNZRyM8fTxSwMu7kfAqs72jn602DnoyMx61Tt1IGTc4ALNgE5v1hNgN7fLvXDr3vQTDWC9u4ZCVlSnBKal1a5eFGVIf6bGQTpRISD6zEIfKvkyNRUKVZf7QZVFVQHte9UlB7UlNOlV9AzbyOYGxLg9z0dcoCFO61dLDt7ZhYwO8QqZJrIAXhxN2FE3jw9zd1kJkvBPp10HkaJfhpftdmpQrdzBPKI6hBb11Vw5D335tGltyr8j1psgavTy5CzdTR35rPsWKPORB1xIk7nQ6XIcoQRtaBzNMTDnFYuRS1svWzmJOAQfx4euNxROz8Q3WibGBP6GPEvKcRZ9JLfHGxUtlE0S4ptGPPEHnAYLEMqzP5pNtnJJeCJkEUaQe8SlSfgBuA8et8YQ1nutHG7NZc1miSCrQEZ1VLosQAHVCJT3unTSwGKIlbMT08FsbSieOdVdH78SGtKqhAxQnhcssBUzD55xwOtOxds536Aqaevb5Obtvmmi2VFMWmshhwoqgc5BjVWQC1KhYW54IXTjjnNdOzGyqnE3d3SgswXFI5BmzUZNgfd0QJXmpEjbRrHTSpqNQPkPzIrpiOlGqoMZVXoqZaaTBXXhJ68LA2doJ2sMGzqMGGlhZNrxwju49iofr8ljnc8Du1jFLoeibtpsqOz6yolKahd3QPcEp,e4b2517618854884,2075b7de650a9de8 -YCM0T2ikYEHyi5wYsiqXQoSOmIi3t5fPOU3xHFZUAhk6LPpyU4S46IGnyQIj52oEV3fbYrxayr6uegS8oKxNohqhtPdXLLIvJjMGLv7AXH1aPUnlryM4d5lxoexJnOXoDMas907BF9Mti0wb3nws3GmeCIkOxTL06ZWIT9e7mKoFZre7BWnQBsLsUZvurqmqGTLeGKmXG8NHsuxpcLf9eVXnfWBOPAOUzVOxC574vFE4gMyiOgAb9mfBAmsORsoflcZLPamIBIjj7o9Wb35bY6Z2mzz1T6uRuzLWWMff9ioj5B1AJXDZG2FaBJ7dHPDSWtNAn40brVLORqcQ9FYqRwzB3AdAGue8IF9UOsdBIY3fzR7XBF0JRYcCU8Yg9tGv4lU2vaNdyRurX4ns46Tn0QphAoQhHgyZwkCddiOOr4TreF8y62iPsf1jXfMpWNyLbYqz1o7xqLev8CaAJRTiCrejaUQlLVIrkUE3zRXfWALFaleXTd1RZ5avUa9KwuWJypxPNx9EFBoiB9HAmDuSYNclzTqPGcagszgyyswXct7NGVnQEz5gFY1AUnKgjtSzOy7f7YT9aWfZYgWzByiPMF2MHRonHs1b61EzLNGEtgwqoLthsT0tHNtzhtNCk89zLOpCj1BA2f37ckLCfvtWFNEdcAKBFdAHJmlJxNPGAxzJle3QuoFGM2nqFF5yM8xHctMbUMjQ2Ym0qkUKF3YAQtN0ZzPad8uRM9Wb6ZzeeKD1sg,9667e1362261f2d9,435cc01721a4d951 -BdguVWwwqvkBaK2qRNNhPioXV7r8VAj1s84HdTo4nlvbxYSa4ybVPw4nDBU0YViqujN8s2zct8GFtHQHcB50FIIbHf5K6YhZPUzYLxgCj0p17ZbMq6jaB6tC5pjfEkNt7SfOyeJiLDheiPvMWJQGkMDLF41XChY4Tx2ZpL1CbCEhNHyuU6pRFrTMVwBqSwkOSt3Sp4kx6FvtO5l0hbDHLSG1HF6HyHtbFdGDQVHExkYYpthbL8oEVLQXY8Mxsw2w5Mw5HyTmvItd96JpsVJg69hJLk1LlbZ1xCrE9waTVtDx9z8YZXABTYUb9Dkeb4nyTYPWSGxCJv1ss2K66iItUZ6Q7uSN8qkuSHzoTj4N1vtpgqbT41woct8zOWPrDobEQZKAJc5LO1das7ug8hZyqF6vRhOhkaZW091YzAVLr36SknzyiHL8aMDJp5fG58Pup7Rez9Vynq9qGHraBvExeafWjtMZNo4evDm1xReqJP3Nj7OOKe7fH0WYxMMH7fuW1SkyYoWG8OfhUuiUlOzWORogRNwyCunTycGG2e2YYomPj2Zb04KQFNvxG3ATqUN6Cw4TrtjDoZbqXG277LF0we86O5IIJXkGhx4SBTXj91Cc7OZBisAE3NpyOw85gSydVyAECL8gk4B6hj,d08db3c492bd211b,7ddd1a6fe3269c9f -DPudYsVYtZSLcLpsYJU6Vf24rdW0xeov5Y92oJCP26S5rOzme59ODecta3fmummBKcBAaR1Fax80AbIXChAD2ee39J9sy5ii6cr8bhsS3jf7mSy61HJCvsdkMiVC8NqDx3KYjMKkkUecMuP5K57QjIDMZy9Hul7EXzWiqHKTRWPscfkuJrhJmIIZT7xEkTaI9c2vtyaa9PyVMfiSflKX4hJjYWU4YbQsHSwv0QjYNSUWGciUjx36Dn0Rf0k0Z0h1uAts7sY5sq6HV9bE8kpmfLgBIrfZWTmtVTX6vmbYjvoz1dUaxFStc41fwW0W2YVsbehBkQnehW47eOcKPHyzsYhMqkxKioLmOvG7ElhDRLMxuYahuBiDjZw91BpwrlQPGZOP7xbEu3fXINBGOG6MYxk7wuws9nr1wxqjs0iGuiMw7zwFakiNCuijbKplrO5Lkuxw9r75W3RXoAl8aGcrGR9ZfGhMsWFsHu8xROcuhO9ZVhmUPCTopI3hDpA3SittTRLdCs45U,2b912675db3459ea,6845f46b272bbe12 -dLnkEI3YFtu2YeLXU8YY5eK4xo6So4zPpFwK1vmzgekioT9rQQK6i9L66J1KFe5hN7EeOaNut5r7wrlh49a5Ty4COAXw6zZo1o82BRiVdewL19nt5BQ9iFz40iEB06kU5ybjIFhraYxNrFJfh6OCn56fRhZmzSfxZGckTR8D8UhtiALZo2w1KBXbeAxmaiFHTpFbrrgppnB2bqEpGYUVKpGmv609GbMPpE,668ab4930e9eabeb,de2dd891fa0050c -tQtc9BnjqoqNSeBnGXEMUcEPQHHi8GKcgbkhEILp3wVtD843NvCLWDhdbupB4DYtcZuc8Ou1sfH4eExxwThvqhYg88cTG9m5VjE0YjmcWmCe3sFljFi8l5MXNUR29niMNabpOFpFsGosf0rtpEtt49dxWx1aA90JZzXRaX5iXVR5LDCvuEwIJ7j5Jxr6nzxJNAI78K7x82wb1NYwzk5vdPJFv7gahc1OAu5Pbfbs1GjF4eOpHRyPQNQkbc2argkGHRVyUE08FzE3JIgZyUggZvJDBudaKI8QVpg43NTI57JBqEaMgfMcIXMoCF49uFBlN7JAeLmNcnvO4V4q7JQPKCSlw6S9bTV9qvZDdyy881IUpioImRT1E93UqPJXPuzVrcrXFvHCLNJCh8fkL6E4KgDKbkxJeNaYAe0MyoBEySNfMvIEtHwSekWhfZPe7Vv0rkIocfFr8yRj73Nn65y7Ml8ZbTHP4wIFWIYc2qryWuk9U8IriedPYOUapPwXsyqC9vPviEsD8zylqq9wtfRmIbP2KGOPxPMD1ZGqbraaE3W5LfXiGc8Ikd1AF3A3SQUBaBKXb2hMKYR5AJzJaqhaFpJhCs01yaj74t5OIx5CZp9oaLpmj0GOk7yEY7wRSFsMyUoq0H3jzbdGxeQ945h8wPsDxeCKu4VqDvQ1Jvyq5drAC6x7LDo8nYRW4fzrkXYIj7dspkqphvHYrSWD5AaVBwqe7NMBu2gsgT2SY4MVwJLx8DnCfGO4oJQhlhRyjZUOeH6C1Y8yKJVCaZq998lMMVMyZ2xedZghvyFFrQ2NgKza3BB84Sh9lFWZcOMDnxZspAJjqVWP5p8evwTCmfPnR2jheprWppiAQopgeU08M17POoiyj78WPyhgHnNh0j8OUh5tlgxYfwtpJWM7CFwkDz7TS1IezIvZag4TPO3Vi10mHptXboAG,3571574fe9ad6838,ebc39402a650cea3 -RYm9nF1QlxzP8JwxugP0R1odEGXrwdQhQRcvU3OD7CdrVfUueO4UQ2NSFrsdW2yUhPrJc75t1uzso71RA5vFA9ReqOoaauqEDymA5Kh01pjQRRfNc2qRIUMjALunt8Z3sTWZmKlUjZ2a5yIpEgaWlr3VbvNmSG78trDM2RZyF4qIyFxRV1wsupdWwZDPwI9Bc1wftcv1lqxLdbIrJDbpe7xsggtaCmBgSLJZzZ2mvHI5qSJ8cHnqlCp3ZzR1wH6qh9X8v6LONwkPmjEMs8JReKjaMYjsFU6t8qvI8RrXX5EuekUYjGDvyphoMiWielzj1U4DTf4Us8EMMwFbNTrTo2UZhQMhhUPdn3tcsN8zI1DIsMPFLIw5NoXtSY5wq9dY8qsZK06SrHYuZma6UhtVhBCzbgWbHJEPwwVl74ROsS3L1Mgto7KzkSzyaO5W3pHuWSFvcpcGUo8xgU1lw7NWdq3pdkqa09g5pvYByaNLmYfNqLWMiUe9pmnCRqj2f86QUBIFiV8XAnYXIZtPQy5wZ8FvZXd6E2KaVh,507e46f30bd20e76,f1b188ef2563bedc -d1aAyErodJW3Qk63heGi0vkEEVNlo9AxoSrayui341FWmIHZiYNWKpvOfBR9FnDS4CwcIDWGuRn8edKARyQaChoIdRTCScrRen0H4kHTIifajViwT6xo64WX1s3WZH1U63w0IkcXwGcICSQlbVn2cGG3UBwuhtiZnYgU5iozNpnZv2Fqme0d98bP67KNnBY4OqV0Ljlv5h2LJputZpe0LIxA3gda9QMMGK2PNEeqZQWNKrzglA0ehjRpK2sMUl8H8WciD76ggCMvRobrWwqMVZ5Q6J3GTCHx7xo5OnmC7uyj8YnmdphTAQhZ0bJxHi9sOcASo1fSFPGXI1GlyAaT5qajWDClEFkOnjYh5W3kDdPQilgVPEsMV1zWBg7SRG9jsThul0rAtTUFIsVVY3sye6k1tavXRH7zHs9qRK8x7I6cWBJpLRJ5lAw9AntYalz2UNqipQzzaGKzS6agoEw3UTZJLc9tiYN9XQFWtVxEc5pmdP6w3l3w4NikQiDUaBhQSPGMPx7vNLJdWnlsjhJsMygrfIJFkFTO4402Sk8tEdOm4OF15cq2WooarUJQaIqcGKuaqyFrAjFflA8tfuSwcS7Imgm69Q07rXgnw7a9vBn9WucbOX9vdw9Umnds2vlxs0gEONRIX27MlXKvxEGaqRFpzLPJvMggMnP9AwvfbH116pRzgUGIw3F9dodOntgforIiXLbhOXAAm1AI41DIRt0cMtLBxvv6P2KY5mlvKaQgP6LdqwORhU6mTLiestMsCRO6vTPlIj65vYXcsvhEZkDulz0cujKyyUWPAeW0kRFNYN0PzeL6MvpEl2Ch25t0yvzdiOwv3vtDakvMSjQtIkoGwKr5hVaUTS0CwbpXvkyAYSwrQ5XaWD5sFBu0Epy3cKcIACbuV6cYeBlcRSGOL6UfkYVVxAUZQi1pYwMIXYyyHb0qNLNgULek1SMKVY7gi7g9Oa9ze,df0c94672869cf0c,e05e419c99e2a5fe -b8OxTVRRL9qunHnDfcPBq2aE94l4nwNQnAXwqLIGEGt24Y1eKoZGMfVPm9PIic0bd1EG7kheCoff2RagMqjAUAhwXtwfHcDAcspyut6ZpaCEJVFtQOId9xcTTfqIrebf5bAfTc1OU0GV2vfs5piEfJ0ZaI7gfaA4R1oBGPZLXi57pmRr4iqgSqPBMJLI7aLZQd7Jo33nF71ISCKP8gUXmvZqYHm0jvKxJHfmsxfJkuyBMT7P2LMldZ6slvokU7TO9hgUyh2USBs1kE4YVIRaoZK2LalEyNZozw3UDvl1LBLKReVtLJfrpGznRIpwrPb6Y6knGgzmREGs9HcbDtfIU6YmkObl7OdRCNaxgGOtjoWJ04p4vnpYP37a7zWiwBSgHKsFLDHRuvLYuhluiydyFh,bf43ebc548578f78,ef3c3db60ee861e5 -VAgVyJ6wluCr7PNVx0Ozd0puhM0SWUrFaKZDgQMHhhAYF1yOHDCImgo6CkCDoXxwTd9Qe7pSNgQLVSLNXj7gHj8caOg0BKNjw2Mrq9wEsBj3LUkngRmsKhr3Sch1YjXVdlNsDt3RapuMZCyufaZOOglKKPrggSlgyOtEXkOFvel619hyVlyy0BVFVCg4oqrPy6E6B70z06A2K2eCRNJeRQZDlfMaPNAECtUgZ7CSV5IbmYM9xPADO1YdQtP1Ay89MCFARX0dqbiXwOPYJv7ukcoCPGP8xP81konJlsD1wY5iDqQ9IiIdUkr7StRUPthPxvQsCLs,3c8d44a5bcc53621,b8dc2d61e0d97448 -6VPN0vFx9zMZkgBHDpFHKapf9KlborPbmA5rncJqmtBjZKhFr46Mmwz0HILQyLXbsLgpmqEX5yXz2a8db8GBnmpVcLqLfaaDs6pnMFE9ZZrjBtA45eF5NKGHA7snFxRQtY86tq9lieRmyYQ62v6PmkwKvMmpJmAfN2d32RJomdxj2N22xl72uhbX9RkSFB354TBJVzNg0sjtkPPW6snEuRlKU8tSks3IdKBUrCsLY0Z1V9YiOiFkfgFYjVgcTwV76NfyAO9eShsMyF9XyUfy8XZQiMaCst92ikcdCucZhyuE7PXIxGjLS3g8r7VRZdoHpjgo5XVPYjLuKPEUMFFYpTzHUWPmRZpq8zeRe7DkGuf1eZpa2T8CMTeOOiNcVANcMNnlZhiGzV0lLqKn4waDsIBjxP1cVTBSjoOSo2X7tMs5PeXkKQoD8Lm2EaMURDYnAbd5cDz1yiV18MFNPJkXTjpeaPlSI69MvqG74LCP78w0MzRBO3wH9FmokBNeBgGHGSESek9swA6n9IVwXWRk0eaZWSpc6unkpt65mJ3nq4IAQJiqF48njxNoShjDj74InvsYcPmbwCkcXFvutnVebv1d5Wr8Shp5fXFvx58KwIdm6bi6FsLjxdEjkKtr5ONSHhYNCcdFOv3ZwoxdBr4QBxkarieKLg1UP3ANQUoQ9NL47k1uHKkKBRKvNrI6XDI7V2ps0LTpLabxqwVTvDkksYH75RmhwJ8JhakPRsZjj3IJH5NsBIkwaohrQFsCA1QsZXyA59QB9IXCEa0UlQnqL0UJqVfVliYLHyZspjjEkvvnVzJ6oV1bzMD8pC0fNDqPmIcczwjhHDfahud26kjt77zQVsR4doXwNAeQQ14EBu8qqRlr0SQFm3fRS4fJCTFeiAi8FtkHcj9VDrJsNcJ5ZfblDVgf2ZOzaZ8kkghOtmXBjv8ym4hcToeCIaLQQk3sBCo6T,2822d892b0667762,4f7d1c7d49711582 -7kgC2rUaHjGfT2V0d1VMEpzgK5z7qFjprNZC8by248o4jzxg9mhrpaxJf2EKj5rp1bPcKG77nMTkHhSpKSBGAwcvkZGhaZ8YW8uAl6mfhrX2jb2BpCtSKM7FXk9rmSO8rxcG3C9tjBFL2rs4SYDS4oVlM6AcPnaoSTvOhMPDgn6n86qUUWgYk4gjhJapffIs1mjTgFsVxueUVohOYF2E2pWTGK3vpqPH8eZdeiRnxboN9iddIijRPHNOfVRA2PEtNrRqkJdwmsuba7UE0et3D9DMN387S1dqEldsaPPtITGVV9EFskTRVz09mTj9UBlTccKVDi3SnhXFHsYmN6eliJaeM7ivQiMsl8HU8rR5K7xUGKn02hQZNYst50gpAcLc4Qw0hYwseVEcxzfqR2tL4QrmV2g,683cd40016de3151,2eec1c2b0c6cfc75 -BUeokJxlhHqUqbng8cP13Byx3fsUlG5011cejeOk5wZa73RL8n2H0Ai6B0PbQGJ7GEy5xGI1PCHcOeEDrUQh0LbbLwxwJQXt8pWTyMiSDWfNTnbp9O2uOzq1OUCnRYn1zcHuWchHM3qtAfKnPpoFtHQa09mA0WECyygIlPKFJO2Z0ijn9bhxVibaYHCFTMr3qMjRgRJSxhIny6j18j2fXm8WPRcuOKIVDy5XaaWFEQux1zF1Y5NZt3mU3UEVsxZXMFy0pSwx4mpyfbengJ4MbJf70u7J4MKdwYjqpg3PVSV2jTIfDXtGACHwuIio98WAQniKeYeXW9GlZIorNEnpNduwUr9xq3dWjZuPVBYXs4C4y6sTi2YihufRSNqw9CA9M1wlmwDbT9PKHc9014SE0cgIPECbNzfVbHtxuRPaWayc7aUJHgvYkLskPVZfNaXfrpMqzRhsJeOJA4EfqTJp7nvcCQOqG2BrhDy2KRymbz15NW7Ylemo3xtRQSFaLiBpOh1A7QzFCjCwDW1RV5YCCtzGls7v8EbbTgRMY35WSZ125YD1WK31sR8gewelAk6ckS1jNBCXnpHfELIBfL5G9ORM6qO5,7be0c015b63021b,7bbb4cbe873e6df6 -RJnwDTm3583mXeDoa9PesWWjF0DErhPNYdA0XYyxugqk8MlPTBZnbawtx624t7SfEgpmBbfxNKOnEjw3I7rs6e6CnnSFd5pz36K5ZbX96fTEDgFzpxOiIHf7UYv3ohdzwvUgrjbpT1CDPFAes3bG6ByNA8qx5XNiWoXwJjgWasKRenDxLRtm5aSV2ERVgM73LVN4SicdRg9tDCx9SdMj9aWyg8VfzAYBMZggouaCJ5zjqbwAxvJGSm6ViakjahZxJB5FQrttVINpV0GHfjB7WgN5RV7m0mWwc6Iz2j8dnHRVFKJ7DtURw50qvAgJQH4vzMINMhb2Hc7Dmx5qos6CdpZ0iD7luBy8IdzKggZhHMYhLc59E4tun2RJxMcKgCUTJiAudSkARPYxZ6NLv6aP89uUsE2hZkhXyCxrzjEk3Lp4qdwGJMLF5rzWyE8gdjJlwMc1zV7Lfc5f,8214d54d06acf8de,c428dc59613792b -8oyP9vrtCKWIZUyZAn0UhxRmyFYPyz8oxpUYVdLWTeQyO36K40GWS9NSGQc3PvMK1yN7VdYq8yQs2,cc05135fcee2c2a7,c807e676522132fc -Inc6cVXDsvvGPpPOXZfjEaIrBJ3vy599ofTJZ4ZanDttV2QxgBpsUhOfUcF0cQ4ziElT5fl0Dy4c5YQi4i8SJ33WxrWYhn2wKkRaz4kpHH0vDbtczJooK70ost338tRomWwP7QQVUhS7wcmwKnNGU5ku81YmWY7maSTY2B9FhcUHlTOhiqCSYUsLQ0WIE5hEJCXHcx4qmkO1EtnOvjWtdsT6e8OQUJn9a63BGwcOUjRzGrhKByvIYAPHXd5rxMaXgKMheKQBdhFAXMv9KXAUtq7BS32FJVz88cF9roekqoWYFzpJEN4MpysvPiqvo8fGbd4BxL519hplcd1GOsrB4NM271ssH620msTcfuhhUniEheV3N70eLgiKo2nErjKqe6sI2Uq56KULOvmPflDqgrnKoZ3AZuuFt57GuEgN85RBbWjVswKe1l0Lmp80WxkKrzAbPQj1yCNFYZnmwSzS0EqqPy8kzwGUuwCRUFM7oAdXywgvMFhGllIwgjJmdMb8JNASUhxLcuKYu8ULALGZyAs0XgRUcv8RQDbOsn6aXMNCwXTYjRNsCRwM8xPcTTXTDb9tt3eTaB6E2yRE8yNUXRzHGGfG9iVk6xA9JCxiquSWZp9qc8p0tJQRzZgxs2xdtc5S8cfa6mz0K4Jb9dESpqvfkhpo15sI67hAWIdV8G3XPUBm6RdDwxC5WZ5bktTkLwC2Q10KxOtpiNWovTwgTJzq3RdL8KZbWaffGvhG2s5zr3Y0Y50feJxUX,79a24f91459993ce,f82f0fd90e865d93 -YOoxxz3mgucM3uOQocKQG37z0ygoGhlnc9XJpCej1R6AvBdRV7mEgG9fV4WXA8Yoall0RQqwfRwqMcMZlKwr4tv8TVbYBfZWA0WSIIsQ27lLfHHDt1fDNe6q5LfGnJCxKo4tRPJpG2MQgZvrT3vFvYxlWalcbftkrgyyfKDUhNyGXxGPd9ID9W2xrsMrZfr774066gFwiVY5LLHUe8IGWB9gtmKRfT1pbZ4xpwAdanN1bz93Oe2dMVNHZ9TcUejKCQUbSBlHBnXELoDshNKggnLo6xzPfXeCAoaxpybnuJ6vhg2GY7gtidT0jeuWp2KVsi0AvCKknDEPGNA8R6s7EMgevjcXptqKcLIvNJQZMx5eisHAo3PC4E9YRl1jTMYZkUvJPxF07bXrMS8Vwr1BRPfZQzVYftnkbFqV0QpzPtX5TaSHLOa6Q0yNgZrPWfVvVmp1GT47XGWBOjZ38GFLMkR5Y9IM9stuvnQ5RIcgk7wHGJgzhCCnPPzgu0Zg6f32nuNv8w8lTL9WUa7fRW2wWgURkv1FLWm5Fchim8oDWPAOZR3Aqnyr8nywhHxQEw5q24miZ8mFBuEzQQihxfYgF5p637ksNmTirQTgtsPIco63shBK1ETekiF5s5Hj8DUECqfybmGs2LOahDxZ1fvrzd8gLDl8nxgwwiNt85v8IXQpx0wmHGWtEBoXpXWmGrUvw2SFVwSw5idFMtvtXjQKEgVgF5T7Wx3ByMb8ZBEOa68WJv1zMvrDdrQyj94Uyjte6Xv9tnCRhdq2daRFgh6eFUaojAPoxvt5oOEjPT5D6HqEPNubVWURsCHcYFa28pVYbzrW1llIpDIQSJXz1QOCUh55oPfPVqy9t2HRPh9XOBmMpNyzxEGfd83lHLXFpF8mDPZeHlh2a62M8DclKgwBPgI,354ff59ddb57006c,fb74db89e0364d50 -4GtQhhor4u6zVcOGTxDVp1P5YtPdpyJB5HeS5RBLsVIHp1RUJvEh9OL8yZoLceDMjVhQQQkYkK6Q698a3Pa2dLIp9O1FoHCSszs0PRT0JuFO0YolOibW39042msdE6n5Y8AkkpeJhjXQPgSioCDnTV4hIq4Kn50Bmb8XhrxHftNYjhL93dlvFTZnJyOWu6215fCj7hMP35UWT4CBAs1QM3NtScaJpy3cuM2ZtpXsHtBIrM4DQomPzEMlvabUnBan4K9LYtxxP7PjwwG6CDigUEo8NR4WXpuU9PwNYTZCkZtk2Mgpe3LrraUImkmSU5gO4W2BNJMRETSG7qJCeNNslYkRiwzoerHM5mF15MpwN5NTQeasq5zDGUtjJAvLpUJbLHTFRRPAPW6ANWEjWTY6A0p9GHeMnIcCjxNp4bjdW4xYCN2Xr9aEDLBf5Olp6w1T09tZQvhp251yirqLyUTQT2N6e29B92mUF0oyTlGq1dI2hqk6ZGDwFg7OpryzMnv03QfRs4dgtBP7fa6QNC3EvzKWDT74djmOlwf3Q9bYE28bVQvZ8LGmw,bf0d70381d2bc1eb,7222e1bc35e810d6 -MFFgPN9mwFYj0Jz6lSwSsggrIwsf6HyDbp576aVhguXknOjVYo3DGZ73Pp1VNHxGakSi8IYe1AlTh6uE2ywaLAuzJzXRqUIB60bvPrktY6KPF78fOJIdoimtDMYRqm6ZcigoGiSeAytgaI9J5nykwZfhr6OUTRiX9BHCAdFUfPNaUsO2GaGVGkCqDW6AOQaJp7O2QbdmUOYIMQLpyGfxeV4XZz9r0vHD1Yt7kNUFY5YEPxkV64hNJXCSTmSkEDjAI6WNxXDDTvbxJMK3TVbMxgxRmnpvrr1NnLJ5PuNGa4xQ2nCJYwSzoMH75VItV6sIxUsIG5giTJNtY7r4MO0Ka2FTNNBqkBsmgFllnE5tW54NgHl9WYkwknBs2RwcIoYkVXixAr9TDetFcbSAWU7MNdf84IUaIP60H4NYozvN7xyWhN2RG1OoACGJ9Mrvn0TghwYqiXXxD8B45q8Gb6189n89H69Vvgmh0OypS4v6oAuuM3g1DTVGefaqiOycKJV96t9SXRkgP7eYg05I5Pj65hy7UH2GcxtlAY0WsvZQA5dCWIppoksufK5OwpWcSUzEAXAiSp0o7nqcacMIiIpBGp1X3Q6VzZMFSH1Lf9v39wlhHKmetyWRfzPi7CTaX4HtJ6nHNoqfxgCL7LFjDPS1bx5h73QRz3WuXerYGAA01GrHTU7YcsRyCXEuvKjaip3deheGXYX9kjPCCtHaUG14pOQaX93HVl3NMZqedbIeZ6wyU0C8AcgBIUfGf9BsquYznMVBLf8YDk3Gf49yLOVpVYcfXuW4vrU2Es4VVYeFcHFLwnhl1xRqeOmL8QJqw0Hxhkfyx4Dx9gVpZbM6FzUHr97ASEsYK8fXNSceTNNO5ZDW8Aup3JHDZGmx1gMRA9xNhM3daxOEjcdIK48fefQO,13062e4569581a57,ddb97253d8c7533b -rIiCq2m4pn2S6QDRqTaxjx1JUFlTGQEIU2IpqbHmtk3zvbkFrR90fHH0P1tqz7eZJ26v9JfVL046lw4T0ysYVyTEEtB4dChzyx7sA1qiMOzD1SgSmx9yWlMI3pzlmbEkdMTjGv7BEVCSK3hs6ejU6bPKi0GlftUwBB0h2tfOoKnldZaZuhgbAWihwyiLy794NatMqDy4PjewUVDpy5ag0LGQ7F0xFrXeF76Gsoy5dIm1bRLQYR5HvxJIasOk1p0dggrnNDILnBzdIKDjCAK0ACKA97q2Pnf2PG2L9iGvXvbrQZJRZcSDf1KXWaIEWCzVOdk42S0MOBSWMP4mIn5C8am3o3YJiE3i7LEU8CARZhjYASxwxoYv9JbWaEYNADf1euVWLEtyTTn9eMEdnfxk0IRjuTJNY2OHcakl5xsTKl5sssDgfJqzUtxFb7lSBHDcJd5yZwETLro,fc6f38763c022982,b966c40ffd156846 -7PDyeWLqxtIXwgzpcGvPoEa9qWDcbFozG4h9ZT3q8Qi9BLfRtWF2Sqs9rbOkDdBTYdI5CO5rUZuvWUDlsSs6arrdoDz985IYskws7AK8I3UMOxnVirORNyP6d1yo9agZwnCFzPMSNLzPOEqU6ToRABAF7NMAkwYjQRAaVqKhyKLwcDaUpaBbSBPy1GsPna1JMmvSsdgf4oKU5efNnVc1JH7o89E9BqaKTm4HLeCyT1OAl8PSSUg0qVIlP79KbxhtXIfkGVta8Oi74BH3jgqC5cXaVNJgiwazYF2u5I2LdwqULprTrTOpZdlNGAsnH72nZklovrRpsa82vTU5MWNU7ZlIlHXIOiiVQdDaNHQ94sIxMyvXki6vs19tFq5jU5xBmhGdPItd0spxjV23pnv2m6rKirUUwfrgG7jqZbUyHdMWekX0ir0Yh82A0VZqobaJuSyLBJNFjAc5ZFlTZfhDSo7MeQfnbYS6aQW0RuUHKQSq8D64IuwkZDXJ3c0vEGbZzO1YKh8Bp3ryPEqhQ0vnQsLeJzNxqfQ8STNhDFDOMunNx3BZg4WigP2nhQW84XmPoY9ev1jnA7HBbUWLBtYJhmKnfMGQDmz3LxLZd4x9Ni5kf1IV9XC8TziMqoOkwavabvMvjxMaCe4FnvCAye4M7MzgDcqMF370Tml60zcXph7K7XWOw5bY8QjnQ46XAPT87oUjUdxePzy9jBykCbOHz6dhw5PlzPc6am99FcWW8nlZqblAHwvNstx2fetKJpfNzDNAi3kVsngQwqEytCNdne5Celhsg0ErQ1nIaOY7SNulxDbFXCmFaq0viepLy4FVxEIY,91edcd515f38d266,bf22c5302bae54a4 -ExIqSOZdWe4tyNPXlLHSsb1WfNJvL41m2ZNBM0n9kcb488ratw8DD1vIl7lI4U73wUxOVffS6bPyGt83aPwwLZZvnLCuyPDTArS3M2LvvOSzetqhTTqdpQakxwbIaAflJ3ibTgpJnhVBKgnOozkRNx8A3ElXZB5u8qksHr9E7PS1X61q61RUVqfoVHrJD0KxIbKjS6130xeIv6TfvI5tnl9mUbv6smpTAbKjcXDUAkW,c517a4138fc6e4b8,96554e39848dd617 -NflsJ2nh3KrqmSrYO5Rc2jcBIfxNickP,caa121c0f5ae65dc,f4482d14c988e8f6 -FJ1EalHsUeE8iV1Fpibw3VwA4QMlMzl6oWFlYwwTP2N5K1kqsuRQ6yAU5PeLIYlhBod8E9QVAXsYeNQ2FCioEZaImYXY5p0W9zG1SJi1w2wYPd6jFF5v5pCUkGVmo9MNbHAotOnYjCQcUJI0dUln5Yioxi4pNCZy7KrrcyoLbhmdVENYF6UqGQstbbkRLiedsBjBLeoBnFPDjXpxvDItqOKQ4iDS06m26qNZ99uBiqyDn6wxrULRrwUkT4JQKnY6awRl71ObCXfdGUhLcgLBgqPZHq3LlAdkSWHsMlnnRsu3AYdEBh30DcCsS25Csw8l1jmXMBjH6eFF2mKHHHwiRrWE2F4aay9r1e7bdie6QBUIaDKbngs6HFdxsSAh95ZA4hwQGrH7uCtFNFfP0k478GeCh4SaYbVYf6H02AmLzac4qGYenL13PAXGcSyePc9GVOVhH32fGq8bdl81ASnc5MxmFd6ZxC8r3U5QfWGLRDeqK3I3o2EMkAK29Nzx6z3WvXQYCAnQiQ6kSGXjWX1LlYMkk7sdDXewQQfnWQLWNsZrHN8J74jIEqMMDsbjYj0mzfA7BbYA7LkFirCsKOjGXAuVPgqaC06mm0RBgfrDNYiY4gzrU8uKYExPF2OzM9LZq73y72UWGl3lX1G13xu54QzLGOP4Gl0iXVtRaJrahJmPMAAkA8MwUOxURl3dvAGncfU,4963ea273372b589,fc3ccd0e2052aac9 -iB5rdOAs9hOqT1SVpvdjGTvnZpPfGgqloTu37nPlzQOJPjTrfcCNJu970a0xCKj7gevZRnkxIoXVrqaYZ2NXHxNd9mN16J0IWnMF7CazWITCO3ouA4OcYerqyRrIR1aOsvJhzADW8TxUtvkGPsAnLmKoo9KkL4u6IlcL0RSE6hAMoC63InmDFTkTTrQBcPhMirpKWckufetzYkAs6J8HwRoQae47W1pXsYfMCNuI1mqklI3rLymY9VZmJ3QAQB1PMeChb7kijnCg69hoMOi8kgbH8rqTlEo319qA7B5JgRjAFv4DI2AbThLqwuOm6aPXbAMrNND2aHCf881RqJ4GBQhbfQOmnZ31h3qpf2aJDtsAgjACaGVqxuPbgCkemGEWyuz5fjNf7fcxKnYP3rXytrcpO6M5YGsa0TapeZRN8rDcxPOz8v6dQtlJ4FWDXIdYx0C7LAPmthu4g7HAdF528UxZufbTA1xfNeHnjrwPhN7EtkWQ083VGO0hNwRveK9Ppd5Wd5KA2f24XqSsgCsJyKQaslPWn9FjGLRmtBkQwHXdEYk2AXBqkzYnYo9AqNyhkGhOoJwQxibrr6jFQI9AcFsmI5Faun06llFbqTpvBUEJ8WwKWMqjyKfZNWE,a4b3f90e304c95b9,efdd93973a66d64e -z6T5D5Jm8FrIHuVLdonzFpJTjOWWg54os699ppR5FZ2bT8xntZUmZnUWE38Psm4wxfi0OqT3nZjkQD92t5V1ti4ayRgu5S6ewiwUMNyx0YiPOqEqX7tinXhrFzy4fpyGPjeDtI7Mfn3QLi31SfuV6KmXXDKOqBO8QfyNXg03l5zb378URQUmrqRKyZM7TH1UklgUDm1h7f1lwCVuNfzc0vh8yK1gaRXBX4DWrzayP9osP8Ui1Osi0icIJaqE8bgo9SnsLAgOex,998c116bac8a665c,16a60cd917cff592 -XVWHFEawlFQdfW5rIxtEINIMrrtGFqq2m3hYgvQBWekExobklTaQ1VEM9DhPmFHoKLuiYpNBeUdeV0iwzNhyfkRAq7ygmDxD04fvYoaQmew01EwYRiMXHfYDA3RcOV6NVxnOfUVX6RZXNTzKnbfykNiCuDCKzmPdDj4KVN2Zi28T77DZMS4TpBbC3SH3joCQRYQajqyWQOvogecrElGShBvxeoXmod6LrPOH7xp1LaU1XNYLBxQxOhmrPnO9dRsHdguzogknHxrhKaXMDwE371nkcqctpyCCF3gvlcIQQIFqcTHwoLbGEfYXKzCJkAd5WjHcEIt58GkN4k1Ck1MVpzsJjP1eqefgu0oEdl33I8doqaCm5mhMBfxvkRSnmodVkK11enHAhQ4PHYwONmrhWdrI73xNqu4SCmvYxH2xN5Ub9y1UM8JmsdTqpO8pKMW9Q0JzQUSgB9w1JDUYhUFZC6yDMk8wszpQM07WaqDddoHlNOC6LKePH4kqSWmcfsQHmRoLuW1ajEBMzBwIEperbwqWH4EUm83DazJAoh5R86gYRK2q1MML3Sa4LHOZfROxyPB3PBdnitCWz4QFGlY8ne13vtjnrAdsmlLPTyPnMtIFQlau8OcSEuiy3hUzAQX2rME6rthWAIIoHdGMuXzbW4WfyTXqPng9Oi9EIz52Br2dbOEbw25pdGd402U3hVBIrs,2224eb9056845bc2,2a94f046434094f1 -m1KBv1x5HvZi7S24PAp4IiBAcqyoDp8M2KEtrqxmfjWxKaNiJNp5vyxyckpGaeVZ2LwWuGrpfbdTJBKCygVmqRjsEA7Mv2rrig8EYgxC3IG7qMFNqKDxiqvhQoyzktElwXexYPFDU0NFsA2n0cjMBvWEsgyazR4kLlETbmkUAMQFcTO0n30j4LcbtKaMIyhNqSyyfKyaMHuPdRFDoP9J6tgBIDw0r2LZ3RQ0yRHxsqdvjbWdEaSveJqD3GLwOufEaTeveCBIGNlSrJXZjuzgq9Cqs403dvnxsVIz0siCyJDlo119ustJjqJQndP3yJ3M4QIqEI656nGvXnRPg0EhzjMqUsi5EYJAxE27ZG8mtTZIAUlvG4ep2ni0YYxNyl7yiYxZWwBQNeQhLRkCkLA5cT6PWqgCFtsjuVwQzU6oTPVGaKwdGWIBVkMM6Wko28g0,f38085f552223f68,2cb2381c809207b2 -6ddmMM8eh6pc3jSCHhpehngWXQkkVLFJk2pzn3MKRx2k0w06wKGU27kYHPj1jgndGjBXjnoZ24eGHakcK9guLIHmfkhG3LJOmbZaTXpbmAmN9giSntxrDcCvy7UbFYkqNKx02D0jJT2JuoEVBFHP0IwMW5Uh7tejJ55BcFZdtGoObg68RsKLVH8geReERB,b9b8b4e8bdc8c066,fbf644b3a3a6a96f -9wcPK2DFm1KD77HroU9SpS9trTLAkVcxG7h70U3hhnCu6EIm84zu7UHpo4w7eYtkXclRnSJvLa8oBKDjHY2omxu2FNoGN3BFfGUKl02LhvZpRwzbl0CUQNO5HwhMjeYPpmezdxTLWQQLJdwOrzIK1rSxOCIqKXr86avwoRfKZz2rTaMCMCMQLye0dcZMt5QdJ6zV7AkVx2WtAu9whmaOg6b4hB25v6vRklulOOaakIXwc3C5XfvqDA1RB6CyXYhqGMptrvnrJurgbry4A1TzIVQXQ7j0vKzvVkVSXBvtqowIwVpSKWeJ3KqR1C6rb0YbYvtA3nljj7ZB61DrGA6fCBDudgSrkJjFfgPyHsMwsgArbYesAqhQCGD9IzcLycQwfK4Z8PUPmarSyRRqAbaTLjM4Nkaa7WyNfZPxu7sQFpgqDNYm1CLtHVfmFA0NTTNkPUwSUzrpiRr3Ee1kPeT65CoYT35oxIKGowThtKdNB0fqICfXXT3UgkaW5m5agPLdcevzc5zBHDUCZ9nGfKSEEyCAUD8QeN6jG9tVjVXhn9xJ69UH1KfMMGoGbLUBYy7p0YTzPS9JOsWtQSHkgsNNtjY9SSJ5EpgdSDA1mRtJJC9UhwqIDoy9uxIfAtcdqwpGThWXs2yICFCjLTTTplPAv7mPMQxryUPXx8zJz0Uq8UWeydZQLeGo35fj5wivAKz2weA5MCAUGolbJNuaB5NG1jl5fGwrDbXG,2eeb67dbc51e53c,671bb2ff40d6e95b -goxuQ0o9HApw9Q3WkTOdS1vmXGpcWS4aClis12kbrwFHN7rdt2xJvI0unNoldmekHLOryTLjci77EOtS5fifpxZyLVISDCxiAssfDixDrVhQGAiQejQ4IFS6NILzbqrzqx95VUgUlqJA77qrEpadY8SuCrSoJNfz8HjbFp82Pa81Bmu7tDI8yC6AlyQJxlzjz3k2nFsz0eDfcDWPkXtc9V0aOjIYAz5D48ST69JwVoQkPZGZheXpfTOQ,791961eaf6a4609a,80bf13e68af3e0d5 -eZMW9e7cTvRra6iwCguFHrPrqUMKtjm9JA3i4DAtLy4MSR7V5iihtcqZmU7hMl7rKBmi6Pk8COmSoWQW1gYS5HZa9yBaSvkLd1CgU6lXBDxuikGOhELklZc5GmJ0Iru3hEPdP4MDGKZgMcxCEufRcCgnwoiB6lPFK0Ks92c8rnBrTTbEExeJ3gqlEEKaBoXMF1UofQPWq7hs4FnDpK296TPcjb44Wzx3w1RYonQLaKJucTEQl1rkMgXWli3wtB3TzdDbKI3p995Qvd5dbo3GXpTHd69w1RxLfD0EK2Af6suajy5HFU74TeN4XX9d5W75RCl7AWF0zTdUgFvf1NhWqcFvlQBCTzhttjNeCzuqcXgyr3Vgnpn8VVN1bhIsETDYSW0maLMlHEFrXwEEcEjt1htj0OD,366421bbb3b923ac,3977c5aaadb506af -5K3uevCZM2Dn1HwNps9EU0FnNe8oGrHoI81fIHwwtEwY77hOPKV55K9vsHzpmKhHd3znaDYamiEa2qLayS2ZzurciIWpfYy2XnyoH0Xwi6Qr1laU5m65yYcGmRjVZOA18RNO50EvqVvHPJEBnov7l3aMkjfZKjhsMCC7U1qfdTNvF4Gdu1NfZlOWBly2FOFhtii9KnROfR6rzp4KFqZAGFpoDOOq6l7Xlj9T8gZMai3JGmmRxJY9p8wARuxikF2On4aVi1uqUupyZoNKGxdyZdiNbmrAutVYQiB2OCZP1iapvVsNzpv5NU4v09rApJzNgBQ9jVDXdqwg32mJBblCX4z2bZfNYyyMPwmZMYNLUqpGWxAiiDTHrwTga6rwlOtbAghQWRczJ4cvDEyW9keS4mQrcbKVf,a8eee0953ecf7954,b065e1e0ca16952c -9yiHiWlkRShXTgiB7YadqhCjrTdqDEI6PzG0VO0V2YbXbD5ox9ibs76oRC4HEyMmV6QHOoydtcJjjPerkkEHCtFwUoB7VbAjBgxPhY3rN3jf5gpTYp9lkTA5mEUKAwUwsiA9WS5qHML7pifIomibuiHsVEandgDLZbrXDkGaYbRsrLUSKujklnz,58839518dfc7de31,cbe97c3c30f86e7b -TCEkPRkbQRHmIrpv0c366i91N62FsTpCCK4cmE4oBAxD1skWCP7ZvkL6i370VgQSA2a9MD8P0dOWihSVdcVX1u8mo8JDv3AemdyKqkEJzgrR3BSGUt3jsHXe5Qz9VGN9U81QvZTTIEragYLh7ZEQtS,c49b6ac9bbdb166a,1d50274f78045940 -ozUunEgH2QDLhF7sOpOrHA0OJDMz9MNZ0SZRLalBGNVsySYeEUjtQG7zlWYpLtTX9PhW0MKVK4TcAvPkJsBGx4Dv20wOUUoj7MkWal5EbsnvAcpdX9xKG7BNNQZrj9QS60RaudsWFmibKQGHx1JvQsykxUdWvzRUIaqp0wQqjbkPf15MVjtl9vgghCULSma9uFfBU1zwMHRtH3m9vBKD7Ni21UoARV2VMIpLppSC8dATaQP9uyVtajcQuUvjIfBupFLV6Uo9kv6rMogKmZe7PTJ,14151e6b8246e406,9275a2bd9c12064 -rd0Cmk9Kp8RLS9OwT3ZBlAxvEb0rm5Ud3VSFCj7BzG0qsOF1CmTTT9Gqcpqb358HdlbRRLYRujn2LKBgqCnaoDY27Uk1cfzeI6N6cvKs3XXganDNCagqQMAIF8iZdED8LnZZQPADXdtRiDTtlbP5213WwKlAA5j3zS5Ib7Xc5EsmliLNRTZRk1k3jWCMmJmmeSzXYnVVaQ4ZsKl2j1rTEWLllwg3GkLqZBrtFHdkoDLvlvLBumK46excpSl3lolWf4P1fAD6hVcgomE27f9lgrA0swTmolwQBpWdTDqNk7a2STd9e2ARfzkQr2bi9C9dgBJRJ4EDOHOIomej5vqYAkZFZJiJ0AQK7wxzRIjomEIBZCrRJICoQkWkyqrIQkyQhjjb3Yg9GgMiHPHUCy49OHweSlBUbOqhJmDf3vZqsyjmVXbvFcZQVpFilYuZeLdcXsF3uqDK7sSHGUJPvykYBdYEWld1UK7mBXLZiIUYvzoZFigNnJ6QGoHdgWK4L93w,8ed367a5d8a4e3ad,fb141e4f121015db -uzDv9RP6kEzgG0h4peGh4nPyeyI06D4XrJ5Rp0D1PA7xupB0zX7BuTOjE2tVqMjGdDJi1kQWp3BckPxXg1b4UqZD1lF8BF9LoX5MQIKbZa203vMPN9DgzcaqDdx9MCti80vupDctHcOjhRZV1IEL8zwpvoESjLyfXcoI7sHLvzWCLvqmZqO3OuOt2zbNL5FlTgkX2MjCW3a4EcBHwynN80I5inOjxkBXEnTVjIr9Q2VWVQKg2CDwPqEU3keeIq4rgVOGaPJCQRVxvTgqVxUvJx9sVPb3lVD1bAmsZRhR7tddm57BEmToHchcp8pgR84WbMb0LWTf04cBII5UoFrMgwZ3YEMAUQU0u5O3MtnZp1NNwWt9ryF6iolhlHI2PMno68JAQIEHCLjAXMXyNYtRAot8LwoMBahneR9yjleRxMZx09AlriZy8qHOBVSQ5AS5GSvUIePXSyG9OvVzPmwJeoeLCS0mU6gRuEfZI4Vv5UotcwX0Fuh983WmIwGEVur1Z83WprovzeBfD5EOlB3gyHwNeMSaqSzLsHgXr38xvqn1g3UEbi4lkTAulCqYYiWz38IUK5yXZRJyh7Ci4Gf2Y0UjRP8ZTAVmWNHdfT1cLi5MoT94hdJUPsFEvRD1Yrky2Vdqs7RJkKcChkXnm0xN8Jr6qtWMU3DZOtfSLDX0iNh9zqXCUyqrgg0rk5HCDC3hZGyx1bpjxTegBw4NPAq9VVeFAsSunW9ueJBGOjVnUUX7PcosWOFbBgagluFpQVL2pXUlYRoNWzOGBPWqeRu9ZbA6n7ENjrRKzVnOeeVTKPNSj4DUH6RP3dgQbYYZg7DeiYSA1UCXKSBnaN4Dq24BVDLAB0YsRLvh65u1SbaAefCalhoIV7qjZYz01B3dQs6Cj0QZxImZblpwtdFfl9YZ3TIa1aBDJuWmJ3M7YmhH8Uxbhigyt04IQyVzSxv1KkVx3amULRCNKeluz5mNi59ZjCAsvq,61febda50d7b827c,d3091b9a1c6777f3 -wybKAkKrdGu5dh7eP7vDliWETiBHfamrbaxWatMTAGqnJhS52bX4C6IAKxY5PqDDk0Fl99t2iRvefSbFZXW9Jvclrui2MLan4tv1KNTSxF6iQyz4gs5PGynKrE4qI61uEsHZh6xDjlux3ehJ0cGm1b7zyHSdrj1N0SHQ29esjyVITtgxi4m3iyJ7TcABp77Sh6CeaAsOkRFsXuUw3mVHpvSiqLQsjtX1y87An0U71W3Cpkb93sRacY2J1gEcVegoRtbhLVXi2wvB7O4lcjZyL8WZP5KXcsKEHwqtdXiD9M8hipD3MwX65e10zg7SKY9zqbyTxNtVrHNvm0tb5Qdv6kg3FMhI11OcyxoYhdNyQ4KQbY4euMcAwlfCk00mUfpfWAedtwCoeeSQ5nFKjoUvGWloWt56WlEDIQTSVAwineGT8i0ZzRh8W1SGVS53h1EQsPfBUhNkRW8JV4ICDbteZmNbHVaqRtR5xiBhwXG5HxULvqC4U3RKjZDpIbjwohOLygxZh2gjsNECTQTyWnvRMXnJfYn65pMMMYcrp2hpYp1HNX2DihyB2RYcPRfRpf2KbMMMlmskgURoeQ5o98o0vbdCU7fk74dcim5JTAoghSQAjlLkaz1wccoBMWoa6W4b6HiQ0M5CMPZCY8mTSfqSK8O3Vqu12tJkgvoS9gpeZCkzqX5oxKsOHFjHVKftXHU2PXXpVpq9Ep4W,4e8a67b45b1ff967,94b2a78604f5229b -KS8llsMYAJW5oDvkYny2TnjraMJj7VfwFfS2ZOfSsAYM7nOFW7gjqmweh6r0iCtsuZek9V6UKizR7Y3sOXoWsDPVcAkOCkrPhZLLta2RYBLJWwy0LRpZrbDlZKkjyTdYn78ibzSrqZf4GoWGOlrF3JoTRY2qQfi6zmWIoYeFZWvhauvyHjwug4XuaVlMzA8LwmXGqfpFBh2Zgt8lX7ExKR5xuap9mlphI88DgOO2sHVabZz8bNiRgXlu8PBbjG8NQfLW1nUmqm517hvorFJ7fL4Rxv3eRaCtCocatHgufYtvD6mODdw1q3zMxUrvbeZswaElBhIl,da0618b79508bec0,e5696dfe3438936a -MSS1UEn4QM0FYno95bqLHFk1jB6D6CLfRs2B3axv5YBgZg6pFIlw3lS0kMMtDzKvRn6BpFrggZqy9EHL7bXWyM2QYuvAmx9naL77lkkAbXyIqJOj7vi27Z2TYgs7z9d1lvK5CtAYYq2fT1vws3AR4YXaw0gJ5asReD,6c67d995f16b9bc4,ad150192ef422649 -1AXwruR6a8zsbgPEB1YrHmLfA1zILElGPOsDa70djb2NlnGpJbYNDRHtIi7iksJpFV3zLbtSyL3LnDTDJHJxv6YvPOmvgi8IQFrGQNHowl9amVbIzqV77301ZFnuBeDFPcmH4WvqxKWW0hTpUFnygpyOY3QZzPGAUzpxAWNDDI9KQGP79vxTnw770nJ3BJwp9oQLTy98mGJrn5kh38iLk2tIkimAwmw8h2wxTosYOBBn3mxdmg6c9dPZmshUN1y,e1332193d580d097,17a4ca4718ed436 -eiKErVGKmBlRWjAuPQRQBug8rTG1FCOdmDJP0w8TM6sbqrEM14FS8ifzXqETCJLHlasuyPpFPrsoIUfrioxIpvGeGLtcVw1D3gDWHeAHLb1VjpZvjGb96c85DUvfFw4QEYwnkrn79E56K59dIvoJ7mm6q07Gpq5j53vvIc0RHm1T1GVVfJ2XBxHd4udy6QMS8RKnWXAvTVBwq9bxrTPf8cVXXUGmMVRAXeQKZDekz3looORPyCfPNeyVMpncZLlsbMScJsT6G1KXVAYZBbC3muuekpjJyxaJHG0EZ63q3AJnHWFDTQE50T7BRsZyZYQ8Ig0vlM1QAm5xfrqnPWPA7YCy5bdZrmLHTIO33h5Y7XXCHpUps5zy1XBdkmwLTFUneHtCtN18GaILadWBbxiKpy4ifowu3ASFyd3sTws7au1kHDMKfvP3lEG5n1toIefal7iCgnkuUF4w6F,d550c9d71bd9ee2a,abdb08d0e0c1dcb2 -CUsDm8DtQuV6u7YKOnBPHrB5Iaw42hf5Qqobox5xfjpcOXdBSzIkkBX6JAUawKZelwPfdLe1sgapKwXG7JCBULV4fy2edCF7gkI03Lpte3clMZZmHK9gm9LeRRVDSsigJqgfpEEv7aRoWVVO6Q3Hd6iAn4EOjnBHu8eelfUJIkXuzTaXyYefqmh4k8mM0fhgQgaloVVI8Jubv5WApWwJy2xa82j9eFyLXRe561txLYKMNFbNWbvuoMtxlmcwImY3iZkNebgo4AkFMBuwdxwypHPX751gLOP46fiGq2SMrN1cvOV0kQNkOCCmOIa60v7BOWloJbuPVeTTE7hanMze08saDePtU6gCYE7FZyVKFFdv5hsu0oakareFltX1UO81YKxzo7GFwh7D4LEwhHoS1mYEd7pKaMoNJwelgK2y2xTz0hIyQBXXDfKOgVmosOrXEoKxGnf8nXAsN4eSRG2wXyctDaGe5oc8XpiSkOPg49vx1IoQhQiyzTVREjUiuNcugtTSgmZnOTleZej3zfPMneKoiCalMzd1t6BUMay8iPK4dh7S8jlV0mRfzuNreleqj,15d25a30dc346bc6,bbf36148277e4484 -H77xDm6UzXopyNxv533yxi53NMH6laHYG1WbZ5jFXuwz0vqOMd6Hct4SpLfVtOWQEcyD89z7LmOBf0jS61txAg7qDtlFlpDZg9ZKA00KTYZvPZBhvAJklLrBojEwDOzqGyBxwVK9CakeVznkIvfVmOIczUruaoICWGMZxIlBWIIvN0xejg7I0BV6k1dDzPWBBibUlTWoSnl4o,d7e3e1a6a83b402d,32b0657c57b4bd16 -Mgpjb1RArXCYwpaqsHQC7AphxsbmdEBURdMWNqlEolkgXTLfpwYLv54KFvJevuOcoN2RujkAFWD0ttolJ679k2k2YsJCjKhxUqO1dXYu4VY9hHF3DUNAfG6tgAeioVec2nShVjNc3BNEb9k9xfiHKHR9RsjWsxExjp0jQ2hh1ODOTiZd4SwHwj86BOou1TnE2vaMdsrkVRsEhmuRO9wZhGlJAmvji7MW7Q5m5xNpV9Av9ZZ2S6amuAFFaheGLhM7bE4wOIhdL3GZlgbh49b3wiGQN14lwK46miqXPoAAM3vAMpDyCrmvrFCAEdMwtXEd2mGWnnSThTi165jhe6oYhwBaDPLJnDJVjaVS8bm4xyH5Lj5TMVx4W68PWuCzbZ2SZaJQZqwy83cgDYTN,a5ce90b63ad1e19c,f0b758b45bdbcae7 -iQYX4e0w23d9Nu9lu4CcD5J12xC43El,cf289326b4b8112e,9b3c70221b26da25 -3hbDvJFO6pH3M0Qg2COaXQqkIvPHuYWM5Ly32cBjFX2rgRhsIeZtc6xiIcDd2MxMa2mgYKVArnEgOGS2ardBTCriosagK6nHjvUPAob3pxjTEHPpONP2Zi82E5F6b0kPwJhsP025eywEtSg35K1QWK7ze8e8w1zcrG5Qevp6iOyHwEkuA4WjFMKFpcQC0n0aMeaLz1rwZuEJnmCZPVuExUF6UFSergeyoJNAH8jE9mFpmeuRLQccvnLXzG5o4L24mdDyzPc0qhCDRjXvtQOezzgTr41dfFqk9cleqIP7qMiTIe4hAlrLIlLgOR2VJ4soq53sY99wQpiScPb6QWtknGRDMb0Dz9TESXudMjIxyYocgFUstThrNdd,67787353f35922e2,41566a1075236a48 -ncIIkySx4R7P8838JiAlHgdD8Svq5wLqWt0gkXeJD8EipmGoEcmmvR4B2Utvd4CpBFwaVsVa95CtygiKhyunk77qCMpgNzWyQlxufnhRbi9wjImrQ2MXs5fhD4NEfEgXdKPHx2zhZwygFYkXcyGtPUj,1704e26dce454674,90c72dd6d78abead -vZrclsuKwspZGRbuzqwDPfScRqQyjBtUHvDAYY2bAbuU0LZz,4d50f1f33352a2c4,8ca347684086c2db -QdfFv7ShffUZ6za9dwoSE3xu0bKYP6X4TNuulcO7JsEKmZXsi1lvtlRoMOciNhoxVr8PjP6Wlwl9rY1VcDLC26zUTXp8OZmSWThjNV9ulD8OqLlotCby0ijncDdvXm5EPFPBwykDkC9bqfuJA0rlSomI9gca8GOwZctgmXEo5OgkiSJwPO1OBuScXGc9orsRC2n589w50Kf3FOkh1aDr3E0K3lnui1WfBbrj6OeTQFx6k97aqH5zkiAVF5TG8V3mMdeAr7mn7WxnJjpWpLSXu3GRfYVQycZj1GjCjOpkcGOsNwEPuAfVkWb0Z98vwU5JUwl7ahz9Cw7z4MMvOGARk1HMXcISuLgXMfrBES83rC4Z0wzttbShLCq8uhsxnKR8RYHK9DGnl04U5CvEX6RsL4FbeKqut8a9MSAvr5ZZjxZGps8wRqoHBPgTsOfWY782OXtHR8DyqTiwC1OAwxsAPNmZ9MJcjXqvanvJZ82ljyVhsA7H1YvyjNAJ21GGefkVHwHtdHwBgj9r4FeqZRIvdYn9aI3xeQTFLs5lzIANhIj7lA7eINGtKDqR0YriBAGbixivYjdpt52b9WvavlPctdYlgc1VpBvMqhCEOvVcL74tgmyXBST5lFisO2lK7QGqvjZEa4Z4hwiXKpqF3oHfjBy4mSiTPMwCJ3j1u8daQuXPfYMKZKoLLLFWQ5QtGLAWkAouVPInGh7RktzNnqpljO,ca45909e2fddb6c8,e79f325468a12461 -Lt26BRNCLbVLUWDWteRg3dnttSIpFn0jREbaadQwtUnDEaHmAZCjDwMHmmWKeMxuRuhku3XrgUDcK0YKvsu8Gtgo74QPvRr0nijuFaoAt8030NWvdqHt0xvU0qpDfW4Wr0Iprbpw18XFauIl5NxjcUFfClnnbAvExBsfRAFNVcynbe3ox400y9opZMqEKZAoIN40d6IXIfR2GbxvIQMmX1OkZpaLRcbKbQHDCFMG3GQRVm8E6AK3TXiFwgJhfmyZo,bc4277a42d99f11d,2670e13248b3423c -WD4L4NHD14Y091LaC6axNNFOHEXxR5zjJecBPD5ZSZ243EhOUzQdZde6t1FLIQ0EAIiLWR5Porjq7ThIGdYK8g8Fj8MnXoMIPI7xJsejTQPqwixxluUf9fNgQ8nUJZchXPdsI4F7Uk4UTSEVIB86hqhirIIlFFnS8qrusJHurskDpimxyqi2Z30QysNrI1W6CCqTIYlOSmfRhjtmCEW28IGo30KHmeJ34h4FYOWKIERraPJBeh2w3nfHnyvUavfG6xoIk0YyID8fnULep6eU4i50QFcvOkF655IqcUnxUNEMRMnmGp7JH52dQ9MvyPLmanxmUsK4PSSeLhJAN7NippODfuFiKub4QYvJNCTzYsUfpWYfCYfiOQqCW5dFP93Y4VZAY6aY5JAx5v4d5pUzSRfKzn0FEPx53UMOuWQ,ff9d99418d336e0c,dadd1f544897fa9c -TDWw7SR6HcwUhBooGkjOgmAXjnzLAUH2cIbWzN0Zczux2fW7OWSQkA1FZVFPkE5HG7qy8XUrYq8SW8eHnXsA2DWGOk6jhZf0yvbAVOD3At973yNBDPaJdCpczHNhrJUCkQSJLCy136nr98lnDtPOSZ0udLs4tErsj0z1wkhYP6kokdD5cPbmHtXm6pLHIzkLsZOVWqb2d8NEdgpBaGEyAjFjUtV972EJhBmuFVsFyh5Mbc9c09iG4Qa5hnUFslJvsnUvSeu1paKYzLwL5Ia75LdzJTfCqs06kihjnptVHUxTjLqMgB9jXP1HVHEXzBjgxEivyy29HOW27Lj1xF0Fp7LfAU95hBthLaYywkKmsidVPNsRxJ4GLDVUVNwR2itUrbbtO5ZOpHtnTNIbTgrWt1HitGX6o6ZugSDcqfYBquOhol5XkqATVkSTsZyc0vZzCxhX5DcE5xU96Pg2hIJK5JYutUo8gtwAU4dJ63HXy9nJ8nniqyoNQmvn5b8SJBW8eoGra5ZxMlQV6yClBRL8xIwmcAPAvzvfT28Ok3PF,4ad3214ba4864f92,443f8aecc9c053cc -m4Qwe5AOspEZxhxwkhxHovl2yfCp74AcI4FcA7H4dKAvTv6Csohna1JH3JgmtdsZCyFBSbG9sVAAzxfKRukaw6,5d0ab27cd8eb5321,f024b3a1f3da582b -Wh5onGGIpjCYxDSvwx1SRbvG0Joc0nMVkUXVmIOug8tf3DTg7b00TVTvBYr6ARHveoFenkP7pkDZKyn,99658c6a2c037908,961adafc757a0b89 -Zrvc9SUn0iwNZ78mr1P9o5v0lc6LCtAFtCRFkXC3PEzPLbNw6hLu2V23jxgV6EMXmMxkvaDK3jiR3it20c2Ag8Sq4LQzPhXkt1GHEC7AYJAy35ulR95rlBwwDNLWrORFDgSWVXYtiPzGgRH03UeYqZMchKE6Wi0OUfFNyC9Mt763LIEdwAUfeo5OyJwTSbdIudUD79XeRRHu7sH90svdHBh9,737baf48d92c8531,530b22d3565761d5 -9XXZKe3Z3ozGW3w5AgG89iwtanKpKteEAqpGzj5loOO5TL6pPk4V1yzwKexQ1RFiGysx50XfI2dtYwillqbmH5HnBW9HrB57tvswY1NLjh0OMD5G0UEYiiLLWpFliudOAgGreSD8YeqnjFJnUKcetMIP6tchzaFtK2RxWb5ZD37e9OrHE70Wjxxr2OAtL5uBK5GdMjOW5B1jajwcgZehizsjRsth8fI7YU2h1ZkUWJ2P0gR2Sj4GTeYJMEnXric66WQWgdcO3Zjr0Kto9L6fCgSjqBueu6FISd84miqGxxMjLMjQoCOaohUSLKSNOUgUO5cuOBNjC1hW65XcZJrGkrHa3Q0uLeDLTTXZnuyQ49JMzdpvZvGFvfuKvFlOdGpNBag2pzrmQhW4RPwxhugwBLc7DC5qgvf4Reg0mmlDTvYTmyhsXNJ27STbX4Nr4DRPuzSoGkD38UxBj5ru1ifsXcEdcBJgxl3GXpBnKHDPGcKks4UAXSqcdlnaGKBsQzGNAYpnwTtEYATlmVOsz9nknhOVUVpTq5N7x8YIgyeSvHQXDnKoou6kdlh7oF48KJ5rIeJBOjrNVtNO7gMG2CF2SNjwOgjRFxGW18ZfQsABmgN40PxKqc9zziEuABSt2X6yqp3vpqcK7F0FECzGZr0wjmmZwhfaDPhAmsv85ujiFxrstZtJ24q0aLMgHzgXtoDKBsP0IrBOKete,5b2797c1b41adf44,58ff6e55444fc5c2 -cXB3sJZCcLNLdXeAEEOQeSd3diC8r0LZbg2s7RiZ3URNDFmGoneijxAuw2ZAYf5GRjuPnADHEd1MmFyEdw9nM25tAdXt8RdixX8UQ9u9W7ziLJCqvjatDU8hs9smbF3ueAyejWmvcxx4jJYHOxtz04sXMktTHuZtig7Azy8vW6B3dYRXwcdaPf13ytyNBBkg1Vny0a90vmJlyhg0dUYg4ohIrA86MqyNqXh9w1qaArwfqLwjYppMDOsUkPikn3HyqJZbAA2qRwFVzczCBzsRPuezwQViN6WmOh6hGOhy7YI3IQSrbNBAiTh3kjGTS3c1L5gXtVZ2aHMnSXeYHlImePs2I2xMnKmjtQcg40L5lg88wm8S1gF5sKQtzD4tRphhzdvyE5X2sBhdcX7dIBJh4oO3atQCE09ccm8YwTLksNAjNTTc9xsxz4HtMr5AQJ9m4yqLhfRTsRYzgqpa2g2SOSLhEcyeRrM1Q4o1BPUzXqskjAsiVCS4IhrYZki7ilHAN83uma1PNHtRUwaFzlMpeoAeTGH1Zzlci8IwFrorIHYmnuBsderHWoNPp5fNK6bwIOfCDXfHVmXUrBTADZixNwNYlRnkPgkAAXoGJrW72Tfi2DBOL4b9j5FLXgRZmjBr9OhwdKKdmYGCAsLRJSqXI7Jqq2vBQRzDQYUQ3xh9nC7MVX9o0IL43Z6w0SOw1iyfoAiOtojqSjd9GhHMGRZYYyb8ErUlh8PK7r9eYUjZf4Te6zNUXszNGAcPlD27UJgTub7SNCtl90yiKBS6vnbKTwu3C8UsSBT6sTCJyIAz3tdNHRKvgcT9OxKhjMZnYHzaMqU8r9UOBjBKbSVQU77jVa7L35XvVvdpeFB9VNMakxVUmfH1dxIx5cFdlC6pDE73mqZXhVF7noKj0VYdeXxl2C1gKFdkzdgDTJKWekBXpQs0Yy6TSgmYZFC2T1iUkMXCN7wHWh1pK3,16e0bcd18b9f58e0,708fe7acaa4964a6 -fTBbVtIGFYY0fPQbdyuo1ySxR2AbceLz91anWoLrqR2oDOvYQPHVUfiiOgbQYkO29kgpiBZkUM78Rlgtbx4RV4iAES5rRlcBCCeuJveyvKTy3yx95HfKf0GTQSAK6hJPNMMDFcULkHteaH8Ctglyga7QXYxVzV4PIUYQgayTRyPAIYSpG38Hg8vwXLlw1qRm0AsnlFI1nSYdtQ946Sh046K775G9GfpfSGfLPanckQka5QCVtjlOvvjkTy,54a980b16078c73f,bca7c0389dced6b -58NTkyLZRJmsUfIZ5NaPh70aEGvfomPyXuK4l6lBwBuasqvZBEgkPNo97wL9xZ5UL8Pxm5xXuTsQIHunWfFB5KQtwBe8uZnGNbXKbX2JFMCXcBBVvgrNd5NXwlx7eVCCtIEXmXtspklvWTTUFsUdnxVJP8UYbloXqS6EDgK4NJppEtrs3qFBuwH1fG4btwvMJeKKkOrkHP0DlmBGeqCjKKwghBKa52LQk3sSzeiEnuA5bZA7AiDi6mK4Me1nbEt67vfFTPQpYMptY37oNwGsgPCeRaA9BlkYRb02VGhb2BDgblwK13EPCHPpVL2CqhdPMJaziFN8t4vLun41GruwNUTfzTxyF61QTKdTq1RGEubM0ogy78b0nonXKehCGMW7u3tw3YQGyfgfVLVr0zaSuA4BJzF8zI6OaSgonuSQWwRpPnC,d2fc1cf529b4bdb5,28fea6bbb40b0997 -a4eCy1XuiZoNhpHOJFiEK5OdBdkaDhzFPX6c0AoznNiDJtWXHz5eO7l99z5XbGVjPZJhG6k1AWRVob3rwIVYFK2hxQu1oz4ujY0pAcxlLxx7BH3EpOlfo6vRIlXX3Ed5hWi63vcRhVn00gNhXOjv2dQHTh95Dl7pERWaBWTHTZz72shDkKoG2U5948xBLGgkZUFOoz0Qxq2p9V94yHn3IlIOLlQDLAfmwDKaswHJP3owtb8cU5kYG6WOaKcbuzI77jqvfbRfzk5tBs6F0iGC3Zsvp0r2SfCNsysDD28J02orUTbKNu61OOR12A7JUJQIloMCxwRJXdSQGbWOQqtnaJdPg6N8JcxMWjx4mcmrle,310659404a000a8e,dca593129f7b294 -jNtkrMXwaiIbrUkRvevVkLEdcwfFoWTHTF9Cf4p0SaE4ZTBpMHcNWLH56RxDUzQivFm,309f0c51e6eb0794,9a018ab1d83ceda7 -ux36VVutFX5zEB49zkkL7DdhLzVapEbiRqRIXXmFAABGbFHJoqkjBVFu3tTxCgZZKwI3lkXiCWuAhZ4zCKaB3KHO7ekRBMB8CufjO4ZuTaUKkZnCXmvYX5FzgN0Hkq9csYWMqWxE5ics8XUEI2cNX4VobQi6NTp8UMm76DOoblhEe2lxaJ8T5jZROBwY5tRhkAFA6mHdDEdskqBtJMNUDQTBwTlz6qLXiXbJEdB6TUtkX0yQkf1ejJnYJxcEOnCWhzrBW2sBQKi5qeOSTActS3oNfxWARBH5zWNBowmOzcBARN0y3ksfyKbAgG9pnPM3q7e6v24sBW3wE2qR5Qb4NCzAOGULodbfHUbIuL3GqjDFdT5f9RLffN2Q4lMi4xYkglHhlm78udNCO13LgpYRpR8siaOgWTFoxowvddmde2GKdXv6qmv7gVrfIb2XcFQhI8QDNHLXYcVKQVZim4taIDikNSEnFD1a1jcmfIpZtsJBb7WfphRURW6HHrSfek58A5hEnTdkPAD8NTFyPMCTk8un3UYXGlQlX6kDxvB9z5jRfaSGZGdFNB2opGwHtzk6nPf8G1GPfJhQUeTVSFyJzuvuJm1oCJ7wm7rxzW4D7g10qKxefqGZf0gE44ZzHRN17DRlldiTcGb0FTEaPPujq940zRxp1S5tcqRBvpiNWvlWsvK5kKP3ZRewBRIEFtsBJNTwnseeSfC3UrQ4CZnkFh5WG2jKEDkOJl8GjIYqDEl8bDuNlPVIyqRTtuEgowowiHHju41NaEzNmgF96Zix1xEbiJnQVwA0PWJzWWJ41zNtjTsETve5zsdlY35KYgYkk0bK5wpdHp3ZEIrXqbCkKUey9ZFbtweKUhDdS1Ld1uPC9UD4LNm82ctga81zgArKVK8Fsuwrss8WPSZ0nrP5heb2hcQmDc,423bed329a708b78,c4167699ca52b8e6 -3q0xvoVnsN6LfGeD1ggkC8EAXqLeYEhQiKjLMcCvgDrAXHHqVSpkxeBBUu0d52z4MHmrsIGsScdmHIaIGztzrztuxZiP4kxBwWiXAoPgbvUq6xwx2zO9n2WOaZ1hT9ZAUlyi4mdSihphEWM6ll8IZyc9YxHU8GGd11Ykmsd8GFJN0rjsJ0NvYq0d1gGca97uTd8k6CcKL1ILGmvTP3tK5zu2hYfpARkCZ74rNNni7wsvVNLJ93QHvkHmeiwdXYlKzSRrYOm5ldneu4EmuP9NR9fqZR6IjWZa4WF5aXKpLypP9eYuEj1aIRVMbIu8PEoTo9o30BQRUeyV52dT1DCPaA7YWAWyuSdOjMC0WxMp7DYm0k5AlOksrE5TvI41FwG6AK2ZNlBAW4R98aUug8pu7ixVoIhfRCjENn1EbLrR92TdDwmI0txfqxlOhVptot9NcuxaHjEtKSWx5nmh8JMQvTEa6afpVPteXPXVAqxlxL4mxgEYl0Z0uni8xeSKnMT9KxrZ7tvLw7P2asNUorfO6CbputpnoZeAfi4J3Qzeu8Lbl1GU2DY1qfwBClfsVchjNNw4U0,d284900ec37ec3a5,92f5e7fc20b18474 -usPc5jgCS1v8dHnXYHWk1KXyeQqxs8hqq2CEWolEse0IzPPtdlGj6X1ZggFYx92BYANz8ExRLNgyEmfdS2yxsr5itXrx0ILQDNJDnx1D1nxX8iPLzUbJC0RyfK3lxkkHfvGTiHdDQ6bXhZliy9RGU9GxcA5JE5v3gGC5bXc4PRrClg6YqvdN5Dkr5Fn28iy1Tgk1sgdVKPi4XF70t6ScqPizeM9zZDurd,a11d6cb018b4d989,c5a0361632d9fb16 -aK1cDVUolmglUYwr5UBXhiCPRCoAPWkm77jv0AqjvLEMLW8i6v5w5PQicWmvBMIY83CBkPWCDxhzAGb55BXGdnzhz7BfKdjlLm8eZROgsluPlL7dlBXZ6EKgiTaXVivVk1vrtqQbeRLhV5xW25fFgxsPaD5smQUG0l51xVUmRjGEaA564mkzJrGOeCVcog1IwaPaI5YTJXHWJk6D3S1MCe8eUwkZfDDLO2HPZallcHLPGd9R165wVpVDTzqkjfqeGuSSgBVoPgXsoc7tuzEYAMS0I4DOOnVI5ozq4t9CXvF6DzLKSAEIBOZkKcqS8DXOfvrGXGhxCQkOqRUC3ogaCJD3tHFZ1y22fahakLasxpne7ARjUyiG0oOaaD7fCfzrWYtOXnukXFp76dxOCKxXdQXB4R0IOKKfgd4G51Q2RMo2vWFisunZMqsXREPv0y4qMidxMYME7owyG7vMSkvyEDNO3qmCEZjifTRai595T34s1ZSHg6DLORUVgqs4LXgCO76NMyrDuvgxH1NlcjoCZVAg6cDudYAIqKB1fykem73Fpmv48IQDkRYWm9BiIBsuNdaouCkVaY3b0FrcacJzP6WpxQQux46v3vyxcpctsEIPdEaMcZxxAe7VUy25Ln7sxFqNvBcMoWq8NF6FP58ctd0AycDUmfUbv8Y2UFirI03FD3ZigdYDzAu9uUrr3BH4m86jB1p9juLIG1RARXsGgm4T4AtgwRZjWczA8AkR702ix2U57NpMS81LyW9DRtfdvx34ZlNocPh0NrW26ILd9MsvVBG,6c2c013c76102a0,e3a8b06c505f78a -K7XsDFn4ClH0PrXvwpYahm0rAYhoqkBUUqEMymKyYlIN1JGJbcWYDlR,bfd89930ea5e6a04,f4c0d6eeb0252438 -24PN6HH6stWyowPVSZhbsIG2QJj8NC5f8b5UXwHGcKPdHza5udg6KbRg1cV6iD40ItjzvZF9hJFyriy33y1ubWvugXCBd2Xea3c2v0And7xNhBc12pQTj07uAUsaiFjOiFSvRiUVMjvm5LIUtYQWaBrwR4Iu6RphyZ44OcVzrNneRMWBAdvN7FKoCLFb31H3AReRmEl2CZb9vJzBkOYwsEovhhN,79ee2513e2c1a929,6a0cbe2202a9a8f4 -f25KBVPaAtf7QE3uJFKBCkL6XSfb3zFP1D22dySZFqjwIgwEKh0Q4DVRsELwvFjL5k1Q8aVUmDVg6BxSLHb9soX3nBE34Gzg9aFWsJVJ7qACYv5n1OC3gts1wh2AUgeHMqCrFYy59jGSDGQ7lUSN9iwvix5BI2L9mi2ipBM6V4ux3VrtqgsZLzqNDl4USaq7W7mKGR6ej5qnswlVDbVH5DpO7mZmMYKtKQjNHkHHKlpbDirJq1KOLXkk8A1FTlyoYYWbhnKM4TTDgSlHxO7lJz33awz5QPMRNYCgP60HGj4CGJ0DHGs7g7eDHiJMakfd5UDjjB1g9Sgvnt5Z5YZ6FexZaqtv1O4bSE3cCPaK24MVX89wIpPVHpaSizkT7bUkDEJf693hV4QdgQqVKoLDVdBAc12DPs9V421b2z2iEcal9FHjRLPA5WkgIXy77HmUBFB4Ka5fVdGmJJrq6m3Z4lThAU6AftLeupZHePQowLuJaJm6EFxhsfo0iLVQXQHvGJUdIhqbIcurmxlgk9EvgtPDAhG1wTPuBtH3CRg5V7XnVKuTEkqdPbX7W9OBQWeoomq1ykg822ok6pIaTc5PiM37R1UenqQXJ8d79C6NiL8K1xPgWen6yQ7mNWcSce3uRAqTcfhCP6w7PLz6LvLSinzJK1J43SdYWKjgpi3VYHO5ol21dXdZ9BBfVUU3HsgdQyeHE5XQr3T41iP,cf72389c48b1116c,6e714641756a1f3 -RTFrEXxx6YPpy4LkQ8vq2A3V8TFWDo2R18OTTMKVz7Feq7nZVAzTKvXP84FYIGjLus05JIsXT6SxifFIUi3oHYx0lOCTWZbLRA9Y3KbtG3OHHKY1ivsyrXz6muaHsJcIJApb7uXz3AFkzoKHVZokqjvs83U5MoeaeURsmlspl8dS3nNXWSFWDuPe5liVt9Ee99ZzPAXsr7UhZ5E7U5otUlwBYggXN57N6VqyTtGROTq1EmAd0UN0xphJygqwoBbr9DWFMI9Q1PBKJe0z9vdvhah5OYkDE38UTtKudcZgZj5rsXMvWENnLNVKNKvrzRWp1tGHj0G7MSbosU2lupIDYHcVzwau02O3b7z5gXU6eqysINzkJkAyKz7BCWLGK0uthHw6mwmXWebSHA7Ks324GHiyXMDAh0QNLlC9D3zKrceybv12kMltY9NbZx5MIjS4lJ1QN1E9LG0XrfxN0hCgfEC3dk2V503gJOBLulgYxOEtAsUo0a5PeAxdzS19VrZZPtwBQrKmpykdI4ji7yuA,ef07f6e0f913075b,a413e20cd9ed3182 -swQxRUhjnxcCyfpvd570ETk8JSYvZ9xuoIVActjP41OsDUjKUC59Zz3HT1LZ0oYCi4XdNXg1zpWZ3eFIOJW8A1cgZreQ3MJm80eO9lfSLqQ5kkLxPbfFJkNeqSb95iZ6RV9M1kKsdbDPloyvfmeSB2J4MkxhdXzknjNAWw7T6jhBZfuK35hyOz2S9W4aqBfisMZtgbtXyfXFrtt0ajlk2Y6TqtDOdVmzGeUOs9aMAloYNBizai4HBOgBjXa5mlRlFXJQGCUbPbl4YKlQQtFU4it4jm1OWd7fZPeQIMNp6e9B62M8IeuubSGnxjqTHa9iSop7Vji0oxlRorG0fZ28G6YaJbdWXg7NY4UqMytylNauo852IhiOFUQC66wvhi5ZAAPtJ2TY4z5o2Hgqtv5GFOhFfzmucpgE0hQXRKA6OF6DGTDPrd6Aijs1HfECQhxZ0czJ3MW6Ky8xieGzWZIaCXjD9cNINy57Go4RHoWOUNDSKDeNQuY9qdUF1ZrMoobWo271robiEBC2z8oF,182319d84cbca2d3,5e57cc7c39eb79f8 -vRIqI7nyiTmwFYw03cGDq8zacTvjyi6zgeLNn83w8BrwFwhH35bNCm9e0YbKroPZmbvexuv3vCaTcsBEooGvRGeUuycx2QBahfDsw2qxd6aUwv1nANTZPA1BQR47YIOP1psIq6ItLhrR2dzNGzfMHopyTcI06oZ3ULZCqN7VYeTVqH3HM3pnIk8H6ZM2UmLjYhZmp5Rnj7nXhQED11jyspEhMbyh4Rq1MjoKhHDOVQgytRHLIFL7zvF3mlJlpDriUDZkHbtzIRQDJaKSutZnOCsOCYzoWtQS6yYSkbZ1hFnEzQy73R5JLARGjHKchobyQUFjeGnWA9oF6cVitivgMrL4qyYMdTzvNTRfmUrzPk3H1EntCmRF5qtUZGnNmCbblMNba0vLJYBc4FcVKrRx3WaTCFkrA1hFHIJBjVP0dsCfh8GegKgOlcncMHz6j3KNlU2xd9zBPXKgZuSgue1T2BpeYK3t7JFnX36zcpxxGNEJKLjqjXWTS9u00kwgSmRTFLVtBEk14PWt5h01yfeWIGEUW,7e7dcabce2cd4c7c,89dfceba02cbe500 -uArL3Hp20D4cxWwaIqkrZYpmTmw6wBT3XHlq6VDsr6yNHgct8aFeVZrGVNuajQSCIHlZ1Q8mTEDlhXbpzb2KXqCCVeGD,4b028c733f7012d2,3b9c2f41f73484b5 -PcMOgu7ZprofZb1pkzeqE18stXTqsoNY893PJQamxsTfRmE0AKwbt5g12JORaOJ10M9yhBkDaC5DsaReDeVEZzyIa15GZVXNckfx6ircxnDGF1QerZhCuipzmCkIoFQFCEog949LDthwZUR5R4F0yUG69CsfBJQPuKHeALb93lAGwn5HO1dmZlK0CP2A9lHhmv3xdTrrZLTEfqF4kDZnU97DFs2Ay7yaatiAhlMSJ4hU2H9hYbXPxhE7QFeH83nqKqsahZY2KaupMTFj2xidqAPMP9KGDh5mHDdRlpNwQkLlDcmRFcLadpxUfb8Dj58Lvdtm1dcNENWSogHec3oUGcSRIN4CBUtJpdMUIj6ZVqffTICksQ3BNt5j,6ae0ef45f87f9d79,b3194eba79cbd6cb -DdVPtSZxrROIp6kAAW7SsB1LQITM0abyBeiFsqrQAmHc7NnM5HZUR1lkf8IpAa2DZiN2cSpFpc81o3C4iqKAkbPbQpw0W25rkbI7UB2fPIJr1TjYsfH8aAcEFlHSCfyNknfmywoGQuChttgoaMvhNduWDu5SsS1Im1IFEAyPYq7AA7RDCzGtdgLHTnafXAa5BTduASdCvX6uJSVZRvE4yZVpEZdju2ojZe0mygfaM80VIcyfxs123A1iQfRpSqQf8in8aVDAkOK4m98F2exbTHZdDQf7jLscDSLAQF3yCpJ4llodrBFjWRwnqbGyVB9P0bxdFsbdIClUKrwuyHJTbdFVRre42OA1S3GCHGy6I42ydFXJohrFNg35I7zMq82XKs17lTrRRwozZ0JpYE6eWLUDfgasYZQssZNxdM0r6jFXogJ2Jbu0c8LtnzoU93ybkYBu47TlYFkTvq6KlQillTcqGLdfONuzbfumXaO3I9SIv0vlAU7PCqQPwRQO3NwMTpczlD1ldIXrRlwHvw9iLUGY3hNyA1sAuPHkBAPEavezFAN6ccDHeWVErMlPx86cYa3phUmzxAeIwhOCWEnF99DZDjUcjFN84w8q49tA0dcHVhoIaFZa3L1XmJC9ZSoLXiUQZHNyXhX8M718VDOjPABWVioRbgE62ePgRFAx9bg0m6tOkz33TvvebyUyNpGX1PPDttGiP17fnRo1AkhSj7CW4eTo4KHwziWx6puKpVo5AoL5jYINCV1KepbzqieYKS,d22f9df51c4070db,ac68cd9960fabbf5 -yuvDClBIDjXN9jJ2u5KwKsc,fa3bbefcaa946bd3,a28a1edf92ba56fa -wtD9wFD7UahUzLyEHF8X6HQA3kTCRLGbmfsx2WOdur8bGtjXZDjY4oCOURlBKQbQZJJKEAD1ssoL6CiItSieRGA1xDjQACGZtiWEvkuhRgWx5z,bd6fa643b77afdbd,4b9dde0c7626fce4 -ZIfNNVWwRBgalc49wc5zdeBPFq6d5SAVhvv92hde12cd4KqhuFIHeEJy6zYt7vVcTr9mUDqXsXpjW8u9vzVF2irb3s76Rc7fAhiGnUo4GC5DYPpEZvW4AM,6028ed2db5ced6b4,49799bdc37c519af -771xKkTHIGM4ykkTJQgguOhPmXBt6zcEx8DAWGqyjD7IoqFRFH3GWB22sSyOoPl1ogX8Ug02WZ2e7V6ggk3u4BtJZx8dNS0JNDaxsXypXr47igbqVWtpMhwa5XI3C2VxaQzzwtltfMn83vaWnOHM8GvhI2hTYUKhE75x6DOjrjcX7bF54yeh03JKWjn14tvfsl3sljml0quDFSjalVLSqGZyKoxxzU2wWv8QXD9ByepnI9Qctm4ZgOhVbucopIQgfUdGkmI4eQIGXIoUrOw62dkrknIDfpEsSxVm43b0xrysViRHVelyA0R0xDDdU243hSpFDTXbIUDPkihxLvlct8L9ZgOpYdpAQZlTd8P7oli5NlsK2AB9WGxn3KyWQok74D7k11WQoubou6JuxQ,539bc742e573c897,a96037346e04d55d -FmTFrzqxR7zR0WmKGJPUIkkM7eg1Joc7PTnWfSBg7Si4zLcmUKAPOUW3vkkJoo7PtywMk511W7hdgBMbeImf2SweykZnz21CkTDTsJlwpXPvWeEZzK6OQfnAarPYaOAtydW36084iuQ,7aa500857557627f,66327ff2f2fac621 -2xXlnJKF0Brgzp2lrogahh99UPjw0NuAwPKWJz9hsQCYi3IFWpOxV1LnyZHRz2Vhc2kEDFCrm2gPiZRVHyQRLlxFMcZL4opG5OOypFwuModoMPKfecsEUUxvtkdXlULpGf5SBsxheQinNeKXdikhEv7odiwgySFAqJmHIST8wVeUuoYCqYUAmOTCdjdvKmLUYgRuaIYrLK67HYfUYnDbKVan1DsTFgjYIPUgQdktbdPmtBLoo2xxL0n7xgTnOmA27oKdHZtWNBhjX62nbmLPwjOxbvoCySS6fK0tSdAnxu6Qwp6kZdd26DUYedyBnOHqtmi1XXQFyOftc7LYn5t1LiKqNgV1WAVLyWksbbwYqHbTV044O05R9pUoWNmj85aSt7RD2ng25X10YPXS7UJNZ3l6CWddVghKDf6to4lEhp9Ty7GJYej6VrvLggwBuqxkoZYUbazzbC,1c4e40a77fc49c5b,bd10e9c73810b072 -BXG1bEoPr86n8XL6ftls4RJtJfAzzl6MDq3G6z9X1KijZOCG12G0iEkQGeSotScby6AuMfpka7BglRyJhzalG3aeOHZ7EYL4OMO5TCMg3nKjPafn0wBgBu9t7uhbxU8D2h0LhSU56hEjorASVe5jkl869Y9TSQAIwvJvKXTGl4FBvJl9zbPb8oQlpQ5DiwdR4oHXP8ASu9Nu1UXASk04ghWaUT0vIkkQX4umucp7VGIiKpxzpkbQbohFqTZCQ1jUwA8cVPKbGfpNmOvfyuWm1JvP9UM908Qo8PaPb9D3PUp67gGDQj08Y8pQgEubMd8vArWY7A0lAqcoURkn2wS020FR5pwhnes3BoU5IKOsvuRpc0uLXEMJOtnWDo83tvdUFsVXrnLXxgkJSaFXGRf9zzErkbsfEK3W3mq2Rp2cgVp1VqPOe8WRiXVxV0jwubwoX1WEKmSUSDidESjBNAGvUgmgRfgTfhAJJR1DIVyaLsdo2glMcJZDGI,4972192db62a6ae0,7d5b9964e8874293 -2YwaOLImwOC3pSVP4BthCU5woG9fhdtjhtaJxxuQH011FhKPW3TmK5UozLFRaWSXnywSorCVa1HZqibxvsvjUDi6nm79YfPeMXnYanmxP7CNnYoOq1xL6weBFEFNDC5gfMJ5tR9cl3m5ydJNQFoXIyfze3H9K2Y6BtxTU4gTinu8xKl6tDSIHCUUFyZ0R0MYMS0wvllohlhLHeoBqHzOcRGEd3kriVtBl7WJHrHJQ5B9oBnuSMbg9p3kxmN0Jwc2Ck39UfAhJ8nF3x8F3aQgexFxJWOBitr7QDUXTY4hrG61FPVDIGcnkfJCMe44T5A8XwLCfdYZkChkijNuOYtFRM3O8NxgNhsZd6AmiosAE3Tqij4hiysP05MbiuQGQwnKYvjhAtlp,88b592e1e3a722c5,102b36df17c27f51 -sxviRDpSnEo6WQX7ilU86Za6d4fRWzwNAGxDbEOl1MG3T2oMsxGnycTbnIXckGITdmlqUXXnUTlAs9PxQkVde1AwvdMSH5j3WL8fsF4uB0TBIqpwI3e1xbC0ZSWTjcx83tHoXNNSrNLRWrCOPGx1kf2jh253C3Tgf0sujaUDizZC7leoG3xsiiAgtpEIRrM8GPVjSUbSiQccLFRZUnLcPtJC49vqlXZ1hoKTMcuGFTFjQxnQa4mYURee6SzMwwK0EBH0IiFeUUavpstL4eBwGjoT01Y5XdfFdBTQUGYHrkNYIFoqAYxLutNfVikSymEKBIpbRbZBD3LejyiQIuCIsxD9T4P8JDLT2Y0R4aE2Co7yae7H8GAFkhqCNHvnG8cWuwoT88eHn9KLZkxDekCdad81nczSKbePUeQeMGvFpOZjxAuvr9nu8EAdgaBE6CDepG5NgqHtatZ3AsmmT97uGGL8PaCMTTUTl4QSij1olR9OW3mXzQDf3iRKq55fBdINFvnHpKsUv1asR9FJwBR5fGpB9kMXd753iiFKq6gnykCDwGeddVbKONS0eHo6YyzROSVVOVcHGQ96Eg6g1EeEhU3pcFmhFVec0ptuDKn4Pkk4dvKfZNBr9XjeINJaDLuTextVgRfdUTQdQKTbRr4Ak725zAt3ST9BxmybQmyanKxrkV5JrhTxCfvQCGluLXsxPORREEkYk6IbvS6itIfdF779DoQg0537fGkOseGoy8dumEq16HxcNV3pQtox3fz7EZfrDa4Qlau,e5e1a9d53ef63f88,f63b60db961d1f26 -dej297InUkj2tt8UTUkJtktx18cubFf9wGWpUcRMQWCawZFXoFgX1P4rLPqYbXrYrgr9uddGIf18b5jt3WgwVDDOn8VSXTPOq3XFwa5u5mPi6P5xOW5jKBAxAyLSswQ8u6RU1EKh9q3XOVZTrFtpyqotYxZdcaIN41AdJu3dxY1YgFNIN98CzUacEh2tYqYzHR1leLbNy5noFz2AFBiEme8AXDaEIs4ZnuYVBbOluJOOPm9hZAcekzRpy6ugE2Hgmc9uk5lnR4eMurgaqru7cufmoNYZaInIiQRTXuw9iq34NEBigjl2O5qJwxeKfXnnY3XwJkAKA6FCoQ95nXZnXuLpjD8cgPL9sFelPhpTdELS7OEsnZj03VTmrzrTd0DOvMCGD07uXalpSXHH8f9nlXmhwf9AYiW6bEZdoTESDLBL8f5OPLdcsT,697eaa2054f9ac27,19866bd5edfb33e8 -1S74Glx4M21pUtNmP06ftln7stLunLurrkkNcHWy4DTtMTOpGuvZuheRzoP4nuI7TtIiX7cpwx9iEkvjW7paLsQS7CXn704znvXQxq9vZD5TBPiyV1RbtyPGeEvGJlPobApmJpqhRDdKUiIo8hHFeMSYSLAzkbNGmjnqHYpP978nFpQ4ZnsvVNzeLBoeFMFcejzyrolw0KFItAUoMnaWGui4VN9kZVmNPojb1yURheBQ1R04wB78go8kqVqw3IpaQ5zwrNClGT6G9Z5DVrGTQBbCei0Hf2JD8zNDqib5a9FcXj,b17b218faa041813,4c5f550faed5823f -0avWwLwA7XJnGtMACN0kFMvzZU4E7fjHTvgSFsFGOziby7UTmu6xy2hDtYxJnBiRcdaO40J3C7iA17X6rH0v2tpTxUBkjPGC3moymLsfyv0LLBwQBJDJIHDYavOBJzg4eNKLTScCv7sl0NV9WG1XulOA9ddYESjcHiRJmlKJ1D8lZegmp4PrTw0MQmyQokCdPL6p1zk147S2BeejDexclGiV1ksdeygxuKF4QzRVjNrpyS9ZSTOYsRL8eUVeX2CfGpE5OMGk5v0Jz3ey5P3IpMOV7D0iJbB5H7M0QAEr71I76yQPyOC382,908f9a3bd2cef85e,2609c7411b6e2b43 -JWI9xjxwC7s0AzHbWoHit1JK2QTbEgxqT11ZhGSkzPsIBHnnp05FdOPePuJbMWJ1Kkq4PYWBRmuAra0fSwZZ57GjWxsqJYm1g5ncYPrX94UWp8wJu60ckBOlWN45oTUmNjeQYGZXOpEMhT6tWid0AuiU5sRjbZ6zn17gO3r3FwANeO0mZpSJfBAtAzTtO4KBAAQQbK9TqJO32yRLpRyO2g9PZfp4O16KmaPqCX2e9ilWfIdy2HK9Ck1LzLKh0gh5KVfYlfPi8a87h0xD9KmUlaBM5EXEBjde8RcjvAA54hyN4kU3aLUeAWGI89EQeqDt6kes5KtsPAk6zzSgdXwmbhrrscNq3zODnNfswm2UPsKkVLfXygB7BJfSAHycAx5iKWQyKshh8GnP6xizBtuoDjQjIagJ19ws3ZY2qM15aCKYIeCbzHjiy7J88ywNKLQGjiYtDQ0pBW6VsKQd2px43yAeGwiB9IswuHrkjEBQYYl65ZAew1B5xBIbAJNDiadBu8VwUFSEk47vS61X3FS6eTgitWZl9uKBMLkJj8kuxuZLD67j,25e0b7485b5f0253,792d33fd1ae4f33f -vnYcsboShbJr5qEAaUcM6nP5fV2cx5mQhBL15bdroPxc0H5nbbPdBga5mdOkSvveQYdOfVqqGVIZQBcTdZegkRxaVMGh5LTeKASE1tPkPf67LtSA3vonp18FIxTecLOs4wL9vDXHdFtHHXAxdoyj3Ug3VvZqsOpDcDJbk90GSiAxJcDtEkPZhN49Fq9ZFfBYLRfmeqqvSnjMhUYiVfGVF830lQBX4J4y9qHp7iBia12ZfhWDyd9DwkaLn032jNQTEfu5th0SvYNE9QG3d6lSt6V4Q0VJqGDVb6jrDwFfmFKsUPTNTMgXse5fIqmdmnMiEmhcqNGkiukaoJDRRj9C8YCzpgvPAODENDMjW0ZLXCfVm2KfDmn7RKCHxE3g8He2kTn3czQrgziKf2gIGmTeKlGiHcw4ynE,b89379e64390aef6,b3a3bbb174a56ed -ucUdfKggYDW8WDWE3eiN0NP0NvkdQI5hOBzKEZ0ueVANNZ6v2hsgUOI0BqoIgRIOMyGtBNw4G99p7j25AUUB8on2DjgqjVEpNDvpHvtJ0dazIkfUikdZJCvDZ4JRSswqaffXWLxqwDreHimfvOgW5J7CVPMm4aQJJ2PsNJLNah7M3bvD4GF4QMxUPDq5XN7gBk7mJZLgMXHf5uMdROVOAGKNn2Cv3CIdzA4hz7qiQYvQDXBhpxb906IYodEZN1jkcH5utYGH7Hq2smr7fL2ox7Rv1ri93k53pQUGrbgQPSvmPZOYW4xjJfTEJafx9A9S0fASri2FwK2fWH5Gt1UWLLqe24Fd0elVvUSXURyx8ajZl06cPst2J8AnGbfVTxFQwPpyybUpvFGMbkyVPBVZve4paevxsmhtfz7f9SpDpyz0LhoFpbPRL9B07IaGmbcNkyRSGiaQwDXoYiZ8CSBQJOd86ZNMLLRRBgAHibEFUtAb0Og40uwpRehQh0nWawxibLxgp7QzT3J9xWXJ2iuxrw3vAZOogFmxavFXiMBsPFJWGDutjpDPKmqWzJFxFuuHMb6bVjPjPIleDjlIjft8aquOcI6hsjKyZyUP8bJSYKa9jN22qMxcVQgljPLhVd5Ia7oSg91XClgeuAD4sP6vYhj7V8PXKD6Y4fmEILBKj5AhDMSTtI4z3960idFuSYaDdYhZPATHaNA5PlaEZX9MJwSO8DrVmAIFOx5EIZckFC3YRr3yO1qTBxugzpnLBMUq,4d880942da226e1,ba899d133bc24182 -NcGtBPAUHMlgQyBg7UZJnsI0ioc3V0qrMkl5zrABCg3T10kPJTpZ4JUnlFEKRWdLi67sEvBn0oooULC20QBe0e1jfN0omAmXVMEEOla5EPoi5Z6pQzlvbWQyQUiwoH7PtBzy6piCGDxAsIAkRt7SvHHGNjkslfOm6GzqFyWHGzQon9UbPH01N0yTBHdOeBrf3VtPuzq8nKW3vQvLB1z2PxJPabzZG2fmawAYLA5Y8l2EF3mUWkd1WB0L0I93kX4bNXBih7bSkXg0cJMJleFh1DUbzkNV4FjtiJyv7GQYVfsRSuBGWs0jDjCTGb4dmW91vgRz4GpV4fnjVuIcmhQ2tSbtt2iAfxQ8N4T6nVwjjVsxc8JZZtjKTW3RMV9LJNgWvds4mm2Evun9kjtrLTWBexNipbRvC35wdxzuq3uk18s5CcNRjb6PMJ9BRLpUW8dG54KMyj9E353qdSc3RysAekq3YZoYtKTfbcO8KSvIrsIpSGBb9Q0ZETkaad8wgujpZ2EcrGiJu9Wojz93ffG7Yh3YayAV8v1VBMghF0C6Uvvjbydf3lNl0B1dmOD66j5laBDfmtPf0xhqaQmkwLAiwmdBzBnaguNe9GkAfcnwEHwABBbTX5Tq0TneYqzEzzQ49igMOyI5UOBKkWuKRvCkvAzvqhsiDbFKiizzxN7zVQWLkIdxsalQGDBfedxmzmqmNQj01TrfaJ7,d5b675f395c7cae5,6ba36469763a0316 -kDM5DtW0nuziaz02ftYUFyqfJv7NEwC0t5clbINGS4Pq,dfe9eadaffcff728,72565e2c3189fcf2 -bX7Ks8T8jGDqVSWNmYp7vw510uL4XdELFSU7xCWtjbvg1YS47Bdn1mtZv214BDKYW5Ks3dQmqhMqDpekwYhZIJHoFVInrd2526J4GKh2qJ3uj7OYWkfLJIzVltvbc4jnmlfMvYjKaAVWH1RDilseSuibMwnRkmwATRdIwvB65RuhnwfTizZpe13phAz6XIR41SPe3cPIdGhz8lrzUrrzLGTkNHzypkjBgTcRZdN1fjYjnuYAZninYAiFuYEkPoOjImXiD2BFNAL6a2QqL5ciy1Jh4gU0OLIMiAYhi4E5xSYlJJ4rCsyVDL7lY2jFZZdVv6rIyDOnMnxkILvcjcpZS1OmT3UpWdtdNoaQiD1TOX7ZV23OzpIYWgbqRLOwgB,3469ec015f846b76,bebd764d352e80e3 -HcShMkW2Ev4UfEhAXpWCotT9RaKpoUUT6qQrz4IMeSylzTrkSca1yj3bmdnKzn4ltLhH4BhUfxLGwdBq1s6MixjOhJyRXK3GfFoUejWzHidVhQnTAWw9HDd4DB6nvtnCyCHGOGd1FA4v4NXFC8YpDgFLPr25mTyu13kr0BZV5uek0mLoNS3x6UaVlkYgXwVXlCPRqP8xfPveTxCuhlTJSg9m4otL4VVmLSuYkB270QGJs1f83LcgIkxT5agED22PQiwq8WI44gkwaz2CvCnnugUh2BxXwwQRao4VFS49ZL9IxzDv85fBe5lKtDjVEnWcTYYw0nhuXtEcvdlLBzfTcwG5GSZFXU1XrYu3YTaZjdqVVj8pS0tlivWxVT3IDZyo5OweC0nnrOdnQxRZHi5gxWbwSZbcWRQZOR04TNntv4opHIUhkMnWe4nldpipk6PJ18lgEgPYsQxJpV2QSeDQeQKcusMRZMHgS9n4ypWk2HhRS7O8BtPrTQGELBVrgNAxWDVqATioPI0m5RwSJI0UEvKFpi99tZbrIjTGnuI73pZVv3eArncfzkKpwHmuIxeIqZtkTmg4Mc0yRzcvLTPph6hxjNfcQQV8RLVo7P7rL5201BuBGn8qn1ZSHpbzWOqsIYlSJBzCCTFNnXOd9BLiATx9gYc5bgKkeYonnphdeFci6vAXe,b189a9be87fa786a,2f78bfe7c6595689 -Fe5ITVRDCpPTBtWmVzDPdve6OEkolYTO07aJqqJfij0zeYZJKGEI0L0ANyf5NEfxQazMDvxvoUUIF5UgfcFj00xpJ5Tqs5asx88eyWPYCz6Ad7oFsuKhzT5xmlxto9jS79klOy5USgbUCQzUSSJ2PHiMak8SdrECFeW9oK75ncYcYkyQAsPtpUW2v0gVtJ02VVV1U9UdATTVxEd5klLkT49oRKCDYVI7jhPQtsYgq50eqJzlbF3SWmuI2TlnY6beQr2OruMoBu3HV4DYjKjmDLN1mysL7iHrciJvkYdxp7cqvwWFxGWIkl1IVGc6wfEQZpdKZAT1BqiReUBN0nquIyTKUT0K2qa3TumX56VBaMovl9OSsTf3WSoxpMLKMgNX7Dx,69c77b398dafc59f,5fc46407affe8ce2 -PKgxWDzIEJ3ZUkGvm5KbNw56ywPtlfGazI6oPH8DpTMxC2T9O5mff0DWA1kgRwFUGcXCB0Lk3VAckpJXGA6iNys4wuwdxxS89WZt2aCyUbwz0Nojc1cEkRFeeVHiKHqKLtfqe7vYoxOrt43Nq0rlZEtrIg5tqZkoBQudfMCuh2OIGvjFsTi41Qgzs6d7IgBaZQpqcvFoSo8AIi6qAwr3Z9o4mao4WgzJHsmZal46YRQijGEAdvYvhSt3ygxOHKYSXW11mj8KrqVmeepaIFHigjHby5bVOPTt9GaXRwi6n4V7bXoaCOUUjTw6GA4d8gAWaedNHLSyjnlRH70Li76Id0uj3aHrGZ5tO0uOOaNApHJhR1bkjgYjLMB8Oa61SP6pjdisOh2C5dYpgt08Q58Kw3k1tZJKh,d5448f2035b00647,8e030d557cb26f3b -uj1cuQUYmjMfbVlnGlgy2blTHkwfrQxfaMehChY2K7K4sUqKKf8z8XF39O9BZYwkcbhlMf1KTmNc6y2QAjPSNNl1stLUh35Eap8Eoz42Ck3kWW7SMLgLAc8PuTm6hxgQuVTlvdUzPSBO4jFWUnKd1BYfkKqrTJRycUfqUqRKzOZV7TmqACCyu4grk59CRumfVCoR0hSPVJ6TAFZakTB2QM3r4ocbzEUmKn6yEYHFd4O88Fq55iodZvnp2KzxZQyrWTrNC7zTPr6KlJf4Ug4qSJYHOS6HwkYJN5ENQNbk7E6iRhzWfs4wxKCpEQf2SCxKJt0nKQRy4vUnznbByB2lDpzk22o5bZ2No3vrvOe93DUov0KwQhPRxnlce075o4RMeRPNQwDewMNHrgqAt8oK07kjR4iDORt1b6KPnMT1w6YjsnjRqYgfVA1ZuyPwrhk60xD1pgQFiJcMXVfTfImmDaAQahvObfip8JMqvFhhExFiFxXqvDU0DCdrvG5bOhm39LJzNbEOLQnKdZnuGUtf3FIPgJuDXXkPeaTfW8nvCJw9,9f90a2a4dac86629,b90170c9ca4d8a8e -RMan424nhhbxC93AXhLqFm277TLfgAsyC9bD4YPNDIsFH9A9MeGVOUwZztH4idumqXKIGZoIKk5FWdpJ1p2id8Gj8fxEsE4V5uTASPUz9nF7HS1EyCDD6678FuYTmM1lMMDEorq8XHGfbQXKzqCerSvjwRsTEggEEGlfmtJeDlIeVqKHSdyebkhKa1rLCXKhgVg5tNYpvmh0Y4ZFgpZJLobwXGmIT5No3JF0BhaqgQkBdMHQEJH090gbgA79ATVyQgirTTZYVFxww7ummH98TKsEBBvRgnKiblngt3QAQsExzgqLGYJuEnsTvM9jtgqN1Z5pYkrwMBGcXfLkym6JOxyKMGwObAVdFkCePMFe9c1PuKWtiBdmiMtvBab6M0db1nbIcAU0ne9LSWM6QoPc7H2khoaLaISzSkQnADn7PACgzOnA678tFaJlKnAeUQ61Ft0R8iFTbvPxbR9wuugn4RWCTPXHBSyHQLVIDgMKuKbboZBYyjNcyI5nOw4xI39AO3YdV6RdNuBMc9y1Y8sFjDoAdem60hIbvPduL46stoT7zNcY30L39GyfRMXbmF6lIeQCbBWptStDMsFon8TvdnHBbkJsSHOKcDObNNcn1qcksGUa2hXXVsLfOTR9XcJIs1tDLdUNBx0NIf2QdG9OFm9HthqfY8P5QDS3I9FpDD4MI4WcFnMisPI0xAYc4UTKsM3P7hcJK6BZF8yoMrU7qAFMbOWeR5nvcfZQ8qdIdwTFx5Tm5MidW24Yyahgjiw2Ixh98emfLM6Q0jbGieMdghXM6qyKiGVj3wCJseIbXacmgorT2m8arI2vJkf12dhTi8Wq38l9NnmE07Fzzf1JJ0a5Kd0zTgRCnEnRj4vi7j03LKmy9ZpDOSkgLs9FKeId4,cfd952b56957afe6,d04c3bd5ffab5701 -xd8ojKSd0FlWWroj273yCR1jRUuaA8JR6eOYwo3VaPsAHAh2T35LnpzmMy6n5Ik05R2zc3bbDA5Od8WJR4xE5k4uATiAzqQSgDVncjlEfxzCNpD6EPdUa7i9shYGt1oB50LX7UFhbfG9WEm98o55DVI96asDvFvGNVXUSPLI3oXcvb4Y5nvBlAB6haYUGvyacufOYMSmx3KBnGDR6i6un7BzpSBZRFCo0atlOezaiH6uzDrVW9qsxcX4zd0wxZDF3FLLUs8PaQoeFYgx0FDup5f3vJea6gNGE0h7OrKOqsxkaHxZSuydj7P4xBFSoKrLP4ly8s5l1gaxuoV7JAeS41W49Ev6gmExtGcEI2BXRcamNUXRvvEAHG8TTrhgWejt6xkYhCcvI1d8IxMLFKVcqWsJveQa3tRcIm,9944c313574f9129,fa36d435a2b5a8d3 -qvUuqvEZaC1QOmNooX1swmRztFIGlJJdUXhleNDatuRuYZpymetVnEH4eLJ939NytyrBHmQScFgA7kxDZEiJITpOue8pKOCiCLt30HoDC4pFtM6bX9RXayzrBAsr1s2Mwo92ZN2uI37qi1fzL07zMRdzlzQLuwRMGEvovXoTpplXTeO8XREDFtjsW7KQFT7TibNsTbgNSYpdphU8NDZ96S06ZltO23vkEv61sNnLFX15YPrYA4xSddRrKbd2GyTBHn4gNxohCzW0aHjeBulFplA6r6VrRIrD4uZ3MkShNnw6zwBWT,e719110a9b58ec4e,9e236fe9b813bf6d -QVGSXhjLEplnhw7vhkjkH2ZIGw0zdBZ3p84C8NTfzljMQEUdbVCXOhblfcuXC1eOLK4042OMiN78RKTk9WsCnXEqbPsBAsX31Jk2bif4FILuosUMCwtv7R8UjpYtEtvC7BeaSPapzEvOZDqzvPOGzB88YTVPuR8itshgHFMZSFOpgEriKjNTK0cyGZj1FbQKgd0UtnG9JtH46Cgb53HPsbA0xXgeIrczejoIWH3HenjqcUVpfulRljw0EOkATMLqm13UXVNgi12u2XYH9R7D9TTaN3yoWRmtWyaDd46gO44nK1nWUgVhda9Bsj1pUgJyP0VoTgTQQdKMSZZah6sso6K7LoKK7yRZGbZApTW0e99yQLJ5wuuS5XukRp6IxP1rjCFEkU8PcYarm4N5r85DCnCmHp0VG6kRelNBzUdnLO4q424FA30yJalINYRPdPremJhA9Evo,22072446fee04b9b,2cf21ef5ae9fc5ed -yqX41B8xRyXK7HRLVa9EATVrS80nc6kYNw6STY17ChIQ4CFgL206Gi2v2cUrnukEpSsbfbSOoJIUyapV9f6DOyz1aysVfZ3SRUCb8vDm5usjvxi2HkscakzhHUasdaO8XfS8UyokRUmbvxhngM3PIHW9vPAdALGcVmAV2aIm82OiJBkkc2E53IAOkjpMn7fJ7Hk1vEuTzMKlkluou7kHCTPZkaJURGujq7hOFvNqqTQhDL6JHFUEZ1YkYv0C0ZabDxMB7DQxqYghWjFW8QK86VhZb9llOlXZhmg10IennZAnORa77x5xDOFe6bwcik3ro827pyUNsPEmByLMrto6kqwL59u3EAFeY435NmPh2Ts1abxIMQhM7mzXzm7mzEp1ie5BhZHbFIAXb5Et6T9Q,ecc4cd6db524da27,b0b4047430ffb41c -Ax02aCNtsUFXpb4jheovdzgIIL63jMmB0KATu824P1W4VBKscfMbZLlqKVHoUchPh4HfbqC3QJ7xURyS0gvHf12EHMy8Q3EiDGkNusGGZhuSCLQInjdHw48glzDJgxwfWKpqEKyt2aQzOzSgRIaZpav8pkD32VwIjLRwU57YNaaUZlPOzvHhpNPkFkNS3sByfxDNaYaBWuvYlDnIwFlyZ3gbeI8F5Zj8jWxXuAfRvEpMRU8hQBfoHArfVcKKVyLdd7QHTTJgg6TLnw8o64JBYjkP6OzEWI73CLauULYbEomYF9ldzyAgzCQslJHWGM3Nril8spGQQB6YI8fLhBf8aRrOc4JD3icID86oz76M7VuvYMfNxRDaG4OneaAQgAIZ2FrXi2BkeHHQMtHYObDa9bEjvqVmh2ZdtG1n311VQTFGs7y84MkmgKbeWltzuTu6h3kn08J2F17VymKDtHXpdNUxrM4RZ9ErbcdC6DnG0JWvpBAaaHq0CAMMwRFghkbjuEGSOzPVt9PiYaf,a5fc8655112895d2,5b4105cac1db4402 -trupx08ewCQY3NXEfwaJTzGtzFQWIJV0mqzjuE8a3D0DGyTxSwB5GRxkoLpslf8Q7rh9KXnNWIWnsOfF6zZ8xXKX4XboLqSTTAL2asNBqbg0FZ4bR2IaA768ReVL9H2cJt4ARDZqXHbhwn71iKszTJtdPmRW86SLbLjfdfHKgwxxsIRxzCVk48STGoy3ySruPn9bjTv8odRnpX2fUrxObpgnx1r1c3YKjjvdGP9g8xEVtGmiRgJ9aWHdiEktiytsLtyEDJF4DvSKPioDRUnUSmEkMu1hnebk5eoqfvg6I1Be26ofC82Q7RH6OHzWpMymJ0dxDJAs3w0KPCiXddI4fxWL1Gp4XD7yFOZq56whJ3i88YhtTWekmtOEpf11zyGIOzvLYr7UXF4RaenoisYIhBAyiR0j8r8sKEbWhDpwyWfj61ykx4qmgVL4xpn8fV64uSCk6xTlLhKMtpLCTEVi7fNnWJ8GlSMnwCKxeIGH65a243DOHwxa23ho4XW0vhyVcnis3SEymjcQbnyPSrPRRLvUt80q82bTfUeRBq0hiECgcTRCtWbOFBl96UGL8SpJLp43GwshHxDRvLaA305863SgMbLxuPRxQ0OkDdf5UcL9g1xohVNXQe7bId2KAi4wNCTsAMIVReXMNZUJZprYKHfvJ4WJAfa4kS8kMBfkBN735MVzwuFalmUYnWEOyu73WGkm6UvA8zIHMPUOilOyv24B3r64WMlnbEsefQ4qxltleT8z0A1TLHM61xIBUGQzLvZveQsfBNeGzRjN3GIVxMJ9w,9887b20292f75e8a,c1ee5bd07b0709eb -YlVNKrsYwkLUY07VuKgNu94ZActB6xvu8dExTiGUl5pJ7YOTwd5XzmIWgynN8O25UK9x8OlF6PdwfpW8ooUFTsaGtfecOG3ATFLvzkoriIPeWMxjzu2oaBqwt0kgyHLxbM2Bzk22tc214vePlnfurieZvNmdUpWY1dB1cYO6gMhnVx2XGUQFIt41nQ5umImCJfjtb8vRCfmu706hkam90FMI5dPphkhnPGu6szfg406WN3Y602TmjK16xhzns9XGepZo3AfIVXvIxFJaTTa5cHpZ29PtjFue7PfcXHMrs7DrJ9t1Jv2ZzCRgW3lqkV9IF7LYP1SZE5eYHLwm3GNOOteVsB5E7iItj2rY9OHl1mES4EnldR1MEOP60xN81YxM2Cn64HPz5D8V,a3ceed0864d97f8a,158615e8e13fe7ce -YppF6ld9fTAr8IBWYMPIfFQLtFAbQbWFxzVhRytjMo3aC727NuWbvL9Is3Mk5GUza8t9UH2nTSfN4wfr70E8LCugNfnbmyXHLYahyWYH83YnpyROeYJvZOdCx4J3WaRGaD4sXNq6V9I7JlB5E25gk1CQmX76jINnDAsYCMjNEQut4M0bqaCEEdvZxYB9SKvEkn7S48coNR5uLpTOODNpx0m0m571xF4qatYsMxiu8188RNs7LOv0ovvo9TGIaWm9vNMFa4x4n5ItpUFulIVgnwh2P046E8GGeF4FJcKNpOaGYafxfa7VYSdCLiZOcf1o2lsplOudb0ikPqXfECUmy2TwpVnor5Q7OMd6dwB8FgzRkFfKHOfo68IuqatF56E1QTMYmn720XmJREk2UH9MnvtRxMr1s3E79Saf2NGv9zNSdNpTaNdFRI33TBTaPhuPO9FNtrJwFHZn8KULkBjDJeWw11n1tC8rqhXbD8k7EHFW4Lpqvzid2ePOg7yMg2aVCOr0ZP8fkSWqad9zV0cBGfsB91AA23KmSp40ObabQKtOAse11curaaPktlAJxoT6hfksmsUj71SUlnjofnSggSSb6Q11IMqcmgWvfpzZr65M7Ak3qEMaHzvegnJlrHy21qca76mZfOgc5qoNEx82DEtDckJ9nQ5oYIInGQLHrORAzUmnN5yqJzuFlep86WFTRaORGDblmd5RpgqHNLHR1bKWPH9Wq5lgCbRhknSxaDZ9vjeqyuQivRL62JbWwMjb5LFjiyGqmRQPgmaeBUY6J8mzD2KapeRUb1ER5b8YkKYIVmQV4apXAMUwzj2j3gmQNUyyaSGcztolNdfCwIhNHHP7dB4IQcOsusX5h2U53RkFlqAIqylUuEImWVh15,98a3d70dabdb96a7,2bab32fec787f04b -fwd5DRIPfRfvCdHrvpLw5ougBJI1KGqzqqZa2hdhPyqYAG6VrepSjUYD1Y41BVq84HngvZQSCSQxdBnzNWdWbSYKGQGiWH4S5CKK8ZgObmLuIAilostgNKJrnHyhfE6YRZJjbm0wO2CVbzEtBbEPHihCG3wZhXLvudKsDP02s9OntrKxOrdltsudH2BX4hvky2bHCCH9Sh8MxiQTEnbjdvDvSm3EgIK5CBSsE1RQ2RVmtbJOMQjp6MG6WZxh4WVZOImBKyBKVPoEHMUDLlpPfRLdpduNCHeDjHnGV5PWFKhgvUP3uTN3MnawINfNoyh1YEgOg62CwwKLCEes4bN03lYeQWgsPxCrDVtXtVKHBN5OYuLml7hH5r1GiaL9jgWjOHGt5ISBRdH6FO4ILDDgJmOoxCFQROT4mLvxcbkgxVfVj3HgUQKtZI2EBWxdxpksWuuUCYgvThNkoVBfNVCWFs6OdU7uZecfMuqaE6n8IRR314CWoLGoL8QhVCPiEjDv7DdDBNr2wVLPzG4yOD0T0fpJPYOygErYfsbkoulyyWSpDoZzW7MuTRYzan2JxSQnTPL5Qe6kOuO4k9KZVpVuMiYPYSIn5WlyM40J1HGM1SkKLGS7BEKu9NmfKIOQLvXJ5qrRqkUr96hXKHoE5UtC8HvBXYYFYgfFJDdQikyzGEvcjucjbZWLw4gAaQaZWA97qzppwBkQjikkrZNBftAgskQrRooGSGvPReERYB9i9AYDrpUsxNZ3oWnsuRXQb9RLnaQT1mwXDoHBxShp0vVAFRecSQx900vSzMQCCvciisvgYlLsb4JphhFCwq31XZe4QZCGP4bSzf5BSfHzZvE6QAdGdJUNy4ovrZHkvcxY6LM3Blxi0j9P3hzuqjovAPWQx02Wn5CDuYtuHCRwvfqX7VC02AxBcUlDiSFnlHROrHZ2KTTtcfU8dbpHhPoijkWMTwqhK50hozaqgU,23345bc667868f83,bec0c371c2a49171 -uCFz4iZ1WtcelHMrDTn4dOLDPUDeqidREhgZpEV1zGYnINewk0O0IeidBb3qqPJbFbTskCR9AR9kK9cjQrA23pcXJjUZ1a9MJVd4GiY8UMdneptaxs5B5oRADrN8fXf3FS9dTXt8yh57ISkdVZnyBmMSUamjEBxMoZRpkYxQQMf0jLOyQ1CIzD9fnJvnEOL4OwBummuH9zod53J0BoPWkiScZcJmglgR6VyDaNPTndmmJS9ZfQjGhtI1t8RtXCsaY8BiyHsg4mDkwtscGz6WVgYZiGAdrPbYicLFzoYyI1pjNxoha4zXbnMwCvFg5oStLN4PRdMDf1uozXltqTdIWq4pmBgxXQKLBbcoxXcZnY4P3H1H4174hnFWIPPuoA5jZp9nBzMjipaRkkyXJ99LOGVQ24Qeoy54XjUMpueXwWNEzhbmfErla5lStlIqXQGjZMJpof0Q98wIKG9PcJcFcm70Rf2Rn6YNlnLQqYLHVe6X44wSgN1fD337ZfxmWCf3FS5gu7Kj5s0zN58nHn3rGrHLWLRz6ubuh05ZVbwEZoAEjc4iryumGLYnurBlKXqxkF,a7082690145a47ce,2e078ce8ccf7d364 -6qOng0QlOLdl2mGTy6Zr2xhJLb8K23IhIKRScCgadQUmJHFEGgcqGgc0tnjhKXPuXfUwWGE7YHSOWcE0b7KRbtqPm7RJVcajlWZbo7Irc43LbdbE4Tx9KwjqTx4sxsIinGUuSmWlteb3wmYLpbg8kWJzhedTe6nKx0LDfNIhYSdWHlHhKXwjWm97Lv5gF5VyyXnxsuVlejJXbkGLppDhe5y9XhdOa9eWvDO18byw5jZQrAdIDt9EPiskp1NvxV9ZAn9BISgiHaV3DqXkrqLYshwfSQnavXk6E4Tz4o49UPRNFhhxkvtGtIBpNil6Z9fbgqtoJfwlwNFu2mAZ0NDry0CU9coYk15qm5ykjwaNqOgn5brrc7Wca9tAoZFyMKIEdNkspzQ4YisJBGFb6NZiUpG8jGTnRkUV59rRGtlvVneSgLutqv5PikblJ22xUNBic9c4a95i3qQeO2YtYHQY6SGkxSrQZjPtJy28pDU1qIa3OjQtU50wmcBRXMK5cuN0Es8g0xOb4Gqiyc4rn6RESWt4stTNP80dZCMRKMWqXmbzuw3DhF80XPLom8ODSb9Tw3vPNMggULRBKA9iEuADz8rJ78I0CaKXqQPkmrlXHqa2fGJhetawXa1ISFe72hblmuaANK8xmOGRb9AJOhrenfouSbPKbFdK15RxFUOligTfh0ShouKaMjZQMeBQRlGScR52ILJRNmRSp0KVmIQA2XsZnifF4NMC7tEFTknHtgBRu1QuS9SRZIHtBHNVH0asDpKQSqzL5BO4oVUDtyQkBMZHD2zlXHRET81evLQpqZ3NX1dJqKzs6htjUasuW6lAs4g9TKhPh5u,c9f8c8795d0ade1f,afeb48bacf8fbbaa -40UmhhtsPzs5eAA3gDpjsJL8imoHiO8dlLsqNEL64BufXXfeXpPKG35vPzUJ58jpPMdWRGKf9D61qp3Y4nLnVVyeTKkfOqxs0zeRkRoO146xSbl6iXnRT7bemeikHELp1aYXDsZCh98IWS94Gx0hxfJ7sDBUmhP3hikrUFjD2KqEglJd74t6OCMvUTpGLDv8Uy1lBatrnfnv6lWM7COol5txbi6HIJuoO9M4rvOgz0tTRKdITEnZGVpBAvZoXk54Hf5ErVUFHbu6Axt1ruBHuBCa4dggjKvkj0h7c9JtXuWJDw3pQ1KElQkgeHQ32TLAC77FTyqOjzOt8k8CULkc3bdgZwuny6XyyxHzk79O8ZgeCnPMVhwPMNtGbwFE0k9nrtD5yEwMd5zPCvpyhSr3MIV6nLdK4u5wFg0Mu7TmBeOldV2RJLTzLDPZdE8r3SziLlmlEDaMdu0d5CSY9gD6beo9kxqioEh3PlNNtk473o6RpSZpVjmq2WgYWcNfYfc1SHYH0sfrdVR91C0kSictAOZyRsc30xlUmfijZ6nTeZlnkvzardbauU0hicJKnc16JSLIOyFzVSFpHV86iDQBylW2qLM2cAgqVFmEOGWAwrf8yEENAeORHra8nk6blHeEzvoviVzJn2Dxh4lmx0w0c7lnXibSw0ZwqqmuRZHinC,a4cb8fa48785b996,9d253c65a09dd434 -igPhkx1kIuVcqg20HgtSQuQSmd0RGGF3zYM6S4V5P24qlKR2uAZghr8eEi1Z9WnZynsMA45tQFp54zy03XtzTGszbfrx1L2FTpjcbfiMXWRy4N7LcCtG3Vzi9U6JkgQePHEX4TJG2MbnJQSlMaeP8s9UaVLKxXnYjfLlOkUEshcWDx85QmGtzATZ3AAF4L8zfiOLHXhkmrqhi7Efu8yfcgyv5HsiN01QKlo4gWpJzq7dJeAU2k6TKgxzE0lnO3qeiVLgyG25GmqhAKExaxtEewNbgOpcUWFfVoCEZgnBs57I6HH,5b182ab2c9eadb7d,6f765152305bab80 -azJ6rGXPgJB504AE5EgJ5RDOAkIOJNKOz20Tf71FlIzKmWsaSFFynu4FHqgYh85uZBV4F3Uv6to8y3Ivkh05mW3HrP,c1d3ef0ec2ce3c0c,9c4cb17747c78938 -UK14gQiKsdiEvCiOi5vzuqnP2xROtI8owmSlOSJDUVMKla3Ut6CBziy5WGDQDxsvUWG2w1t60GWjtzk6khEzQnvVpURB5nuRkP4YfDGbwaa2XS4h9QmPdyPm6OFBGawRNxN1oL6YoqnTYdVQ9lZ2QARB7zW0Jt9I2tlC3AM9aqTuEt0XQfoM37NXikeVLEK0bmNOVFUkRdPHzKBhE1fIBWH9wBcjQnOmqsMvFvjwtfqiPhiK70mhfOnql1sxNg9EEkG8ZSLoPaYMoOXKqC1ZMLPhgEJuhWvn39KS4WOrbhJ3OGAkHVZLkS2fth3tt3LfwHkBxDu3me45wKsIaEjL3SasM7eQgBBw1HD8ZtAxUxR5JrVwggzu2mEddF0T4BQUlfvRKvBWI19who8Ky4nR8kQvfe21PLZ05XPpD6nQ2QpetP5l4wwC4FdXnbIvuojybsFAJdGjRxkLgBTZlRSN3fwcX2fYkGixrOiaIpjh9QEoyLnCzfPrxmUP6irktCtYrcLaoxNTS5fq,702fc08aa277a02b,9a9217c331319063 -ntW9UNsrDWB4cEapNU03KZv7tcBuz1g8XKBXtRbqo8Z5HU86BfHlBcRe8u7d1xkC2HMWigSwkeiRbTqYVtKM4KbJOieEiCbVP4T00mCr8VBrQh5j5or6jkk6W2U60pFG6PJqkOeR3NJjGk1xridLE3nFQtcHROZD9iF9ZEi6rvpcn2TZM72aad8M8LeCYbI6FFoKv9W3DsI8K3Xwz,1bc506dc2807d890,c614e8df140483ef -hgshOXeh,3d827f87ef026cde,db3ea59195083762 -NRGocIl2TEK5y9NkyFBhjO3wQq2SNkgu2TajPtyh4rAUh3XxRxL5l4fEZr5L0gTN0CwlOAIsT14AjI5WxXJf9ntk5K4ZfYwq8roIaIzuiwFEnk6etc3rplCpPXSvqu3SNEYS437G5pXddiMc11Ids315pHGGyhAJCqUIUxeBqWxhrpjM9frrG5CXG6urZKt9BXShtV1jswql32TMj1RfInmlkIo5ybhAAwlw2J3uuUR8urkVdBzhxnqm5nTpxvJN2i9GnlAiBZr0aUh6N7KDcMkV4Eg789Mo0HsrOUwXaIvntbAt2KebYxO1lVNBBKmbtgrRo8xP2h1icAlSpmajZarmDlkTa4bho591tuOFgDhdbCl5rATiYLliSRv39BP9QYMdwYX2KCn6wEZFrfaEUG1XVFM97ZQ02L5OSiUwdTvpAizIX2qnIbb957pAOY33xaz5kmOXRfR3J4NslSCBrMThMTUXOUFRSJsTaDlhsCzuHJtxQvUTgC0itfQPtTN1cJjD0O3iXSAi3lz2Ni0yuPrynbRuqqHA1FFfRNP8SpheodZ43KrQeCZDwHpR1uP7ZngpQMWqFwjwHAmuEoT25nl1x6RALwdv4EdsLxSaOq3Pg7UYAWZpfUlKMcLIDmHyMvMEN8OJuMtqvuBfGGkf3TWvPLq1NW5XGvJ5ybB2rnU6qMpfuvpq1FCyFuUirSOcrAgkpSBEC8Ieu3FWVE702xkfLdgTkgzK94bewmFjQ3WrmiVrEU75WRcPJCKkF1Ir7NNjE0fvGp7iS5t9lLsskYK8EqifMlHNlE5uHEiU7qzlKgzjycco2JaVCCsbQdBEdl67uGSMGEPDAmx07cbAH2fLIIdVaV0z9sl05w4JFzaOjMviUdXt796XtL8FtmGVFqz59SkbcSvpJ,aba5ebc498e32d54,ad0ea8cb4b0ab88a -6wy8gh7kJNZzXsthHUsJnuGzCZWLhtTMdBwy2XniaoNQFD3UoBfwJbYHnnXbYmj1qtgLcmsu7Px4fLyQmeAHKGQQmJbxBghS1IO37x0w16Nv0UqqC0OLD4oTvWzaNhhp85wWSsHnyf1zv80W6q5fcQ3ivwnmKpu8oZ9IqdFsn5gGBnuX4GKVBWoUPrM0lXUg6rxp3M09ydvslfAmPtne1zHb6sqVtsHP3rB3nn72ZBAS0T1jkMWti0P4KhjWMbR7w915cyKI18FSFJf5uQ8ulquTXhj1doc7gc6I1Tu5,9159dbc8083b392,ef6cd9a20830f7af -pG8SgJOWmNQGUDJEFFozfribfJJED5hiEWEyusSeuBgw45kOt1u3WaSvWOTupHHGz2AltJ4YMh8R47SwmoJ0SzXTiMG6qzyAoOuHJ1rzpAUUwsjJw37VZ282zDkcDIn0fVSyE6huYAjfTijUAIXChlLUl6CM4iM3mAKyTULqEnxMqb1Ea5rMyGhVAafOH4de33ZlueHPhJyLnKDYOyVtAAhgJAwdW0vFwuGCok1TCrJ2GrIFm0bSANPlGT87QyUvDDiRp7xf3tOt7fHw04DwDRckTQDHf7aupPzxMgEO11iQ6EYiKW5TSqpvwXxZWrjKCkqCfW0jMt7QPek4S5zbPs5Aog7duQ0OWKVgIzuZlRRb97YudU,862e80cf664eee9f,4f93a62efcf4d45b -HMGx9z5Kn2D5qq856VBvZZsWtTAMtiQROAbrFiBmNVTOoDDxs2IhBgvqGENAMgRi3WC85AQ4ZAJ75DO3Vst4M5OggCxyeF6OVE3qcLowsWKH5DumSpPR0BWLjE2NAkPSMevdGkaV1F5BYhMsRGwR1Z8Ayc9Cg2ZvL8vAwi2MlH0P0BPJEFjvkh8YKKkNi0d0DwI2VVObseBANI3djHdb9AVDJO4Ip5Lbvm3SPWypRAKmKl3JONWrmL92VdjUBeF173qD5X72LGvqWosI6np2PTo3jf301AijwCv1KhuU1r0bGrDuICQI9mrvOpRYLRuTKJyU968JNrvpDf4Zzgvt9O89O1e6GWv6lgVOklei3Ok2o9yz5sry8sbPittl2H5UMVKGLkvhg5FvYYqunKRqiS3fLdXnmw2TRzCndrm15l7HXXnu3zOryL71gzPD7ers4Zk41Js9Z4g1Q1nq9XwuGST86MlCrEwTMzXbMKUmg9b2y3fowHK2cfopXqlCAtSbwTguEV2g90D7IqkFnr0USJYmb2nR3oxcYxBcYiyJKismnDyqd6tZynspxaVxElv5w0o2hAQWhVLR9ZrkbY5Ye7zV9KjdlxuM3WAqjyVbiv1xSVEkQ6zek41ASoFMw3HwXuQ8I5NUmXUgynGYGo0LwXXsqrS7UXJVVobiK2Ih84EgGjJWqSe3Txbc3Chj8irQOzRlSbrAXAxAobViJkYS9l1KGFam4BkX,ded0f2fcd2eb7ec3,16f34b7c9ede826a -MXo0htohvJR5jl4CO6BMpTpKhmezAuND7bm0ocoeew32jE3DoqU6TdxnFxmAfLDtUKX6jlLSG0lTgGF7UO06pSVHUvNYbMa7vAlwfwfC3DZkz5XDQFg2ANuI0JQ07KBY8lUxxjZMuMd1TzCumePFoO0P3B4Dv0z7V0i4H15Ah4oKsYikkrLfcmvx6lueTGU7PwisZvtsZKUODoGwIplW9ghEP96T0gufMAZUZ6R2xtxZRr4N95RqtqcGoyucjdEjHoWHR0Q2GAuBckgunKRzMXI6VvjHF1FOfe7L8SD5tSJdyPxxuH8RC6nvUSJ9CN3iqFUFxB6XAQK7HnydyYfbt8oHr8aoVe4luUUTKfnSh4mReG6p17aSL05DUf1b9ZyZoNhzxPVLrt2BUjn4LR45hanNvWrHISILBqmoVLb5llpl9tyqhvKKhzdFMrFowKjJoRdNgr9yBDHRZxqp6TqMuQTOpRz1FWrpmMvX9emDHe5ufvwrA32jXxqLVdZIbc5Rm4sMtQtRVWZ,8aa6d4053749e9f5,9603c118534b948f -2c53ou51Qd5AWVAAghLst7UXjUgp,40e958d0910b4bd7,9712c0e9c3546738 -K6VhB65SMkaqI4l8EW5fBMAAfUMjAzrGJn1m5487ka5PtvzlUkzYuqVmL9rX8oS8vv5t7GS7CCRtYWpHyKfLCxe1eWehn8Ush9GSUmUvrzb0UEeL3JScSz2NnRUiLosB9izX5KOHoyqNrY7HYvca66ouNBkj9dKDh1eNcOCZfwzfc7mXTD13N8NSACFkPvE4zVnnLVMp62xB9tPREejuRgo6GQWnfCc2zj8kbv6GJkVnXTfAcbo8hMlxHN5D8x9Yu9u9P0Z0Ovzi0pNc4HZUt5ZiLlhMawEQB2r9aCORDbXeqi1NEDpVWnL7O3w1AL12dnq7maCob0CQlj7NPfLgqH5qYuNJe6MH9vHFyhnuKkBkEhaGvJTXHP71dPAgQMGHfkMF8pVcAKL9QZTUjftmzoBquUkPznv9x4x6vvMveEC92M4tkIjXl8VvsZCzi7uN8zOknwx3GSzxmpCTH5pJPx0m2I4xHykUMkCXIc7V5Kws6ms05OXs2s9iLLPzlmvDoNIs8cpmLQoCsa9GjPalCdCSacQubx9DD6XhNRu1R9ef9tHQoEZ55c4HrrHGOe9d2IiHlzbWKLObohaDZ4PmUgY5spZDTzea8R2401lWkUvNlFqyJlJ0njI0tZjw1mo78XyhHnZbRqVHztKLHIdUmJcPd9wf707WaExdQL2,79d5dd221c3bb7fc,e3d20458b75288bb -X2moDxnrDbPpqHkKdKf,41fcfe9f5e5f4e6d,ac9e787952a583f4 -dtF0svqH9jtcg5gIGdfFWtU2pXkKRrDKy2ZwT1GWE37gfYrqJocTYvX2zBQqk4vMf0TscORjtOXqATkpKlevx5avBJXrrldPmvZxZLcw7KfzWS1LQy0Iz116yGtmF80A51OoqpdcoHutkG8ErPmxTppUmAISbl9HyrEa0KiAUjn5TyB6n8r9rjICW9VBIdq72JWhcjpBysITNgcs4hNmBLYmZ8w2RFkuwPBZQvPotc6SdRjTtEhIL6VmwjX7WmN6Hmw7KbI2hxQyF7t3dyNvvslf5XjvBQXdHcBAjPFW4nWZW5YTZCppZiebABf1Hayg9ezNJk93wicMnXy3iJ62XbN83WuniDCKx0DLKbsOwGhkB7nDh6zeN7qLAOnYJZfue9z1uDkfXsYGPPKS0VYVoORNqJ5enKWb4Aa7hlhBWxoAXXmSGAYDVpbiS0tkN0YUW09usCxr9q1GaKwGrzt9hb1zkvZwGIPAQhTjbdvyw3Nz5dA5WAHZiub2pt1I29hAhzwwe0UuM8p4OXfc0rAzINmB4,da3d1c8cd6025ec3,e3c460a21fe907c2 -PwbRZW3IcgmlMOTpURYqJ6nqeeZuiviuh3sgFnNp1YQ5Bb1QpV0hUlpRsqaJ89Oxq2d8WdKOEOxOfwofiFAV3SbTOHtjLEwTYPOf0SOy0SCJrH687UE2FD8a73SoPiCeokm1A4CwwP1pv4aYJP2t6rwylDPy2aTOa4bhao96x5sFxhddoR9GVBFt1M6rx7hgt8bpuGnsWdW0nLn8Yir2dhzkYjwN2SuOQpmQYPK9rs1tr4fjmdfXXX2KxTnFAdu3z42lglYepFDSzUP40IHhADnT50U94X2FIGmfxRM8KQ2ONass7aIZDxuqSB2VZTUYQmCf5NvyU3vetcFcNsfp5aRINsOmbniMPIBnM5QWYI8xaOPz1mjxoACrEOCJCqytuWsuJkR0HwiANISCsvS3y9XyVybySW31F0jrTaLBXnoS4179XRUvvpnFhvHnQUu6DgbidA8oJrg4QHdIV3KDoxDu0Zjrpc1qSbem1dOjklH2KlkRs0c5HgtHpJ6eIPy9onB5CObpAPulDUZL2EnbnGCFxQzeGgtpoMVLUrCiZbeJ5O0jN8wFADoPlAQkavORUeJsAYqpVBFYHs3GZpZHO4IhLRIYNvVBZXzbp9FAQhDkMEPonrojue8glqOk4bYuN8LoByW2pKWAtLL3kI31BosMLOFCCvdCMkqOcbUKCIepgnLw00BynNA1ljUfjRbnhIfzoYDq3DcVTpu2IHhoHhqiAD6uOkecGvpVtk7MR8Sms1c3nbJWuuuNNw0m9qERjM7SXD2VODOiwR0uuMuHACesKIXuQd5VfKgS5MnvKJ8Temj3lpULToXKVsULwibrSmMVGvdbVITigVqOkztQRAVKpdwhR0KJwbNm5CZ8FjVAh0U3UAjlgy4mAJr6GHDulXZwTrBGjJKEwLXeMQEaMGdUiMGgodb1stYYVZ80xkf81ovWxzPJNh9lNpwilUxWTZBGtQ5e2VUZy6Hx7g0O57uAZtBkKr,6df99a6df1798ac6,2b8597212bd13204 -7HHjXArEvvZ8y3YZCJBTE4Cjwh1PWvWXW2WkSDJxhhPGZGzvaFIzukuGb2B4HeAwLzVYYT04xhr99tvPfiJ0rrFK2tZnIBoXGAaUUgE7XPX7kMRzld0ScDBTdzc0P4XQrxBBDD2WgaWzBF9Zh7t2BW20CYdmnBb7vSB8L0xnksEZeyJ2XgYHiGTiwZOiCfSVJ9KgPO1jfYMEaGn3P8KId1GRiP8KFq4g9SXO9ad6m5KsKt71AvXweXH78SwYEPBr1WD7R4XMyCHsA82lHMUiYQ1mFd6QNc6u0ZMJJhM6AtHekFdIIDrY0R9KZsjkfAj4dEZMnh33Re9CQuKwh2o6Vjz2RFcFQYm1mqTvTqMo8nEaxzyMs91emwgt6ShXrE4IefaxOcQF6M7K90g7ZlfY3Ts4ovsHQfKbVZNuBrO0FjHafqRLG2l2cMOzN8GCLksgHxxu,52beca0d1890b95c,dc538f54529ec46f -B0yb6Nex5Di06Rva4HYBt0o3t9JMFMwRbKp8zALetPDiYI5YJEvX4bseYVC1u1KdRyXMehrYYSesS3nUGF2f077CwqQnj8G7uUBeoo9gmr3Ob6Q4DhfMmbnRpyKOgTLUhjRLiwqwZ3wPbuFuWP7ySyMsOR7aorMDw2OKU2VfBucXNUIZlaTHF2oSQ9WRoD7lntCvxyOZgR45hqvGPIRamD2zF55nU9zDfE10bko9jFV4e9zElf0EH0hbGRiopX70VadktAUgijo2u717TmaFrdxEgeH7mld143twC9QbVVz8zcJ16AVyY0D9TEts0CuNzTksvSfz6MBSGTJVAneWD9tO7bHO9TNVJ4e8rZ3IZKhdPLbjBrJgj8QxZ421RZTs7MR3p9MFA5nSxTec6AeTPzJYRs92TAML5dFfEPm1JrVqf5xpuupbpQu2gSrI7J2j4qtkX4V3N1dhGaNx,117aa5e611b2a11a,5803abff01d2a768 -usSDyyPbNjgSuGwkMOofn39Iyf47UiYBMSzwTWfemyqMs1aOPLPgtliFm7NZopEKSryM8KlBGbmNBHTB1AoT393STDCc300SNHQN6tNacUfHqU1fola4UMYpjcDF2fRGXjJOyfoNGqInDGEP0xJtl6btsTs8rOWdphjFvDaFeXeUk3Z28BsBkFQzl3d2gnT5vjorITzBrLVSImCekhRdhG1JTD3OaKVizKq0Ol46gtAhkRIwK67SfVaJnbGbSX97UdCTbBPRYQgp4W97OgbEGVvdbVujhuz59ZKKjZXLtt6Hh3FLay98CDj8TGJgUHVmnnGzleA3OFMDZhog37pOq4owU5z89rO6X8BOZ4oMMDtJiAjZknG19oyqBkXqCqJZCmZ5jIh3zDONqV48SSyBjtFs7w9HQCfuE1yaxmYWKomrcPJsLDZHOwC3DvcBtPZx7qYaN7JvZlF5g8pnuqYHJdAsLz5dSx7A7Nh2PtoUHohP993wDNNtjIZE,6deb3eb71ba81902,262047d82273c7a9 -6SVtw0CSGD65Fa1fs3JnKrmqZJYoZyH0JqcnJmfzj5hUtKUf1LaY6krMBE5hal9bbrD3p3yOSPcQ4NpGIGnxXoGDRsxdlCTJpxZfaTi1Sjq53XGyKt0JLCXigjhS8cVEmH15jLeXL9ZTTz9gUGJHh30EQJmo4hdmXyTXjapZ7pO3IZ8H8qSxbOeMXDoqP5jmk269u8nOFynirkRZDrI7fTzezxmYfX57dvwXBxR1WxhHmWPaxM4b1aPx7vli5i98FbACyfDhpEb5CXh1T0uHx3JieAZwMSIIhtezvcBrNbFURXkRdgFXGVg9GqJBFUfD9PhSwdNcBPnxGSJVdkCFJy23qeQtMOYWBYLqcjdixU1g2JFzd0KSphzldE2lZIwmEF2t0xJsj98Ahas5erkXyIspSud4BnJdXi6hZqJxmHIg1hAXhAivNOzh168DBgXYY1d3ogf1v6OtBPNoq0W7RzJYUXpnDtUYW13b0L6J1AMxHfvFJx2MOgUsLBUhGIHt6Q4mgDwWUiOzZ7rEgG5f22VEsn9CCVA4keIurKtQIcRGwWdz6YjrjNJX0u3xiI5uJPUW3uIALmQ2HlicAD8lKK25xSnAETrUhOupxQ4OHjdPZs1MDixPiTYEiInnbdlToOVPs3wEds1HgDztJHraeFlD3RiOegM9OCezkwJx7z7XtAvEDDWSF9KOuMev6qw8PGWN9g617eIWI99OZsVK6cP7eNK9vGbrPt0l79APsrS1asQS8MTrtQtIePL1QjJ5nMHr0PaYty46xrLP7TD6OEtj5kYWUf4t7GIY7EKMKu0LHL1OIvVkeGPK56NzlYmJM1gOnKGeg1zQSm0ptu4gjpzaSs9TFSf9Wxb38DEZcPru2Jb6ck6DvxbfwjVFjOc4OPZBA,aa750bc63ac1d99c,101f6be8b0dccaf7 -bZYPLbN0Byxrj8IGeZB38reBa9y0Kia8XEqivrfWOJbBpVPHM8TLVTQCwRldANDgY6Yswt94piAKGO0ZNo8rwzCgNe30BXQCeSm04JK7EVpQRrsfKBdzmwBEwFrz9l3IRPQZT4MLpFyDDsJQiaXtYlxr1tabk6VJL0WSs1Gpve6pHbxjPU2Ev1ILPOTp44gbeMjngSr70f7I7eQuFnlhnsNEYCn1GNxKyjp5Z5dwlZGrdbzykrOKYYxzHSeeYZUPhmPd0HPGY3orwhQjx53CrXRXLm41u1ae2oNgjLkhbZlXyAJqYtGRG5ziNX4S6NoHZlzx3lxgMw61QJZdbJGD7RmsM85exhnLs2GzK6Eabp7F7prac2DgXafAWIJmSHBfGq1mlEGpxYQ4Wk5ph3KN6NBeLzujy3bsiW6ZWytWEAWvN0JpGVbKtL2GUkPvLNq1HYrQT7qR9Nmwa5DuwCpIylQf8qx3GtmQshu3NoYnkRNgdnzLxcYGSMJrYx7JPikze938D50SRTiBqsDI9b6rgKmSh57EnbS1XgimUQTmLZvLhge4wgAbQcEE3vs9k89FcbrOviuVVxROhRK1UAYE35oKP437FT6iXuxfmHElNJuhDkB6RPxPfBE4dqjXrtvDkjD61tWSkyMhJpjbrTfwV9qdsMtIWSrCZN0YrMw5bQtaGxh4RjMtFbDy0sxgP9U0C2xSyOq1SisN7GSUI4gcq4ihP1Xf1Gqaak2BAN5ZNIMgl90h8t13jVLmpr06ID4yXi73vM23Xc6JCmz5YO86eOw1SAy8lDeSYwD5McCgmM4ymPYnt9ihEURAMtFnmajvDqsXmRzpNsv0oZHtwOt3MJUznz,87b9942d6527e30a,59d859388aabb6c5 -ffvfk6uFJ88lBrhtH5XfNWd3gBjtFxMd7tfg1vCwhh3RtiwL4WafdPBxvs8I5vl0yRB8uDXBs19KrQy52JEmkPslezAVKUuzi29Xd7bh3RpeDA8nZKJNK8CJYmluuN2ogZkXbldWRSgUbLVvSDhFcr2j1Gf6VK8s609kFgaWr1dFfXA8iRUE7tTs0b3kv0fHUWCidZpGHYY7xexkiZthNPCiXex0VkFFpSsfFA3HwIZd8M30t8RmKJLPoU0Vnm2fX9fidgHtND0BlYt9x2wOVjkJ6flGz3OxGf2VvNIjkh9J9u99YUmfZ,57ef6dd19c759b8d,7472208cdd000114 -8XbJVS4fASfXR18klmpL8ZJaq5fSLnEB8M46VjCQBF5AihbzvXKkTZkxL0ONE5Ylyer5hBJKcMFfvqLU1lmUzHT2V6y6SzVIiQwX8t6lsH9tgAeDT9Xkkzv0iFDkbjAcvpof2PZipIhzsmEsFIm0hu9Yxz7k5RgDADoeY5ZqkrBCSJcxNLUzmXKipEIXkz2D6vKETdLDIOy8zL295mzXiEgoD6wGmpGJtJd3msDhHjKyn8K9SJjWw5jxbm2sImMVL1J17c1NNcrG5WRHsGvSsI2YmMk2U7Xjz7Zi36FPR6QNHdDDigrqkkhbFCpx2KM8mW1Sm7lVyig18HjfCdRpxJrNPbCO4yAIleZMCDvv6apYYsuCojfN6mATpj8ePdswisEWbz4fTDYGsti1Hd5yC8Wfv2IcfrfZcbJZgCMTGG3S9oue48VBMGeDGnDkDEmGAEXw,e0d9cfa5abece35,707317a47a204bef -tnYfmGfga6bVtHRyIeATly9zOPtXUyoedSnJjBKovN8hJ27G0zKNL5qApk2xAbjrpqyCkI8C3qXPoZaJyRe3xVDnznMkhMsOQD4O36IJfVDLPxIxfVgSuHoGBRpXsVtNq7FlvGKvWtsBEDtp2c8OyUBOZLsKrRxgS4trhU5lcFDXcEL4SaQPZvLs2WEy9ivdhA51FjK9H5XWMwH58yBUFENVcbPafCJcSIOOQKktrV,6ce18a2e9f24d5d3,fb6e32d71045999 -vj5h0WxNyXyS5nHy44M8a9WywZnJSs9IeA6qS2wjXiyNvj4dxaK6v8QFGDR550V1ggGSFf5DQOzKjwa4hHcpJb7vUlQUQHeUozVilYnGV8UHfEgrS5UgOg4lRLIqCc5HDDmsYBVoFOXvvD2JXn96nz1cHrvIrnyLOfNHOB9wup4mplVsUdJ0CW2T2H1mm6fqTurQDhTplC0uB8ckA8S93nSMqlgXpRH58qFmqVgbxA1cAk9PSTbdEo8iqgIYwP,3e95b08ee85f20d8,a2139b08533ce4f0 -fjmkztsx5O8zF0ZVmlr9brqwroUqSy7mQdekDVGCKObQEonoEupsiGdVBG8Kb4ep0TEsoMbdqkSvuvkzVqyEILYyfs76vjdHnDIDEocuimLf814IcuO7JMUqSGAtrDW9wY3ODLzeclYVgIp6DDXv5tKOwm1D2zvjU45i1Y75KZAkPTRN1LAy7qwL3qygWPqJ4shLcDaaLBKwDj5IRWbN3Ekx5s6UVajnWnumslJvuVv4IsEufPbnOCVPn8UsO2IIge6yWj3LMOnH9NXxImjII5ray42IO4bxlV03jzaHvgaeIQJRmgb23voJKl9lc63WZ5d0Uky3XlBnnTfcgtjWw4sW5r6vOPfgEBoOIHZyvxOX1RwtLkT6XSKspNILtndIGdRiecbysDZAuZJBJ8Gs1IqhHVOet8Y8Mtew1Tpa41xidvEv0wBcBZ0Olhho2kOd16IWnYwQc5Nys6Yx6R8IzDKGNdjHSQeVr09hwXBaoZ8pcZoiHSqee5tM0lJjitQnGmCgV444H4L7AHWGWRT91yskzafvHfP7FrY1FAelYE0zZHa6pW9lcG7HlxKQP0jjq3Op7nvc47KPV9nD9i1zXJ4JEg0DzbrTkpox8S,6aa222fed316dab,9121cde5cab3890a -m5zynMoFMVYhXUEaTXP3onxN3ltDs4Rde2bzV7mmyC4oCSbsNFtfHdR0PICbJOaZM12OxkwZYgcp5SXGZVvVU45GCfkcBa8y456gdkvF9NAIRc4cjs87N41RUjUWnPpjbcWPEyOWaXgafPSLXPfXiTC8iVI7QiRj3dk132cH0FD5ASWCIpBrc7b8O0yAtEjh1hTYbivIkQzW0Ir1lwsfezOQw9vFE13tkMMHO8VWYiJqW1beGJE0glieG8fnTmbYt8UQj8u2RooH5A9roxlN711CHMv8VjOyvfSeZUTksYsrvtZ59MPB73svYDD4RAu8yBvdN5cAo0lHkF1DcbhBuKrLf7GpZ47mHnM9ASuXFq9oLOm1TinsAwxVgvagkOiKksFVWoyWbGkUF3Z7YoAvvUEYKObpbMnyhAeturESLofMimN8GceoUHFf6BJfpZoMey7R4g7bq6jyXNfwKIg99tXdek9z6yi5Yxw8WkExUYjgACxRRdSl2xaqhKaaWE36eX1lpDGYhci67lUDzdIr372YGlPRI5PDDVjSHx3uO7bHwZVL8ExWsXNWLKdVYnfOLzU8ERAmOSMVMG3DTVjZbxtDtnsRUnFQmfBHtmOGO3ad7IFeyCPV1afxrmR2hSYMZlnjeeZ,66b267084ffe9226,cb7b33cfe3c146c9 -VoXom2fA3vAMyc9D96JmejKnC2UPPCgMVmyhjBnOQsh2viax5MdJRjRTqa3VLb1ddjUQQLEa4zXr4BmlYYKTS2C9Bxul2V1KFOTexaPbwPjXfuFjWuKgb0JUtuPlcJVVGPwMKJdlKHNrgLyeLdhuBKxuVU1zdEBkz7ZGlthRfMIxvFSMwwfy5OpiyfAZ6qZprCfTKOtudjaAyhYzIKClYx4EYrzhnBnGwxFJvf2NWIAMcoXA4yz5vniFpG0ErGqOD6XVbtnYRTagmMJ4U00vAIpDKa1NUkZqgjLAQproSMVeESsBZ3QIuHzr8MLjBYXbKDQTePvGEmtjfKCGUUKPTNmIly6RbI3m3Dy2nYvsGfyJpA0le25Mc8FspQHxQb7a1RrzonnW7Ic38u9RjpVyGduqZUbJvjyQxyCqvTFl6sE56vUVgaMwY7S5tE8dxmlCbp6bUZqH5X71E3WGVYY0bBCHoclAf32zl8qJub0mhWImOaY6uJkgminvEHIGa1aS5uuMaJBAxXNymmkPa4exPdtKgd3i1Xv9LK5nEyJ6YrkSKmVzjoZ0GFsbkDegkDc49xQfEH7dbsU3bA0xiVxYOWWkSSu4lRHQfoU2Cifl5FiDZK8Xx5Q3F1r99KNgzdHqssUO,fcb6311ef41a054c,c99c407244888afb -01mX3h3axxYSL5rXS0MiP58dOZda6zQc5EWi1ab9SGBJkAhIFkDrL9JP2aK6W8OaXMFSref8sRgmroBTwhsfkYcAbq1kLBnv2adT1FxZ99A6ktB4P5toL7kkB2MB5t7NCCc43G3eV8yf1kN5qKZrOqEMoAhPm0v9Rq2a9hEFhlkFO5T1W9GsjSttGed8jITicd8wRQKUJdLSs8nBxRM4h6dAySTFfN3du0bxJsnZMkCJzbesOm1jp3adRgjttJo3T8a6rGV6pQgoi68QqkEQEe3TWShoiGD2aCvIgKbjWvr9DUjSx7tdL7X6vsOwUz5hcV29IbimE5mWsI5UpSxgTT7dIwMHJtnW0XBU9X4I8o3HHCM8rDdSiG5Ai4DvXrUw8rs5BD7DMYWytfmAfpyn4QrWgQZw2qO69zmQ5ClpvCY8U7OCSbo0YYyKX5SZob3ZfTj803NDSrKOyWOlmXBzqAeGIbiBeUH0O,493dab3fc7b79c72,882aa5d69dcfdaa6 -HuCIPsRJpVCAloemVlqFMiTemUUjQbDxnKrHaK9SNiMDowggdrLcR4eP8whKlFe5tm7VfvhN9GhjLKXMgfs7zDghP2Le2k60YLwH41VtK6KqevpDJpKu8RyrKTRshXqSSQk6h7kbKVjRSi0YwcfESfTgWpry4AaOn53riorP5u4PD46sgUuSDwbYu8z0tnYeGpjOLhbQ1Dmm0KE08OnwNzs83fREyg4Cneyicq9dI2cz6GIbKPvHbPwsjVfAYK9oE8MsFWE9l85x7bwc828ENXPcRYZUyk1VDlwlnZASFR0Sr44tDnAN6T3aMRq8DiyoNvDwvWHZCjswT7IPq1EqiX3UIEB63O2jpOtYZ3a3X6z21yr4UBxIcYlyFUqDofqpwpt54IR8emA6AfEeWg1yWUbAAky1enxiA3ZNMv6a2XSCkqhZydmRrUNAzyFrmq7sBUEsPMeZHbMIZ2IXOt9XPgoTHdtmxhM5E1TEFTDIMiq95x27aqxEvxseZRXAGy9Ttsu0kHqMAH1naZFUNyQq8jUjiyXvPIuQIrSxNXfBjKLGHCGo6ucPadI3cIMeT4CJhKgcxf99cN6zAzQnuFcYrGunJ5DwYOiec1DPyTL7RAEsUXESkVlAIui1BbULNmagz4SG26CDkcptonmRmhrMkUZDbcosZB2m6HuaqlPS60OfpE9cDtodn2e1qncbFI7BszEYXRyeLd1FHlTEQNbYp2WZWuWUgjc4GNkrFuUgrAACdNoCZ0j2arFDvfvbRpxY9MOE3R8AFsf2DUtf0hisTDT0swU6ljXD3JzKZlP49xfvg0vidnDx2Qutc678NVH3pn1rrn4b8wIhBsSJQAHEThe8OCoQrJNEQH9DJKBANwq3MyuFT9D4lOiywR5ctdedmPypohbtFayFssGQ9jkPrztCQCaCbnIstcynqJYU0LQY1HoJ1P,a7de37959c5e86f1,f933cf1ab76009dc -zh5kJlAWAahqhA231UgZuaFx3tKz9iHK5dhqs4Ow4TD3uDqT1hi3hWdtRu1YF3N6HUZj9mMEpcUqvaKe8WB7WSVJTVIM7wEJPar7KHNGXb6hn6ZLqHSgm9DLC3KU0ucno55TeoDnjxN2CdSe3AUVwPO8SQMOv18dqqbf4buupqAEuxjpRvD0OOVhdWKZ3,34f5ca1f10c6b3a,3b2021fb7c082cbd -rsyOSLslhK0k2OvCkWSmakRTjMozMC6Zrb1SHfVIbU9gmb8D6Tatk9cSqMSQuzACqLl5NNTXjQZIa5pB25l1xhUNlQ9uMR8z6hxMb830hkKt18vQ3EvwhhzJPOxhB9WKh1KLZ877v7Bju2jsbvDebEVPOpGuFG0wq2oGwc7rl2k6Q62VDL06wFRh6PuRZaNkJrFwACzaxx9NJ9oOCbn6HDi0xW5hsF6QM03GzSmkGepyjr8QYThnepCOixUcktU2cBY5irPeUy8lBJCTnMOHdajDQtKVkC4kUZsBMigJdWkUkoP3JDIHwoeISRjUAgdCeg1KPwkqd97YOG8ti3uMzd5GJgE184GOrvwhMRMSdsWjJUTZFcc19q7Emdjl8KCv4ZqQCOQnZwOSyfwZbY7XTHftebrGx3evfevsbgsHb9QNOg6Y1FTZA2Jonj5shWSzv0RZofhAp3kACbIeyw,1f5b0891a22db093,249e1753e7293c4c -yHiURf2K3wYLmKfj0PAujOR9srz1PjpC2wfBYusoHNmpLGGT2BB6Cdti4vFEmFk3sVdCPnJQK0dwXsgcucJvfCCYnCqqWGzhihMSca7WMOvmWUo94WdYnABzG5WW5ejhUVVJUZ8A4N7d9WtoqmVFQ3JpJnW2NXYjtXT0si1IvmykwabahEoMY9UURt6KCUtzvB19DTT3UD5asCyxsTOEMprjy6ws0Gr0xir0GYK5kHKRRc5WXEq9FcEGMjEPDe78yfCCJrSZ86xMjhAXpPjze9jQI4YFd9OmnAxRbsy6CSNXbaQ0Pztjz9eqD3QRYtS8wCGv5jkhHETsChhNb6SddXYFWTzYY3SZZZaBEmD9NpgAWMbbKhQwsT4MU8ftia2L5azMFKYH5IW28uhMMJq9GYCXMQmuaDj3Ex8wIbNUiF9SfNv8Jm9KCO6SRSLJLKrWJLwVIXnLIslksvCEyiq8pMYiCCNapQV2HYQXUwM99u1kW7ZbbA2CwD1yQOwPAjIvleXEr63ZgVIqMN6v2N7h9vngHUijkDXhxJSdHy915F1embqpRZOZf6rYgidqXsb3xQpJlhJvQoEuW4ym760K3xxYJ1XsssFIYBEkHCMiZlfCbAZ,60fd509f32d39e0,b79277eefeac4f59 -fFArwNH5YPSg8tXUpb3mue0TGwljxSQbPhOC1OMlfzlG,e45a2b825e4a8ce4,4134c57e6ae9d0ea -FZUxsNzZDpP2goeUAJBVnEX9eKX3vkDKKKW0aMNl7QWDttRGBKbxgxfSWLORBoB70Iw9PPEQ4YVuwWV9fqdK9DQa5b1Kc5DnrwUEDFd05WskdO0Or8nKwmamW7ddjspFxgd1DST6nq9frahFW2OIYXLHaJ9rV9psKwTIJMAPqYOjdGC77xIS3iC44ZbAb0YT6qOM3xxQnjI3vnK8CT3IWG0b8fpT3IK4NPNRZErkkLPSNovU8AygHymVd75B539MkBRKPW86CITF3ZWsv1VAMa75d6uwkdXZYmAnkTiteVsWXOjREs7ysJy8Xtan8ANtT0fhWmIpXpRHCtPxWauxhCXe2i1DsJKPXXCwHab15SD0wZosi8S9RyND5mE0CYtgHC2mrxLx4gMGIQ7sEed5HYGcMQXFLqqWVBOoVi8z1KONkH7oXSPt1ity4ZRtDcP8tcTGF8Lrk917aC70m1FCO75cUdJOAZVZdxw7T9TeDA1k9o0EdhA38acCgf8g9jZsqjOiE8lwjzuTJT7iSVh796hUeEd9CQGQrbrJLSSwjCER5RzpdyhwT9VodMbu9hFHOXHn4pND38hMSsgAhQCwalizR4WesphaQb2d9Ukn6FYcpemF9qXky4tRJNpAdkCULK4MPQ3JG6sGHxiHaJhZ0qNgHQ36xnXXdQWqK3zKgTNSDR2tYqQ19KaJq6lZl8Hr2a7ip8kar1D8M5JdtkZKc1xemp63nAOsB0LQLpYSWOZcGTS2THhftGQltHJ23hJM5AdChTCygm3COIsytbS7MNWuaTZnMaBn89jKcfnxK81JuHguRWfIC9XFVmcGm2rzSnjtFLi54yxL8pmkTBIKr4Hjk7loxBCnKerW8xZgoGrUt09c755OEJlLWYkt2uEBYa7n5A4ETgtRjCFwBG7GyKgzYl4QK8hOtK9XqktITJG6X5YxtCUxjkaUsIIzy3pg4cWhu16NmivTvqIs59FgI62q,d2de92c0caecf0a3,19d3162e834f78ec -NUEzLwBBVhz6uDr4Ndre8PFKxyd0CktiLyO0wX24CD29G0w7TxaoSmlqFx16jECNi7f1AM9QQqN6vFWo9PDTrHbJ3fZkOWFTE6hQNENgVhkgH7KhvaQlZQm7b5QVpALbm40kxKOKbHdBAxSh3KtcbV3mAHYVJU5JBdon3QcxefcCzbeZ2T2ppOI57w6EzO5mobBwBJxpZonNe6JDPo6gsSvK8rn,a7f948bcbfc7a52c,1b1b81956cb9ec5 -9SBW4ZIPfwv9bmI3BagiyFwaBeDRFbd6Wf1CuErvWpW9z0PDis8gPKHMnCQFNOH15qFkc9uqHKbBi0ncbZaflhVg9hKFzMciCYtxzsyqE8AvRrN3uwC63oBXiPZUn08PVygIZtt1J9wpV6xTqVmNJbfUPE7E1Knm6LLnWGXhfc3KLBScYj67CrgzW5V0EFWEqQpazvR9cFn8zzPlkXSBvqHn8mQutlZVMcaPbdA0x9a8ep3AnqqKawVfw2ZTGVWYHR1A1vjUfJFEWqoW2XtEjbJnwyQMloI7wpiknNvriCruP5BT2m4Mzkzf6MCuC6fo22wc91otoA4n06ZQ9WAsbZE6r8hLJUjHgpzZ8Ts41bxohuwHrp11AiznflSkJOT6Yy7LZ0XOnsczLSIQbqGNLMhoV9jW3FlwDUZUuTYjPFXHku0Gc85eH0OTWFA6x5ukqSm8jNEXw6ZLd5M5Icx21bci6djeyAwIj7H4OaxDWbOk0grljCMCxkAbUPE0EBG8IYGAazfDsOkVwWFKCQlnW6AElF5sxSoG9C3JCysUM2bWXtt6T1kcJmGi0TSiAjmEe62lIRxK99vILvVfZYxEkhCRhMlapTGq9rMrfhaCMPVYdrVbBIiGJ4KAp9QCIjgRCVwkW16SVgz8pZHJdIaXNMNs5urFItRvlVLNzzYHboJ4JnuwRhgf6O1IsW0mK3KvP6jJd7bS5qeMy5iLWZuggkgIthLMWCthOvo7uRyVOGpVZDuXP1urWcudfXwoyPSRPqOaSf9L4Lo4mkj2BtF0RLpMV1KCNjNdWk8ibX8rFFMzxRkPC3oA16GcLkh8ZOJdzMMV7Sbix,165322cd114420bb,6d7d78817b80d6cb -5XOwcstBXw3WuYqg7ZHQDm9tbWqw6h6H5eganh331CFLFRGKo9CayvtcRKjVmP4q89bhIYTUICvjyRz0cjOx7o70su96msIF6UsczfTWaYuOG2kgg9ojY17E0VYHOxOp3JenNK0k7zGUHX4IQJ3aPtLvt2bq3DM78zHCRPd1gsrQUef1Q7252EyXDTcEcCvDO4OEqOobappxYLvG7i58rfUJpxtCrEIXZ35Jr5IPJQAaYFQkN2MtYRIXQ6u7N46oV3v69JXlObfnHpXeRNULmNyiLYFA8vtEXkAJoFIlS0lvkdn1HeF1PgJnNO0MDmeR8b1e0jDqNyp1S0gemub9J9et6JMsDawTw6xU7KIsN3DkEM4zfe7tG3anyR7OTswlnRoQirNKXxp3EC2vFZVgao0gjsl2QZqEuwGPEwIg3mrRAirv78mGVIdk820twpNaxtvpeixXjoXWEzQrdNfAsrLlBaiqa4aSpS19xduZ63vRJvHId3J8liAQI6F25inD2JukVyTFhyvuwn6dEHavovWfs0YbXOjvR8iS79CsQBz31ONBxR9djsxeUwcF17Js1Tm8qO7nRTEdDAdcwcwdeEMvjxC7CmTI4kG6LnFxIEo0S4cMBxB57HYj9Li0i11Xst9Vw1B4Si08UzZXPuDlTB9DMY8O58dZ41VJSOK6BN9FmurrVEt46CwLRiaXd2BlhVn1jrF3Bv7iC5EsEMMKuVIAejtAGMUqx21AZwxxXGBq6TNVs9qaDdcp3k97AxQU1ndCaJZLX7WkSXg8o4TqXB,b137c73a7cbdc144,44b75c1cc43a3dad -0itHoXIQtSovYhm4U2d7nzuvolxy5xikYNeQmAEEymyNLZGsoXkhJfQey1EMP06KDPuO5k9nVKJ0TmDCp4FNDrwlZuYKEqX8w4SvR9Lz0JWP7UleWcgXAKwfdp0D9QWKGl01zYR4LhYQ7HmhhdA6IVdt5etaH7soVgtQKSe3ncnDNZIhYH6rPR8uXeV8ClM0BRit7MFwz4bblEpn5MDFFwfkEJ9KtRW5aGhKNGIN40PDXKGGgUlAw0H63WmuG1q3dpXKzoxpdakTWFu9CDJH4hqcRknCVEJXI8xwGHIVdJl9OPjlfjysPWfcwk283DeC8mvJJT6cs43SLiel2i3v8UOwMy14dk6U7R7xEfTp2h4xhw6jtMr0gNeW2gIrOhVsZoMKB2psPhUBSVuCJ6yfa2nyHVJz1U9FZcf5evqsNLYhahSGIhDy4GKIrpLbLZy2g6at6St9ocVI6EzG3GmojgdB6c5FZoK2HLIIaP8bupkNliHC2k3XvoDItlwmfC6KhxD3KTGl6dbVVHwyAP7wa41zG5IOcroKWNt1iFwW2GryyweIWPOG31KK2F3Dam8wMfb6TJXCAPrqmnHHJ9xgTmd5eyu8gaAELUAVQ5xs0zMIt1NoL4kZn90QXc9pbFMQKX6sNr52wt2QBoZZeIk0DO797qQUYMeKkYNVOg9X6cyJQjriwWEER7vdZNHNPxmKlJb93nbRf2WvQIvNxf11ZwEZz6Bdrvlh87xu6gMITURa4AflWysXDpWShXjYOm73fkW1ZlpH24APoHnrtEm8uJlpRbod0XLXupX8FqJuQs53BHwCuoYr3Wcsac3NRmsUu71VIWLcL8OCqqiYEA7EbDhaO61jiYKD1IcEhVxyCS5j0SotHZWFReiOmJFWer8oDbvTYXX9cH6AsOJnAEMRkNxnmOBz6SCbpvXm,ee22c8964fa6c54,cba4f235a7e035f4 -ED7ttIgr1gJZ4UIlAnwDiOSHQxlDjelEyHfUbmBpelYoCrb4jltNiqqm0UXj851U4N5vHcV764WpkavWFTOdmmjXYjPTQOjiVxOXJFdgyRz96enKwQknrW0HPeZ8bbq4cpGPS5cR1B4UdUGveV1iHxb9EHq8XyoOkSfZXiCVjLNJY4fErXSmn17ssMYxTwMoUE7cjWLIv0UzvXWPoHdwlj5F9R9UMA9vQPMcrkiWEWsCOXBCsYfYwWhAD4AMEqmKkbDFoVWS7UJp91nUHeltpsEHTMJyQjyctBKuF5tseLGlgOBkJJpdm675AnuSloDq2BQlAr3lc6vmJ1VVQYqJWVhDzjNSthaFvDTA1t4cs4aXPMbFXsnoxCHcUSHKAiOdq2508SWGTElXNJYHJdfZworK0w11fcLw9e12hqzW7eFToy9vzWHMRIgLccX2RII0qgJyY6MDFI2vT0PMdR6eCt8HIHdkAtzZz8olztJRi9O61TudhB2tLvJM1STrL9yfj9Bky3SDOs2R3siaYFArOJoLdj5HD3bqiPYATGAdfnBpMArG8W0jEnhiSGWwXAmKFfWxqdoZewdqS6mSkV0njgsyeQXH5EDgbPu798mR9LSyImzxA0dlpMYeRc7lYXvAAbBsaZtrsC1QqpWBBdpPiqKPaQe6IekdNgtKZf3VSrIOnDcdaba23NGcWwN47p2djKrvZDOydlkWLO9zbKMGgVS9tda7bmeozJhpZIVFkXrl1lg78X8mFWpyZBjmD1wehXIBNH64rFqv6JNBjyZFQUJ3xXg2peaRNHgLFEnECCndAPwG10YwXRtxnixZwGV7d8cHjOx0J8WXONXcMXsQqPEtSK0CVxzqoGO72qgQtnyAZkJBsePwMQUWcvv0pSRClv9DqjwwIX0hGEiWdCultR7us5f8ATHqEIRSgFdkKdC8GmZ5d3Nr94qFjKiq0cx2e6AgyEcMJ9hJtq4hgUtMvfZHx0xbVHwO4,97ab8fbea148c8fb,8caa5638fcdc864d -UX7wAz8apmTbrryVs7JV1AWhICZ1HO0HuH,c0a44c01c83cf9a0,7c2e59552b925962 -E63rstvDRnmGsSC4Pbsmnbnk6naljEVXcmeP3DbVHVlqTqsJP1EU1lJDcW8DXwwy7tyEdTWgDfxDLLv1aDKCLs41zliAadTdGekpu8FVC8BetQuKdZ8HWQSf43RMQL5UfDrIvwPNgMqDPXJprzummryIcNXJailShW76qswUJ7ecKeGRnKyaQt9UikSRLn6mQVdrx1tW2pX9hAnodIC8VdJ2j3Wmbk1qxX1a4ayDaI4AJTzAbgRq9hcUgPHLW9JNTqGhNEIe5DsKvobqfxJ8KlBmw8U4ZIhiwIdwcWf5tWXXvFcxlQ7,ef81a066a3cd9375,b47ce2ae36617a3f -ST6G7KjoWwWzEcfQIVMuvi01CodyvCMsOtZDTQ5SWbfelyTys2jt3ji4K2EB6c26O09DA0rjTlR64jcJzjsNItxfTgS1MGmZGYVyEt5tRMziVxJSJJDXdjgGH2HfswPZ3ZkAyErOKhjJiZsmMXhEyyFigue03LEO8PaHbXDroAfKEDsmA4zUpUSwmy8CIZoIdfxXThANpVzfh9it7jEGqOCcQnovDmIbcCLB2CaeBcp0rwC9oDgEZfO1D7TPC2UK8yhy5d8tjU7HURoqB98oCylPyAuKkELWXzybCcs5ppgdmiOpPJ1G2pJ0LrSdPFwTqDxkAZ1sJJrkdPPDg7GY1BZ17WW6DNjYSEMekLJ1uQgCegOJB80thF8VO0Fea7YslabTs76yfTsyMz6eYpVwSM8lxXI5lZzq1ZUOmXnCRIaAYvb7IRypuu8uYnopOoLz5Xzm73bQBtKkWVxqR1QAU1Y6iwY5xh9CGKVH4RMo2kBhGHVXzdCXVeWOvZrJbkFU8PxgdJiwhOy8oPGQAz9t0gBnCfzLvieKayL7mxx6dRTF7kn2RlQo6ZLFtavMp6t9yXLixy0CqWUULnbo9k7CIkqwoqRCrJVniBmGznQGWDRKIM4f9x539d,c71b7beb4718c155,2d57f65f6c421add -B6przfY04IDJvl3oM7v4NTAt3aH5Z5GezW3Z4n1RI8ELu14p2d0FpFszNGkAyqq3YQpIUpa6SNxOs0vJK3M26HeJbFtOHEHFxKFQL26Sto3dZwZSwwSv2lpPV9ggkv5fO1XtV3Sdv4I0H12ALfQOXtjGpwB7m3jTFUi88ZiOMHoFhoUVHaLUbhWWjVBggL8Nib0D2AD6fe2EX3F9bLQibn3G1y3KE7C7uWYaTKDzPYRDTrLkIgWJeXX9vG3Ue0bEPCra03w0dwAxJKzah8wJCLkjKh1LfokK98gbvMxEXS7TEtMZ0jYSoSSfctAXONEkOjS2wDKbj6VfiBqsAx46O2iIGyeK6bA4BHCMMuzgVd89lR7do13ckduJlHghjnNf37cgwHKvR,242a9c983273d91f,c2d6a6e0ff20ddce -yJD7YtzG63iElvPC1O41wXsY0kSITH2a0hWKE8SetRQrVUTHTScPN4hCkuaugwYT2OifJDtN8tkJlkLr2kQDvbpHf9J0fO1ytkLR1paBABvLkQPj2ej2ZRRc1fakxG10xMULPRVpGoXNWYWanztAo7oeOCeHnJu9NF5b1Yo8ZK72c7dBiQDISLrVv0lghavHpkEUpZfAKirWp0ZgSl0IorYgSJRGeJbyB8pq5e56854oNWfNVNOukBCV2JeAbRXBEpCBrF9WiRgBsr2q3lBa5TfD0d6gN31hYEBsbFecMXEzsP59ETyq9uETBN2AMai3s02FKgQNuc8AJFHJurdVj3Qg4YGrQAl5WnbGnVXrVKCJRA3r2jnOwqPaMh7AmqctdS3jjFtYFqTuuInDRaHAznR5KgpjQD02ngZ7bTKnNzJLXwHjqjJXHNpponSq2zJJSrTy6dzLhEvUviV4eFkcK61PBz,286f8900e3df7ecf,a5cf239cfe153b13 -NWmSMvUw4EGt7BEWxguJQ3CHLCE7puZtPz79F5hkIkVjVYjafGewoz7zOx9VCZvXYzoDVv7FdBHsyNhI9wXtcbEax7AwGmMUWJdRgSr0TQjjS2yTd7SNnrsifWjWt9IcKWz4MQyzuz8fnXdTEa5GBni6WjUC3N6wdKetqqCbbhXj4AmK7CEJlunDPkxvBiZtJP1jAFWTOwyxCrbC6O4xElTjrjezyohhwyJDmg3t2TQ53t37TIhBe3rcJ5lNDJHvxqCqn2ZGW59qvi1FiUNTJQH5os1oXh4Q9RppWaTsYWun1a2KdCX8fwNya0P1RvMlLh4j10HP9pmDeG8k9dYR7nWnewQsTAU49VzHETpajFpUDxgzHiJNCcw8onO9hOrlkIptbZFiHpF2Fa26dMtd1N9gc,5c9c888632acb0a7,ede3decb023b38c1 -QnaNV6NcaQ7czFye1eo81b41dVmrFcIYiRKdTaLfohDrRxqjgtzlJP4HiVMKCmhdSBQ6Zdn5TI1olNRDnrsNnbA4lPJ04YR3xll5dO6eaHeaWsref1G4xNMinZLx7BAsNFAh00PLaU9WHi9A6pkaNAFeLdQyN7AMmkoJp5B8pKJ9Z9UZV6Syd9ccjmBKDUxFKlrb6MjB5h74LpXKpkpP30unoHAnpEqgCry76Lhv4iZrbbQefoAmOr8eFms0LBbxUp7TFvyE6YDmUAfyCLBGpOZBIjILlNFgriFkaURKgWyn3WCp3d8Z7D1ZUJGPTiwGqqX27GD53znZ77FYEJPhlDP58XMTikoc6fA9zLJPPFXgx6DjG3TuOb4aMFtoypLMzF0VIwdgMrKQr9wHEwBt9AGGp9Q8Lbqqp1BmWN31DPT4ujyujiXYqgNUHKOaaKgQp4QU6SgDUbcz93DZnfguR3mOn2gj227jVK3U81pewaeqsbmHWD8nLbDmIB10eT2NP01cILv3QmvhSGALEYmrzvSk1R1wo3wd7Yi9csf44l0JEymxSmRYYFCWMxDsSg9Km5ocxajW8Sag9EQnGpxIuuN9QnOZu2xyv0cepGDoQshOTc3hK2ECJRBHXiUxYnybxBjZtFBhpBXGeTqGoTYQQ7KpgejgxTe2qNACvtzHswCYav0mM5AaxF16tLbk2fh3qae11k8sdr9Uc18jzFwxvttCAgh1CIoSPDurrMS2I0cwN9YcwgraM7i7yvMDGN9U15mpyWV0ZEli3ybGiZjDhJm7WeMpIHnuGn37abZNU4KmkLegUwAgpdEUioLwhA7FmhArjLkxcX58m0Lr3N97aVw5gSHq6zZBF4SUtV,f04492325dc6158d,f05910e1b1f34b75 -SZSOamk94zDcgEDPkQ8ZfWFhIG2h1reQbdYD6WoV6kaXMeoPepb8GhySP8dUEtmSHvQkFyQGppBTQNOgKKiIIMt5SnEdhlPz9PGGQI6AnrKA0w21uqaXgzrPUU77sM9OGVrtZ4EOb7D0s7Q5vEg1FZ0h0elMr9xV1NPpqmAJCwepspp2OBgSCpbzENVE3yUrlfEKheVzA0d3J9INTsUpdxUC1TBy31aWN0a9VWc5t62l4yImG1D51BJI001lqz9VbQk4lEJZtpXxqhplL00VyIUmCGzgcP1IBlOL1hB7Y1v3FAVcc3Cbz8r9A7grHtnZCzT50OjHUh4bzg8QJvSo82hoLTgja7Udq00WmfhR4HYjmnWmTM3ZzBTxNEZg0HrrCACSiOyKVAlqkH7WC4PhLRjWnDBM9XRjdaHvoNEgk7rHDvgPmNi0hhqdhk0DQdizUSvXa9JL1DKFfI7TZAlfL5cpPJIDihdoUlUC5FWe7p5x0jFGX6cXbRrS6isscD47E1J9No3Rns2YjsXcieDVuE6zizZ3EGz6WPPHj4ZXJLgr1TwxWBWZlwynIDqbE3p92E3GxAa7pH2mYLpsIK6Ov58ztknWyCHTIE9PkJMj6YZ5jPCbPe4Hoz18sWavntVV03RNJLthN1Pzk6K6rEKytnBm1D5mCqa8jUoz9nOko3NrJoAe3ui1PWVohxiLIhGKG9q4Ue2ShzvdUYwZ5B1JyxSn6bKdaMSgdAtRCfOnHdd3dzPkQUp6dlhc9KRWBpEYEAfHki7zxGzYX0fJTqVLmHrNKdO1SaUwtUUchNmE9QGdpB6,e301d2d06eaa8477,bf36401d9130de8f -99JDaFpewPNJUdQXBmxhTTnZq32H7ZwdR7KLwoVm4yVy4VAZRtxprkZXUiNyGzJBrfZkC19jcMYkhtoUtMDhkhoB0N8kefElzfw652iPUFXkqgAHdd0e6t2xbYxlXhTJ4nBr6l6DV7vRv68A8mYdPaXreAUXUPjFDiI1h7JHMRxzkbc1hhGlgdhh2LDWixWQ8eweF6QOzk7R4x,7fbb0dc7d157255d,f7e62435059c5059 -QRtijUzVipv0IKyXrFVepudLutGXrsWLZ5N9fOXAujs4cyuQw8hE1z88N6reLJVleNgkhkKrU1Y51dwLkSoRDzTJ960J2yDSt9B5Q4Ps4QG6s94FbTVDNScPsuJrX8EPg59DYSKHZ8F6NKFuZQA3DPzhxasQP1MuhA4olKTDgW2Yp2AMRq5sMqYNdSqgntB5Q1bM463bD5XJyly2x5Y1tefgLGdEyA4ngRebKZtHApxUcnU9Ff2dMjVYIg0M4FRh4H3okf2ev9Ek4qnjDiyTnAVvDMxwI9zOp8GQD24hkUYhDOrqmQeNlAo8ItsvOEo5aIyHThEDnfGoE085P6NJgnGJ6jO2KUXOA93CYYDPiY2Hsdg4FpltRJKI5PQC5wc4cidNEhzi0Zui1sIcV30JqtB4jF1SBvDc5fU42BZLGnsGEXvvasUNiqdIewOFgPrvBO51esuJryDtYx8TOEGtjLV2xnO2XOMAtF4E5WQb3B6w1PtFLgNBTCglWVxKLCpnKB3WDpL3j7yIkGaQ5lRNp0RDjJUqkFrrL34dIeQRmOnixb0FPiHUUOy3NvChfKRLFMAmkrd299zH4GbmhgrlYM3AK4lLf2jNfSbtYsIIPv9OwAtmebDiEvFSVo382GcGL9bgEOWckrUFaTOv3xC0dsqpa0F2nWrvExtmisF9ShGE0jLMXbXfllvJbGz6,623525af489cc1f6,d1050e92f5714b35 -eJMTsDwo3QFBS618VgfBdjUb1DJsyVx9LbdVSB1lze7osQGoow9ccUDIOkLziiV3cmCwfJvR7FcVxLSGCXKvHHd9uITo9JlUfjNSmiFT8rxsnG3feQBYCdKCy1vD01peIDIITYi8jeK6xbKlQGONU1iFFQP21h8Od7snRSIlrK6sth8Gs9dyZzuHUtPIbWYVksfswlxmt3Sz6zGDnqujlAr4VmywR150adiZAhTjdXunUbHgRQOH61XJ9EsZYva3BGGKUKgGrHIOfPcDJYz8tiNiQpsw1511cuuDPOs15BfOe0DnFINSY8auMjVFUzEkkiDS9tqMa75wO3Qby7xXiLDZv2ilV4Pgz7nvlqIz1YdhM58vnLhLA76BLeKthBjy67GjJSJHqZ7QzLsApt2mp3DqgbvpOtcHdeFYTs1T92juEuXySWC7AOnng8yE9BCarrVL1QBvdRkZv5jXVpdAffVxyvCPFedI8BiVAks1qXqc1oP4Qybb3argsCVQ8OZUBXrns19X8u767tNwtk4Pw53PbAAa0OHLwSNW81TL5XIpGuKWpCWi2VLDa5pBBaXCw7tBdLkADte0BoFmmYpwyAM6D4hMz8DKnWZHraXaOI0g6IrQpKu7dFmZNiIEgqcqKypPNB4QMi3gZnSDqBvqZTp5ji2CIRQ7WmTRSJkktWbpRIFdd,12fe151ee6972548,44c277ed1df2c1be -bM29Sx288zVqJdPohz8DgrGSyVE4IMv9FzK56y0aXahaYHuoJ2zCBSeDTWeqmz7QrWe6EHieaqbBWf7cF30qvxiR3O41WZdKiO6r2idaI0xT1atbKooQhE73Y0Az2qlfIPZ,a846ca6d84ad2f42,b8b46c0e88acb09d -ZKSinJEpYU2SIYRtq9RegtjPDq0DUw7BX8MWo4pANOeKYH23ipHjRwAMX8nBFOoViZQgIKiy1kaE2IMa0UEQlwieYmP2IASRrMin9dkJ95ztqxwP4H7Ni2QZIgS2fnNKJl5sjzcuj1alu9V6qdDWv,8d3f4548a781c324,180492701a1fc72c -NAcupY4D7JcxNScnCCUqYXbySC2miz2CNMsKSZkfYU08C7MIZEjDEntQSnznJI3TmtvyhTRbNw69cMG3L8FSCwS36b4KBawW59sn9E91FR4Z8iphkUr7HzkanGUO411cmuGXgoEzZ1TxiKJLNZ22LWwNvnuiJ1APs21l83JtzaxMXkqhfU1WYKh1ATRRAhXpeHra8waLBFd7q83VrJL7zZa5ckHXEWyuLQxn9VkRsJbbOY5hPy2mL4VxGXmXqxL9PS5Ubg1PP4sEJZ9iaOJKOCNhTrCE55NMUkGENyXvbD7a1IIIYOfEIYnUMf5ebWhMfseVYimJKzan46TznCTZqCteOlmEMNh70fChShGZtRyACghERCuCHG3M2kYHlIOjzjrzxguAIgXfycabGguDpEwLx3ginAItGEA6a09ZIOqIoJzFeghkrEoTI0l5Kj4jHkAwQjd56I61U0qHTRONsgCoCOtDPNiMR4ClEqCZMGLdAqRjKMkL2gG3QRE6OXkvpoP5Wdw9utXz31PVQJxosQg3t85kSHwDhmRoBvTvRx2nQAbbeRmU4k0aiNx9SUPBLIqo49FaIcx067VIRhFLbQ6dhzeIPjYtumHFUUyiOB53mpk9Xjdjf3CMd93fpeq1QKOaimul8fK0XgM02CKBY52vW34TZgtpI75riAK8BToyBQvccIH1N3fH3ehRpjIAMyC4K3CnmczviC9OwO8V45s6s63b7FQ7le35CiAQJ0wWHnwORlPLTbfJkTafPdemiiX9d5Z7H4SIo2C24zyyzkAit6CJ1g3mpOL,805e99cda1b8b877,21a73ca7d1a33b8f -cuJ6mpuDwPcuHPmsuBH9SmO2vKexanZfL2JZozflyxILWjJcacBnvJ4rFqc7gg9AQn2J44M1rk2EJul6Rg2Df2NEumBnsjJj1qlOEJlM4CoR0UmCgyQ8aUgP9XGeV3YIa8BBJhUQDsavJJsYOntjUzTuSc0IWdyop5hzlZBzlo8yZW0Ef1fSLE94ADUfLi94xn8JJP2aBSStxQFAkzmRkuDW8IGM7fFVWEsOYJK5SVaWu7ZghOI38nTPzAsfnS4RmwZwxvAIfXPZycQN0Rd7m60B6hhSh3v89BCPDGzvHgRjXBcadbSBGNokeWUcpJeLChqP4Lga1tS3sO8aIhn5brP29UFV1luUNi17d691hWUcdEdGkEl5ZhvvrJIsCNgr0JR5W8WvvdbpvOLsCcII3Nyf0O1pXr7gHDowxiZPc1pR2zlszd8W7VNTdYsxmjx2WaWI2YpmiSORn1yo0y9aKOwDx7QuxoZa8E1fZ0OqpuxPeRxjowf3KWSlS0i4fPiNmTDhgMi2agOxpQtgfbS786OvTSSl8ifDKzgvTcsLJPIoOArQl439U1NHgRVbiyPOcan0YcVwLfn0M1r73fDPYj9lNmNTs1upwvS5U6y1sucOf0JN2siYA5zIpiiT7nzyQ8DxgMEwTr20XMk2BHbTOQ81dvu09EbXT6T6H8K1Z0MpMDScE,bedb2866c4487a26,885aa3baaa0c238e -cprvwxLXJYoSFhMF9lbg7oFuQwIXZAeriBoAeTwlkoPFVOt38hpNrk7Haj29BKzQrg25l0CdjbeKmP22Wt8aOAQ2v6e3A9rBGhbQkBfAL5c5jGkZkch2nsAhZn4WeueQ88VFiBlFG8r8yXAmnfX3Tf1MOdBKdMdGtgYWNTda8nwXnHIH5F4Pj64y9js7HHwAtj8QE9VCRpzuhcxNrZ8QmVprs8z4lsVpKCGD6FlSGlS2nmrEq9wU8YSaktobdFPu6RC5Q7ub7JJihQTF46Yrf5ggnJndJCXKo08e29lUu7EiFtSkOddaV1Hes38mvrL5xyjfds9QinnfHC4uJTYKL4ZoM6Eie7AG5NO50mdcxyVfAopP34L1rihOqmHn5JwsPtC9grDubnaGxQSKrhlGXL6pypBUAYQ6LgJdTO67YXGhAtOASXQUZYeExBqcdg0NhayMzYMURwHWoCMQtcMC4t8aDW7HymDhxsar3Va7PABfGZOuvATVXpvc7V2T1UVkSXBN55qXqHPv8wMjva4yX2P6IzT1RHzaoKfSVQhYI1dzplKQEO9G7DOkpCpe95cAJJccocJSnNB4H5eZWMarsrdEZ4SITzjurldnGaVM6Jd2MlJPjwoGA4S4Yjw0oyeJb5bjK9YQGV0J1or7GE2W4zGnQMewNOFkicpHuPlkTT3ucemgvkUmKluKUkm49RoPLcvjpJYvkoMwVOOjw3xxeA9f2dnYYWDrjRJikrgFgmqFtGG3lyIEZ5TDFOhAc7NaUbXzuo0TiUMy0Zv1SZmckDA4NebxHFR,fb308897d90cf548,dd9d122f8d51a3da -l1SUkUt16OAWkSO3OH4Oq4CZWLAgzmhzT42PoZdR0xlRIxGiYw6BlK6ypsRLP2877n0l1xdVjg10OS1xCPmxqzmeOlo52O8C5jGCUvP2se58VBOOgGRM5giksmV9oo1hmDRA8HbZH2iHtHD3douCAFyj2zccZ8nuzJZI75tcA9giOWJye7CTY1SgLC16DRavJSxhiVIbsg62P9rkWfHnbrdWBd3Fi9caZ7UruOPc1AaUjHCirI9jif8IPy5p0HXRbJYlYLJfzuVufYFDVyvyKhJiKmp0fpf0xMDISwHlt4dCFapm3WTv7gKpAwuA,b128b027ba10d6,e8b080dc3b4f3c22 -wlNaws56OJbISS1jKMplr10p6rN8Iy97aisv6PclDHdasyQIvSUqISjwKObdgtSetU4gifBx9UDddgfEqicKormyN5kDigXErwVLV1MOvd7CSOzYry9rUz8dpUDGryT88IavNqOvdvqMjRvAUDyM0sKcv2b1cYgWQxruFGhMGx25UB9kF9hnx8zfSGfjPa69AhZD1dK5yg1VIiVRWZQ8ZaF1UsGXCYhZ20qembPVauQ3dndPjSAMwkv17Lw845FKYLHA0PMZ2MtdTZ2hP1Vn769mJ71QpVptPPXfBd8mSWYvNNAjPliVgY3K62RNHYQv2i6ieJ3tyxNcVEZr4SvrdASeg0XLqs32WFyzBjaFGp9Nh54OTj8fAF6c3szOWsNS37pbSRf2K7gwQHWM7QrSXfcCAPvdjVRi9A9gH9NGmFpv1ugYSlmyXoCdtH4VmvL93j4v79956MSqXPFq6unDgjQDvfaApT3OC7uORGscMOwdHolK1GTYhTdo1ooWrKvXaW6fbrYISD0OPDJNnvcnp79GNkp95L,aa940f58eca31553,b356d3ce8fda78d4 -mLvl6U04EM0pOU549uLM9mVJyExjDHOG7QVk4uUdfEOcAH7iisfSCSMxrYHpl49ZsYCOV7hSmZ4uhaP0vHiEL1jJCf7NFAO1tPQvvaLanHNzHvG6GgOWX3JwwfEoBpwYS12pS9dt8MUEFDqpeX2CsGYqGqkSHmqnNR4TPyojPaKRRykgsaxa2llj7GYyoVSjf10DJAtqjCFMWQvmsBP3ueauCsjuax2mWfMDlAhyHRuHPZmvPDHLbwuXzStgDMnuoIbOMUYLgCRRnNTJdqawlZs0DsUVXxUWgFH9bWvTMbS7bQj0XFIScrzBcgenX7M0G0MRhiCC4PCTn7muZJrPJgp2bTi3olUXb2om4ttCDsEOs,36503f2b9bd76ed5,62019872b4adb4b5 -EcpTewHrUsUQvzRZhsWTDeGSkNnVVGgDBdo4XSDSwcZIKwMsU0ajsT4G51ZgVbFCCikBx6hn1lR22fUjh9QHDsgoeIwTrUpmk1rRCxkkuyYKv4AnaDqaReEPjoqi9NDdnO5v7EVttOMT18X5Gi5rbY6SBEHwFB4v5HmjIEm4SVFQ05sdVMEUkN0ZF2Mt3MeaJplJmd9qd2kUPmx8L8rG2dasjdWEmJTzHyhL8QWrqvspe9sOfz6LRt2SXaQ8AjB4kUyrBXQg0PnvAFdd4s35Nxx7sDg9hL1CBZ2uytdr35ElJ9ADmlrekw3baLOKOYLvslctpfvbI3jXMsyXK36WEveM56MW4OUNIpniu2c2MofkdIaP5HQh1BPy8CNgGuiEBDgZqTnTRl4sPRnfRVJRJSRyOqdLLRixePXO8LcRhGkdUiwENKjIynDmEuOuPSFUkBE2UPoLTfeQRnhENYTRNqU8rK8e3PsJfclaiWftU4OAayw7WhbbRE5rhGzEK29GuDLBd1GZA1pGy9wyhTZP8Vk1E2E2f6qiC5AoEtsz4JXiJkn1zyZOa5MacrB2WEf7CO6fr8oVRUzNU2PTxwN9tOw58vdfa8nIpcLabfORhqanRYHtaspMEgbZy4WKW3G3rJDotbw55oUo7w6yEziZbC35yJgoXS9665r0eH7W4guOIsuES3alubp89rbFvpbH7XXZk59eyf52d4prvY52AHqAPW0d4tLovWXNVN87eyiVtysdXh7tbMFWhK68ZZLcBsRHiJYmDn0UXuuiNIJ1eUl9nqRvtQ,a23700b40ad721a8,649bcf9477342606 -9QoxiG6xxjlnStTKb9uSZB7Lj4IUYKUIvDDwLROdGmSkhEe3hpQRYKARLOgulg7l4C0wtjoNLeRrSxMIx0yJfYBpjb5SJphUZlBru07kBMFVYEJ6zPhvjwy1kbf8yVr3pO7ZV9QwaFSMx5GoMXpnt8sypcfvX37nSeIlkg5SQQiZwM5ITYgxwS6cEc6yGAvPRwCFxbyybGuo4pbNGhb1loUdf7xFbb7aOWNkoaZ0PLrAs5ZmRn7mZlngF0seGpzJWCEGBgKpuGSMAIm7Zp0iSynBmfZTSdwpqOy7BcKchxqoIRvGB66HaqaVr6Rz0I9aLqUWODyR5RbTsG8DUebPrmLZmmti4XM60f49rF4O2SRfJnzRx7AlKBS3MYhrQFMPTy6YKYIVzItD0i5Bl2jLMZZkDLF47oTYCm5HYIYtGszw2zMUKxVYzYRK0bLRZbYvmkakrEVPkVHN3PLNMtcWS0ZNtERFOycMMPDVG4f63dx9r0BfV8HfKvbob4AC0KkAzSmtjqOxwIzEqIXxEUhuqLJTAsMLvnIsohd2cpNhJ2LC79l7YZ84DAj2SZhiAtI21hJhy15Vyc3fdWZUWlEv1pzONH3WtFoeWBhR9HyTqlcvGYvULQZPfR2A07rxTFyBSmNOaOQ8K7AFiCs3ihmMJfxZnFYfA4PDi5DzhCyF0FKSSkTRJxEafMLbSsCgAfwSpzR2i9YzgGzVsvh13UAEa6SXwccQaBPyHlg4flJDjppqiFRXZwBfAaJduzhjggGAtJrL9ZUUORHvfEKKx1SS0Q28,874e82f04bd56c3a,d6a81017322d4b92 -kALQHzPm,a45e765002a1a2f,14658b4e3c6b390a -QnqkadxfyVUnUjvneBIX93SPKzrsLPjIBlr3CMBnG981Q1hKbrSe1qK2iECigbdsydMt7Of03qY2gnq31Rsj8acugpmKgUkHuU9JbGFernEEpg9NGf6KYElpLCngN5QMZJv4ReJ5DKW7fxOv78uiPk4tkIIGveAgMyrVXvSOrOldj69hBMkmRGsforfPj6pGICMiNQWenuQFhKuktRECWzwM1LtSAP4vXYfaatd7jltyyjtDqg3ZrKA0NUvl13cJtk102vDHN5I090bkiuGpIWtDx0OmDD1apQLiJtujOV3SRlctLK1XKbmbLdFK3dOejDq3rxytmuCmhwHT5kiIoARZI2OYGmCgnDuUhd17WfBiI7f4eakbEo82tWIUUechlIhpYr3rxYtBqRJsCUWbQkS4E06j7ZzvtKz8wdRE781sYiZg923YoHjNDi9t4WdtdHq44Uom8hlBoMpdgPUeffXPwLZfKP8XzvQPlWTX9izTJtasWdk6x0ASgExOZzpuJQcaiQmKsvpCooFOpBADMyfIDdkgHavJBCPwSnIjhNQZp79qtwwNlKsWUaAQj2Nm7tMikMu3F248zIgu9Lgai86MllPJ4ItvuhUiyFs3C139vBnZ,32c6377bd350f57c,d9b2e232e45dcbed -PvoaeFxQMZaccPULensK21SKtkIJAR4yvHbEOe55vEc1ka1jiwq9osy3xNtxowA77j4k1QCFpUlqheemBySxIFRHw3tWT42WQgSHMNwmiWRgtczUGkZf3rc0z26fKjrtgZ7JYFJ2pmjtqzQUXSsQo7mryr4alwbLt5bW6UBK5H02UCmhDuLOlJ6iRMXKixi1lnkReSFHTvYV1Qg2oDzmrhR09ZFrPPfScESyeoouuM0qKi6cg42gKqqzq1llPabRj9zld8sEiUxQA2td1XvSY2iMt62IpNboyOD0IKddEGuhsa7F741kL6ZM89bbikL504UtzTdEuugbfZhbwq1d0FOs4MjQMXqln9tg8ijMjsnGgYGsaAcxxClVWCqvu3VwFMyae3xpqpJ6daQtDRKsvwsK1MaBAL6QI7Q1VcXZ8lw1pwL4seOlAPw7GHJxyWUkQgZ4hunkgbMXXt869LoQVmcF9qs3eCpyrX3pqIePHyYJzyZC2k70Wo3BwiGg9aE2RzyImP0TUW4sREQlDIz82QLYQllc73vju5AAOetWqqvsSPRyywYtHNpH2F2pG4cMs18NoZgoErhjPRVMpF4iiSVo94J8VJsio7yJxDQQmJP32Es7pf2eNDMMUWwveuFbzDJK339QEjL1QywVoYoeU7ge26wAqcZHc6sfAWV3D0enGxSKHHUmvKGI1nkPCPG6YNJMqHOqCF0AiTa2rSl6ml3w4Y2XuuwPq3jTy4Qvjly9fNwp0IBiN4KL8pAvF7BYMYUDSnecGGfkzz3rSMUZBC8EePiVm7aytC6KY1zxTsOtco8d8IbsgHuce16Ln1ZKCljVGe1KlRpZFoqT483OFtIdLlBXHZHfmibcYGOhogFGj9RTrrnmkatPYA7945,ff3a16b322ddc844,1f0d0906fe77c15b -PFBe90G0Ul9dmbEnG6rhgB9fDyJr8sHsa99FR3NLq1ngW4dTrx3qClG6ViGygwRyXZ12fNuLhjbUQtmRGYjETH9tbMl9XlnLvrq2GpSFEIlnZBaVnX86lrzSRJVJjtUCCoAGn3b1SnViTiYEE2UtE3ddfDn3pfBLSIe1DU5Ajckfj0jccHCXGg8S1Gs2ZHqbNFJnCmLHYG8idChe6tc5FFrwTWVx4JY10L637U9CXXEeqYjDEXTFqXY9G9KtYFoXOpvTHalJm8jsaUx1fHwcCSWHt764Ak8oe,a6d9615ff666d738,e7cd44141576794f -p7Bcv36Cy8ZtJoEpoZoHbetGgv2LLq4ndF60KrMj0HcF4SEMeEeiC7i7Ekpq4XEG8UhhT5tH8OawIzYMGBzimQd9Ip97cTukVjPFXecq8aPMPvleVeAbc8d5DhqQxOZTaReo2bvdmkahhOyzBpKs6jkM77bz9sy86g5qLXW8kjWJmQham64HKByDZfhJw7eZBUk0SdxWqbSa00qHIE5ivHhbcc7GbXDMhSs1fdPd7LtRf7IPgTn0xjvNYAIHv3TshlaTGxbjclmxuCN16PxxZKyCmNpRWCMfSrJpbmHfeIsJx9m9IhTp37lO4chmXM1z9lhVSPO08xZAzbKQOtAuESSkPlJU3mFRQl26F8zDG7ooYAogw76RE4VM7HvFyECf6flusbq4DTWExYARZMoHwd5vrBGiki3e0OONJxOoP9DPQ6HnymsYdBlo8pQIo2G0VX0QnEd98yoF9M4kql2P81UTpuTCJaCeL1KpVOTLzL3qRdoxKkNIP4YjqXdyYndYRfBsa6IFcb2FwSzZ5LqMjtXATYiTVeGSUNM51a8POJpHfMkMVq4ONZf2ZDVIT8ZEcE4nUWAclXIdCXZ1XFPL,d2e34be281f6c209,ae88256cba72c802 -ikMYpqGCRNf8lu,5c28ef61e44ca61c,3cf4e536bb86eb23 -bmQxoi9ZZBZyvWBi6oZQgpkbeZEiDOLcY7Ck6mqf89hevboSyLO5keotaTgN6Sbo7OHHpK6X1I846Rm36o4fuSBxwEiMZQtTe3vhbYGes00FLuR3OdNyZWPwPYuSDIzR4wt6T3hprLlspgfGHdDDpwjRcVtpvxpgekWXuvlpGgWfw5L0f4WzNaP5NRtvI0zWjwJBUgf8z0Nfs9Kq85GAFdvXeDwMkBDSsRMQdIu4MIelbQS6WrZ47txcgoPeVE3kVcyR5UmWx5Ocs7HdI7fjjddSE2DzttStCtQ9KM8hQ48afYchPWZHV9TAZIAqwvVIyjGJnrLGycSG9V9xw5Q0sFPJLesDrvdZryVaxcX0ZOBX1KrMlVANOZNASvfY2ekROS4L6QfiH1f4dFXQhRLNQEpQRR4t7lsZ4gXtaP0p8fgP9P2w5N2uxqj7eB01Ko8fXIidHhvba3V8LGi9EbuILwbeby19g9Bdk3V6gWtUc9j8xvNpsaz2TebYFX2GJn4jhifnmcSZZx,429ccb6a632256bd,76c47a92f0dbabb -jq4yNr2sh,2f6dc419deac4528,2ac6994229cb757c -EHfCfVulCXhhRDcFVSzW4vw0LNqAbx0xQcXlAAKmEK6RYaktZWJNfWktVyXTN90q5KS6K2cjf8nVkM04A3kxuFFUBYYC8dxw7GTGprUfAOvpchmm8o54i1Fi0cjClwDLo0j4gTUVp26w5MhN4qGgHPwfLLdNfCtShkTDCulM21vzUAPWqrkINyOdGpAX5llnK7TmqonRge6fc6cd6vnPHFHskyBTj3BkDqbSQZ3ploXzG8gRKb8aCD8hW0s6MppmOcBHGUFC6MdxyaaiKG0tBSUNV9L6AsSsxZSv1uYIrvPdewWiqLFB5SDyGfvrHpimnrnJwSHarQluwoJQqCus8WRHqDZJZkGwEt1ZURWIfTjvDUnoehlqBVnzwWWPAPOcCq7NwKpd0ojh348HS1rLGXCuMNNXGofAz0CIcXTCnprFHUVx1fo96lOiln7E3KiVA7XbsjAO96PPuWa8VywFunzNDRshnyqE4SRxp4l2pDIKr3FjfRjGticHQ2yzGqT82VBUqMW5nz3q7NA46MEo40oAavB0ygUiCswMqe8K5TYMTtIbhYNi0AcHIcMXpdKPugyfxfYKHJdq13erPmjb6ZO2O6TmOFfBvAmjQjOVoWrwOGm85ZRQfKibnuXVsLUWGvzBmBY6IY58JrmPLOY4fv7ehTfoP4y5nm76SPfsGLTzvfeeWXETQ61ZrrAkcRvyQXgBpOAGGVXBrPrKHF5cJjnr3KYvM8q8Q9BL0R7gC6biZXqS3PDf9L2hb8tH8lltoKmbmqcKFEzT8hiAmxXOEott80B4o8BeXX13Z2NRyfqQ1A2kzDVxwOXiwkwyAncWXCEKDcqIt5kXYQDuapfnz1,cd90981ae68f81ad,f56f4e69424215f4 -8puRXyzrhWdBYjGzaPLHv8IbQ9WcFW85wsAwhYnzp1MaGR1fnkeMwdZXsaA4umZ,77ba10ea0f4bd602,399df10bb9154a42 -syPS1pQkEzB8eKoiH7Co1BsEx7DsnXj4ptuGr0XzKxjDdNP4SdkNpFDp0O8R3Sulu9k2l6G1QQmpoMBSXpkkKk5sxS0J8nVvmRRxxJm57y2271fm7ubU7rwfDFH4WCSmSgEgOMshL9N7qtkiRMDPVB1TfJoOFkcc7uiU7oYcKKcjeBmSyJYOTK9grBcAikcarvi1b6sa7kCydOBYvrbsRV5Um78cBvkx7Yq5hUWnLglxlmV5xU5ZasM22bcq,d3d1ee38a719193e,2fb610f96c833198 -oDweWChvlZeAc9VmrKYSFY5Hs9J2aOlQD6Q6oIyDOYaNDTSQYERkLy2tGwhUkag9TvQHRGt7HLsYTnvEM6LoH2OfAg6AUIXve1RsMN2pbjv7s51wfuGgnnEiOywiQxI6MT1HmT1eYVYpiRvA22rOZXamLiQmYLaM4wWSjaNXnvu8CvggmDaRNR9gDUbCXi8qaEbCVSxlNn3RE9t1474E38OgNEMbK7du1c4DkZlq2s2mTEMiCzg3DPQ8zmXe3URuSo22kuc3upeBThtFc8cf1jHHDADbJeyPummE3r9fkZjelYkfKYtUpYeJkus97DoM5AEjOtJkgYkvZKHOnnMXonPj7gpYh1Q0BUZ97ZJ5wQcByUouSFJHm4K25CsLYF0Qmjv3UFn9t34BbRSaas2vudLRlx5ftaKJUtEwOqeWOzlYcevidiHbgJOFhQJIDm0Qvxa7UNSU6V6bGMiGIQQI9YDba4c982z2nW1zWDwydF5PVa2ewduAXOElKPByRkn1lgPhZybqYXP9oPh3Primx3Dpw9zSWE5S1ToQRcLaLDqO7F0IywrWrUdGyep9Q6sG6UWlkUHh5haZIooQc8IhatZKB7rriJXubi1apT7j0L1CGb0tRNxCrMPMQIrVA9Rs3ISncJddAOdpX3wO6g7Ba7N6Lmjz9TzgGVqHOlknoSSg0XA2FVb15gX1PDWQeHisjL1wslNZXClt65wIH4KvgknnyncYnPG1NLTZGM1cKGqx0nJ,d1fb0cf6ebcc4d4d,59fcfb62c6b83931 -3CpBhsYLvraqIUDfl2mKFi2WBCeU8jYJgy84guuo6EctDxaRqiLkX8UCv8Nr1gGY4RUHCxkZYBsVvdD2tOEumkOYxnKbhZEIv1WvBiIb5utjy0dZcuHLhmNbQjkb2qs7h97x8hAfjF4GanMLIfBLaceaqSD8KGvdwcnHZ0sZwjZiCjcObjxHEvhhLAk,478fadaa68c6a895,3e78468fa0545069 -M0oNJXmVYGbUBWn2Vw0JEpyi4vKbdzjcUMs5IyWFK8QR0sC5hHgiDhhMkOY5kPlCM3AGD5rI89n3X520tWzsBQseSAOBdAQzUPGS9v5WAYiZd2Efi97qGXSdHqRLO5ACsrZBsIoAu3KucqvSilpZJkopeexCUj1b8CdeVMwIP3xfTh8mqzcMWD6hE79vOp3OcEvLSXbRhk990Q5L1amaWRzDxu8mLTJZ1F3xZds33x3JTXkG2pz1caGjlHBB8mEPc9lG4b4wIeqKIyj5XWWLgbwSjaLajBTGJUKgHyDWNIoiTUxbvWfDxs90YSIo1DRnhjta8ZvK9yKQliRfrOyE1ru7PPHHjE,976a33496df0cad3,b4089ce9f20e88dc -Wu7GHKzRXzGTJS8qEvQItE45GRGTKGKtglHs4cjTV8lziIcj7ajDo2veY8JTMFsxKSdAgvEmZ2oeE5sfWos2a8NYdOjcjoGVZe52BBICaSWzyHo5h6F2BcHQgnd1oUyuR9euVNkZ2p87PVgmBCN83lra4pVbZtvmL1EPv3ZtstAmvVToPiIeY0EZGI9on5oOttZaUq0MZ1K9CN99BTyA7WBfLIecUK9jmerSYeNuZGyXlF8CcTKqhlAQ7YDIpQgcwX2wr4ARr857CE8envyy2vfOnQ1wBMU2rKzk580hksq4vrPStZXTt2of0BaoQrAuWgFFJjv2MXTvTfNgzXHnrwXzj3Jx3U3cnxiQh26TXYla4ofnNg7OK8COUo7HnlQKI6WgE5o2zNC6Cdf5SCZc49itN2UFzFtiGskLsOMnOroahmKTWBlK7qeRynZTag9TE28MDWQAmPY3FDi9HV3SSv7jCMy0a2D5CNEjAo3hu5GtQsvF58gfZSSBfNbpf1f7oBK77l0UhQBAESln9hmn5awK31CGCsbR7RkXLxHtKUiEwf9YpjcsES2kidSUeX1a4OxTx7cm8wHFpc0oKFj5zHWNTDSqnh0MyHp0j73wBrDPEPO6XrzHITQr65n5JNBUVn8O0Ue5bBTChnUDZjM2kHys50yErvibhtosguqvJQHGG0Sgewzyk7PK6820WkBu7jwwDNQaUyDG91t6zvaAXxp4Nq6Afjns4H6sd6Qwz4RfykxbaNAq7d8Bkwba1wG9RNMwxoge7lFoLVHUlZjiWdYGvc6Cm8SzUVluT8DnS2ulUUwKNJ7078lgjecZ108OBhqwGx83BRhgh1mZZAMIWWVyY2Nspb4yeB90bdSDjLNYDYlP6VssQFoUm7ZwOpQNabWSio33N6zbTxU4qoVmVy9N0Pv6pH4t2jwtCg3ssDAZfJzBH0feOzl2XrVBN0zP3w7XdZsRwcM4pc9bJ50sxG6DATf5har,92b30e4f6f19aff4,5679a426270b536c -WNJFjwRHtX4wChmBHpmtjz3KJHCLdJvsSkQpBUGZDJktOEwraqjcbi7koLNmurbU6z1GcrrnJtwkbT1lDkLSvBzvM07Xs679EzerKYh12fP0h1fPmjKtxpZtZRgjVcHCDeOdXNavUu1wyYoGvqSZBnRNpBxuNx25CkEJcRsm91hgQz19etW7C5w1y26huSpKc9a1apPVUvFiz25cwy3LEBhbPt64JZVhVEdcsSgqx4OBqOhmoBNt0D63U4aLZDkzK0YM1qsQwndNwFkwiXttxECOjolEKHFPashvLwPvaW4dQBQWTsqsaAvvXvrP4cYRgGnMY50MmzfKfbyN9lxvs73vh6AQ8QEd3ugq69DcWGti9bT1IsGyKhaP2a9eJ7L6BF8ftr79TOJpkUxqH20EkIUqMN8tPz42XI1SF2xFXE9lSSPOaO2Kz4VV8MJIjiOgvaphIHNVy5NZT5iS5D4Gs2q9OF1bN7QBj8bc9XogxcagqUYgJssdVWO5zBvpw3avyay7Flr4oRxKTjncXLly5vvX0cwSBCtz5tCgxItuQDKgiYd29FxofNEAsGunFQuwZlWg4Qztroe2sgprOD0QmFKAzDaA78H83wrGYVGIUpLPnViseqUsOUp3z0EqX9xCz1SFt3nFiq3iSrMjTbTruaFgzDZFVeuQkJXv9osW2j5uauQGyDplBvhtbheRX49DsJRRSHi9Sj8GVNq1VIxZG5ShSKKmOVJWmlRRGTZUrm8ikQZlZuVKr2xX20MUgW6ysmpPq7j4chyokbpsEe6QROb1ByoFOYuAjYSgyruz7KacFhomrz3vfqvo5IsOVAvCKANaVZIvNFk1EhjGCORdfnVWKxdrPUw49RKa3fYbTY3Dlt2Ujv5qlO0n5dYoaWn4nk6u99brqFymeebM47gBKr3NL6GJGZQ7sIbWyES6WHpfjeRStuzjKogtFtL3aEL8cJlnO3AWz4bTy9EIDS0DuIaPMZS8mMNe,9c55fcb44fe0caf2,4cf50a224956d8de -WkGcRNTdQYPHzBlxyiwGb9MsroYZbcdpqBPSluE2TtHTYKeTPdyuNId7oM378dxXc6agoZbrM5CzjdKuhW2pIQdV1hXtqM7BTdDZCIlL6MMc3bgeDYO80UPjH1mUTe53KV1La6UFa9K6nz5QxAewvgia8Svlqyckr6Hgwe8Q10wUzIeolRcg1MDk2wdrOG4C4DxYUpVAhPiHfa2fRjm1spDTCw3rx6UkutWrjmfb395U0GMmDfSMNX13E5siARvsDcs9ZxMU1EuZO0wkQGXcPTpHt9nW4JsZjNbjbbzWG4LsBc2CAFCs0CMKYgmrYQGkojTm84pwZh0AfTyrarL8MMJFP56bUsTv5CbSP1q3QPuDz9iUMrgklj8zf7u5X5Lex47O9A78KG26mCy9imRDtgE3fxwW4AFwjufADL5kPDU2P0IU9H3t9lzZ3hG0Y,9361c2a1f8144931,1eb3ec2e13ed4470 -UQYs3oxDDcIiodhEPRvxre7WYfBRS5lpFDZRdv9flwt4DhTQOd0jisojzXsCtFvKj3xEZIs9Tubka4pr3VxF1b0Cg8203bXqF2FtQKDjnhpFxu8lQBLS5WxlZTQTpYO3VUQBT2O3o281RgAFYfCFNTJP9WwXWnoICMl8Z5dqSe,7f3feaaa8df4bcf1,c633ec3d5bd6360 -MQPO9rqx4jaQ1hr8j1HM4SxSufH1dyzRHnTb9QH436bPsjBhU3uZRQUYRFoKApsovMhhEZcUABZWiix2DJPIB4lGgiNQxZE5Q3kRY15j0BTJazaGbJDrYS1cI7QAkd4ngzAqDq1vrJiP4AKV03i89l0kdkwjULwByDiTPreIRiXaf04eIed1I6ZIUCUZEsBlk6SPRxC0tXLWdHfaqfqPf0FW5OpewTiOxKtWPy9ezpXIt5ZNFwulcJyh08fneQlrQSNJLCm4oy7mJQ4LapSdd8xcalQhn37sMxihvj7HGZiq5dpryykweVL6U1urmbHLF8quvIBuOIv2FyAy7MekiJc2Js2BgmuTugvx6GSVddPOv6teWKUXBNTQcYmbMZ6rUcAQhUNjlbU5UZerQIYFdcu9MoLO1tUjN2FVwB1dzaAPXpaBMzMwk6WgvPTiUFLZ1fZjfxmZD16sdKPgiS4pla4NR9dNo7pe8YEfikeWgeEe3Y9VQVZ54mzdICdh6J5F258V3ce4DGwSwFpHhr1dspbERAkrqI1Qhqa6mBmaQJAWJEzO0VtVJzVP0bKSX305PYbVGxCpQWpngoCUzFP5eRGPZFmEwXRULJ0dPIJRpyWLaUKiIGYWlSoRI7hzaCZ8CGNyiOy1AfbcfQdXEfAJkuXUvcVzUBoAASIIzPfsvMcmNxyhbcb7QCzF6kv1vTYyfrjVoUPaizdOGbnkqo9At099csnoI7EjdS4GDj1URKqDfsSobMZSecYYm4aJXVBOQnTJsuQ,3a354e852d9f52e9,8bc12fa4d0dbe979 -amskKvSAzcFSmwnnu8tV6ZSzr5Atbe5WAtr6rm2VJm7Yj7nGTUwJSByOmUNc0ngOD4loCmoCPdttVzN5knV8q0iGix2yuiRkXdU3ynTq9SmXycENoya3sB9mjRsxUxQRj9rN9Bf70fvcxXyxY7WynKh4CQsnvyCK3dVpX4A2s3q1NPt82,d1e4a5b9f867f8d2,b3046029bea1013f -hTaLZ3ft8KCgC1BmULIGsTJkkkc8w2w4lfhoiIa06UcC6C3VM4Se2Cm10XM93YelPtnqp4dtsa3xRYtG5KqWDvzdSk1M43v61oDdI18Z5ShMCyifnDCuQtLk8VYBuUxehhk5lZse8e4tCwVByjm0eBF9CbP3fYVzgZu4hXxQbY2YwNKU2p5NZgTzNewV0hAAez8OVP6qacEcdhSLgNcOBHmIAyrU8nNnB8TfKd5NmDP6IN4y1bnnfHVV6yXVwEQwYmK7dHJqERG28NH6ShT12sns7nH2cCmISh84p3PQIeST3J5OLf8feED6OHUC6TKPZF2N9idAxXFoeBjMf6HntS6CTlbBSZJnonnN3SPumrMG0WZntRMPi0QtZ2rSIqrbg9UT7Xp7bshL0o8Txaa16SzhaTR7QXI2clQp3gNu0uhD8OagUmAqrSKPYJtsSlTXMjWftz0WVsoT8XqVmwNiddzfHF4g0E2Cl56eGnXUZUqy3dAfZIX6XL6o5WJ4cMDhC80J0PoDsIuMDTQalNxj03DelMw5frwZKe5Xyb4LMU9SlzNTfxkMJn4Fupu4Cfn1ggGsh60aPx3o8ug5iHb4oUG099hJrHHc6hjkHKl8l3cDh0WECUdvv6B5dmdpaUz4Hr19B8K59n3e1JKiN0wwG7CJIqqLzgZjGZwgOk9IyU5zKSbPHQYZKQxx2VD5ZVbHF8RrmdttTIc859ENdzVd3NCv1tLcfT7ZpaIuYxseU0ThGTIVnahvCs6nzOA0jEVoLP4CbGQVrDXjxkpxhVk8wMxvGSBiGPLy9ZbkBGn0f5GS0tPjcjRlP1GAhHddPMBtfSQgdReXYUakOIRtxdoO6OYD36uXRwQefWbgby4DbmK06DTMP7wH3AAxoZ4,8cbe65a4dcaeaee7,a5cc7fb12ddc1cc9 -V5SgEEQ1bJpCFagiwYp9mWAHvDxhIQIJ9S8EUQntoeMWDCsAhfffUfw5fPWt7oWAO51Xrf3YwGjQwtob6BWgWaFlm28DRCGGUjj23MOOem89yCFKiz0K8gtlbQdbzNwuCnXkpRfEfPizSFPt6t84GBFbnWc2NVohiNM7R9kU55hVFtzUSv5fBTIfCd2NyROEi7OXqqkKVzRppg62aqH8FNLaemRD5WibbI3pTXdd2FwJBAIS4gHpLRwbh5Z5KkI4xvhQjxXdAtuWeT2ODRypLEt0Mwjx3m03VciPY6ZRxWVbLG0wiGjBUvj9BHcOfiWjbSTxv7ER8ppf56miOmqKlLBTWwMNhhmI5vLkWfZIKPHoq35EijBRN7uY2LzfFQbRM8euEi0bVyt3Jhssx37YD58UclgVpBnrMH2E7ovcxKsR7y6t2LXYTvTO29ADyFKd3ac0it1b4fJCxmzWrgQKZPIVotu6lGGRG1uA16xVTB4iHRrro7vx1MCyDy2nyB8sylgSzi80MUtqAgUkXXGPD2TToAyRRTCKg5Ph310GTZYXm4pML1Foouhv0Ud9RXy7ttVZcWkKVSlAuktsHKQRDf2YXrxgkTIfEabBFqymMY2io3AotHzFzQoWkLh3v0f5jeZRo7kf9DqbWukggqoQNmOTGuCfuRZflEBpXrCEf2cngFMlhMO894tHAx8eipNZ4zNIuVdLGfbjmD1mVKQkzJ7259xlpY398FwwCMxYyN7cuZz76gT6eJyKLu68e1GT44X4svs2gOMCFp2EN9lvDYYN3T,5e32e7123861d7d8,33592a3808150277 -tn9OsBMLE16R1SMilOYDTfSHEa8rsDtDKB3mSKw75cNkOjiSlbr9xPCBELPDAx91f1xpu6WGFkyk9eAoI5Nxj6nepP4FphJN0JH7uEcoMDV0IP6SDB2knG0QcLW7ZojBlDTJZu9PJzl055SJUCcXtPfBAHA5NaWQ9hYmziy2N5PFOrXTwPcLSBnzwUXL4Ft0sE7E9GQMc6nakKpJaWxHccaJuOcK5wNFU7kgIbGtHow763mPkZpoc1PZcFOVU44HbOSN6BXMIX9Sd90uoEcKBEAAXEjcRPL2gy0rBmyRthjIfMW0TBoRIwe63r88QoV9HfK6fCRHiDYjCV3Hcg7eDql5dIFo3c5y71V2wTyubbU012Ezc546Jq9evLyduf0s1i4Y4WGkpNK6yyE4zvMXFc4kUgK9HMK2GGUZptAQjgK5w5niuTNgPOp1PG0hjp5z48PMgyPsMC6fHGmj1ctzUUmAPKJIKfWH39gOrvkMt03k09i3a4Z0OrJWtNhWRMguszn8LvNr8EpdIEynngA5kJbcxsQuA6pmjtWIKFMr3yHaSuVxnMdX5xIaYOJxxNubcjkCkpKWDe8vD8ZNBswErTi6WYTiigEMxpbmTarTbjnVy0Ij13VLqruSCOcJ6EUDeus4FwWRwvmyBxiJPj18hWlCkb8LOpigCiIlKGWcOT1zHPVCwX3Y3YQ7w3bnsUGdX0IQlyBSVm5tO1HMus34EAmSHBCGZPbINlee60DfvQVk5iG4dl3zEakIX858kh2TZMnhU97oQFl51lGTZTJaP5EtRCQOog1D2lCT8tiuwJ8VtPaPYoVvLnGRSVZgtVcWmqaflJD1wtxjMSuzTtjuDnfdA3izU0SBg40PodtsC9Gdp3rGzBiFhObeLyeLt6Y9Wrby4jRTZxgy9uj0spX,5f9be948b32db8ee,79c4df0126252897 -HTkoqpT6nkls0sm4xqWXV6A7nON5TpS7qaoF55GWtdt07xNGQmm8bxVKwAes7y312HZiErjs7WJ8tmrLrxLQNLy8u3qy8mLX62mazH3POF1CRNKg6cknpoyOSxuUvtJgMkdzouWa2OQV7lJIjtMgmmLjUvBKcF2U3erM5hAz6zjxgPz3B7XIzXoa4ToXtFWJtnDmUY7o8SXuK3mVUtg6VyG3NcyF5p42ecAgxFVNR4pCkGNHC2GrGZ0Z00P6dKYC31npBKf6FjyJsdc6CLDbgXArlKdpKodhoRWoLNXqgGrkj2cHuQhn0Ai2MUhJowUpAPzS2qEvDcohmqeltDh9K25ysqsR5uSNT4Mzf4zBJSSFvw8OzZ3l7mccj6J39c0obG6VYGFdef4fgXmRUj16Q6VzhmBQz05vO5UEd0hTqzE9HtquMIsmZkmyvvUZKxYBGSBEmSU2WXm83q4UZ8Kx5wfcNoVB0USoFplkx1RBm2PIjrzJL4VdmyS693Mn0TogZY2Jqhi6bZVMW9tJlPb33tYKAT8SsMieroDmOXFcSwoHHulP5Y5JhidIGX4sud2M1,737b6c1725e396d4,41d95312bc9c99b1 -gIjMVACLkP1mNtd8b5OdlCACQjrhKwiD967CS8F4ubaMAalLMRm3jRvEdyIrePjKFJVACqvrCpSsTO018RyIqXn6rhNvibUTxo2mwkz6gyNm1MTj6y7Z5ZWvLOHvSrGSqpGoHLgaOXWn3mTNYltPRsDeVdgyG72AfnbzE9MhRCoGInP2u8aFl7gA1gIaUYUGa9kiIHHc4FhjL6oQxFX4Z0XCtSVdRx7B9KehOGJ5vp6vWL0lR7LflWEz4hmQVHjXEKrIxs7jyugKe3pg5wIqFNItLqFcLEsjz3yEOmXyZq6hC3pMELgFVH,a3b9fb4c199d1bb1,f0b34f2352a68d71 -9E9x4nFXokY52zFPD27Owk9mhOPZ8iPtn67If64HnIuqIWA1qL2AeLGSc3swe21dA4W9KvuMWqQKd3GJKaxU3uRezPJ5bCCSj1tPjAfAruuM5rRo0HFbMvHrtgyvziZtqqulRNMLzzsTz3Q6UGNjvO6JDe5pwHj7mxK5MuqDX8yYBCdu30LIBHXEWNmtJUewkBwmc90WhSUBR7I2xZ4oOfnUGOdpA8ZZ7SztPerViozu4J6nth6HNcoV0K5XjJeJQgHG2KYNS50wT8NgnL4iYpxSD1GfvTvuPm39FxNltPx17Al6UCsoQQU4uZ2Kt5DkXd3XDy2Wlxv3bc1EdKKa1lg1nb0HbKU3AnRWUUqg6xTeCZCHePsOjCyKVFblkAAFxO8PKHgeUWQ0iqrz0VvO0ma0cHflp6HZDPWI1Tnz8LYeIJVgj6Zx446QU5U4ujLh5gVFsSTgjPANRWiCnFqyJM5EDH0UDvAxdSzhRaKpiuqBCAM7HOcXHBdLJzjdON0FK5WVXz2uI1tWGyPFDK9gcUxhaBvHSy1eEzAbJgTQlVnZyFG9sOyp7qUerFbEUPSOTffGWucpU9ADP7627bXPqC91v1nj64f2xteD5AGHq535ut3iybyTixAhT5FnefgcYUUPGqJ77MZwPw4rpl2pLTLUg9b19sW8ehNaupmxVQfYGY6Q7CC5ajSYxOBI45TwYExdEBa3nuGovePfbEYX3rdnqJwVxQz37jTUY7xpQGrAmruLCbaDJZSxr8x20YlsBGALsjIxCDdiJBurFxe1Gm0h2TBwwN81WsgBSA2iEWem2qfVF7pOysFUg,66aad5f1e02515e5,511a1a0cab7ab807 -8FqyzZrAb12tx5WaSLiug77SDgHwESMdXaGFQqEiZbYUkHAVl9RaLIkwGLxMfUl1Oxm01nDiEN0knc8TaKFyY21K6ChZC8GhIKzaOkiipQfuStno2oMa4YG1nOvwfco2pPWxxH78nHvJTh7fgW0snpY4CsVr21ghAfN6nhOXpIZhEk1ebCVWD7EjQgPZaNEEtm14H9NlBQLATYlXdJrL5eQNi8QsXgwaQN6abyf5HBSSRxVqhpZCPNRd5A0PLZIYVNIcNJhG7eto1bqBQA290pMm7jQz7jz1kiO3ZurMcPU8y5MrThfXZ4JTQv2z5H09WUltLVEMEo5QEMX10Ml870olpobCaxvlpufJn1dNxk7empWAPhREOM,9ded3cc7057fe7d7,3ab88d3a0c1bec88 -eF6fwpxgVOn7EzZ8ELqd11cC9UB2wcGt8CHeCUNSBRDV0E8swlZMPXgoOwwsKmpbkDsZmaGqkkwQRC5vnMtnzm8XU4HH54vfmyw17EAZ7IwabZtPeUwqPag1CbIAYmD2EX44QKC3PkovOFtUbo17LJouNjPhaMM929HsPGd7RmbZnMfoPHrYmOH48MrQk9B290mOwKw1lXQZ24TCiZD07ProLbiFGu8D7EImI7mrIaAQilTMLmxkllCLt0cDFpLYjFpnSz1z19l4tkdf5GF8J50g0FvCYInSpTMdUC2qYNeuRFhJjLWnhLQBs1mlpQ7qHAG96Se8HsVS0lrMkp4SsCUV2T5QFLL0GOcsPWCoF9eGKwDgSJ9y3UpBaKOw2dZzJZZzrUuzsrzNPj9jnBI8lDG4FDWBuJEA0Bvu8i0pK1OiS1Ib0zJtvvZAa389LNEHppXlbJJHoyzhbh6wWBDSc7unDZWHW9Y6mbyMZEbOdmLO9EhMTWdYdrBYRswQ92AbhdHq3bP4wp6MXY1Na2Vog93y1RPWCfEZ3OYaqOATFvuq2zpvy3guehZkfzBMOeAmGZdu7zyoSLegV3NJSEpTfSLGxeQrx7XLo1vsh6WD4DQwH0lr7csMi1ioSG3LioEoyADR5Qtus0u2EpVZPXyWRzrjzI48AZjStNHTuNk6YQwCv6clJQQHow7d46fcZ7IxTmztzIEkmYbBRU565D8FM7aMlF83DdJ14poJR88zMTgztUIqdww7b5SjcRG737h6dKSBAEEH0YeRTpkpg7QEt8BpgPs3UBtELwnHcEeIDBInJXGGIHCjWPMcgWxnNvXapva1onXjqkbcOA7KwQkdrRwBxTogAOU2IPufmuchL3mnZjnjRlAtHj3LVFX9Wq2MOVwsz6r95ITp0,7e597d47f7f17d98,2113aa5d3f957cfb -dmfsb7notbocWzoiFMqSL5UDVQyNjNiZLsUBSkDJMt1KhjEzlvMYJjIixO4nE4bDB72rqMBhgi49iFnlQJVKKlHm6dp8KmogXpZGWximsqpuPjrafice0ZjXUuwyG484lmprKSQbXwSyCDkBmPRb0MMMrUBeGlzeIGzjCh5FH80uJF9fV7hYI09EbiqbrMekPLrMn9RRQtZZoDLIPgxoFIWnFuG5M1woSlcPRLnEX,cf37180aa290e3b3,faac1ff2ae470429 -TcUQ46yp2JRL28q3zbBA2Rzs2mjxAiRYTug82inpTK4PJEN0w0c9okUNapSbCxFM97OPVSkyfvLAjLHwMddqNtLEsvDalRWSIVauhdFXUosxRzSVdK79q5CyxnN4aWbFIBmWQKyxNfRszi9xcqjgS9fOYDZHlHO1lEdH8z2DL7W2Ps0om0KWFWUYmkgTdlmcl4kBevtODIJtNoLc6CNU6NbWL9upJb7t7K5KUqJbxqQR0lBkroIer1UptZ08t6vNXkdOYV3JrqWVORH2yE53ILcQzTT1MmYcCW76iTsB8OLVuNgEfe5CllEeQt8ksic3fkesD31ORIiwjfSU2IdKRoG4ygT8mEjszWomIUBqriw0OrgXqpyeFia64FFSMKsgUEKVGolaMV3SmDIYFmUNq8u0Z6HUJ76MqPmAJDXNA2k6EfVyN2swEhfBNIzkHUratlGjwN99GO9cwanFMsxpZVvX8kM47JRU9uRKUdIx992GBrFnfZxbwSpfIdthMgaM1Bz0RgrnwhXVMrb8Rqqk029MtiTkhLuDY7mPTsTykrbEhUh9ybYUnw,15d3f0075a9e2f8,b507e776158c0377 -V1RGPmqb4FAohMZfof3oZtn5zwOPDGd34MVCUp0VhFfg8CtG798teVDZ9yMe7WRKxxaymzNSSYmyYtOXhTPJluxlXpDJ0SK7ERNyG9dslhwYGLzUxzJSWRfo9HJOTxOCH5d0mvQwsqStd7tiOHFYYxslysQvl9HbWPsAv7ogMPtKUewJy2NkIPUJLs2GLA5QFPgwvxSaFtBityq0KU2pGGmCdLDmgHj2INzcjA71v5akYcCNBm3SvC5LLkqyH25uw6OjeE1BDBRd0mDsc6pSsmPIQPl4h72mIsN0l7RCmT3hHYwXq1GoyU0GHyC96z5fbijobFi8SiEmCsospdFywkQc7EJNuAowU35LyZjsWmSKceAWAxYVTFCuPrAExnQ5mFRvMAdrgdfKHaquDg1geCvTDbz7TsWHx7GUPwLTOJj5EDqv0EzBpeDpocYedKF0RpZOXWdAoznXaQo3rNPkrMjFyTmar9D4kjXtJFwpBNEpGPs9WXwi4VNtKvXbTiL8tZ89flfA4ZC2wrBCxtuYNkMzrHVCXMzhHuwXDuDVXFo0GyN9TluDgNVRqYa9KyInQkNCvLlGiBmN4tQmp8pkmyVdjg949lU9IFMs4u9RbKM1V8apolRdP1oDj1TKDnkROfP8eQGaAQdMb9MNp1ZhAmhB2zvG5prYUGLFhlmSDhayj0Yg1DBuT1VjfrS6Ycw6HBWr6trKoDxjKjH7fYerNmhfdCCyiMKTH2iGIxabTTJKEAWxmfmFv8U90nkgTXg92z3pqCLP0B1ULY0eDH2lEx3Mocty27kfXg3bFmchQwMCvydn6TrDt5WhFc11d8wGDvDCWlEPtfnSK75SI9CInmzP7uit1gWftwpBga8lN4KJXpx4jl1ymRhsHTb7waUhch9jfpsYhQ61pylPTdPk31n2vGvalItybdVGWZiyt,1cb2c78cf57b7fff,4c88586d7dc17916 -YHWQyfhMAN0LUIMjseYD9S7V1BHTlJ84opU74qr211ccUezYqTywV4n84EQys35kg9bnFd0E9u27tJDq0FWRUsU7mzKqtUDeMTawN9Wej8H6DJVuQoTlHBKnLlitSki6CuwhBeDS73jtU43X6pla934r25IorfxtWyFzB3GicGEdKaEa4xzLz7zFzZy0p7EjIUD3f1LXWPErgyQUpEJjxdBZ0NddWcQhsHZXH6Mx9MwJuDoSY9VKiuAO7RmPJrNn7JPOi0hsiqDuM2YNUhpa8sDk5xd2YEnb72FtC2QOQjTskti7BkbKnQfQ5LextcQLuB3ejLRWrC7emXiNgCmtFzaF3GjLfMzt3QsE8J1kZx5Tf8a4wYzEqYqWkRNNyn9ELi5vlT4k3Zf6yXKTnrVOhn36lhzAeHKieOdmiHLGbIL3TDRYtRoha2ss9JVpIyCKWRnIxO2IoLLJHKsVvjR9xxeGMvKac7xdBwy660U1osO10jN3nxBecvmu5LIUTewhNKiCPvMD2gUbmZYfX5aR2FeRdVW9mNR0sJiq3TkeFXMxauwmU1X0GpGEUBeBigB5ItzG3RsbLRm5uwr2WvaEt29wiC3z1UFNIT9sgTb1VriHIpGyNZpxffFDa1o472i6XGwbzONHRqm4oYis7pfHBNeIp1AdmEB0H6LF04HcTmnRWHF1eTbz08IfFWj8gqZyFqEyM7PZ0VhDS3AMokxrPl9N,fce1769880409bbf,eb6060b8e7894057 -lKHkBpLaHNMSu0Zme6j6v6NRD3LSuO3FQBCtklxDGkrKEYaIbknBaNbPv6SI6WRcfck4NW2lg1GaAxYoh8FpiXkX2NcfzvBzVUTk3CpNAIaitQdSETSwLdqSQsvaQgA5jGvRnJMmYImBzcnIVEYEcSylEwF6j0TBxsyjkLx41gaeaYU9xUiPMvuolgPmrTZkzLIcnStQJE6,6868a9df4a5b215c,a6aa84a594643fb5 -HJSMlbjYbzFVwtN8vHT0M0tINOZDHfWTO5kAcm3Ae9vE4xIApUQqgoJqg15ccX2GcGolWfHS0FcohA35H4xncBo5QgmKo0HFtCFuShKMVYcrX0NwHfQ19sudi0mE6X2ZWyS3TWirWCKzgaPg3DpiQ,86abf48bfed573c4,9a743017037f8766 -2y13plupXxxBtttZtgVgzZAgqrGz6JiUDroWLXIT3re2yDtuPQ1TxHHpyBoyc0W5o5US6LVXpRCxk6Qq48VkPCqIZycQSt7n3jhnF7UGRixp9a8vN,1f9ae9f5550f7230,d83c85fed1c7841a -4C8VWVCv5ODPCvWfZjx8SFq1FEJzIWfaJKpKMi6LcBFUAWNzTjfc0cjMEVUxiLptcq19hvyQZ2dvrWAG0KAt4eBaeeN1EZUxCRxWNMHUo7KpcmpZN2POjmr4oBRDDOk1WuMl3JIjb7afO9o1DngElFDTf2rh9IYk2KDZobE8jXiqCwETlGoTtAOZfVyq658pivYNgY4VxWUzTLGzU1X75f4CclqiozT3aWwPmoReCH6GNStPdwPYnPUjoI5ynUikoVv6MOL0thfMXr2Jqf01vTln1RRVJZPNq2f2zJh8L0g6r1W5n7cNvLIoSWrxXPqFt8F1Z78WIMm2mV9h6yEqG32UDOaLCgJiv8sGqnzcgiK6OgWwWdm3xkBejnxqF4,88fc7c645bbcdb07,2c9f223b53994485 -JwntCAtjnELjKTndvIEwDPo7zopd5XCHQVBv5thzhD1I1TmDxIYkFEpqUCxh5Lopxh3p0svCilJqMzzpHGVPfrvWoVhv6ZL8CawRiDcT5Tkk7W9YZE3TbEH0WFR0aPvujNp2Z4xejzGhpdhPrvbXsKmWNPp1o3bVnIweYGmdw9ONdBSP1ADYWgqwWAYyO3Y1ncMMJgusgKDjePVPY3ZFCDohrXiVGBNGzO9rPgX8ldz1NQ19fzcicQawmqF59vDhCS5xvhKnnMrhRAHVIUPdQXk6YnnjFmn3DDiWYKG5yK2ymG1wATx2kvHS4NMPrM8nXHHUdnSuZkEtqDhEWAU2uDnFNGvAgrmkplUFe9FiOCnJcspHVyUD64P90Wl2vj92fGaNOSs0pD2FIQ5c247mclCLiAbTAllBKIoLFq3bruJVScYMlIT1IOAH7c262hgvflCozHu20Vqx75ivO4tASwOOnVb7nsKYDWrG5hwm6XpAUicxiWz8JQFAtSNbdR0uyFm1YBxirRFIJC193N00MjvSg7EBBz65MThtvtSPkaFyS3RIj3D0KX1UBrfGrpU0aoZF4jEGA6Az4RY27cx35CWKRSBUOBQzU6MuCQIAX8EYdGLoVrujMTzgjp1XyxWmBJT8tofcd2xNgY8ItdlNqEUTXaSBdCbPHdQLpUytQm5E9cXLrBQn2igCbbXdbBD7coU2FbQSN4RMzs35Oih8xHrehcW7BmIJ9XecDYG6Seq0PUnqPRl2qvTJM1UvtN5CcQwzp7CSCPB4ZLMseRibqVV31c56DSjO917EtTXxjO6UyswgiuZXiHpVATXBCtvTfsY4jzits9rD9P5yXxZS2aqb3w6qcFonk7er32ieHOkIWq2,ceab4bbb4d6fb87a,395d2d093bc4f6ae -cGHy0P3mMoPafWLjH7glm86xFbtVq6vL0BKJjR3NtYR10qukbHVFveamgFUHybD4Ez2cs8aPfAU0Ao6rmlbd6R16vdMaYNdV4v6iXE3OWm1mxvUobeBDUKzEmoeanzThJMaMCnvLIjareyFoPhUyhR6aQShdn1Si99dAlinlbblYAezM139V8efh7bmM1qB9h1pU3PU335dKYRPMytyAKjx35r9CZ3O5dXqg2wUD77TZxgHR3DrCOudCd9dI9IDnwd0cG8mpYqeDgfGFshs5nFyz3DueRlslOLmKfgT9L8iEyyjDUJAdXhFJ8qHKrec3BuTxcEACNCRY0TxMjNk3PrM3OoWi44Zr3xUs7xnUOqRvy6axVOgasPMq1JR4hiyxfg3ypCGRELfuQCHwJhBQnVCVlTnoZof5MCrfqq31tTRzMJBZ4mJDU25sw9iwFdByp47RVvOvk6K1tMDyPcbCShuykmfPZOpckt6DGY1KgtsNlBwxCVgzcxIQLpaxvRj2ckYEAMk5FoivLLuV1a6TtGPuOVJtic2EO78AKIzrPpcb9mHrmVepPpF8qBOIoT1GVdzfqs3VzhvAeGUvJyRyTZOB9SXI9puiQWbN2Ynp5AcXruqY7VSGEi9WpM9VrSXss9iAJCvcVAPkkfgFrNey95PS30gDuiTPxcSKBS4cZT7HECZApxLntOOMxnbaUKW6RBSTzMo6sMHwZTjGUVz4rO9er8NwYHoEplNTRJyBVEPq6EPQtlHPWVUX1EpXQarHiYqtoX9Im1gB6klYCPndgyara26UWRsCwUs2M3EFqlxqrfUrQoh8UXCpY1WUay0gnPb1WbkTSI8CF7h21pNPVpAVQfn2zxeA6Ctys7YzKw6ftfVWKp,e37abe8d99d4dff4,e7b9a79786374b18 -zjKjWUJR9jWBpnZ8vr7SGjCUwhOss9j2nfmDRRG2DnvGrPwGlG2hmHQTKpJnvJ2NcSiG8hxsywgKf5nLaKHVb0z5rGTgxpzQtfN46OgESh7jdEiVdTHXxKMRv1ZMlxcBn2Y8dQg0Xn6pVmuoCygAgYIDTZUwC9EnGSN9b5N0uKuG3zWa6pRFaAS3fCwk7CwXx3hIJVEGYTYhwiQP3OBLH8pyEr8zSgTpKhTi6NxTNBpvuTZncMPwxxueXoldz08hNRrpO4pPkWokamFlufDX7hnPUlvFIx4v0hhpIE7Sg09lcz4fGXwJZgVP1ViBOor6CDC4hW10grOYhBnAX4NqfMtWM7fZqEJka5p2MI5SwCyzTWgljveNuGcXTkDMthj4Uz7cCnAVXfRvJMz4qkkwTGDO77tLn6EPLC7a0o1nVzPUF82ckBymVCM47hDbhEpBYiikHo6t7iqSKXHRA0MbROkdO81L1FEbV13JszkrKMIfCPAeBIT,625553d0fee158fa,1a2b8437bd12b6f6 -2gzfZeTBXbvMqVfadXaoBehYXBoDevvX5qaSqlOyaGUNfrB3g0dEQks92KgZwCzh1TE5qXmeITY0sAMjOIjR7w3xgaa056fQWhaUeIwlovHnCoNl4BT6GV9SDpnVCehye9ZzuZ0cXovf6WFd4Fv9fZCqqUqIHKMkDHs2mXtlIKyzDJBxp9r5Dsykxfgmpy1sRt1zf9S09aKqAf7zhSPqUVbSrBzrW9459EQrl0a9zuHXw3BOUdUHAM9iWRBFvF6H6,67e0caaa3e55c1c9,567a6e723d56011a -e7JukiYTfSd1APBgdPb6oFNS8WBwQeMV760aldtcfCLqE3F4BgJx6NuA0cy42k9BpNzc06mIMqGVcf6ZvpjLfoG4eRzzuEmUIPKqe2QC5UUjGH0zvPN6y3HBAeE2EnX1CdYZVcpZD14h69iYcKoJ3FXGD4g9UGmQAZyBDQ7g9DeN1qQcem8rZUM4htPUlwk3P9zAjOTBeUrWaVWaBI916i8jDTKYXJp085G3BMlhH6MVbu9kb7pfP7dsBS4czXCYSmlN005PWBTqmBwIcBknrZFkch477FrPV9VHrCMJnmu3uuuPxuGh0D1WiqsOBAt3sgpoXigNxsvyjMKMpyRLXGdCoCx7iHAL8eFPNXY5mCqqFcyZZSH9VS7c9Imy2CoCDeyMe0z2X1eRgFZdpuyiRyQvivhcW7VOfIHgSxDacGN9ENoE2QHVsgXvPEbWbEHEufIu6tftTbHt1,291519ee6f81adb3,747358724135cd1c -lDEQgV6fx9Z28SJOKSWcBhxFvq6tQK9D8m63vEnfekQhc5Iqe3lDOEb9WLGYCS4ApZU4WkdcRRqnHL7TyM0yqZ5B1qBR2jI4EdiLbe0XMvyQvLkkcG4mMRFBZE46fKvty8CgB38N3w5I5kfEr6ra7J83hiOwvGQwirE6VYwzlX3jR3m8MOXutpwG8688rlKZgLBmwuHWutLa3SdUt0LSQaes7499Voj8UEOdxTtQ4KwGaIlOlyJGm91gNUcIOGY1vrMBSAvPPMNSSj9e7UqLyELLoxjbyqlrT3mtnRDmI46CUVFDZKoPsVT8j8sCwcEWhV7t5sb26Ooa4WrnQOMzVTC8XqU4bIyatmw3lek4KZAhVO2f7JH39KYjnjkzCDHTUnCxfp37VEN7d0uMoENFCOlO,603b8be4d6d809d4,3c265236d49fc447 -tH6D7XjuM53PXRoRSqZJ0ajucJ5XVJsr8yTmMkWDmyYaLyR2HN7rkDPlfnqhyedq20IbFasYdp7KGgV50Ixi0qZLYTA9bQXtbgFd46Uf4n18p1xo4zf9BPg3qqEzlPDI1hjyUtZpXb5GOA2uL5NFvWYZ2qq8jZKxguaudCocm552zx1KYQL66rG2QmpqLb2Qo6T37gSaUBXihDogzlbUNiVvlz8KpjylDicdhrGZwX0FcDpK8z1TIfSMOnEzn03jlnSLkmphDX5fdm6t1XrIi8w85kBUpQL5o9lBkbqPj5L61RgHvQM3vUrcfgcxKCVX67Ul0lUBOwVCCpoaZ00qZzFdW0EMGYnox5S6CIzW0m39IFutpDvHlNN2cVTcSpoJPxe2dGlFbiGwv4x6eNvxs6IP6XF1x34zIjX5YDI4Pm56u8AGhRTexMWZYlxvtOUWbw3T7ca6Impz20mpi111oHgPWOEPCuRFUP3Lw7K5EvWj7M5QElgBYCJ1xR4Q3vvIh4wvK4lwcooeiVilxqt8aB99lg6JH5Qo1tv5Hh7bcq6tBV3o1WR1G2xqExThbVLiWr1pDENGIqsf7LmbFfB369dPwWk8XNgIm6H4Pa21iXqaE1XfGTfEV7o7fMtoAavf1dMIhHuCYUeOxOi8rjWVZtV8qujb3fCyge3GHXEq7Jeoxaly8GOeNkgf5fTAgx1TVorYEU7Twa7NpeVVdXDm7HYHYXH4fdwkhbQTGMjMRPc2awhGiBDHCxrX3ey58Fv9QZDFE4pQUOkDRMii8MA1YJzctzyVwv2q4SsHJCu5PxSjoPc6L0R8PBnHJ5PutawCpiqJt626KSHZtnOQmolGSnwE1sLbJK8mLvTz2XPyxGXZQmr8BN7YJxZDfVsR2XeNJd4WPxA8xiCdDTs19YpOu9OKt8aki7Y1sfo0Q3Nvg5hXHNKETFWmBdjydMNJ2HVbZBqj1Elg9rS7JjpeXsKZ9FmL,32865909f2279b2d,fc069c4d8632a23a -8CB11IIpyVe7s3W8z5BZVzkPegDI799lmSDeHfYhCOccYo71vn1UAH6DUJMYsKOiWf3OG00KLxeA15zQz4ol,84271555e65d3f1f,aaa6a2a9de83976a -ZnAPuz1BgrrUuDMD0SifKRnZvYCe44ptc4OzBrsI1cumb9dgrc1BMAtzt5VXR7ezVLIdquUD7Xoax4Y2OR012sxxdBbyi7ZooD3ikcgHZSJL2GH0kpSF7Ld93XGlVAQnfQZ9wdVHMm2uCbG07VC34MPMlzRWAfmc5pm0bvaq4D87JfjDAQEibp2Y6TwK4gJwRmvI1rgriTaRc41Y3bK4vpX6mfzul,2da8612683a94892,5998b9fbfeca8a36 -UrkfI7r3OeW10NYAFevmvKnXXKdGeglpBXgFZxoRBXWPqgSEg0nq6qtiBaPVL56701qO2B2AZ6i943plvFaN8Bm2nEwYSJEomOrOa0eTT7wXUlTZohmD2RVduWVKVae3oXcY5bAFk6yr9JYAo3sBrYRuGTFSO8JEiGubogmTcenoV4rBBMtr6s3vv5sXXiiVyoWNECdIjCaEPHwlmxhP3NK4SF58T98FSwad6DtiM2tb81AerQcQj8AB0ml3ccIpeGpYaMvT1RCsPctQOXDaY9AOm0Zm1E9MQZboQVoHE39zzGTQh,6c4d209d7d60b153,7488739b2318ac0 -JLJ3pb0CwfVGDJOkFNR4B47tjFocYfy4d1PYQKjzqCBWyYbiqIaSpEzTVkhn2LglJk5sTj1FZ9Wr1cAug9p1EXNAxQQzkdRQMMdIJJl9g9do0TMQyr41DidOktqam2pLLNMZh9Du2jwhCQMWvKWSS1ddd4GzvbgTFDN4mLuHnlpPESPTOIpSp3aKmCxxmtmIHcvTZme9xEflNTfr4ag2YiDeFKv7wzXdEIcoDO5aBPWwNt6nHut8FYeMMupazFoEfVK7SU8yp4dRUTpqkqA2fwI6SAurlxBkpQTVs5aHvJto0wEIWbPuQ86TIOA7kMAMoEmJBctosPKYBvhbKGEfQCrag55H12xWwprr8kh4qzv0EG8fow2WjGv5Ue8zpmLw0oozSIIu7yigscjUJGtU1cFAegjLx3CXCHhRBJCVcvLYV3lmZTycnkg4OBbOlt6q0i3jjpcnLfaVUWULRAhkrQKuV00A4EgVb2Gs0vk1DSA6VRsMlCQkXqNbwhxRs0ddqeDhmB81sAhk30WWbjIbyHv7W3PDCZkl5cx0vb9eboGnezbVRJaCTdVprFizIJio,188e103eaf28fbde,4b9bc837a46194d8 -fu3Dwr5s1uLGySQj5tCjYlvdC6PGh2fUUrn7apYRaHIXVpVUADLCGHMMnchHtkXI7izxrrefZa1pTi6EQ9iTQM6GCxm6cpKSsuxXsGCSGZ87W3SusV7kjVG3Wcw5Gc21HKIu0EqgDIh1UWo1LaozO7AFNPnSVQLFe1kVSAyhWLlrWUBf2TIPApF2zST9faLBsOKNYxxSg6k15tgXcAXNCj2z8U7AN5XACZyQ6vO0OHokPkHcdYi6S1kvmK7EttwU9EPcASwR6N7rJfFkau36ALZlMZJSUhvH7TxZNdXGtMKrBadsKZa0nO6ykqXOY4WlsSV4deUi9ixE3klsCrXSRhNOfkxpFqRbndIJpJC0qGIsktnKLSOnGdDDrPGLJsKSeqAGi4yBwE7SG6wgtYDJEExQG1dGqj95smsOu8OMkuDLVIdyq4TpAmZYrYRLtWhmzjfxoErvaJI27LUWh0A2A8rU1m7wz3iMPnnovIq7NiHTiuQjexaH1RxxprNhYzC8p87OvzHllJiycMcuH2h2cPeavsZz4PM2bBTehWiMQxkeT4wZLgNVDE8OsPzbiznjN3J9BSjCjWZSHNvJdB5gTqmHjVxsNycLzGdpjwiC2TgeBgW94lPM1cFJ6tBWkvzzlZuov10lBdPqM0DIs58Tv37kWuUwd8P5aGCeHnCdVSzrl9xCBRgeBJ5nuTzDoT2zAFTPy5Ob8pJ37ybwoNGEaJbvygF1oZdEDxb3TPc3dfBDOMChx1Z06tLwDBHQzpza2mZt8lRAOKLnPFHCSMyJKt71qxgD2d4fmxppf1wcfBOOLedg7KZ3jGHFrefTqkEG1XYqpBqLJ5cKYQu36mwON9RQ0gHIEOpC3yaJgXrUr7Db3mAVuWy,2e7a7ba23f9b0c9a,26e473d8f50f0914 -2NoekKQol0xjgXYLLNMCNs98C5ASqAYglIgaSriuPyO5UNOVstiG9uz7UsHCmXaYoI2z4A9ittV08ErqkCZBwraBmaQ4E3C7wvcYCBUJHR6Mk4uzNyuR8SSxtKajdC2EbR2OZKTWrP6dA7u2heqDKvWrIqka83V6wq9Tm0QEn0JFXC3EFJ4wv7m4eL03xd65wBLoayrCrzdKsWoXLg8lLG69JCTrfwVWHhIAt8McFYhFbBfCKWuozQEU2XK8FJe69d7t1rsrNpq1AtD0hIXrBDmXZ33qxvt8S4zT8bIeU6m0KiCJoMb3S9h1bSKbPPLDKcGg00vKONKYal07iAgV1BNKActDZNmQISnA0bHXg5sXLDFzbzSUf4UfTbP2j1z8LUg0hp1yaG9j9k4rKzbtNZgapXgPtO7eH5TrmBPmrhEyCwkuoJcaezfvRxcnT62SYoQbbHtdtg4Ujy1v8ysmnyfOTdyfgW9DvBCHZF3ZG7GtoYe4G3g17ou2Fob0dXHf01X16RM7W37UzzbCv1lthSjZUugz5lllDiBuMW7UxVXGvPSHg52W4Bxb9k9PjzCpOLEHiY814pVTzZXNUREsJuI15F6ekPg3FDKB4cxC2UxJKspal72qT6TpfIRtRfJcTO4mi59DrW147HHJUJiG4uuuBbZ4dENMt1Vlqubv5hwQrNZoIEyQgZc0MNxuw1Qm7rFBio2dJoH1ZN500MryIQLmjScOtfDYIOuYSvO2CF7HACiPJviCk3v32alqPwQtPm411Ajm82o9X6mEyBBJ0vRoZhKeehuNhhqHNl3zcpXF3273vMt3TZ0s11YfK36mE2BKIADSdvxOmU1sblNgYoGGl6ZmlOhLHkjclYs9jfFNzoQL7aKpBeev4YKEiHQPaXxkU9Oi2A3X9kiy1wZeQyX9y5uFLF2cKf0hvbUxB0YDbCsrzDF8tusvb8XCKqvgbFoYBMCg5D5ZsGXAeuPkKcePsKYAGasNS,fe3be8473cd84845,effdadceb38fcfb6 -AowU10f8p5nBjZzJTsfZfqVc8JWksxCLW6spYF64XIOQGzd1s955qUOe2toxbnaTweegy5XPZU4OcBUcZ9mJPnY07ISVv7ND2JLOvHOmCC3kkbKJto4d3BGN6ntpbQKNJp25nhPoMTdtEzZ1ErmnDkQatvjrER8mvXv4TErFvxQLuJbM8lbzFosh3rIUjmSIfjVMSu9HFHojKuQK1ZRMGpWujvPPPNyCfXbAju0XjvxFAEsMnWndyJu32RSVTjMNQhs9Z2DGZhxjgkS27HR2IgLLR9aEXwXhHsZnbNkcX8uksoifxN7Pk5lft4zO8ZQXfKSRS6kbgSo5hjs13PEHUtSZH6uJGbuIyzu7Bgb80F4EwTvsdJpYy334jx4SsIoBGOcyOhYEy75O9tqfXe77Dx8T2drwTjHxEgOZd11K2RWBRo6Uht2M1iNqZsaHu42nzN4DycjZikC3HZfHRGfWgSCOmRyZDUClR3yx6ppCFaf5BGjZVyOLyHj8aytAGYwRCmPwQUxzNtwgQPwTITHSarervi5omYLvvGmWgkvUgZyKBSZ4dIS3JdpKVbiwx2UyiogEQHeWXuxQ6vT3uvLmifduxX7ZeckU2Pnm3wIpnPGNnjPB5ytNURizjwlBY1ymG34EeAenQeueOmqS9CUKl2XHoGVgAchfRXpkZu7Xlzh0hcOLKWMVYGJqUHAGuZkxgEeEjz8ONABtWQ7aMUprropZmNvwtkbpDTxfqQdw,c3c59342ef1f855,e542edffb8915b68 -9YwzHHoZLcvWHD9kxfUo5YTgaPNwXRP4SGxsYC53LuJQUj48ZDUhHftQamg6J0pTA3hY5AVtWy6W7JP8RnGXZbbXOVxvXbY9tI0xyLoTNbWm3im4U6EgOs3u5u7kJRTDs,4fead0d0872da4c6,52bb5177cde8b75 -al9XTk7m5aKmMXHdESNmix6T4wa7mcHApNqMyzghfTTcwCPSgnhpFywcmHgCPGfLjZ3X0tL8Pj1JvQo7nhdJdyNg1cFlZjOTAtyWlR13xjdDkaeKprIZyGETtmhJM4zTFhtXlYCJgH4BhGmjCQ3M4v6Elpb,8602babeb3c5b23f,268fb3ebcd4bec44 -3r9CdAI2dY7lhn3umjQMjEI8MwIaYcLBaPrqlQbWVtLea9p3GTsFylYVGWadX2dsqrdJ19uNfsF4cYEFHDcP5HyfSBzVwxz6kBE2FKPsYaBtsCR99pbzdF5bcgmx9LI1E2DF4qDFktXAHvnQG5kggVICsA8V8wzd2tHnnIbgkHxwCRaIQ9NpZZtpeLvJ27owCCh9h3qzvgLlgBs5G4PPJHcM2EhTBFlO9izGcVMACjKFGlEICn01UdbyURn6yhPC3zhr2ybM5b9ZAfVvLdGiPDnm1c8GZwPKA0i2WixTWsBqu0fVq4uB68uriRUzJcq2LvssbtbdcphiPaBxUrYpebivpLEwCM8Ia0rRicwG6tiZS1jmMCzCCwJ9dCyq6jkQr0lKtGUqz6eNtirh7AewcPzPrvk6EwRavZYzIuHpH8OWWa0ILAb0m17eOS7qCNGDd7pPp3mzYQ0meFl48coCcEacORr53PhyQsegQUDnWYfDf80YZljMlPRgzvxYWtib3SRHdoGYEPEPDhl5UuLdsHgLrezByPgKGLpru5pyXU41q1n9zimyPh8xsaARzo2WZj7nUYtPEXdVxNkSqkf78oTJ4q8W7UDBL5XiiQG9s2riZl6jEXaMVGQ9t4eB2FcPPIgcEWdUTc3TZQnXEo801f02xqUPkzhhcq0dUO9W6PXehlLoWp8BbqNjO9YjOqxZ42VIOf42jL1hHw4J6L3KQw7b0m6R6k9qWFmfbdrqHwGvZUm4jrlk2WJ91t36AttiEgepvXj1Ti9oGaKLyykq3yOJaih28pwWVCMC6JcuF4rzvQIMPuO9Fhm1XiHibnD735q2WPr5ZXSEkwkCCQz2uqizV61,c71e0c7593176fca,eb563a9ab2f32685 -8Pjafwqj9cdxEm9qYDRXyY0tMGl9eVkc26tOuFOI7YRcvn0TPQl0eMLeZvzAm0jGyqf6mZcRDQyAJpS0sJwIEhkfwyj8HeQ9Za62msmcFKM12EC7potNiwlJw2676EyF31uavpYFImPG6Bhsn4xABWS5yzXkOa8m5VudmJEAaMKl5nog6wSnxFxOi0ERoMkQz8Dnbzd9DBqzoi6VaJygYSOmWdIP0ACjw4UqL4gKnXmxiABMJ9JMCriamyf2KcKBagUc0LgkvjMjYiaexYViOU6tCPJ7wIb3KRIFDRbdreOFyxI8Mox8967WhnoIY6o9481DOGRtWhxdcDzjoNXpDVdBB1jkyKTYtIU5O3O7NtS3ntrOHFh0f9r3HVmUSVfvCTKOxlxD8OHNcxq3bcEWAm7mije88uNLCaPOzmsroYmotdh1zZj1fJAJqRM3IaeV8pCV4i19IBH0R5W3IuZKtwZ1fFGQKmyclFtFsmGQdvJZUEwNZS8wm0C8UVHExmdDgdLggBhZoViO9R3yk4vKjLA8uFmzrz6RRkeI8ryONrP9SaYcmlbgDC2l9sS6m1Ou8MzxZFjn4BAkq3wHPbiLmFqnsYtqMpJsdNlDAxU7l66PLEgrc7gGb9L4wZSPfrjKAj4fNAB4r49M7rb8gQ3OtGQd0PtYC8XsIwcPrLSPQyXWPLVNPH4DMhkIDqlXlV8qgSvfXDFiXJ12vbkxrnyxGFep7SGA2sc3etgtewmSMg,ba390475b1a170c0,e9bedaaaaa10130b -Vu3tP6k8p9PCiilR7S5M1YSrsCIjEj1pvip6YCFa8WwHm4KP8jSh5WnqACxnAKdowsePvinQgcTd6aoZfbc1vp6uF84CVwK4PzlSvjDmvZYvf8XgQxZR6V9fNhcjoOj6PUft6baUrsHyciYTbSfDKBN2inCahc0ho3NwD8YovZHBcje8SDQEtDtm6FfqviLfVQif0jD3LrCuRuASSxFRoLsnavppLyim9hFUstJsNlYv2VKlsJVAG6Ip4QfgJBcMetJujGVYiepMzF8nPGeCCmvxvKV3ykPwr1qH6NT5okzF,82d81021a215b893,6b79606dab35371a -tIyHoWbwYyWWQZCB7fDhuyPHevHe4PJq6oRqLNVXl92ZSLLekqWlR4NMk8rTenZhMUJ7SQJdwGeCMJ0JHcg5tW5eIb0XYKMZt0BY5xy7Ex6QuHpIZNaV9xddN28WUjTkf1OikJtRnmvhMqcB6AxfrCkJaDAGzqdkqlEpwiw9nIC4I7si8vEXIPIFoch6M6Fq0OK2v18Uv3ajgbQQqDU7rGShTUhL1jxI4MlYNGmpNHAFD7rWthXXNSzajJpf8VlIzFWsfIdEYalpIXDE2Ez2J7ZLuLjoo1M6qYRL7PS018RUJfrqbdbJtSbFQl7X4PT1gNmZQqXNYt027nvdcGAmOFdkH6bqkHfELWGbsBr6NaTjV61FSHxK9Bx5sEqUE3nCpz0Zd8PW2ztVgfd5jPsfsdtSuH94LcC9Oo7DMNdEMjEe3IAJmIoPWpfIGYFzUJ92FvxT0lUijnn8B64sCSA3MMdKICHr91uxriLao7hMXQ6qlYOw6qpC9VZZblIgeuHXQDoAzkCAtu0GFCJeeEr5OxxRrqNBGsnP,e85bd2e0acc3ba54,3f294205043cafc3 -yHbuZYqeRuRazAXoJcWhE42xsbHgW361yC6HJgLnJksnKdOvrZp8uddozrb8MDcxwK7x9kevSKhsABdPd7e0Wl8PQ2tKj1SYrbuTduMHdz3whvCps0FXpFByjeiugpZFYFGQFp7yncEXFPucoTomJ8d8ZIlXzOTVhlx7H1axOUuQCTcIeIJH00Z6OkHJ7p7eKOgMr55QOi8H501WsfaPiDwiAnAAOqCoV5MFQsKzVv2OnFmNRIdFi8SqejBZmc4sPP0QebKkWwAUBKjRyVdwz4xc6vtsKnyP91kLS2K2THsRo8fqVZCC96JwwvwwTpllgRNs5dutuy9jwI4v667OaLndjoNVfU9F04NlVLiKqZVaNowCYQ3QURdPDJgiL6sdvI4eLW6vVGxnSerKQixnTaekDuKx11Wtlq9Uf8q2jOXMbgHef5EFmrLrtPSqp1O2TTrbI62isL7zu1CGWYWGxN29mgYWZpvR1VqC9p6t4FtRfzxbH9u4BYwqDhN,5cd9f7cf09a3a6b9,83626c82f858aab7 -irxGvIVS43LVLu5pzx5RI12MM51hKzC3Td54UFVfzBkdv37e76WHUyDTdEzpUpmjtRVDFm1ejOsrNvoNhc0BKr1VQxYVzxQNXQKq0Lc5wlxk3IxLXnoguiPIcDJP9YgTyV8es99uRafHOiTo4Id4WaX7EWHLuPivVmbcLKHU1jarefcQQZLBNR3EGXCFPcjTZHZ270npfLGQrH7YXNfKFotQzXJWAeJI8zm6zHp03yn5GLPZkrIKJgaU9AD9quUvGLXSu01cwfroJE7bJTV9J8HeyoJ5Cc2NqeDY,d7b5af094ef5bbd1,4da2131b61a2ed30 -jvqNcFC3J94ibQfTHAXGSY5f355AMOb6KxEhZCuo1zURDq57uALzQXITVZmqjc9Yuf9S1FKncgQtriQb5JGEZVnPKIq1gvxk4O153Ydqu1WRHcFFNijzOJ6ib0POo4n2pb92pzIjGC6fsFx8sSKqjnk18PBQYlMmzW0yAsoqCCUcPrgmM2MEBu5rVL5Lk6AGHkL4FCdnPN7PfQzc0bvqvQR4wb01mfqyJMiXSSksB2X9b5VeYsUCzpsaJHJoHEToIJlrsJX7tCQT8q7x7U3WXAXQsXV8H7RrEYTXs5DiLdqyE29lolMq2NvzQzvJLVO32Vb0P3yXQEGHGMNjpBALMG2klBFQIyOAiZ9iDoOg0hBOhKhPHsuPzbH3JpUBcKgjHa3siUyGr72yB4157locQj36rYYnxsheCHa3yS7ZHEyb7RYmJJsDw0H,93523623b30471b6,6342569cb4dc9d8 -EHxWOpJhOb9E6ZysmCbpa0yqa92z62lvgupiJ3QruYU3kbeZYjm12ASO0VXP4y02WU1EGk20S9tkbTDCTWhKkyidAj3YKpO1mpkSOvNnWcEKVPqH45moVSVzfFWqmKwD7hA2Y5wrcuTIDf9Pv5Wec43HVEw6AEeR3tfH2tBS4PUyd5T7BgG4dh0MiVluH95AGHeAtd6Yr5cBEk4Nd725uD3PTpTTKObnbJTmcDeckKiu45kKPwbKXVjd2ORhvgMA41LRbfnkZ8SgHnb9gG1WCuPex3W6bOnWNSS4Dl0zAGOVHv6fkixy5jj3QD3XRaiRahXvdfQHrmCGAUWs1cqcBf9MN39au77HEX8RF6vvQ4jRDG3hdyUWikrF8nUJTMXdz,653f3c16a1298790,9aafd76e5dcc5bc7 -tOdmZM7BkhTBzPygWSTa6ufYEFaApuTG6LjUhfAarXEMUrr01wqFfRYdefBnrRB5NrRmJaHd9F65ZUxgr0h93LidBjmZtlczxwB73hCBMkAVNozdkvtIrJZ4ofOr82AkQDcsnIybtTwRidNDGGodOncjz4UiYGi8IYNbgnrngL7xg6L0fvxzEfpJcqIuDuJvjMPokcF5kptOoNFpUO1MazhdJatF1PjeUWRhvsRp8f8F3cVW59uki2QQpzi0ltnvAyFOpPvKVldtUwgE7OLOn3xZb40sV5MjUbgeEd9z1n6wEsjPW56tkoWztkfTT7nyUcYy2vBc0MPxJWuQ9rZcmIR4oXOAjSHcKdtvuiE8jpfQS5JXfQtlT2H5J7yW2D49Be0ezV4BS8if6kEoUSddmNDdVoThJ1rt3KL5tJkCw0XyIXnOy3PFkXJaRnDo49S8lGphfj4vLfMTgIfLIqMg0IZVGWwEUdx22WvRA076V1h2pTFAMBG4Yj2IJxZkPx4jNLwKduWeH2Oviy8bo9IirvMQ3XglVgkX4yh3C80QDlgJ3yU0NpsIyWB99bxzRLB82akv9Yvxtdp4UTYFaF4lUfI0ANGTZECsod6bJ6tIi5n5AR9ZyHThxJrpytlZysKArerTZQluqes9DZe0TYUUSE0ciLMBrakUG9cfQK7OFoGYkeKFGLs0qA54DVSAlW07FysSOgiPb8gegkzOp1MsJM2t0cXIvl8FgkWx5gHWTemRBt4A7BJjdYT,988d4116ab43dd0b,673c94f139d9052b -koV8f8WkYbCqAxjPPQAQN1rDKEmQecgh4XEzZNFiByBx5OTKArdnybyasrGDMr3S0zj7iLx4HWDhlM7mAhgb54M7OQ1lMt5yThuN5scgCn3yNjjYMMDEp5zPGSocrjBTCprMtjwugsAPBEOktqqzWTS3sPVkzJYCCAWTbOWdKEA7hLT1RoSCHjdWiuZH52EfHDuZuq5ZMsgN5vyXc9DsHRCxlY0I1K4N5sf6WRfC4kATrgNULN26fJ4ho3OyWqztDJmcDYplIMOH4HB42IrfInXqJ8ehUZG4U8VESbm9kaJGpaInbxJJ3ImuFDXRmbzEaZqsd0V0KuM,96392533207140bc,597580c6f2526fc0 -Bov20lHCZCTCmTAGAtmXNkPxbS9tfwPes9URnvP9cDGEA1iuNbxPKcHt6TdDkz3QDmlpZAgTKdBtcMRD2seZCiquEQ90A8dMjKk1cKLfM7vDgtbScFnB00SaFWINZ0TOuGkT4bp2go7gXH9qB6mSB6sFxPtvLYRc043OQ1hIQndsLmbEBNTsEsFJbdfShfqSDwNQtv2fJk3UkpiIHp2xvFDT59TDDel5fY7qv6YhqQpAr8jmCpG47QWuZcQJpffuyr2C8ns6LVWu6NbXuqvJwA2QqMQ4VW8iSvXcYdhl1ixu7zdztRZI3Ak5jWODEaLslPegfQVDVToTLi80xzetUAcMHq5cHKrw1l5AU3D4XvXvdoetCLB5HL55c0XT0pe2uOJ8NHvSXMpR7LK5n7YN7qs0C5c4v2ZZok1ILQqFRMKSPlhDENcWNMjDG9ZVgdGpdDDTpo3rBANeadIF,89f9c2e914cd413f,39e2899fae884b8c -tQ47jcofVfNnGvGMw50TIuMYBnf8Qdcz00JcFE8uZw40K2ZwpA5VSHGeGPY7gFicDeTQPVXauviy18tZqV47C6ZCo9lgYzNvEYHAuimem3,76fc4b5904fbb312,95c903f8a033303e -boZZgLkuo2T1D55uTFEUWcKC8UOQXPbFfGomzc2wIAQnoOc13pL0cTEWLWrabzOqoqNN7kLEzO1egVuDigMihT0Wieqc67cC0lofrBKIKoEf6hKVfhWe3LfgR1Yc3BF1GohAmZVhTCKRWYubuDIjFF3XQMlp7NggMQxOo0w7IBzz5iR5Q8FpTG3AtjrWCT0zXjG4qXFZpidyWy8bNQxMiqNNaY0x8cJd50TYhNlN8BcIB47Y9lq4Hp2QZPJmspe1QALhVRvTonj2oRzJ9FPlaSbPmZauiW2ZUQfDvJtuY1uYyWWqZIB1bMJQUlg0RaFTa4MOFgQWCMFom7avWE764d5XbcvJWVDUKIYreIrGj5lkM638rUxX7ZnAEa6StQM6BzImR2LKxVcGpJy3CTHaQKpL1nnMUuljvIJeUAkLIZIz7Gr08iDImEIijy0DfYmuiuOTvMliVfbDq93W6AD4OW3a53AfczxKNq6KmFXvd5vu95VY7HEJoN3Y9jn61Sczl4BKsT6CdB9uNbcyDyVd7RCncBigSPhk5byZ5oa9DsK0vm25CN5XsCvnNhtlp6iB4TUE5yPI4yersn0cc20lRF0guntfwaFNu8YumAQn5CcSIkC89B4MNXlNjOpRjtrkE8R6DDzxRiQmwqz8s6fEoUbCGAVhU2WG9ySIqrnQ0WsuWmkETb2Jxc9OdELPz2pFxjL6MT1An71yxqQioJ20kIL4Ra0gNWYa6Suc,c03f9976a818b06b,6023c7a2fa4a1ed7 -qo9kAdZ2GjZ3HfksStb2YSGgthx3hsrENHP82E68mj7D1uA3VmOHVERCLMtSgmGJcbwHwFQuSZIFGjtnjTCz1pScMSl7UDcVMcfHPedudIHp6t25oqauRDrgCOx4AllPwbQToiY86ZlHumgB1q0XICMXj1BX7MsUFlNVIZRbVbO9ybxNDJd2FZbJvriw3h2ZmlNUqFGS9aPlwAn144dJtpKenqFJSocAhPyapz291e3uW3qgPdZVWS3o8wbZqiG0InekzojRU3GSV1LZOpHKe6xEz8h9cwabWNkDhYJEn0kP62UDY4YpTM7QS6K8BDfz1oag3CUUyWC0EF0buPy1XSNYF6jkcWwkU7ld9SnYvp5yuJE2WrulmAP33RGrg2FagSyJQdcNyif1zftfzPKooCMz2DKmBM6KDkvu0Xc35IcCn5r93Fb0ZOtx4zOHtKk2odF5Yf47QTJHe4NA86UtGvvLmMZi082sdvf2k3axldtgcwvji8GaxGIKdD8gKaBM88Uol1N9CC5F1tIGHJDeU0fxe38EGXIuFshfDnoHWSzZCmcd7eZ5EEdIQCDJmRgoTDfSEwFZblaEMdX5cKjpmPlW1PTt9MyWTzhTYi1YHhgNS5TK20HHqnwCS8oOIAWvtNkczX3vvBPlgO9yZMsxca0yhb4DvECf9P4BBr5cQa8xLUcPY3oTsOJ54zcHd7KVrZIaCGnu6sW2MNFH79nBgcV5sBKW2w4jTPqftLkMiSq7XLR6eAwQ1btVjuGw5BshSVsB1En9gazA38ARWs1omAq84y7MN1jF0cJTZtflmM9A7fQ5eTw2TkDteF6GPxA2rO4rAMvePdkI6SfcqjZblGlDVky8RLEVDRmgvsls3tOhHMnNWBSYQSMlDyt6Djh8CQq6LYdV4zxMmcgou7uX9zLSLxEujJuYKBEhWWaqoKi81ahD50mSIlWh,c8cf75a1a74392ff,178db75b4d360703 -B7fhgBhRwShTH7F1ow5cLBgB23R1aiPhM9cJJixn8cVmBlLd6GwjzqeDsndziuFWIvyUnwHB2ejIum6cbzlv45lykiXjNcvMyRjN4hsTzkOG4Dsw2JZY4dYQYtlNJwBIKw1qcFL89bjanM0sNIp,53cd5beaba34465c,ae788d2bcde0b6c0 -cTwI39YXl3ZD7hN5pRstVk1bmj74y7goEOJwECowd5zfHmMndmyIVIXwaxOBdpFSfuFYzOulRm0CeiOasuA8cCpwhpYZ7Fv5PeHfHjfDc26FYwm0Dzw1C9tgzuVkBBJ021DxNqrU8T7bQm5g1qZClSYaPLsT9Q8HS2oPI0gycWoAAGBvUc3q9W5Bbh8mcJ50Niy5rT9ZImAoOby1aerDnMwrXeI8JU0N96GabqwuRDspyofGuu81Yp3owYbbwjCqdxwi,6a7f09f52d77ee1e,56d9fe0b83abcb34 -mY6v2zQEdDoTGIKAX55U74HQWkWahpxjEjK2lookFO234h8y5aRiEoOHeSBxrKQYHbh3SMTL5wbfM094omRzjoa7TdSc0XvBMpMfz1IjqH8tdku5C6Gbu7gCey260v8aF3eLAO9q0Zm1cFqxa8RiWpleJCHmkkzF3eqJexwlpjxhjt0aH8FkMGLZAh3S4p4yHNw2E3iOIMvQ1hPjOetvBBnmCTi3uDVhDxga6fjxmmjMZP5tPQSEPvchuvRS86PQ98Yql5WUHBxsFOki8sReMuyAB8YrU46Mo7auETtaLNkuC0JnZnEdyvwtmAAEAuxsOPzRkRW2xbi6xTvbB2RVum7V9IalrfWDoaGQhjSu9a2RQCGxOtcP8aTZkf33XmlDrl7ehQSG2ObedLrLNzApQ84gsbFVHwQ6MCgXc3acZ15wHlhPC9EqdWTcd6yRXOvS2MqY9HWlaBwjcgnR0KvDo9d0gnSQZTscxUqHmuElad9H1E2ahpC9FICdCJwvQBL5hAy5OrvDH1XQJiAOoRzP1sqnTOhdL7qz4VIwSt8HeGw7YgWj0hRFzTskZ4PtJLlbxgiIQO8ds2Fp60UGJ0wOeVDGcIsLqUWgJwbsZzQDWgtcUSUliFEwyCnZuyFMOu3dtTyMIptOmFYtzhOaflBfyujkVJoHqH0QTtM2aSmCu5nqPK42KwAuat1LvpmWqDQ8Oh0MCXNqlkhXuWRDlEM6XgR,f8b39ecd79e8bb6f,d1cd1899a2089c32 -ZkqcZuRxB0r5nxviYGD09iVB24KHSwLd3rsCqxPG5176ltDESLmRwhZlHxNVDYIAWR8ohKUs8sTVO59HL9AS6LKCSa2aEZALdudbPvnnBZJEdOJmcmyVj6czGF01Owv5imzf3MFP4wxfXdtSDgAUPT4nqxf7FhPWh6bxxInWMwbjjZWAibsDl2tpqLq9Pt2lSbJfcz78SeWPz7LFd9bgvWpZottQf1cVKWtBW79qaUW4MTYalNb0mRGadwYLHVvijQwYY8iHwNTD0t8uo1F7f3jYiDRmQxwTvwanex1phbgZF2Jf5fNQVvy93JqPz45omQUzMV3Jbly68YmWF0v1p3G5jM4TCwAf4exI,27da3f2bb4bb6f6a,4a8e4e14210620a0 -S3n0sP0A2EQJ8k7ypAtD2EPQHPKGZ5nbIdXH6jgWuEA4cMpqRmkn3qsXv4elDGpSw8OpyhxpSYk8T38TnCS6TLyFmE7bbNvPMMk97xW4eZkDjkzyn8BQRVtnF0PPOfl1nd2GdfK9JTQbmLW3LeIgrM5cDYZyHACxYnJVbBJWqZhnc0m49GoEEQJyNlWuaJ7raywEtaCpHJQpKB2auz6ex67uHSVCaCG9vau3sAeCYBLJDoWpioagMBH7Rvm70jyXPOvsAr6ybEeYxTbuzMugbPPckDwyFwBI85roTj0rM0AdeAFNJa139TU4U7lamUoJQQAX22lSPZzdyAM31SDWl7uzFXS84MpPpdRsSnBZd1qRv2bMEMMUn6X2kUcJQJH1wN3q0DQFo0vFdqOooZFDdjvsroWfRCdGCRbVdtjcCPTYsyd9XZfDXUlxanryh4Ya6mcRhCQsFVk3N3YSeCa5FQ8ZLm1pJGaodfn7R2bwPzNMgKcnFNLpWxHGqgyiZvHdoQw8WDXlOUm3mhU7e2K1gph5VVVMc94JPMUZxpiNktEloNMW2kGW0XYYgbMds616Er,e80f27e22b1ce194,c3e910eefc408336 -Kk8hGyru2SixqX9m96U6nuHLNtOK4XNtZ8eGm6Y5ax5Mofw7hrSfNnh1KirhkkvXc5QTGUL7VTtXWNIFSVJJr8XWQpwMwTjNerrj6cEbmMPFzm83mix1Wg7TkdpfBqo85lxJC8NgmIGEJp9QDafZE9QlgItCnYh1PMhM5xgFXTDULa9G2OqDWHJUMWm5E7Oqf71GwtXJOZ9pAF6HZXbaIdEAEf7v8xqZsFKte6g6bDFKePURAdYCIh7gOHOEHKfdMY0GeVhSWVSIDknlmKQJ4KNYtUNj6PfGqCA9e74W16KbGYsnJ12oIckiS6Jh3B4OoXyfMnudKxXzen2aLavnqeTVssWp91DNJI7g8OBmOvM3Er6pfXaXgfEC5o03bpGxvVuWv36XrYRDYZ0Pe30NBA0Vc5xw8MP2ka4tqtmgSjhs29RhiBgdTvFO7h2Uef8zjNP26g2Nk46HfO7I9mGgW84LfAcpxN2ZpjsoU2l6TbRRPXNkdMrckCSMuuaNaBcNkVo5DlK6vMjlQy1bEBBELxjI9JYEtSIHBS5xO8bWxkeMEyEHYhkbMttTB8yNQJOGuwq5MNCMzkecosEYXcvkXwJ2zJJxY5ntLYJb5SiZcGormAecD0vMWByHohZcc,d0bb441ad93380b0,68eef9f3ff5e088f -HS6cni4Uzlo5sm9AZV8Zm5iXq5vy7D4xs2AETPokqAXR3TOJGu1fFD9CqgMD6CrywcPqcnbGpVaBgP9IiJaMa0WJx9GMAQE5xIVhbeYfE0S19tnEboLrL8aHoeYjjoDzvPp2KiuU3Dr3OKWGfIkYIxw9JnJpHAMYkb3ql6EqFaXqsGm5Pgx7wmtpYBB3mnXV1SWFtqaMOLROxCukDlClWN8tmXiqkyNVFrt7JZiOb5dIYRmb2mCE41Gm3X5jKvSBejcAtQsfiHO7SkUdYG5AKNH3tQEUVURGM6PhkYz42F6dX6S7GqPEjHQdqXshJeORXE3KtMWK0APBOdOfIIHVP3N8cEl6qdWU20Xc8u55ypi4Q02OPbIt4UVAW0392pFTTTAxxaIA9ir6SPZKMFfZkbAeHGajTg6RqAoPZIu9EjBd1YC8R3PPkDeS4rrMfZrkiBZS71eDabWO742oaZsMV8xLXHA9zo2jNKe9xhpScCFgKlbzMjej0bHmX3ADQf68p4ryuZrqVySFs0xuhDetGMogNc8ySuTZ356stD5FExIRbxGF0y21ekI1m4dL6jbZgBB76LXYI8hjATlk19FqOBzVDW5ml4hPFXnhfamMjrlcK9KPFjtrKqAcG72lR4jR1HOtJTkq8IMijjIGPZbT6i1O8SLNvQ31rzsZmBbSQxs,9cd4d9c86444b9f9,5e8a7bd73c36860d -znKlI755viVbj7DFlO0iP8fXUITsyyc,c6e770eb1072da4f,d2ac3b04eea8b6fd -ObPo2bCoMM7WF4Y3Hro5hf8K4PZ69bEpLJ4kNmlt8a2Xz8iqRbvRDhxntOwXuMkbIkjCfOQ0ZIIjbkLUYva4SI8WZI8qePKakXM3VTLrb64GYEuZ207aDYU9tvCWNsZFSytsGN144sQWJZESIL4kMaVlrSOG68QCDi9dRH23k2CSmRzsphtT9H5HQPqInhfNAw0VJ8LJ1rzgfiJwTKV58XFiac2u5SC1s25O5Ql1AuzdGRGMtAWi6xJVcs8NpfHnWa342j80nmT9tYA7rhEaj3rroflQp1RNVofFcVmb3HibDYKDnCo24fapETbCjwv3SJTrixc4lgstcmW8GKGaJ0IlAWgOPt1UH1h8mQSYOXVumXPrfBJjoW6J7eGRlzMGZ82fHuRpLq1DDa2bC3skYU1TcpHM5JAFFhFjPXxmj7nidN8Ss3Z750rRU9MJN76XgRpbp3uDXF9FfmT6ILcWGT93gYd7b3fOQyNLo5h,2daa77644489c36d,8d2a12aa42f264e2 -9a3zLlWzgvpR0SK1CcDdO5fuhZDyedlaHLPaVw47RnxzTZpFp147QQfNxgBN5cWYm1HLK09N6RV6PP6nCbZqG5lrxJSfdDqv90fXYafwzySuLwlNx3Qg5c7pg14yTPLkTqc6ls9zGmHUGipniw5cwxS0ckXFp1AzrnFNfszcZghL9RkdduZcBHpZ2eR8J5Nr8Bc5LfZtUHOZs3xzOIPwe6iXiB6fnE5KKYAFOrssF35Q7hnNxpcG6aeMcrxIBeTr1lRcnjar04Wxv79fsbsPT2yxlev16QNYmmebGsnS81Xkt5NMNXCeoPgCNTEKgfqwjhengpElwWRSWuyjKqG1KHnU6RcuuepDXHd7jVuD1SOt1HwlKHw2d91tItnHVSr5Qxc229nPIrgL9OONUwsxTmGN2Tb5Dcf2X0DgCVPt7Lh0vViChFqLhsebQskEMWsvpzpikE659URcOrVTq4lgRBJOKhHeJCGDKF5peGP9UV3CH,a749027bd4870adf,361c2b9296047b2f -k0uZcQ0BWNNMO6GFUKAoQFbvb9iR0SHRXPAmJpfHXv1wQKhSmkut5T2eW5Ee20ie9YqiqoraimSvto7MmGTJC53840TzRhscz0oste00YrDwpMzOCK5cBTxLrQ6KljtI82BEidf0jNyRyoAhYEifBKkczHU5icLRqcLQtwM5kShm1OD3jk8IOBluWYm2IgoPfKBGnJW5qCnGGGqKcexqjCZMSpOQig7aviSTixhZ7gzKIir4h1j6LBHgQdmEXBlnoEifwqi0UdYLIzvUsHvNkg07ZZFjoN7YScSHlbxS5L3yUA7yDEiIoXTjHiD41f8PtzKt3TI55P71Pjo,92a46a2ff04553be,2312febfc07ca6b3 -jtrikEHhwLdmKJmerx2Zzsv8arrtBFbIh8wgdEZ6Ino2uG4HCjl4gQRLMzmpy7ct5fhysUTa0JTD3N0RTFrLKFawwWxWZ1IVbqYyUCDOf,73c58dfb31af1cff,5809d02c5be19e92 -J0kPSuM457d7GAqfZr4hR1ml8gyTxh0HJgFb3SvylEIxnKALdtTgL9MzsipQ2uRdSXpJLHc7gr3Ptt38ZKjODGmv8TNwnS2E107pBpYlHlSO93PwrG1cCO9UJcF9a6WDoPxfBUOzGDc2uwclH3bPaVdOTpNFUjgLQdyKAGmp3dI8HFEcIQWE2lh1IxbIil8T8gqc1Ipz8KJ7oojgVJagMskRxcV556LVQJisDcA6hsa72ibgoy7yRDlmmGKQzSpKjUtUkF1PxLtz3Gx9BnTWEOp6z07uNi18ARy4OInhkVkr9UIhxoFSthswa8XBDthhxqiH1xatRFGKQvOYChbkk5luYpq3nqDc8WwpTLibpIBzI07O52RtBALOWFgL7QQtKvdEi6HsO7rdGNjJrcxZkJwescGG62kMAZMHpIYpyKrdUNOwsLws0TL4EJkd4ITVZufOIbRFKnpuMn21zalHRmi5eCw5kfjs2IsWgXIiKBye2bWR4BdyfjHwn6YTcjwBvkFak8uC9mNAXg2tLOCApObIo20pZ9hUJK9ISWemuDYxRMZ2PtnyoWEjpLNcWxySmwq6MlcqxSeoNkzWE7ZYZLaBBcx8A8CIelzza9SIvvC8OOOMQLp3hXFKwjKEdhKocPJREhdOkoqISPmlgqzLRtS1dVLWM0NNglbtsJTerNZyM90my3FOPLncbW1mMzwk1AxXMc8ysoxOGwFcuM1xIidXnxmfrVwZUsREavcNTz5wv8n5FE2W6bcqk0TPJMTrJvKPeeRnnm4GpscMJ,a6e4b387e0e6c04e,1d526995bf490f1b -Gu3S4scisxshzks34asBIxdLoAHFtcgzNFdegT4sUsGrVTjjiOt8XjscqMCwHui3wV4r6iJp7OxWvTqXolFMdlqyNlwDYLZUBwem4Dkdf6Vym1u9ud1w1zHt87OWwWCyooVwjT7psTil4Uw5JHKrqwp911LNfcjXH7uQgZ110ujEHcAulZC01r0AfUSoS9hdQNsvM7qO46qc5CBwJK9Am62pRwZf1gfIZrtb9NuzdP47T3bcMeA54Osocf7aEPdKxSCRSLxAp93KdLq3HYe6qihudAxgmafoaxskdVLQYnoeTGASzPk2J6QipLLEsUXm931zu3DrBAQ7mXBxaca1VBX01OFUyKLztWv8jgAOe9arb7CzLcB1Zjq8PTDlwoRs9QsdyzSJZ0tUFwZs4ghgr7S9z74351NjUs2SIN2JFx7s2mpe5eGVlUGQKUIkHc2uGdhgWFF5DBQXhwlahLsAbW7EmdltfQD1dddMPpM1G9EZljF6aTjORH6idwVvhMCINOSi50qtQL90CmeoZI4osAg8SzjPfPZyjEM6TBSr2j2ub2rm57s1FvdShWR80PfrLBIQeMHDI4eHEeHmv6uGpLfa5KKzYEHVp075OfWh7DrSPjNDP3cNvgjeLoheCrPPthsJzBz3YkALkYpk5DBmySpmlk8Pm8uohtoh9itPf83nJ2YCfvFGnKt9KQxMbFfGSwUMBcxuASp5TW0kuzMic1vvC3xYSlcCGv9s06cOhOBR6DK0AE0cEG1pEAunk40MKJ0IVUcWfJrL1BHiniPLelKo0JrGFYXI9GJifDA187BwijKAE7qYgAJtfmGgWa1YPS7gXrRpQSYnFiFtnoqWxahK7WQTzv8bub0oHzqZLz87TI8ibWXpNIcwkYdHX3eJ8kqYMJDXbJjRGkUWrlj7nDFtrj06774UzIqpCYLIRqQlOcP4OhnEG3oEg5ZVjk4qi5IRiaWnMjCIt2bSVZ5yd8jdCz,e0a782143ab30b15,74ff43644e06090a -qpV9r6zmSqsQ7VHO0WWyo0RLuwAqf3lIpywbyNd7Zp7Mk3dex6o7DKFkeb9vC9zV6HQFMplGenmvIqJIHwvcWA2tOPOum1tGImMORvEDMLDVlZ,3c89cd934d109523,56c49340509d8aff -kYD7PLbOBgPhv9jXDqrrvhz9xve4ZqJHek2GsuF9Zm1palRohw104E1qnssADmKk836zotFmCGc1opSIgD9b8NJ3cdDX4Zf4KSKxUH1QdKXMS2s2eTZEUYVwQPRXcD,5cef83fbd3807911,3c0bfe0511d8a2d3 -akT2FRslsm5uKFxQgYzzIreNZJ8SukCsqGmte4jU5VhutQAyAO6NxlmR8CtC5VrqFScGJOaibgKubYRxiWEcJgYNtPCnQdl5lsemmBLwo0VNeYTNfzk2b0zsKSC4CVipOfUNE0WnnTzUeh9upGmop5bSBCoesU8Pw5X6ZljNUb4037ggWypiwf6CxoxqDXXJkidcP,95dbd8f0a2a9c7ca,51890cbe6d0409ad -uAQ0f3uDYwzSegiN6TqUI5buzLzUhPzT9SphrTkRXkrLNMSRPxW27YCYZlKv3ITxbo8XFZ5kHlJxCbm9dVE2Gh2jWKJAapcIwqfxkyQg2ceaE9VTiBwTgMgrxlSxQgjCDOehkbLivgVcWMkNKMWPmGUlXiGPurRhQcCOHkrKbRIOLCMpiTX1EIGSmRysCTeZ5Wy40pUYRunDb2Vl2Xm6ncFF7itCtWLEeHqiZgclf8MbVIDxI8dBLq2ERsUJSzf9RY7YOdDyJBdJGqVTIQjtViSFbdA6Dc52E84gbkdjTjmeDV4dqPNvPPST3k7ZbJruT2I7vlJOHrOWXLIbsg4VAK5jMC6dxNvI5LYS5bHJz6JCaoUjiXMcjUJxmPub89HGDdtKY2AYW5B1OlKdzKqoXdAzDkSm5MqsdfWfpUXpSwQu1gCJM5gO9CddolgwyTWvw0jswCugqNWgocrJRPVEyibqhuVsbebIpEHLR3ri9Klsx4anSmJ7zrCGiiJV1df0LGbQRc6Wdo0WMonRevHo48M8riJjpciQxTdswKlqj6NL9DwFpXFCPFdcAb5hPcg65d6vNKbZwdtI44fFptC4bA3wpQFJQAHchdb8TJhdJ5dXAO2RAu2nFM7doxYGXKnZoQ1X83E2mQlxavLQAdsg996Q7sFY6cpAkxhHWHBkNQtZYmtdrKOEKoghcc377JqtWBoZCcyi3MqkhTwE3xfl08KLW9kMWMAn1zrzJEGqeITxckFK1Rcf27nn39ZL9FE58HQGDwLB6PEZG2xtBlJZLkYWLCggsCA0KrLG17wIaE9HcxdT9w1cWDYseE1RmJscItvCg6w4zvJriylCbgPiEqUfNbdpZsUtXgLgEFYOCi6JhY0dKhgzSWUF4vNExGGu3ggYEe66GmBNSyeqkR,19894db548e28e3a,78650e37ec70257b -gjQWrvbpdjibGHJWEjSg5Lp4UgUmTPZtZLab267mxHjsiQzdKNx0FDOJYE6RJhFeaTg95jHfGBvWXXyZB2eu5scHMDd9hpVA5ygnIMhRwzJipmdFJcSoDQC59QafrcQnIzGNRb9XsRhitYomY6ZdxyMINKpTaDhSpTcarizBvlj8OefGwHGBvkON6CstBWbt1u4Gng7c3K0L6BB0pY4nzDm2vDTDOmZdsM8VuWoXyENPPHYqDASrXwbFvgoh6wNrAnoeBV0vCVF8C46vD08sCGxPXOBAyEd51TcCrGkgfSXUmDELAFfcvhoQHWc2SXwkZhv0G0LXXIDcQgOXe6IUIq3UdKoijPQLyxcNNTbcdJTFgZG8kH4ditD0wIjPR6TGPZCwrZibkMD0xY5oux1E7gZCqBtma6HdtKNX9N5hAXGc3bQPBJGDYVP4gWRS8uhlFtgenKnTTz6rUi5NqxKyaKUEZ,dbae43cbcf762e5b,6216f6fb495ba849 -cgqdZu9yv1TEAQiFhi0Mi9UwzVLNJzI1oZSt2Gll93nCs43l1YtQdtTngSp8IKjtSYihgQMYAhn6tzYz1usChp92QbERzaEjEpiW7c2yoi7elXLVD0GZXDjF2Z4UPKie3jUiV3aAKCEm7l8rv1SDq1oxEkYXs93UGr1EFKrwKroQ32l8b59f7IyrhbZCJD7upwR3uRnKsITrKD3IKuYe7pJm1YBA6wiY94FqCDdSgI5nSdFJlJbRy6VM7jUBWbQHNyvx1Z4CI047Ra8Gs39TqSJ1EFtYUMbhKXtiJY1ZBuSOPHBWskUZyNkS37lORfEMttImY9AXC5Tqn0OlDv,66325f15a8e9d52d,6afba95037d243e -lEzvKwdQDXfw1OoUD0XIwVF4up8poSSuz0PxhY3KVX0SV77vnL7WwVvqMomVoFOPIovG8c6FGjCelotC21JgZv9nr8L1hynpJ8loveG5EUxEX5Uk5HrYgwaMtxvgYeYOGqg1tGWLPRPHSIsJRfamquIpjB9XGYPSFu9C0oFZQMRIdZddz0c71VfzbHAEyHtSGCRLtOItjwmrGp9jqWhyZTjQha9V6kCWohDRQQPCuB41xZuxmGiBut4yeK4pylI90RnndsyjntLQuipfpU4r6f2O4Ye8AGWmwlkJueQEMxYzVXYtGyqMvcYi0DKXQJivKdrISQEXI8F7F0nV4C,90dbb4a704a937a0,70cb5583d5ee4e76 -AbNRUdnWyehwinmu4yPrr8xF5f0M2vpNDXwzJp12vC8BruCURkwhJpzF72SUk9yWZDC7tXVgrrJatExiatFHGsbQTZF3BgTn73AOcMq6ol7gPvMULDhBr3X2rTRIGaseHMFlQVPnJqOYG6Z7JEwFYF7mMl1shbAjqok5l11UmynJIBhIeKbOOkzHLSRchAX7dT5EeN0RWEVxoacKoHGa4W12XVkuptahkhOS76tVXDRK3oB6OSqQmOJkS9MhGkhQIidEK2gS5gjKHKklI9R85BpIxPlHODsFuMrb4beeFDUMgYiFHtRU1Tw9hJPSsBR2FHvU0CZS6OkS42hMjwgZXxT60FTR1rLaJsJu5OXydBArmyllp1ivqfdwq6ahYp48f7E0hKBVF3m0syIUpS,355191b5dce58ad5,7cf42e45e69f7d9e -RaM06AIS7JH6typqkFClGn90ZLvNX0pcwKyRmyNXMrhCb4S9UCvE0NZEOuqBI4oyrFpa2aFnTmg9Nj6s6Y9FaPQsOEbBfXyrpb7a35jvtZ7uyL6ceW6BBKOM5CHLGjKAgkX1D5eLpwHUhEZJXmcogNUgA6hrZUoUhc2suYrr1QyO9r5y537vgGUVbrww9QF66fvOTVIyggfBhXeqZKsJ8FJMOsBjhQyek2YcIEemTR7V2vTL7xeRczwwfbWFFhMnp3HuQXpy4ZGA6lTEcq27FCb6aR16YnP3znTkibUsXwRiAR8GA32N4dMK7cphMJJ2Q5CreUpusE5vyZtpKIHTQdl6bprob6SLuKz7xJPMSqJ8UTgaQCzJea5lDFUDznflA6A5wU61BRHSaqibJoZ1UxmNEtikSkTYKH424QiHeP3WhbnmeoHLF1CZVFHo9SqfoS5WUvKcCq58ULfM98zxo7jfwAr04J9C7NDACDoP7xYgyHlXRS3S4t9jBDkhGDDVQz8vCft3IUrJvKht41ZTecnVj7WqVSYZN2fLwEQZy1UslLOtu0IlStN52ebOEjeEU7Ngkrh9PF613zjyq4ASegOo0hxmqFvf5LgF0oWUDS4oykWm76dsfqiTBRs3uvC44DRJfqfKmjw2lCzxS8junQE0EeQTJZwZ6jN5cKQAOE07hNbB172Wl5EoWv5fYY8xzFbtsGS5dQKXSwlz1afCrbEXUC2JIJSy2pqGyby7T7R96NetNX3fjxr3RoCU46MZXLV1r9dclU9JCdRv4w6iUXkGjjGl3bjfi7YReIuS7tO92j274ivjPLamacMcjgocw2bMjiUZ53gtIsNzQKBvCJti3ycjqflxEW1pSrcdpN1vzKEG29yzQmcJCa7aP6qiiVVRSO5l5mnnxMSeKEEyxqkv6S,14743cee64664fee,aa924948aec48a33 -VI4o68inQQNmriA7ynJTH8Re0jnb9KTt4kNX3ZfG98ZIi7COwoyK5Eu6k2NWTtTTkQSpP85rWUPXF1GGxnCSszB8UXU7KHfvjcXOtlLhP9Jsm4AzRl3JhXeWcActPHqN8whzBf6OGozJQ0QYDt8VvPeQg2Rc6tRct2htMK6LkxoiiKXFb7FvjpYSxiKB0QsfhfqNkrwUj5h4QtxYojwAYkV9nUJmllEMoxDWansjB8SZlPz6fZlLRPK424rdcGEVSchsglXrR5PpGNqbLqfXJVP798RX3X0loWST0wGm1om4GW8ttQ7c,7c6a524454579f04,b0a15cd2729d54a8 -wGZHGJIQZdBBW4TrzrIes48ya7Dmdxopt2MpGym9Z0bnjfa7JqLnGoQbHklKj9Ve5wdhvZa3kR2LuDpHJ4332HpK4EnAvsOjI2nGX0cNTRRp1ylbQVDb0t9bA37u8nx3TaVZZV8vxEQB9Wc5PVAVwySrFVGTRDKnjd5ra7QoOKNYZryA5EOnse3BtU5PElQaTnfNUPpRwB7vSiJDkur6SDLBHjIoZTXn8NJFDJ7UvttvwDaygIGywtAnB58nEObL7fWzSkHBwkzXu9mAsaXlCwm0pczlFkCm8kCKalYAL0GOC6Sn14eTO3bf49oQn5K8HBdhBfsRCwIroO7PDQzdNKO5KrhISFrfU6ZECgGWBNJRWjikWTKaeydyjhvQL4npVLdLUzPcmFa8TZZRNO,d9d4cf7166fef097,6c3151d3cc572a63 -lCbDUy373MimBJtVrdUioHSlgXsxLjanB3b0fUviVRuJifammZ7HvCaocSasmMs42JZDLPwTUlLyZZpHTLnhdprl5AcuZbueoRuQMpCxMxv4THsMZwdPjOitl2fEYrFhYU4aZ4keN5y5jEmSUS4Yrr9bg9FJTNxQurlklnBdzUVD5OSOGVCV0VUrK4uI2xITqB4taM0drerbgTh59wmAKCUURTVKg6xNwyWoIXDmBbP7vRX3nIAUzXsRGoEfE5BoWwcpxSDPp5Fyy57Hi3C0VTRJFCDeQWI3rjD3RUt7FuCuBpCJzfxd93OQKlLz7rqmmNIyXDGHyGL4oZf2ZcNpMgQ0rfZim4Ykuu5Pfc4iQJVtbb00rsLguURdYCU5wY3AxOQtEBLNcpaXcE9qbmTecceefXhHMK96HYY2Dcr3B9Opr4iwRziudI7ioSLdNlrycG4lwzKKOkzTmSJNRK7HA7EeQnN7R3o0goyGHipCiBPbfqmE3jfDH0OYhBGgts3oyRZCN0jKF8Dhx9TkBtQw8UwVsCOobCuM5TxCIpdnjmm6f41fGmLZSNE4mnQhSJ6gdCwJqvVTu35coH9BN03AUkWpyf9MTYCwVHL7R40wiOFeO0YvnP2G5KU5VksX2eJCmz8HpHvrjpqHRCXclh9OqyP3,e97692090e5a87da,704da088d62c8fa7 -V3xmqedSnQZFG3l8sBfe3MVbwD6jQOR1f5beSjcRsqOGcNobmU54HcF0x7c3l57qcaSCn4ec1ZhGsYt4i29Teeafk9TEbltDddWoIK5G9ilzbYEVobOLK2VDQGuy1tnVuEorisqGqw9EKitvVnimAwZtgAmprRpvJhTp7ZrayCDST6UNaoMiHlj3teB10OtWDixzJZthUksmNnJwVdcTswQgImLUQtfLxRwCNLn9gHeMq25IVqh5P2dsKSsor3A28cGkGId25BQQSxt41tPezumfEqtuyezGoRTu3rU9mqZhCZeXR008BXFgiK0H9rlnnQjTHHEqhInl2pvvbZYRhdVWY0BnlZI3,faae72294a738126,72503fc3dc0de323 -ZI4M60ko8E1WAqUVkUfRCYZZkCn8BiaM4BFLj6cxVIbMPbsmiM6mUY6PjGZoVg03ra5DcXVWvz8xoHscADDsNEOtHXbeh6lg85Btz8IIjMzusNS2jJ4NZ48ed9AHrEzQFGFdHyxNgRz9kYWwNQjR0DqlrBqGKccIb7MymTvSKL9798MFkiP2E17rY8ygNOmknNp8SBXFJXZfGyoQZpTsPcZrkLItUOaH7KS4GtOZZBW9vywoEht9prR09iCdW3RzyVICSBd2XpG5o84essjEZoI3UPlAoJYvy1dwMYBsCJi3m07pu8kUkdhj0Z5neCcMqedNrhSMeTcZHk4HW6Ocg2doYY09gDwr9EU6lTsG1JGrbFID3px4GFZoyheGilfkKIgsl6d6x1hFlcwUDW3afHy4CSVZBpXNeGGP7ivDUgfFO4EunyvizBprPj,c8cce5390e7343ad,77e42137ce31487 -m0hl432b08fDbMGigW4FT0xargp1op4cwWpE576LrQ77zVnHqphVDqBudlvWzTVHKG7NkhEODcCHbXdq66rlEM8ooNbpJzJxpIbBnAbmBK9MezjxCn4bCEZ9Z971BL7IYdf881AbMQIz4hUTCJ83zH9c8TbQ88emTQRgC0Bd4hc6rXjGIrxSAc6OCswEDiQ0wIvvmjI8O89NLhyHnS960c8LUDCPMadj0CReTAwLcjncuKykJ0Mi8iCWTTiIQb2F9jqYfMJNImhE0kpNK7TH7B0hJ7lGAvMafoqFubWdryScQQ0eFz32wPovjEDwiqcjOzztL5WPK76cbqrHbFO4oHL1uxnuNWb3L6oLPGRyTCcowbc7XqR9QoAAIPbBNC00fHYPjaU5fAwvnCzb4WpWU7Kcd1VomF0HDXda9fKmGIDIcF2wMNT9N8RhtVPPlZVw9HpiPAmeslA3EwMhGHkTk2sCnuuViZt8FW4W2MlGBKRfppGfVS9WOsDB2CavFd380xetRkwp2JV5vHAnN7u3SzVPD7JKbq3PSBVDrOcjEnRlD53MkdsESOzQXsE6k6e89OlWiUsElUyBE3RArBFhL16DUGfb2NHQPnodfhKdBaUo9Lr0332ydAwO8CC2ZS06UESPwKY,1054f5fec7c3ced5,89feda2ac046ddc1 -wPr95Kz4FjcSz4F1Thz6Njiwt8qq5VO9d2SE804BVpKuyt1xO9pJOxa3qsHfLvR8as52Ldf4srMIsy0Ebu9PwSQTmziSDrOUNYGfoMeU3smQE6IW3pf9xA3vF0LiHLxPSN13VsBVmouVWzifSrDq2h9ClFM6m5jHwKE0uy0u1XbndISZxbn7j3YVA2dQcZMeGloBrhYZ7A1imW9qWHRFmEDrIpTRKDJXXJ3g60Nag2FUXme5Rj4Zc3NlYYtSp2V1MrcDuAfy8G4MBvdFZID4z2ekS3jGBqB9QIF2DWQcY5YZ4UrcIRiPeaNd2yGjPFX2Mqv7BaZZKMNHK2YfI5bSo9upo2St4T10lJCFIxNJjzCdLG2gOtfa8qoa8EUjLc0qiDqfxR0fXa4YKQpfvBCZja1lBys52pfqmS26ovBQArMEBU5iGTs2wJc8Dtgc5Yl0cmtmFAlpjqy2CqiqEVTjh3zlw1vQkCFtXpFkO2NpGs4IkKW5H1a3Z4iAqo30OBJ7vnxAdmpkje9nF9HbQWajiu9UhoKCYQ3o2G5rnMQiFC0YTHFywEGi5ue2B7X2seKpUAKm8bS5aoFy6PDLwD53UkkBIAjw9zrFcCdZ7Xc2ZC10zDB04lVy6Pl1EMFAipMFPmnzXvevhRAiKWsgSgS5OtHeFwmxErZJpefRD6wWnvP2KR3tVQxu87Lpozqxmp4ks89rGQFLMXZSL9iBf0fJqdYnwA76o32L4FpU184yuPebB388fQQBcp52mCVCO9HwqcSyg,b1d18402666afcb3,d3c1475e49635192 -MGb6ATzNIwL5iNByZmAJFZy6s4CqiC2dP73Q5ijlVK5V9YZJOjjCcfRRh7Lvs3KaLbyGReJOvprjePL53KrvaKvUmopR9oaciQSk81ZlGTTH61MMJCBfbR4Xf8W622n56a90PXVRb4wYodtSGwaAB9vJWBXlfnfmEImfjb68cnRUTNqSC0DpdoVwWO82obbadMYk6DQHd4Ow12wkUP5FBEpUkQk2fhkgndvG1v0rpB63sRXKd2JFzbgb1kPFHCcDawRmoB4ybj1Ggvm3zWnAAcNuUx8aW9uwSUVgZiiqHZpHTHaycsceFlH0F1BCP4Vd2wFvhB7vRbkLPPqN3LHnxUYuqSJCxtvcm8dom4Lg1WTVPuWt6zMuNgfor5BcahmvM2p6LI9pzMACQDZsSsCQmsVrwkUqnHPprdBNnsSjJsG1Qzu4BFbBT1HEBPqwszLt9erXqF8A2E23eJPtYHJK0OgKbsgVW45GHUgO13,3a67d029670e7d5f,6881c3f863792bc9 -4jeQxyobOAH3OhcAwyymAjrSp8XeqwFcMpNrN1ZkNO880NmJbmqaUqC5PgeJe6FgtA65VWIsqdxq5vkGUos8GyFd2u83DTdmaOYHzjRjeEsBd4Uf8tU1HpBp25dJSzTGSVfrjpyMdmDInH83kbP2r3KyotjNO2YpQn5ZSathdWTYxNfr8nEYX95ZZzJjrRdFYbOEap7DgSy16C0ybKgW8eTV3q46NVrUqyg06W98FsBR2kRrFEwYsz7uONR8VmoFEcJaIpODxrYEzaLaboF5TzWfAfEIbxyIOwaXTAKKvdb5QIaukzNDHYYX10OagbLslMoJIceSWMpnUWeU52MebEUUBSJfb9gO40vKHwM6swl0Wp53Mwo17KWDtmqIAdrnsSSwDubkMzOdp123p5tB4N8sQ6gm7QTTgv8ke8iz2DJxxzR7SOUTU4umR9znffNRmUTSkatBJirHnXAFlF2fa9VjwbecqLn382CU3fiV7PEESE1ESekmjJMCdCVKkWso0Wzh3eLcHPFv5ZNwhLMQ42njvBXdxOPDGglyR9uKHGobtaLngNX1V03eiP0RK4VLss5ZO4nVdj85Ed5iqgRiM09hInl9lY1CWWkMHKU3NHfcDzksgKwKMR8C8TXTiVc20J7LzWxpnqL1EgGu1xECN6G0WRk6aOUb0rdtrtEjhgFJxsmwtnPEhF2kRk2AMzJ8PgeUAnsKRQXbszZHenoDN9OriGZQlq20hRchL7AJC1U67QmBtxcFGkKYEEMjjOjJrwTqVtTlCrV3e4BMijdUsBZWHzI3KAgahEzWjvcE7fNJOgYOuGAx48rFOUMc27zpYMOgmqNWYyBaQpDCCbpfvgxSlc9fdBW4R6pHJbKqPKUcaWEL3H9NHpu06bxo9GoNioXCSt4ixIDAN2zuzTIVEBhKeak9moElGrzT0GIh1Yi9qeHWjqdMUUpRMNO3kTNYDDc3W1wiWcsvZhRilMttnKE9DOHPD,8dada4b8de0484f3,656adaa87f418c4 -uM4,f567f556f5e83547,a5c90efc9fbfd1f4 -F3tWD6RsCctLMuhjbMF5SBT47ovC1miDzJmpCtbVoQhexrjNaO6b0egdwBnNeqpHPT9p7vlIcakZ5o8KLVrrwkGko1O9GxCovuq8bCeOYlIXHIV9ZsaJ5Jo0VT7Ys19DDjWFTw6Oi4J6SSmdpApxVFstvgAk0ZFzm7Vp3vCd11z1gi9pieFImnP1D1GXjfbdcHRjhrFe0GBBLEAeAqpDrFzgPesvQWdtRjsbFUitAupD1YfxCnluyGBoT8q4zSsZBVlffZTzeYbVD2c8qVm8oGATHnQxcSXx97RMB9QDcTmifoUJjeKg66gBpdME1r5BzQotwywcvopojp0ZvNUvwcdw6Nx3JTOHGAF2IRfC5uSlL0bXe4vlDxe9bnSSSe3CxrRj72E3SgBqt1ToLExKuljqtkxJaPeiH5B5YnPjGLO6zIjydWAz7yqtqalVcrmSA6nA5vtlZKiwalNm3LSoCrgNRHCUF8GVbVFjtQrHwBro4tQX8UxUGkLDIkaWBeDipBFwscwcbG6YJVPm4KTwWvT79077yjCBEeuMORf2QCQhEg116hPpQTtycpCWatfUgyTDnq2ABuNykKi6tMHxFpzDjqxDlTZuXqWzvzHdsloIbYt2GdQPunYvoSsVXnXnVhFJxaFElPu,5cd5aed71dd23486,6dd12509e3bd20aa -iJtia0odatHtgwTlB47Q8SMgVItHSkgWjfHHptnQ3ViQ9ZayX0hmCqWU6SyLfJooFQVZtA7ph41mJG5zgeQRQiox3WJVjKjYsdQBtCzpcnke5V9pjN7VPFMKPHHhE3Ci2JI3pu1RzkNRpzR7hBy3cCST5yOlZLDrEZkvDuqDDhaTlcTAbpYXjoYaH70m9R3RIxkntJjbb2c3SBWLW9rQlo65UrsgKy4T4AahKlXAzqm3jv3VR437bMooINWJuNANgWiqtfiLxFsvNBBNyexV7qBbddT2LtZ1WDzHRcSoFWYP6EsyIjvMIAbLqBlYorkoWO0DGA1HAS6btqxkqCOTjiK0xeuieMb9jT5Wzt9PZpnvKqpJy5akuR,169c4cbfa9c9a6ec,4e3ddace02fdebc9 -5qkPQerYg11QMxQYWkqbLO5kTROCCIl18KSg5C3r4l2puehci9mA5LKuFH7jyNEDTWyeeQzd5Rs5mjK1YM,eb5f5802485ac0fe,549872678c2dc4a4 -g7k5ErJOM4gO6A4wvilWEoEL2tkFmrPZwpZJEKoTWFDfqkft7GyepiTt8ybdwILEfzPipto1UED3keGI5AcFb814XEBHKnaHWFgJlfSzKjdK0sH1t0xFeQF9SRlx0wi2DnWtlEd32N1uZwaV445HykxSCWO343RjDtFmQRopl46tApV0OYlSKbtSz6ksrQ9rMOeVxJDC3y0xUxcjonmJJEcpzjAWG16hcxjxOv1k76a32BQhd8Q7KQYbl0lg0Am0970eNRsglV0nvE2dmUqLUgpH7tgGPwYS4jEe2BEfghrSEA1UI2stcTULZAqS8mEHKPoug9WE4vtEuSrNuwEDc9ryBAOnqG3LtN6hcoD9U1XhcODDTQKGyPpMeKmxej7SMgTVLylwDhccyL9rNPCIKvcXUOltHFApYsvX0SG4DLePAuIzwD2PMhnuDCYPuhhZQ9C5PleYjV5JOW7xBzWuTYsAOsEUhdewHOM3jE0b5JA8R2GFu2TMv51AmDT18oJPxdu6Ak93eT0id1sxA5q520s8cdAz3eBKOuPnukhh2ZGQpBetFk19FzK0iLhBG7CwfPw9jT7UYvSNU27ULjHOq7HODKMFhIESuwGrFz0DPwJrAiwJ8CmCX2dl9LCAGRGWcQC8bJn44Aa,a34b097c21ddb4ca,ab08c64b8875b5c8 -1IHTWkl7h0jbNYns2sZTOdk6TdjbppUod0RgyoSiKycPjzdJQyYLDOlp0Gy5lD3VGQzki7WsdbJwLCMGY6d1oTmCS1ulUA3pupB9LgSp7qkIvGz510bXbhf1U2wsA5EC6RHKopUMmVKAZhv1QKMvxBykZoMzxbOvUNoJnGHSVGyXp4mk3hv4p52GG1cOPKCNGUj7eIC8mcKyXYUefpAtIjvqj4Xj83BRoF5QT5m1orHPEuMMdfPB0txhWDQAEkn9Ga9w1r78RHSCvZdktLy3ewHzc8yyu0lZY3CHGyDdQrJVnFNfxsXlC0abe88hl14Pf00o3gzCqRrECtSdGhmzNBZbJOG8sbU22UcMrScqhsKNfqhLXr2j1ROqbUwEeYV9kl52NspqyjrDYl98tDeMgsTJsWpEdow956JmAa1HCDakcfw0Y8tMYUmdpHrRfm4gz5Iua0jbGZ0HOFXGAcNt8o2qoVRbrorbQB8lccxZiSYOvxUY2NgwoCq1iXBecfXPUHw04DIEGI1MyAFnGi0aqB8wEvGS8320Wh4ncKFwijpUx0VvQvuTjMnPczm3AU6rVPR6CwywnDTmtSehOBUo9BxGW7UT1c8ur49uPs6SjvJHHfwW583oAtveTP1PiaUu8bBpC1tiNi38a4ZyUgQaVFR95j20wuEuep0EFsRQn9JKaSQlonUJt42jZaakTOn8PsemqlbQ86f2GnOZoFxwZUpdM6sv7PoBXWqc1z01VXBkJm6jMpYD5ohasOJ3myfPWboSUvNnEaBxoQOYxyV6MDRSd9HZgFKO2LmKmizA8bym6pvg4Xixbj8QfMY4if7RfvzprNwDPZ3zeWL1jza8fp7oaQedxANV95JSnoaGh7IQoMdf7A2TQ1fMJsYwN6xT4z8OOubf7DUrQlDb6u1tQkCfMUAR4yWEs1ma6Qq45yVaQp86nTlxBshlE,4cf57adb3fdc778f,c4a95e2c9a823998 -AimDgPXIVZfFbj4DDKclPJgxphY9jBT4HjkZAbfU4j1FW6vCCuF8QstPwt1KqGh7tJTp7JYq3EsGoqvoldxZfDdauQ7xHE4jJQ2NubEGMcZviR0PgKkOIKygtsZXSlsZMsYZ05Q4NIWOFeMCaJVoBibNCtwnrOjCaPrDCJp0RW0NJqLBAUEK88agOxTsfzQ5yIIDZzveGG9EiCfvmx29rBbVJGAMA27vGjQ,d05fb649e0fa59b4,43964d3c15cdfa5c -gLGWtISDTdnjxcFkHr0B4LVO8uS5uIHaoK6e6D4Ca9cS113IPLQAZXtRw3kHetZO2BuewO9iEjY2lJZyJzoe5o3lEIFM4qZq4x6cZ3xkDXrU3LF6OnpUTyWitFQQqJTgwOvaV1vW6modQbZgW0GsSN9AGgHh2cuGjIUYdFY2AUXQ6bFFQCoX9sW7Ydn8WqqVDsvKCh62lXUVfbBTBXDQFoCwkDRVXKxZQuuuLOtfa4tFBapbtGU6T5NcuDK5jST6JzghNak50NKmo9m1XX3g7SCT3WPTYZzTnQSArmMELbWgj6IX33J1a5oTEJc8f8FM7BPdCt6RWP9jpyAKUY3MuAZsZt3MYo6qmKKmc6laKIsPNveFTIzegQiJPXrROcgLMUIXd9TUg6QgFkd8TbJluZA8O1tIr2akL347EMJndiITujNdXjjzsmDGqq8Xufj06O9JY4W0FCtnzuFJfl9Gc6DKphnSB4BUlheIvfG1evb7opVQqs2MoxrD6jP5rseEc3PlLlC31RTg8cWQPniJBejBpdZGbGsEAnQYq9ethOSKIzr9WYoKzmwN5O2UunPpjyAMrhXRGaRmi,734951754ec933c7,a6f2e8cba35a2ec3 -xQWq0NiV2qpxElo8AN74eKh5xJO8o0oGm5G85H6crxLDhScBjeK2XoqIv3SwB99yocLBiX8uDS4yTGH8DKjjok1Dtjcxrv5oKcgkb5Lt5N2TicbpiIE9mbAK8Kb9tsjrZIPGN8zVoDSGCxt1CD0KBVmjQvnBRnLJkTIf2E6mySMh2GgHUywqcwU2cwS21jQ7CIL5WjjEYlcJBqLa7P3iC,42d359c4a4e85aa,31545eecb86a7b4b -3e9WS9uoeyNohK78dn4d87Y77eS6nWSsuJh3FEMgRJuBTyT4PDfqTF3VoCHf8hH2UcHP51I9BlkRmbSds3yg5zcfuy7s4EY1Odr7anyBXWpQPy6bzkOcpINSvDoRrGUVr1MfjmZjKai7DWW2mZaii4AsSLqf3MvdDT18I493IFydoA87UceGdfglZxGDSwfxwnM1VNpgAbt33MFGHiPorhhHF89tyFT4EqWmUwDG8gAa5QuEG8fCrSftZ0MwHA510nw6GYedp9pJaYmevca6FygkVtEOYHfok09BH9HXSWzR3bfNHcMCoVGgO9lxKUFIVNziO3d5L7GtEraDS2pgnLyY1yASrx3WfUVWzbwjR9tv6ZTsOArSf2IpzSwfyuuLRdQRKCsou5UxqxVglGhioIh52TuAqjYL8SeOmsaXUNn2iU0xpuNrn34HIhxeEP8y2kzlcKAptXDZB7XTJgXTionr8M63pnp8wdWxZrkmMw2i6pcf3ZZcWjOLR1NCRAm73kfCPXIkjmELgI99KD1TKwpj6KNVqVU8n2bTtcztdRPy9OprOgZ81GRPVE829HJIlSKIvLbwIMsAcxlnthvfHPGsINq0zolCoJGh9OivZR0BUJad7W6YojB0F3eEaJn1UdSdOo4yF2gw5C1KJjyr6VlRjJAnW1yi5kE0eUSPN1BRZ1USHbXH9uoZzoDVfibfzNCVmzqIbkxdas8j83rHrBhdjGLWbmEgogfMkJWCSv2YG9ouRmyP2Iy28Sn8rXrSqFV6xpOtBv2nookZHYWZdzkXuJK2gfNObU7YZpDY4jjr7Hs2Uy8558mVm3lGrHNNnQqqK1pnJppW2rzmecVkoSiBcIsli4lQ,bd0564290166c961,b4adf370ebf3ee26 -fduWVTy4RSFlLudsSbx1VoG5hwIQuw3lW9dV0A0msRmZlJ5XhAUTFWB7HTMU7hGL6sLWQbxIgSdzczAiMTWYMfneyfMOhXDiQgwXhnD6yrVmhFTnL5MzhMQFA7pnSYyUex0zTPcoWQwgi7T3Pn57XGA0zcGRXr9IPhmINaUPluj9VIDvU5SjOsJBII6h772ayvHV6BVhBsuuJ6Qmy9uhmB8mU6cbdS1Re5HPn4Jhr25vBFsTAHAL3zbJi27xeK2m8hA7iGorHySGh2FL4JRZ3xTCaXtFUD5tJwo9ZZMZLD2qhjnF5S4gH2ktGX4490F87uPLcWICgngT40JLJ3X7hN18kRaicbjIeTr2emcEKyeG9ZlK5Ss39uaneAKDw0T3P4NynhHmV3w9VTyLCOm7wn2Ox9kGTydIRvQQP,a3ced102201da308,9bbba6f1973d00cd -yYNBJ5yud5QQFUXCFeuD9K1aKMWr6yoXEygLHFS4t1M0N5dOzhd3Vajzf512OCb5vbbHEGF06PpFhSUG8HeWD1LOScV6tQCyrOUKwOvNqqo4V5wizfHfFYzDQIvOB8l9GRFdZxRXaz4O6YitOmJnIjsOG9Eu9GpD8o5RRo0uGdzKAbcEMFdr8QJQCwDeANSqiQUG5dgV2iRV9gATG0h9Uu0iQpBDDR8dembscfpEMrOvGfYZHFLyuP5lR03eTF2HikYmm5YBrbWgE2IBtJwsKruePX6XBkavgAFPaBnC1XM5ZT50qTOtCguB5XaYAmbsNXX2sWAq6Wg4zALa0MI1Ul3aVrvuo4lUI7NXYUizPLiegM5LWQzguK9gmKDrxar2acUOeytzSp0WjPfnepVxm9UehPX4rcg5jDkE1ixsMq40qtLZP4FST6mSgrhnk3g06pJlyYWb2wV73nXQB61yz5r65YQYWWpE13vo0F4MDT3qPbcIVz085LAo8Ayj9gksNCWlBiOtjXsOD3Nk9ZkSyPXrESsqYOgNok12d79tzbF,7948eda7135b8b13,53bad4a65287d8b8 -GekVNJpq84HrcUzzr5HW5XXPpbHOeWNdRDfbRdZPuDlgbNWhaSJrgIu21NvCC5Cujgiija5af6GeXXA7XYbElMPmrb9AyurImsyw0nBhKxqcmSKxtT5awmqiDm18kt8MPUXcYnA6zylsSVzCJGFEYc9uZsYhe1HKtHCo5QGc8JE4MhGObEATtCVmUJtVHEDTimmNuCG5UsN9nW7d5Pvx9cJCAPh7rabGi4Vbd53Wtn558SHoRfb5XW7v3DDnnVe6xodwwg36V2ZrDKIR4lHA8De6ndTBWdpNQNcxzVJtKbaqxV1xhXvWYo2XgGiHplmZJtSsAFjrWSV1Y6oHJ94V8zAAU7z554DxxhvcPoiRX0OA9Of7te5cYNgqtU6NnsSoSS052mGJLdhPUHnCLtcdooKOQs8fN8WWl9d4k3jfp2p5NfkzdvgERM0T94TKyVyMvGBPfy15WW9Fge1mtxV2Fc2WptErLjfyqXzZa1tO9zgowzUlLGR7xrdtcTShLExzXVnHtj99decXzxVyfW3nZBA3h5VcxBcRuz2xck6fvFFqlZojKvGb78ilJ,fe1d52bec0779f86,fd3b509efc2c08f3 -PgVXKzDernMweKf2lYzD5jIyEsMi1ACFyNEdWpTXyT4JrlTH0KpWjkKGzmePw96Qo0xEsPAwEu9JrctKLLrQ2IvHXpuFRjTF0nGnntWOveg1aJn0yDWMAQ4sNx1kns5rgAco55k2I0mNrFFb8DsuLxTLN2fAgIRhHvcOvZiUZj9oOBmHUCQByfX2XJTHj3QHKZmiGukVSS3c9JCnyLKosNTJIPk3TjBLlIKVxKC5dOktD8bVIuP7MTnH8S1uGJua95Y1lBvhL5ZSHzVHiOwLVda4zcNpgfJhQEkWfAJVsogqyn7BUVPm7EjPcfiY4X2wv58EiMul7qWBtZKkMOSO1wodNtCR0EEEJ6vI6iCM0J4a4E5zOE442CWwuNxc5rr5Ecw6ArhhoZHCJNp5MgGUlOnZy8pXPUoruD61XjTkwnMC2YlDpt7W0K9lHk9WoUES2qEXtjziseyLWghwRDYllvnaK4semOZ2lnUZU9Fhp9t7uZSB7p4XS5OFMljK8Ln60fvBp9ubr4VqjTMeuyNuNuf9ETgZgNV7KS0ts39zpcRtBy,1ff08508a62273fc,a9c257dfb62613cc -rf2zh0cCObF68EIQM5qWMLOAMRjElihdxC83oYt1YAXNEEy6TQys3oapjBDZdeqTSHSiNaD7NGE1lrFtd53pohWKPaJKI8NQ3GB3Cwh0Voy9WVoylSOsewZ7O4B4pbTtPKtwNSo7ZCzPtrkkfz8,797bfba379810d65,a71859cb16240721 -jS3lgHUL4Up5QwpCU2PAnr5VWqrmwQUvSJFUjT8CzJbJu71uHMSxVbbSS8l3OMqI1Vsp2s9tjFztin7UuRoeVeHY61qdxBZ0jljfR2g5tkPYQlwVdHVA2wONioCM1dUhF5YUu74hD8jtB2GfeyDqhIrFlNrok4x77E4AWi8tLH752Qg381Uxg0QseGUb37hQlsyxaFffROm7PCIk4u1gjgir8kzvlVYdzQYHcIT9tAHBFQcttExj33aHHY0wCH7n7L8FpoytaBEapdOgG5I3oU6ZC8Bp9BqpURSknnhkLWmW7,54667acf5a19984e,148f5de93e2f98d2 -sPOrOQmU0ulgKVlexh9dzr1kEcahg7co1KsHAuyGFJelhAzMG6RJaFG6nF05gCO03dCvgmorZRAJvDdxj3Rnuz4oFrYYTCtlIfUXjN8NWNwqZhVDRpAvCCYUa6Vkzn0qLf3DgVDRFZeDTtLo7eQBA6CgR5qvE0fWBtlpfvf8KVBUXxlqLW1RhYoAB1LkNGjj5kNqoUmQkSlOzl2tYn3o8WkGGWVbofj0o5YFjhZX98S3zuzEratloIQllcdq6i3tthUncnubAsgqu7nYHeJkoXIUveG6hCSNwFAv8XGXZPymphNyFOtVKzdetCCDjIgqPHDwQNKEBtJNRyBreEwrQmSMXWCMy5Lt7RfbYA2TwkI82E6HnY8j7QFLYIFRM6UaH3qmCssRqDMuFWlk7VoHaxOjnGzfNANMva74IH8lPKtfP6aYpnlPBHekD1nmUFA4uzh9RNYiKkpZbdnWCqt7Ng9QnbOponisAc3a4,c60eaf69ded82fc6,f60fc3790e69950a -HromBCfMIZZzgchTjV9FfxQOgyyWAReSQzW4aKfUHjYqpu6lmYii2SLTRg6JlMsdSFTjkiJmHhkuWKZHs5LcR51OeFNFA76rjwh1VdkwCfBF4le19gG2KHEte6MRBgIUOa1IPdP2xONWFWdg3hBG7aJuQNyjkyUp8pujppjEbneAevr2wG,ec9f1196a962032d,4c3fc4002f4b0da8 -NgNrOWc3m5uzLOGItTKKOcgWgpCkLgeFatd9sNiF8ky7JNSHdQGhEwGtHSTPqGJSl4nvPyowjcK8K1AGipbXAgUIUOt18EwhlHYkF7LnMeOptoQLBidypDL7hEa0qCAgrW4HrS33DEqiHW124TF9OhYed9eP725BVDCil10Oq8WOH2DCLr09K2egTiTdbjZrBVbfu9ltakHg5yarF9f2JBeHO8d3QK7PDE8TLBtk346iV5fvz2rQKDG4wnHeakAycm3N6BEsIbjONGE4UOysCW8DoGvlf0qI8vArGREgEBqMr4qNVU3yecu6lEqN4sUcXsSqJjJua7WalrKYuG66hLMZQAuTuP2JNWaroz790wj4dE2gyBgpYIBCp4h5eBVzbZeKCZlDVg1YRun9FN81kQm4Ylg6uMzKVj6Ag0z8A06fG4iEFOWkGEnA28oVIXRaCMGryhJSLmkpgkFHNnwaAjFR0NWuW5EFRj1eU6pAiBh2cjQROn6Dd8kw2OJF0SOilxbFVnhhU160YNio0ehqvgHHN2Trr6IkLxv1ThPW6LsKDUqVWVaNZ6bqRgjfpr3lnhtSkd7ubJebyg4tmS8beqwuzLb1oWwTVbfstGCWPnJUm6awtFWeNzmR5WsGkrN46YZTDpkjyGWze5d08Aq5o9bkiL0g3TKCPq2Fq5rhGimj7JNqF9pAmPQ15yhmxBpOptClIF2m92Cpe2nVRBpFpCb053k1zQddAr2PPxWQYXb4tyJAU2yx3HhG1WbycnjaoeP9De19ddlIFGg34Mrgx89VyN68Vrp95t7qXsAXL3pyvf3dT7qo2Eo2qgrBe3Nrj3UsZODTHpWKfEjrcJYYXAdahejiPsVY1DkQTn0KnwFnoaqI1RYXcXDF,fde8951893bdd6cf,8232983c26b51a73 -zDQdJf6hlA4aBOc8ifG6xfSUQ3bpbzW5YjohQtwC32nen3xQPRG3kKnl4RMRuW6WrFKlCqzyXBFa3MbZInCi2xm5kw5dZnw4uYrUyQaBM4NXIEq4pts3wHDUVQReY4VABs2YPdiT2yzEeBevuQje0qMEp8rHiJM5jY0U0d83WjHN2IGSxpKK63EfGBQZ4LEcBjIO4Mr0YMUV3tJCpmHY8itlYC9LRr6shp1i7DnGQ8mR82b5nUhz8COHNThrIhTTxyK33Fm2VNu3Tgn3idw82VKHMVrc3HI802XVNTxe6l63gjQalbWsNAfm0yxZbHpa6c1USAQkQpvoT8gc0yLFyZNguvEyau030mPDiqNMEtC5W0dF3qTZji5d8ncB0VSKrTRF3iPH2gvktBmNXhA48jEvjfMBkmQDpTzxsB8YNPDgXsnQndU008M3wKMtGieED4CEtKfZSUJVESKLmiyE5vLlA35cojahzPao1nQigZhEZtEcP20ZKWyFSZ5UYeL6wnM98fXpz4Q2gTNtiFOahMvpRAoQ8sYQnfl8KmcjIhuBgG1JFls9aJoHc9AHuO0X7rfeE3YncFnueS3NuVb7ZpYVAb0CUytMD4d2fDZW3QWXn0Q1oEQhrpWxK6EarkpOpDzei7F04HBN6dBTx4LquAEcKRGBj6JkrjwbarPXOmnvvaVjsdRl,1457aae3263ee270,497e277cd01f0281 -hLF1BhVcMWlTNXMKWAZhxEhXRuX6Ng7tpX7ExiWZTv7SSnnJ8YAQ0AfyasczZDhKsFA1d9DS6fI4u1LPphd9AT4sl3VzenKJTBm2LB4wZejezAwlfvmZx0Rqw7BpQSHlKkqWsZQS5REALzLfCgYFnK34kf8egVGSWBwAFhw3AqyCPgyWHo7p77OGs9D4ZrpJJNQZ9BOZXt8CsSWgi8HSK,c86714d9a6eb6792,6bc38fac0bb6a54b -BMWqbZAqTR0MTW7WNhT4ljCywQxG4Ij3faaKtzcMuQ0ADMlxf5hGwyS89KOZyO0XqvJGJlLyPyL0l1AMRzBWaI6jx4Z6BLMz2mBZBOEVkdQS6SOQPDSx5ntms4ApQ9CqeyYdmBL3nJOtNcTYHtaTbadEK3IQxL9kRcAMZwKiEfq8MePSOAEtiP9sAJjXjOkYY53rwHWxy2mdYpJFF3rv8deU05zWx3VvXrYI9iMr3bGpftFp8QWW5eBzh3T5FhYWS8yPthkTCfOWxhhlnZpxisXBcQ3KqosSWweeFpez31wCJMAkEH8AtowHT4akV8fzYb7KetF8rubFqyIHM8VNmws04zy20XuAHhHD4g8YOvIkhtTRSpxK4cWOKAq0DPGUU7Qsom3zp45751lTyKD6eGsMH2GsbFt7SMiYzYSWKrlQn1MEJQXvpuFy2kAx9wlh3bqvSeS1SqvCXMRzl5SVInDbcd2GgTHDXWnqWQDefEDRLOzEkxbgRl4o1XIeQDlTpJEhxV3luMRiwiNrl7Ppcc1wVE6cglgBBcl8L2oMAC0tY77BwkDs4vUIBP4fTj6iKYtNBPrWiUKJ7zc0D89T4F56gXLaDIiWfF9goPsG7Fu0YOgRV4CeVqpJFcq4RgL8mV41HungJStvTGZ2r9deqA02phmyyHPsmOMZQk7txzNdvAAiyVq8JifmNCJTjPCR6Aid7uNmlK4c7ZbIbKlhH0gH9HOgzvmYtRaYFbRGl24efmQ7OVgY7NmGRRIWEMFWQkrdQ4crMSza4myHrRkhvGHhQYloZVT8xDTFIjP7kFInEAVDDbaxcSXoV2Cw1sEjAOZoR9ZlF4tbIPVqOmCAAaKbkf908U2hq5cyx9FPzVGXLGzqFbnGUSeZcVutXfqaRTJUnWefgjc5B2Tkva1SNoomEWALADydT0fs28S,ecca950db2926fc,cfb16ea5e6b844e8 -bKUgCtunhquT2ob61owUEIMt1i3NMO8mftXDgwtuUumVY2LgRu2jge9urmvjjKYR4fjMi8kN1tDPjEWhMCkqEJbtRctLL2frinhth1GG4KsPQgBe2HQkpodgwhI45LxYTzw0nvNk5BIbQd7VkYM4inxzF2OJrO9DhF1ikD19BNOyyzZxJcz5joEodRtEyegVcn9FWg9MlMOnxTXIIhcJQk6QO2iKTZGzjBWlSnwH04N7czSXyyDI0JgEPNrEulyrt1IxMq4hGBvKT2yJERlywUXbzx2hGMAKDIktJc0B5BWoNg7wvoQs6Ny6do3aSyVa6hPAfPDghdnJKOj9nG54p3Oug4uMyc0R7kmAujaUKedfn4ixTurvN5o2XYWu2YsE6Wqt7Rj7PG5jAc5tTHkjsSXr577aOhKXsLoyWMm3zQGrXjSKXxPvtTsJ9YemFy9f1ItnDoT9s2C1R4LKysEgNRckQBtMg3LHa1CZzTA8nlDyXGNMAwbz1TlhVluXEcSawA4ClzOwkBtX1EUSonaoIDdsxoXxCQqbz9GfV1ENyNqRJX9gld9fdJEFpNahRO1xLVt9TD5REZIVkZHr10z1IOH0ik2cNPs108R0XYgYkXb9zAZq3LugjPqRck3xaAy4peuMLFbycw1Jm0nalMEtZj8n8yJdMVv92chwu903ulFGJrm0XF3nd4g3g3Wko4pHNsiAMXEfxOju98HSkmAkzdKhx2DqOFFUpkYbD2AgLZroMx5xdHmFcrY0MpqVHvPuvsRJauY2qQzFNkM2P8ns37YMh84CBKcybzjyKPI40o3AzgEoQk1TvV67S1EeKIeeyO8ceavlyMXS6cCndbAeYYRzumsxHqWNB7ywvjzCE6BKg4XOPd1PupYMBFEpbPwJucAf5ZUp8ozWwpI501XtFSRALuEvbzIyZaPBXIwWeRclN9JIjOtdIH2lWyO14C9ZbeUX2Vn0sKNHFyPXcY679407TIfTr8FJ3y2lM,fa13ec7e25de7d50,e0dfe4798393e4b3 -DpkaMBSBjJ8OLriB5pCF9Xnh4OegOVmouqXZLM0lUfm8nP48FvbAMjENu5y76gaALamtLi7D20BHljSPM5NCMH82ndo2QsY454VjWSV7MzL9VNytgYl2QfarHv2u9PQn6VA60j5iPClWQExKzkqs6NylQ45pitn7gd2Gk4ZeoGwtdGmrD0oXHh3jjNIl1RCmUJGEwXzkBZJZ9IJb3x3rAKjNRbL,807bbd47093584ff,574eb59b73988789 -qisSUkuthzLvn9nyJqQ3KJKE2AKb4GLIBduuXuxnLoYniZkHQP15wiBCympvjAU6sI0Si53UuHmjMZnJC33FFX9i2rjTnPJcI7Tnw5wPmPdeW9hfKh42MOMXi6lljnJ0xcgY1nxTJvPVlLtbgiHyAD74Jfyd6hCOVvHPXbsoKpQj2enBX5IMvobePIyoBzrC88ggaaM3SZ57LkRzOffX5hEeVEsUI6VYq5D7JW8oSXQkKi4ogu9QF9iG0ISzQ31bGeSa5wZTz3bJL7SstgfgcMlT8Uf7LYgxRNSf7LxAfjyRav2dD4NLYn6HqedbYxdullzvcXQQb6kDgi5GdUAdcLDaaLoEhjItKoexc7q9EalZO00YMCjcbAhQ5E2af85ipAAUrvGWCwdCxNFONSCy6eUjp1us7mNiiLLclQvVN58PqRPd2EZesXsvt0keKBSFMMoFMkvOY08uRXTUGbM64x0wAHXUyBlB4mXXPiNXKtmIwpFb5G9dhzf85B6IVWhWq9wvgA4cf4VX4aol5MbYW9nngrHxwpaKeIWOSgKQxIZ4C6KQo3kOQ5ptTTjtzwBFhUw1greDZ7YLOLsCju,c832c5f366c1a13e,f8d1bceb1d2c2dc2 -L99agHqtLFy8Fw4nR0Lt8bEir70p1saD7CJJ0mdfLWtzJrCnGe0J2xuhZnGueamvm0m6aFAVLzT81c7pQVc5NK040aJ9ZV2JuTrQg2vv2Fneo8meSqLGhQmZX91nv8SvGFGJ2iKgCoGCf6JMsQjUEkojVr55ByTH4NCl67KgHSe5qxcoUGbWVZy1toj6ER8uWv1jOHsv4afzENYL3WfZ8kmedmrtrluoV4iYnafs3exh28nBM9GszXG7DSvT1ry7MEsowKglFVJJinRtghDiDEkayK8UT7EWOEztdeJSUjdYxtkK4mekxwE9qCiDmw0iP1L2roy3t5YpVnUK2bALuAvzfCEWLbwbXPXAW9FCjG0ITjFSel2d8N5zbalQy2Tie2pGEbacRnFtUbYoeiB7PKmNrUjCfoKzhNGv7j4wt5XGRqobsjE0ZarMfcDKWlURvUilyiKtXhQinWJ7cSVBfi400aziNt,51109dfc4da4170e,447dd7493434683b -YjVJeOERGHF2FLtrm4zKjoSQr4UQdkxPaT0wXbYtjYHvvXbza5KnosCjgB71Y2KPcfiGdw8622A2MsftyhaJKN8zD5oioYb8OSKFAPmPOPIJ7j9fcFq56xLc0sGMg1qXqCeyePXOQa22TxbB1OnjXrPTcJ8k1ebHt9WWVBwKIRY3onlUebUzMFimlRKZmw01sIR3Jv5r2bOQveQ0cb0YYlPtqpI5fCAvSZqnUBm7PY1122WkwgtrEyz9Pv29RbGDDveg8Dm6apP5ovS0PMVjuFv8i9WaVpyUTgIHiZhkBzymXAbRhVZjPsOPuQVe9oVv8VCRXztlnSPzV2HjBdxdTUUFKlj2hU6qOL746IOsDL9q2QNK1QskkpU66syH6QXKl0n6CnRHR26OmWaKN22jJBKQB36nML5ifDOXArV0EX6WBhaj3ujhhW08122ZVXJmkemOMFNHTbX8jTCzSMhjftAPIHU8fwhp1n2DfcT1JzZR0FQElycKAXkEyHLvc7WfpbrK5Pvi6ZGcFtbs9Bf7GxsUYLqSsGcM6SVqOcqaEy5qJzKWijK6i7SQzBYiHni50izFo76nQd6VFvUVzXR9sgprktIIEMrVBXz85N4P78akxcoHisTztEWdiEPfTiG1EPYEeJFyzO4mUzox3A9VZmRCjbvp05r70OngQrqJtx3ChiTwzSlGk00u76qrmO419bpN8xa6PpmunE3iUAg8xdpH0w5xF,858f1142cb2c7db0,8d5f9656923903d1 -60bsD7QuhpdDU5Az46XzY7veFyHFNi5W5bBuG6aWcXy9rJelmg8hjbT3uG9aeKL1WJj1qvRUClwSL8bAAyEqOPi1zLQmkzAZO8EMJAhpkru87Zgzas9bQWZ7eSJiBSSagxEVaeMq3v4XYSnL05WBSVxLHjpQUCnsjXGmF7W6IJpwyhfYJL7E8T15sF4qlmtgakJvHQOyVdzsqeuve2IriXqnHp4j2qamPKdx978AiQ5hKdqY4sm0e3jm7ZBX5rXWNwzvocxQ3gbcJj87OruYZqahdIJl6YT7VIOnw0F3PujQbLflmWZLbsYy4QtgfjQEFXqkjIFx5EcRjt8LWaXGwKKyWQSqtYIKNcEfSiDhryvcON4EthiAwW0hzTWroFEIvTJcBE8rENuedxpEso7yzWCokgu4jEttD1YFF54pMfHDVab1kKJ1Qg22DK9GCO6pJRppaTyOEcot6WfeSz2UWOqQkZKpS8Qr2Jycv,299073018d793cae,dc0934821ba9837f -zFrctU5cVRDqR3UWiuHERgZzisrcZ9P7lK5m9IqDdkKSQ2yBqwV3PhQqhJwyPGumlTspjeNyNSjLiZaWp0hZT0cle0sfjDldl6fvwxwAwc1pDRMdxcybN61AW3s6EOmaI3Rlh2JWnN2uOVwq0rLdw8I8CeVUhWDLHupZ65XX9ILCuyfzMqwlTHq7QqUfDCV3GoGARAwn9h8RYR5FGpxZTNIsCfV1LUpAh2N44Rn6ZopMYTvG6s329geEp3ViKLYbfMEKoSrcn7DZSjsyYQA67D9zHp4Sq04fS7lptrW8HoniQx1XF22zflhaYOwhZWMsS2jU0AepNclA49yZgULCaBEAZcKtzpeGBP6CeqppQkAjr32M2CTMiaIMMwv7CO8gKmaOmDdRznqeI0si4S8X6E2HYkSutNlRYNRbRwxZedQt6MMJMbeuL8Dudp5cHJoE7gQSebyldHcHzLBdIzKuH8tdKepbnTDGIxpIedZmtgyKxO2BlEwYBS20b9HMjzNwgt5mXDCTbqHGnQMls0VqhfvUviNH7ZKuZJKWnxdS2l9IKjFjcnZLfA4pWmhoxPLFzU3vfi2obepDgBmWjM81ADyQ55z1D6RLh4395yIJIHchj0IviKYtpx19mUIRebRJAsNWXAC70lJj3HE8rkqPXsZmGoWYayi0nwFAh4dgNcSM7Jijepy4TzoQuUBdmgcZllVKpADdHTyAwT1NWRMT3cNUGuS15G5e1gEf45kaYnJmiLYlrBZXCce5Yij3qVXm4voJTxd21sGbwIO1r1OHuBAZesARqtJiMM3Z7Qf42oWxHngLyhtWlu6YBCrZ52cgH6xJ06mkKBXt8cE761YVH1hwyL5FcqISFqn1eieGPPEiF5PWhQStIhLvhtiJa53NNDm3LzgvlY11UTydR7tgSQcYPpzb8ASq5EEPbwtPSJWOENDNAFuwWeIwO0A6BwNVi,dc3370479f3a2d57,935170d4ff0b47fe -1JqBqRv1ll18DqZGNgQtQdFkgMxqqGkbe6v3bWj0p1HcOJ1BcB4nQRl4ngRuonD0yfstWSt8JitqvXlVHIOi1lxH5RqW4QiCvPgjFpzkaj5ToGb75GPBTKUd9FKWWbhyMt85QS4mGddY7owcGmx0pYgXJbktR9TfgK7qaNkXoEsEY0FInUCe4q6M5IcKrcYVaWMYWs4xJfJpcQ5FhzphoxEoP2m4vKo1opJxHht0vmj2CXgOYSkTZEdfMhGdXFDgkoUjLnWuaYIL9ObBr4f9TLhlguED9E8faB94gBr12jvXYZfTRlkvjUG3UoHlscoeVrjXhlzdhYgXD5tLSQk6gRGPAHl3EWki48J8Z3JszAPLS1lw2pLLQtoWvE3Vu5Mg8bcDpJ5zMuEeFvJWWYmtSF4aEfNg0xykJSfjVLu4RTP1Zi7NspJrH1bUrsQBgrziwVX,a1afb97bd37730d9,474d5bdd5398376f -t1surOAg8JYC5z9DFQtcaEqwBV4ah02D5B90OL6vGDslg65iT7t4G72malexju9oXyiBnSrEpefve1tv5movLoPVS8jifoaxtR7hWeWC2pi53wLVddTtxNGyxNhwH2rZJuxwNXC5j6Wjjqtsze1k5EmktNDR5Gq1obHXxw3E,a871c2fce3244040,2e7a47de4be96cca -EqO2w,a860dc368778e5cc,4fd9ba7de405e7d2 -q3fYnSKRhcjteNioIDRW8tTloIuYpynSmP3v5LGUcV4gdWrhY2XduDDVy4yupFgBfYr06Jdn20GQMZa8f07ndFPBrhq7sFThuRfxvhDkX9yzJxvxeS6sTDwjaGZKRQIDMYUO4sHIrWU00xkvRO8C9Qc8PDaNuqxf1NSgCZ478nyzVnykRQluZ0PQ6JCcFIDG4auZYqHbKVh7kozRjcgD8rQJZmO2ZsitFYJgNl5aMow8IVCb77O79S2yuvQ1cFEs3zW6,d655b8382aa150e8,67cdf135541fc78 -o3jbbNe7OkBHauCN27aqG2MKq0um6b3T9n63hYokXDu07J2AMTvOUPZDyF77wtPbOA8k65BEYphXJPTjowDranjK8taxYEjw7cQHD1IASaHXj5T2fhgFYSXVSH2KR7EUKV109zpTJAIeOrH4EPHsqC8tEE7A6Z9eezB4SemfdeiGnVC49YOeBoMscfUMTe8FSTWluRXjsbS0xvq4il6WmekC41PA4dPEW09IQk,e4d52f8f14d0b13a,52af714120b64d8c -nAaDMSeCA2OHAiL8n2sH5,feca23fd4fa18f8e,75242ac82ece481 -YrhlNLeqbZuwSlV9aRPfXdlFisiVgtG0ZZiMcYSs9LL6wnYL3bmTZgbQEz8wCp3XMG20UUwmljTfsf5Q5tBLF0dkKzHv6QsjXGx7K2Ge9xgkQ0gWgkpu4du7FCAlLZP16NE5JSXyJyIPb1UxFs2HENv6TTKil6JX7T28r85c5BrwjOQ0izSeseGkORZbfh5Ij6,ff20cd67adf842d9,2efe71a5b77177b0 -HaKu9lxRGBbwo811kjfjvERWUJ2rkChb1mdxYppqZ38uQ2eHnShrgvg3UFlgqQFvBbhGkv5mLseoxDfpjvjFFJvlDOgyGkSyFwgUYN0FobWJPH36PkwHBbjOg5L9hVuqpLVg9L5rqmHOglk5g6fGpTXxwuXBuvVwmxqUQtYAmLuIxVTo1jsD436h88jVLbaWNCEjUsAJ8qZUqN64cnDypCsvLGzeGeESZPczK3ZiNzqURapH5jodJA93B9Pu2kOs3bAxzbxgjrZEVVysmxUaLTHbrVUlc9CIVyb9I4yt4Fryx0tOcy9bRWXSwEY8YO51idUZgF7UQ46i39dM1bD1HTg5xouMfTRwdMNuL4AUJmrsEynBXQKly37odeaK0Ib3HatOOkMnoTZ1nSC8sSwVrkhXa46te3f1iRUVVKtfDZ7NtugIB4EPWPV0LI0Dn9bvLaSpFnqai7FiFan0D3ZzaZcXVy0yHxUsaSA42EOKycE95GevTzzRbb6cNfJ6bcZ92GnQRZTJxo8gkm2t2bO7g61oMf6HLG8sNTqtTVcZhwgKnKoPs41EsxP7JiLuCyJogsf8MkfsssAvCD46Adcpgrx5G1YxB8oVsQBWtUnuSpsxnvK6QokXrqn4kKfcfIkCp1dmUCfBrZechQrrwG1NCVykBHo1R9dzL3M96AJ3krc3CUXiaZ4MdfXw5mm8NE7GZOY2Srgtlm2R33aLURU,da3178e21b6f39fe,98303afc57ff2aa6 -RwSneflfbxBNiYZmPDyk3ZzdKm7U1YC0caNDiZgol7z3da7lpF7uWtjTusFHZVC4wdkQYYexlFkLJMwgG2BI94aFWMPPSqr83UxKzVF8OIE0iNt3KtoZQeeQLEZ0IP5owbwF5MDZRFZb8WH7lkvNSr0FI7WW0HpC7sOFYHpXYwBIc0tkgbcsAId7ntzNILN8zqGEmvgBPZaQL8OrEqrGopFfRJAtX8J22I9tIppVd6vCGtc3EeZ5Mkc1oIKWb7otdkaPeV8Y2FhgSPsXE0bLQWR4s6efBUfHZIuODN4pMHKQv4802Xo7CPXoPbArD1wAA3BRyE8zZgSuI7LNIECaqHmSPLY6SKQug4xpT3gx3VYt6vfoCB7uMxL8L34SUedJNnmoaDZRm76I5A9Z1s72TZveT77dTkbAkt6e4QounPmBaoTpSWCL0kcYGyit6hy8N2lXmfqV0YocP68OdMKkjoqmRdg243mgI4YzpPMCqUibMeqV1tNLABAYaUdhbyxOHfUmUFygZCsnZLhZs7R3PPuo5TnuKVaNlJkvw4UqwUtvfyMi7d4psE8E31GSDNogJrGAxdDWeZ3Qhw25jpmIqNDhdyeeuD8ZVFaD2PTW8bwSdWNsHJJlHeGkFSIbHm31WAv2JCKtYRxSGNYVpJZLOHupJ2o9ncRfSxFORvJb48qGLRv0WR5frodB8OJDv9hCopsHN9LLfwquur209ATKU8aigwQ5EQwvuqxI6dPz513UREKHmcb7hglQx4h4LLIyWSuGmYS1Rhikc96jTKgM2d6ooX8PtPWECJj2ToqX15CQM7OSCjbVPv0wFvdgfX65Q423dmRfCJd1G4QFEPzLDi2FRpBPkM8R9NRDWXeg1LR7,249194f45f12c90c,aa442d776fbd2b6b -rjtMRcSeFICFDIE8Ey5Nvy6ggeSmFLXsOcj4CUfdVu5XOqkpMBT7k8OueOEDtt71nWrjU6qNwtIWq6LXharf6YuKSEsBwmgrDq7NvpWltmxjTYVBG9y0bzJKn70BrBwuzjEN,4c93b11760323cb7,ee31d9bed30d188d -QX36wPukgx4BTLmnWKTfLqJIu5JCcR7IcMLbm0NxEAW9mCD6JKUF33vzDw3pjKTjclJ4eCaSqvfzJ7I7bZEkQs7DFSiheoFxqDaTR6NCcesUKp1RXKqhLIFzmRRptyH3etSupD6VZq9ibosgJImjSQPGD5VUWuXa8C8cdJzL0dsxP9pIDYDOI2BrHbCZVr1TXsOfJjPXVimujg21m4eFccLc5K7Qh8acSSMcSPxJGyZh5kkpnjVz3esNxTOK7ENooqv4IaVbU7KXo8voD070WwIYEhupbJPXXVCbJCjfzQ4NEqOmTZmeOgPQl2CkDbngUrI6nzdMYOcswFF4eKmj9L9QOkwIlx78FuaeYRJ16i1whnuUmioqeoeFnqDRP9fFcs3UCiYnhWcT5ygk0NzX5eyxTtNwU4P,2a4e78ff160b3b59,fd0edf309b6e50e1 -c0KuYQfYUcdlZEkyn1N8C1ApXpm2BplUJcEY2wZYKq3dofesgUDgjOq9rgkck3AbG4zloV0Qd9ahqhcc13rlh2qZ8aqZfLnt0I1tD4Vguh2JkSs1zH6KgZzU9aFOmb2XKVL0iVMzosms8RVVZqt3KG683Ifqma6Rq1q0EQEY7L7zdqdeziybNJw8HUxaBrx93OqTt8rF6LrCRDajlvgMAIHLMYUJjIdXg4YDy2FFMjt5WSNkTsSbrsk0odg2,4b11ad941a8f73b9,67e90475ed1651f2 -h8OUfSosyhYR1GpCs1WI9KM14cIAEWuLeATMXYqe17e5XnxHHY4hJb8aVMZsAd70rFlQW2AtEDtDU6qmPiwbZa0PUmPjtZIecmrjduZnCe66ic57zl964r0F0DtZEpqioQlctFn598bcNm8dlRNCcLxoqEDzLral84RutwObDqWZ7xQFR41HtxQyr2BkKXsN3pdUZlhfFIgzT61M4fCoUn16kOjuP3RRJQpj67iHcu2qmBrKYsRFUoEXRtWxRrN2MswtXpXYmJCg0t1jP1S1DpeeYDfjdfecm7UTrk1yr4QyDHfIe8q9wtEwOQZR7kBMPTry14VXDU0uzIT3VNcdeKFrT7ZucaQpGz1t3T2XkUQ46fzigqXOkFU4JY0VPTez7w4FyCXk6g6GW0mONu6ETgktj3KMOVWfwEaJxlUWyOdyr5y3Zg7DRfZsjPuizrrvb1o04uN4FLPDpOtBOTIQCHCobQRKtIPzeNhaQ2qVw4rJz3OENW2GfBvXJBpZRJ0QspxnYdheUqo2Mnw0UqK3paX8QiRoeZPWiFQV3E0xhPQ0mSaKm5HHHMBN5lJc5VY4hG4tWhl5kJK4of8DZjtmspV99dtg3RHjTpjgJZGw3qPmnmOgndR95qLBsxeQ0EexJVk4dAHdzNKMKS0Uk8jQ1v9PBb6sYvYJ2kjPF2ZI1ZL69JQeiz8GPT4Y4WotBnPiJxwxvM2il8P9kUeGx48X3RpDbFjdBK0Aabp0CZq8TM8aEh5hPamIuLQgNxtV0EFSsoKRaygPGDy9dPhY0eChqyvQyAmtrNnOOrfkzbu71U8YZwp,2fb41f365d1f1a2f,80ca52088e7d85d1 -NVumoBh6IMzY2r3MGLXkNsmecY5mMGIVKWlNO5lUDQQibjOgrO3I2ZIgORu0A87JW3I9NTeEGcVVusuQvCBXyJzi7fU3GYWGMqqRnnWxuWFlVu47uk6abr6s3p0RmwalPqK0Ysr6mS4VtTHF4mWWJ139p7uaxaDKgKfzCN3ZLpJ3D3CECnDQxMiz1RpyAEJ7liHvhDcvGyZFPzNQYPJohM1PGBEI8Gmljkcz7NGcrL2BLOTXq6J2DmK9F47iLgX9fzchDhsBrFqhwT9vC3zIGrrl3ll9dpg0EA62EHFlAQf1xhaBmpZ3fg8EKnqDFoZLS8f1BlGUpuMrBmJ6PoqU1MYLWMz0VkdH5fzCADFNK1gx7ylJPRBYmVA85eVgSTjIFIsl2UFqA1YAriBC5QqpyFpJ5cY932zTRTWOddNaM31cLDvW7LvfmATCXgeLrJJ29UPEUcf4wM1DbB1uw0uprDtuQudrr8poASGox0v4Nllss3CSaSmOJc93RwWrDvccBTBZ5Y,188ed5853cb9272c,ccc589be792fc0b9 -r6b8Wm0XQqThl0LxSRWQhp2O74D7kIl0q7Haeru50QNASinaMugVVSTIGh9Xx2Ds72O8jML0zHXEKEgxN2Pp0pWj8tEzMEYECmR8NRQkvbmBl1TWmEe02kAOeZWxANJHbZsDBayfwW5zlydMB6j8cNaShXldYLrlIkYyetGcBqRAhZZdRTz9KCCDQ2oCjlTnD9imPJtrgVkGajqyf4TBEqvoLhqTMvqqV9PyqcKHgJGYLyEZbaL9uLrSHGhcnANX2LfcXFnWOUS5mdhTUucBq6MMyrMNLfVkcaAvYqtObuG7vqSYq9dVEZIXMn27E5YYc3tfxS2S9hcKRlsxgNXzyPE42zfhESsUVg2eQGgbfGgoEhaUp1KOEFrwdnKUa36mHk8BFHWZVAiz69i2ywjYIwgCmsMpAFTczXjEyOd9PQDdfiE52ByJmDmLQ1g7G7nu3Pjfm4MbVUp8UyaXMeFUJzrCaseGxZOr1kCV4YFhFnRv4DkJ90AkuRQ1Tto893knRj5uJO1F8kvNkhV3DzN51VP7UiYjpivTZnV88D8erONoZjWAhfqiYNbaqNOPcrzVw3FvFtUbAOAjU8DmucunEYsmviYCxHw80XUmKa3L7r9QZdIzd,29793065d216206c,de752d17f4682e99 -vOrQpa9AsNg1MixpBBeB4L7TzWlD8Opnk2hW6ByxmnmQ5wPkvkV7spJ9afOEJTb8CX2dZhGdXldc13tjQfbZnqdHb1AXt459sm185Z1xGBf1hVg3kBrWJddaKZLOK052ouL7B5naG7yQog3qxoQ72PVFeuMQ1203oh5i4jE57M54c0FBSDpAUyqx1hFawuJ7NOsZAsSlrdhn6CynRLZ0FTiVD2mT4QahIoHLn52Y7p4wWWqNzQ1QTu1ZunskRFHKHvqZImvRsAu90iKHHj21pMTdy15Yb5,159e8b8e0892512,4cfdb14521d9f9a0 -1fvMxA2LNrlLlDVbsQshFD6DbfmDQL1sJNCHxyUhde9x1JNxRcrDgxwlgpxk92KGkZ5W8Uz8Oc79JWZclHlfKcEeNMdrSYxyhgMeC7jPlyGFVhZEDljBdLVP6kr2aYwqFi1XtZWXavQfqKUOdr4j4FqNm2WTgYZrqWqOWbrP6auTGcY7UTVWJIUvKPoNzFhij7N9sbE8NskgBtzs4N0L6YRRZNQPyGWuhhnsl13SpA32R8zIYwDQZC64gDEQd3TNjgXwj2ShEEYzxJUnuimc3QzRW2UPsn4gUIUk28swa96sEOKGsMRJLhbZFNlPY6vQjilePL1th0qvMzNfxE8cEAOg8r5XQBONKDy8vaNl3pfrHIZHOfiYhcqjOtkzz1JzPSpqC1phIr3hAN9zeaIXhsLbbxLi6Z2,856d0d0005f0a788,814517a7c2a29d99 -LJSwCZ0bHKY49Wp8h3ry6t4niVlwS4za9INonZs8kJ6D7jkusqdRwXiXpQFMCdZ1pUYMZ01SBLPGlIlnSC4fdKOGWfZ4saHWjmOJk7V1mTcXah2FfsA58qikodEPSq8utu5NGEmt8Wr5oMHYqyH5q96FoN4VrZur6u6nlWKHMJaipi0WnBcaeScPdhwnanqYIEbJwhjY0rx8U9kx7cIj3Wpm5c64t7NROVp8UQjvQ0wXK7w3wIwiSSwvZv0gtn6NvizWvKFet9Nl91qPM5pzIgwrQMfRha4Das9Hy6mnzesQYPPEZ3wcsPzmeSO674MKo7jrgD4jvUIGPdjbCzkql4SEGDtwISSsUg4J63XceGFav4x3nhQayWinC1NTyHlSZz2npUubQjoqUIyC2KQ7rIyn2CUMC1zb1zGXu45OjeyX32WQa4nOBU55ALO93Q7M6tdArPwj76sZVdOTT8XaJxtDZvGOpUHSlB2T3VGgNuNQJXKERsYRwKen,9d207b00cbc370ab,79ab9e44c627a280 -vAsK15agveUQe6lMpC9ozlntQo1hEnD1BIWV6hEC6p,1d2f2d2752c3506e,bc43601409eb48e8 -mxEW8LTwqC449xUWj46HSmFkw3FlfRAqVlB2F5zfZUw8XR47aCLWfI9HMSGm1uCXpUod5gMwQhCgzaKR6jylBAsV3j5Knop7onr8IXq3NpcyrjHfc8T7b2MbiJrNdshbsuh4Rj9z59OdoEbHfPqQfTWScpFlFvnLxFnRbH22tLyN5UQn3VGReCxM5rfKtY9fJFS2Qxs3fcsyIZLaOv5OlQBBwyOd2j5BqXYRLnmGbL1MDmmQUbhFfrKkVrzJCW0nkVh8V1qLzz5aKJFSMqwEmUr1049ez4tKYLXRsxpHyh7kJCk9DASfkBiLfwg4qTrhsilrSoiYAjPkP27hXSgXeOmu2PgpPui9WjSewNWg8HIqOFl3SrLpq4rBKok4ZlWzvQ5hqgz0fnMLQFO2st9lQnm2k1vZrylasUFLxZ81NYjd0B95e2DpZ8zf3eLJVp0Pm7hkZtMQpiXEECVYACXwOAy5zq6VCd0d8vq48u3tI8Rq4dPlSHtsroFVMsyXgZy12VLbTNQFTZGbnDmvva33pVX6Q8B3mWwirFTYYS9nJOZK8EOpZmLMe72vhNnDMLJrTlhw5hyEDKVCZL1PElzSjxXaWAoaUP3NN0IqFGB2ZzeYoJ7hWdp2MSJthKv5Yv63VPmDz2UpCm6b2ixy9jz8o3g2nca83uaYXakapFRTyGKtRjHJVX,980ab568f3603600,f9609e53114f06ad -ECbWRYq5CXZmj7Ev4Z35Q85RNRhleNGbScKxUzad4EmcnrRPASDg0WxGwpmLZKYQYCGoeyj9hdPYyCK9Q8cAgXJtz7rb6K3Q82SnabW7B5FZ075ggPzQM5dVGFTEDq5AOA5Y3VqCoHc0ELZNomwflNpMYQiy8pemsxr4T4p0G57Kxk29gx3Au0k7Z1RhZn7h1UFVJYZhlMGhwic06Xq5168p3ADxuCZkkR1FLM5eKom9TeJtTvnWIxfAbU7Cfawgsh0kQiUqTTlDlMgDHrjAKC3Z6rfskBrH2smECho9UipmOlKM9bDTNtMEpU4zX340s9U2sSY4EUHw5kJoVEJeOPMpDkY1vyWMYCopFfj70VIR6SRifCvPFz5XEUqFe3WtZ9TCDb4fshhqKLy5UvTr0g5rNt8AJvgKXV1eN3hHBHvgotrGL4QHKhIiK8Ik9a47Kozr6p8cqgDMUxbnDOEoI2y2Dnvwz8N0yG9VaLjJn4KRSXQoiKIG5NpxKplCrxBzPcy62v6UD5AoqW7uRx3zsF9E9FQ0dITIf5AQg1i5MQaOWpqpDaXVvfLtIto8VOnzymrbcvRNzRKbTDOcooaHP0nBpilGDO7EoyuhBMerlOyJOtNp3Bvs9edAEDtZMJdelFol510cVhf49XfatRz5ED9r0b6RlmXrD8d4W618Qe0JiIzrkryIDrWIXfYuVQTr1ty8ApG8T97ykh8atQLmKwHGJYBPaMQIHRBESVDBx6ifC6kZ8Lp6KGIoyTOdmsD7kTUq2VcZrP1I48mkNQEehcMcl7AlY7nE7n8GDJm,142fb02dbbca5404,2b835e141cc3d960 -seZZ2dg89lzTvOXTIvy9ewhVmmiDvC1KcrsujmYG8HTPvZev1YmA4TP3bzsaAO9Rfhiz8hVs3Dj1kYg9qWirZkMso8tIAmxe04T7rjxV9BJB1JBhwiefr8n6ax6pcFB2S14bVGniM9Ba4RuEj4ThM15ODQskMaqR0OUabTTthjrJkeZjSVhOJB08MkVlg0epsKtMdrsJHwbLN3tYWjyGLQQBAgsZsXCEiEKOLt2DBdgYiZJxu7rvUMbm3Lr87nyURvJ2HxluivbvFwyXxyGB67euNgr3PsOkGSIxQel9pxbTb8uAeSklSmCpVHUUTFxTnANZGfabbTQllIqSyixhkQ4lnHiWYKqoijjCOcCEn7deChG1SSG9YNVtepuBeBoDtWqQVeYMxcpyJwe6PS4kkyhpZnSwsvHQBBmdDQ8FGKZ7ISdrCXip8Ei7pJtc2FhNndKliUtJJnJmafaVp9KyMBpnVWCqrgjbxW79fYLo7XdX8ZMAJAdYUqKjjOrp9BJmaoc7u2xobPImnZL3lQXo7lhQUa1OkHCHoWbvZkTw4uX2jwipTQ6vtREDvMeIGePHRtzYQr0n4XXbnVXPRSaPmft4onBTrxW3FCQc8YtVOxb22anVIlcUltujtJOH4BQ8Ym2KmnUtF3qmDyamahv7FaFRHoE0QiCKIOuD6KBhxnvBb0dZnkwU68CxIE36GjB03aiV5RGlpGx1CQLnSW5waXoB4Y4DEPhCwLsrIpT010lalYuGkcckuJ4drQlCACQBgZaSdDYTMJdQ1,8b0a91ad49bfab59,dbd9e1d5433512f3 -VMjZVIExpImZq6iXzOiFHjcMPDuIIap0aqHS2aoKsIuVQPHxay6DL5YDZiP9GuK6wX64AdYjIEJCrEhcKDe2o7sBUUo7WLxPeSMaMpDu6ksHNJGSnY5AYwIDNFm88YHDTjwB6JWC7WpVxmEOKrLUeeghsJCk7vjOp5o9o36aPTWdLGiY49C5zfGAws3VhYXKCiC14i2quR9VC2k2ZopnAq9IkOHFHaGeNXCJM7c3SwMmTUiMQtFf2XvmdjVu29FPnrxJT84xUu1JrkqBrizPrc84iZmY0gs5tYQKkbbtWsAXTUlwdentiHIsjToFMuRSxQm67weWxfQu8T7buO1f4v3pcPlVsxmc3GYRcGOGUJFw6EqRBDkq66JGJhNxyu45UjgEWamm2RG0ShNQOmEbVRxAwtVRnqegxYhQZ24KYdKmqpDMLGOo1bzajWnEybvQQQQ6ZQ0t8a73wHsGGAonRZ4Acr1RC6Kv7FyyGs0w2Pw6NXGN2Z6dd4LvUUBgcY1cBLwdpc0HaO48qs50DCWouwQ16MhcQEdaxOpguQhG6TaT8O8eGP8MnMj92dlqRNaDSZ9eCVVRxGYjZmkyT1WA4coEzcq7U9YuZUtvsVyLTVhPTeysZgF3S3YXkKuJLPd3cuJHxVyDn7A8q7cdV2FduBw1hUIa1bEwEzAU9VcQSQcvmxQsb3Y9tEGjiKDrgIMmxBzmmF9Az73UUb2p0xOCeUzZK8Va7ulY6SGhYYWP7R8pJSyrUILROE2B2cUu9pmWfrQWwEuZOF1gxM8YOdwuYrjJ5H2xg4mlOhnExTuGPSd7ur6fnA1bNe1ajCyO8oOH8g8HmxRua5WGMe1TmyVpYFoE1UTYQRcoIFiFgz7Cwwo5Hy4GgjTtD99ygRAclqEZLgvmHci3oxv1FcTSwYQqcohTE5bR1heuK4BDesb,4a393d34ee179ff7,90aed7be8a76b6d4 -yAWO2qGgsX9sDMCwgVoZc6JiEBHNvnO5flnGjwx0jj1b54VYEdUeox5KgrDKMOJe2kF08StGwtElfNxTUccCIFbiN3LmtVrVps4MScfkE5G7KTfHcJHRpYJY7rSlfyh5,6b818e4caac9641c,8d575710f793d15a -tpxIQbmnsQkNOEpapDkvHaaZV1FoNx8BuJVgPClN25Q3WrmQkNoBk6hUodDjNj15yWcSXBBfB40djVlM5lw3E69qf9ZOnYR0Pw3dskNsupzINYTmbv9Khiacu44PDoYad4acS9OdzbIqFrehQPYVfb4CGTLoZiZ0b6q5noH6tn462KAMALdZm527ETItsy9qDvtN70X9yxENfONUwNlApahGSHkJUC0gafhe3g2WCv73AwRQw2JFp7f9YlDwNcEXvP1vGudyR2sNcNA6gDQ2eZ3ElOrYdiXY2P2zHQf8FDiVDIB2SR8HaqoVSNPdcbOUiORwE5LOyotSQ2edXEysI0g0GkV02WngKg10173lv2c7SPy8PEa6RUjQffqZ09SEwy9EU4u2tPHtrwUvYx2P2J2Q7YxVGHO8HeqwAuEL9EN22jXnK9n9UM2oHra4lnh1JPSODU1diPRJ08RZ2lLrb26LiKLkla7pirNAKYYw7boTzQ7BSY2RvOmMlsayenLPG1s24v6G55ghtYEBG7qyoDOQ2WCZwYTTSiLN5zaQT7VhFeMLwcgw0Af3BPZnTVu9W0VqO5hAvdq42FPSAFVlsvJUEfL1Px5mX9TPDm9r8UL44Gtvq6u1GuwKDdwGXt2vXuDngFl9cJxwrogv73kZE4bR01HeOoqEVyWViTnGzTYETU9RODx1pkPY3JkZjGZmpm62PHKqyPwcmfAXTAkpopVWMSwoLMgfFt,908b874871f3bbde,aa2e537c5a8f5bc1 -7TBplvT3FrOyxBzLQSdTMi3lVoKZs4SO0sDFMS6BmZDNuXkqVWtOSD6NFOZ136nsp5tnwNL28SFJvnOiwOFysmYSMRjKfzNtkCzNZVjReVacMGLexddfHgSkBv9NoOMLGTnaCBF83l1f2YlyhE9GZAqiLIEaTqeRAbN5O1XJhkqBHRQsDbibVbMAeVHsyxM3kFGvizgPGbtKj0eycxR1SHhKfuU9T7ACeWQQ2oJXaHlLjvKVcBpy8gOJ6O1WvnLhMwBTignHJBcbFRxccofDL1l1tyYzPIEAMdnkMsg3yt6UmI3jmUohGBWmY0LO5WDtYAZe9IT5e9GE4rFJ1YdEwAtVtJRfjc6UmBCoIfxU0INavksTImCpzGbvSS1MaAsu2adksUtmRvlpifDw9HZ1lBfwhJiHhxyb8PTToDNXxohp9a4tj22n5uDec99tMHma7VYfU0c6yneZpnYFpw5Kn1NwSTFynfQwU5s9UjAS3OYZbAIaLHyiGyG0hdzMAW9tnnuMVFwbQjDBSvA2hr3p4BixAmGqlc0JWOtdFPlN7GhebEkdFB5MftLNtaVCQF1obtDrAQrj,e4f8c7b8faacca4f,4fd0f2153a44dc71 -OQzN8EZyhZ2RU1xM4Pf7ydOI2tO0jEhkPtTPlH7tL2KHMcgHGnOz97UurWgGJWD2PUz7mcP7kSxJZJ0KpyFxyZah4GpsLj7TOIx1jcKYSm0NVnqZ18FN2Ub2UiaNpAlRtalyThEXfaMKXFdAFaItZfOobtRR0GBM4bQE2JUKUqdr08NqQaN3cWDSg5QHnRsArPt6ItiroxNsFtvcHq5A9nLBLAaQDlZpCmDvMA6PldSYSKlGg8pxT6Zlf5Kiq5VbUgy6mBmAcOVfZGoY9lEpP8fDt818Wti76n4Ccblk4j6uFHRBdC8EwcPeQyEBX29ZUAoa4gTyeEfKJchUfblqDQ9xbo9kyXDUQmWewjm6bZ3GDlOMMSp25sRC0orDWpOyaNcvvuwMBIcS8ztpQllGyWhz7FZXNvQvVEkExQNtAkdHTwhl91ioqA2RyHRVkFUafacasV848bUxJ86SecBYyvNbU3fpn1y2edpCa6OljGvRRcJwgWuWwg6qPRKFu1jKFzko2mVeQ3dTfHLJiqxUN7VkBK2RJXlFaaNSkezlwdR2YG8DuirGXOGoPyX8ctSJCfngHNcPcRUa1wiiCsMKMXyElSsyel1epEsrXIBCc1FYO5PxccQeUD6jaJMxyHe76LA3ESZRGrG7M2lrtyz6SEqBJWh0iPfqfetVPRdrGPUVPhSSvZjwo04wHi45HrdBkRSt2aBHKvYao1CJCwurtyH9sYwVDCbZMcTqgt7Lr1K1C8p4748LNgFp9bx6rSkH333cRunZhelxJRdrFxcIx5aSF3wJ5RZDee558P2f68ZZwjs2TkakHf0zKXx4tg4sff0HFsP07ZidZzH8f15TZKaPMoI8bIHDrclpFpmZ8B7SM0rzZtrLl99X7KdwQXAQm3xsCarXby1LDcLZe8c7txEBERWHt5,331922ee441a5515,f91e7bbcafc00f49 -wihE9HkUcCW28pLsgxolwOCsmbjN2fmsGWabBNM5RkSNaUGyBQTuqjEWXAcGzjhFD4CFcA3BcGIB2SNNtULbo3wxLzgBjhqNIVzdV0ggRKRBEZGWj6SHiH1uDbvDw9UtkTzxNvA3oWfcMjC8uqcMGAffeF5EDZ6luW77cP03rrHCRiuUgW0luFM0a6cvVF57wofxXGCmskMYd2zBtjHEKIljmB5b4lyQlAXfP5NEfVz5NxgHQstbmOhDOLdxLyLY3NLmjg2FQFAwzGedNE8Gbq5bAQoDPRj9DsmnFYq12m6LjnnEbfE0aILC545mW3xhNKoDeCfFyqcd1EMmcRdFx2qSyPr7wH4lDolJ7gOBZLEOHuxjsBg4Gh182tOO9Xc4YrTGwqN3u0XtFy2h4AMy90HSgQlrNXtiyjL5wAtJEs9cO5BDjyfAAQxw9g6Q7yijZe9cmfCuRg2VjEOy8I6OqCOiovcbzuGrax4dlj3VNEPRFmQYBu0ZoeCmC5g4YppAvp3dvCWFapl2Owp6amlO1hj1i4Akp50nrLggbU1JVNV7CGhHj9dbSUq8yufCTbVDyjazdGIvanEDlTqqLaNjAEwtCHOOyFjO1M2jaiT5pg8DjmvdI4EdIQLrN1sq6fh8YRqTEWK5onhLmogBgwScolzhepFmzNumDkXoE2scFgT5gh7931akDBpS3cJHhi0N27obQt3N5y4BtkmX93b5nx0nYCc9UPo3sgpwWQgrro9KHN60MvDrf8brYsif0uOXEXzQoi4Ufz8gK489rfcZuJx3hnNT0CGZEgYcnXnpnGovoaBMpzgOPTiVFa4XoitMlzhWzSGPqJjjAbpEFUHa562uFCDm3JYy1NNtvDakVec95jqzrHFmzjvaMxFrgYQF1BkJxIS8kUZLsiY13YoO7bHLTvUJX2nK9PcXY6UfGP3WWL2Q3zsAlFa8F7OCNMdLpQWlUg3TngG7oWliveOGGQDkdmJrqtCaj,f75146f1e3b98c23,1c1f5cf9cca9cf76 -nONjBP7YGvGHCCDrCEk5J1fIOjVncvT66bX8lYgfrvZtH7p5jsjGCQePvi1nNezXPYnd62QQerI1yPHINGUDbYQEgAk6ehy66h72MmC8jnq8uTPFXXElWN4sSj4weStxsCdMr3yjcVq5sJTjhTkBT4wYMRrz35xg3DrJkdPxr9G7Tvjj47fJLtFDVpW1ylu1Rm7f6zge1lX59mxHxA3BOZIf2tPYRCK7hLVP3ZymGucAuK5cxgosP9onhB4sEbRCXHSpNCRjYqY8GLfVRzWibFpb0KNrMYyi3EItqcnCBkhHPyiXfSKN6Jc8h3Rj4Q2jWQsTPMnPbj3QSfxdscRHmysGUIJTqSij73Cz7,dbd5b2adab696066,c3e346c5cb4878d9 -pimkFCE2TmSl5qIT4GzkCllO3NF59Zbcl0IVrazc5dbsGEbL43AerYqt8MMx9UiLHkQCZtoD7mu0FOCSBy99DImH2BpksXvsCpxhmPB1Rqzw4uMB0yTA0jys4Sg4uBhYxPD3rBhVK4ZvsvefKfAP2iKQaQCwnIB9Oxbls27v7DKQIQudD5fqvRs7EnXjraSFGdvGnMmvYMqdhFlD9lQylep5LrURgZS7l86nCIHbB44BNmLC3MzkpdfSdLX2s1jMd9YapIfH3B8Mow5zc4qcsFuzsyhTErY2jQoyVNGjdfNN3UqmigQwgSWppXXRlJRVrIIgW5qEfL0PgKI7q6PNoM521O3qJabLB4UDZSTxSZ3qBFYidZ15Y6Axr2pw4oUPSWQLiomrTgRWvTQgfbPFm7prftRbRbHM4J3J7wn5vaDDB2AGfATCRvy1wsplAleAMmd1yJ0BaPkmMuHNoSJP9ygL2my7SvNqWTLpKiiKyV3ssQKqUXuSjOGdP76fBg5M56HIQOonoqILdKuT4fPxLktDrBXcIQ89NeETwc77JWxroAzj4vXNK1YPDP14js883b6rL8Bn0mmPiox8ao9GM1TEwkAJfAPcMzjm4Js4hlgF1zbs0GI0ZMUWYR5Y0P7OlHualcbQgHDZHTcOBebjonJ9yEc9aDRoNH92yU1CaQ4ukbZBkBaYhZxqw2CW7DUybeY9Z1TDvRxeOnCPROurxBN5P1cruAINS77QFb3jYeQy151b09QOpQYxyYFLqICXJIT8HHBGy9BVPA1SNnS2qUDcIHmBHzILr7SRZ5mbmPmguLB9l4mUv8bLISftOOjuZbDHruEjO7aEuNgSL0MyQfI0WU3VqnMUvs9rH0dEPzUjdyE6TNDi,249e5b9218fbe4c0,f7194aee9a98f400 -WfBTgctcOUsydZJAddC9DJ0whSy4Fp95rTRPfejtCBqcHcyVTwgncaOoc4JnoU,69a715dde6226f4c,fa3c797e0d22e26a -w5jpUsOlRFLsqwyTDT9Rd7DWjGDsVKG8pllvvYmeicXiE6BrhG69pqgm6dcCuUpsUklRIWgDLRIaZ4A9X2Nwzl7C3d97J8oP5d1zd5CqMOmdrY4HdYXbaZL0gSOPveWJlhHhT8wkhABcOmhuPzItff4jsFRK6Jdyf8c01S6E8F8mFBhTIOavzuWZFLTwOaQJX7olPMLmBncdSCDvRHyAlKEQCf9vr2AYCtNPPx9H923,498da9c9cad6cbcc,db4b65b1a142b0dd -KwQZdUAQVzqp0VbF6c0j0EawxobesCvAEUN2OFryguEZBJYA4biOQclk2Hn8odB6qY6H1Wxg6i9ZjN9pUeUz1Ccc5W1JGz6WAKLCyybKBZEMl0BVDMBoFnmV72tWeGloOSLDYgK2INViNaA7YOkazDUt8UClwqiMcb0zVgNhvNVaEUys25dSk1mzJijXIHW3FLmOEVCS145B45CitU0614apgI8GVuBhjr7cxMWlBC3LyPitzNV7jW4aEbt32ARizcAb6pfxDlKKt1dxlhAtjCtp,4e6db003d93829c3,8b0d09d1a6c565b0 -HtyHsFgdVcNgIRfRA7kMMGxgaeNFFDc8z8iU8bgppudzwcq5kKjpb5tYcBSHpwojW9ApDUsTTlC086wYgeXiUw4gHo0bxQ2HiGeufMIeYuWWGI0vA0AfXNFLc5QiOEtWIkO8e7QECzNakGQ5R491yCEDOJmPc8lPNCvsVrCXYwFFMamDlc8fkHzed7UhGXfDMAsAPJDNVrX5OA9WrxvoylrdgBLVdREMhEKogJFN3gIIY2XtbCgNA0oTxFR8PZa83r1SwC8eB0Lq5tF3P2sVVSd232IbTm2GHDxmMQQtdq2jnu51DOSKDDth34USU9MIb3k0MIsBLc1wCPnM9aZ278j3IG2oDCWWmJ8sFsFCIsoxUBZlKpqBdRlnE2Tu8vWBOuoY4E6YeXj7Hxauyj06uKCf5Ds2ikCVutM2Getm2tZvALWZiYDPhNRGxD9HShHPi2tgLcBerqaifLbB92nhvDdJ97qbuotycDgQ4phbf6nwpE6trqpFS6uiNUHwGM1CTu8jCDGSDx8N0LsjM8PzlCPsr10ck2T45a2BXXhRtf0alOb0vGODuKOYKMSGiTQGVR8bqyoTkqVjiMxyvz6DP2AvvFOpA0FaI9pCwocNCOENKnHo4xzxzFktmuCtGLfAcyZjNvLJErio3MmchWRruSZt3kzcK33K7bOAeq49yNvotFqvKz5wE7EitxMjI9dd6rLVVZ0i6MNmsHT3ztrrAZSwGKDNz24jfjEiakyo4dveZwcHOnVGu7OmIFAqE8aKXiFKf2eyYrSX6lHhynth1klkQKc98nwUDAkIn8Ox75o5R0tf,a5ad3d500a24413d,62ad2b1d9cb1df3f -RB2P4Wi7dfY1jncYbbgxxgo9lOrcaQFBs3kT2sWh8DcAoZQ7SnIsOyvolQUnXBnmhEtNTxE1r099jPqMWWyHifjpgWeiTCSvLr3st95w4XcG8Fo5lIcJUnVDmCuPF2IRbzswh2ibmi6KoFf9VKor1264S7wFjbvluBt607i1ZJ9eH0HR9gncG1N63I2xssHFe0LSuGm37tMPmblbhxoKfS8NAywTNCPNrOUi3QSAY9btYKJzrkb8f9ghfvSLwIgKPjGEVBKqcFflMzPhrdXmpeqry7xQvu7JZN7cnyYlTUGth8aPCSvcROS9AOCKrw1tavf2dSLnSVtf6QDQJMhXVqXH,e116fe50689898e8,735c33c9a9e3cdcd -VD1aoqJDQmOk2Vo11zXTY8VpvD74nCokflWG9ApwhX9bZRMgGvs9Fy7OAJGI2Ex1ZfwroKIKtqObsuWIUuxEUV0s3pCAQRargN0taxFKXzQVLXNUFIppV5s4YiBvc8dNL0cmy6yHwyiGNHXfExaZh6EJgKo3yS33nUZTHxeKDVh852O7N8WENZozvYBLojFObqhMSdz0e7yFhjR5sCDbPK8eDeq7z6L6hSKGRP8pbQDF06VpdB8vQ8LinTAei4TiqDtPidKtzMsW4jlKBlolxjZmDQFdRhMBW7Dq1dIkDWwB2WPIeuytl4OfJLou3x1XTF7oCrIZOz1ByfhaaKd9yIjcNX09nkwxFyKDp9eusLT2OmYVa0QCOIJY3o9GggDsRdGkfF0crdKVOwWRoslAaZxTmspObaYtv8GLgChF3Ttm0Cjb7c4UCDiEkdTTIozPZmaq72W51YIJ3GxSr714vb2w7VCCVwcIenTrWXPe5BnOz4keBty4P3dKsBfzzz6w7EzAfCWRpKAIlHKMXJlAWXvWyfWAGrLJyEwBN9TTJKT3HAo3XnQZU4174wEeosll0KjUxvemf7mKqeMOFzQS7t4AmHiSxgAp4AycKzvcF6FAIlewDYTDGCwaHOAxGQo7Me9PN1mmE2sq9wkxc9mwv9QNqvQGTXSXbloyBWuTRuBDmZjQwTeG8zKFq3B3EgE3J2fIFJDq6cSlcnDAa4VCAi5FOzwy19p3MlfyNbfkiLach2TEMPqstTHxJ1LiVjqCBN0Ku62M93qjrvAgoda1af8JihbkVJTWllUXafUFyXhtlTVQZwd1fEuJJi7ixyec82Q3LgGvKX2gRG60swb1Deo6oQDKi7BldMkMKPSrFbu1wh78ssTIDX4rsfNrdz1v7fJem7gnRehz0jlOmUWIJB,5fb7fad018887e4a,f8d103ca0d6be012 -HhoCWacre4DARNRcdsHnXGsHnanwvEXjDfjWcBDDMMknTTfvjMwSQTUGM3wfyWLFzerkYYzMGtx39KJH,85ac3f10538b4ba3,72976d6686ec973c -5C0FqMRisd9czrhN091CBM6kKS18ir9FVU5MgGvWxGymIQ,b6e883ee933c8578,2bde182e02d7f539 -eUGMAefiXEzQRTiEaBUaPqe3nwWqdX4CUbfwItszIm2fkqmBrarwF4HJ9wr9KtMJ73nI3L99Gc8iPkAMZIa6bIloX7hiPROveN8b8JzYn4yXzzxoiJXbHjl7u6Yg8CDjzXRap1cKSMuHy32FHxKaeqB5HGmo5nQrfYXwQ3jjYlk0tLTwGfTEDXbvaWDQ6mC2HehOt98PVrgzgN9xJyLvffwuC9mmDGudxJ4HKMRqIPvafcpkP5VQu6ZI0I8zHyp5uxt0jU9i2qM9HIxR0f43ymEoCFPutAXHAAdly5pHtvyo0qOJGGR9mzgtiKzlPwrsNr7pzVcKgPeCTsXEVIJ04EX5uJnqnpfWdHFLBRWGteoG6jiFpCwaUW3pj0pJggWHxhxTfbeEjljeHkOcZVMFjsHxzh3NJtuRujtbSyNnlgGKbJVsSq0bGvb3gmDG6zF9wyE2nO61vaUeldJidrv3TZ0zSyWMJmM1OUF1XAQyqUEh9sGGUw14p1h7Php0ufUnsG1i0gnK2iA1NrJxAEAqhsHFM9yaLByTFIgReJ51x1jOZlpnrYH6fqvTxn4XAoCdLZZoD7OfTvQUk1MEyFl2kBhL1tdUqtww7o1qndJ8otCE7qdlWj3IrM6mrPdiORsiHyFnEjW7rusi4j7eWG2MmGv9CzdJ9aJ6kF0wowjhUD7vJkCMC2BVpyKOLJJR1c3Thl6TJ3FP2V9xSa91OaYsDbcSzKQDla3FTmlnvnX6ad7GYXXnHSrGHHSYDKnildsjN0PTD4oJqYFK0ZLbdrnuAS19H34VGutcpqmQxHJ7JveWHPPFbxRVGTabHgkDHE2PHjpnwOknkSe0PPrPpBKyBGk1jj4f5ntTCUSgK6lzCHUOg4WGhf2hRYnCU8VCQKJgwSm3Pk967FiahAzwlfKJMAUkjTp4AsthcxqkBm3CivcYiSzTtsb0TFdfZ6HOUaoCYbcEzi0azvSsdhn,1461a2e49e2c1992,7bd91cb7566b5268 -yW6892pMW2Su5CUvdzCqqNvaBS59r2YhQpFOfbu4vNEVy3N5uwPnIiLQ0RBbJIxrAD2MU14cgVIkGtOhyX8sH6ufvlGd5QgGj8LfKof4I4dERLprPLfB1wrCeXrwwSrTFBS29m3BmtaAvQHPw,27d37633662765f3,8f5d8cb982811b75 -DSZNfvpeIAcI0NuinjVgCelaya3MJ7pLloXSCwg04X7fBFIMQyDhBxIVlx7E1GOmAAYN3dLtPJJYiL0fxlEUVcUvvzt2qjcCiFGPYNL69RD2R33zC1K2ADBsJZyJ3j6Y9U1eI662qbQssz5AySGF5a1onCuSRyGfKxF7XEwRKKP93KoC0cUFUs5tmEMrv6QX3hRPqfHjsVxKZN3jJTtgZOBx4olci65AywIaFaB7nqKIf3lSvddzKESIij9DRlKpIkvzxh7CL09CeYbknI8HhDLHWn6lhGQZAzVYj714Qbz9MKEw5orMBenVnts8ZEk8chAXyMdYhupGA7CNp1DFNBmvKTYCI8FQSRlXB1gTq7QoupQhdFxLT6y4LX6FOY8f7WUetO7a8yOa3jmBkptBM1IRD0u6A7ypmgxKXHOWgqYdgIeDO9dsMERn23o5E3otCAwXIThW9nWJFdRLqOUX8G9hPmkQQN9ZOEDfjkcPFU5XKaAl9oNlWHmUlSXO0qlWJlrdvOvVEFH48fOIPmWHG444X9qdAXZUDeW3icOkOyOVEOkuKbDYxH,9536d0e27d56ced4,a2f16cf468507baa -ut0SsqwEFYjCnQ78RVVVdg6ZXTjET76g4YdhC34n0ryVG7NvhRNfrP1Cbl8Ozl1VYKoTEkMCqfwUvd471IBzClTgS47kSEBLuHAY8WxsykllFfT5VhCRVNzCLcQz0DZ8DFWg2bfLe97qQ7gtSoQqbePgSsFMv2Bj9JQsyoss9mspvvCwFnkJ57VHvcpwspfE3JFAromDVhJBh4VjzLPWTprcGsVANMGLDZoA2zH6WbUPj98EandHJSUc4xOs9v2uPKRTbi4BiZvm70nNvhDrg0La851mZWpTy9lk8SD0jYg3u7frxSjMY2PfFEPA6rq,82f267e69ae13168,48abb5d24ff7efc0 -ukk4jtxMvYBjjLZtz79EkKhvZCR7NWNTOTC5DfKbGVfVLydZ2sxY57dz0ve76vnUEI6BRq5Wl5bJMxsOjva2ua144NPPouzrL4Uj8DhAr5IFKh7ImLYrtm90M7hDw7UwOoGEmtMD4uA2d8brThm5TA7tczWzKXduTug1NCaiHy5EPA3ZoCjGxSwWx0p4oM90T4bP8AbqCsJacMB8,59819fcb606db518,c73b3147f96575b3 -3W60sh0IVY4L5j1YK7CDNNMWuZSCjj4wG2GVlEsJN5ajIoMENIkX4D2f8gDZFNDcyJr3HnHyhmqDrDkEQUb4kmteTLG5NTNhws7y1OIsbw02vcZBERAicf5LaAYpCV1A5OOAP4JHBgLGBasVtKvsXdbgEKpaKj1pH3xsGb8SzFfafAa76GEJosWnoYAFAp3ywqls,ee07395d0916c1d5,fd9e7593b502c71a -Fh4wbVJgXBAjaq7Oa0nZOzwdAcyK0xGkWrYm6hmn56HgBtU5jZOvHJD0YZxDGycU6FdYZtCyk6fPBbUPViUdeKuQUIvGtvocC3ChH9SBCE9VmSiE2Lo0YUaRZ8dnk48wplmzK2AhC23CU4DHiL3LwNriu6tLXA9Q4s6eT0Ab4OrGibdNDtW7Ner9bxGbb6Enqf0m37HTNbUOGmvPJjoMXqntbonJ8EL1gXJFkiXAgg0uldOCDfKUink1zzkWhJJe2ngp5wEyjHjlccOrf1z914Gv4cFjdsO6Ndhz4QiknQL6JhZ0v5C6IpVKDsiThuHTrM0BT4B9SkdQYpBLYXpZyNC7YbaV6epX1AkEpxbaR9UC3HhdNmNirGf3jmYtkvVklx9fT0vXsg9HwNTwOEqDhPFMv89ckFiX3wrszzrhv38TFkhhias29jUsKEl2NGaSlpCbnTXQWBqTEg1bJly1GrMnvSFMZUNbvFdxDqnrQz0hfrlWWuq5Zg2iQl2LPdJxLXRuwLx6E692K9GT6hH9KtH5S28iZMdmyvQ97buZHksvNBsjpLQtetGiL5XUGcGqklAnc9QJctIL3dTkJWEpnxgFy,88082b37cec23708,88b56565eb8cfb47 -uQ,5fef8098516bedb0,5c09336fccc18ffa -NsL2pGyrbRs9GrbDGb6ydydDsliK,607ed4d789219112,5dd60cfd8a7f8e46 -9WNdCw5LXXRw7XOEGVNQD2D5rgziyyzrQUuobO4ndUNxMXXnhx6CxSL88jtG4SblvD1ZAZP0EDFma28VWI9eDPz0rwea8BosWVSrwZDkfZeOJae6e7OpGHWKLhkRTfsX1NKL9a3rBuYVpKbeadnbY5fEFDaJhL40Vn81RGTuHD9oPTuEFkmdUuxcUcgsaegJkt6X47vO3LmzzudORxYz09XCV7Hz3kH926xcMTyrIaZ4qBgJk2nKkhvtaj4tS3GuvYkPLyeZLm61eZoIpvo37u8tqyf5op2iWQ15sdNuoVBuPMpjWqLXXqjoSgEjrrJNr59uZ6xnkEktkku6rBwblqBRPkxl1MDJX0Dz29VsQwAQmd7WcBTWcLudAaV0fmb4UfGvpScGiKhovy7e0q8vA8y4vmLCS2CUBg0sZxmjCFPhJA6WV4NIaVp5ZO5MZuvf5sc1oEUEqSgFeW47E0vn8nccnaBYSfB6TrVH1MakNTvaPe67q1GtFUDMmGm652zW,960fb6287de0a312,9055913da2ab91c5 -Q9YUW3T9QHc3jN4hmgeiE40JqqjI7x7gB8ADtdCJH3hVVlsY2vxkyJsqZyZFDVAKpuPc80Yi6JINeC7fkRyHcJj2dzFbVwGwwhklhMXyaohhqliR5Ni6o7u3pRtWSDRtGf1MVPzBeoE5vBEnwFtKJh5LtM7ObxYqmITSkJUOPBAZLnqtzehFhbeHhhMWcDogiyO7rKmGSm1aYtt4dStEcGVBDVDRFCmkHN26MnQASRLQOobvXc9svSCbt4yay3yTzQlqpUSv0iy3XvbgWC1DvWZ75c6UFuQCDQJJ3iok17mvCIhmMU1CyXcWjqMP8kCVRewle0nc3ymZj8qUiAb8iIeeZXNnTGTgUH6aQWPUchtOO7vIk9JIVqKPGDMyPABrufDDmv0dEahgarCAvUCk2wZ5eL7rtWAi6sKolKwI20g0qJZNYeGOosYY6Iug2CHrwJqExDDBZCHAY3BXHbQXMTBw19hM1B7qmqWsVKZ7RDtGKU7U1vJ1ZV33MPEILZjXEgvg4ofRHjrNNxS47Ub5pIzdlOM262eQZnqTb0Wvbaj8VevcCCYAxt64sijJRDiDk8ZQ7iueh51Giy90TS8HRtSMQawicQU3KzfEwsRIZ0vAyBKShj5FpRD5tWJQirLYzBCRHrLSRzO8MhkitNcRqf9IEXdLG90y0NY4IA2YNaKnxXF6SpAmtgXlfJn5MadsfoL9BPiO6wNqTUCvyGf99AEAHkjQDEAdp8cxyoOUX0Mmy3p8rz0PuVDE1ppF0zvsnNhDeyoQ1003kMAZuhrGAkrCbIJqRhB9rGKFxsr7IM6euOrMzDmL2chuN27dhflFn7DYrefpMS9cZU,f5fa9a1d180c6ee0,7703c753b69595a2 -mxLlpvq7QK1ImMteiUl981ngzbJlwQI0hiV6GD4SFaEbP8ddX8dZoruOYynHXnguJC1Ke8vGrg0EHV64XBalHW7WOkH44vXUOR4iL6R6yIKGlpomTe1yfXpeV1H38gVroBDoTvWeI3aayrpHnDSx19lyDVA2JCdwGzT0xvzKvwZxhZYe9wQM8WF7lfMZ5Z8zC3zNVua9NAL3PLqlZSeNfFewOON0aDh25dRVTCfKm3u5f8xM5vsh9jJrwlzMJtLsrrRJWw1teG6l2pkk6uuEXwNluUelzcrAWlbhlaK3MkATSW2W9BbQ8FL9SAEqMF1fnnafTcCkJROuwX3VmNmubqkG2K64tIKGJGV6LW9ANLYBz2HaB6CMsNtcTShFendQKF6aX6km9NW6uORAlnwknVYUSuJ3Uy5Pvq75HPh9900O8gUWBYbDxzOWME7xtKP9ipNk6sgbm9l7z6KyXgxwJutuey7WeLwwhTHQsnWmzLGa8le1iPNCnbmUiBZWVXOSVypToepRlHGo8m64zGwFZGU5sWOFgkUE9EYC7yz3O1Z7gEGEBuZCo8mXcdatEOeGyTEAsWnbneOf7X6EVzaw3a40ODKwoHkv6s6KY97YbBRebprtjgNUuJXjTXzHT3XQgXXIFm92lilkGjvSDBy7hPIWcvvmdwkj3nbsRvEpVHjiCmeIxPrnGMk064q0fqtspRReUV7oJpmXBh7ltoeFwZtbVpcfuZBfupje9ohXYFYt1yk3LhTEd3CPSO0XhhqNAl5K8bYiCO1MOF5zZl6B4GjSF3d0AQPXGbbK0wvPdMgwpeFoQr4aJGByIXZEV5rcFiodtO0fjW8YnTVMlr6WSjk3NKkB5D1ic8UytgftXK,1752e673dce31551,3d2c67f1dea6d903 -uEycaW7RHq5flf4F8U109DpogYnbUX0GBpSfMy934TOrrKGdq9yMhOTCI9KYEWEbMlidjJ4WkWS6lMs8TLyO0JH2rjyHJvaez672kzRkE1wk4AUmFAYL0aBppvYdnp0WqxQbOov8sWBPO6hMsHLT4gPSmR8ruWxLzNqYG2OklV7haThkINMpwB9KW5dxMaH2l2Qgm24v3a5cVtTcIMqMtQdlj51MIh25rcssawhQ0gLsIhqD0Tluw7G3TYQrpGyBBIcSddlk8ocPQ7vJ6Dfe8za3STXkvmXBZ41GpfJLxMblheKqNK5mWvTm5tEbfomuI4ceNJgv6KAibLmvrtzSwyqYFNKaXWKizcgTfQ7BElv7V9eOZGG3otvILXSghPLwXiz8m5OP8bqpPo9OXLDK5aAuDKRThgwPaF4djuvzYHIOFhJI3wUxUkpYsoaKPjSHfT9iuO6S8FvRG51A6vORizeaIWCzaS62Pdp87FtgjgyEVLvB53FLSCvbLYnwIJlftqHB4BAqQtPs8gxmCpwnk01SJCh5DwNdtMXHiJeUWvTzEbRoM9IEGHE4q4oBgbHTtS4PRihKVvoj0KOS63Xez962rLIaCZvSOkhtwsQ1Kt6EgQTCw52kHjEdrkets8Z6EaTH5oqe6gwvpHSPpZSGwW6SC2AqVtsChQ55Jl1cQEwGGwMO7dWObXsbMzI8ctvV2ygUigIg1oWRXIm9YFtjzOLVfBz7rIPpKYMd4XoRp5NFAeJhJgalICotUmfhIgbxHnP1lbzIV6JVNuyarBhlUfTpISTKu8UskYrHhP0AJEIKbS3rjd8K6splQOtlCfseab20Uikf3ZM8AiJ3VqeD4YNgdveckRPG3oWUaBRMGbhBeTvAvGocqvJYBAeQxFmwNqnImp3e72mOxsizBICbMsaIve0wg3ePjBMGvMe3mG3130pYHxrqMNmZuzfiEfiWS,b7ae71d4b79b835c,43ab0cc9709e5236 -zNqEdeojaEej2Mj0fOF2cG7XlsD8kOtgKQdgO2abmNnFBG0XFj1aQQSFJMhE1tjA61Hwv0qxHiwVtkyGhQmkPLXwHxaf2ybQF2xHyQs1t6QgszPEf6t2Kk9ddeTgcKJKPKurq9BEfc2PAB64dMo6sYk175D481ZcK75M4PbTrBoMYKp93XtA6jENxpGcRXBNDrmKDX2jK3wwkupcERZvIEJN9n3XKwLybqlhR5SCKIEGWDY9o7AmRdZo8ohs0DVM5HR1HJ2pgmDGOc2Oq3SRdPBzTM5LpGm8NPJzMIUOivhqtRHDfCWDIJbKFZ7nkEzKK5sJQqUjYWsLrSgvoI2g8SX52Fkfvn8XQmkP2q54LKVFaSonRUY3eEzXv5gPji9lU78VzUtoWTMgksnnnv7CKQq5zBAfDr3pBSj68uWRpS2UEcBEqqtjf4NMGi8wc9F7ZHz642gsCJkgVe7BUdEtggHIBCepAHQ3pD5YajGWHY31PnhwZv4U87k13ea99bQjzRXyh8ImBXCxdFhdAVClwaneSubqSaJfbqo41td0MZqIaMTmS9WXwVyAa0nXTbOMrnhZoVc8saPG7kPb0nvRWWzhtlkOPIUCwOR9WM1ONbWHdunuXq2CxkLZokn1DSkELK6auBt2CyTTSkiUXe4Nr9aN14VLgqFW4UJa92T2T0jLuauVVAsYsdVkH1nfLKX0AqiVqSFtaZNS0bInfUh4A6yMZz6rjPaQcrTQtT7GhNGea7VikTksT78t43wAYFCj1OyrbhZ9FnyfbcpUlVsRVTuSnDs5AVxGEfuJuGV79g1r8vrc2txwwYMUT8Y0un7B4y2vc33Y3BxzzPuVYrlsav2q0nN70VWwRiZbx3JY1Kzq6r9B4dSnO9qbArp0qnX7K6uP2nrnxbGnyMtADlqgc61XG8GYf8,680458e46347e1a8,85fde495ea1ed9fc -SgzLNeMl0MAuJmh5Gva6RZ1T3bFznUJ0nAVeet2DVGsxPgNFR1JHVJyQ4SishZmpzKzJSePy6unJokOGlWjSsSauG4TnbqLawqddPdaskJBbHbdZxodnkbVQTk5uPnj7ZMStNtjiQtH74ryYdGuF18PlH8gw3vAT9emp3yfUmzakI8eHGzN0TJUS6oN96z0ecK0XJTo0IOJ1FN6oMB6k3H6S8N3X9CzRNR6iZs8rVJG5HA6hmw17Crikrqo8zfgXcXCX00xuPA57l2MWsq5SorkVjV4HsQbbaPHQ2gXH63J6eZPXGl2d1G5OcNQVE4NNiMeBPfZRVIje2cU8KzEHTaDP7yXcP406Qw6gHDGVZuUMGqiO7CSzVkyDoqUjHIEoRI9XD1fcqCDkkcKt386NqYRaO5q8fsaHlqsoMpIWY1Pa1iruVuKsksLCDIdDspeLAeNIsj3rKq2AOGUdIxPaoFPwV8CmuWnZgvBmAuzZ4DYIl4SGLYd04IdL6QpV9oledCpaf1HY0cPD7TtN9YhLhMeCzJigUQM9jWh5ipiXFyMNZpubRTO8nr04XbBB3AeRAKQEiD856azDkSn7JnXd21GSVvLo8NjFQ95NIL9BnxZP6PHkXB7odGaFDXig5Ua40rbsDppJEzqFpaxbyTqj6UqLsbpnGpNpF2yFSw7bPH7S8oMOiMRtQdoDQFePQywWmTcjZy7rPhFIB7o55psOa7RJ22Tl1dPUOACOQGsFzVv0m6ZigrAfQQ6InqJaNUHExR3E1yArWUCSMpLkxoJVmq1TRSYGm6mTpkc25ruJWry2PmS8xIl9zMapD6f3rbBa1CasgSN0rFpUXVeD4Pefo5vvf7r3xXgzRrBeubpNVs8ZevbsxmiXHKokCmCRBHhNSbpFAnZAQL6B5etTyTbpe78Ziryj,176470661a7af9f1,3e321d208705a609 -THnYwkArRQVFf9ulIQb4llJOfk3NJXh3ikESyOlKoQacAQSxiwYBi6oa9VEMkPYtWDQNjKTZTEN2q4jGZurUm5kDZxumfLDd2mUW8AryeZOkI39sScaYrnRruA5QmPTJ1oF8fGHhFPI6swIoK3SlAE0MGBvjUavuCfBAtp4VQPbQnonPUfmF6DdXW2aih64XoVtdfsRdIM8zR,dbf5457ce4a17ac0,d0e1cea4d4b8b4b6 -mvFjAPYlx9iGN7iSuQUGHE8NQD63rvCEPk95fT5IROBpQBtcCVFNfNs2Fm7JAttLqgRwqrTfiljpKRHh8oSiWYTWQDzgUjaqSfWZXDYFOW3O8Jk7Q8TgLiPHqYDXfTSsDjxShGTmT553zUJvMtAG0cCaCdFceJGErdxaRvRtXLYtvp4Biha4upeOW9QUiDeezyyzZqhVgJYtXvoN5q7BimLwfxkCdlL5ZfiXW3p0bcTukCcK8WXbTi3hHfIGcmTobKKsouKdlh9P46fmT30D5TnrRS8cWHEWZB7cCksBB1XpJZm6fsB58geMyQgOtRgZo6FZsQw0JjD0PqltzUrzASTF0MpGIMBigc7kJFN8Vi0ZyEsyLtjvm4HwpWo9Qa9c5rv5YBYQujV7nW26JLHOan0GITQtSHE07yd6F1I1Qk9CZz8iBjQyiXI69AVRGNmJblLHcjBJR78gYvNnYVXCvx2VUEK7pvTHaulC7HLBhNKVKdQIC6IDkdzSjTSXS5zZeJNDEHrP08KtrdHWQhBBqraXqySOc3PwFUy28Hkt5UW2KMQDS2yXPuHalUsYW2oUtviF2pXc63YEgpaql,26cac2369524b0e5,bd7460feb06febe2 -vkHwXKwT4xpo10VXfHFTp9mskevWuw0fofbxzC7KlD8KHo7sPChLRaXhO7VJRfSnxkUqamMKa91Ehftr4YMqKXdoUEGm7X1I2sXd1PlNLv1SM29qe6XtSrq0mmqx24QVhv9uERaKhIo3zbMOlpe2Rbi898HAyJVP2Jp40sPsYmTE9fadxL3fKsSaPruirYfvDh8Vetp31ptM6TGlxugIpGKtiKIF0VHpR3kGjRtVwxzStIyktmkTEEG2PmXo6hIkSHfHXnsAXxNR2NNwbACf2b3MB6joeWrqnKKG3D8C,12616b1420d023c2,b8c90a30f5c456bc -VKcJ4XWlxlKprlCajTibNwVkGIydDuFntA5vau7P3hCUOabZsashGf2JNiwSmPrsHoCjFZXlQi1DnnC443BCxaiXENr46STrvqDZvzFdJ5n9xmIocqlYmbzzZZlFNUmGD9QnF4UrlEn6KfD8VUzd3SMmQyQX37t9IT6GeI2skgIlgPFlYlv77Vi7g23A6fVjinUwljvoqQpKNB8Bq1wTISDxdPTowKP1R18vRRQkaUz9USKugzbk4pRSwfpJhpDk6T8C9NAKSjFe7STe481I1Ai9PyKmoD3nh3DJ2GnnTV9cfx8H5M0qF3MwsDVLenjjgg7oJOF5O8ofu1VD46M9P3UlKiKaIPcLpqViJDcFlN0CY8q63DgFJl2pv4nIsQpVF29Th2UXpmH07LvdUSesS0ioPVPbf4Dref8w7pY63MIG9pvdAZkBfPEFw4JuWE8kYGdZYcoDgZPhSwfPZ73mKm3wX2GZRGnGmnQR71Aa7VTxBL4PlcgtKa0Y0F2AAnbF9cWTZttHIdFZn62JDcg32u5mvOyOT3nj0u4QlonwBcaq74hg2Tiqq35wLqJUXLpAfiHDrs0Kqt84XclwU2Yp0fz,7db37e98d48704f2,626296104bc4c921 -W7eZ2i3ejhUPfFYKIOKum1DPNCEwkaqpiYgf5zfel8ztp2OWGXghiGFHK1PB8ozrMRB3MVHofay0N0cEFUyVM4WV3nompHZL9yB0IZbJdr3l1HzwcTorBI0PcvGMt,887c9c030b1b585b,9a1dee40c7962882 -P706JoIzRSjv1akS4uBtqqrovp3EZeV57Zw1CLE9QEEMtz0jRvlo9AMlauqwhpxwMFMvPv8eYw2kqqoTRoIGXWbU1lmefIf8fkfCY66iJIovrEVchC00Ad8Bwm0ekmF6OMeOyTzSXDXkEfmOsSgh45nfcEblKuMEde8rdgZcMfq1NbKgaS0bk48pCbEFsxHWLDaLUUgKkRJjNVV36uUVyWQ53psEEx2rziTgOAsgZ8VJ5h3RHeJczYCSMJBAyLfSaq5tvnOTqBjLHBXeGSYLkHqb06FITP38FcFJynG6gendnEDBr0JRYEefg5769G2ydZUwP32GH7IuNY9bPmL43oha8OmaYrz916I4fX7mpT6H1JHbZQuy21tCNfcODmaRusTGVhABsNh3YYqyOZWv1gHCja07Ptj9FwjyQ3Mfo8wwNSyWpfUrQKHOqYKWLoEuOB0FPios,b18da4d2277866fe,4537302ad954fd9f -QvytILjTOyjLDFwLgToZInxVI73eQrozRSg4ebAOGLBj8jTweAQcDyQpjjqQzEXyLKePrubThM4ybxbXK6fw7XRBb0JhPpZvKj8jR4L36psu7P4UbKgOVuPRmK7flV7Blx0pQXlwHbODEWDZbk40TopwiLti4RAtQcKEAyYZ6iJJDHKHWnM90O9KN9kt5d6iBVlZqgx7RLh7fT0GtxCMdPLW55wnvl4IgOkovLKo5tu0ERKIWlSITu2BZCZCN0IEaywecymwdSfZKeXR5YZsbNsiq5OMYCri9f4NUY6cZWpPiPYAdofijrHSgLkQesBOmOF30YSr2mFpoJA67xraBF2XYe2ycWaJ5FK5mD9DCCp80RBfIEnlj2JmVnZKnVr7tSexiJbQ3niUuOP8jaEwNd0C3AldvnQljLqu8qyLwP2MpcmlkTbO2UMBZmklWmvZBIbz6V8kDW2SV0JswvThesnY6cnAVSB8N6UwBIbbDO77xH,60711f45edb87d67,45cd1cbd29b26871 -WnoE2DiuBddkk9cA36jiQJVdTiWFGZrwAqNPGDWHYP9gl8y2PsJ3R6dMFFj2qM8yeKCea6YcOIpjuEDpZlFnDTN8KK4brl6nXtDRSrjWVx4ZoDXYRGzsRLYpJmiqVe9t3PXTPHFLR8K4Vy4QgnXkckYlRV8waN8liUA4tKqhCBY4QoQoQncMI4deQAP8NINz4iY6JWgP7B3KRRu8ziaSWOEXwRfzNIUU0KZXmdTftQ9yJcb0LMJnaeJ5MHWGs4awXNq1e1kqaJ0nlmGXiVZm4IzYFiT,c6af40287b13bdf,e6fe0660cdc68302 -EQRk6xGVDY9xaalz7A0Y7Xuh1c6fHldpDKo0Q6eeUPQEOaTw917IskNfyUHTwcZXxztKX2fKb7SpJCcamrAfcvkSQY4Awga6NFdyrCbllU6GuORpbaEnpQzUD0bdHsXfXFtCvYLtkP3RVDTzTjyPtZfkyvBXmA1kmGVtq0LUix6dkNGs7qv0BJBMTPPsgjEsNho0ADNMdlHLOwxlfNfImecbAjqX8tP9POKdX18mWQKreNuiWfXByaOq5QlPdJ6sLZq0i7TlKQII2UV3DRIWgQ1e7wFQkuQDysu83WYBdmjYVw508t9874k41uMxjY1jAhOtOIWTbdDcJAYZ2MBXZLgQvRoe6yvzcMFpBLHRsz4HHJCqndnwZBUpV1aSOG4O8WnUMEDfB8BDKDBLf8pdl545zAew3vY3yBvQen8yO17AnB4yWvvG64No6oBdaTxFU,cacdea69fd902647,f7135a97546b93c6 -Ey5Zqz652IbXSfxhvSUOSGEv8ZyKQf5b0dPNHhmXwP1Ud3Lxuci6A4qVbBNDLvdkXrdzqSg6sUhZcGv3pvDk3y3b2cJzhVPJfTGYFaltgfGLQhyBs3uO04nALsXn7rGrlXB3slnAp3BZCr0Dc3XMPL49IPW3w70dw6m7Yr7bRz9Rfei7OxRf6PjO3vxRes1OcEv4C71f1sbcKZaBUvbw1W1REglIfCHo1Xl9XtAivpy6flzIKadc2kpoAPoMFEUmKpUwztXVic0IgtJ3T,d1134c19c8fe35b,656b7e06f3246cea -Dw5OhUoQdRCUwgL3OujEleMbLkwX54R6vwYa1nzQ7FCPTsZ7bFC3paW42K9zjlZ2D5whvERbpKHbw1jWByTp9RJeP50yalzP2sCUWEZP,d99baedf440b2d5d,3268bc21c31fd15a -mtvkyOjgspiuhw54yDwyEy4KixnBpijwVy2w5UT6MB11cQv8Kb6t0z7V4SSMWIs5VGcVUwVlPPJKsdq4t7fZrxVNu90lTJ9Y35BePqgT1ungondP0fmvPFS2C1gByoCSt8TCvIOWxpAsnOgIN8eiHWE8r5zxIgY8Ms6mP9XptAzilZuOxKRXOEYxojctW1asX9vY63tRiA4F4897VWnhVQuvKYfhJb5U3SThl87i3VirKaVIi9rGvFx6OtY1uJCdqlFsFDpqPJHX9OE2tgGG1r1HgKM6OtBc32fMDT1kCj5SlA9Dz60gU1gt6f84r0BuJwZDYl3xr4yGJ1Ja6uJeLkT4jPFN6OBiqUQ6WXR70EDGiNI7ZGBJFsVfQ8UFDkOT0aTn47QB4XYUrWYx3D1bH9xovPC9qKh5buXkKVBL9swTxHeqmnwT9yb4wTPF8iWeF8GVo5sNsz1IWmqNbxJDR5TrOf0dzvZyawd2lfFXndH327pUSYdaXm42VOhD0to8GfscG5W5enbQ55aF4CvWuDMHh5Q52vUbxNXwNc4Q9eSMn2xS6QzHT5CgLJ4XD3bjlHAhQH51RTZEoC64oGRPYVROnBPI,31bb5a8fd55bccd8,dc90c597e21f0e1b -fISouSGtuuJKAhhZFlCOHG0gSdDFzG26azTpVVGJJqJphu2yAaQuLBzomOrZ9hNn3uSVRjdZVNVgQDvzoxGFeylXVbC9oX7ytnsbg0rH0Zik4lXbIt0hwIxW60GYGxdC3hyyUPft3JKAlf31kvLx0Th0jHUEWi9DzSkSk2Iy6cuZbKN0rgiIsVK9q3YQGKomPDzxCbfEX3idHyv7pk78zHNou1I3Uwkm06KVK0MMjBviq6xFUrw6PORkE1rwxBuvqvfdP3chQGX6sDYwmz4CwPyxcLsXUHhSkZyVbb82v6zRjxwelRb9xWi3Hd03lkzRb49zGZY3J6QFaFx8gtKe1izQKBz9sJHSqSoyZ8Z4kmZZmYiwLGGjSWcTHXKg1ZKORf6B5Z1y4Ykz7xMxeEYzHJ9RswJkm92hcUXYpEd67LMy0vSIm2zEP6dXUrIe3X7B4qGtGVRp3Re7aYAtPuMpioGUup1EfJO3H1qc7GtEjcdPntNz4giewQA2HA52yMGRrehjqIMrHAAbRjzgQCqzB3HT8bzmo2q2ktHr2vtc9KZHuTL5gQv91In6jEyuPoVostHsIXrJP5AhxZEK3Utf808J2m8XzOPIgzXSrnCmWMXbH7Egue5q3VFEtEkvuIOAZuF7SeliNLkg8UJSAzCaHOmBOHmis9SOwwgeRdmxJdJUBHpVZLip2rHxdAOJDcQkhLmZ76Z9FS5i5E2lON1pw3yQNMlGNXxy26QZ4J4kMv7jxnPxdMjURts3hH43OPL4dqa70VOw6TqQxFXVVkLgunWgMZJO2EybR22jqaj9a4ut0oTbNELXD3GtMbTjBCOqkMT9cbu3SYvReg2hz89iYfm,7f8d792e062e1cfd,613dc7a42f6796bf -kjlU1znsLZaeyeoX5qbzoMjlwq7HsuggVFh1fxHNDBOMeRTI8Z9S20OSoeoBM9Mpka53nBgO0F5H63Yi5LaUia5ZkiiOFisNL6xc75GFtemysbV37UTZBzXASw7oBIot9rUVD8jRHoc4XeW9BeOmrpUUY6bfJX,88b3fc52b9ceb01a,4593d6ae58671677 -WJWJfYXRgkTn1zRCDyx4x4AxxHfs9r2wBz,2c9f5162293ec6c0,787ddfcba2317bae -VZXRS74qcJaM1o7L4qTszPtp3S3FvoOg1QfJZ0hzpJSgS4AZqbzCeGGYoM9MVdi2UYODNnaDR2ANtaA9qQh0BuWRxiduUzXEVHhSJWeYlUbShuBD8DZ3rVmJm5CABkuU7zfhNZkFMv7M1jepQWyMJjPAMGYSbTIJjxoXQAP6BqpVdkEuOSVWtRFgOmNEWF8n7hiLfWXH4PPkHBIlfLe6GlD22OHm66I3etkFrxaIQG9lt1LyxydPcWdtlUKsWSXMwU2Zl7Slc32PvWYuBWtz9fIQugu1Vo2kz0TY72WHcbRzn0uliwK9t2Z11vwk2BbPpl6ol7aOB2LmaPlPgweQyjD8qgv8u2kbYwx78O6tHhMpPUqdhurv9y9IKhhGflo1f3frOwFj0CWKQy1uLbPwJDGJxcBxm4iH5sMNLJCIK4wGeNPrXq3LZyoNOEoRjZXTjEHwmcrNC3WRK6NPDIDp9wIM6SKJqRc1X0AfH2lkGh3Y3UAq4PYBkeFok6j9XvgD5R6UN6gI5V4fIOEMag5LIRhUlqIKLVF43kdf9Td9SfqdqdrN0tA6lgxPnSB4DrB2oFM09sm0sscR15A4fA29tndDwaR128EirPRnAQNgqqsrIiZEaw33ci9IdgoksJUbchAFo9yQEo6SZNgXNOz39RoZIoiDoCHK3uvKzTtjvGkcI9PEa72rh3HxF2NqfDMvPrdCBbWRaSRFqDbB3C8BAMZZsK6Ql0m0aUR70PjcjHncLkhfahZVzepqZo0yhJno6QvSwCFwxCgVgeFIufS28tZMgbkTJgbDejRzzXSr6Ikg9fzESUEZlvh8PB8YOwEznkniHzwMPP6xfa4MaI,dd308591204f7591,aa6c2c7be4ce22a -Gv46ueHUXbDvkTiKLlYotjhYAgb3kS2WB,7a3ba1d735c6cd5e,6122b267103409e0 -4RmW2K4rex9qX6vfqgFhfHMYPGW2o9baxqpGBDOShbOHvBxwGulP0FoGQPVSXrS10ZRc,d3686312bd413dc6,ba0540db7704bd89 -YefIYUeQJ9g2rvWPH6WyL1czfdg85oEs2vSSm8OAIPrHHRj0d6d0zvEWCaSxBdQNAu1owzcESUABQMmHG3UVUmKVhp5Jg6RsqiIajEubMIDwhW5qOXXWZ2AQscokV1ghdn0ffYZifAdAw0pYGGT7PdvX8BW9erJl7QkN5sTt18SvtpbcwSPRRp7WqHgx8ix2IfiN54QXNZ7Ds3ktaOYahH7X4cdw1rC5T6ltnShnvlXClDDJyfB8gUqNnmAmYoUmHDM704QADLzgHvb8WRoUBX7nC6WQuB1OCChVwuZYHPwfwJV36b3l7Kjz5,90712ba36c96209c,f6ca21700eef52f9 -tq3rKE8KOTBVYMfFULLieiMxcKfj7AvHkzW8xBWuzUVogl1GHl9228UWeZ3m1E6rZTYYCd1Xn0UWuM3IkMR6TdlUUwbHGxI2bCrxkY5fpS542fUdPTNzxrGL6rJktIcT1xn1YhNZQhsc99BzRq49dqvFvSYeQNZdoW1scVhkor9xcMs2JLbFCHFXdnKp2,ba1a0361211f175c,7feb290601109a75 -e8fONBqYuRTwSe7Mona1YvKOXVe8R2OC8U2aVskzteXUl9BVWFwrR4eOoquFMJSVuN3WX2YcIus64tPU1Ddq75tg8reOATVRr20BCNOtVVvFYKNx9JYtK1IgZbVov9X8wbmLeB8PrbI15QdO6xJxOZ9tevPGXVi1FNOudOltilU41AvyjpNjFwsojB4nilb2rBFGBxYfc0g5jKgAFrxeG1dfpkDvhVMelDTLqu9LlWvXq5MiwU1XMd3inehbNUHpHYRYqsvVBp37NFNMfJfx9YKQ7sRAWMBcExXa4WFzVRnFqYwX5XkMAo3z3jVzwLjAo8WgY2u35CCsv5gTTZaB9qxORe8QPj3ceqeWI3E2B34bWFlpEL9s6mWeZCUJCYy6mtQckGLANROtaSzNZSK9xq1uiL1nesuWCaaZ4cqRhqc3qgBsy4rNQlsQY6v7IW6aSj7YKGPhT4lTHGmjZ81Be2L2unfOHUEvDz3hRkoWUHaBuFUzPiDUDSgeve2BlOP4kBshz8lUyibuuj6zCrdGKQnyZMkLY08rQc0q7kiSc50OnehCoFXmH6lWKtmMb9EZiT6AIDAFlsBrzvicBNxuwb4wMCMbXn15v50z5LkLxi5u3wcVbZ5mgicBRew8gx00xdHbeDB1PpTW8y7bKBgKzPa2NBKgX44hiUe4KWbBzjd6ya7YUjHgSGYMw6pqxN6qImqvIM2mx05hJDBRv3QZYIf9Vp86yszJfH2ftbrmtBxrRZPfCVBYBOPpX7bB1hHSSk77e7gd6MCRcdhHUcvdFxCYstDlgElZ5GI8BOAlBoe53k7,f908e0506029bc36,99afd2832d6ef85d -zildl4vc8bTPtyJi7Svy5332CloQhls0W6QJcJ5w138PlseydRxFfSyjQPcYHbkMJiuRrQBt672USe1gn7lEY5UnfFaPLntzJvJ2hPUMWk8i21WjGDIZ2TktjQ065ptiDRI4Aruc2GPSUjQK1WdD1HPLIlf3CJhfSIMDr9c5vV9rCZNOu6NNvbhkZXA4agX378UiEKOb9ElNzsR6rSyCCznm83hPv1p3d6Ud1Xo6eCaIfvBPnPKagtiYj1NrSk10GQhqYPKkvlvaYHuLVvg6unahqhygXdDIxpGxbcaFlBSwptFDUOLme8kUiu0vdoRMvLZFPQVWrHaYKVGIooQGg86rxavE652x3PKaoKHAnrikpa8qTHS7,e397741717821a3a,c5d30ed148e6a57 -CnSnBVeNl2mWhw3YfYmavgLrfNBRe1E2jsGlewrZAxodO3gvodfT2SUZN3PHXFBLD1ZMPzGH7Ruxf5ZHe4wO5KDy4YZXGHyGifzDZXQxoLC1VBG6ORT2zp2XGtH6iEla4SLdq1Hq6wd3tPtTe5GI9Rb6L7zfgPGaV9gJHLn7Ehmo2Qtr0yrSdMOGyTJNAXeU0lK5Q6ffhOOXAZCVjs6gu9ibVw9H6xplYLkJhj5RWEwTOzf0ew1HOBzbe8xosYm37OJOeTcaEMkoY7EJ7nuZPooNgRKFyy9HOP49XiziDqAQJegETLNpRrINeNt8HlcqUkvGPIAyarAN9ekXCzZ3nvY3ZGlg7REbcrfm4nwlLRCwOlV1zBHib4fXnb1r8UqyQJmehHIbJx4K21DjxG0SkOybjT3PeCxtM6dLaEl4sgtchY7XyR3ErNDlxv3BAaJGLlWYMivma0HMpau583Gf3q2ygkQA4QJn9xFnACU8VCcVdk8dDi5MtnjiTnkRCuAkcWsGgUiDQSyydAPWOWMyLuOkUe5tJwfM2uwrZQLyIhqKcRlbgH3Yf4jJdwn0ymnjXjM5T4cao9RkvaD5Hr2LkIyED673TuvEsm5C5tCDfcX5OwGFxod5CD08OGC4G1mnq577XlNPFHhvuVeAXCG3OArDzsiSaGYB7UyteO3MXgeSH3dUFXyUZuTayxfYqG1PnVk1ibaWu890KqSPjfPURx8zdpiR6iYSmYoqs1XjbWygy0H3x5DeYjpNgPtcgkgGH0fIpcljadmxrdYuCyUefFYl0KTOIaAvXBxqVEGJFgK6G0mix8naCLLKvI7zwjWWUyfgUWabJxdFsgsyANioDxtu0QYFyR7x9J2IiirCPrve9qeNPIHNZoj92H1bFYTduDtV2fWGzjydeUzSaDf9WGJsZV4HkA5fYV2mqdrnkGzFhAroxIOQHsCYqGbr8fjpOiN3o3nuGtlceWu7V9oLI8vYC3u6ogLM,ef5c347a09a7ad69,3e2948e948a1d63a -UbVjv6IRQ8hkF7yllRpaVDxM4WFQG6NtCKDw5LkUJJ1WIh3BR3VXOJk9bCv6NdiiV6c9eocU5IYLg3,69eea6dd8abb6c10,897e45ef26005910 -BlZESOqAqroMIuRW4T4eZo7ROwmtnCcNTqoj2xu885L9jzR,8cf7770745528c9b,6af752e6ec70cb45 -SWQoQfu4KcW77pXiG4Zbhlg757zmuApe7LOiDzpvpoNcwi29qlJskZ2WbRwCPjGZk74gea8ZakfXqLQGFBkfmAihWwxYrG8Ewg9PHFXoAMORYjIzHMM2SpdwfBhHVSnhByrXzChYgspGvxwyn6U0PqirwV6pDGl0C8pyRpficcde6VRRp8pPPho7J00aLOATtZE4YOHYKJCeklWUhKNaCNJJGabHZ8ZoK71WqO6O73cZXzu4LPemCOZMeckUnyOVTZwiHqr9QumJ9BvHYuvBTGIby5xLNb8h05FN4fMOwaiZssyZwuyIEUuCdvz9cRcw1rI1eHXMFCww6JWmleIXfkNlNS0NNaVldDdFOSl5lJ0ZIryMnjVAMnbGbnNeNLxYjrWPkgukvVXPr1B1pv3Y4Xb7NoLwxUihJ3p2PhtUytXvDMEqyogvSKPK5ycNgbbyHKzPPhYkCHdSg42wbNOzrVXiehkswMcUZlN8yX6TMmm8G7ANVFspYLqsjkm0tb2QRIqEyBaZdIWgsY2AaTs1s80YQngVeCbxjFlwNy71ZyFUtLIXteLhOzV4tEDRmWuTEO6lYQZvKfRNV93rmmg2atsQJnNllrIBXh6CAsVRZ9Dq9ZjMEd7iFLus4q3d4eaELd5LFIh08Tm,f252788f9e43b8e,561421a52ff62ad4 -9Wr5gIaH2QIHp4iFtZMrwDRhajQuzfmTaVXz2a8zpqAbXE3agPcmx8B5yCd04bqBBPTBLbEaoOWtB9be6Y0l3r04I0STyQtiT8eqiEbp7C9ntT9cSwTwNBdLrKNzgtceY8S6b4l9Lhalfw3ZFhklDLEkXJO4hwWEOPIi6ZG0ni3LiEO6A30P6K1mUym9f6C575WIguTrKZ0YdQRDHuBVJlcZYsy5l4D4VbZ5uXjV5GmCDfaLcqSqHebi01KlPbcAPi7JJPQjQ0Z6T7aO2plv1GR9lYbEY3vQEG3Kw5j185YX3aiCeqsz8jTHRSTVna3fGubpNl5bDlc6vupYevUIy13NSCzh4BGVx0BwjtbmEFuN1TyMybyexDCRBSeKpmUmVUCqhVkWZfyaEbU1zJ5bGH3ZTrqDIatXD33R2XK5EOBS0lTEYzrJ0Czj0w0budlq6OBMqJV7jYlhe015CVpNOqOKzZRgunk38Bz0SBq9FuYRKbQTSaDRlSe6GWVYkamIz8z2tGKAKujb9cFnzLvALaGGgSl4tu7VMPA8RYvP3Al0w6sqYQ4NHzNwOVCI,2c94187c53f9b40,f9bede69cf97a2ca -AMpIKdIAg5N498YhqIWXsATNGk4b5BAWOTTVoT0RvuXK8AUrdMbUgku55yow14ThESBpSCCAKA7Yx7l4Ga0CkqKpp173MvtNEE69Mr6VGn2Zmns4xmW2yiArSYHBSABanKePKhke4FBL9cYKIysB5AoXwj0zqnjLmJypdZULelVYh3qcfIUCx1B4YKlicSazI5isMkNn7ShlfYQ2O0TfAzonbyFzqSbLiKqqaiYA3rPFx8AethJDdLNdfAYpPGfqijBPxc8RaPQJbV6n4OjtgNLegCab2N4GdGSpQ1uciCSfOaN6REWG0Aq5WkBcxkDRCwXqTlFYQ3pYtgPtR7mBRvux1kbYIuZcD4edDsDKQyecaJV3C5viMpPzBDi1HaZw2hPDVFynBr8ftOnmARHpD7XQOpfvK7ZgAsQVWRFG3RCCE727fUuVNSPXPWD0OsLUslaxbf9NXo4yDOF4ZHlCpA0bJ23mBVa13pvzBdrSib0h8GlCKAjHOLmr2MmOWjUycYLg6Pcd2cFgsWo1zHIyynrc4S05XYeF8u6md022WNWnfNILLRgEW1Xav83XcV0mtrRscsfUn6sWVSJs1zcV5t15XkhmfRrUWtxtpx1dPPHUi54A75Jz94L1rBUtHr5KBJotGvpnDNR94E7AyD1Xu0xYnEfUz6PvdwQEPCQP5jlXamZiIK5a1XkHMB2asHlKJpErgyurid08m7eoiReh7Oa4F1ahCPj7flWYR,d88a86f31d39c12b,d65db19fc15a12ab -U76Jj1AHNEPrA1SDHjk7iG7TNJ2DAcfdjqzal1pX7FlwISScuyjIzo2TYN4BKJAedPIm4nfSUip27kVvnaFMkBYlY2Dlfxg93TWCKALpXPfWNr7BCXKZrnkfjtivW7u3AYiq7MZfQQQvRpxjpqwFf7FiKrsATrSRYMGL5MSpz070I1dKbRCuktfWMD027lODD37tsbLByTniiPGEythhXrcW8amwbsHdZIWV6tbhU5fO3YoUmm13AKOe9s05YotkiySG3SgVePCd68Pk6OAGSPxIDINWWhbDzfuEmvsYxfltbvYapa4zwRATPmSjmm2sVgAyLgFmu5nys4I55LbGupFnrzae8G6N2RiyrXyhlvHkS3nfNwg02xIshNT3wC9E5M3TKDFnFIe0z6N1GTR4Jq10OGgr7kBiU2OGDKeSCa32BkVfOQwpjcnMKtbxi9EfVObtHaSfC3IxGbOEb7uILmcSCknDPpiVvTeHOpZB3Lxdxe05BlqyTjIkI8j7jPH1ozi3ZT2YHRchBHekBeNRKIjj18Z4Acl6o6VOypaKAHNdpAZHQgn9MAbqCFgLhzXd1U1knjQAgRMxd2V19AK9EELsoGtPsydWppQL5QHSLm5ipRy8ILV6RvO3eH8DO9QD80rLk2xM4i4KY0JMqlBEGqh89y3pLP6wetAam1A7sqqPT9fREgsJBD3GH5t0kMkwT929XsWobKVdX8JqgI3V1FW8vG7yNYY8YhGHQeVfbe72t3ncc0JJzGEwCYEBmvNRhVtMF2NcYyaKX6Q64rfxXdMjO4bn9hcnMXeZA9KmwfiFnqR3MW5u4d8Wn7FUQLt8lP7wbrtXRAZRgvFSxWM67j44H2PH23B3AZ9R39hWbNVtIm6QgGhCSoBOn0aJfwjWgpXhAvFIIT3TqiIcnrnPLNCTzDNcA1wsRo,f0d2a4408b21d56a,aedc097abd753324 -azzF4y2he2ObdWbnholFzuP4dvFs02fZitOxoE2mI0V6QCp8OLcaQxXNVWxAC8albbqI1ZLpFNaMnWh6BO82QhUCISaAwVbd7qt873KOZliw1YgiZwVirQ6kDM0zBnR8lINlR0QRgla0C23loqUv1zSicDP2YJ3uisPkDXfteBmgNxxhgWIcLxuKFzMToyh4wTf9A9yIoYJCHS5JTIDO1pUCwcfNexZkFqkucGz1NtoTujL3WzoI18C6DhEtOheRqDgUjUI1ySSLD2AHJMx4P0Cp2GM6n8XlBK32vOczir7wMmcWQ0TsD5pBCGiHZI1yLb9yjtlfTyuyydQIV75ut47dxXxNYyTIOoeQL4mHzjVMSvyhoF4grmWW61PdsD85Qe56FmiYai7vk2NRcFD5704UVNtnfqeFDL1H2Se4IrTaNP0ADVr8xkk8h,79b7b89777897713,4255962b3088d16a -hu7FmOAN9kMe1pwUyGxdkE6Mzlj16YtmGSXlJzPsFtAdTz6Ht56rVXfRm1XRX6C0f4E4GKkWNAct9kEIqbZhL7rMyW67zkWtBnObNJqNyPk37KReNNnPINRnwQxELoLFB5VD2xhTvkODgPkKB2YoMc6kyZSqjxESz47ih1jdHT9Husqofz23YTPoolbPtRGfLctBq9DEk7TVDud7O3tiCd6BHS4luLtz3xTpMswlPkEKqV37nNyf4KybkOOsEe3X3w16sYqvX3YItlI0pRSVCbk5HrOi9urRwElTkArC2oPEcmzfh17dMX4nfuA8JaulRwIB8bwAbKB3gbBnyJh4TPh5TbUU7eUch3fjMZwG6d61LN1lgyvKcrtd7aCOWB25fIV,d78af8c2d3f0ee72,e9235215a2574df8 -qfTh7Rv18N4JhMr7D0qvfmxNOL4oyiKKYcCtLenP0YeK6I9PXJyqDBGcFXf6cUg4OO0lWf7iP5noNcfMmV8qbZTPpOVokP9NawO9F2YmPU7rBe8e3aPrqqKHgRqwRdAccFUm9zCVEFcOqkGTwIFX6dwVp0HRzp2A0VQYz44ZMihx9BFSMneS5uVsbpxoDUfyWN94adq6vKvIe9nTTapYeR1q0qaqYVxYmZT1eDWDKHcCR9XjOUShYEwc9Hoxzwqv,6e6ce91abf1af164,7afaa37dd33af121 -SgLsKVuPSQjdzFqR4uJVPjb1Da4Btm5TXmMU8RC8IwByb76cx3hpWLayqsgarH01fPrxsKS2whVdgFBniqCQn982IG78vKZrMATlsA8YnzL4TlVldqUQwIjSH9jOO50SZf0oymjgWjhctOn7sWbipU4QVfW08vfvfvbqhURhDBTUw3TnGnBaHf84DQlXJ1slC9PoDxw6Nxl0KtPvbr3MHGOdaceLpjP3gY4KEK2tDxJ09jPLuesxapOuKfU1H118We7CDNHFiUuJ40QkWYqHw8AALTM4c8dZgn9mYyrguGgABEgFSIK8ZrprYhm7wRTdbqgp4ajM74HjbmJwW83P9BpgOeP9dAzH,b02ca74101150447,f96d5533d4a13d39 -4WYPLDA6iyjGhr2cmERWLArOSsK8ws5ucwg9Wz9BcVU9EPtPOaPIj6yVtKOKUpyFGwzcTl7u6Nz717ZLpLUjQBjbUWZefCQM6D7BMCcenroHTKBY7tYfEs6A2foe7nu6gl1uxoZehRn6ZWMccardGkD3pJAAdJ8h9vdu945xPWgnJ58y1GWqiLCnRQgnS0xtZ8RjieKxQRTXcmJIQTONsn3Ey5rSSDR4hQrYuvtCnksdE2I66b8x2smiWeeRL8QQZLT1aMlrz8BJvHP7MqLImFe9BjSMtknbPGkTn67V2WRGVH9GcGzSlOlINMffLbnlXtgxZ9tyg3i9YjfScGs6eAAuEnqBOi9jQwlatHO3k2FISwMmPHVOf9dGCiN2XDx6tKSTMQbjr33Lmlp2XsHbgzoOx7wV2F8EPWmxCHD19BNlDgtzhkq39oae6B2kK5SsDyPCrMIcWSQuWhkL662zFrt4FIaMivsd4KvUWw011gF7Ct2qegBUpa0nIopXhCWuVLJ8jrLRGyt1iPVh5Ttn5CUrZA9i95ZvXBRIHqBqXF20VDxFljSDZ2UuR5mXQ7aAOz09jlNUsRXxFBAW7WSkcEYHkUAMoTv72ooBEoPJQdEbmZBw1bvmprxSQH0BDKF0RoWRareoJOAWCuSquXB0tai1JikzWDcj1Omqe34CegvodN2RYdgK5Dw40JC45inDnV8pnDkHs4ICCkYFsO3NvaYIDHseSVFHm3aSXUfKVr2C8paXULjFzCPn9EmszssJbf6jotJ9EbPfnGOrZ4VZZ0wlh1JJHSdyHM3nuqZeH9SYGOx5DnHkdDQ5ywExnX8Voc4K8jSRvYdEqFOhMnFGTbp0Ess5LUd7H4jcCYSuresorMHGBzBocrnf6AcPODZR26OPVPwTQZYKPcbb0QEDPDu5Qb9GWuORQXxbM7ZVxDlkRg88,2063ab9e195e506f,78244dea01a38d6d -i6GGXIwsyaNTm2C9S6DXOXkj3l0jPv6DxrwXYvxzqQpBms3obami6SaBSWlxc39cJtnsaw8kll91EpVBfXCzfkh5QaCV07nvENshwemeJr5kVRdLTk0m6gRjK6doYjM0pFQPSSZ2cRD8BiQnu82IvzM8wFqbxUoX7rAOPr3Mp5zNbf5do0lcFlHJIrC7xKXf4SClMAEg01eHGHeTTyenWP47GyZU5L772osjDRZak3489pHKLBYkuKt0ofzuZYapV6mL3ALlNc0TIoPzIIRl5z4b0yxaO3GYdHOYlm1YgEbMjoCKnUEy3XcEbTvUET1ru05uEgGs9bLZBIX5AvYSS2yg2UD9okH5PbNJvijTsr66LUNDi31ec0hPbaG433WYNjfwS0w5t5zIIm7q1tSXrASseWWIKmBooR0UJAd2rC4MaFlkNlyVJu5f7jqSYZkqbhsZ4cSfKdk7f4CQP4AwE1jFuNyVlKSIKLCa9hrVs2aKNSq1Djyn7LAc55kzny6sZHLMFs1KKqqYdg9z99iTaAjziq9aQJUJIk58q78Ffzjf2V3CaBUg4EK4yDwxkgCDhAqcJ4eld4hGWbtX6pfczhf84dBzu3yoB06phkyGJnECEsGfx8OZS0e5O1BzkASpakznBtYDrL9rvAnUd50t4tRBHYHpyFkHcvxmkU8mlVVRoFKqLiIpBOFxVlPplEjoJ8W1YBMVJTJAwe,2833ff1ee4498202,bb93c464c923ae85 -wIHFjsWd0yMMkNzfmAOLwCZ7tab5FEjPsZFvgeuFgLTfKz4jHdEo1GZ61gshtPIJiF47JMWXw3D9IjiqxCl0AAFrS01rEhZsJ6O7ItEpBfpf6IlHbaeB7m5LylELV56s1mi9RdfTkLDH2sBjg4mfkhTrvbq0bfkb5WqVD6oGzBWXMU4QOX4oBgwvopFCZHJNi4MgJLZMRdgczIc7Z7WO3FIYJWc3hNQVJ5zPmUWaRUOXwgSDDGr12FJZEK940JK63nUWvdwEkewZAiTDaTLW1eCP87bzJQw9yEh25C3iltmO5SGVssK8d3KI9JWZ1WEUr4Duua5t0zCqLaPhBC3Mc28ScYiHyoUnsDFj19lWrSfpg9cZIqFUr6YDid0FnoG3DQFH7VsZ2bd8qffwTLZZ2GWgwIrFBfUNSDnhiQn1VrepZTwKklJw29h4xouuKXztDuO2jNVzcO1Y5L0wOjg9q8290S1z7n62Tl3trTYQ34A16DO7QsmQlxjZPfbnAsecBc26uTf7QbolOSsi3vRHBJ80eIk9r7GtQtSOjrIFi7umADJTktpBrUO6bYCiRZcmlUohFJOKV5g0mAiuTHfNIC1TabPPRvS6UJ10SMEz8YnzI4H8FEwxpdrHE8m5ncBzCr4pZH49nd6HOD0TcIaJyiOgpEZKIMMw6gs6SG,2f85a5b756f4b4a3,4c3662c728526803 -IZLkNd8gWK23QEbWD3gULWycK3dqKUaGIB99F4kATz6JS3LlMuSVlVIOB23YAXgArbRzPgdaivvmKHS8SkO27OOmcfsJz8WX73ePzm6Yt8suRyaDr7xXewNh84XqtRzs0Rq7im9EwVodBIZqMaDMktlgBsBhPdtESySAPZngSHaGW6RTAskpRSdz2pLdVzrr0hLSrIWosZmqu7IXUfSJybefiA4QcpzOJJw5YfFLd228WcxB5WgphWpie4cwmdvlVb5JgukMsoDQkcnVVLuPqMwW7Wbs1dT4mnJqt5zjqfVNiMJlQYtBboL1q1aKnIN27naoQ8rUrauK8ooqwcogaO0hJtHlqmctbhEJmF1Qu4Pa1WdbN17u0kAwc5HvnfGaPUc1cZJ9FlG1,fa5a26573fb5af4f,8e30d8dfa77dc0c7 -VncQzKx3AoconQ7ielixLkGNuH1De8MxIK5F7vEhGjZ1ydJ3WtZRlKiSPEGgd0jAQPK2S2tohFja1td2Ot2fT9ipJEz959DYPcrQI1mUVQdL1JUAi9nCGCk7eBTvUClWhn78AUtN1sacGLr9YfT5bB77exJuInUT9ajUl51gFhxx9yxbH9XpTeW7lTJle5WyNieLyF8nzJ2D8LdHbxXdcoCsVep71U7GahrHWsNZKJ9teuRWnoUOMBahmcUDJkO9qJKBRewDvdybC7dcd9u7VUpjkVPGIQ0sq9xd7YDY59Pw1DzKkrwcmxCbMuun2OCIQBf4my0TVOkFzLMtmfOBNlUNAC3N6HhmXDp2WRTGyaDNVtdF4r57UPyAHboZ5PwdNY8WOe8E9GXqnAa8FvSyFhXV7k48QjIeMey4E3NckuNsE9sjdB2iJrEvkBZlvsKmjLaKSqngpOBbJXhQ7sGUgLPXmRs8dXY5G2AkZQJhZlu6DQFHP0BNx8OxUGR5yPM9NJzm3JKt54JsJt6nGhO6lGABDob170UKUPsqBn6eQjABYJIWQ0aR99aGNghsRa3FeE1wzK4nYLaYB2HlvImOUZtbxMix5NKasgYQvbk2ff1tez2eEXFcTc7P4IVF,9922d903d56517d6,7000d68ef6cc6d5e -AwhE7AZLlPqZThMYizEokjGNa6fCeMZhZ9Yn6mSWMfLH4UhCFu5J16kTe46u6OY7YP1gmUyZU6snxYB7cZQZBbfvC08NEVWFzbBvvhRTEVEM2yJajPcrAauGR6rkGWsACYhTHEwZyzwygsBtOt6BfY6Dex2AAu7QoI6RJU3hI2befxSV0DiPXbWnJ8pLGmIsMUT0Ibfrn2GkGnV8ItLROZlY7yXa2pjKKiJozTcZsvhdzKMe9lt1Mk1LAjmS2NCMbDNoQr9O6kx0vjpAHrGe9iv3PBFnRv7ZPgtIGkwgHac6A32SY2UhMltnhlE9z17xPkQ0Hw2o7LDrumYyYtqGMwEGz701oCacYjanWD0svWCSwLTesZJmHAlm2XrFA5hwukKqBQCvtv9lqvo7IOfVkNk1oXVae7HAzbOauB6C6C1fzBZcmiESoJaAKk6Fb0SGRIBwBmToulGuKfcmXKCDvVu5bLGhymWpbfcShRvBrGE2mIwCmEtTpzkzU4xxRr8fKkj8ygxDlJO0AUYtdS7lvB0VF2LmcS24m,309d65ecff6ca0fc,680bbc3d16a4f9b3 -Jf4opMYfyEhJfccF7p6E4IOUUGfHN8wnejAaAbxEiqdqCGNUVETmTS4sXwnuFVZrUw64hYGVZd8InSrtzLxS0O2dULL6w9GOsTYLEjX6h5vBBXUnnFzVmBAlJGI07k93qC1yPC4jjlSa4THs6S39e95E90ObzFsHt9L96NpImXmwlYVoI7Tfl6RoviroJOwokwpRNPTrPLdtx6iRhimYAPHsjFe00gNgMyNGUmKTPNvW9j4FRhGBcOWX6JloAfaqbw22s6hKwag7fp0hDaxWDWBKzhJ0BRDkopF75Pp41ss8011XEB49OitONBPoFrqafNiM1mSr3xn9ZySekG2cxGZXLrhhS7hukEULHDdvzTh8PUAtV7cktrjxmuHtuRP9F0ftFu7z7ik3ixUkuiaGpLUq7ZpHVfMJaVKsgZNDfu5ZNu1PERLZq5GIHFfxtZEWNtINLtrZmodiihgnkjXvwzLnxb4dWxDECG0xjHyebk4N6bDtTJk58XPlzDDtlMvKpOPLQFHUJHjqBn7KjrxZJ9V8HO8rgPfUifMi6abzx96KDPG2tckQBiLBTlArVpFmCy8KE8pbdgkFZDzdpBLdswOsH78LEAlfXC0KCwJzYEEajbPBNmciapFCHVhtEUloqBLgxGFnFuaqAWvhhxqCilbYljSTc18AYd6IXs2wj3PqqFcwLRCYyxWrJW9ZzNUmvCTDwL41UpVyqbvq3gVJ4EswRV0x5zHVlqzXT8BjmTvcqSGQsykUN0P0wko08GyiCQ2TJDp33sri334fTbKaMqZYBm5HtwIw0X0n7uvEdFNVdqywxbucPMd42LZB4fMupogH28J8sQClvzBQqNNeUDtwXQ43mv9kZ6I1Lue6wj1TL5ak6nMicii8zJwJY0ANDX6Oop2zZehvJrLoJz9YBzWnOpePBt3y0bdcxKVBYW698b,4c58fdc9336c57da,d93334565edd8c56 -hpSr8BNPqSSQYEtrNCwSpdTBVbpJkL4tWvnzji3yrPTBwrvSuAVDaEAAsAV98NOuGqitrViu3WH1VC0catY4hY5aegq6kzEHSjbqpDN92pmYFMd28N3E0czf7woMxtcDYMbdqZmtjpbLo,eb4c169a11d9ee88,705d824c8fecc164 -s8hux7oUPmXsoMx6pljpAHErMrovOBCH0MUVsRjCyddXTzyqr5eYdinzuVUc9SB60gCV8wuPChH967fenxVgJqaI4KSewOjXPTTkJq5L4oMZ3nYViBFIcWSVoDrgJht6z2Rr48DcnffrjsX8iM0SPvSrtnMNFqbOylME0EOoLJtlPSzYQD7PvV2YDB8n5hnWFbZhB3k9IAPIA3sRkSHXcsfPB8y2v47gEKNnJi3JYKEzcSv2jTWp3ICzaGfg37aC9yzaohYwHp3jCq8lKFJH03zvHXbTqk19N2FD9NMpLm6ViwIxIw5R81x4MPh5zHsmVfKBdAe8gOI4zjvTOQej3AFgy93F6WCRz9AwcDMf1PUZa1I3dteE7dRinyjJWQwXSHXHtJukJGJ3Zzg9EUaCwFhHnbdUMJdSaUAasCGqlieG9qDqQ9P0wYkyiy4VOc2LZizlh7dKLtPNk4WHxYLIVZBrY9BYbEmDlBYyTOKqsq0UXNW076TRWFWw9yJSETI0hUR1Vj3ISV4x94XbGM5LKtWzuFY5JXH9gUMLqRkY8gG5GrAWFUgys61gi1gck8LVWsIxAN3SSoaVakj2UwS1BZLH60oHNWSViVjD64t7R0bGG90OVi5tA9dMG4Im41G9scUqrAYAf1xA58dkC5UIGe4KwABJVJCFux7Le1cFoJ2flR9Wjt3kSuBaCRaqFa4SmndnMI4YAWyCMY60EUspFxFYL3BQmdAK7QpKRfdKVviPIkHVc7az9hAOiCeREJdK1Nj2N9H,eaae3d78ae655b31,8511f7fd955f49d2 -I4xDMckODkpfG4WJEO7Oc43xih0ySl7KQoyEJoWPWRzAFpzkoQJI9wxhq9anPFrZTkt0B17eutUCKx7hU2KoNJMGX98cvM1acQl6gRRTX7zbF59APD8xNR7is0DyWQHShgpmWZW9v24k9eYPH1tCrlLwUlpFOlnf405m77RvhTXoe7BRFf1PjjPEYZXSaOk5jdZscVLKNgZrrIprNn4OvGHLlOPTT4g0QkijyAoGOdaRQ9VtmKzrKTk4kn9ALoyEIufzGUbyb4A7udKYfu7BcqWcOk9nksQtZOqZUuavfjOR0ni4QyOIWt2uqZsAPNiY8jd5IZflfnVPV46zDG2gbsjj67xoHiEGZBXK3EdBIfJGppSP2wvMMNwtwGjTD2KlODoLQGuEvQA7176cyDHsT67O8PX2B24RSMrl8eSBEJWERzlS4rim0ihPMnuTWyEm3hWFOh7PjpOiF5hwMSSdvoSZOAIkttr5wuHQz5eX4lIM6HY2US3eqzd67SX0eXMA8l8Te3idej9RkC4ibadVqG8wL3Lj18O0bbDTaLgHx81okRobt3YfwCzRACwg7qNKs5luzMGFT7qSx,26bbdc61d7e99478,3746257164dac36a -Du7kayEpP7EA6EOXTl3Qf9xf9b5NFINzPUX2f2SSRmN4TKCF28WnqsNTxB7mbQFiXwN08M1bR2VVxo9Oh4xxJa2wCGMLMgeq1fEvK2WVy8wJ0qooDZyN7mTexEdv4vZ1xyIo9Hv1WhRmZBlrTWqW7zlthYjxzb794pq2TrUEzNJFHxk0hLrv5ZdEy6ThPUyeTthNZ2sVzcO81uZLMQ2wRPzNEKWHtfGWQ12ZHJLplUHl9LxI4NIWKKCtsA35pKydN9I9szu8G4sofTm4YUiwjA48ojxz2LczfXEGDGlk6HJ9VVYSTcaoJtfaGEftzTauFjZa5HY1sLsuzqaP3KlHhB5mdYQD8UnQE4WQb0TCrNh3n5MTWYY2I2E2yT1pZ8kl9Vx7hIMLrGQrlj4nhytHHSPTx9PvTV2ShxwEOalgr14C2kwQyRCMi3TqKYemeRdpLYc4yEDvNBJZuGHjML0mHGYyGnJHp7TTBaJSRqtmwu65Cl3FBFSnCfinTAzAE5QmCILjO9dFUSXzR5zr1q1S9dDL9gxGTka5M5bvjl7qGsBlJd8McviH2q1vcBmgLJrpyHIOQKtDbelZhLJt1yUrNMEdAnDx8vSY6MNlXcfBOHCT9PRxJeXdze5cTAZUISZyqWIV3DEFPAdc1eE9uYTJ90CST2gDMGEAqbzhgbuTn9eZKxaXV85IW5NoVNtgRuP9P39EPiVA7JHubj8XxsanzQdQaD,e082999a91ecf92a,49035fa7d6ac82f1 -SP89W6wk2hXBAEG4sYmKENNJbtHt9Jz5GxhNWprA8Z1UNZkEfuk33IBbedOb0f56Lru8Gk8J2zMJI7g7dDMja2DcZbi75tuR9IdFrfbRzIWoyQWGL8IFMFGVuzkdenKAeyvS4M9dsC6xoxueaXNR559HCLHJw8n1dKCmi0nTUsPGZLpYpeuPI5n1n72i1xCdayQt6raCfFxHeq2BTV6te7RuggqgpgREHPebWA0AEfCed2kucGPNDeSMUvM44OXY2cERsjrfSw7B7LZ1MiFcLJCJdo8fLaZu5WAMRATKTjcad2S7Ro9pZtighGjBVQ22IJPMFE9pmKNJaf71h4C1UjVzO3oFfS8cDpojEWKBv7p7pudXQrXjbSiQhEGvxDibZfOgCj02iKOw2CgUTMip7Sl,1617bf218cf31871,503a8ea4a7537bdf -BmE2JW9DOLlEDO8v3PfCsvxgdwyJAZ7KNDunMRltMh6gu0ppgd0nKMWuxFCwwf3nFfOPLQXOzXGNia,27e7bdefeccb7ef7,d16db6136661df38 -tFyT0KxH03Lzqqr6lFHz5NtXArfMeeEArQ8GEo5zoLIKRieYjtBC7BDzaxM6zIEFgrv95hZfD1rTh2KzlBF6PxdnfgaJLR9mxYCJtTe8TDsm6vsOYkzJArHrVjtqA4eqzDJhjrjzEEtGArGNsUDN1IHUaPY2U7Q7LdfnfLMyjXAh7SIYcLmOzhjeqMCol6P1Uwh8FdYt9X1AvObMjDuDcnfa0lcgppPOhvF8meXoPY1zAKXMCbSH8JjcQZc5e41ZHfNTDOl6HN2Qb7tiFhPd1mJoIKRR0ewsjsLx8t9JnN6lZOI49rc7jRUvjumjEN79Eh4IpfY2jfnGdnUWX34oKQtSfDj3GP09kDFUNlw5OwRswq9JLqhy5,1af614b15b86874f,c9b63cafb96b4b2f -EdQA9lAWvLptzg9HiXsDOVAalMofkHRF9owLLFTZf58kbouArwJUWDt9ETYq0gLGsYGdEVsPRqPNXto8HCtvWxWN783mVMK9mTe0EmQJP6KlosKZ56ABcr3Q8UI1RoArczxP8N8AmzvViHU5wLQcgvxJhHGuALQAu7cR3gFtSLtygBy2GYecTMiNYADsHt4AEWr518vFTK4KOivOC69ZHU89HytouG3FoAMjXN3x9P7XnsOZMejsJDdXdCtG9z2qi3yUH3,1b4ef366ac1dece3,3bf09585fc184362 -RNh5hi3OGZ5RJ6FbB61mDXkd6sMY9zrshpMe5vpIgCnxWh1V9Rc1jCR5GA5mYR3qNBXHaJqf04euucFmKK8qdmhbikpDRS1fzT2RIleBr0bRqAzAIzpBepd9SKS0gMxwSIzHfQuqpnivlpffsqTlJfVCAdMwVPfQBVzARj5i8F8N0WS8ndQARqcnxKivOqQVv3HgaBquQIlclcAC9b0maTZDDRa8pizNtOqfpnoaoSyBPY7jgXZg0BEnzXX9M69PVqIf9Hnm1XwCgMEJc0Y1aHkGnmd0x2uaUF8dwfu3jjG1eIJiPhhGuZnMb6irYldyPa2ieUIG036fUQt5ljl1eLPdGNalEiksOHnGvbFMxKh3gwOfzlixksv9wtPlZO2utwWNTWPIEiS9UbhERTPTlzVAr70XOFBne2bbHzBW1OUbfW5PQjRGRZJY0zVpqcymWrYBhp0Nlzpd66LnmvbJ2kDp49lIRKhUlWqRCE8EC12kTPrkTNH3KwfgBl56CjglNxrRRlKlTHSwYKS6aWkOGxKxHaCqaJpZiHuV4V0KWK9gdwM5AXHL85R2qNOY79hGgcgc06ITR8bGge351yTgKdVmKs8dZPXFtuAyLQ0J1vW8BT7rGCZL7ibsMwRUNsuqAZlipYjgQjGs7jFxu0TV2e0RmntAuaOhDvDrv38btcIs0BNXXeRcLT8QtNki1dykDYjiaUgKGX3rWBEBE1USh42vQy1LJeRuaNWIsLYum06jQP9i0WYoOu30Lr6bNxT2bDVwDAMN5NYMMhlSe9mruU7qQ2K5fmXD6u7RJ3xi1DVUtlj6X6qMGb0U4xJV9gRWMqOyQV4zqvITq5hmgm3BlOeWWIuBo,3575f935769ffe93,bb215835a0da49f9 -eQSHDsigGhAqqjrg75L1gtZXYA5kga7sar9NgNIJegUXIP7hkXiOADOahzrx1M9g25nsQfwsQtevpDeCuLVGlh6B1e3vUmTRQIpIFNkBmqNd5OyWkzVjcKSDUlU2E5xRQyJiqevXr8Cte3zbekyEOgzihGaZtf2XX3gfsERgRHLIFnwqBmym9g1wO9UIoKtUwbTutHDphzGDGzDmpCHEjsDfyAMGLZHKAkq0zeAC0pcuBM1dmuJTtFz49lJQknRwP4b9L4RiOAubhk3SDbgZcDuwi0CCiLWZmujxJ2GsAFwz4MeH7ikcyGYv7zVGOvjUoRRTlaqKRH4YAc0wggfdXuKCqLg339I9yMJnKReHvVp2VN5EAWlK4WVYMcb0lv3ihMDU0dUOLyBx98VPqO3Iq7I4exwSSjVaX0jekDMGZqGCdZUUqD32PcD9QnCfaWknVpGfg4E94TT0JDZcJb4mdvrMLVkhuSEScPL8ilR8ceQzJ0HAj9CZU5FifpupVFiQ9xsXov4Uky3I5NEEjk8lyIjdPiuRFmHbSWHsv0lODaEuL,866b88a59cd9791f,293349d2a6380495 -0M9dX1kBhmE25v29eTb8ft0Ja2t0,c3bb0a39cbf5dda2,78eae1e96a02b553 -71iLzVdjJ0QLrKCW4ArQHPxvQq9OvF79tmNuqQmmPkWwEVBcaWI0VjXz2G2okPuWYAUahpwADpKwixQFllRPa0jNFLy1e3xSTKt1UQR2SUAPgSnRcBAEketvLVIVunJwnPaQ60mxtJ1vUt00Xma3vAkd3izUKySReWW8s8gkBhdNC8S24kv0314Blx0izbnFJs8y549tMlsUGEZdLweLBHWWAPuNWNHLwRVrcm3CGeRxhLEhy7qH1zGgfG9FY5JlpQ930iHZjnV3hYfff3oz69MqQWMUvdBWGKlzDYlBEFYaBzBuRN5pOymKji7ECDhe6OeJo5J9UHRPshl3cWHlgNDAcuc1VT14Qfo3tHTBKa9bX4EpPnML7wcufhykIAxsPxpfFPgFBqg9o5StdL7b3UHxLMpBpXsfzWMSt91qdqXQExjJ8b2TtXsNTARIIzHUkiaMoqge9Ad7Am48ZMyRyeSJXgQXBsHQ3bl3l0h7ZVanbkTKC6d9RwMXndnaF2x9gTNGowSzuidoCC40GYHFVqsOjc89lKuEDeoU8qDSMnw9cWVS2wDFllqeMqDE7gHj19mALZ927SNA1mW5gKKiKfnEFOFZWYtUGvDsn4cInb4WCZTVYPQjvbbXr8b95FjPlQF5fqEfGEzdtQR59MSA1KuotAyrX6RzGWAsX5x9sGwv2wZ0Jiz6sZNxsnQ8g6adLFhGfQXsYuKzjWbIOjRCJUCMxZQICK9sHpeaDcqf2o8b4TCdx8VT8NcHLgaqqCHp2i4PcuaoR3G8j2RistjrzxMZ4rAEj421PTL5h3HjP7837lhNabCqCMVv1IPLhUkWlc,a4445973c135c792,266087b1364c6004 -IgOygMqw8Yhu0dXAz0sGMQZTfaeGfcSleRtSOy8t2gPYkOUBIgEANo84rpcdhZAIFx25dHnxih36ZrO3tRaLA9JGRsTlYWTEf6PxQcQcfnWeN7qTSzIViSk1eScHF2oGPtp5qLUeZbpOJ2ytD3zVPCn9pcMTW2krqycowpSbffSk3skEYsB8lJFcdrnuir37tywO0ai5sb5DsfdtujIKq8Rb2rkxaI4Ls38LpMmGvNbSyEWZt1gdqmGNfn2SH5pKLqrvR99e3w2DBtEOw8NIjtfTAn7euT9KozpfePNP2C4CMEtWMrI6e8hJrqvHOtMsDcAhHvfbY0UNZO0x0KJb47XZrxJS4D0F3hQu86hCOu9a4BOtwYumhqg7SkIBKG3gy,dd0878ca5971e2ad,feb68ac29048fb2e -AHwdgV6R4IFmB45t7d2yyJIeZGLegLDzoc4JrNhjN6FnHf4efrd8BwLyLmx8Yo7RakrF5xJavOULszNnbVS1Ks05MazinwMl4DXrdaHg6twsFcjIuuvmMHBxq0Z0mm6X0p6a7JzUiKRmnq9BJ4dYS03ifKwsFlv6FBiGyhj2z8S8YcsTbHQw9vYeDixhyFclsvkRew1CzxXuLbVAbSAnWNnWULlbjpULDlOEpmOZaOP6qObIS4YLjBw9molNWOdrEly4DQwekldeN7WNaQf5QVHETDCj9wPXfSmLRa0eeBzuFECLjrlnIS47DF1Mu77dYqUbgirFIhqFrYV3m8vWMn635GbOnGxcpdR,1418f8b03d04f9e9,87a0d6fb9dd4d7e -qQNeJ1HaZSQmRARlLvDeCBHVesJ17fzXhD5GhRc4IgEJWt1Bp6tAQp1BjEGthNVfiMRPmqTfjVhV02nZCE0FVi22hQUahmtMGeVeBOZA2eb7MrTmIH1raf6wwidwSMuHbVDnoOHrew5xMinclBhgsytFBKG2qJocsKtGEkm65xnCVCeMFV7nHtKA4RewDNmMfYofclDlTumHEd2SnTFBh50dJ26nODekgAQzaKGJVyy2jz6ynfyjhdFcWuCugteU1eqhPgeVGh9MPqGMSkAflORVzFnWNR9mbKLB5Kz6T6mPKT4XtG3xhwXOrfYjq5aObRWNql0ipDawWMWiJtdzJ2M4WMwksbW0fK2LLVKeaTO,46644d3d5b327c8a,54684c21af0e9316 -61nepIBVKZGqDy7ophLBWAlDmdIW5nM0vqR1tEzxdYHhXJUo9lOAbC6HkQpyaS7Ddo9blAG5OInbuwkmm2RvB4Ok4fw4WgYQTWltfzQBnzBpsW82jfVwSLhXzJaIX0gTyBfFqmulKdtqdqUSD6Y4gTiVWPI7JLw3ExqzAg9rglSLFPktIqv9qbbIK9IVg9qaJTWpwnssUg8TrkkuuZCuqXm8MA9KCQnihz6ctURFa6iCElH0IKVNiQo2cZLIhl3ZptZnpsdIgzoV8pDff83XMp6cAlQC8mvVS2rQbq5B6VxLTmN4yBUO2XOGEF9TH7DlxEDbZvX3aezd4RJhV57ZK6gsFg3WFONQGljiF5iiN65tR32aajfRpb67fYRFKo7I5RFSkXvVnDwOSH3xyeOzBvQEnXudXHQ1EaeY6BKfapsHFqkjmIyCMlSCUCrdvQKyWMtUp3q4VSoR4XYdTjRtaFt2HVwECie874EUutoabbO9u1bKjsMB49NvkCdYpDIldZCsfTKiLFptXsP6if,6eae5723fe4b2853,1a8675893821076b -z1vrMaJhoxH8btxeSCVczik0oPKecf5Odkji5wIsvpM2Wd4zazCXx59p88VXZWLRkxHw3qova5WJGjQBg0OjXmCqIbhFkcBerKDddNffmtlurhFDI2h14z7YTQzz2JQdw7kWkpa9H00WEU7egMhYTVt0A56qdNBfowJcaGgpJHwYKSbFPf5KoTPspXqZPvJnR2SJJVIrUR5xKMQsAq9UyOtKgnxBny2Mat3JiJGklRQ9mk9CYw73cfQlHS1Oi9OpmgZ5vOGSrUOXE9550ntNjCQpU0fCoil2lioOGbL2ZYzm5u4i3aunXLTURWVvlITHLtUf79ZuZxWcoxhARDHuuF8DQELzanc4vzOjHKScNvuZqL5fPEO4d9py1xg,c9d5dae23798cc5,8e5af0fed0884176 -AuypzRlBfhxwwxX2yiRA0HuSSe1UhX57rqXWTyBQoGRwZlzLipBnYlOputXs8vyy1KFhGj5rrXXWxG6qnVP9HtxbM3ueJAaataWlRH54sMer1V2NbVQNH4UkIVdsQDPJ7nCPmgNRU1CpfwGZ3zp5cd6OVRUqy2NaxEHQr2Czuu6iJpx3P4J5ax57uKr3pxweBzxsQfDLxBG7lMnxiQiXPLeZYYeKItYY0jzg5y34TdDO9aINVb8BkBgGeSjSDyHP20NPm8TUl9kfWuFNqpSUAqwBDcf5j4sNUMvKJLwAOGOR3fTlFrJxQsXzdmdR2DxdgQD2Ansy4sdeEVXFby3LMCEdCMMcRRiB4SCwwUYxUaeviOCAICtlFMs4WRCmDG8fKdPSHpdB8PkIpLYaofiUd5zA15cjAYI6Cf2ptYiRt5BV6ZQ2tBvJ9sG9QngM4AU6TTdpAK1WN02wAloVgasq9grxtbE1CwBAnb8ao0pVo1LUgAyS16e5T2nEMg1x1XYRSaMAzKwMCgv8veIpCdylVzzcchSQtwYxECHMePV4tWS70qnfWUXJhyaGpML0Lv9OXadfWyFpeJN6nqapvNHh7gakzq5KyjReuKrfJG2Iz0ZGaaXVEKGFB2bENhZynbHiGzi1izKHOBzSB75Dwpb83lRZFdUPYbBZY48NCRPN2wAS9Jf9CjVuVP1k21HzXv5sJtAy6hkTvjEYO32nh6RO30iCDTQU8gzoFAao9Vzqy7e7al06JJ9cTJa6k6yv1zdHvg,79996cb977e3bd34,38a320e38e06b852 -iw6ZeczKfSybgYV2lczWF22vixOn0fDLLh3cHGrKDiAdwNGYuK8k8gB1agQmTUO6mJ11XJ7s5TctDUPbXpYJERDnX6WKfcpCgu5dLaSep5jIOF3YYtSNX79Ktgep8fUbsrP7Cz9hbb9OZ3mO9fJoZMWNBhMZAd99VRSvh4VgoTk4ryKGNhO3cGLY2dOwafWpsDPzhG3RGvtmOU9YR8qo6MJyhMChgs43QnQLyA4jnngVF7Jb2mKpnbJC3cZAAHmG6IFm54hPRCtzuF2NRx11p9TfLPKYvy2KtVXuM9xOw2POHQmne8iqVZ0VUfzsESjdwezQSl8zBKaKiWT3GYL1vcnfDDY787L7tjsUB1T9tNBqsJfXGADRn2Vj346AttMEryY2yn4KZ1iV989OP4xbs3hgQZgfjgk1JRIYuZyqVePeRmkgnQ6XQPL6rcLxgGkV,dda03102ff79f630,7a0f52af04618d61 -ijZDW4mZG8S75vEsm7CHWSkNVCsTxlaTsZrQIoku6daAeiqGWRWQhYEYVKuLJtMTXUhA9QTmhr29SQXaInFuvC7j4bQ1VirybC2GaIjKmbmnwmM1ERHt10LCW91pjxanWZXtVVzkDF69Bztz6RDR219jpZBPNwZFeJH38Bcu4sHL1tqaVnVLj3bCjfeavb70nvLaF7oqEBBzYalLjsqSXRk4mMezW1M94gwTbwmpiAvlrHPQdNcPrbxZZZCYhpujZgKr53qly6wXmdmnAiU9XASBj2m8h9nUmX322R9VH8I0m9pzG,161de2983ed1c0b1,60d033153a6101e8 -jqGt8Hcw6l7akFQTi874EszNKb7EgAvV2alA9fMivv5hd9xY3PQsNKLAWFE78Cb9sNgSaRHJqYKEKTafnvPhtxvNkgWMMXluQLd2kjvtkYZEM91Mz4pepJMfGRoSFWpbrJUMTtJ3uld093rk2NFEQ7Oe6FfnQdJymX0pflcHA79rCSfUHI2GBnqaS8r1f,97b6af11822650ab,bc71333b5613d55a -tvFBqWc756ifzMExfCetH4vEbAkB91gb3AlTtZUipw36ZJJXRcpK4P14UscLIRcvYbvVL1urtEzY38tNeA8mZc0sp7jZ69HxgTDJDN2HqEcprQwF1WdMw9UOCMey4oQsJXhGnBMSIXMDvgXVtpiXPhvpTkaR0keOjA71DpICRKqsIyX3HbesepeXd2fdpQP1PVhNvK6U3nnIMi96fg718FfkhAA3sAZvNvryhfZHGSNOpxjpMkYaU34H2I49W0JWPwGYKhzxqTa5BNXv9MSK9leZnLxz5TujFYhOlEHvgp1HCKmP1awSAOpXkM6Hha7MFKD1nU4UZunFOTcO55UZXVsB4uJg3tuXYTxmxd6qg5qiPMguAdSUi3WvLYG7q5TO89jw6vXPgFq7dbFsY2GA8hMiVYzlDWLJFBOh7sKReKEGaJt4ZwvsSVBPPcqXf5R6AiWKCdzrMvZNhtMj8QMdKuh3ViWJ1sbAFZRAoKs51fC5DZBZianB4j3pgXl0oLtk41NZdo3PxeScGBzCkgtG9AQkp271xmb0G4ww5ONQbwxQB4mHNLzcrG98K7FfixxTvx2DHRbKcA45YaLEabFLsOCMNbyr2AIYua7I1W95K0Vb3JvN9zRztoMQrckfnT2LuYRcAA9fnPvBj4mEO0GA3vCbmq0OPWWjxlnB9C3KSXpsxVVgqOUlk43h4g,570c13db4cc29efc,de15e8cd06ca7d84 -tFYER2HEper2WoYe9Lc2SEkXE0MtKleWJ2ksb0TZS3tjd6Klt1R8Ie6KlOPOLq1ZKBtZh1IQ9reipwlImwXVoOhwJlscBwPc2PMNvRieHXVkzLpjqAWxLTJlcvxuQx6vgiIKfYzoLOcTLdXULCCHkuESfUbuN7HtSLaEjgVyxNN2HGUWQLX30II1a7Qwrnc4KcNrQp7zpsMzcqzGxRFzXcdMgVZvpeNxVkBXaXihYOShmIegLPWeYmJsibkNrafCeLQGnGE0ZtYDPHe0nbEZkfehn4DUtHEEvrBvfTE5JMvfJorlEGRiTB00tJDcjZ7JU9W13k5DGP2BVdabsoDVnk5OPFTtqLgSCTGLAmzJO9CdogxC6KJefij409WXHcz8V2czdRxBxQ4f9WoZR4KaiNBPvkHSti1I0lj0O7hof6e3LhSJQvIlAxL9JNSJxddwzzd2SAjRNzwTdKggDvh4Etw5gMbsIuzRNS940DIoxe9wPFNTaYXlW3LZ42qhV8D3CgaScfPXWC3T7Ijgc5rkyJc7bvwpC6g2osHVNUkQR9TMwbB13EksCFeScedZxFehWm3Yx2TzYvBhelycM0a0Mxn9RKDor41N0eaWW412W0jeO9UqlBW7qnw8qOn8VdPgvYCtfziIQ2I62Js1hmdWC3JkpgcKPlhqUhMnQuaBSGS3ehxC6cfuJQemJRgkPicKIIygFnv0bWtNFzg4Jm0yODUIkCAU9O1nvTNWNabo4BOLuGQs7DY7rzAPium7t1NeSSvpev8JqvZpTKbMIaBfP2aVmGZzJsgLjzRJ,1d57a0c5cb269d32,e58d9dff9bd478 -GM4IFshnvhR5rZjN3wk3QiVmrNVG5PpW5x8NFEQO0qS7ItsyZFvxBizEYIe9bT0i8WZcUy3rJV0dWtLCglb07Q85JCH8nwTvjgS8lpPVFiQ43fJgRzG6St8cAQkTkBdYgFL0kvypOYweoDIhtdgLUA0P0DWAr4eFq6qZWQ5aZksB7RHLzUdQ3dFt0QRSzwqdsm0isB9DjZamWkkmhmZeJPvAetipjei8bAgJm8aljj7maYM9EEl1bZ13M4cYQzTtkFptd981GYPiXUQ66wiM6jtdVhv0P7OwePy20DV0ZZ0aYqMRz6vCHfdhqt4JvmnaB0FDq9XXnZv87G9E0LKwpsBI7lDdqMIGk5C2FXK3MSncvlegrOgPB17EHJCioCy425VUHDoloDWWdugDQMXXLaylY0LwPT5ztY1Vy3oKrO9BrwKvRXVchb9e0Ln6ZAqpb0l4OoK5LCfMkN8eigOl1PwmBjBTRuGFvmvIIxfgbpfSGqZ5qRjygroaKyb4DKm7hmKE7jwTwNXydv6DcS9xuNyb9SxlIGQosXpVnXf76sArBSTixF9y8DKtit31tDLxfBC3l6VXpScehXwynunLVaqexkNpP4uzRSAd9uY2p18hUCVGAhIykZAEYkHQjG6HivdQTW2PhlYkHc9qzJRzajSvKLxJfIsFH4jo8ALL2PoP7ZmrBSoykMTdj0BZCNMywZOa2zfLXlHJdF62ieHaeSzfOJGbgik3dJwFQvE7aw4Civnn9f3FTSYrGeXJCHT2CJRdG5XG9ELUWgpCFVcOTLr32bWdYXB7ABx6MzYTWMgmjzLsgJXzCdcHHkT7pz8BGHbeNei9sNQiNFO,6725b9e69ed07e63,a524b44a2f65618f -ebug0oIK3ktMwmwabmdk6d1pQCEjAFuCXerWT1PPiCwgAbXur8J8i1Mk6MG4ihxZBkwwuN0Jfh1WFqFOxKrFQyDBTf0XtBBvwXuIOvR4db9nlfMjZaaSBGJG4JGnvaCcgmqvHbWRCrbFglVWeXNlfvUOuZ3krWbMxBgOR2ex98F0MFM1EMqeUd0702ADD46E8bHDslnDt88H1nZRSUmkEZnc7iGVoLyEPoxcd1zNdn5pDw2mZBQrD7dF1wt9N7Gl9mqbjF5TsvhAxU7oSmm5VmreLXqkMhzpxFejp0Bk8kBTZFjEJ33KsWzhkkccPmfjfWyUaOgOySs0ztmRrZ5ITBsrmO9inIE5dec8EA5CLTaE4E4k7i0Lo1apA06UIwZyJcRhpre4KR53fG84EG6f0sCKWQR0vIXbNr7ih0AUR7HB4LiQ58p5yXJyXNiptodugqWXugrvlag9VBHSF68tzupbLhFbsrctOKrbMQFyWbTTj1LuSV4ekYpgISfwcoz0PbNPHc5f7bmPo1i5PYQiJ805prR2wPnOlG9VeMkpYNmmEb5dibZg3J6DShQ33i6qqtvSTFSrBM0vec8iGIS,f9f21d4c63af5ad0,61a1edb134035e41 -XOgXC9xx4C70pC8ymxvmGakgfwP8Ox7z1kPqhbPP5jNcvkAGNAMr3WvhM4WRc4SSBflp8KfS9wPPT4Y2oydO3DnztTYe5D2eyxK8tl5C9AsJ5GaVlejbpkE7gOCCcoUnbrWkNm1m7Ja6tqv5efEjsMVQuBh1Or6XJBXjnhxvls5MurnGLJ3tKYVoGPUZpiyVlRKXWa8594RJKUg5KAvGpvETsORiEFK7YAjvYO5y1QT0B6lar6VSQZGMEzTtLFgekwpCU0HdgqzwS4vZVUGEFT8ieAbD4hkKugCvxjnDD3EkibwY4NETomF1vLtLhdkCaQnqdoHgcXIks7JyQQsn3SzG0TYxjpNaEdvT9AQ5BcJMCEm6pF1mca98GqgVvPV0WYEUDSVeFqig1jobGdTen5gh2Yii2jbfztRWdkAmSXYqcz5EC4K5DGQPsGRqDuipJp8ZQHxIVZQe35MJfAx82M136GM9ibVtQrx7cQfVv2TKFtTX6ZdgzLLZpqcW8YPVGiLCEPfN1cqtsZ14rv0HZkSXhnt40V5TsMGeg06un4WlPduTeGnsgVcv,6049e0c7966bb50d,b84f1fc89c7870e -KW4kIIBiVSttVexk9OlTyWicLUaYN0GlBqfzN5CPtTpsD7LCCljsk45VVYljfPoupzE8VjPHVZQvDRrZmW4mrAPP5sdpdHmgmQORL7by9TeFHgBdf79bkWdUFDafhFJRkTHXlhn2RVoFzwdEDMsVF1TdSvZFMQIreoEgJDaeH5OqYO3YO1eNSuNIW1zX9C3TYNDfZ4zjDTVwcb8DrxPOQqrG7wTioEEF7Iw21U8pYWBVq5hil4QExIzWKMxEn3csxXkXOKAjzE3XaC9r2jhm6l4dFtlbATReRXkSG5XpAULNFo6Gg6MB571532auoA33fw9LsFz5bFgIQmZCC0Mz0Y9QHcLid36dJBvhvYVUIHJM1ge5H8FUtUkbsO90iqsvnmuSlfjbHMLB6etCpdBP4R8DKCWyAIL9w4tudyJsOlmfyEk6wjhJlctf60Sf8ZdfEZ46XglldmPCR7pnedZw42gcMWlAuyWpek5uyk49vYeQZkxLf1nmjjy8t8VvpvgILE0jiAzFM6RaMYxf442hwR84UYuMTF7B7nXZZkEEJux106SXw60JysonlFwninMoVzCDSGbSsJKBZBXABfLGqtwcGWhdax5clLDZSXDjRhumNOkRMvepJDR6SBvTpP1XLmK7kYPZMvdpkOaTDLc6tKpGm7TVXXzyU9VTKjyq7S8E2CKjwMo5CGxhTp9FdXdqUDh7h,a609c62b59fdf029,a9d3cf26b91058aa -FOBlAaqBlpXU9b4RoErsnBdN2FBKTOln2BNdNVh7Ihg3DeHGLqSISfENIeMMws2Emudw4YeU6g3fFXjKpPJmxcGi7ui9QZ1MIkHoUJL30GCMaSR4TlZ77VqSKctTxkYQwcYQkdRLKtwhw0DJyTfn2exOFpjIQYoiBHG4w1tbxAoRNr5xVtvc7sP4ngQgyHyFj6bQq7SF7xrmqgKatBxEfj8wCUJddpRN0xyriZEsVoDljpIcNj3GhmOSvj92LIjemYfZSiuWj2qOgiI2WLJgrItfju1etZz6XAG5domvuBIn4ok1X8iF3WiqeaU3NEcZEEauTchW8SqLbxXPi1WpGNQfPLoGGnTyMxuTLplGQWB8KYgK2f3naphhRki8YySHBCgvFMwHLqe7YbPBSzmQNIhPpITxrsB3lI5L4tDXmagsBLPGvG4X9Aan8ufEXwIWipveX2om6fany7S6OL64SYr52YGg2KPUTl7EWN7mG13iSX4eDiPSj,4ad58be6eaf8acfe,e07326c9407f2b54 -LHGtG2ElcH8UkvdBOjIJh2mrV7r9Wz9arO1pUY09FjCELAdImeILpgQiOhE0gscjE0C6fE8KkEPwQ2bSWkrZzZzTRGV8TLbDDOOpLFlncFhqg0d55eFPtb1rgEC2UkzSLXgFA2CekLkRPyGsKZvIoOfmCWfBwSU4SvyOY05LCd1RZ4iNuZhoX6wcosfEUhjEZoMcS8bpfcAKvQ067V986kPCX1Vgg124vUI1l0P2YoWp5nBHBCc9zjs3CvosgHJ0OnL6JbvJUFcjAQTzdCVwJ2mAmLnPCQTj1oZYzAkIvZJArdt0MJiRUYdoEeqRUQDq4AnQyRiaJacNPg3StEssFTAHSIuuJw5UA5imw2E85hNGv4IOHTBZMRzL9ZLcy5hHwrqNYCvYWVp2j2k1j0RQ2NvDIiBO5HZ3ssVdC02Lh8G2GIfxLl5f2JJTDFCuDJzoVKeLkrzORep1YuRnVFfWexGHRV7qXl96uRipZ6NjCa17DQm4lGsQfREBjEyZKkNbxQVEIoW0Q0sTX9UDNZMPEhPeXq0OcIh4eeY0FmzrAbPFzaOpOf3dDBBXbT8Hmdxzu0hyzRJ9Hh5TedplKvokcV9WfraUR9vb6YxuuwtWjYXMFGkXvpgiHwAAC0CFqO,564693cac71d3cbd,1bec785aa0bf39bc -Ps16bd0d4e5uckQyUX6Q4sFe376ZwGa74sH03aI6L48yqZdWA8dRy1Fg2JC7uY0tGkrFTL5FQmRDH0mOGMC8eGYpF355llZF26YcaQRMyaR9LYADaXHmKuRgVWgKlcDlfvTr5Q7w3QZgAR0oJbguTv9PiIvDqmFSePTmBufR0dgBS8v9MB9lKRnRrnZe49DG54erDXn6B2mTnyGx4J4bd3mJDeoDIZv2d6YqC8jN987lpZxfC3OBYqHhAsWr33fmqhvAGHuRQB6ZKqZQLtVaqll2XiygWyWe5I62BYOjpN8Hy8IoRGwEck1TVhKNx4JRd4nvY3mgzzTTYWOOK71noN5Fy2772Uw00wgUrkMwchoKn222yIme7jk3k79syzhBYlDMZ7RkDaxMYohfuLLPWwRUqoWgQFUWTu5EMwckxLJ9QOPLiDGUB7iLjIdMeXUb0orvrMDvWQj8G95Y1PUsrTJhnE4pocbhMnCKd0frWzSL9sPQGa6hkZy3glM9miLko4qaqQ,269d86f026eb177f,a6dd07b816af5ada -gExiSxsMHfTA9XiKH99d9C1lHy2r1Rdfc0MKNdZYWajGLrwVuQ2g,fd4b2030daf189ef,b3e650103ac24548 -3Wvts1ocMfeXJofbQApsosv12pefaBK64QKLzjPpsNIwUMsQVYtY3U5SH1l44baNUgiU9DBCjPOf5vGSJ9NnPaQgwhgeiojJqFOuzVa6mPvvrkmvafA1BH6cF6GF1rMqR6n8MAb0FYhMJYFo89C2LDlP9ggaJS6cHAevaEuS91hl1KJhgU2xmh2gVZ2Elw6WDUFstaJMPPbcFkI074B1CbKnHQDNo1XUMOldaMNxvJhBaOSI4Lc41or9iPzo5ywkrLjLwsBaGl9fFUtQi2haIanXm9aSHf25deArFkO9mt67z7LCNCqik9sJ4efVMqljZLmyg8SOzWKMYJNuSZtGIuMEyVWFw4qXzJBoVBHgIKMnyc6HimoT1aimg8LtMNnyk7McX3qz9sDSwYHWAPCFZCzOSUJ7ydQsDghXpQjTQTi7640pP2gvyqyf33UHPPgcvZsFXrT7OeZtRX5IamiRBAnDGAGZjU6TsTrA7jogWSa1OtBCEOOHF6JdBJgsTV2e8DiaGPXPapn82Cfhq02SI7qW53bbxE10EqyWsmqrTH7P1XzNOF3ZfIGKCuJiBLaoJaYXWHAOra94OZKrX7bDA59695MyXIXEAo9UMaEJpCzdfRh7sV9WIw12B37dw0I47mkuUQAC4v88hexSi1n7CamtOx213XYsWs3crrBqBD5Q3glVCiUeSx3ZTQYmSH0PJK5tAsLPeVQ,f7aafdafeed9fcfb,8a6a7a8cfa059033 -1gYWQR7N8WuDXkJpBJKezm8b8in3X2vo91CJvRu2i5msP8TkIl7iLSqaNuSaEpcYUkHQAJhl8EKWoIhWAx4k5OFTx7YQxOUGGtNjVgFYiAYsnrOtIrrXfdOYvGUmIZFxvwVzFJIgllLuicRyjTHcI8l8BseXVBV1GB8W2R5CnX6wjOd7XX87l1mpkBQUK1UmLmA4c6TvukgKu80uMxHgnHCqbuaRe59Ezk3tMRfN57la1VKZ7O9zN0VNUpeGDWle9hxkNmWIDhcj1EbzzbCk3zDBzhsZqmbYhxtb3XA1mM6ngbvhkSb5NRoADCOufjbDuszOP6dKwktTGOE4fzLqurrowiuW0AKDPaE0LHGCehO7Yj2UfQTzw4I6TXzfhYMNYkqxznjZUfVhgfA0QgNFmEXA4XYgxNPf7HDsmdMlRpspCluBOJvikYwycg,717d4c1e703e70d4,ffe545577c53157f -vG5lApCgvf0qHGSi0,9b4e57c5f1bc0e44,94238ef9d1584336 -Vypxii7q4p5EsrLPscMUpjXhun2URRDfA44zNlTb0C6MaADYh9BvnyWJtPmRcHIql5ki3Uh94KyXPbgfCyDKhxJWFIktEvkFRZxLERs2IlXqhgp8lSbtjgTFrOwaGCxpBvRMCXWYD8VIygttEfoTz4SkMjWhlGPvDZAv6wlqELZ6F5bd088WkcmDQxMcvvvFTjLS3eujqmF1hYyCbTpPpS8XYaT2THwfjZyk9GhK7k8ETLNu4uv7HE7RauoLoLmt8NtaNG3K2aTdtpehyCNER8DVsBASlixTD1NvR5zLIvUFNmVwrYuRwAfulUVLLqYSutWo6aDjS3g0By45TC30kFn1CNpfWrtZxJ0PlQuTisCsMeSV71Xr1zcDS7mBSVHweMtwlHGpDUctr1LbzbfuAupPU89j9vI87gjv6QjJuClx3WCYFRV08Ahb7oocl,5a19622eaa012c3b,5dbf31edb577e017 -hNEMfu5MlgSNp9X9CCcykj7nPLkhR4AJPayOEMFsEhjdwE9mao89KG39V73nQctTCasyJbP0L4aotusMecRSHQqSBcjyz0iFpPgQArDHS6M1NoRexo9x0urpKLFNRl4JtN5iN3nPDCcKE6Ljs0C88dGcPUIXwmaJDrOlETnJR8ougg8qrHBs9aRdrEVX13bTZAD7USJSd7tuXLSavYHes3BVM0BIHrZUu6YGHrVVBwOazmvWlqEfPLrOkfWokpPNmaCMzBnY3Mf4dkbFdFQCiNFGx2GLhBhQlr9Ug5xm6wFJaYAr1FtO3BNfnNIohW6oaPdoYcPFCYSMbj9IRUundfvyRKcj46UpZrQYTDdDF2MCFCjZxVy6FaJ1KLHbjr24wgoe9KiKUkmH1pxoD9w9N6uXIe3S4D5MmYvhAdSKWQJAlJCb1QWlIFb3Bwle6jmkpQXypaAdjfL4x6uf8S06Ve0Q23eeY4XKDkrZUz0OFgQA0NFTgNDJiSFJhj88ym1SfKbgttElCS16R77N28RQHiTFAlPT71oxQfYXGVhd14Le4rgie7ZzKfR0O7z0sxPnx88awW8i7gbHqYtAEyRqSsLN2QNwKfbYKI5vsMxNXkk5NqiX3REJIn4f1XXM6VpefO5c4UyXXXQzISPrJIiNXp4PlPKme2NrWK82BXI1aRqdEyRfQ0B5Dxp2YjNP5942xaJBYrATQZiXciOeOSGns0gW37dsxcq8iiwfywOjtuoKTKZjB,e47813e2306127e4,ca723fd31a9dcc28 -lhft4TNwTbvxBdg9gLOExByntLCdEcqtxIB15OV74wRXUnfPpWSAnKiJsFZJssKe3MTWo1QeJdw9SAjh6RvuXqdazZ8j9krfP2MFnwVDH1wLPnThbBNgjrHPDqJj7wPc4C3yggvNnDMCcR2tbqIluOnGe7OHPqz3gHbfLaYBstrIGSLJOdWhQNWnR7rqQan9hODGwqVUZKhJgfOokM0qYPV5Ic5w5oBqv9YFu4eCD7IrN91JOmzF7dTWvdPkbWS39vRJjH1aqt8eJalqELyVx6tyrMAfPo9JmI8eYAf2h0whb0gJhnv6htOxgs65vfpQqZlIyMNFKxYI2ZY33oLgn2nrwcRZafzFb5KUT86mSdFuXX0zhapiXl6rhAjJj6M4J9pW9qMcjl89rth9yf4FIp7dtLYTPomOA4jVoKSlk6ZOQcDT9Ja6PvMUNFe7W2uYT6Shmx5b6aziCXdS4sysBiuqe0zuk7kJ442UjRsgk4743SqoNJJhIjcOiKvHwfrUqMGMooUC8KGgpAh5Wr32fK1pfeLGV4B4vHY2yfCfAsM9IBXCr0jf9EfuTjIXDpRF2W4yuncgN3oSIcZUkWTDaAumBSVJAmcc8JEW8qcpsWjOs0mQLTqnxBepKEF1iH5OaJWDm87VUbMBB4kGDRvCPG9ZvXJ4jI2R3xdJf8mQXsPmE6bYK1r1BLQ0u8AVKaUKUVydfVbnnXsyF7li,5cbabd7f26dd3a7c,658fe5c26c4ee008 -6TBJuKLJCiOQO7cQq2vnfvKvVpOqOyOcJIZ6aKQXmDF8n637d1x0mkcOdxBc3dp82MFFhn19HnOv0hH55ES8Hort4J73jo6Hgkz8iwhnerNhbJrKwAhg5YLGu1kNRpdwFBNOMNoBPLZDzLrqs1YCVCQ9Lruks6vEeazVU8OHoA4Ww3U2j2FRFz5NdXkf4uFhK6zZAo7Fkb0zs548z34AKJjqM1oJCNoyBMfq3WLS1BEzuqJ2U2UTqDmvgU0MhW0nkLVPC3iUFTV7o4WUp7lmxDITWNJul5hfzKdahZ2ctbXXOAKEsOWUlb7RbztOTf0rXWEfIgMJAaBv7z7zYtKhnXL70n9y4Gc1GZnEhKanZskgopFAR7Y0kufmhTMubAPIId6FzxlLbJVVzVlcoFKRswN0WMcCF3pYVdEKtFnIaUQ4QCbT42vbYRGkU76n0v2cZee0kxaTB76YVICbh5AfENMbhKnyjXg9add4vfseA0oBkgkvYTr5QF6Mr4KA7UH8ItSA4HvQZsHqgN0uiUMLdYUHGkoQTz2fdrwN5g6XS7dnAywPeqHpJgSnClrdrlnIKuLqwtrfDABR88p7pvXQCJv2bhus4LCW7yFY3gMFrhRWdrBTXhrKj8Vp7ydSM7q6ognuaq8qDy0Zjdmm9baHkyyt3JzG7fS4nbpsDeSCDUXF5lOg2oYMrNtmT7dOY7MNWHHlRFT7VzSYgJrS51VrVj0qe8UeFOvxIJuhQL0SoEq770PcU5RaVw4rV4nI5Rl8kzkZkuSmcpUsISLtSpRm81nbYYqlRYKuPVQYrTUIMjSk3Oxbymz2LmgYnycpyiDIwUBtTQfnzWSDUZG8CAvLu04ZBe6ct8xQmCDAhDTBspyW8auXfS9kqHatuO5u2PkCQlCvN8bFFjEXN22Co4yF5VxOOLqlk5JMJTU22tjOrB9dyFo6fW6DxlEljXBwSMWeQJgSwTpLn4yNdJS26RuNH,421791165c4e93b6,e4131993288d3e16 -9JmewSxlCelKycRju6xYpC0gGmNNsoNvAGv36llnx73MLrfZYUhMAcOkaFTYHIRpJoRoN28fe9qG7Fk4lmr02Sk97Mt7xcKVKjk41BWqssf3rtEoAxqaAvIyRJ8uJyHcNtpCSAI6wbzXJSBVv0sS5jEyVzraIOBAa3wkJyCiXGQRTw0NnTjF4LEX2A8DV1ditkB69EXcGyxntzgNtEKKqTB7U6QKpWr1ilchKYXzNaKkaGj48eDkFbJ1RVE3QCkfBUkRsdCEQGZAP8Tq0rSuwIGGTFZJihvaZVQ0ER4Kp00gHH2wWbq9701ZbWHjw4PoA9ZMnLv600wVyiHq8qKIYyWW3Wfbl7wvVawFuFCoQMUFsVAWVHl63y46KRh7PoHzqJ8WV0mn6mYhRBDoO8SNcHp2waT48jxxe4KcgHzFx1M0bAwhrOWGYUw42GRGVCR892LSlrjTlYfS7JqCaKx3nhbH0iowqiTZ5sC3QrQWAskRLZvKwnxffnL7fc4T9d8kxqqEPiLjAIlRudgkMbJmVtZ2AhllpNVgIJVYYv0zMAlZjvIsF9HIitngkuiiYD39K9O6GAXNvf5UuQkPTvGDVkEx,8bc726c6f2068ba2,63e78017f80eb45f -ghYvSaUfdRFUnvnFUplHnqMEs4hssS3yAIC5FJ9X9fjNV8RLTUPy2ZbabPC0HL6p4gjjHVEcmcSCf5acjyT9y3vAvN6whKW7Wiu2x8e48OHcBe8Gsu59LQqxf7bkv62dskNgGY6cgZOcLlwv9Xb8dGYWocXnfIndYRCkMyhmc5X8MFYRh,57c5b4df68883f74,be503a9e3c147ff -0nhp8siZ5k9kUQcKkZusDoWLymYA3Drr00iRJPih9VJlnb5wZ2zSXZsHi5wBLindp2fwjImDn5kiBO3sQHZ5qyQK4zCybrgvVrxdBohMcZu4libmh4VK0fLUKNGvLmZKOS5m8X59iqqK5VwiMQzxvR6LpcQ9eZDo6vfQsRbytVY7b4ZBecE0kF0yikuz9R8H2o9mqtMl9maJszeN6PFUFWVyOz55hE,38e8bb6317b185fc,8edc776503938f7 -6MKbkFjJPaIol8zf5lfIGCNvcobYMu4xxn2HMz3Bp5yFJJNKJmGeLL3BZHrACnLYBlc8I8kVI1nruNbzs2bM6leNfU1SoTGaWkdYiXIDm1AfFyjdg8WIzVpzKGkxy5U2h,48b75b87e7150250,a092fc1ba2e52f4 -UznD03yK1BbEW3yt9AgB4B5EBLOlRwsxkjCe0EwsvfvkY1p5FgIPnyuulHaPxNrKPM7iilTmDfJ26JptlNhKHqLmTes1C2g4HZOqJkZvcXzxQF3kx3WPfSMqbQt4zon9ueRbIxaqdvIsreMSjDAT4U7TblY0oSY6StzRGWJK9OepIvBjkfr3ZuMnxPRHulcLML0dXw1hSoVSqIX1hF0B8xTUn9tIbngjnjsiaAxudKxOKaYbQ3OQKlRZHDxxLZa9Zc7lEGE7v6BnpTCD1BdeSxTPQQ3p7jbsLZqof8sJiqokZsFsesENkl2jx775yn3j1pPeDdSlbdUH8ht4ktwGfnPHXDgxlkCTGrZMqDdDqA0U1P9WyfiQRtnLimZQsKkG9mmtSp2l2eAfiDmxLMc1uBOEUT6FNuSAt2ZofonGa0bvW8U8w6vnklzGZJYsnDChiSO8jxQUl0haYL93DjNown5OE1gkm5mRWuqU1XYhotfy8iKwstvtZNvwehQVZ7hfD5gUAdf,ed8798a65171774e,d606ad3eff0b2205 -xiAIURhWYABYo2hDV9fzL3CZjxmwjZvZxp3FW0GuztOab0RsxwM4hd3EbAdpbRFSFiMnweHGxk7Er79ZspIFVsRGOMdPNqhPnX2ZV8h1km0vYkg8fyGDod2QYdzMaAb4q8RJck8zoHr666WZr6jk1jIGOBEF6HBNrcM5i3Xm3HegugL7tIPXNuL5tyhaLMK5eDSJJRa0eleH4O9jCPdx49KTaEaZQr00osVo3z3TYgucsunWgrPMdoU0BYJtoXBI1XCLFvTMOX6b1NMOU58B3RLrMO1yqjKODKbMxXk99fuPTTtm27G5kiwl624odpEWLIxnf2uRZVU7spN05yR3gsnO2nqvjX3AEziMKL4VxrfFeI5YuyxAB3ItG2I6mF3RpWIlSVwjOQMlW20Pv3AmtbLLmvwmv1VtbEzqhryMZPw2fY5luVWzgMkR8YIDibw4jFc7g7t2x4rlCWwMQ0vNR57ZmySjFVTRw8yUXe0Lo9pE3rn6sdFEDxoa52zwGGndE0iMwdpgqkmPrLfCQMxvIepR4uWSm9KXoB9G4LyH8LIGYKfOm3A2zyLotZ6jzLsiUm0INsBWwzSP8T2Zsed12r3hQq0AmFidhQbzfqnFv3JaFrxHhMsVTPnQHvSUuHeEOSWQwjQpNN3RLwCVCBxeH9aiDwbHvDcMkws8Mys7Yfq1XWILmjhmE7vkSrL5BuDJo68I64crXuFj8IWxo9CyYl1e4OfwmmuChFOVbTrxEvRjwhRw2iMWFsDr6ideK3Kzxd1XTPbqeKH,9232a1e823f263c2,8090a8fb4087007b -htbZeJE0RsvaySRlGbYlk3EJNUNXVsDCvFvOmDcyHIiG7Lgfp49fcqdMoHBDA2eOQRncWG4FnMrw72jKerCaM6fCqnkEbmP3FOGuweBDvO1m7JC48ay02VkBNimmWEwP48qdkf18jyFJjhzoQ3THRqXSfX2LyNcBQjnOgdj0cWwHmDGEravLHqDj9CeP565iiRNwd7ZlhwVI2rk7iJi8aMsIRdJmN21o45x2ijRMlUvXcg4jYvc80aTlx7xsX8kyrCqSGXsA3qkyEcMLSPjy9oB76iXXViF0A0tmEzbtUZiJjtvA4foUk8AHVYj0oeFLhXcZ2KsUyEK0KcLnlbcZeb5DUxNJqCj9hKPx27CHzFLNjMVlVptVwcMR53tPfhzwh8shV82KBPnGQtqruh1zjYFrkuGF3Ps1c6rK1WoRj90JB5CdfMynknbFHkFtxNP9iz3e8vRg9jAAafONCR4hDiUExh7tJXxr3BS7Ub3LwFGS9ujrNg7xxfDVhA9AanSFIjFmirsuT2M4F9HSV2KGkD2zY8SsbCjhHmuXvciqjOvN2WX72qm0EYS0fmhAyNUzfSR8XDiAdRDJngZAKFx15HIzdQcoShyuohAOMFlkUx08vox1ps6hUep0TXfGjZzC51MiQkJi1lmMoFqQbEcNJkGLdLmfH6P7vkd9JY3Sn2F83MUQU813k4I4V2lM2pUaQk5wAkPw95LQOepbweJL2AdH31cinfa3oOv6Y3DQK5YyqvOuL8fJvpHbFnNSC6mGkwBzaAbdWclnnAO2W35tq6u8kFFVAMMoFaprveb5tbd69yX9838PtrSZH4zTtTMvlFJJIwmZ5vUWQ3VroThJSA7bI7p2j6agrJiTOTkqwhmOvF5E689Q8vrdq9gmaEVVLGmv,60b04420787229f6,e730a37744c2 -4g5zDRDzqIdXmvngFav5WkoB2At3RoWkP9nOGXgAafMV4V5y4pdSy5bUbBgzAZn1ARVatA8BXW9FcdS41uZcUxkwvmFEBO9rw02C0jqXEpPFn1YplcusBvWUwDnyqTRV3AS8lYMNg6WTlkZ02xMY9fW7t35SrM7CnQik1blDb3bMhJicMDv6wvGUp4YlY8HBhL0MyxM8ssXG9u2cDRESuqIWJ8FWvMMzjnJwRf0LPSu8NCBotOWwYqYzOsxkMKLcDEFswE2NlOIV51XOv6ksg9HzdY9lPlfYMutfU1HckTgZONUiZ9XWFYWJ5ulZ6ifLWjP6b1qH9mlnTKgtdD9H1Xfg2Q9cpiVIjrxdUWgdO1gueEeoJwfqZO3cyTJ2bGELQdnP61QDFHFuC9vwK6xGEw6bEEjqxpgUz3UW6gTOvmW3gl1AvVn277ufE4amCdwLh9fJ,b9b8d3a437731482,a2b182ce867290ab -TOSZ3JOOT6dIEATuRPaVBFuMftusSTVyKTekqiCLqvYI11FVNMZiS9opgqX8BEcFNXUjXliPOeewhWajjdUaRr3OHdYDyCzLpQ0QqoglfnaVMY69zUlM0BOLTmCIVfBlSfx4zTqYv3JqW2GaoPu0VRsmiioeG223qIw6WRiT0V8eEddEabwPq9pSzBbnVXQUBUUQMjW4757mbAWjTKyzjsiaPtOkR0riXFvFidOFz2xvIb4qg3COdQH53RiZg,54ee75b03a598e59,4f0a741b8e409da0 -pmK3xC72eva5WTuofcqHaE0rPkWGcnFDcif1Oz5FpidBVU5Ru67Vax9iKNF6kAyBe1YSOcbckw61kDr9RnS8WA7v2Hia4ibhULqrV2FT7pO7Cy3nrdMULjn9vqgQqe8pmR9uGNVPLg219YZcfTULCKE1E3JgYNlcf81v0I4zGkpGrvVwucxDruLEDz9tpjiq7HGOU5LmEWMO8LURZyfv9lElOIDqQtFO1eKRtKU239KV2rtntt7OEjCtHyfgw9Md0E4ta1ByNQ73bII3GS7ryx6P9aoWEoyF0CbFGYilFB0p05DhYoTHDQBcKindjMRU6Wibb2dBWMjxZeErLpVW5ewM6SoWiBOIRAvyn4cdwKUa4bFZDnV3xqGvZ9wSsqjImOUmI3HH5wfIFxiW0qqhJHppXTnTgXVCZIBAnIwkj0BpcEsYWzH9UzKzO6DfQIuHt4nKBX7eVV1BysgRYyq600YhI1s4nKkgU5Z7LAgmcsE9LcLPoUc8YmbqXrpiLTuN8QIxsfNtdVIvg7qLQHcsVT2mka9kzwLI1vmIsUFpPhDgObgSGr8qojeL87GxtXu0DCAMcOLI5zbzlTdlKuHGB67PpC7B6nE5FvJiZ5JQExxT9WgGWmhmHb2OtHV7CtewrBM3LxgruTAv0Ht1e8hd4mbRPglDrqWwN5gzszcQhShbyppjLRSEPNUvMtIG7vGHXay4dLngPYwyfCVN3TJLcsxiAFWcUbBPkEvppnSOPf5URwlGAhFEp7SuB,6a5b1fbcbc0eba1a,16ec8ef2b509e972 -V1wOcEHzav0t9Am5p9D8Dzg6uPOFxgmRbU5vPg3N3czXFa1TeQvQq5olMwlp6d8IfLowp2fYzGPnzOR56vOR8FuBaIadPBSOj2MM9gVcqwHE7GpeSMEy6tboj09WRBLDYurTEL8dHJLlDbDlD8i1iIETLs7XuydGnSLtVbSUZ8GUeVHl3udQRuGfXYP7svzkiS6V4YZLlQdJwiEEiYvnJ9zQ4h4eQ7aCEDrjk0ETjSe43dPZI5tqtzeL6arwcFMlpy8f99sjAyc2RQCKfQngg2OTQH5oetWo9XgZq6ReiugG3dQHEMou9yH9bkCTdFuKVNFi6iYLfbvlkKKp5fxewkqtUXJ,5c82f15368d913c1,67a717071ba76b52 -P5kuvXfaJVhWsrSBkv1CVeaK6KRDcRxLMoUWO5GFh9q3lTR6ZSCsz5TTbUjabnzF4F3wj7cl2WwGNHB8uHwvAelPbTPDfGUs4Cw1NxgpdPpjQnOoywX8ryEIKFr7qIVPnnGRj2ndL7ILBVN3oxgYf6s0qCz32304SsoLRXji871g7rjDQs6xzohccaKhUvn55hAYCdMAoojcEb83HuXUoXPzyrtmkzgr1pxouMUmPkYCjDFx4tsBz0qFTmhbPurafKeBxr5IojCumxkMbyxrAIiHxvCQlW9XPxniA5sPfo2lqTOmemoNfLW4AYLFca77kUTUlTW3ByW4TYS2MwcTkkkgvrNG2TDaSAZ0w6bRlWXgYXdb2jcxPHoyp4jz4SxOgk4kKexaIEXGjMQwRGzJxHRdTNmiYQaRHP1XGwVg2rn0aOD1wqKG96sagQ5e7LphogrkwevZnUJUITNOwClNaekcdi4BYAcxQ7L6ncQXHM6ogRDuFxyl3Pr7EkkLuRRMe5kljfeBkmrvVSs6btdO999TI4dLePWMCA0pr6IwsnrjSikQ7Lef5QpmH6XzfvEO1ZM0LJ2EZgtGAFxfDs8Or31NBnJdraNHpeKqyUENBEvW3cUYwJ8719SM6LeTgqlfArNKKgTml3X8i7pzxR1sYkzKDDwFF1zqCJUQ8QfccFWEIBA7kGwtytG1NXBBnQStVQ8L3m1qObzO101VDV80kyDm0amDkUtJDbkxq1F47PRxWG2PRHAIQ4uZocMZQztJnDRXvyYrdUs44WHaalIYbKwyqqQEBWbssqJB9ATI6zB7X0fYY697FT07iqbieTsBmwjS2psoyFbhap6XyM2a6P0Eq3n,8ef2fe08c2725196,e4342d0d191843ec -lEHd7vPiC6Jp8FJEjPDalDBksjueIYK8KBpxCTgt7H9nGer2qecr6p5i22zslRgeeoOeelIwzYPrpTW6vCXvol7QnhleSx3ZZ0i8YTZbcW8I1MbPYYXmXRoNFpntLAVWRRxBgNWTWFoYun1tuT24xluJocdQVpxRwmTJNh87yIcERA4O74bxoBoLZio1PqKnWHsQhoYwjpIifQDVCnSMZRx9wHavKrBJFZju0J7cL8bLNpYrLrW9mEmsuyTvA8pJjjUN1hyhm3ORvTbBtqRB6sburM,77a0919e0fbd6844,5a9cc1d17d7b49bb -JKm9WTyKY2cytOW6H,205d63567d9cbf6b,757df62f1126b407 -zuKXoIdabYVLDY9L3lwajdj9LyIcXRuoasDQfI2d3vqLo5tmwXAWjWxRD5u7NsXeruqn4u6An4A08ZjsQS7Z5dZSd2XvQW5lhukXhBMCHbBGA4agrC2FwqznKVjIPa2uAGV4uPjj3ALWzk6ewT5L0K3JbOwvY1uWL9TXvSi5e9CpBHYHBvBAG30B1qk87a655x2oY8ENoSk0AT5GelBcnqJ5mmxWnfTktaF6cndpnGCAwARKcZtuMzBTl2TNsrLl3fUzm43F0nwz5X11vHTaRIWiqWQEOBz5XMhdAf433tqaaWrwDPnkDwnproJtouBYyb9vcRQMPAY85mJ8KmSUBaWHMqdk3uyl4VuMyifzcEYV3yzvx3HiHPiGX2ugOWjsR08WaiTosTChQ8Z2D2dauF9VbBIAClqC0LO3zFpHZjZyzmOj1etaIZ60mx3JYvOpgKPhRpTHFPZp95d8ve9q9B6LbhomOo88YZO8vdNlAeRVjM7PCsMCCP8A8CFwKr9MpZS6eyjXpKeaR4k1rwxlJYYle5BwJm4g2BMS32jjOZSnxQVmJmmPjpmY8mQEtsZQ1B9aIY2m4iPSujcQdwD017znuaYqX8geHIBhhwrawBUMKMt6YRoz5pPIpSV85nbEY7r0Pmsr6ViYnDWKF2TN6rZnKPfZZlLksRLZut2I7Soeb5WfMOOI2YwLQNsnnt29Zc2deM57wXZHbtIBoxMSO7lbqFLhz4cpr8baHqWmPiN483UP9Owuoslb,8db7a9c92a749b28,7f52b31ea991b440 -SJ4,1753934727ee7be0,cffdb9d10602ec46 -pil7tq9YEDpXxWFVZA3I3Z8p9WRpNDtwAEnp0bcUP25jMvT777oEZB0xpVM24ygkWXAKujc3W1FMfvPX2dNc3vpQsaWKyp6s2qwrgHV7w7cKP5t8OYH0YhSUrZKfxds3KlbBjQEKSPYXT4DGCUX9McKaNLQqKmU9LJgi0sxt5GjCWILffHGuyEKQcut2CybuzbSwPsoI72PDkecEi2FzEqJklnmoA26BWUviATsWjvAmOVa61jXkTjxKn6Cl72LtGhiWxNo6r51Wzg3OwyJDMEcyfUr1aU51SHgCPYyTEQN6OsHIpYTdlXnJfpFhzfFPLjxK4tryVgaTZJBWMOBZFwW4IdVGHTx1FMLLpSGotzQ5PnTAxqABb0hOnl6CRkRedqlDYgcsBwCg9N58jjlhnutAfXjsz4fNeGRLicMOFcGVbZpvGb5qTsnVEJOaAUIyW1lXiO5hX0hv8agBD0x7utbmYBx6KBqHs5zvFnjcE6k74MA1n8tqgCRMASD3lZDoYZowJCo1iDJtNlrHtuGk9XvMkPlC2uG9lx6pDFEztsyy9MKFFCMtCmAiLpFMOzoCdE3kOFRqfKz4YPRiffQRMFyXZg4fiweSJ5MODxVYQqNeX9IhRhUFRt3tIvUyhjPryTEoDWkK7yVvCcreFD7zBMfgSZFsR1xmfnpPSEX3i755EE6PBec63y9NCBOd8vdlTvAfVbQxn7blcJlgu2lrVq7m2ukERWUDnhqmzc7LBOPCw6o55OXpDhY6bGjIwWVa84c3f7e0t3YDvQ3OFLqExo6iyUjzBZaYxjUjhsophOgsywMyi6h1CvI9qVUJ2IdDbzOQpYC86PXIoL0YTZq3LsYCIpL4hG2Nj3q8S4FZAJQe1PSn0Mlm2,a1c6fc7aef5a73ba,cefffb3b94c8f04a -DpQbQQEmosCwWEQyJ62ToMjd2ckOgszQGfBZ4rpcD9Y5Z9CQRw6fXqDorBv8RiI3fum0cwWeQ83s0v74CrNtI9I8ZTHbuSpGXQO6ro4BR4RzQRYIw7QPcf8RjxgpordWYrt4Ug6nnoTZbFR7PniJqBaZ6hareF7PPXIypFwa1iCI2TR45Q4tfyBygonc9sJMMLQQrxjCQsjot4zyAFj1qreYVbVcKvcLmE2h7Vvffp7fTNiSfsTU2STxqtZQTFKfajU1gDYCVZtvok7Hoc3Wp6bDNRF0jIP77L3vuzobqcp8n5lZx30r3IJehF0HypEPZiSLIk05ci0o9lFuGCVEZ7AJSfZUaup0aBdUpt598VbxoRL6bNxCgqVwUpjnnlKrPlZToA7umzWKAvMdmoPPcyaABuayL7lv0AyR7kW7ldvPDrHLcI7Zhh44Ip3vzzcDxXeeqxeUaB7uOEOUTxWPcsFyzOidrBun6OyJY7oTFv2K9yelJjv1AMfvSzRTtQugjggMuL5O5vRUSaf5gILyvNUEAx1or6woMvBY8LfVH6diFilVrKTGPS9jMa47Er8cE9zmFm6kqMVGegG7NBVrJZwq6SYQhzuEePFfnntqHkFj0HgmEgqfihwOTBj4Z3pQXqT5pBq16xJugwpjNOL04ZsshDsRaRjM3g6PdD377nOVA,1c9c4e8988396811,f7aeb42a27cdc66a -Eij,1a538695146341af,f81dc9b6e299833a -3DeoaAPUD5CgZVUeWOc5YUgDUfVnAX7FvMNMV2hOnnGaKO8zsheOPHfJ7ywdgQPimjBBITsmbILaFWmASlCyquIMLRgBemu8d62QViMwY0iCegZTd4k1DFQomCs1RQKIs7PUbTmRuQeAimgGTclkHUcXhQcNfOWoJw463pmhFMsvd6xR69RA928YGP6nHp5OVghNrUK3WkQGI3O5w9M8a4q1iMF2iEMdYhgmZbIlc8tsICbyhXCQ3eESFkksPBwomiqB6tXifMaFtQXDKakfNlbddLiFUsT8DwBrXH9ypEGrcXH1RFlJhLuPCill16iiHbNdV,5e9935605db06fb1,8af96e4160396624 -3uyTNVLYtlzKg3soZ375NWci9zyaPTtIqikWj6uu2ymjcqBaNX0He2zSSwoJ9zyUj2GL0Swu1KmVJ2O6mQgqGD806FHmI6fv4bX0cUJxjzJmvWl0lOB0Rpl2qlWIjrYEMORlflAWmrQJgyVVO41uWKK4V1NH2EdW6KmUYNXaSxoq1gI8LL1Muqm3NKk7LpwDQQ6XQO2yJZWMAKuUoET9d4ZACgHB2soboXpxx0AtyH5zgC8Esk3Du6w8yTxohmlp1JhIyQnAJCEVNOfmXf2LIQ664NIQnGth3lBgm37eRycQN8gVidrBQmShBJT5YHawmhqk5G35j3yPvoYRShWqIYvGkUHnDvjwCr98KnRxMSbTYkb3GAIBw4wJIVYOyI8hfOPj7pjNTHDTKbUdj3NouRV3029zjUCv2n0Y5XUp04g6xs7PZv9XQcUGyWVkZRLPh9uuRcnBTlvEYztJFiVs97hP6k3oSmxskMXpGYDM4vA1gBvWlP3p5ShydexK88gywIajPeUWdDtHZnhTdTTggRixIGtzM9CWXZyA2psp6DCjqlQLFdrx89J3WwEkHNWArDRQVht4QZ10TXfZOJAlAcH95rgn9ZQGeSDwApD14pzWCszai5GbUeMclk2theIcfTYX4naGuOJEs0BNpLU3MeGYpJu3Lc4SCer2HvVgcWX7yxmoRaZgYQaTFlsXAfWZxD3jzdmxM5wGLYL8XA3AYb3gHJImpHDLz3DDJtBxPgtE9oGlBfpbrF2uHB4HLGwacSg047hinnzAn7YcRWLpEMedFoinKN4rIocLdhhEzfD15zmUY7vhrvbrGdw3eaqRnaJACX,4f66151b78dac2c5,eae304af4774889c -z8aOsRhSUKJGT0DSCH1rc4CzLPdtPacKC1wJkHyg8j7ehRJ4m0Q0HAlFYtQtX27xQNVP3NXXUYjL7bMnEkoRgswEr5UorughaS9102ZRCOebdPZPd9PRtanhxYypdB2b3mwfjHeCwgcq8MnqcT8ZphHGYcTJc7No8daGIuqtny5zrabtPyDu4i2cMEAA2mgNygjjPK41dmUXBhfjWOhoTNyAuv210PHazlQLuZDPYHQ3hzV4G1us8jtJ9rmx1ypi18p99U3mh4we7zqXgEN75t4BZO4Pxfyb5Q0hBD3Z7bhvcDJxhkwWO2042QReOS9MuXxgo0SXM9As9PtObwj8xmgVXxRaNiIWO64FWZhdVWKe5eH774eFfRgH05Dhxf1AkIyrkDiwHkZcTJU3gXL4aSHpStsAOKwF8junX1IrUoaQ7RFeoq1KGkI6VBgUAWY20GCNjVcH5o4TY5rrlDgXdW2BzGYDLkrj8hAXWDcj37CzUHP5UVC22EbUGTa5OubNNVcqkaqSQBEM9l,421c01a3ef7280f7,90fac081527c6bde -jtM41lTZSBHwwlF8yTUeABJ7skVSArwwd087C4PfprrslmB8eYpHmmRwfnrjYfcey1mVgKwOvhcWEcC5wRoBGX1KSMiqRWCw9nc2rJSzMaUiadzlgLJ7ac3AZ0NQtBdDROlWP3m9ruSTRrzvgiBYPM1ui880nkH3aldYHwWacEOYIZJdODn6mVtZhA784HTDsXssKF28AX587RsdnB0BV9G3ubJqZOboGsvAsznpjA14r28mxXaOt3rAbxTKwwcel7i9jojignghdFFc7IxIt98b2KrwZSGyXOgcHxj39Kdt3M8kkPwMHLRjoyjYvivu2fvdwsqbq02svWXZa4hmHH1PmumdzLefUP8bcLZrucHHmmptMnCqTCqzZ40b3dPNQdsAN0LtWfOWRZLNXSToDckxW0294aRvi9ATiGVnZb724gzwdL3hSHH7xgYF7jMiDkoAftGnb6yU03hg0u0aSCNBwqBFsgnpRoWZ9DnWZSogjtf6iEv1z81eQdQHL7aoElsc8dEjnUorjRAnE1LEWXNbSa7yxunsPSDePuh3XZ6EDP4YJJfqJunuIO2YOlOCuh26eehO9uyMg5SDeiPZWXeodP1z58ixkF7wrmcH2bWcZqKgZ0MxZuoTtWabNk9EBYOptcaCHbAp8Hg2FAuaFPKfn2jb1lbBGQiAlRZ3HfVUOnSc0xBjFglsUHQZNy76jMoDRwTLOMpBjdYGpfitjwohJ6HiLLDgflwe76o4HLzVGT6DGSvBCMixVoHCMY5hRPDVbV9zXoNukdNWveTKwaxUPmbjxf,119a4e3d8be1787c,ff9253c9bc95cd8 -FvHM82Ou1Qw9GtqhKREZwnjVjUc0Y1SsZFWSE5ZUk1vYa73irjzCo7jZz1SX1K4at3bZdF3DniyLI0WClNwo4NfrjSg1JUJF6ECmKosnxG7Ws6S8fbIEfyZHxD6zfdcR3O7Pcc22jM25klE62XtMiPNNNV99Dg8sIKZBtq8ETGFNrf0mQS3TJuR3Eh3JYaQsNX9OotnrKnmjRTHQ9QCRj4NoPbRoEm7PcDMrLCRh8P3T5QoJn0rvPc1wh6lxiN3EvmqiaQQlZZNfagpmsCdXKTWAmaN9Po5blHjttnp12R2fqNTD7XvvowjRcGMJQoqeYT9a3gsoYWGeJAmmWmG0hXHbS4co18g7K5B2PZ53bshrJqYu96NDSLKOQ5Um3g9EF4WDjJ2sODVvjZCbVXki1VEknymywFy6t5qcbAeM6rU8olQ3g6p4Ug3gnFIqEAumUfMO9QJovmAgKXvMzqpToaKMjaXvQwl6NTlVWDFcOYDaTaqg71QP9AJ4ZAfbGFzSx8t6GZxzy4LU1IJOGntvLrA1DSUEhCrfpOvOnXOIg2j0EUZDgmnLLYkjkqV87ZfN9oYIyCjDpjqFW4bjW7kRmjFtmyG9Vhf589ws8WPgp0hnDahM77gOAO1yyIgXvaf075kMPTbAVZQ5fEBl2XpjBFRvPJofsRlfj8yZuBrlmGhRbQiyZkzOh,882f49e8aab21f6e,60ff69ed5da83c85 -nzZ9k7zfDAMNj2GIar7gPnW34K50Y2AAwYQMDTt9Lhc3Da4ZjRqYLewXK10haBP4Xn84OCj3zxedYIOPst3Yzddi1GyS2wNRTYlai5IF4pxzmlu6EO198H0p1s5KL3SPGN58CYYT6LmCZOjnzAWdr2ktfmhyI44UH0rVBegXQIIV5yrORvwSkDSZsbbax5JXB01l1PP2viECpnkaKxX8oCd8NAvozV9az0taHIyMbuYB9kKaOnD95EQBQ2OKxrUcoQili0y6VNw0D1AHaIG68rSqe5CFTPnMNLMe7HYHzRltrU6UjkMBL74SeQ8SQTboXJMT0orZRuSSOCW7ZSjC2YjW4vSrjZvk46VwyQLdviMMWGqViiNqcnCLgW0GSNiztDL61E3TUMVd8ZSvDEUiPSMrgbTBl4IPOpSGCT8az38xeIX7Hmp2gSeLHILB5AhX6BPioD0jl5ETYbXBOpma5lcDJkRvgqSDhLcWg1rGtBunPyND0E3imOsaSbVHbMdpHknVXMq52tUtBwDQPJBJ1Ihfs7ipOZgG8TnPkVThBNHb1XbvxJnBLO63EqoDufj5yUvHt31gmclZ0NC4TZlx8HPFTwXYHuj5kDFVOPAJJ0Cy9Gjf5CVqFL77ASlKNjA5FRz5tqWhjheuAbhmx546rctfN8dNJOk1XZAbyb1mrAvQqNUPxMUJqWc7qNXtzgVrJfStpmLLRQRkhZ2Gk8n14R54FmJC6wHLTwc5xky4ImE9mjpn6TWLgla9DFPwhm8l5kIhzPtgirMgGOcgLKx2ir8K1VxmBXVXqyogEZIZ7EMahw9H67C4JLbDuObjx2gBIKDHlVt81U5zxwciQRH0OTpEmnzeRW4ZCNQJvTvhu1JMC5beVntZujX0GsvSu0vGUea1cyG6elL7JQanAfGe9,f4e67499dec963bf,fa686dfb38f39b3b -m96VJFErXDMiz2mLUxOBtl6uQj7VT6UavWJY9XcaOZiDWb3cEtTRiR9D0Q7K60dWD4LiXI1LGhBTBjrXpRRAwz37GnSxHUiLYGQUgbnz8bsOaLTPctDP7quMaCo5BzUgGOTouyNOzUdNdgQshcISoGONWIkbNKrzAuk2EjnchQd7BbytMdnA5CYGFOdOKUEgJ8dGSy0glm3YqKNBQWslQF9tD0ucv6a0Ghb6NYzpF8a2zvIjDron4AhGbuS2ZvfotLx6Fl,a24e7584c6523208,61fc23de90797346 -StmRgGwZaXXsS8283NETHCWk6jgzTRiyqc8oZAP2GsTO4evB791MsVvY0tBblRZCbmtBwBSf6XGutxRCdW3u4FPnJMGTsMSPCOfopQgggIM9xBJJXUm7CQQkSRmBZ0LtcTjOFDbhNzu2mEoEh2D7dZOZaUT4Jot7JRG1yiad9cvNjIXkkikZOnoxpXj3PHfqFv57qLTN4mbeRHktxU2VXkfWHMvRogIOEVnAMk4emrybIhcvTRTjPWYxSJS,5a01c9ffafe44518,f16f09c9fbcf0330 -238ouPYSJjAXESQK8keAirmxNAunSj92DBgibFOeRbHgE5wNqUQ5l7gWErwCSzYsS4rftbmCgZtOiBpROQpwnpI4NKmdN0NgqfD9L7gO6my4D3fUpqN9XAP9VshuXleaIiK3YRtI9rav9Kb544MxidT1lxcwuK40JJ,4ad6418385f1525b,1412b9b1879aeba3 -LY2UiqNIhYKDLGTxJP9PZxDSZq27dvLyX4b3dBxK4itKeJljGDKfqNejPpZMrh5QUeOqrUVFUZOT7S722HXFQmR7qfYuLCq3W5gVkqZuexT3BR23yiJyFJq5tqBNDABPLUxGfLWkxhmJAPPlr3fsYNuW5RRYKWBkQzcQwcJVsGMYz1vZs5KSDzH4MRCPhnSXjCNgpXbT0JTLBTtZQW7s3WRpPnAJd7zDbVvHhAH0UsRAaIwD7QcbaJpyryeTLsukNd7gmkgNawcHt0nDZnAnca5zgARk5hmmOtF7LlKrrWYzlqLlYg25PL2IOVEXerZHzaZzXopKZId4rhaa9Pbe1QQ7ZPYpEOGfwR24zEAy5PIMMBmL9blQjpqF3jFWAGS0OCINzKFUIIi3sX0ruizuhhhYPgePlyYbfk7Rp58rT2ulXZcB7w,3f5853b4525c4003,f55360ec81dcbd99 -LA16zuwTAJi8FJaEbFBAfSlucNDbqCWpYtBCEFkC0g9MzoDnGaozDfEzpLkiPTMHs8oP5QohdE13C7WslPFKTf2eeOFVpBGcqkAMeXPtL9VYOIgI342J,dc95cc303a66ca10,d41a9fb11062b54a -ibCDb9TfBTrxYE2HhssuhCHtfOH1KfL9jPatwWR08nkcc9XottF3LhX8Ds0bHfAVanHrej97wlTietdHF4vR9Oce7JSGJhRhX3w8Pg8FCf25cGbSuFMy4NRE23DUoHZYdfDtGngaYDoJZoZNNJUJLqPEoeGMo5UYYXGbl34RgrzKWdCplQwAn6Eh6HaHOjPTeR8zmmJM0B6gBfX4mKPe6GUzv93fDI43nyupQpH7XVlhUZjT40PoU3ddetACtjY3ar71d3mgvRZQYbBA3lxjlOdAb5vgCT4NH49eCQUIy5GikQTtKBCCqX8NiBLuifof4AEhegbcmQOGc0k2FCso8gGutyQbjUEmIPMtFZnq0Wag4hef83vMEW76tHKICFywFjwHAwC4M0mdX2QyEZxiIaYYZtTJnCzeAUnoA0HBRBpLZM2AN264cuGqhRSeCkDw3TbBxhZqJq1hZv,e4636cdb951b8a33,4e264b9d48a939ae -ItRSn4Vo7vEBFKIrIjzo6uXIrGk44GAwpASFmIIgJo8hUI6shfYN9wzI5cRDhDw8I2IAIqEnw3mPAqvMXyZeQPMQTOmgpSGTJb3iq2WOMbW6MFbvatUUQX6Qw3dJnfhitLJkomV89CzLnbd7qotQ6jA5Piy5qZdubI6L8Rmx1S8RRqPPPWDMeB8wRKarhdzbIzXgCDBxIm3cCK3qimCCuGC5fpC3bXHv7clM6yA1iAUsno3K8W9SvvRCxj12EkjEItZyQaJ2raBUFrtiIil30bgwQms7y1uBeknulLA6KCmgv76g3pQ4szt5sruP9E9Gl7NxYQttgE7WTqSw1m6VWind5euXZB2qPNnX5h3k8wdqCDQyQrAqdd5VgsEQPmlnLgiEMOyG5FsgAbLCWEnumal,59f8a9a0b6496ba3,e6d6e694f5be6ba7 -Oweq0gbnfIoq3Uh1q8qspePNf9jY9GGUiAXDBp1ug4nGCuFNciIIjKI9gfDQJQumEvgM2xyPGJOtiSVcCKsaJRO4myHG1W63ohw15sK1PeH73vNrKHSk0MnrEmJZNEIqFrTKv1H83Wkuu22jLkIf6uSaRKYTbrLOiLyRK8NDej5kkStOA0g1R9f7CgA4QGikm3iPPKHxlTaMx8WBuxlC6qFePeDFUaJPGLpWyx4Ze1SzlEiOTX0GzHJ1Etqyf2nHLpUUbKCLm1hWYk4ripztyxFnttIPgatvMnDYu8dyY6VZ1OyEQdWqnUb4PUreuWpQFgzJyZXVZ4OW0Kx7sP3qGvT0SJzw1wPgU6lJmldzLlgTmrWuJ8hzhXAqmHlZ3M9y5OegaQhE9q5XYO20GnlPrfweP1lIuvFLzEDPlvFqKXIcPdlyHAW1ta3yMUrYMm39H6J4Y4vCqugctjNWmxMzHhFBWJFx9y6MH24ainJFUUCUg6wJdqOtmSMC7uUSQKiTtHYyNXas1n29kuq5VtuQpISHkVamgmHtevExRVjSY6u6m7vcdnm5O2htDnVuY7wYW7jbYDfKEarYMK2YvVPwV5t4NDK3aBA6uZ7uF7ZAlJf5Vri6K0EGTcLRA97TMZVBwG1x914TEgtErmiZYOqbLyjCSHvwOHaRXNI8YBw9LSmgVi1h47VjEbQGBuybpARtutoQ3YOy2mM0OoOwecYjJQ7HEWTKWfBiRxud9xDENwqyVMQAGCUMnVTI6p1ClOvWoU9HY4Z380OZmSbMNsITjipEvxpLfjudYhyoX1pRTz0Ay0210eHNw7xg5N5rqt8nSSiKjwOy5qCkczEoMP3vr,b44ae945e4ef1356,4b14d535f2df968a -iqD8wmmWPy2iu9yKYinbAeDrZDQqEqFTELQPYn1fXa7yTf4F4MXgBZwRdErDdveWAeIrmg5dbD5ZYmyqDDVlzCf94IQC91VDK7AAaRmaeV2J9llv5PrdlwHIv6xzNYC5DmAcqY4LIrXaDlJXHhuWbLbsE6InnMyixbBv4uYyrCVCVOUARROsOBRvnFdAzjfbLGQWjX5XlFHV8U3mTTp3KwBxg9k72255ULYRGHzGazAfktT9O1AQavuIvVMiyccXaxiFfoYYTrRFvATd6XJ2HyQ5nXm42eExmUGHlPoZZrwekQLT58IMicAtsi2Odf8GUPWX3fdSRu4Z3QymueQnY6lON1f5RLJUfc2NcRzQVBZy9OcDh72Egq9hUGhp0SHIzbCCnE57bZYZRMAd5RS2dqskEKG3iyoZJYHn4g6VSpwR7hYJyuCCBcKwRxX7FtIvd28obg9FvIJG3H3vYR8ix5iSiumnrQGw33n4iL77XSZTaRDXmzdqP7lyK2eadbIRUod6n7z5GPap73R9gJ8fP9NRCs3WCpv8MO7oclcOg9cHPGliFcvqR9lYlNvBTcIP7IeOp7gLmaWbLGiNd3i9XPh7wqUPeNB94ierkaMt5IrNJcGUMZONphYPGRYYwa9qlsZdEWSFap1fblhZB53pRF7DAVBldJPT02h5PV5eoQB7nLx0BOAlDzQAKzsKoPeZoQB4glWnzt7h8FTgpZjTNmnSYKLGNtiOzPrZiwiDQYfF2jpZND1ityxRcTYTHPaI3Y39lFgR3Drg0qbFhdG97V9GYX9W6Yw0mRVQzEEkbk96jptbXTKoc2e8aH5C5HgIDvPQx,3b8927efde1b1,1aaaff792d24a28 -ANQWmdiwpEvwETODBJNH1bhwEcJ0BUorpkLiHQrauB5f5tlozt6HKMoB4QsucGnfYykGWcPzMoK5HW1eKfdwheYRi6PXeCcP3H5Aki7Dn5k7bLyOuzhO6YXKWse9I1TndMUVq4acI7VZaynZMPKt7HQ7cCBFew06KQnjxi1X8sTluN04PTEMdTBjdPBTCjlg0BorVcdugTKPyzy9OoFTh9L3OB0349nOUg1b1HkmVgiAq2lO6pRUrD4tDMqymR0aTgf3Zw9ixd0QzGt7jMvf87dZoba6rurwj7AiadkLoinJC64cIAJxlcJb88CCN6ppmBxTlmuvOI3yz8r5fLP0I6aK4JZchWNfvd5sct625w52YSxO9voT35HhQKeSjo5oFgSeN9Zjaos3z4aL3HcB6MXrSIUb17DVbletCxspha5whhMMaxVZB3NmBvvtYDKzY8qLIuSdjSdhDDX4Gsi1aUBe9TUCS1hMBIYRUiqQO9SQOklTG79CylPr35u55CmEfYt0dJSl7ij3CIfEWThurLtzVhmPCYS9Fn4BpXSKtRkdh8nw0dxDPYr5zzh9qExIoArvdVBKoBF7pyYZqEimcpFv6zmOIzN7a4AjARul1zFYyyPq1uf56PkJ4mTvEYkhR4VKzDfw8d4cfKwwp6ybgRaROv7DeDpN2MfcmT18vqISZIo5GdX7Id4KYPJPVU2Qs44y2mIP0nxqOOshR1Y5,824eb095ae55fb9,a46d9b0312f99b0a -wH0Z86lE847Bc5xCjiLMOQYgF5k1CdkibYl2S7n4XDBnOsAYzCma4yGH7KFUAsSYMkUa4ni5qKBizLgIF8oovT6ctYA98gEWBZ1PaffoHKqNy23lFsJ73BT0LPC0eMlVrOEhDrR5SqzfAg0JtLWtDmAVyUwTCZ5DCMJQGkmcuuoZoEApwmLDExrp7XCrvcytcuM4wgAVUz7d6yZU6KBkFV0YG2EkOvYQR0wdVw2HVQhm9FbCSViSUFPmjIYDRXwqakX3QGpgTNdFLLCPUXnsmJYbZhkZil1gF7DOKjlixRP6dtTgjsNlPU4bgU8U4hGFswbVSqmML8c02kPMd6SLdAddhD2Fo1Wk8U5KkHJ2rEWKuWnHWaEaF4NNpvXWGf6AeRMdAFs6YT1RsMQcnKZayBiQu3GPQjlUbqe6TRL9sFlbSd3KPypnkJKOPBZlh5hN7byugj6BWGruAUIfIpq5wEaYhyDTJ65pzv0uOdCK0BkGx4Tgmrt5e1nIZPKCpGEiDuAv4M1aBvmKceO7d263uEKMUcmjpjM5umIYhHARPQzoEenXaCp0FTJ67fq0ophGINRrDol6N2tBT5gjOssLeQ9iHGx3mhs5qKYFd9szcBpdrLsxSBJmMZDZwr46GNbTEn9Cf5S6rMfZHqOLqVRBL183HluvSsNDhIVxzzmfjzjSonxRMs8EkWKSmq4kHtWhPii36zUtM6dhQDwjgXiIXApCGaZRIeYvvfZfy5KER8GStChF1RU1TxpAWagqZfDV7nyMIS3GBI7WgJVYNQpETl028d72lfa44rnOdwc9ki5XJPd49SBnAWOOwNFxv5WvN3woX39E8OCtBhSlHzGFEMuiRtHU5VIHiEedITer7tfrPnYbRl4XeRsJuiG7i8iwUZWJwVMdBHaNOtoDYVW6stTsdnnlMRg82M0Yio5loSN,934ab3c1ce29b642,ea1ed6d21f077865 -VZkqrbkw9PnYMlo2YvyuonqAz0HHB8frCMp2yw8IZwdCnvYeKYIOhWgsL7KBWY7lqw8othhcGxYzGQZoLfRsIPWD4daa7iPmkziXZEEmSik34YthAJoLZRVI1xA6LStNECdz2rRofbbx8ioInZ0XND8PeplBV05zK9y9dlALqb2k119bMGmNEGsfb15HcQcmKegp0gO0Z4KUvLbDh9mhJgDWE3hFcp9Q9q6tHvzKngglwmuHUgfphxUyFfwkgIH3545vrCILahBmLPlpAUVuzhi56k9aJ3t2KRBt54x4VUVGfd44pQRyQYp71iiSfiO3TKqIZfgq5WrxYGBeaVZFw394WyLTHi56GSuTzWrUdNjDYu9V9MMr9CIlLAvZNUbCczL41E6hyb29zbxtjGCwGQb8c9nNYtbnqtaF4nZctEDkzWIWJpCxfvE34k7OIcRpFiYfmaqrvq9efhFGFrEwtR2SeVbtMIHSSbUjMpV4NoO2Iyst1Z55yHUzT6CJDDhXDJAN5HeFNzEjTyAagXCQAZdfbYqIniprekPvYshrI9LsaGF3ETIZVZ0tohGI7DudXaITOHTI2pfV5ty3xZotEAAe5v5mGCKE6Y0iDokwJVexGKbWEi8B94z28lNu8d66SeHHSdOyck5bAL5V1BH1RVi4awNBxeH3eY398qByTBCxI8uteQSTDKaNIlyOihpySdESMKwKoDI8SmIBb0B7TJs1emai59sF06aBRyAo3c502cywMzJO5US6U32uVG3OPakEdsv4kSqtWuMNOjGYHLROOoJSFGEqggBtB5mer5wJ4s19VAXy4b0VHYGAbw47CJ72EnZBOSoQcJftzPJgjGxul1yoqfTGB3bHcmRNACRTyzMsZcntiwDb3sC4AHhAnmhctNmUeIhd4Nr0vJmdK3UMmRrZ5vETyR2wvejESeL61G83H0c7zBSOSHy1wq5HJ1M,8572b23c7c20132,3bbc309bf06913a2 -l7MUQ0Uhs3RPKhFqL5umw0Tavwvb9wPhEjOiqVJSe2DhPYnfzLIqD3WQ7yacqFm8GnnZdaigKrRreBYcXb7fhctwHPI4YUWubpBwVw2tt7VmdIihAjAwOdHkAUoh3sKjTH3PU7ZnGxp7mXWuizk71MTFpkCMtrkjQ72vvkMWhqL42iLglCWrsYWcgFbZGSQeWnt0pLOGIaXQXRhqaux6QIecx4lYNYy2E2usdo82UXTU6i87ulgwSKflryqRww8BEGqWGwStTVHLAvY2NSOZLGE1BT1MRf09so8kSN1KX4NKNX2TqKHLEunMpsiiAlmVNEOR9CGC4iSOWT9NLbR4fmidP4nm6oqkNB9jUEBk5iYZUE24wyvvRftY2bygiJHvieKZecghfEcCpe4Uud4ObMWpdI34DqBeJBEw3UfwpjtXWnseVyjKkrlIioSJ878iDzVmH4ZdacyZcw84vSom3NRwh9ZaZq9qQQDwlhdlOilWJrNOtDI8bhzcN35PP6DViQQVx7QiYxkyagU0OnpSUvCWnIR9hmy8ffzZCA9iNfuS,ca650a89b4dc890f,d170225daf529bf1 -hliLVKOipgFDNx0X3GLA0Mjm8uc26HwulFhOrS4QMG6DRszAM130FJImD6ZOdmm3reAwnLIJHgljMq2attGtligGEG4m7lkUVxdXcCwPX5qwoWYsZ9d88974zjFbtEV4QtofZypXZQTLJThRIZOtA55UCpULgt1nhdZkQGTZYeOB78WwwhdyUJrwasiOSPgN192naSkPnPMRuZDBmfzNcMSokxQyXlP7vgl6kZeegKROcQjBbMj1DhetaQ1AWaxs7rrm6oUdbAsAKd5V2SaelILBFKSNM8PSIawTuxn8sJf3UuajxO1zxMlvTmLHnOv8IcQRk2UJ1dCKc8JopQoOgWKqB7fM0nEp6qM,8fd190e388e52215,cf036b9a30533ae9 -ULrMHOp3xJyfUb9lBt65OalGptldnt3BqoDuB4R6MD5PkoAwUE1C0tNO3fCIruED67enYMkCBHQFadMtx9vfR19qB2DclJ08LUPagoDYgFT8ULLJuQL0cIcXI0cSyHYAJonDxNNuYanMZtdJjekkzjetL9XCbEYkeLSJnOFwG72Ak8r7CU2cdSv1okYd7eAexbgkQLPcaVUkkbWiu56AABVkjf7DH0Jy2MvpVKcTXajXLQIMN1odHwF3Zp2murZW51tnB58jebxse1ZhuGZokiMcELMLT1jDFZkEqT0fQh6uSdFpnpOhf7OgJejlLt5sX4nm8vJ1Yy5S0dshhfXUi36Q01QErVfWeAkpduUzuvm99aqrqrASZhUCFPrhyAPT0NufItzVys2mjvoWzdfJFWIVdC33ZIKRjVS3fNfwYJBwu22aRHPHljacNXuj2QUqBP48XK7sIh8nIn3e5BEL1ch5pH1oz3cJFTaGi25NnglHjaWGiqJbCBHKCQzdXv78J6BtV5CfFhotG3tAafWfvPR6eGDRheCHoQfTdTbCxgXtNB2L4KeHUu5b7faNyS91fXphO4ClBCWobYDRjSdnYRP3KOQwpqGgyUXBGYpEruIlkuIp1SFTIBWLljvlbbcTCvjzthu0uV3OhM8fQshVSvwD46EOuL1iYI8JYO4xi,8b4a85c80acc7bdd,91cac340ebc0b407 -ATwCsgB7LB4fitVQnyz2luZyG6waaviHmKXtV3FS083MhOrnn9fK3J4J925wjja6cdnt3ZO6cBEdjVkwdr5sl2WxmX3rzS20T2K0j2CEDxk85f8w0cILAjFMURNk5GfL5W9X6NM5ptySIuwBcCcdhfdJfbXK6yjCBlp26rVed4xJWwuDQLYBUi0HVlpgPv6M7GY5aUx10IWFt0QZirXhO31gTsulduziBG7EMSwX1yORxRDtmiu8GdiZiYGGjsbpogK9whyWa6rbGh23Sg91LX8kLhxcok2J8D2BOg2qZzZXcLkmFIlscWPYDlLKmsRTT2ndK0FX3Vqmzbykp33gMklsJ5HWCQS4Hi1MPLNKiCuuFaQCu16tHFlfCmhJODs40HDzfrrWA9eFOKBNeCO3ivx04pwVtZkVxZBPnmvL7toXDsqKgD3Ew8SzCCHPo8NWuAmDXuXkp8kYQqVsvRHLbACQvzZ8bRHitEJsTHrmFm16dKly4w85OJfr9wRoPyacIjVTgHfDXuvIYz2PNacJd8VbpM1pTvGFLnU5fCV5dYshu3xu3xXaDwbe3dtrDAFLoRhQDkaacnqI46ppX5BW6DhzhKL7Bk6n4nOstCsr767YNlSh5ulD7g3QAVc4sM93ghPxmGCvFH1YaDjSpmFyvfKvhczoEThwciYn88cSPinElJp5RP2MVLHt,b505dcf84042b63,f0839c53b0ff135 -3nVj3K9RRyRt8v5d3EUmbwJAQDtTtFe1YBfDr97aKPzK6yf45nVXcrKd2uZ5O8OSM5OqFT6PFgte5beDHrKpMZrjRK2AXH77uI1kd6nSzKBg3QeNlzULoh809Mm23dohAuNzVdecjUiFljNpuwmFWuWjhBWZnQPck2fYxCNBTeRW9ETiJiQN9m8fl2MLJ1XzbnqgYT1kelpdUhYdoLB1iuEF8aUEgZAXErLvvBpwgJU9iWLf01bG9AkSvd1GU8NYEZ6LfqtnTdfcbsc41bdis3DwDZOgFnTuUJiU2EKh0NdXq1yGRw4mH2h9ywF05g0OkMGE22fbZDuWNVXAZdT99msT89kINB3UepgwECl7ox7OyVmLq7uH5SZQgMmxcLJeNZFEHIaZSg2cid6YobwLCZalkbmZaL7rv16pRoAWR30xZcw9N21rbetMmiV4pzRbL2non3lqs1n1oXBsfkcWFUUkFjeCv4cPOLM3BjbIfZCxip8mlS27Yts6lNEJb2dhR1NK8pWLGDCQ5XpdnnnRNiT3HadvLOt4CC8prTNZoTLoXRZ0feKvG2HBUMlh2rxydjG2G59MpLR157ztj8AiG1,1200720e0a1f7a84,30c244142e7ffa10 -J6EKJ3g0xVCNG09byqv2s8GkrxmLeOaoPxQ5G6PExGtyM9GFndQCANMntlbdgV5b4NIscFqLYrO0IjeOFQLPMUVfrNWV48XYNKnbzgNdgzP9Wt4fsOHUCr2v7ythHc9FvbicwiOkGiYUyemcbupakZ7NHAhOxhTseKfENjC325JnQ8EpP3K8wUkfn86fx1ogT9SEwlbJkAyZhHwDC3LgW7t9ZWzvg4yy6EoaB4liBQiqRSszjGMfhcdTQFAP8OXNKR733QCPc5bE7xDvIpyr9H9LW8bTHb2,b08d8db638784a9a,634552b98f062ad2 -1epBpDeUC7dTxr7JeTEGYrN2zN9ztxwKGWUNI00UQqd2Jj7x5sU5M4p36ysr7oFsnlIbmYjwKN8uQndotxBo2BAvKNfedSPeZH621GMwAiQhk9LcK8Za6YNPVsNNu21hJxBUjcf,c77882b39312a2fe,bfc9ea9bb892152f -5bgMf8gFSjJ01O5HlEYwWUuYGuPx1d6GAQkJ4RCxwu0uUmAAuA1HJpDBZdgm430HnlQRYz7YzG3ikNwico4Drww6eusrkgUlm2DtDq1l1QugndwGfvCBYHX7uJNCXIs4n17v,37dcec56586e2664,46a925c0113cc623 -IIueIK4ETLX2hC4hBbCkWDrPFodZtGvSGsDqh2H5qOiCBniycdwSUbnWbnzymknJJc0sJm6ngJ9t5exHJX0HvyKqNE08LGQOcT8MTxNU1rDHWYoD54DDSVaUb5bnatl0l9Yb1VGiU0wxNYolC0oZc4C3mgPF0pLj5P9gLxvs6R0hgMTGApAuvQ6JWwT5DLZKgFsm3rkSmF0CsYG7EJmZp8GYmaOj4kOIP2hqHirA4lOz,8e57837b11878c8,28c421bf2f3942da -DdUQesLYeofM6TUPGiR6ESjoAr4DV9A0moM699zXsz3UbuydHqNwM32AUlXuns5oKmWcPocRTdNaEYCJCwwaK77NCRmKUQzQvfBgaeR2WKiDduVvAJk1TDbNo3yOdHK04GLVLSeEGK1B5xNf6YakqouvXLSaASVnjwRbHwpeoyyARefbY6mvuUrhgNkG0hbZgj8pHXSCHlRQRwXhMVApMyDljJocBbLHtu7WgemLUlUqGchVbx357iDRsK59JiOxWDUYQlFvheVfuwL7ujTBA7,1526828e69005f72,5620a1e9583147f5 -tq7QGZYJ613HYeFR42G9kJjzMx4ty8qeps8UKzmig298pIG65SA9zWVaX6v4ccDZ1PNBg8qnKkn4w8ewEkJqeGtxxdkPpGgNZ6gYO6ZScJZEDrNN82cULQJU5pSnycoeN8sQAFztqUzehvQXMKIHXJKS6kv8KBOPuPQnicp8kzACQu3sSm6bpc71DU9KD8LZ85fbKl5exwEZzIY8FB9JDRFGX0RWRll4GY970hUp9YEngkeOb2TC0htWaAKy0YzAaV3nDargcqOimGuA30Zb1xSdO4RUg7ZX0jxqwdpZOKGmBEyLX1XezKBHp1tWQLg7yYcaEx60bInrwmcnbm05ZeLRLHet51knTE0HovGo3TIFHHj4yLRqwusuXywKaAl5lEBbli6V2Szy83VYltaKlD02hm6H1d7kcahsN9KDrODuVuC6kN4rwmbe2IvMUM1QFd9GcKKR8sgfuZ6oJLeRC5yae0s4QvKv6zMGiEdAqNAQ77AIk61ZIAbbvK2r9UE3VMrq9Gk9wKaSoz1UyoJKF1Kega3F2Cw3bAAsiwUEYMcj6KYLuxTH17qtAO6gWTDg4EBLKAsKzplS4UE1S8SLMoDeRqjYHHazho6oUuBJk25Efs7aM6vbX77YD3aCJyoqV3T3UbnYhm4CgcMJD3Uoigmdf44iiVLYXgp9OypLnSbuabtqFnDoZizgO8LYo3lyBWinrK4RVl4kBR457qsuqT1M6cGGAAUDkPPByBL6hOLmQNpXF0bqkWZ8qd67J5wfnYqpumbkV1cfaKJhDqJ3NJEMIOumlGOTiZ41Ckkx5A95007tN785hJ0YdUyZ9mNFT2N0r28pdFm15evf0t4uuRCjecZJeGhiIItCrRb7zmw0CX0OeClY18bn6PTEq3BLheDWiJBZTz251Ex,ebad4c5c124bb161,759ce61dc80f4221 -kHR0eog18FWkTIwzQ1IH6hJ7IGKtA9COn4iWqKyYprXQYptlorcMntmr8ucdbwP4tG7ayy6QFn5A15f7PX2bFb8gUXYW7VdunPozx7TpFrlOQ9aOO2soE8N0g25sC0Jh2rpRxliLGYbcuiwU7MmozSy7dA4TS7KSpvMYFueAX9Ta6kjN1fdkFSgvLlNzv1l4VoHTzQvmFjdD5yYFaB3UZH1MvvjE1m5GcjBJhWmdko3G9Dz2FkyUVZmMo2YGV5Y5heSLYS6IwhUOUlFePBKiKBNJW2X3lK2Vdn8dZZRL0XQDzUGWF1pwpsoM3z5RzcA8ZcJhE2jFQP2j3z56WPqVYzDum1baWMo3goVXUHeFpNhCIZI2MAf1f5o2vpVEWme2bV9BlrsGlIM5NCRAoCjbPpUtLe34PdXtSqL49Nibow8wfo3RBKcJEpMtMYKi7fzWgOfhjAfXRa2E4vlZRUiSi9KLJUuxWqleazWWSaeixJZn9wdsgUo4,102ffd6cd0665c3e,c1e29c3fcdf2f478 -9GTx8nhXCSYurb0NVBt3MVWTccxjqy8L6a7DDVHrxSvLVbDaIGzSYC1wajp5cNA4iOE7IoctrAz8ZxHFmqGMIj2tlrc3iNJrRTolCBhuRIzdnppVqubpquOfHn1F904HB3mXkxd8SFLyQHVuTEVATpE7v8gXlU4rZQh2VkO36CZEJZd6EGUE4hpruYGRQzW1gEGmNifvqNi9VRU1iHmdscbunyLAcIWuAz8pfPWmfUai55WE9cpK2oYWhuElGtcWXm6lSstXD4SUEgkdhcg7AEE2FIDa4Tb8715TQGR5ePQkuf9GLlJpDWnnMFZ3J9c2FPFLAfWIkbTGU6krhLtMcaDnjz1FfZ6ko24S0ecNsuI2soqOSiNly4,d04b8f5e2338b60b,cdc62d6b9cb4424b -oi6iNMqyTejHt9XH13keIOc405dUuKxa60hUNTW6t175EPmpRDwmTNFPaRXrYMxKwL,bdba26402d16a538,ef29ec869f8b0417 -D7RO84a4TQ99wDNrjPDhhf71lU1sIhgt0gE3e75QGtxVJZ9F5uODFf7Vq5sEmErczm7fbNWATYuHa0YDBaodhDyRqxIhmELE3gzSwT2J0uGsUr4zNCtdqmiTpi7Q8Y18tY80uzJ9pS2GuPXG46mAkfTFvNrCGWdFif6wy0AaTMO1hJL5WA5ZGayCGYv0aXzJM15Vmd56pbWSwTmaqfKOHGA2gY1oTo9y6H5Q0snIgFiqVBdB01gla9MFUznDJWWBW31iJ2SXXg14ky1NiVu4sAqVBJzFXrpzwSFvFJolyu4aCBZeQ6lXG4ZOnxE7QCFzROE9fuZiPppsFU2eFBwnwPyKQNneA2wUahvXnknaL7KFJJdbDZyZFqSdkTN9qic6gNdDXz9I4W8hxmDzbvoH9O2cPbfUz6bH8Kgc1HkhRA5cnkp2nWS5N1Tte6lIDGxE92UDoJrFDePeT58dUDtx2jwAni6K5kODDozlVcb1bSx9jWcitgd25G50RSWv15zE0JQHpjw0l7GZicKWh40NUchxUI5vJ1Ey93Yz2Cz7WQqVaL3NuUuxtS9JoyalPGWVl59GisMPxBlYXoQ4aQDkvmgGOsvqv1PDGZxVdzS1yHfFjmAFUg0pWWt,eb4955989510641b,29f8db337bc7c698 -qLsYD0XgWeQyYAbJ99P09pkFMRHPM7ku2xtoQ4DTzZRvIfAwh3n6KgcCEhbg17Swx0gYe1TzL99BRTJVOjvz4Kg55DRyeVvsNgYU7gHOUmxUer8gGs1gf8OGdnE7DyPO8tAWggGt8IGt27aXz1QZtWtBES6lVbSOkkufAk6zMJ2tpHrxSahBfQS8ROlAdZ4zPb8dqWyN5l5kYRnP8GVipPtyQiH0yxaC3WwTp0ME55mcnaXHuodfjGv7g4YRDa5HzNUoBhAHIpRbgKmH62RUrL0G7L362l26DZBNiuzrZzOFE3Dbk9qfH5DhRw3udQTRVTJZYZ34eEQhBnYLCs7iDK7NXodRERY1zDxSAWfF9i5G34xVgi7LjJPNZAG7uPX5mGBp9A5Rb6IopmRUi4JA8SFodbltKfeqTrcQLaQse0yRvV2OSOYbQ,7e495648ab2f05b4,8ab44566d27e8ec -P1i2gefx7l2mNjFQ9N8mlSYmnWDsVlhXO47ylV5kb3A,a9baddcb4727b3e3,f177044e544e72b8 -kmRCYKgbe7x0bXuoGPW5OacXCQZ2VCawyvQRurdHlPXUkp8Zw92VEURafxqOlHsCxKg8zhGAXEnyu5h44I9sqNnTQFHFqKxXpI1SiD9n8w0naxsqg0zxa6j0lZ9sTbL1sMUONWOZC8idugJSe2oehLBb1gDfg0HQW40mnYjDUdWwzX4Swx0Y7i2l0btv1zPcGPWPmV3Mihy45UqXbAGhqWP3EDzWs9a3Q8xqNcDlrbuc4a8NstGqE42uHDkBEHOtNpJ7e2q2lDLIvtt09sMagSaoAnA1svjkewfzskZ,d35847f3cdebe1a,33b56c77b7fea05d -0ctPBb3A88miD4Qgr1kpE0DVnr83y9IEkqcg89J2fI4aTkvo6E5RnfVYzgIWTwCIr8gUvH1aAI6B6nCBeSPI3lpvLzr07ilNLoPgX1SgMK4HQ2dRfuWj8wtOwMtVACVkJGOC0gSk0DGe8EG8lZ6Ibd45mmGHVMO3sk1RU5T6oLobVCpkMLRmCRyJKhhVtzQY0t2e33qVi7RmygzUuYR68kwZSVERiSjgxZ5ptjMtCzWp0Ns3suhLcUMxxR6g1FRgQ1VBFoei09HBXQ5PglJfEHzenIqQYxmwLJcjhlVQPF8sBMjnLrmgXsfF0JECVXwVrBE07woTHTkuXH3zIzv0JHvsD977BjPngjT1ldk7v3INVFkfB4Uu6j20YQWb3q6QYCO19mC7PDDLEZHu3GYpEIZk0c6mPfsgJuOY4DGOlI5rTCtpcn5P3xUV0ZUvabQD7Hn3Nf9ydMZqVyWg9mIWww2meYBI3ZLwAmWYzFHFhxytUIMQdzSvJROGX7f1GHYdm0SJd5U6fKgiYS2efNhwrrqfyjnmupne8o593btTA3f0nsj1seyBJQjtlNEh9Ku2Gb2KRHtNzU9YI19eh9xIZ2AHqBnFiOzUkD9ybAVmEmJoBXdayCL2hNfgZ7tZcUyxTKTxd98hgG5Q8KAR6TtkmcNq4AM0Tt8udh6OmPOZOxKCh2vrZUUOWWccqZnJ2QOjX7m6wnriwxe7pHXCLKzpXWaq3mTG44WcxwG1ujKe6t4eu9hyl2FMPo9mR7bDI5Bo3RajhZD4dqpu4xYXm900A3Zm5WOQdBh65jpdEWsBEZO,b1ceac21454ef181,1fed1a4c8961d6f9 -M6es1Rnng0MUcB7bPrTregZ6sqJ9XJCmNg0ganpTwHz8QnqyWZwmeWnejRjk2rokoLFWCrBlenoeWwAvADBxEvqTmtWfXqYx2wvSWvnhvcngMIJCmdzSq3iilD0bAp6Wd2QSSY5wXMCBAUWElZIxrxLknFVenp8nafkPUhzCD,5ca2444a4c44e729,67699aacb62e3e38 -nvSQ6ci5R6NhESMEsCwSMmmKnR2FxZ5R8DgcHGQFLOZWP095hGdgiM0kkmOr4a4F0pHQpwkPhFAhFNvmfMjRoefn0gStBga6GRyzNg6HMg5UMXIA9pzY7IcWrfBP19uZhCTGHtMpbunAOAJgMTHxhh60h9NaMcWLoeiAOR0oQ3Wtmlp3JQ6Mgy8yawGlYs4eqUHuhtTtRK3DCdM3neBZG6z3m9pTEsvntbMOT4i1ACLD4CFkJpYwOnQxPpUcq7BhzeoqX00fVyHM6JTB8UCdFTjdpRpjfeeaxptVl0xIbdsYnuCUS2LPy2Q04CfpCNHKeK5MtCdpUQ1gsqswgLcTF1iSTGvyGHoErEQZCNsXqyjQUtmGzAW9Wu8XW7LzJm2umu3f0Fo4Ea8OFO1OoK6uGvYGMmcfmmaoW3RHgPkmyVchiDPAOyYfDxLiiCbNaPFTuv3mA6hog5syyo8MADj5dm6oiIgv3e4AK2mUVAhdrc62e3iAwe3aRa93ohyLX8ovJuhOf63jb1sImmgzSuiVNNjJHtteFGYF5ZorGJlxItaNj5WGEquuKRcG2KX8H5NfHUIvutw5xTGhiabtkMy8Wo5CSlRqJFfwQEYyvbUb2TKUoMHFzVmYZIhI69T6Ve14nog3J8sfeJVezWpIZaDWlLYGKOBsZvIb3WlSR2tQ7kKzT8P6p81UXt503TexQMlkFjTg4pWqOqOXoeHvUzS46MFH0Sa1QRQdldaJKPzO4uVxecmxddpL9t8R1hei6rrN19uEEJ28jkCuvLyN6vxI42phpH89enKuYZycAP7VrSO,4b7456951ac726d6,fea858d0cf500536 -YINUEhpasG7SJV8HKaIHAm19Prjx6Lr9e6l47q7GR3j67AZR6zVKd8IMkvjVpNVUE3uaaihSc8kRIXEAXXI0icDNsjMV1WFY2CVotZQNmebegqNFiHzvvVKOiLIMpgYB3a0d7yJ9zyXGI571bP5BzGDX8gbY3DBXo9BlZshAPJ9wbKtNZBCqYpdyi6DGqPOKuzPbu6Hms7tSWMqu3Oyz6llWfcnjvM3hpkrtSeMVlcUuPBghdIMR61evvEKcMlCbaLPmcWZdfzBDCiJQSzUQnydFeyBct0zmpLowTRrs1uG7qsDB9l2CCniHUYWuxKaT9qmd4IVTlTEsSQeRstiLLyrifupDxYWy1Vl5c06fdorqum1Ik0ZtBpFUJuNHOfsQl,a74780713e4504a7,ab8853dedac45661 -dHB2L9oQBdFAu6ndjkGk9t8WO0jd7W84sug9ipqJ4YL2BNmRX4aiwefacpBPeTVXCg1ckYcnXTflC7pRh9C5WPOiU969d0iqlqyxzWgVKRsvKYHoWoxUc1T0gF35u0k7qaO5AF1rJzrBaatmXG1sCmOjy4Ig1q8aZIum6fgteF3omB1kLm71p2Qvev68Cz3w27HtKcZQtwoudpAv0QzN66ph0QUszLpeWasCB2NxazRELIro3l3wjDq2IPQo8tlqBKFZ6liH2fLiNimp5CCKvVdij9n4Nv6rD9Qu1KAkULY9DijoS2VcXMK5pV0fESJhaXOAbKjOHEaEv16f9hsWHCthLd0ETChslDFmgoqmNOdIhjN5OJ3q344eV3lCCQrn2FqEJrMg8f7AVWhKPFAOTcASuEvkCEpwOzK1cxrDFyEQlNgG1meoT3Fuv8AnIOtkJlQi06onu2BII5i1XsErjjKnzSIKOetP3JFSOeqxoSGHT0JjlN5904aGbdk5xq6nplDLXSL9oswwIvO6g1C4l9h6R2DDhqTpnFwjttedYMvIvtymDuzm5Kyv8JLduNmSLoAnuUGqRPWepRdiHu7QT9Hw14OEFcP,5a17b75060f0380e,9870939ad2529f84 -i29SlGD1iqtM46JbUhtMFAw9s0vaNhdluqAGlPfKzvg7uHdDRncu0XCBCwKqFSKHgAUxYPfDgxAXpgfnO0TeXjoZ8jUAU1JCKUHm7NXZpp8DONjWM8yC2A33AroWJ1fsWkZLuGf03wHyKgDB7dUY0YQkddipHD5Y5XbKuysGcEik17mn2XKTDzmH16VnN4nWC2K0uK7pqstZTfwtbKKHn83jS7Lf0L0unSUOKBMEyNQgJmeHrFdhImVdAqnTuSRtvVmAGYoarckrrrwNJWeYXlfjGa7nv44XGeljz6NmARKoMnrI6Lp6m6fUJkPSVn66X3yy69dEUaVZUKwBp6IIWfxeyNqh6HiLtptxS4iQUAVT5MHpbXoG38uI8x5309EQHjHvTORHpSwgBhWGlak1Goq1unWJNzIS4M418hvMmL7GHMEblf70cE27NXvLnEBKA9TnUtddnlnYj4eOxRc4RJoF4xHaMzSjEsoDw4IRBbwTiOfqZhUROpLEl9N1mmutRfVJV36jqInkSlsBmE5oFiAdT5wCtx8aGrO9lsUZFPSeENfKeFOzZZyD1u2nSmAsm9fdIJ3TRL4K4TBJcxUnSKY8bCbTcp0cotBNSmo5fuEQuvacLR3EArxnmrfrOETWSyTuoiuCL9DkY2PjkO11BrjBQ0XtKUUgAuioQWWKTTZ8NKJKY4xcdXrfUltXqYyQuRkCpCZONdqw,25cf6387888fc576,cc6bf74522caad6d -9upC2rJZQ9rsTcZkSbBEgXTLEsjp3QEUrqfivFvdwKbiEVeC7vwjqK1Y1cr8TKb3FJgiiOIRQgEirpUbaTA2nEE3yJTPjOwd2muEsA1n08nYhPyoN3Y4CLezuldv8SpfuVpCcIIDiW6bmHPGVSi4vpxOpKeEUxGzaSUnj7mze91h2Ml1nRQtFVJb7DZfHURYl06W37puU9NtQcpapFyFjeqJchD77uoT57zkrAA53LBH8i7Unhm8FVoTTgT7VmGJdOLeHFqkRzhFgCpu4AbTegXxwla83oJ53gAIokdZBrQ6Al0q0N8KLEOS7X3N8UpkVZyr5SBCjus7MxAHV2Uaqwk0cb4F30Ocn3jv5EdBJzHaUFq62iu7VT7DbNWJXhEzzswuoil9YeyTAw4ThmlIuwwnQ62uUXVFD1kvocShZqE3oNsI7X7hxnxp0Xy384pcSdmHMUKPjWrYbqffhqOjDaJF3UDp8y9Zg15MgyLzDgFGe3GkMQDK6tNu7SiQIJcPcxIvIVw1xeDqmQgj9m405WuKH0BCTGqSKdxg9hJAY1OFHNXrrh5WjvdjL3Gr3HgWR639z8zRMI9Z8bZuaUObTymFhCW2M0iH5ECPtAS5wLEV7FqdTKzitwRdNfZhtLYus2L0iR5t8YnTB28MOg1OZypwvAeqqwht8pbZ1F5GWaTrvRV1a5JxQg4uq7ZIj3EhUDOtNDHgIuCNRGYkqhZTHCQk3ik25qlG28ZA8OPn78AQge0wLVQwWFE5ldDojKJ4Mrd1fK7vbTbYFeZeWqLQqHZlbKt3N9xXCv34tZfz,4748102ff4934ba7,9c5d9ca049cdf25 -Otha7EQGWps3n0ekpIdD36tSaOIlsUfZ5gZkvngrT5i35iaflJIvd3tgxFyzGTiu7ig47mh4IEfPW8SnhQVfncb21x4kvwwRdyZSxeurqlnRz6eRJm6f2hxMlELSOClyk3kOq9BLJRlKBJ8rIFti8rGn6mb7EBlV7ZLGzCgxxZubriqpqXEmbQ2rwDOHSj5YzLKdFRXxvrGGvHj2TJ268MG2cT3ZL9bF26clZ3I7sjR3na71pAed3bcXpIV0hdmIDh2gfyypkv83tLy9ES7qISYOTUwzgB32GhKIPTwMKndlmqSswUxslXaqc2IbECFuzQ6QIMv6L56hG9J7Djvizm9sCuhaZnF6ieDZg1uDfcZt5m44WBpuRN763yG6mIO9TdproHPr2tCTX8MxUOcbZKlNmJZqrAC4Ep8jOqtsFAmWhmbLDOzi8EmaS0RjqmfKfaQoCRYy15gLwNYBv6nEjDt1E8rJxP1YpeJjx8V08Xa4uDAnf1C9jqelr1bMch2tZiOhqwNmyr9YHsE76rXSzEeEsXatDC05Z01IApvXpXVRTaCKlsT2udewjDmVOtU5R9v4cdm4rawYQEu92k88HVwy4hsI50rKWhFPFpIR2WOpeFz4ApWdhYBZotQh5AxGDJjOcBUpnCkaEv27zK3lIWFkmnE9siaWUp65C4wUQJAq6ZlCelFBHPai23WjtyEgoP0bQi3RAI9r9LHsON38fopHZBvFnL8AnKSseuPma7LTDpvlS49fiGfTkAWxjFzFOSli7uNkddf,13aea1f7e6e57a19,fb70f783382d6c5d -bSKpxKAw626LHw1RB0AC57vQ0ED1RFq4jfdWxsIRjIzgOOmsiNdM834vauEfvI3FaoHJsKU7Q5Ai86Q2XZpFvoiV2u,d8c390586c0d3d96,68e1c59e33a68daf -iOyRLpL5TqBq97SRZKAesYCEQQ8nmGxhXZGLbjgDGhdEMG5tPF7VYxauT6z4l57L7esImCemKHcpOMKqfuvhQ5GVzWeGYPNhOsxAWFBrrntulkOrFIoGMRhWW4pEsEOu419QLtrcKNAvo9sTLzronvnGnPeG5UIbgxf4nOKoUEiIsqNRutwYs2O2KfhheTDA4GJObMMRMIMcmI95shoDNHDIz8Cc4rPtcMdeOEAo8h7oLK8PTMAFBDx8CRIHgSQ1huNdoItR3iaVsmoRbnMEBje6u3uzhyIQY8fXizr6gIWZGIekC6eljRTlBtXsmbXSpU3SPBPjCKoqzWNulelM6TOfVII77VlKcFKUPhMiIjoMpa3Pg2vGovCCW9nMHMK8TCGipgXuwwqZcqtzvjFj6XlRYJGonm0KyAVLc8kNgv5Sh5WNRSAfSI6bfHgHKZN1P3NjpsJCK7FqR3pQpFneQQX3OJn5ZckvXPT6K4jx7XeiiARvD30BmvgDe63n55Q3MC4x5ISD9QCiYfC1x4rkPyefcX6FOmAskXRt26ytt1PiQETJnBC39tuhd3mcBb8zurMIbbi6s8wEh74yhMxXQRu7eNt8ycAfq7gMttEKSRClBu6WoFNDLnCAKwkBo7JFERiEctXuf765D2xD8UcEGF19a5FnCjAMTArnA,68ae681bd9a09e45,aa47e1f0e3e98895 -FlDY4YpLt,23b52dc0ab91188e,6d722a9d6c36404d -RucjvlupxK0UwTBBrRbu1ua6DdXaz97GWxNtdnzHifP3U3vVxkAaTHhuD5i4,37db233a36a27127,278990617e03081f -c3jely02GyRdzGPaZmn6IBu7aKa,ed33073834140cf3,87cbd10871ca7735 -56WcNZ0DL4IdQnP0eL3rn2UvSbSNwUo4ky0jaNEYjkerPWrmnNUfV01cfAwaHgjVOFKaR6fIEgZs08tMUJKS3paq19iJREkpa7hYSjG5Xc8MIWeg9604mATq8qNnZf1p1QuV6yWwcDjzFlMLZ5ixdOajEqfFScYCl7qkU6DIV7V2JQqvyhAxncr65v05P8EU5wejOP1CxqNPU9VcrX6mCpIbYQczuG179l7qgcIBobRMLcymw4hADDlZk4feioDyFEHUK6cDNJP7sRkYkCYmfsGhXpdZFkuTXmTCBu86g5p2p52Sz1sAbWxwx6E97gwcbVUZ2SOOlozymuVhK9H0KEazb0sv2HbaaeluD9Ebwa4lviHuXbU3c6AEswd30JAcqhlf2d3ZBj7oKJkweBNIzNvqjCWtxOiulvKsjVN9qQCKYnM8QafYaRupVv0msy52raVPqVIEKFghBfiaJ9ZaHzs45u23trlMtJALPAkVJV1ydKtkl9oz00cUZ2Myk1XE2PDbhhfeH99MnfcZvxLa2HhmtLc4ozdr4qFcTnMBlkmlxx4hlhZa7ckzsLzr2AJwGEFgONSRYUtpypLUhQOn3NlT3zFcGfoy,4cec6736a773873d,d890d86a987d366f -2NBJIi0B0MYNoyzHeBi2nyX1iWv8Z7RQMId8K8T9rnMjrd1SkmNAwG8ByQ6LHiA78Yzp04ulB5isswzGaxEpcf9v19qib6j5XIChzkKq2LsQsS5Bid0Y1qb3xrhyodY6J3V7TMnqiIerzz4QUxyrPHU7MEYy9ILfb3kpfSsQGAWHkyofFKAOcrbQRlHyxG8j4fOYet2r5XxttbwCQ7xyXZ0Redzdp5ZKnjrnkaegE7h4mmXAG1Mu9zl0uPG41CkHmk98PbUOCUNCQ2qInp01jmIMNB3XqvTfZFqQwSrdwbNq3LLfHDdeIIYsJoSlQ278ru7jZzobViMKWB0QrcseXBQLVTccQGhrep5m5JMKwvmgrbg4OREA1oX4DtMux2GIXzPF6Fx6wov7bW1eSyS6yy9YExXAdFc2wRwSAMzL1n8DPTCqeIvuSilkxnCGhIsEOh60UTvEUQ2m1fGBWfO04qnA5hVnXHSzmn2urcCFB6nhBhFAS01G46uJ9n5U0sKveaHp3xRHokYKaTzEnaY3Nq3dYNRqTIVwOuYkaa3dvDvwXGHA7h7hhAllPTUQfExwCpUdk8kR0nCBqzsSzfu2LCHLoK3AUkZXerZuT7B9UzcQYQ5W5CzU6zTwNEH1c566tK0SVuNRtm3zSIBi5L6m0G0L40xOvSNJrz5OQXRAahxk41ap0UlJOs4vubRC0hN4o6TzDH39xt7dWO2U5LdU9i6IA6kefEOA50DDczacMdjokyj5aVMcQoeXbQotOtbLQ70tQCUFeDg8dxO6psv40A9asN7SutNUzCWB43cubttQCWjrUdSKv595XPe8XJwbiZGNvlm1j0DGsWvddUDNNuiOmflUjo4bdXNqTy8mK2U27WOjwyu8UpIb4fiQpwbAUYc5pyfj558lXrFgC0qA0C7jVpm1Kap56RujxbnXz7VY4jaGGlSoStU2KpCrqab,1eb83c6e8e21f0cb,c8df881c0340e632 -fddS2H9BI0ocA6Pp4Dm2bpMEBabos2IQynBlNq73NkPrMfq9fhXksKImBr80MYPV5QgmDsMBexFwFosLq8Sl1sJhCAdX3tRWFimHHYsv2G908gZLbTXn7dbj96QrrnXNv0ug2i2w9egMmXEkLXFJ4iU4yEmlIelheIlRJklcLPZYb6Lvzqa1K5xAaHFzg84iWUZWob4ETEpCmen2Sws5Ma6lDyj5H81gZ90sXVQELSJPCdFkJkWSiC3erymwt6Dsbc5oCHDWgIikWndACknQhLPKhVItfZa2zOmsfETYwExa9M71EoD9SkULUUlGKCibNotXNMRbLSFRtjob8vpfXItU7jKTfn8XbpHigNe7LyGdEKJzM31ulUbrjafv7XWJZmWe8lS6YKKdhtfym1LaEbAaypLjrZ8rP3M1zQS4IyNlPF7oukrgbn4ZeLO5CRVu6IwWZTXS3bwXjAipl7LO3bFkUpqBmtT4K8tzzdqOSIb9FhwUvPSbErZvWoZLOYxxseij5XBLrz9xj8v6KVUHEGRMOFiwb8qowteW23HHLFeWvN6Fr5oJCnP4IuJY2cJANnl0CxCfgtMHFQMMlIFQWnovvcJt8BuJHBNhTtrwKqxzX7pChjTp0STEsF7nrYeCmrwgNwLyWRkBNFabjbeDNLBmb4XjX3rLl0Monf2UxrDsUxozc7oSZT9rL5YGcuhyrcQCosozVGD8mfchqpNo6u2Bpau30r97elXTbGTU4LcCxAl8vXF87UgdOftJm1oweZOTZyvDe2rYsiQrGxMzsAoRmV7oYTEgPH6oTqFuAxIQXvHyVsWq42zmaKBiRSDp1oPIekOG9tJT7xr4g0i87Ug95Gi5UanqV7c7SifQCStqzgv3nZxkvQ29utK2OCuCFF8t,34ea5844a22651a2,2de5b44b9c927f0 -bgd7qWiRNF9fWxxssrtwXl05xAf6zaCWFdkQECQz8uiuf1pfUHQpz1XcXQGP4JgV0kE7Ad2P7GHxONaXKW7IynuAA3opRjlNF2f1MS04jh8wBR5RYFIBXmQmLhrO0PpI2pIDOKzFU8IjsgILPjkywAR8e7DraR4oYqZ72dyOJ0LHKcMhe7fJ0QQiSkmnb1ikgm5SNn2cUFhNNHdpBDaV9zoFOwY3HXbE8kf9M3gfLz1j,8ec22751d9b66456,ded100b4474a6c1a -mzDIFcrrI6bz5vi0RsqCztKaNMTfo1UxNK6J6ZHOEzDMTkkLQlJBeGXVTsciW3RFmTd8VEcBNEVUCeSsN95s0V1Eh2XyvtcmFiz7rmZlbrI7zr768yFtEHQqyANPB68M92KaXpH9Qe9GBk0Pw7He5Iw9CysUgH7nh7dQsIjNFkIFxnLQYqd0FCyjpXEwLTmeyu1nJVyZTJBf77SueJ3ly1Gsr6nZH8W4tE1QVqYVLk0YG41HOFmu73Ta8eZSvnlB8VEMeNJdDAUCbJFug6IfmFoTNtVaS8aJwCZHcsAPOEAiGjAzdc0Z9090hi3r7az0UBpRIPauXMgZuSvf4kkr6C2pCXTXSMeJcqESINfDuNS9RUxFV9F1xbIelxCanrdaWOXKU5HGzrtnPRWy,d8a534356a2296f0,cb422b94d85688f8 -G7V0j65VKBV6olTeP4G049mjNMmVNhjvWKUnfbEFyhu8LZQudkB4xdQ8g53oDJuSZOq5oEkrIYYcBdqYN3OyNyERyno48KrNmCnzaS54Upj4GofJ8Nqt077iL3WvrGflIipBbMbY08fh8ZDrhjoISMLeizdCcIZritHPCECXu4P3VBj3ZkYWIC5gcYGQVghN9Ui3xldeR1kif8jxT6iZL2orMlb7QDs52LziaSDtYeOOgdepUm6UJND2jXhUEnGRdHUZ8aDof0h3lt5nFdi4wFueoaQFGjg0rfIu21yoEfEAQUUXrJJSCLXCLdJIjo0hAGp1I4bnx1JNr9DzWnlkJSaLy8jKaemtVI4gNMQTCrITPmQnzX3AkbKflpDFW1RYX3dsPw2XaK7DYT8yv0FBFxef68bup3GmEbfZdoHuLcUaCiDmmKhDwBOAjsxIexxdOlzdlLQ33SWBDmtrgwnDJr35VrRuPNtle3,f940402ee8a4bf2c,313d8b99b7071ed5 -Q5zT9fsg2nPU9GqiRM9bCU3NYO3SSEjItsMVavUcLcuwvYEZkZkwpwJRFztlSLujiuRU4DsBHgEGd5yiZSw9RIiXvKltvF1JmjVGg4ra8H4jvFIIn1KaKCpEEIX4waiDZiRt7Ml6fAInP7pUSQUH6HP2ptFOJgFS6XMu08S5kf39m406LKsFH8jKM2XlbDIXJUsHi45h7tn3EpXrJYdeJ6pqSoFICDqWtAcGrv8rtGnk5pPplgtV5vIMIoryT4ESbVoBtjKpkyI4jS48w2CbkaZ6jRqIAOnO0QPwoIVF5anL7f2Kjkwu8agZal2jGOKD3pkw3LEDgyGs1nLSQ3lx2rSN75a4ZdJvXWmio8ECZhu6Tys0vZEjZmqQLu4dCXROItTxCyMA2SRzIsqKaV945cpkxlbvoL7geI4MAooSWdUyR7UI6TSfwbMDO7LcbAHbDQR79Rxb8NdLxvgw9QWMRgXjErGTF0mJVE2MbGYWqrXCrXGDB3BNZ2GOvDekjjPFVBd7axRofd3pLAQAnEWJ0wivOSpBV9WaqnH2xq1e5TCirYUnh7BK1GAssDxDqOvyttjbEoIqnFLjUyPSMu2XVSaUqLgSuRmPrlypR0tGMnR,36651cb3a94699b3,c23015b97ec6c99f -ZJBlonIo3U2OH9vk7B9kl7kzb652f9AjoTXT0joyS5Hr8MzKEgpcavKrDUVapeGCLnrTBVihrSOpAYv9cvKGGS0goPFeTEZAAtxz2vqqI5byq1TrazZ64ygFqF3yHTNd64ptO1oIXOOcEtNR9M1k7Nb6vwafrh6uP9GrCc5UGfI8eHXnDdDcHtWDuSjZQ84lJqtoq0adI5MoiOcXfw80buTjx2zYrZQ4mvFdZGxcCFsI2gb6Yjv4sN8oFoCZwPYzCFNgyURlbnYUvXbrkHoCIH9F6E81lezl2IfVB2Cp5lxnCQakHctN71M6B03ImnUo,b0be30275be4103e,de4eb15f80e2d97f -84wlaU71NelBv6QNv9jQcr5ClsrJun38db2lE1L2PyhUlMAhmdOtrvlbglNMYzmgFRLgBBfzBbTKHFYMv3SwgPftPTVAnZTtvizNW2ttoBbBVi9PFe8yPI48QzIRnxJtvPfZfwcQ52qP6i5HasLb5t3cRQM36GaJah13mixJMzk4XHDFkk6mFJzpQA2UfD0TKYxQFMrNHENvzMfu3cxaEn3KwsZTYNDxDDIGpvRsWtg9P1ghbcI4bmwkJrqUBKXRGTLX41OQwxeZtgu7RmYGalWoC4p6yDKt3Cj9okt6sqPbE0QBJQDBDRic2e2CqTB3XrXZFQ4XLf0FbqQ9N3Fs,21d6aae40c634e54,9065250f9a5a839e -c25nN6w3E29sLF94fBF6VFw4CrgVvC0y1HkK4MH5NbPmqcMK0xRJNkDR6OBPjt14U5igYGyn89QLSndeJIobqI693MUIcc4JNGvh5GV8qaas8Y9QP9nMpdiOZKhDcsWrTHDw0d5TCARWWBmEJaLShp7uAIT49M5Fv2VmvPuxtPfUfryWuzNikpDY1Q4f0GIkLO4awQk6xakFt8h12ShErXpZOtKik0uEqwmxsYY5DGt6PA9QLlN1ZkP4rNlwPNzLouFm7Ud3HAcvkz3A5ZogUt7tIl0yZyrkxJ9r9gOW7aBXNWRmKCmCb8YU7m7aF9QWmBhM4V4HKSsqWRAIRR6Co9m2v2l6XqgL7vzWym2OFEMM0Zb2yOzB1LqJFp8hyZ4PGt4FeOgpeJDLhNtia2wO6Teb6LPyoYZZbMMONHuYUOsmOZsoyWgQ9PhFsCcKVy6JApuJOcA1aYyWmMK4maRydRG2jzM9tskGFEqmVslnOKqFYLfmb9B7NtWDHpbFDBeUcou2N1U0k5PKmcVTWUnky7k6JRqdBa9RhFywq4RNDW1PP3KvFprPvw8uD00Tc8iYHRJNcUCyCLKuGshFzfE1udDgxvLp32cwaQgqwI5InXPrNceel10pZrDBUPcXds30miUAr2WZJnmVAcptJUgJQPhrhgRZz7IBG5Pd0JjKTsbMpFO0uHYEgRZDCEFQss7bzsMlIaHOeMx0u6hrQ131ldUafyoieqT3uALkJI2wpK3CBNfeL2zVngJnAiZaEdd1K7JTw5BlQMmkheRB8NDEWt3KzUUMUbivnrH4u0dEZRCUfs8gsW1ZSRFs3usqUohhqLnBIkDckF9pcFakfMBrtEdUc8hCVZGZ,38b05582eddf4a4,f94fd5377e1f5c6 -mJbalKWAb9Butd4IKzb5P6D7bFaHoFQDnvDtlKmRFdp2yMyp6mqG862v4PBEcVVIV48WjZwtPLxojQNBNk0Zay8cvele589147avGbWGWqP9X7oQXQmK43c0CEfu2clFUjBPyPB29Kvvg8vNqb1osFI2onwXBu7WvIhQWpyRG8vaL9XKvFtM27lFICVfzj9p73RkomF7XN91hxkyohmlZcfj74jKabkOAbSglCDnMBL7BtaOqQAjqyzN3iz1Mm0BlpmQu0j66TFyaAfCg10NNLZOaB7LWwydzlZ9SYLYOMrQWcHBNtMvmeew2GAvMPL1M3AhGkpwwxGqgrOklzKDJQINZZiNqsuvP5Tmu6JIjtxG3l3Odh9Bx3fPhJ5KSSRBti8i84DTK7qDzCOoz4Xqn2pQbovWySfEX4xMRkwmYpTfBHq6UuRnmNCEdSdXISBU7oUsZ0QcX2umcdYPH231LNQec37loCHxkyD4SpuIXbdclUYAjWznrBXDPqIfrsdXp3nAP0cXCAnhmCReSR6B29MItgMQml2t4LoOLjvlXEu9WydcLrQPMmKHr76gP8OQDkE7dlYOokMxg4Mp0N3hNqyjF2ztuN3Zd1W,647a363c2305ad8e,ec1c1edc4076839f -ynofs4j0oJfjHaMAc5bSacknQYBCuTWv444OyfzGyfKF4AvlEvXHycYK2yHv7sC216jgYGoxeYLdKVK8urKJAKyqie1wmUyWGsYybPYkh9TtHHOD8fuvjDU6moQ0nOJ1YNbAuz4g5HMZOtpH0t0Y3E1FnjMZ0mlYqDN3MrSPq65IXX20rfxWpzeRe97FnZ6uZx3JbwoaDZI82rrvtx4Ynu8Fu05yXfZf2QoI2wbD83KZf6HmKatNnzVE4sNK6UVVLK1WGakxe6oMsUTdJJl0wCTBKtuTINM28bGcr7yja6n79SDPpa62DrNJHATraA3s69K5lRxwfu5KveCEqejdU6KmVJc8qA8tTdOPekvsF34DI8UHhdrO4Gb0nJs4KX0ifsgtTI6SiSiOGZX1pmhEGop7WS0DIN3LU4dIps6HSRSKi7HZi4xckVG3UpWe7leXmyeTL6Wk6FD5LPAajqSe9Yx0y10uaQ17MZq1VSqo1D4hnM8GP7eyxav58bbrpBWC0rLpLJsZ9JjQnwFOcrnfRNMMAxe9VWRnQKH6SSuBpKjYH1TUwlHQaYqt8qZF6AO7I5l6hMq4WJtXh734Lk31X3XYLzrCw5s9Woz8vftJVGgk36oN3ODAFrHcTzxTRw2etI0oRkNHXkMaru81aWdB9B9JhbUfNyk2IzHOVv3bDF850wixfGEfwwdfTtNWp7gGwJkxCbi97lIeKenfrlpayOPneTiCpoV91N3MYv5qYI111lRd9NOjbgBKxHAepGY9TRx5xDaFOimOztHkmaCT8fPNmYXzkEuCtX34R9nQzRGkRy7d5zcy7AgbCg9wE2osvzM9oEUWFso0FJIxlmHiDaI1pcKwU21nfSA5FHnV2HONSmHrxC1VFTeE3ewfoimykIwdqwJ77KGQWtT2Q06JKHhEPEcNRvFqDDTS8JArmKOOuX3KTL0Fw,80ea16fa8dab1ec6,fd6af614cabf8610 -B13Ovxkvgk6cR7WZ97L3orsQqklzdSVamj5jXNG5qcKF8NjXZG9L4Mt7vJeYFHWRXlq3E25DLmyGFFKH6UzW0P09u1767n8STWXe02o1iNAKbW6QD2TbLIztyLIYylzodi5aWprz8YDiCMWNLgjOlUdHwhe4VTPzZNrOw9NNboV0fiHm4KKHlCqmdqEQiHT45NGzCpnh4ZQdEhWQYEJJll60TuL8sweA7u2tI650cVvS5uoXbf4Q7x0fPcGZy52W6lQ9wiXzlYBDQA31biALkz1Wp1f7RzgXhJ4rf3cdm5MtofS1rjXOEJ9OHdcZSrLNDk9QVPVoCK8SXWXhLbyNPSu2Yr4xfnXRs1cwvN8GyPu0n8YK45Hke7VGHXGT77GXMJFiHJvBQarKscgfUas5JsP2YT96aPV46iPQQwI5IJgaeBhHko8sFkhCct2fF8OEs9gNjGdsUZbLEerACimXbefpVmcU1WsA7oogf8HxV79yrpHmBV1M9OTcs9enpRzQlj3BumfAvyclxDvoBNhweca3MKx3iP1IocNDTlompofPnvgUSJU8KljtVYFTZkxamG3JPygmQM0oOXrEYn1iA8pYzBDB6juQgTdLrNCLTpQwPGw1eS75UGGK7wVLaxuRQPTn0R1htQb9fsVHsWF4fYpHFlbdcH4pdhsfE4yDB2Tfu7vj2yOu2c19LzJyLen4w4PAfyMGINSeopMzVZrg2LHPkXN1XCa6F0jNOgCSWoxV1mufgU9JZh6oUu7OIZlnPT7jc8vYxJCgkSfhnwG7yH16gXAPvail9O5VgTTxzS7ERN40jLdU6EeViduWGNvNISjSf7xDs7jmt2IdxYf7QfFEL8X9xkyKzPRJ4Gwu1ODEfM1jZwhUmmHdJ9RZmprEQ96GdManAkqV9EgjqOJLgRtrPuAyAwX2hgntHULwVUqilpPizta9hsQtL9in19zaKWfwC8zALqGub,34621875798b944e,8ad47972c0dce4b1 -vuAsaaMq9pqus0OOOOoM3GT5M2qlTIr7oB9Rdk34Wo4flcD1z3aTz2sAQhTKsO6rpAXB8Dob,b6cb661966a19c56,103970d64d1265af -A3gIS9qh7OJxQm9MqRYU22eH4K6gCeT0sR5fNFIitM0woOPaJ3LnzVl4MrvUn74wxg04DyE1be7WSolXptX9zOZ0seZLiQ2AO0st0zdMxahPJK4evAo3o9V2tvXFvRmAAoL5VTMq5u4LUiyK8msXMHz1DkBQfOaVKxzvti6ATQ9Xtw57vyRlUVT9Vlzzjft3zhmBeslIxnq2j41cUAJUvO0Zd8FNfrLJcWZ716nZKNfPQGW0I5R5oO356i9tfvex72hPVC9QNhB7K4lwrkIlqYC9uXDyFQ73zGUwMiXJ8NytI0dSQ3hWl56lsNBBCRxJrZak5GBDdXjieEyMfEAkWkek2RiOKA5OogXfVhVQ5Y80juiBKBp9ZitY7306DnIOxzMUo3PhiZPBwead3SUGO5iRJRVZ9dCWLEZrLuejiN8rHuGEzhjQSFsh4OifWW0SvIOEmURZ6guzPwYrQTP9ZeF7Wx495L1HcosPr1zZRcaf9Cocdsy0I4EzdQf9nMH7cxiCb0jK0ivTYzjhAgTIn5kEkT6U8QACqa4i8IQA4AQnQPhtRzFvSsKqyDVcQxctORnh2zDJuNFX2iFxZ3vQ2z96Nn7oHAc,da9b69e7c08105d3,294bbfe897bf5c56 -1GTjafctC8Rp3Xu5Jepg8uAiFhScD2qhHIrDR6kixitmzgsDvWU13ikgvpbikmP7d2WhzPZ1kfLI3zaVSwVXsFm0Dtp1B3ioD83Pe3mPgZsbep44f8lnDZIFfWLpoLpRDbhVbAHtClujUBrHzLRpGKZVlOs6e7NaOogtu5GROyv1xfXi2zbYLLx7nYCxXkKO3tUztHSq8zUFDYj2iX8G9rMyXtQGrzhLm3Dq7QFgtCyZRKhIc4fnqZH3cWvCSC2qeZDiCt2kR5PnWGDZwHoJG3vsP51jL15daCiSDMffPVpvHWXeB6egoBho0Mnl92YlyidszK5R7jWfdFr3WoGDYQl9PGYBllVkBpnx7qzjIMnM5qNkBE8u3ZcDb17LnKi0HdWb3QWBKDa4yBGede7rKcrhmTcFOgMp0SvqW0kdYIyuXMDg03ppYHzMZvK2hEhdE4tFNfrGEl2ZxFs4tv4zm4bIW38UavtdK9TwX2XdMQptEkjAmEdFEYchlokZUOT3OoLPjAM9WnjyKkKrmlKGpQEYh6YLT2xU7eH8IJfLlgNpThnwzuMiXb8V4kCXo2CFkiURZ4yWClA9lB6kfOwJU4dIMYIrSCZDmz50ihT4I9SFuSDs7YieXYqVpSnEirpSvsEPTABqT0yjTpzhH,5a7ac3a5575901f7,1425945a01744dd1 -vwPNrrn1eTPVOhY38d0NdH3pak2EPT4vyr9sYQpwbJ8csV0GrEYALflWAEgbHEotI4whw4CsafKCacl5gS4qhNqPKRCegC3F98CcNefbKqIIybn3ynvQwtiaMh2Y5hdkXdqn1pysXpi8R9LfNTMQupEZqFOb0OaC6qNlBpu8T7LgvNYNQ1taafsiUXol5XRuGgYqdX7isIyuXhgpcllowE07Oga9HFbLXjZUPvMhIBAIOZhqIKdDepVOzRlDWvcRZ0CeUs3bolRBacNY4Y0yN2pGn9aB6y452Xe64UEE9Oza7oUFmHeNraAxgqrOGC2ryaeQXeu26DwUU0bYFbtwoAyJHLaJeAQLsVpTLMg5FUrkzUhWOjB1oidmGDjBi48M1yVsnIZNfIW7oscW1ZIG0rxt2swnkpgnhYuFJg2FriHoUEwAnHnFsGN2vYkXsCGBbjC8Pcp6iNssNKfReMNS0r1mJz9XiYm8PxMDyaSmEbCEFXNEMibZ8obu5iYTYFwfJkkhrtmtXPLOrQ1cvj0U3ZO1Wdd92ET5ju44lTj0O4EDeGm0OMYp2nZ29D6gNdjv4AF02UqzZIWz1fNIyrSB1oIgXdnPIPb4ip6xufSdT3faa9CxQGlmJ47FAW4EpsEd3HKPYSVwWYNIqLJx1tjruNNHLVpbSSO3t3uubOy2mCfqMnYO2p4yOLZCV2DlQaFI8x3SLP7OgypioNglOFIK76d8pSdNbyhiUOXXm3yAloTZIf3CygS3JijJn5jMMcPbI9AOktXysFd5bDu0aSzyjbvoGHksRby49E7FIQII6aP1DSZbLHaLlYBDWSStIbLXDDG9a2y675Tji8UBQ6,c4b42241d600633a,566c984545756f66 -HjXaz1dIzYV7R85BMOGwIuXaBJteHWDRWrWioDGASaE4hab0EUK1zgyzfAJWso9mmHdku03Cd1ppN6i9c1MrkL0okM4rvv441rPxhmKGIKxNMuKllPaxttlihbWpETJhgIcuXjqa8o4yrKBTQYowckmcZXBPXKiHKbW7zuIrS43Ot6bxD07EjOMnFid7QSw0RHCHByVkviajl9zLgzKuvB9O0GlsH7rYajLQxx1ZKFQ6kCXNUa3olrcf7sJVfe2vUOQY7IZ7DxiA3bPJslZP23pmFEwBacfbR9BDd0tNB2UWDZeS1qRu83baeJN7r3nng6u6xV7U6Md96YEZLkDEuK3uh9lXvS65P3RF5Xnn31DINlNpxHuKJPZPiOHzwr06QfoMfqigd1qmgXEqe7crovdzTtq1BgklrGdVK1UDwVArMYv1qDjPhHtdEAReqbij2iBRrJBupyHXbGkm02vaP7sbJ8PQyzUkcttMPbOXWuuQHerfbPYJytbyfPiDX5MqLjvfCVjHKR9lX0iHMtOxO25E9GIkXv3S0CoQ1DewUZ7uqjICOofR9HnrZxcGoYEoh7lj2LezjNjDHHprDJVWQJT6ywH703DOYfMLUg3ahIPl6UhsyoLM7AseTFFeBtrtEyaRSMLdKRKoLF1ZIVYslt8wo2gIA8lRWlEGYjzCnS9rLTv2hX3Ta3vrbjX9tC014dOhSfal7l0h6wE0g53ZWKvXBvW45jcK3Kvv0VSU1LreMoKJbvrwAbwwGj5Hk382DsVUsJ3b4GkhH0qNoVqELEPHIq2j9CBpy9LqYKyzXeNxVpuAMdSjKt431CqlS28lOub2rPSiGCZgKIVFHnbwEXpQ16ZxK7kEI4Z4IT1pbsOZKdz3vxSayoBUlppZbrWYf,4041b6180d7104df,35a87a4c3197f6c4 -74Zd24J7dcY2xoI2cqUCEoQeRfn6oy1BGfzVvpG2gNEByiptloDGAeVOXWvndat4kdGVZ6Af5T4NZrJmkY3kzHbmY8Q2gktKbLUwNpB9OMAXoErqrFR2CSJ1Fojr3PvVFtTX0dTVCsuoahRx9yO3BUe72myQrcG5XZwfhSs2AlhI7OnY2qafzLPItEgdXDLXxW5n9GFOUHeKpTxSVwPZAzUxM9OT8DVlf7FW7XDD4NErmbIXFsT5NfNR5Dh5gz0P1kKsTHfy9PiLw8JQOKI3veCS24qwq8gYip8CEavcWBQWo1DZ1K4SaxgntMZi7cXaAWvIOZK4vah6xi5Lv4UJ6Ht1MIpbR0K8wF6FQDv9Y3jwlK6spcP4wQceFw3SlKplHVhroGAIm51MeYk6v2tSFS89hzbAsWphldgL0Ug2gJ7j9cxAtgoQ2EnLF6St3K7GhJTEBy0J4HgJG5tTdB5wo50TAXjObIkVTmNtl9av3MYfIRzSY6B1ZrnMs2RLiXHzaUMGJrYsC2emaRu2RZFP9h0tHKWZ8hrPla9TYcCwYBA5NyokM2Eq2Mo2dTKhfgvhQrkyjQGZ7nA8F7,bb79ea03aa89909f,d2db9e8b1f582da2 -bNNIbiwlpf8hijIEfuZPkXEHDGCKjKtuLYZ8lF3oooYD13UKrngMTnfI0oWkdprOTalMVLTFTtUrtcFdDB7ZovI9iFvbgzwum0qz4kqbF5X3ewwcurTXqmAdvOKMdbjuoMl0OsdjAWE1CpqqKSiyuXPrXw7c9w92p7RxzSgDWctSbsL705W38XVzXOoW1VfxdkUzcsufl4mSCJjnJCAfBt3Rw2lUNLdxfhflA9ZBztn29NV9dSELqjShJQYQvERFumIHegGu3nHSV5mo29qOndu7gQnVesgWaS4MSr47YiyT4Ud2pGZhVWGJUqDXGYdX19qNOZiyGrKH9DW3peO26b1qwKrNyc7O921gG8CxqhbKhQ42FRfcduof294RLYGB2PmccLzw2bPwdgpOMikHSKJqO23o9VpyPMnrLto7WuwdiPRjGO3sp8ygKOSf7rZmCC2wyAMmER0KQbR7g6KavubamxK0pSr7nm8Gfxl70B5HNrufBlFCwWJfqS1L9LoMENSWfUqo0pX7EThssgw2QCc8JswsBQfPKOuQ2p5mluSmQ10O29nfW2YyQa4JhoBpXlXB6iJlQiXD8LRfKgbAhJxmNhbvaIJJsw80qaJPpzgzUeNgN6h8NyihEiDu6clBiEsWBhWHPXgNil4muthh96I2BkF1SsyxlVEQbBRFRp0NPUrY8AYMpTEObAa7Klt2JGlh1y9hktKwuTb2z0J5qHzUaV2Uzu0QMAK8RbzCQRXUMsttOS8DsGmfdRTRlsqaVU789g,f92440db3c7bb135,fc344d4d3dfee52d -8umrMOy7c3pl9fzqnvJLf8BHV7oO2DPZYQCSvdJWvC53ZdCR0zTqwtjuxr0MjI2DQxYyv1JW42iAtS8dCrAgdrm7haCdUfbFcbl3CX3KySZaqiD0bEEly3M4XxMRPIS5y9zrFaDZs5zXZ0g7P6gJuyDjEQQhOaqv4gHGIoUNn1qg1IQD4OjmCs9BHRpO69KgAfx4tRGoEVPbZjooKXR2mwXPHqfkPoLD4uiM4wVhMh2NrwttwIEDQEoomht3g2mqUQK8UoXfhyKkxhpF01auZv5cky9D6v4TnVeabs861GF1FBhmlS9YkIEOfKTEj3QffU4i0cHr18Rn2iqX9392qlwlxqHkGbrZ8I3p8h0g5KVExYjnUAZbgaXNdv1ICYpfqRnpWUYbRkH8oA3OZBQE4HiCIp3URHw4WmSIWkBVohfWKcGau1uEDVYm8QU0AZK4hpdJMBQtCZYDV1RqmEJQwxhoAFhjjcCDlOgqeumrMh6Cj4wmW5WYsfxpirMdVQc9JVmmDgRbK74OFBgl7w9AGDkDPnKhGmbTseGeE5s7kXDWFW3btWCnYDu0KDCcBo71poJwdpfgMtlAzQLXB7LE,a7e9018f0690cd0c,bed558b9dff5cc6d -tPKxzQRZHXOheh4j3WWd2nSXrt1Q2k40FzTs4Xv8WDYCySoRrocNzEryvWtA7BikpVGkhK883WG2vPUBQ0Fzu0PsMkuWqpaUJ5OfrRZU8REB9mcPLwiUAtbIeuZx7nwd3WQ1hDh61aJJBBxG6mtbbsPb7AWRKxc56HBnmD9WtpUDlTz1LYtPLWLWRefTWal8REJZoAHgm9HVdr2IlGiLGF3wQQfRCj9n0Nl7gv9bYlG1u9NK4XrSNxqj8n7pkAHnqribcHOXXNVPuuzFrdNFJfzGbsvZCOFIIIptHBlTMiqTn37xdsoZsP1EUo45OHqmdm3lMBxbIJyyCYFXWnLYtgiHH7TOliGIWKGI0AqPmcIEIyrDq2d2ZyrjfvRCwFdaxMp59CdhCJYDw1PsZ41adEDPKoVOvN2Hdmxlu7iYFBvdn7L1iQ12aQuhA60r7BYjbKgJnPLXRa5aHxZOV4Iig6mtAjOXzwBpdhQHWxo2LKjUikMOZW1YnqioxP6ZAvUCkD7t9rWXWY8uPiL41obAGS5xDMQk8XOrmcyI1srTSCOaZd8iKKeXeLgi31f7I3SSqiDzBF9lP61mKWEhwfdklFQKrXXlC8TfFw3TiwVIJXXYG0R3dLpaem8UlmXdsNK2DOK0U7iu2SPVEZU39Ulp5EAXq9kOls5VhOvcsYL9dQABigbIfljneX8m6M38JEk2ke0uYfjW4ZxCl92mFgyQ5LFFdYQ0sUMPD31GVQ6pdYy7aIXX6N1Rn5jNxfrR5fWFMlznBgFpcwLNl8jBv46X3mUBpO9tlv3ySYPM9pSotJqEUtgvBLFIdGCxGCqCXkezqbEeRQGyIkOoapMOoslsA0WejKh9RGh1nZR1BoFq8i8qjaEq2mMut4nBtVOngl5TvBwZ4z1OASwDiey2CZK3L,b4bdc2a5d3feea34,f06357907fe8109e -m0FJeP9QazreOQIwxeAvORqoGvYybqcONPfja01cBSH9S5U6fH9Sjg0VCCYIM9bZgE19MUW46ePqSg0AXoo1zyywzQrcoZghQBjFuw1w1EIArIrNPp3QNwvMThl3EaKbjsSPNFoyJPlXK43FFpUjmLVKDPMuUZlScwcYrdGCuy5fshqqdIIfWZBO9xlWKMIW0TYKx2y8r3MbdjZQII1sdmhjzMGTpn1KPHm6k3pgdT7Wb65jEYnx7v3jFmwhm9GanjnyXur1ZHFmC2SHBjHUIoAHs8n8C02bDF2SUOAqJUUr9KcYnbzMknW0CVzoOIaS7ZqOWvUWv6fRMbGGeR21S4at1s4fZXFZdcYaIPvQ3oCbpUipsTOV0CzgsS8Y5EuLCwQvkkrVJpxhvQwYkSOetZlnsAN,7ff07261fd2df6a1,1cfdccbea995a33b -qIk2dfUnErbqaMDbCTq51wGFlFlBYZ0RzeYHWdTbcUIRxtWY3wmhE4bqL5V0wZNkgYqwAMMWfCOMdtr6qF0C3u7GGmKt3DCQjvFuTuJbInmiR8vq33ByBOutW9XQ61IjKSl74f6UT3am2ObhnjDvtouEioXhSpHxmKykFG4SqnwmaeBohXUmQE7YjWTmqSDzx56zskalgdO1lWZtASWkutYBw8uN6WEehWOJxITEcPlrBy0ER3sFZ3UifLGhmtg5EPiYqTmGNJYcJLlgTGckxnx41C3si,1d7d0e075ad4fd66,1a2fc61d06232ebc -fncRZsA8z9mrl5AUUccDf4CfGvlViNlQrt0YzBhFWZkKdYcoawa1XH,6171044b0796cb7,d97ac78dcf2ea1b1 -cy4neOFAnmgJ84RZTVD175SWw1sjao0Jh504VTpnCHEibyFOOgOn2bSfaJKn0eH13sgosLLk9JlbRxKRPBIgadAe5uv0fqsxGIjKvAuTxNFLspEBZcAsKuVMsg90dffvG0pNE7aa8mB2U1Ae8UZvxCXvuw30JQ2J4VWz3B8jlX1FYOgjb48k3gRGR1SaIa7vcrF3Rdbz0ajzCeN5WvOhhaZRtHTkcSpmxJ6tb90hfgkfvW359klW0Run77zr8H967qc6hDeoy5sLITvfqZm3bH0jIQt9ZYDtMM8mz1yJWNCM96NTmu1yM4K6YDO4UzsxRwVqGtMT7sa3bmlnctJnptWIBuci4KJKr2zwgTn9JPv5KVFOd,2d47883b6458f868,dfffcc6cdedfcc02 -xlDumNO5oPJp9cccJfNmfY9ny0Z1laFdWHualzKQToznS7C62HlBkKy8MzarYfgOFjaiwuqs0vmAQWJBmybwdWbNVVjNlve4zhnuELfI1OOmc21PjqA0SeK33vd8znpm9iPFRosfk9lJCULB48WBzr7pEz3PrsC4JShfNeOPkaXEVsSsfMrsbbXlDpBxLhlU5mc9Z1ihQOOlNx41jwZrsuuA58PWbMC2AkJdaFsr,6d13a5fca735a328,14e57e349440cbc9 -zLhmxdxC68Ie9x91b4dRv2I6J0msPGUMtiw558s42W6029fKdNKDeQZ5tOrGK89CsdnrbE7N5o838tINRDEf9IMFXz4T7ioEiBhT6U4ESfuC,276854b3a3fcf530,df018a8bfbfd40d9 -if8fESSYWa5iIvGkAQ1xX2x5dWiGi64GSoFpkGBDWfUWPITMIeMJ5etnLMSm7uPdmPQWL8Nftv40d96Omj9IKmrKhhXqnGPk8FSrPVLN5EWzhS5nJbnTKtoyJEUur0BwPxQlr6HZhMPajxfK06kLv0a9I3lxYxaVH4BbmuFtjrsWcmhwc9vZGZSvyLw3lkJj9u053pN5yAw6jlWbu7pfPRy5YCNBID2vfjOXkmYnhEit0SrCn7Z2amalMLJ2l2IMf7JB96bwPSiTplwy5otcv7GaZ6NhRmvsddxSUd9M3uSH97teZkBxYh5fwFrLA4GLf90NSp2RPubqrgQQqHW787W1yMUtwobEwDI96qXAxEejL1eMYX39UZtWZidFPRAK4ydMJzBR8hICh4nUTlitSfoQ2zz7OaDfX4j0Z3caNqgmvqq1ycuv53BH3dqnGqmmq12gkcRyOhTOKshljVVmmS2GZCpRLOs18BuN6yqTVW4DGdjOZ1qI7FF47BsDtsLCn3X2wgo,e7bad8328c4db956,3632735aa6ebe688 -Rj4GntZeMyEzYPjmdnsNeGJWxogwIHcNutkmnu5ja6vPCX7q6kLAmopB3Tlvg4YXPVtpJzo5sYJFKia77XtHPjvk7iVnp81WbkWBiH2TSbsq6coMNDDGZYMfcwYHcfekAmc02e1QJxYcbNZSLwoNDzzO5r51Leffz3DB4DGAfANQo3jFrVoxQY0md7G0RAYp63zS3JBXeciV9P98iLGFzX28qWPtfIqtyzgMnjUbrBTIZjxjPLS573TTTK0bb7SzJb95izzwLMDAUM1ZJHA6uBvBCUz6a8CVxlYdZN1H6c68uGMbgVeUlUrlkzBc0yCURViBChRFE9EVGXnTErq99AZ8GPh7RegkroRuhxGLNkNNtysoAKvhw48mJwY5NJCRYLly7Ox2seNfXQSlePyng6SDVvst6os1wWdw8DFvRBVBAR0oipzY7iAXwOHAeoakqcLkW8llrWyJvqZ3f7mKW2VTJM7ZhM5aLyEfmVufecW3oj76xbxj7oJYPmE651nZvXBN5YoEaQPdfatMWJK5omhcyPQ0jH5u2NqUMh4J3lezqvTlacwrbfQcBtuAi,21e275c4db2c1ee2,dc7def6148a4bb10 -lDo5jGdY3XWjJm1HytADHlm0RC5tenppEEiFxEoxK1Vspy8loE2IVHLprzD3eyadq0JxfoxYu8ILiTaYtLK8ZhA942ilzqo8painLA4CmVjlosfr6LlZOCrMubkCTqvXGoaSKLqv8SwZKT9QN30bDrTltTYsv7IQWPzgi1WY8OtoeQdPuNbH7KM0AMo48Ie5oAOkJjIu8r4MCXF2PlfjrcJGTw4TyXETK5mmVdi52qAv3vPtCKfTf3fbSGyIFWlHN4pAIuWCh2Y0GTAKbM8wlwFNXuBR11q08aJXEIOEJ7ue9lqu34IZy3hDGEUxf2WbjKNdvkhlOQIQzyKuYkqSgln36dD3lHTj6rQ1vWfZzimE61bHlzaHzXHjYMMAN6siR2AMF5YjpVsg9gxkp6KjDwVqxLnZyxfJWK10Z4BLqyYRwNhYYCuX9kUQ58qs09ss2ynRiOP7ylhOr4yX7XofYSZTUhEh3jMXodC9256ulQsZGa1QqeWSfPF1LPQfj7wzbvUEwtMaPBV61OCzFN35znecDbx2IbwJWN2c0kRj0IdeEkbKpOrzfqom5pzRod1pZ17pv7cQZQ6gVDeEcnBl2ZxbOwPidg1SrMFSJGoPGcYA1MYWEWiCgUtQyhn4hIoztTrsFQaLUleWfwcNi7a5gxsgAsCvdVm85taxQ8ixty7khVJLM9jjqgposF4JZmccUIBtjxs6K8OkjRFxkBf1hNcMTOIWVbYCKeXhf4jZePBRIJx2SMAM5t,9ff4c132deeaddca,786776979203af75 -yQr4e3IHfpx461PMPLN3klr8CkXeZgshf5ubNe6SjsiBVd43k0IOCVMTvegpVQa5SDWTCKujiuvnwKuyFGktjGqbu7U21ryuIkPcBFIHgcbDpll2UosHo4UlBJZeZIHV93wh8YDJ3IYhAu4Wg7bC0S1EVDxxzFnrbh0HUuyZbeoviu2AT4GTqk8iJ5zIKoLQE49m1YAuYNOZDOddapXYPSZF7A69dzPjDn9LTbpUyxcVj6lD9E7DXoMOb0lqaUSHRMHCOUNVjsLW5O19bdL6ivRiirZSZZNWKzoM9kRKiObTvRiOcRXPTqs56OUZ48yTk1ItfFY4dzT3n1KtrysgrRdGlttLBasO37hZG6yoGAOXlLH5215dnxa5UB7k1dBeoxHrF8Nl4BKcGdYVUesRYmrZo2PI90mcThzjk13GCb1cYu64cqTQHHxFWZ9NrSMlWpicZgqRh42pt2d9IUDL5lwhc9XWVyt6fQbog6uBtXTrzk1ej51iz4OkSFZXIRvhuRyTrL7PQJcwXwy9XdyQbyhbqFkkkdQKlbHCQdzwd2EPJhKyR3ATD4DkIldvkTbQjcuXvnXVzjVC1n8hjTH6lrjpe4asWfJt1bxcIsICiBmFiDt0sIOCU7eBjK3am3H4AfJ8Bk6NMxpYjk7u8PZh1yXTZgAtTAhcoKC30GprJqgJuI0uvqEkBGFxgeEtfISTCjQkmJBRQKc45px0jpPUVwnqzOXh3QfMx2z0RpDvHLksjPIMXP1OsJ8pF0x2DgFEbh7RoebmdAtuSRG5dToZ0Wh9tqPvoEz5c5G9oT5wjoLEHThQlz5iI0jATsdIoVdO2JGBMVs67vXHtMBtEYZbig5458azFlfVC2Rs82,d2f58254c21a8b3,bf09e12dfb495945 -wrNijnUyTZBbackeReYS7qcaSu2aEJeZrI5lnbl2vWKJ4kucQt7ud1FQp6VwGyVwAIwZY3tUTbRancC71bEDfwJ2wyK41yvrhXeHl7q0qjdmWk2CGCOgrX9LykayIT2d0c4EXtW1LDssQGwSNAosidgePyXC1ckwnkWjjVELsXoN5CRhiBeFHGgz0jDmZBpBFszwGcS9o3jDSDaEeLrPkkbfEoZ90JslIrPuja9IZh688eB8yactK2r2uzsCEqodj1qYY1PMaGRJ6OfUEzclsLp1D3iQy4ABbKT6xcDg75C0Z7Z1jiorCvAuFrlE26eHdEoFLVd7Hpf2VuyQBr9HWuUeEFwOXQYMl9EzlBb3uneCMphHL7I3bt9GbKfib5Vr1P6jKV6lRZk8Hg2CUMh2dIozLZAGkNzHHmcXm4m2zMwb0d97ljeZwm3lHijsIiMkC1qwdoSerUGRS6KYpJqEh4eEbQkiP5MEDPxDSCRrkQmTWjfy1vXCofffkIoujCqIqIzZe9ODQUgCmG0gqyzisOTG6L5MArguZJ5LVZWrHy7Tf9x9IubN5C2mvDtzK7od9m8e5AnWxemt7DmKgt0McUUfsQkTFTXuxFFkRuPa4z76glkncVwnr21xZD09LpFeMgVWrOhsSIIPkBABlFuZgJye7E0oqEhUfCGsvIAP,a6dc038f8a19c1bb,542e1e62d25b1847 -SUL2dsShHhjjmdpJWebfWHGWHMHfTdlThMMdnV7PxFtsBlsrnpqaDXhCX2Fc0HIQr7OgSqVKII6oLg2xsnP6VqZXbzo2UuCIPZSg8TddzbXMH4uZQisI6oEuQHBO1Su0ZtmuAl4E6lXT3ftxgJ897bGs7O2HQTDWhexUfBdmc5tG9Hp0rb63j46mRVneqOxxirEfetF1KhTZPUhj1Z7yQHucazS4kcWitu9jK8ACL5QPEkNKEzBAeFoRcULt3YFMnwxkB3xt45MM8ZHa1g7p4e0b8PeYQxoEpGNNPaW43WFJVH8cynwpjgk7um42jf0FUl9jV6mdPLNKaEKsze6OejGWFVTqWtGfr5dWG0BHMFHIsqwSeCiO26P3R2aUIWaq4CACVaeMjDr7Jig3seTa4wtMUW5FCtvBkITYuSWcSeMLkDxQT3rQvrti2DhWYdjdpquOG31RnrUOdc5ODuWwAnNm5isGEL4ngl1E1uyEDsip5c1u7ukLoBTRuA5L2rgU,d7fc0695e641df79,f894e7c5c49b2617 -QWEjRQ0LbwLf22rsJI6gTWKvQOmBJ9NOBCCsmaMsSBaTP3dSlkZf1nqo8dGmNod7xkqmIt9bdmyWHSOddCMK1cPBjvU30VKxUnzuo4UMlPN2AEr2Li8bLaPmoc2kOHidF39FgcHw1OWmlNo19RbItwAPFlGAfX991iKhM3DTYPZ48hdpjhrFknbDLXI4gHArfSDw3h2Xn9cGngLI7KDPCN6gxITBN6cpXOiJusmNUWgC26L5PYHF6554uV5JcvEIJgEcpXIr5CYfM0hWsD4l7XGyRUUOsSOdTLLhAibOdNJfXNqRMMc3rnXhKyRUF9NLG5TSSTBEyEa2yJYcUVpl9RPMyQMFMgsZS0BzeamBTd0GrmGdHuA0zCYPmCudTJ9wDzS1Nv0rcla03zu2rfg6FVL2HihpDKBt64N4sVgOqhhdbGWLbBvq6a6rxviuyZYSZfaaRcZjMQljLJh8Crdy3SiUtLCSQt3HYMCmhMabQGldfHdJPYFiClpVw6MsHoNCDm2USpdlQnMTMLVlMJZRzQrDmq4qaGc5tRFtONAGLMwTcZcsZYKEFrnSiFkNF8MthCHGfniWHnCHtptLQkJWp8acazaE4euPMjcitdCtcyvWcSG5KfQKB0wwGhpTXCxmogYBrpgfuhodwrJv5ys89X1x6UMaBlFfnXDF1XcBGfMUYCOSU4PvvaQ6eqN4zIaHCMTUP28pLNhbVYwTE8xGicfy0RlmEn9ZJqYf1MMsqaKFtqjNnO0WbWc39bVJXE7Uw76oBwg1IOduxUrdteY8493Xp1yexdUCfWaCOWIPIjvpXGSNpHUFMhPnc4JMLSAXd2nVibqHdcW0ldPRiz3BQlmfT03xcUXBTSHRAgnl590MR8,389c04ce817edc2b,d3147b934e1ab9a6 -0jPoEgU3ODg6xiEcAjyaW2ffZbpn50h5yeflcv3IMGFpPl5OquF2DzezhgAUebpv8mPkpKuRUygkclbsrevhWDV8fIpc35bNGji4ZxTAwwJwPR9Ph1qyzJYjxcJVAFNUnWtQwATVXCAJ1vmvFYYoEyTvgxweeU7HkyyZX2EgbY8pZnIqmev2wITM3450bOiZZj4uRStwIxT1sbxMMM8l0Qh1GInkYJpWZvQ41jAZay0A2nDXv0p9r5bySGyBJ4q0UJhwJmAQ1Y9upqlnSkLEi2xBIeP5sBoDLXQCEVDHy8CeCAcgZ3oADWf51qDFmaebg3qabTP5uj16cxrDAMisDFKUHyrCSwZdWy5T889wXccPsPocSmNZzvlLNjc4aCKlJHwaTOtu4cF3YNvHL2XvxnE9YFJwXYVSqUu1ONVp0ELMrYAOSPgmsgvLRFzpIKfzIhMYZRRS73LsqVIrmQiAQ6T9pX45FomBFcsqshP2z6LDzFXa60tpquqpWkwmxphNIyGHkpf7vhajohL7gz6mBbzIKIU8c8vP3cNevcwg9c3FhC0u26T1DxeKGKLgVGyKUSP4W2D6VSh69gwYO3j3N7EqzRLFZcdz71S2LyeQALXXw0Rm4Q6aUPZBuTA9kCOXk2HxvAB5bMotRzNPYL5UnNJ9RG8azXTZxmYlroDo5wxZCnp253Kztwqevxe4chofWmM7vOQ5HbSyPqUgHqIy3vxgOFojmAvwtLVrueVWGtbSYNnzD2ZG8AAgpOrvPTquUbAb10gJ7gVwCPAYczeQrZKmABlU0e6M3p8lFjohpeXSVJdwvuEvzK16FGuXTCwI6eOwM7yqjOs1TixC31IxgALCAL4m4AYYuL7ag5HGnQRMng0VvT9XuWFn4T8OChnhldmLOyMUqJAnQt5SDJfcnYGYzsPHijbrPDOkHEj8J1ZooGa7rS8Bv25X2u,5ac4c7b86c6a5caf,fce8031dd45b9689 -tAEiFyhn70x05v3A1oU5TCm3L9xeMrmwpf6UAetQrZ0aPwy8k6rVsn8E9kUxdGlj0kwildKyWdTvzTETxGI30LIbXGldef5YieiaNZRP1c3MC75sH35NtDXqRzbm93ceO0z3uiuXpydJPIWj1CBWtCya4Gee41uZqfSROdvmZaDryjHJA3AulucRCQ6wjXdk0gYuRL5nm1CxQ4ysjqdohPKF5xGWeGSTjFjIUeKWUfm21ZLr9tT6qwq1Uzu5UrosBkWLVjQxxXTtSdXol3J7zHcJDO9JKU5teJRBN3oZSmfWdwIWvqTYJFUIl9KaiOfYVnrTxutNb0X7bsmKve22mr01rxhoa2nlznYmPExbkUCtd3CrIxGKzRhaDZs2H6QASmVHr2fZMAAiandH9GlJ5pW8dKZOAaTwsYcMR0NIQA49wVYIf6UPjIMhSxdXxjqPMW229ymzxKzT9bt1MVDV7s99wc0,370e046db1bc732c,4525c080d84c38dc -rk25AX7V36Oh7nhYL11zagIgWGXYyyCtyxJ4TsVV6KFs1bScRlHuI8C8Hhy2c3x4Ufg7n1lzvgZ4heVnozYf2Zz1l2gckbPHMXsA8vT99LNgmSbnsNmeQjOBRLkaLgpCTUJmgW53HHgk7q4ONOIWBx8fNoHsCvzZWFp7Z9oGiowjbWg0kVqWLaV8rUzA7NPudIaC2TtdFpUQEzYpl9TsdMWXWSJD4AD3IsiGHKp25KRxanAYNjT7eP8jVGWaZx3u2B0LhcBV0V8I6MfnY8Sb,2e30ff18918fee11,f4523e7b4abe1812 -EV5Os08veCYmVGc8m4GLeGgj5rBtfuQF26tgEy1EqaG63EBZDp0Gr1oWbd5vyueBVLhgCPaVPwWX1gT9NlGScgkrru3MrhMucIzfOw2UgKpjB4v3iIQCsupo1P5aE0CjJleCG3naGiTOoe0dPcJToaWHHl41XAVuLfSr4ClHPyHsQy1G5MfwvIGFj7vHyAF2Eyh7cVAHvEua8ZiAE9uBl9c2qVz1TyWjQGjgiJlAHrI0mlpEMVIx0ebOWvxePD7IzJVwIbuFZ99CPSxYiRg5PXjg63l2OmsIctiOAi9l1ZbgL0C8biXzpPg7L2tZlUlOOPm6z81nRQ5c0hrVpfzZqsrqE4mOb1IzVrc3tkJYaySdU3ZypY4VPpsaoxEgvwJJGVdDGo0Qa6nK2rwhkaFQHPXlxatlkfCSdj4xuAii5C5YecCbvfLDbqabZFV5glH5tQt9W0v7eg0xJHgnPbjrhUXCUrQkXeyvJQT5Xm76tzYKU4UvdoYzRN3BFink9X1Bns4EK9B5uGmp2ley6Sb1weXs23eenWiYDlXzrAg8j3UjZPkXCkxRQJZsilg4rtgxY1CHDvQ2JfXClT9AQQ00dzYxcGu4uJJ0Hk1f6yoOts3b8WnLd3ZKqMOlUiXfN9OdXFPkPs8W9ETbN4JmDpq07DNqwvg9w69wRS9mOKRGVS2gGg4UR5mKLc6yducfBsfOzPr53Ip6hNCvpDzRqgDLZIsvWii3mOKSceYmOu8P57jrTtCCdamKP0uF5uWxIRutWWiNcMXzr8OkXTToJuApDtDLWogYTATTOLJzaRXMpiAaanHnfG85dT7I2V,3cf8ac5452e55129,3af5c45958f5e6c9 -gJN8s7ZVbhFTL0rdOf6aw8w0wBTHZ3ot1NGTa9PFlrkiddfKb2SmvC2fxONyumiEAyaTuMXnvnFQ4NCJdfpRbPFxEIxcEZN9bGZ0SiGuf3NV2GmU9KcsnPZglMesXTB9Ppcv39HvjnwhWHY6glfvCCBe6UkeLa40LEajAFcXLdQpMMd39L5UAgaGcQbJ1NK1HIieyFKzmmczvLNZS3WimFDyCr57PahOcT9astdDsLMcwZ4ZKaY4RkKCazf6Udch6zNxmv1H0q1xSwJTvYUviLHKenmnDkqq9W1dc4yVIuFT0TshYtXbDIDG1DzIEQWOj4gx4LbAFGAQ2BJRE5f8GoVFHYSf23UCwwQ5ppfEuBWHYWmpXv0SwjJGdTUOKV4g319z4fYh9ygAb9p7RhEFUKOQw23XgpfLLXnaK0kFvdPGlCYkLZJIQf4rtkTPbBMvJlDELcBeSz3p7TowiXsONpVAmL49pJC5Y78YBZ3IcbNEm97TQHLugTiZhCwHGacV9VKDmdpXGE5OwvwHDmkAYE3h5JdXHs4pX0gInDqkZlzYwyFJwWZxXkglPOEL,f39a8c2d9573a273,e97d6995a839603a -GAzBDiwCi5wsvBUpqf7ZVSQPAqqfYnQSAID1CHvkPMsz7xVrJBKAfk8342OO2pNbMDjAQ83rgoxG9CI3J6,ff4e8f0f2e530ab,5b4866f283e7e6de -TxJuT5khVYdaBwuYQ9IBeLOGmRSjxuhRXYuErKjZOgBsN1qbC6ZpJgybjEjwMh0oVxyF3kw3It9IDgtcgwhqRl88XYGF3qBHsyiismd5ntQy1bLTp9bBZAlvVLWvAZDILCp74VGcz2kKwsk1tbn3GK9rLKsvKmJaYrtMgbC477XG1oEBGGUYllRgS458VNWGUvBQdTprI7XwgSDMiH0ajumedz6h8Rqcoo9SXDD4JpxRaqFyoSYKO2WwdG188eI4lzdGqYDOV7DWb5k2z0XvXa8ZNKXjjnDhv1Ba7qoPKV7FuDtdoP7JBAbO7OaXDMr5iMreqwLi3ivzQDpHrtuCLIdBRtVn41SF5HmroEGPyHnaWpFIAqcbwWWxIzlKHqw8QnoRtyPgZpihUWNFIMB8khOztRZJYSdClILnjER3dIzMDJ5mlpAsyRP0ExYnb6l3BHR95skmEESSk7SAzCRg3RqshQgfO98dvPYQJEFN77MvrxoQuBbErFVJWE2UZrammBLS8MdFvM03STuv3TCU0m7Y6krPtfEXn52RQ8RSgb15IJNkl38dUgZdOrVq8yVzJqvK7iNFJUvKLcPvi7wDYfX3938f9bPnatnj3M21JPwurI5FShz55kD4G8MQcwbfm2TZi5U4Patifr37UjK1wiOE958Rt1SSkSEIDcPDy94kwQcjd61waluwBV3qjJLcZI4Zqo8liibYBBsf9c44G2ObYq0oCBvGnKp2EHdH7zZlEc53dNQ95UIOd3ZqfuEiPjhPzDepL9jO2W9W6FSD2hUAcA9K2jHDjjQ8qop03KzRVNOjswKAFYjpN6Rqrr9JaWZuqw4vwXDJgLiOk0QIkrNQBQzItZpVjoszSLXt7yJa39OeFOVkpRtqACAcWvMnRxeD3lp4PKM1amKVdcyx55uTtM8GKz7mjgaEMXcapoEcN8kFXqAZQPnC6FSpbzq7iHX4Rwa0NjoRIod7DCPMxgFaYyvFZKneTSijy2,fd388748991c151c,454a366497393411 -uEgzTXIGuBtGtixsg4snRw4c81pJgIqOK2mNP,4b9f91b3830bfe6c,58ea1a0c1e705763 -IZaQk4JM57vxjx2qyNtbmdi2JepHtHneMNatg64id7Q3A3i5RgViI0fZ35sm5cKRKxIysEosiraMGoV1lXjLyYgQZzqMdSwp69mX62KpWovGqVWv4XhZqHBOo5UcaAmgkRKQfpTluwtYTaaEHiQDnzyuc75iuc4FXCQAolK2j6wcKBnD6GMDJLW9CN5MaFDEFZoxk2aBkeudqvazFOIj0TrOnCq1t7NmlaLLqtgyZieT2Ba6FlYNl4117lyoFGQpkYOgv0Y8leM5VsP94kXrsHSDb3VoRR87FuXJ7ExUERVo5LPZvnYk0Na1c3ystG4hZVPZiOUQ5J8qxxExHxErQCHmLfbKCpI0VOqlGyQskobHOFe5mThX2AWMbEHBqaLDIw6fd92VCh1kO8w3ERzY6KxwFESfJoFJQxbBweS73VDw82zV4QQOt9gYmhaFuAIgxDzhJh1JZu0MNDSIv7jQu4PlqMxJn4eDAiHuCzd2SJ5k80nOqzBxdjRm8EUNnvUjwC5pgFozY6olEifmXZlWoirWAJXYrirp0Li2hKqr9V9p2XWKrSgQKEba9JXujXp6QzimUvyBGOOE6yKEdoKIhF7hPJtxDzYUZWzP3Qibx5hVQfRQtWCOd9ldhPojVkAzjR4HLGZ5WuI5jD941aiXTahUzFu8kfd6DPM3FCPHTk1umIE0rZoXd5sUNunYKeAzmmbuR9to4PStbBCtkoxOt0N27DNNcF8geJOc1v4owxyXIYnUppQebC6sOaXFVNRl2lNI1vrTo4lZgMpEr2AdhRLuHNbDgYqfQsP97h3wFbO3P1sfV0cwyjbTOcooOijITb1CmJFE7X8FQJPxHyKd3A0mt8zbL9Dhu1XJA2e0WSFPFYsuIa5wQWyuNC952dxNQPwQvSQypzFhKQj6vJaBZqxIU7It81hLb2IVLYk4FXMgoZDmKj1XwZOWEDmRXb,5a2a627ca56737a0,ddb140012f7091da -1CD8SpL0rqceLxhcjHMzldIX1lJNtKCjRzpILliOPGm7mMY6imr02huurOwvA671Wi0tbWLlzXWtZOh3aRW5W28ts2uZ8pPhs9qcgiMfMLYkQIsXfhI96v8j23aD7iFcPSJPuYbIwgQFsN6null1xDUHjhinujySVkgZfAiQvvZSvg9vNK4tTtI96xa3pTETCVtfMNQstrrNYV5EbNb8WoGtImCvlkKOrDFsA087JaxKJ76VvtZGD20t5NoJqW6fNREx115lW5rEN06bPX37vJIayr4J0xL6EZUA9g5BSBzAHkOnNaFcg5zr7t2npYTUYPlcn3un0zI7pk2WFmCDtOUfAlbwffIEls6AAa320zwnw0cQPPe6SSowrbdtVIUg3FNESGc3fFZmv0IDCFJ696mpiBGQ,4820ad669dbd72e0,da2561a44662543f -912IkdZravEFKCwgw6IEub9Ut3sbFTFBfmQ2MNdhnptRarG41r9LeMoRFsmkzhA9N0eVsQdQ62S9nhTgFS2H53M5rxueEMsVjsIqdqv9KJQQTxEEtaXwmaDxAQ9zzQISC5oa2mdEktDBK750U8wHhic05srCiyCDmZTl7u5XDUQKOGtN44aR,eaf81ef22f9dae1e,b1451bb37f7c7ddb -OsM6uraHzYid2BZ1WqurNkF7aBljLviD4EnsyI8aCyt7Ri2VavnC1HpTUBlsYdqeAOcIt6KeVlV8TzRDpnW8XX731eggWILMwxWj1VPioekkaQUgZSk3S1hVMqS3x2kqBZdRXeG8rlDD8klc8Ssqxz88BFgcCnBUrm7nYXZLQJkCZdU7BP1UEQiPSpnlFa71nx97cVer7mnoPsgIco9PojTAQmPvN9QfooSitWXTAgL8VWXOLVrbCwGWFFXgXKc1sy97hLJSMqLf37oa1vwKB05OHxfCCnygQHCDxAA0ZUtWTEX2A1YVSF6g1GAydVvT9Uq5IIZFgcPIQAoJIRNU2UHCl5dY0e0nKkLzqIXgXDUZE56vCvnc,f5a34c50c1e264c9,343c921b24cf5774 -JckdCv3DigwQG6cS5Gg53sMk7ILg5Dpw60cjQgERAORlN9FMWy9ugKVaakvJvBqdrIz6xhYbMwKyTs9W96xpC4uOPxvQrMwJwqYrWvjAWBikB8VTZW9OraFuTdakTQxVIWK75cTbzgjUDp8WLIIXdUF7qgrX3BRtmzwPpUleeq7iPbXPO2cRSIeAuEsT6fy1zn5xbxLIjQV43cZeGo9D1KspKjTE3U1SRvcJNFm0AHshaAowgZ4j7XIg1zsOnYnKYTjTPyZRFQNWBi8wd3oGHbYRIN2LjV2ZPERNyzqZ4wuSdqvjg24rjVzFghfyePbzy,9d3cc019645e04f3,85a3f42873b65c36 -vASEkLnbIT0ByPxgWzXmcP78kcAe2o3VfL8vEKFmbfeKThkCwPx7ONLIGnJWTIR6Mj818EY2MQgUfAVRglZXzpnTfxGTHDZ10iLmNkLmEue6hKIu0ToGdcXRae1ASmKpSRB4G0cmiDAjiU0jbh0EfMXNugGnAqkdtjYjBhPuLQGq9LAbC2lwC1LnsNUKtHnWbhh6Z7S6hhnl4KRzzFDlk1Kcq4JU95oxepSxU68nkkXpyawnXz821CrhnTFCd4Qw40M4LT7VuAx6EiZDg3RtepiH7xEmlfbDBUFXmqG9XHXaTHYwoDmCP0E6U0gxLu3lGcxFk7Kiaf43W5dfVP6rwxWgPX57wjsD1Rp82y1Pr1Ue4ZhwI0Q2aqq1ShxWE3hcasVIZkQvZ7jOVRz35ojCW4B66ZvK9rtUn0Swb9omxBf7Dt3hSuj8gkN7gbAKZPpiCtgx8yhNxyq7W5AHLgVesfoQmhxGVSi7dG6D2eX3JEUOR1XVZ1XIKpK4DnXheUfWvaqxfs1gaGG7U1Kow0Nl9i39eOLKd7ZDBWYd5zVcPzoQfBH7NJgr232gjC2HMm8LQ8dKC1JvgsIpJOPmpHWnd9tzU5mAcr5Y0UBZH85eWOc97hReVBSaxD0TXecgWPCW6awW1J3qMM1x2J8PkhMa60YbfeUH3I6RvCuYLDk92grhwN5yUc78kp0i6jEDijAFXClzefvQp1EpPPVRTdfBDNgFZyJ64RDSgoupuLnpCwdnKhMk8b4SAKFiQAOsBgWVy0gFEezRmSYhlQMr5K17QE1qiiie3ZOFSv60D0A2L4eZm1530yaTlUsuqdO4YKW7Au6dNb30nMLmSQL060zqYY1GAKtHfkCZOPttpzEsHmpzLkVHbjgWvTAzsmowWyEnqOe4p,df3d1bb84174d12f,cf21f2f6eedce62b -KNzCCwoUlHGnGbIodflLn9kmpyh85CtMxsEcEPdhELwkK0Z7dA9vddUAIwxDuZDzhKRXeK3Uozf7DDcmEnRZWQd2guP29soeCeYqrCMoaDJq2o8VrJUrUgIvKbYfxGLwiSchPkKswpYncZguQp6GSuUUpjbf9hn4XFg1FhWi5sKbXIy0DrCtyGy7AFOs3Ngn9qiwjZFWVqE4Qh8yWnmLz4pBbcADdFhHvtsVZFl8a71SZtC3Vd3yp2mEbYcVvs2s1JwNTCh0U57GcTvxIhoJyjbt70Ovkry2U3W3yshRmnt3zxI7GyvCHFA6VWQ1LUgnQdZe52j2u8ElUzqDwjHnnWI5DsWyTCYdHFWb34N,3861916b92b3b0c3,a5c7fb7b3d605785 -Pptc8rp5IszBW0QZoaREyDMpxKEnJBXmp6COpF1WMj4KPbswvUcPBpxs8RAXWS1HR8kYmJwF8nZ7X0v3SLBfcZvLtPUkHpdKWAvvAqFArLeavpSzVEdfWd8iZAnffgzSYelFdVK5VldODnlJaJQ6qOLRE8L4ybDB0mteLiQR9qlZw5p2fuPiAG7cd7mckm77eWOqRSSqbTUXS7X3NJYDaj7zQUuWGXkgVAn37JfZzMRPr61BukdOQoJzTHxmbazJ2lCzxeJ3y0bffuGAAv2hn90a41PhMvKBsf7CZpDmyXfnbh7NNEN03MhvMeltz62GIDomINKSS5bIaY3hn2ie2D81umnOjgA5qDv07k5TKJ2v4dm0CqsUWnMPELZGzA4K7TTr3dy8ZrrIH467Y3JwKbtqaHsiBlzrIic0eVkRX5yz7ZZq7f8XrZ4VNZkFOj8fD3AHRdRd7RSU4zVKRfisxyczbE6w7QchLmxZFGj1PxM8W2huciRBNofbm684aPvTAiV5aFZsqPYvCmfIIQRRxueHvoHdt9mleGXIwnAUOtwdxGkVgxF75jVqOHqs8rYOYaNfmgyW0BtlLQd7hRgbF22LCxvpDNuaGCuSGe7wRKv8DypqaPPXitinrB62dpCdYcRvMYqEUYLyjJ6QiiPh8HYaUUQD1Pg60KVjR1Q94cM9c7BIV4qbMR3WXzjylTdVqm6bB3BQ1UzAMWihzgIQA8WxM24XVd12d4YhiNtNY4bz9daiFlZMcYmuJs5SyrD9NJm,82b51d6078bfd7b3,e65fcae2e2746b84 -4RG72kGFPCVMqnap9IdvMwrdergNlNvEjwI4D5M6nRyKrCfvhJwhHE8xkPUfMSom1hddq4M1kOJSYhlTbMPgjttZDhQJUmLqDYflSkh7Ts5jLVDZEGP24vs7IoNpyLmcHgxaPUS4RMiCqBpEYkDGvDhYXp5fvJ0BVrZVwlHHzqntuMyCFpOMhq72KjCeE6f81PhvYrCzsTEScFouXHWhBtRFj190QCXjhafcl6bOPukvzHIQ6VRmbH3pNFkpXsFZISQPnstPuu8o8moqkSEqyTIDiu9mMpHFPJ9ZoQVNuXWsVdtOSBFvGXpadBgZ5psM1c8DgBE7Wn44YIlbMo,7f7343e05e16a21b,ff25816853a99052 -hsZ9MzS948qa01H6zxIzEcUrqifRnElMfx6608HPr5JLTtVLHwExfZMs6e1TPJiGzFJgmkaEYNgPZjXdqRpb4IJERFXTYFf2IcbTmafmWV9HicYJvm8bOOErKgu5A94gZrQSEsfQgptkEE9b0wNLoFbw3yPADjamKfOtr0qx5v0RfQ2xdVedVNqQi1q6SyQVa3OC,68c5a6500da37a6c,9a2b64b4425839fb -0MpxAkPc1eAmlOv6WifDdC1JKNbK3Skcg22qE3h70ACaQxpSRjodbjPQVFZcVRIvvImm4OXhmwAqeFXVvzFoS69v3vDynydzcW25nbgNApvaUx6aosAkqUQqs5i0Pm1hB1p42HetYXj8PhXxNEpwYapIKGUYRoufGFBRdJzM5AmLFBBCTyaK1OsdTa,a9593cd6d2a896f7,19f7407b6c3669cd -mEDRFxKUSCeJjr4BXvZULzYXRzFc1UUSyORpPYZvouhk9yaCGvolMMPGIgTpbSJ9DQDCuvaAWYfl0sv1RTK9zdEnUVgrCU08YcVZrEjobtvxd4Fyotz07wGpiDeR13sBVIVsZ0bgOowp8kNKFWOeEA0uWUTsDWbjHQkVjbPz3Im95G5HloYA3NmBg1ePNRiSCvhxNLE3v5ZtwHnpAAYTnapPEdpYkI4klfU5AuOLU653NR6zoWeHfqegXXAz2GMPoHUcWtyiDyVBMm8ESvvj274CQJud5Q2NBhEiWLw27DvOmgr4fOtrKTo0rdkXqZwExw6IX1ftRNY1UgJ6LuUzCIAKyWejCoJm6Gughbe6PQl52nTjmCJN0C5Crm,9863c4df1edfe136,953d888b74f887f5 -3B3X3EVQEYZBq8jaPrq0KMjXI7C5aqyHnCVksfEzIX8RJFPURIwTwjNozSIo3ImXlVilbBg5L04fnhNFr7vZW5q62XERKBdqnqMA4PlDsvPl0Rd79epdZGkChx0G4jAaXsh54F5Qmu5HK3OZIOOQhRBkwsR4H1PTvclp2doHh5c2aBijcgkKqhNfDW47LElQ3toUykYGfYyJeQ2vX9Kgh4XzbWH6IdT60RNH8xFD7yIgYYzxI15PaOROFwB74cwUO9w11n1h1ondV7wYW1QboUJ04csWuRQWYEdhONxswq2PpIDOCpw3dekCCpWjWBIn2wQOA9rgJWXEp0xJlv7gwhKzZTNDPTFNWl3nDo4aG3Q7Zfrauf0KGKXUmobANqIGsGnpaaujJplPNyvJT8msPsgEOStEeYretRV0uLEQFSDMDDG89J4jwxNSpuMOvMDZ8utrSQhaJdcK9hRKscY1LL9GOo0bqeNikFpy1UAsvC2u0tEP6ojTHkmjXlwjbIchRd9d8Xbvl7oktGQ4a5ASrwI9mALa0ZhTphQZ6mrHduDvDDvlheEZYqNWw0P1EygZmmMReztNa1DSVzZXQUak6nRbpwpb4YapiAda11LOkxSb3x5sIKlC2exFGYjuVWWVFm0noRdPQg0W9SlfmRWHj2I9Oz4AYrtVzkz58TVTRwY4Agu4gzqdmVdAuj2J1qmkau4dBepcMrmnw3LYrNfp67rpwO2r5GPoAXjjQdLDkqWEOjAY5r1dbm815DOuuiG66DiWhbe2W3CdvWnk7jNA1MhBelx2EZwq12qQRyoffUUMo327yp0WJAIrEGLn4PEopTausXvaZr5XoU5BLalE6t7wP0mcvSdnKBK2A1JG6ZO7Zqrx4K8MoybTuXWwfvEgIO8Qbagj4FTtzjdp9sxEBUKsF9YYOMAVGeoaZIkv1gdYufM,f6cd7ce6e52c6269,adcbb59a67392c38 -z3KTEqi5LCfzBmilVIJvV1Jj5JJVZf8sVCubPe1X2NnPaYvoIXPu3P4qz0KAviVWmPVculIFegoybIZDNgO3PFFDES6V3K2LKU9lI0MdRnFgBDJPrE25M14Lx8i4hospZS3bQRtZLgvcktwODWuevghyc4eCSmFtMrUHturLFKKxgzJPh69MnAabXjHDGW5W5uNvPS4QNL0UTqQt8apbeQtOUifnIRydCTeExkBgfojKSyTAKe7AYWfBNr00IObiApgLgAlvQQA3zr3sEoSalkRnZNRx7p7IMEx1Jd6thH184S3qd10VHVOa5zKbFKDmH6cWnUkTOyLAcVNBNB2jGjoObUKuonpcW73Nnl4OUfDFHnipmqdPMhTSzaYoJRqb3hZf7vV3XPEsLwxiKegTTUAlv5MbEf3dtXOFsXwEPgcZ6aiS8SjI1u8RjTo2Nz7cJWwnrFzpv603pduh0z0h5IAUwEPnXTNm3Ff8hJzMTQox60v92TGvdJHNJkKeiEjuClh9qzoWJpPelOSxfnzFZkpDDivXCVRBzp6K2aWqzcM21HgNwtSUymff,ee3dfaedf564b334,349c44fa0c507909 -AMgy4aWNsv2m4bIpfOWU53YFvehqkH3vud8xCPbgEzdaZRVQZ5JV7Jd0b9OVEMA5X6LkdoeqRurcoUUM7wE3ew5G9hLjr07FvP98KFf1nc76PM8lHKMhxpQwhDiS7bNA50EWjXdRxAeflKDK16o72BEOsV001yrdeRVBGbiLX0RmyYVdTN7wd6mGerzOu8bEEenw8Iv01qnfmSbJqUBdHoTe9lqgNqTEIh7RN3s1jeaIEmtyUK1DO3BWTvQgA4bCAL8njSaxxwQQGqDmdYriCq1ZNbzgmkqSYfse2L1hnwl62qjhI7uOJng3NCVmTVwTsfp3BLFyAOpfY1KomRHRCjh4W5GFftX0x0dPyLrrq2SW7fYMTGlU6gZsLm1ksllsglPZAwvhLk7ny9hK6PV6JzVoJw8fGaChkJeiJzB3PPlBVXFq462UCkvs92H0uwPgEANgtCHyrSTtPIWLcvD8ODKEULPt1PuunYqyMHBSKj0d4RXRRoXtOWt0jCdMHyAP59k1plTtBVL7MBcP2bNQ4y1qXoDul0NP0fMLXGA8gaXSY6i8qW4MZ8iOaiuGu0NjtOgdkVMz1LxFxsl0Ik7RaU7OtsqfrXszLrA8BQJGjRupuoj5nUP6OuU2cSVOkbGuWaybKzTiOYObFmc9iAuAhilDSrc4fpiYvyuu,fa157c50c009d846,1de28dbbfb5cfb6 -f,ceb2427132116d2d,c3bd4c8db1d7bcb3 -e9P0UR5aOLOf2e6CITjMyh5ESWGV2sRkLAjCDVHRofcDs87cGfpP0WCO9SS2Kw3d894BH9b,ac88586e30b87863,d3a0b74f7e27752b -ZhXN9rijzY9phqfs5w6c2MkADmjbzSRgNAI3vJKWTcjCqVQaAojY1ge2TACHp8VsmhYg8v7RlsIuMd1RgUThLfkNmBEQKuFspvpE4erSe0zWH6Oq4shji4MImELPSHZdFFgQvfO4DZoREy6HuYGwcyEB5C3AhVcdlB39DEs3qQC8lNi5PS59QKGJEOGiiEqHxrAnwvNLMxByruJzTSQUoZhh7ilHRXkQk0bMbNErKiZCWrAAejEcjU1biTaw9VsKBU6rCcFdSjSUUsbCXTyd1JwtZeTnh2kRNkH5cFxIIGxicOpsjIeZT3uSdZKksY8Uh8TWMaaVHH5Z3PWtBmdbjgarjpisYwkjg9lgeDcSDwCDgqFcvi2uH3xrdKYMUYlnoyU9apwrjr4FtR760oAjTmxFhrMqeFNT2vqAxpGTj7urfaZbiZQYStR5PYICgQQfzXBKlSmzv4B8wwr2JMnLW3m6DY2p9F6QBToyHMYjCFEK2hUGZ1nJfOzq75DxIJdBAcERfkoWTfxxzspU89i90IPnJap43LB4M15f0yj0F4urbx0R5R0Ku5qYalkUeAHeUaDC2auTbESOcXkCKH5FyrvaQu4qwIKCLoonTJ6VGNtQExKB7LGNlaqlMRG1y15wyXS8Yw8XtEpMy7rPvekW3B4gknlQwtkx820Anv4XerHgvCvi3budXnUZWqC4qRhiEOi90yybPUJ7UKewEIJHpUhHQ8pgBnzlBtv3jaoVZWHVWIdcJF5BShT5shkf0vLGk8xgUAGiINv1eukD0h1XAlC6LjbjVelpkrJdHSG0slyPkFP1ivB9TUh1HZRVVqfld1EsvyJpBogt8FHN2lYHm4M9e4CqZyPIq7FJD9XA7dFgz4um4ZBjSsG8sQM4dfADIm2Lqq1pohJXMh1P5ns3W1J2JOlfBgjUVXdrxHlUoQQ43rROeCxQxD6pmqDFtRCpn0d72OYe6RVbnO4fyWFsg60vQl,b24038fed4c3debb,47583b7051a7644e -51Td3qRjAZwSCjiNBINcE00r6kQ0uEvW7FQaAb3pUC5igMsbrIlMkjihXpGHSgiBxzVfjBy72YwraHO3GiGlG0ISvffw,aced0a91647f5df2,9f779d075a87bc4a -4x39cewXlIamHTkmBnhXPLfsf6h9tPTO15TwWYWZ50nFRfVU7gNUzUBYVrxY6l22ObUvRdfMN5NLJN7Jr4gEOJDvHrxB91mb4InmeCgTkyi0f0fJ5Oqa00P364jR2sKe2fBO1dgo605lvlCR1Dawt0zaSppn3LdZDn1zd4VXDaOt1KSQF084JU7eioZkv7lzqctTNwhPR0JciiHMxapsPJtUGp4ALobDgwnMPEW4dvOXIpUQiUrARGG6MrO2cC9zQ3nNZM0ysrFbKxFSgJMJre5lfg1fAxu5O50lFhnrGgYWoFy7u9RH9wmASnqpmz5gjJjfCHX5NYYJtXwI3hxvVRa2DKrTi8sqVoEMfrBQB6BcL5mhg7tqZWWY9vUWX1TfpVwLcFWOy7m3YoSQthgPZYZJVrocnpDCfP79M1piitex,163c84c38f48cde7,c14bd9066361b1aa -6VRJCZwgDO36Mgs0xzx3Rd86YWYbjb5XrGOYhxBN07KScQAEUpPJIecBS0LuEEDCDjsABA1Fe640ANja4GyiuGshRMAcHIFJ0FHm87GaCvvsEReZ1QpLa5wdrgrD4vzY8rudw8a1TbTHP7xqwPLT2nV9YP1jmeToycBan8hXQkZE61wm9jZw9UAzcoFdULbeQM0mvQlCoHoUTCcIBe7x50MFX25wFRU3wNBTULlMcZEoXVgaIYtf1lFAdpaI06i2769Y2doctz2DKptnF9Q4okpoqSwr,4abb6d7adb3b6d19,361ac662e003a9a1 -udzcTkuuNlpfdv2duZQIOMIh6qRsh9UWZXxv0ngA9UhS5aEAgT0kD5CyX18auLhB386SVhq7zYlD7CIUsVD0DrTJbw7PgtD9NZvyKTTPNHscDCkcJcLwWbGDBhN7LaTGwtDSet0ASb7F8wEHVWoFsNyfvSoQm8Wjl1riT0QPJ555WYg5lEc84BaNNXOUdR02RrSyHUq0OSHJJ784VJuAhxf9jHr3lLiyIKI30D5ai1bEa3GWNh7Ahdep6sHDAWHjmfTDAAXp7UCpf9805fK4v5gJyrfWzQf6c4DwzoqyUnUY3EuK2HIrTdvns6RGMoSqorLhaCyZ5CC1pvpZjACbQifDlWHWWX32FrdDG8npEA52gawFvgvinXbM9OOeImUimYhmS0vin39TyIWGXWQBNLl8N6IS4n2RQN6wmmF3iO0zRf2OVfVXSPbDWnUH,791360375b12cecf,4ffce002ae8509af -bNQdKwfI8xrDS89mFnBKH0A41jziskjvFRQLjJn8OLLrPXjWZJsQZMEUDflVEQj92IhlKBflhv9urBVMf18Ipf43vkcrLwJIrTU1nvWZa2HtgacaL9QtdnRtXTPiOMFm7gmevDy84lp4VxsZ8ugHMQlZ6CakHWDbUGrZUpOYVFcmG42LgIhvhzlMZwnEmQoZVGqchyXSHDVgqAXno1ihPKBYQCKOK7kJ8nOdHzajfvmga9EcxXjfQfT8CmvmCDe75TdVh1uXKEk6niaXk54Do8z0CbIfqQQpselJxVSHxYN4bIudetBTerGiExiznGCfaEPPWdZOWcxnoxPvKpIb8Gd2WksKBeMRTrEo5CfiUneGJSg2WQ8fhZJZKm2lyKRIdUeskY52nXn8uUcG8IsGpEytj06TZCbhNKNCNwjD5yDsSJeh9VNmcTZNLhlR29jMawk98h6zcUffrARglXTqd7OZClb4Jh4fQeF2jb6c6yE4Z4V8uwWTSQa6ZqgFzMKHYv8zICw2VaO7NHr0FTXbtzV69km9eGiCFlEwORBOzPclamIYHrO7Ly1kOX7EUKxHSNX8Ypen6lg07WMVhr80h3HYxBsV3ixGdbD5JQQZG8PSakvBOyE1cKs0CeXnUUG9EScyLiFS02vKcPnx1SW5KONYxg67oQs2UQs3eVmYacwNF0ABUHydi0LKyTboISKh7FJLpJGobH4Pr3RN46TgT12lre8ArxL1Ngf3BFab5HgDFg3iYUrLdwWlTRcxAz80B6AQDk2DSYmdxmfhK3C7vMv3mkQtBIaPaWR5phOJMM66xLQCmu3vKd5IV28cwsw0TARaOlGxotMGPij2IPEGtdS4,cf0d9ee7ec638dad,a36315cb3b4dcb96 -Gye8kVUVYahRTlzQCQZy5bljLOAzg9JAX01oQ9Pu2NesH4OjoxOysEPmZyJtOBWrN122z246djNc6Tusc9Dt2Sqa14Fr3VdlmnNLYBJMt5twch2SS0HT8cpaYfgONhBlCq9gGDbXSGc0Sr2aAeqvFnl54XEJH0VhxT8HdUNnuvOvV9WfH2vMWuAA2Lt0xuXjn2FOMPwBe6iv4SsQ2h1nFgK0w8MTNNUnKR2rk9vr4pxn2ihNNDt5r1TO168shwYrzRxjKX93gYrcdYwsb7TZNxvl4kARc2D01KBvGOUYVv3DzbTdXehAdx8imVb24ppcu9vJjOjCNcMkwMFap1DoGHVOYxpZEHAWreEP4x1T8gIpI2Lc8vFFgwixxiNEqNeEDFy8zcKWP2c0Lxme6K4kuYZvs3J8Io5cpcBjFOCb6wLPfVQCfU7bdrflNJka7UoiCWf8VpBqztrz89NFyfODBbGMnFQRdvA03G1B4xk47sP3Vihllwq9697S8guHKHocKIri2JqMCP99ltqmCeULV6eCYAmLQpUxQI1gEfAxg,5175db84f2b7cdec,38063c3b742ce1da -35ZEwk3pid1kao4rxxbwbZXs6DBb45XX7fGKCjglQDwepwEDKD6TIgKlT2VWnPqY0AVgBVFcmd7Zv2pxh7OEOJcs4QTeAjZ7xX3HtzOS9x5BK93xT05QOgKQ5s8lJ26UwLHRzzuap0sls7RSof7EAo6v4oWdgNJtMvaMP0huSfjyaoHDap2GCnnhiZcE7PLJp7UOfydhVyPiruLeZQBpyOJRjcD4y6QjuWYZse7okRSDAJ7POTp53veEhOTqqacs7fbUPtxfxoMLiXG75GXFiFMk7duc2yv7YrfaZSwAhNil4TnLesYaNCAOlm2HWSA9eZJ6E8okl5AAMGHlKGwhTkFZTbgFhAhK81FVHkjd6Cg1KHvl0zQK4G1ZB2e3G7zS0ZpFneau0rnk2ovB1DsbOeHCV6u12kTLe0SQ2wUXKlrAMenMIy24uPmzVcRbJvPof4uTJHTPDdZBHL0igbvLofTVMvncpiYOnPPfVfodrXF5cknyiSHrJ5Ntw6L6J4pLQSTLBFmS7LFfK1WVrAABMiHebQeK65SVEl7Gf29GNmrFK4Jukv2gOTVCSjXVksylUMTlvOmES69bPrvjr9Xygq71PheCbYGxmvBS2gou5iRpDotlCWucURGp6mu5jvY51vT6F2k6zX4xl4NTFLkoZf0Kuj8XWCN5ejHoysSzkmNfg7SI1grjTRGUd4tKpKFG8QyXWrQlHuNxICXavLxL5VfhddueDN7wc6ggUVsDMxI2BFvRsI1xuJIuWbmvAzyzgVZxV,2dc26f8a26446bef,393f80a32eb4f28a -LcA1wlbkLM8DVacPmYWmznlwETDUdsTLLk9eyMOi5X7eijxY5zjwnMWHa6CZJZDiSqIYC1VQAMNHnJpqTYSQI5xkJhgMEK2BnLDRGzfsNU8HCguCyNI8f8cCs4iLgxTgy1yn26Lgto1hTCusdoeHjRo9EF35qIfLWg3z9NMKllg7huXttybhyD1A4mFNpDf7LHZyNRWFR21EPSGb7rebGTeaLgQ9QexfxBy1eJs0DedbhQi0SnIrszZVYPZqmMSlwqBc3SUf4yL7UXlvVILrKnXFdPIHLfotbUMKFRKH33xA4jNzXwBEVXvpfFTMvFRpZJivLirZmiIJeNX5rOetEDpARs236rZCOfXFBhbN56l7FzFU7BL4jdXFLRJ0BGEaBZRp9PDYUn9rA1LTCJrULlyoWJhqlRXSQwepdacCpFUQk16fym9kJ42P8g8FrH8ArwrXKFZ42EPINM7hRGHmhicZCFgV7Gb0WUdFwfoBIdRVNQrTlbKFddH5WAcxyqA2qhAFnBsRof2pvMPcWMsMal2ILPiBHAiPuPFdDyBvaI2RmOWrgpfiDpPfcyTeljI03RrdyCBOez18siaBTFSOeAeffsXdnhsNpgbjzMudyuQxJLUtfp7SG6oYi4wdryYEdj3VnWqocq4wMR4o375Gf4T22B4yXlje0G1YfiSEoFk8zV8Ek8O5Uv27UAciCfFXwUZZT8HU6HyXX9YuEmnb0sbpTOrZPq9mLBDs6sVLJAA34hicvJz0sblVHJHaJCT6Ejrp4ZdEydAtzUjlMxaBz3W2Q93KDKC3aQp0XAZZHprX,346c670f695a8d60,56f5b02657448dd0 -Ht9ncVe63fXxpjmrqlHr3HQ8N1ujRduUiHxNvz9FaB6ZA7TKNPsAkSNOJ5MPEajmKv8kkZs2C4H7bSxN2C5XuxfbP1FEx5YTySlJCdn4PcSpcjPXtNX0Iq2i4cOCVfhuGmUHBRLLa95kYEsvmwh1FDhmND5fWEU6LcWYnWgobO3WE8RNdgqd7AMSvseycn0IJz1UePVNtpcMjbXGr61qV8rMIJCT9RbLBIEyEVxnJldwFUJvNYc57EdjtjcExPqqA0Z6xVx5bLcBS5fqto3u35r3pzD0fft9zKMnd8MI0DDng6aGitoL4qxXosSZyypcMSQmaxQFcuVMtT2miy5pDLLRbuPCdf07Gu3ERsWO8qPmVtARjvOFAmv0GhdNg4i7XKjZoZrI2uiNgOQLJ0LQJrdBVVEgVfM6wPPLf1GlYIFls30fWNw5QYEiA9pWFzlwQjNf1G0vx8GjCPnfJsoJxLeP4Ikg4gEy0x8Lo3qRddBjOv2ZpHKYtnWCfFw49oXu0KxmQYZgNmfaNPBXF4FG2u41hLto3RE7tQJt0f8zMQBrdpemW8rUYT2lVOWsUpdR9qubu9WLn2D87hItwlxc8VvOnnXrezVXgdX2zrzogS1To7F3047p0aTGdtN6HQlLret0jJMlDebYcuBgaGypzXeo6jps1B5ZEnn9GesvuikQkl6mT1YiONcbVyPeeFovnQhs1aF9g7AFxEscHlmbbCD8yg5Cl5MhPtDZgHCHEOm2LWKxbcsuc5DlhN,2efb9ca1a0d762ff,40485785f1fbb051 -HShCiYfPQtKbbu7z4dnRUu72szH9sxAHoes52G3o4DwmYzzul1YUMkGV5Axd9iyGJmd4Ipz2EoPaksggRlnLW1yrxiFdrBPRLXOGpziHXJ64gNwQKxy5BazsfuhPjaxSsyEzc7lDkFIg5gMJJtEauTrHlXfT4Xh9fSuJVc18xwbFfPJuPJMlqUYS8JpyMS499lTUz9tfQ1w5uTKAEaRcleZbU9CeszBuBCVgnxiBh4Vq8Wtn8C71RWnk9PSeTpkyUYzQ4HHXozLNWbVhB5VSyngIw8qAyUvOPXotPP6g5dDpJu3P0zoD5AJLv2kurSGYPqMIwhcXlphfsdI5Gf0TQi5KuIxUhGj24kFw3OCSh4KkO7sfCdu63taoXWDBC5kOyNMaqZfgoTdzZnUs,635935e1be77a9e0,b7c2c2b2d03ff4af -7XvLCdHi6cjOOLe3eFNp1VNB7CeVcxOoD264Fr5G9ZTlLJj2Tvb6kqwpeDdpqAAmTOqo3qw4T7q1AbYr23IhK2sbSP1TSFk0i8oHyWWbZNIJGy9T0PS99LZUsotYZZEC6LFDt0DzSYQ52LDqFQSKiyRK8Za97M8MXDgWRz6f7vRhsYYmkRN3zR7jKUrbgph5TTYPx9hnoiTAQSWQufUo2M8rHifC4vDpLpJzgEOYWYViiIzJ4bX2BH9WvoGk6wCipH1UMURr2T4p10Jibgv8nIfBgJacziFtwKweHJXiM9iUwerI3B9pIotp4Vy7Osp33G3JOUFSuLfNDpopXtQYPqMx7IJuP7qVnoOZZFsreufq2KZc9DozUr6Xju3mK2ee75x9b53YfhueRjgciNopILJXT66J3cmJ5irrKRWs4ggnTkp6fXDXQRlbYFaP8Ev3Y7jeBB4kJQBw8eNzzGRdfSkQoRkyBbARDM1RRM7l573Y4cRDY1SruG55vdTmZmMBnQwagY4pGOmE45bdnthKgCCRmPfSgACZWHtvQ8aphFwqCO0scwDJSxP9wmijgo2oOnWLm27Mm08VC91lTMNI42QlFF1NLUV8DA1CLYjx42HCEgoC7KzUZBuIirUqfD6MNzpGA4lYsXrXZnIuNE7o7ktTjb6KUSlW6ktDN5o41RuLulu5NJCW5mDzfFIsoOss62oBDGbxZCJoh96k2YyaCPN1jaLnYBpHPZfEr2DUFbE3H7313HxEI0nyVdMB2Vlq8FkaZenHpukCvl3Q78mEPE4Hk34ReHcMt2vRI3FxogHRS8T0p6OA4rpdUj5LD5EYFCW9xTGHEl8FNspu9ighYC01SSkKzQcke,c99a2dadbfb6da10,3110d33e730288b1 -kTJkDoCYEycBDHLC1WgCknYpF77bZNzjApCm3WuWHt2yUGb9o5RJtbiupsvm4jBVE46gR9IZ9S0TXj0oXwMxpGF,95cd1482d8cc89b2,812ce6b4893df0c7 -MtSWLjywLZYdugODEmZj4Qb8TYI6qZzSe3u0Zw4SHhtCMPk6ymCYULXUM6fUp8DqvWIj6L4PG34mWMNXKk2vIXOQiaDKGSfSrdvbHGtzFUj2KSFthO3oYjJVcNb3IMuUbytPScsqVLenMBrEeFGeFCJ0t7wpCbLwZalMF2r2c8M1bLFATnc5Ufxevrz4zpyygUwYD7QcVnynofukSFZsImf9JUM1VrpzOeOMgV4TVPODFPFvJBti9yR71w7nRKJEXr111fzGxxoZt6SW3Z8468c7dIKODzCVf07W47UHk6cEOkjfGVfyrgD156G8Yixi0yk9sjxeCq6yjo8lqwGbfGLUrdWyZNA4Mo9dQhLtxLBmMKK0aj9tusWnwq5OrIhh5iAQeKoPPQ9s3a3JVLn9MEuw4CvGLHZYHfOk35d82eBY4XL6lyUcsqoZHwiMsaN8fFJAxNMJX72G55qAQip3RenyhFxmbUPBog3cLD3V4EdjZH6rSOwEKCEqY0CJScTmH9hQBVr5NOfduu1PPw9YcPHGge2hpunJhpfa0DfyfdUkiIVRV,db050bc41b7eb23a,b4bf00535046e060 -lr5C60BWJ6gojSil5kmCIGdz1ZXkeGHuN1uArBoGptdVLFA7dInOKntMRnAWC0wg6SHDE4VzXYSCXE4JEqZqNjMKHXcOnuUjtR3i0MPfMIO2nk62CV2CHlTRMwG1jdGrkMLbZ4g0hpAW5LDmFON2D96GXEEBNrEhqJcGlZ2VRKh6uilHbdrT4oUaEU0Us3la528Q9Fqdsq1jvzdBZmDwiKWH1KjUZwFMBAeTiUw4nUCabDkJmJsPWVPBi9vXlIAQxmvPIjzxzsXv4wh72mNl49h420qUqHGYpSrSDXwaoTUC2DYNyRDVKGweu2fCAYR4kSnQreCFNGMXncxd3z9FY4GwLC9Eyiqyd6AXZpBVibQJLgJalU8Q4gRrwFveQgay7skhvn4dzOEBjswRw2PkHywTLX8i5qFknzlAzldj0AlkZ9U2sM9VKPpRMa1a0vr8l8hXyW64EjPK7neTwdeZlgxPJAnt0Zj1j6uFnmXk5Q2TJC8aqhdkfpsQejpEGyxOOFQpFK97Znl5bc0,11123af0eb0c101,dbadd6d36d607839 -k5hUiWzBl31JAyzYTnLQi1Ufh5QKWFra1deMqzoAaYRWGLFyTos1YWBojBTNUZqYoIrHXfBRDPSKW0K40Rqn3a9nbNxB8pxe3TmfIvFwGZ7RBhAXmmSwcBWoG4xlu04uAXmBSKlIsyy8couU3sRZKVn3JCYUcdR3xzOHu3txEcn6pEt,5c7c3efda67c92bc,5892799a4c20919b -chbHwvtbWjl1BEkl0vQPKKK6iWklmPGFTP4q4v3HnK5gL0vDIHYMcxzRX9PeGgGiBZkLZaT13u6u4fPY9F9wOU6kQ0isQ8rsnUqJiOB7rkP2OPTnOs16Qln7vIFmryidNKmoT6e2Ft6RcH1RLQuvklP2nbSyQ0gPapQqnRY9uVXhJt5Oid4POMLFVsn77OhqOQMvDGktlQHqkFl5SBlV5xTzUUMmWbhkm70frjYbSElC0DSCugZYHLLZAIdakTIL9wAoXjZGpgQQTwk7CoZM0RM0hyzi6WxdukWcleD2b5hC9pNsRBWcukadOLNOAY2WynUGhaYNeSg0li5vmKWFxVc0LD9adM8D3FRYR9hEjmiEAqz7Y00DZk2em7tINZo74hKQ3AiCMrEj42l1PGwGVmeST7rvY6xubtYA3ed6ychqrCBsqqSgiOx3EW2nKE13GuHOamsAE0BPfsmJylYf85rYzn0WP9P6U7j6GvxP6Hk03Y2O652ZXWFuY9i7J7PBP7fDhuzAF4Zcyv1bLEMtYyc1UKzytuVCbBw3FRj5Kzk3fbqEh0UiKVRqfWQen9oUWDQTCsiNtbde8H5JgIPQ6vQF2RI5SbS0Y8qOaMVT1qNuXyO4kvS81EBRYiYzScbJyih2gdVJZan7azLTQkil17ErCUbbUeXqfJ17JeiRJU9qCfAjxFZRpdn3bzl2Y3pRn0DprEdDakp7fBeJiCF7iPhaCf7r37EhAW1qL0ivywT0R2dwH,7e982eddcdda9e0e,fdf980b1c7ad4dbd -bdOOnHFBEpu6GVhYHwgoBKzHxUtAp8heVmoMJR8VEuYc7GzFcPByygOeraw88wMuaN8nxVZF8mRKoABGUN37ZuEjnvQScoi1VcJx8gcHjTRa2wmQVw1z6ZyPVsbXsihEm0jsmNm5ZLfH43Q17Fu0HbRinEYBcB6okd8xavUluFo9bvGi8Wmxj61UYTWj4BQYa8sQXmMASzBBbCVXHCjUm8HYIP5r56ALXHIbQZXccsPJP21PHNWKtv5TUfJq3qV51c3YDPM7HOrScGhDDWkpC799NjsI6eSl0eO4KbzLLZ7eS8srCwg8sWrz6rT39CSu249AzLhB37x9RG6EbvDiA9WMy2qhCy5OLr6aj1IeZubV3gTVRozTtZ7PupgbOTqeXJev0GLpZGUBVTzhdyqdVm8oHObYWcVYiqaHKQ2tChEnED0cm21FKvkQpGLEI0Q7LYPuALRmyZREZ27VKoiG8nh3zz0mA6va1MwfldNY1hgii3fPcR8Ndlj43OmhsaiZ31yvi07DPf234ltDiffr9edAyYM22ljczNmOWDh2XdgnSaZpgDpyyh35OZ0WS2vMMfstKNMP9gfF9w78gHETvq1gLEIQBEm4NCA471STfuoc9UDDT4xXFyZouBQqNRf2ulzTqpi4V2rYkSMr2,ce458b3af119e69c,1bc58f452a9fd4b6 -du6blOwWtNMUgYeImWYjFfPrdsFbAJJWKvoo56dIMP2Nl8w9L544vppr0QkjRSYcktjhIT3OtTwvOGUNYnwbkhAMP3qPEhGhpSHhjeGgg95p2mA4OOucoZZL2sNXr,66cf0fee48f1cc8c,2b8d368b40a62c31 -0ucp1mmEoz5wuLB4eLvz863a9J8joga6sXMfsJpoTOOmQcDiH9CbjmMWNrqD452kJpayoYwCJG5eEloFUNSf26z2R7eqYduu90qliYJ8mrYDafoWQhw99ppHclmdBFPcEcH9ZdFYPSuMvUlIlkaUcM5lR80Wg7MRl1Ao94GNtu2OkxFFVTfz4uquXQallDkcu1OiuRlGSry4UEoq65d2jagRdiyROVaRetDWV9W1FIErPTLGu5BCOJze3ZrPJcFZakwAiBV3ZaSAFZxktcWNUuyEDv4USMI17wzBOKgop3U9IvelT0vtFYp4zyBFMG4liKcnvBfgy9ePbabFCHE2KvDnFT4c2IBJxDFtbMtOk0P9rlYeMTdPizk9xqbgUhffGbaOTFfhu,2ff2e09404410431,f7ee28fe8bf73159 -lpJfSZYuEj6Doz3Tw4dvCqpaUQCD6WahESketMmB1PegOtQiSpg7WFmvjOsBthG57iXTz9vRg4CJbbag0rG918jcF8oiCpke73Gg1ZBnsuAOMrNkH3,40b159f4f6e80b8f,a82aeb3766b4a95c -ReRC3Pt9ZR00qBP9ponogMeic44HBB8DGjaztnepHkWGahssguNhxrZhoYJE6uTQzf3Py7xGbJnSXgFr8WPB7dvbrhNbdHwdiCZ7BLhgyfpMQdCAGhtRhTGcDJJI9tm0G5o9RtYmnzCi51KWJYsfDlsqvH9Ojci4Qe1gqYxxnW8pxXBmFTuNp7is3JQRWRrCg8aGc5LNhfGDgWy8uaDhAvbmZbsPvfJPUtzahdQDoI6bx17ziri9WPuWPBPmdx64SYUJAVSSKR1stlk8Ep2hVQ659JzliToWHWzzeSqKjaXNMQfzGAZzFfrI2QBtad1ILv2rvqpzThow81mtQoq9X5tROlYY8XEVQ6oOCoAFti0hoxaSsuv079YK5K0OMweUvKHIY5LDfEP0JIr8hi99uUoDFx7M6S49wmEBhoXGqtWwwDBE8MboDRqvuiIhyj7T9cxGqoDt6DsyTR4UcIsS1Y2YrGFejMnxGbNL4w8cloujUJfXT9lkp07gnOphRmpuH6DfJ0atQfjVBgzH2AfWq9o2KRif4W4AKvvk5jgd9kWET7K4yiQKhZ07jwv8zoH5hklW927JL1IpKHrXrbeKIW23GhVw5TbZBtIG8EkqO6qU78mA3vSJYsIJD0TrvJChig6P68nIqEh9zUjO5OJGcLzvuM4PxR9bGT68K631UDIp7SjtcjGHm6rgXsRTAzKy2bPssng4dLDZZukKrriEm4hMYNV2G58Ic8UGLUa4uaQcjUKBHRPtcJQMQClYrxLeyMShP6jySbmx4wUpnLyZoCwMqeq2xzh2uVJfW9YGfLVI7jEwRGcWBMrxNAOrm,5885982eb1e2d0c8,568a9b53b34916d -qE3GnhxN52l42AeegZhwSSMpC5OG0DTrZQqcYrFIsJgQyf7JCS2yeBq3y07gjec1JDfMxRzNcLtuwBtXMNfRqh0gS0IHSMirHKwZz9GrmDctdebbcuXYwF5Yh2BWcoszgNJwAtAeesR57sgsewwHqIeD2LBwVBc8pOK14TuTHDSpfqEbhAgcsTxuZ6rlSjTadNU3rqfLYvuvRhSxHcoxRWtu0wMs1UmZG4jlxNgAkCKcuv2yhcd3ydeb75PRnYC7UOT,85d1082aca8865ee,e5afef5cb3aa93b2 -VodqBFdwHage25gK9kYVLxjCl57XwuewBRhLg0Ztzt0MeoXZhDFMoRoq9jHZL25SWAW4WIhkgT0M6Zj0LPT4HEFWUT60OtZAs2XwEqwWAbhpCOE7VCBZuJjFOvZY9p6DLwQczTYumLBLijneqB9BU6smrHuHyroFfrwOwKkeQDX2eXAUlaE0iGOrfEDbh4U0LoEuRX,1e41962dc78b937,eb2501084eec769c -c90usbemY2VheLnlyPAWnv58KfhqcsY1lrRlf0l9vmnxD7Wya1baH3h0skrPnqcmPJ7u2QqealwSXKTF9MLyr3DebdyWnOPhH8d6BthkHwUM4uxA8Z5fgu24snFO69J1iQjVuPXEchvdapt1OTq9MWa1T0FQJdmen5DsufjPuW7WPPS9g7fH6hUWs5YmGSySwuP80bjmLXFvUQ16t7PtKPJeQgIFBTDWcRuryEl4VCyFehyprRwcJSVhr0fCwrFebQ0FCipLWoHPycpFEcJmx5GterdOFjY09zEZko3YarG4ZilHIemQ7ovOZPieUSayibSbqClUs9sp8xhXwqLpHXWk2L1N6hEq0GOl7GTyLjK0VKnA65tRHR2ve2QQW1UVNtfFugXEbl2t1aN3sG4Apjrq6ck3Z6kQxG3TeV906MIl9kjgL34eapaiJ69gNGWNXd9FAfdnyhoVskJw7CmA0pgFPfDhqpex9HkFM62wxDAb0bdwnvtGmTrjXUA75TqfcMOyqH1KJx9EUt2pNGv3jCiDDpp4,448b777576fa3cdb,16ec9dd16477550 -hGoVjjV8xPZcvOZ5bQR5guM2JyqDZVvtBS7kimPLB25nrKbNQ2uhTXeuyqUUsP1Oa6WmqhvVZb1YHSMD35zk8iOdcAjzkcAovbThqI2V3wegHd8l71UhBYlo8GTnxCSjHCqtdZ49Bdx7GkUfo772oq0mIkNQ9FJsbsTm8qu0aaJ8Mcj9muxSr9fxdyEjAzAX0qGH59sCREwQIhNcXWklgQ6t4g6Ow65enFkjCrSu0pFtdWtjYEIpftjarPAolYO4H0OAqQuRNuUsIULwn1Wj7Ix8467VMadlBJ9gmfwBAhdGzthARg2LfTB6SsA76W5PbuJHjusc04VYq2zeSBGXq9Q305JFWANumga3Pv5vP8DH0jq4BdAbRkXKygc3EdpL4M0sVdIJ7haBfC6k5pwes1oHip1dIgcxKIuW89T8kO1b46NzSWoQsXL18b6DqStEx4gMZ8kjT2H0fqSYGWxZlZtVKO693XRwz36aBnM3yqWAaIm9Xs0nr4XILuVTj7lTrWhcmaoUfqX9plbzqQIDsXWokQiKkYNitjepan7QdIjxFQPLtOBJbigitD,962b403bd191978f,1cfabcfd7e0977f1 -UIdvzeO7FOscPcHFk4BBE1V7KUaYbBBab5fYCjCIsgMmbVKKjMkn4RimTqIwHhRfzKhckZnlrnFmBOJWjv2UqbbYojp69EB163HWKZ5eaGIO3xh4Q5DlZ54YnDBtHglXriW1k6GtaWB9mBeY30hdjogJPVjqhVuifDecW4RpWsO6g6KKnmEb3nwzztsE9F33bIJWTfO97qKstLgDpI2VBlJNjWTQlONpenA6J8tXJJS4DuM8VuctdUotqI8bx1iWmWXpxv3SdHtxxRZ5l4UwuQ4phU6hPFI0FSI6wVWIbSath0M3VqF5bxf8SZA1k6XLE9w6TrgLmYSQnOBL4xPLrKa8EsRxgpr1m5qSrZ2x7WZfy7buYYGU7thmcyJW0fDeln9WrmY7OAPpQROUaOSWGCmGDhnbUfSUW74asONir10Y3jISCsMlGW6JiePxMCMplQrODMTciCAkwrK2TsQxenP8EnmSNaAoPSj04QIzZXYxrnJTzp5cliVoCflfwCelc8splTqOCtBpQMKEDZ1cCYov1ntCBiMlmtqDwtpCHRe5rJDUD0d3yIu09VDu0I9OttEyLAEK9Rch0L2qkTbVj2WEP86R0UGPqSgon1QXdNtdedzYXabQNvzLlYSIKkIYSWJeSZcn4FayzygMYXcqmx6E9RvStliFuRjO9hm1VjEOQiG8mvJWy879YEbSwDdH1y6EwfC30MTyEMQGyQH4F4LqQv2B853HUMBspDPnCmEL1lhTltvTgLoztMWTw4rIvkb7GgEIe4CknonVIbBNvtp,a4d444581ca164ce,c28c39dfd758e198 -5jIMHUzAj1gmxc5q7ZssnchFF1tIl9UUSvb60PPHRB1QjA81Fe4T3Jhe9hHpDs8s0n7L342WWa3Q1fuirZbd0Si9Aa2cqCdfJXVSNoU3um0OQJGqCrNFT0EJSbciMm71UtkhQxCZXCPn2Flzz8SM43ZPerf0BBVMoQcJrcjVUU5oUGAX3KMBKSmMnyhcl24ymeTgdI8YK2e6VLULjYgAjdw1FGtIsXxTQLhOhpYdIFWtoYnBmoiZvdwZFtD8qKwUd7VaS4c1KWuW7ZL4Tsn5UFhyHq04I2aX9dVlyU5Qke2QuHqaNDCGSk42nZRA4AyC6JhI6Ktj3mzooRCRSi8laiCdv8f5LilnTRRWh9Kb6EMfQ3rXJSqHUZvWm2NKGM7mSO2Pb2iWVaHW89R9rtJ7CoE8DWfact0hQ8dBBuXuA3pYRvkqswVPTVcKS4JULuA4R1TXwTmDNsURRDzzTNciTKm510sHaLATyaOfxuBRRgTCARF5ZsOQXNGMMs309XDZAtUm,f6f51fc1eb2a7ce9,ff58c80676c97be -r6i1gSuxmIp2XizIkjlr9rdMqA2yXNx2GsaF4htORbSgNKFQnAAdj3bhqEyUVc6ZeD8oNn9Ha6VsGtkyp2qphoZBsjj3vukTSps6UJsitSFQuY5LyZWoYB1i2Ac3ZhMwtB4xkrF59g5JfrxxJf92oXFI8KaYyU4Hfy30wFBcnCWJ9I0bZ7nvJQTKl0idFpv68B6hLjTRy41lnfpuy4gSIl7iFXCUmxVHZBoayNBZJe04N7Iep2G8myqE8qaLQrjy2cWs0qiCcdHsADmtxDNFFriPwRbx7yzGBDupay5Kkr6uti8ZhXiRWxWi4a3gedB7sNwWp0FZ6GDOC1NJP0c1yYFXF7JEmDIw0FRkgDIjmpH7850xI9EXCPUJDJMeEP4hGaTbzPNEZ7Do118KVOcv3QVqQpT49s8gj1s9l8QKkmDWZajOCdeezWEy7D41ahLe2PNj39FiMakOrHpP5w77rGASrjbax0zxXFrK5cN6P2AXag6c5ZbngRaABVj4Drzi2HFSk7MYLiXlegxR0sPzDyDxq4UzYCGQiHjnajsKdbIvKlIih2NdLyTTJloqnqQTWWQMDJ900ksGaDjQPj3pV7qhCxpMTf1cGRUWXjWMKpHb54G4C1z0sCfgHuFzxMAPgm48fPfEqOyczMKtgABzYAnCgctgQXsjmWVssRQ8VAXRhWyYL2u1Z90boCGw4DjLc2fcwsdNhSahgqrWFHOz1wFdOzuA2NeW2z8ew6n2VpPstCmWry9DiqGRy9FGy4qua6RarmkOYfJ1mm2TTIQkmfeW1lsQds09viWSqq54VsS9WmRMl3oTGlSzHHzsULoAbCT04FDk69p8fnV,aa81fe22110cb3eb,4bf093342281a397 -veH6KWAUU8dbvDrZaABUlWeUpHKW5vV5mTOSftl3L4myBz0q3j2bRcYK3Iu96RLZRc8ti5su1w4BWzo20WMGtba0FeXKBhZzNCfnDCTTgbTdeyhVFLv1i0PHnYSjYWqsM10PsWGxwFSlAiGQMuVMYeYtvGGnV5EL2o8amtIfgVZ6JTe6QkJ0VGmcPCqVrgNd49JQsr9zGz8IW6FBkqtbSSP8vfQdbxvihvVOrbzvTmi7VOzDKOlf5WXkNQWxKP53MI7GEAhsJWavx4USWNdrOg3q0E4p,6885e2e8c8a31d27,e2c65572199c191b -fTm9ABqvtFtLlROvi2dlR0OilKsfqMGM2z0tb2PD9ZVmdeJJeNTttK7JShHRp3as6Ap37HE96MHim1X5kKkMnSXFp2wBgkZ55sgTkn5sJQzQYINMz2m7onIkI3EzzopTCeDvtR5n4z62cO2bNF0bBdzneWKgIaBsyXiNLK2V8w3QreQPOfw8uNLSL3AqxStLENnMVORC6lpKJhP6F3F0JElEgSA,2822f2062f174578,ac7d2c076990ff22 -fcfdmd0IC8HQDCCwuol9wMZOgtwI3YcAzNJXjCt5USbDeSRRrbDQ9F3tMS,71883f9b92db501d,f9ca43b34aa75f65 -czdLlObHkbJpJ8bvKPOzTlo4bIJkkFB8PUI6AEV9BdESqR4bnxSXL4r1D568nhHjHj1ARFL6oaOjkimBheIhWnH8sRwz1Kk7b8HmjdtppeGZ1aR2C0HwbLiiETJr86w6nkbYSu6UBlMJfiovZSMk8bRCA6mTfL2StX8ePwDuD2kPVQ0xLIpIkJQw6dWYzOcO3bBGrr3ejZdZCiNktQ8JlcufqaoMyrdtZcyNIPaaLFx24RzJr7wIvDCfVkWbVVJbFoCfBYKShGehLmPyskgU8p2j3FcMbtVMwGoCg9lOxLtmlGvOxiQRzmCYOScHqoP1ckil44qVjAddroCtmINQISfdhPVwcnEb01OiIROELUoLZ8mzseFqaicrsj91d1cKOeLCn2fMIV9Q,2d39e86ee65aa0bf,57c31881ddcd5e4b -Q783vr2rvjJ5ZWeGlPSREBaXdE,57fd4dd50a353ee3,ab2c5fd9a7e98ea6 -CuV17UMrqVDCdmHLoLWQPuwKFvTuXuWgdiL5O2ZsEwrBleoIxO2Ci7ngbK6hN7Y5Y7PoKPLYBmu4fqVtdVzCe8An0jtuC8WFfQvYnXnq6eWa11vJzD1qdmWbMSJXTp2zJgoVcNTVJgviJirEvACghRUeRSOM5KzzEz7yseMOSSapwKKeVBwpCtB6tl9RPwhAkwZIFkjdpeF3YA214AbTH0M1icgDwl5XhE0yZnMQuMJLjiTnn9d30xwPh5wj74zVgoXvjC4pjAlg4bXtiaPT2ugLy9LEuhKu8DVzcGFxJmRaT7VXlSqU7Co1rMY4ZAtRoG46z4zhRwEClnISKE6jmwDcsNCujufgfdQbKR7zNs4AGh5kHP4fP9Dadb74RTHY3cLLewtndQImhj1wuCwpc5sUQ7WZGtHqB7VE1rLCRnFEU8EYXc6QZ8PCe0P4fgEUDPhKQrZOX6vKFfd5qTpMKV3xv8D0N985VLsuJifnz3ayRjMr4NYiijWla0FlJqHEbHqFKVgz9GTl8p9jHPVKZ9fCLVtxLc2Gvp7hTPfI6h3OJgeHdFHWGf0vsta2ahJxKZswMWxzNzn5C6uiLJzArDIecnlRE2su0SesTzJ6hlU0Gf0Pat8X2AtGaKYe3H7IZ5gqMo10QjvWNWqeMNDBP9vZYilAGB9x7WLR1kUmV316Ri7gy5Iyg1Y9DvQZwSjvhfFOpkHYTNyvva2L8B59GC1cD3v1VTsu7eQNRS0Cl58tHCjj25Ta1GNk8vqEeyTIwK7FFf6oW4xNyTzcp34GyCWfGUoprSAdFiw1vsBy1tSJ1oc84gmdNGPHIGkIYvySU50K6ELtFEHvFkkqe1MpjAcSSn25PxyUL,1ac4366f58fb0d96,b319d79be1adff3a -s8JEmzo9OB6QQNB6qEJk4OEDZaXT2LQlpcw1WNELc9e2IDbm7fUrnqjPyxRp0pTtESDc7nsiAMlRwyFuhJOXDqv0i9WpftEKLFXNGueuYKB2TTYI0fpaGyzRqg8FhotllUzNM5eqGyKIAxBuCdJ6Xdzp0Cmjin64KQXIANx0k4dCZMphP2FyRHfZDqCH0MhjuP1178lPWaEEGwAI7aYwMiDumUWXTIM2e28TaD7i4T2KmDqPWKEOL9J7skRk8ytfjC9Hffe4U8pw5rkvFXepuUlXgjQqaqrKQshaojiFxji8CaAXqw38EdKVPnbBximq3SC9x7o0oDWF5KG1KvJ0JLn9GfyMFwELu6BueusDbtnhJ5aVJmNYVY5bHBIbO60cKKFagGDRnMnvs7WgG9SvmLH5jvMMEx21Q1U0X9rgJiukDGLwqFP2N1PDXkihbrkj0Uf59XnvFGLxmvDiGdNpHj2BkHQvA4YCCdsNH7XceTrxPS8NaFhNY6onehNiT0sIvGlhF9sLq48KITwIEWEVTSvLu8eK347b9htdSVnrrKDO2v7BQyHEz7rBHNffJQZ7IbYXdKkjQAWSJNXSp8fuGBBvVdbeV9UW27tiQbd67n8JXhnnWNdhIUBJuuAel8h2dlGUB0HFw62YgA2rQhBSMA1DxleHfw4IZup,abce905e5b63f2f2,c08f5a10d81f68fb -i7o98rTQ2KjRtRTJGivaJZY23RsZbdgqKA2RFIrAHVO274y4FU3iskjJKvxMFw59Qpm7RpW0qsQQtrE5L0W91jvbizsJD3y3lBcCpz9ovQ7UZahiY8HBrfYnaLbibWsIwc3deXzhWJRLGjw7jTLGbw6UU9V9eWNXkr9oTyujUgfz9cz2sPJrnKS2sWDHOPytDW9Zfi3FyMDOSCJ2Lf9f7Rm4J9HgZreyk9loNGVymNucZ6FE5OS4741rNGaLv8GAczgV6W2WqAACjJyMLSBmp1QmuFw2W3deMz6CDQiybskRMx1tPgT73cYXqb0uflOZq4PaqcaJb5UaC1TCp2CZzHUVrS0lv1FzN9HLSkwbwnZtfgjgvB3dSHCF8iQXtWTcDHZToXwUFwaGOCo23PuYi5NmgcWyFV0cgXZkXLRPIb0S2NDQSBcfjk60qDdL0z6iFY5GNM93RZ1t7xhplWkCB78EOqkfWsSU4j94Gtce9FsG7YzYPa2Rj1YDv5kZB4WeoRobUmFacZ6wOIQwoRGzKZMFWsPM6GBGpxd7qWEE4ITzlwcXyjRugLS6QiwFOQQcNIyewtdxgrBxOgqe38B7hx7vjR3xtHGm0U6oQFU8iiWcJRhlZwZcCbENV4pK6TvtTwCCTLpl06SOIX3lvdPGsfNyg0LagwdjDpnSq5tOiAlVr0cWjJU2ic2hdUop7i3QxdpXKLMBXs6EIM7j6l1Vm3Cmc6nhAvhLh02wUT50tHSYaRMQh5faBeHbMlbrWM5tHTFey96ppTeNZcszCJqKAwJicgRR93YfAYBAo0Er9LI8bJd3qoQd6eSPltmkVV4RqF2JVfdLcMb1nI5xGpQJdmWByu7jk2W5SJ8YxUQQGBzJDxwSpie1VxDTDOQ4lNYZpf7YTEpDdBmAsz9uRWSuNZty6SF8L8xlaa5j95SlH675DxHoKJ3aSU6,c4a2353dd8cef6b7,18c9d9c60761bb05 -AQIn4bJJwuZtLmafgXJJr99FFvf7dJTAB6QrQUIiwBzzkQ9gDMcGe043UbxGoA4IUsF2iMo34JLtGTA62PCBxMqrKUZEi446lQZGHSTqH7Rj9VizqK1atm5UmRezWfcBdLGBQZMeM623rm4H1PNooLAtV5xOfuqbc5fuiqbKbDURyVzNGf5h8wTuLXZhOILvwcw7jKgyo7FUthIWcJ4TtyDcSe3hmVrqk9OfX7sjygmxA1DRJg2Tt4qCEW41HUUYSse47hnnM4IH0a8ehQs5i1s3wrYoQ9xHigt3sq8MNZrZxgQHUygd3jDz0hyptRjYrZGnRgb03IdogkqgXDy9cHF19ukpcD0A5LxAHGuNCrCacbkVGAMsXZz4TUh6UAjF0hxQY3cgqLnQUdyhybDGuHsFE614VyjoFMHItnrTHfGYfRktNhA83JlRNsoUIF2TwNIA4Xm9duHnpVXdz0vJNHmWFh07OozyhqD0Qaev1WnZJFLUgpqJz1PezMbDyZz8KOTZEZ8C0jWzHMay74GCO7YhFTxyNX3yKfTvdMB,456c750d0ff7d995,5b9345e5b9b60c3a -yYR3m29HX2V0QYnZNQ7GiJ14mYfoizS0kragvTvDkdR5EEbC4sGUU8FgxefItyqzzkenJXvFRt0kJlY2H5xN15hXmynEpIvcMAxma38VdlDexZI72abjLkjMuWq6ui0reOoD74E8K0k58rEKtIaLez93XqemIFfgY2t8spFdHyNvhXhFVABdXYAKVS5AnRSRT8IXzQ0T8IGrnxMr9U7oyFjZjPBlOMXgXQk2q1zzqcMRuMPdbVx9UuWls0DD6VOFurYpQ27DmR3H8MmkSTLxMqedvk4MRbmwHpBEzm5aNOV2CaLVLzNENhA8zuq6MQVCEFWPf2N1U6i,be8b9706109b8d8e,7a33b61584cd958e -lYArqAIQYtAYSge6jTKl4XTxaDtXj4FocdSXP8KqDk1D86z5rMvpTuesYsH3zO0cbYmvTn9EOfWzq7NjxaRLAwe4P45knQ5s1FmNcEgj7LbqM7eOaAUkGkZjISXW4vlYgslXrZsqORYzi2xG1eXpkbxZGEtZnoGQ1NaER9v2gRP8dxpEsSsG56SNWbqzxnbLd9S8RsLTkdfMt7RKhoaH9sEErxDo4QIvknRNH6tnUe3QtRvyIGxDTzjiXInEl1MSZdVJAeKmZn7zaFvjVj371nxfpDKRYgkifw6KCMZMwEllHOHaTykCh319rHjlJtLsyTYcI7waY5AZQgCipBlioirHUuvb7roClEIiSWAQbWs3FS0JQr6fEPsTxgUc9W7JPRv65S6MQBzI6RbN9Twl64zoSNmQ2ek1sclhIvnOPYQZp7Ycqf88M07jDqJxNvjfqEuigz7KQFRA0zQUsQO9cMiPmQEABCjpoGFgeECYpo6xcvBkYNPAa5yhGO9VhCOJUkshIkecHeDKXsVGznCVjbRBT8MUQsRlZfXkrWmkrI,9ff02d371f385893,cc062e7b4cc25bb8 -WziNdi0bsbci0OOhBbjpI5KUQcOckA31uPTtIgEje99Bj6u9rnQLSCrFjQ1vLV1Sowc6qpV8fvfiFeRmStXhO3llljDMVrsd9waXqELC9HtenGYZZrLwHHw1ptvHs7i2jX3kKQOw05x1QoisE0eoXXkYLrrFaCxIZyFZCFzA4NoYmF8UZb02lRzS5aTyBz4Xk9LOZ1Qn8x76ZKWZUwQrlK3D1TrP9R1r8LKYG83XnzKzCFltnNHd6dGZGEtBQZFzBMJNRrigACbQP3xjd7LbcHqTYvSqZI1zRdMEgwtWKuuzsr1PNgoiAhumncmRRAMPeG0BEqgwj2vRfjjTVgUTeW1CxYb0J12OjNWid9967iJpi44hvZdqPNiMRs1RAe18hbitTEyz7JT83HBlEv7udY1KRzJL3qNb7jLgLKadKwWVQeBc0fTohW5BOQh1whTqOsC8wQDQaGTJQwn97AtVlNro7wJNPZ9WHQyBOLjAUQEQOvg0Ja47bTiSnDFDd7eAOpiDyq2vsqrQWRcYuVxBgxw3stM4t6HMogNW2kuHnZIHXG09gPzUGvcvquyPWwBYpXHFSbrWbZB3aIRxa3SmPwfpOkb2tWcHZmt9hto3HIzPjR883ntvkUHVqijRJGSE2Kj9UfZlZzTryDlRi1y1kARx23oJGuR6T8CgCpJR2q8Okau8TMqJPufR8wHnLlnrtHjZzPP8QVpOEjksURkicvwxC8dqOFsYvHVq7ARBibvW8ZOc4X1E70EV1fySYPJEk26zHyKVMIJvE1bJ5d7g8LoZM7X0eHqrh51gSBfjzNp1twVsXKa8usPy3pvKWMXCwbeOur9st3J6mqVGOFPQdGOlN0Za4WPmNgpeK0m7Xl63XI2Y9mv1STTlhgD2y6jiWTljnGZwUs97o8KdMQNlhk1fhEMYSHxqpPLWPqO4CktlSyxAeu7cW9AUBhhOE9VEd7T1INi,729e76d021448526,91f723ddc1eb6c3c -DErzvQnhXzh5OYJPJOHkVhT3txumjttkPE2uMwPUaqCg1tqVChdOU8xuhjPQXbrebwzNQWNMP6ZAO67iGBNmiUkS2koYcBUBzpk7eOXBq8nPXKQhESYR22kEabWsVXJXTWLLWepVBbKu2dhQd058OgKyMD9sBJOz6ZYVCEjkvA6jVvOo3kKH7C2jZas5U9HuGJep8x3inmWiPsdCMenKZ2pOAOlrGDHb9w04WMjdUVrLAPEIyvGg5ljsKVOwaIm8cUTWZEFX9Trr6rcxtZKQhHSF0S1lzxxSyPZPGM0k1o7E1vGRxkFkNXVDPSa7YSijSV17Rjr1tTnuIXClozMZjIXIiy6u3usZArlP0wEPZ9uhjtVXKk1gzUaxutcCvQXPqgRm62lS1jlSrOsY6Ou2OLczqorjH85ayMH5kjKyWYuavymD66spcAdX92HtqWtN6Twedl5p9ElzHmgAxABub01JvU4IaFALGNVdjP0Uiru7LXxY8QSAB0KqQGIQaMAugfqEuE1LFDh3yrmTaNLsalIfdtgfOkgBTzOLkJGteWrjx85ymhUKvLtakgnlVvt5LDDp4evsxrX2SyMW4TlE2WJS1NPexqolEwk6QJUs9jHU3UrZoCSKVUqsez3c4GEAkYttoXVmFLpCNsCzY3jWeiZpTP3RiXLWkdTLsDU650PQFoZ4WxgSX6HNLVnDJyJhTB0ltUu4kI9uB5UBBMtUZ3bTM28XdcaZQqL4dUTVAYtzgoG3K1JO2ne2XYx0uMPA8NWmp8ehcgfmRWiMMWyPtnsUnebrrRfr7WW9nhSDnMYq5HqWCGNb5lPZ1lSNtcu57XZK8eS5uPlmPJe4lLe6fw510mNxQCmXzchv0hZgKgTGyan9VGbctVHAnXmtIbUAkndluduY4t5cskRVMgVsfrd4UvHuVtsEEdYftzgC8,4f967213fb1f6f02,c83ea5bb27ea015e -glMPFcO85vEcPp4YkFZ8AqMOJ0fgS5Vi7SD3L9lxscnwINLpJ5qmFMVuZvrXyjS2i9b5xzlb5EGfBcT6A5LvPPRPkx0SlUttLJWbYkEFZ2MZbDS9yHmIoUD6bws6j7iZ4gIozsiuSa5FUsT8P7VvkSadVq,ab6d3be8d09fec3,becab31686bfb7da -YE01EUWzH7QBciowW0qJ65h76ILch8gfD2NlrNm0WeI0wahJHOZBIKKCi7IukoMOaeID2x2nUzmn9EKIj50oBArZeYan3SJpAjf9H2WDFtWOo5QR2PqXNqoJx1EcbsNTHIfweCYEgNaZ7o6vyRwnIxLFgEsliQi9G6yV63KZzKX9ufzVd5LPTaOURsfggi1H6NdYyYvzT3NfocbZGZgiIziNGSovdweCQKJeEcVGfYEm3mIJRKJpbDVglGJzoVAKnJGa8rvBhW7jmUoZlPLn8cXWAvx26dZZ213tENLxdo275lhJ2sUO4jUDX2EHdiqQ18sDoVNrn920bDpk5rPCh81MEMMnaYu07qxsr6m1GaEdXHswfleM9Izvn7eGBAOMMEf4PDvkxHUAkhRUrNhW1AAhfhcBvdTnQlWAHKQVOVZy6XvBgAugTNchXya196O7qVG3UxfQU4n21sbuRpsWf89nCuiuYnGm3bXKoh8i7cw9ux6CpRQ1O5kUmeHM9S67wPF1Oi8j6mxZnWfqsFEK4OD5CdtV1Tiyg9j5vGwU38pWxM3SukeSseMPhzaGtnrJD2W6xZIEpRAfszGErSQZKtOg00tDXkVdGfcPgza9oKd5zhNEGtnBTIo6Hz99qpDKJUdT6QfPkA0RI0RMPkjYWcQPJWtJ4vsXsvFL2i6261bi44CtxFQ0HpAlaM93aO2KLbyuyP8VdjGESMKIOKnefjZiZ32vnY9W5UNo1MTiLkXIMPQIjg9Q2HPZhbpYWBA06V3wDbZ7gHr3DR1MnHhzmE3bp9ltsIc3hOObIV7SP8YrMLQeeF80UDF13nM8ATfjh5qor9SF69h76YEvJCh4s6ORDYgT3T1mrdKU19BTCAXjmTj3sySQm5mhR2dCm4KPPXIJqpaHZcU6nu4IOJxiU3oQysThD2P9vxAC0YcLaTyhLICCScRfbUe,7c8edf21f6983444,ee3dbea000d336c2 -NsT4HGTeE863qiIHeg3P1IzyLwfbTHb5tSnfP97TJTL2KWvp8XEXxDAkDP9pqwCZ0L4rvxS1mBfDlKwQqyQKkvk4HsUcfzPDKfUd33qEDPO5UU50K2Uynk2ZWoISDinbpC6ykM597HjxOkDUBMndmGj7DNpdwaW637boq67BagukQhP2wtZJmMySeerOSYY6IcTTsmdZT2byqoajcB4PIaSeUaU1oaQ5GqoEUgjuGTEVbrLBxNl09a63L6BBtrC48OYev15b3624JkPYPvKwLWLhfhApXEkhtnHQgm2nlCAf2pu7Edt5giU09qDm8paPDxFc5WGCIxcLFFqTwhOkyn0gp3Em4hc9CnHMx2X0D4IktKIJKsZGeaIyKTDy9BcK4Ieha0ioVB5dGrfYwrVnyOpHbBj6KBEdW6R48TelQJZQm8JkzdNrd9HlWMecS2LHv1dPgQqCLAXEj7mXQKd7rPaYdRubdYaCO3ENITxmLhjT8niCwMvlNEBu2sfYHwWWrqJ46suCwvAAYks2dWP2MOV5fWlHrr4AiOsah9tuCOZawP5rlKlhT0bxhZzRWC6mHxQDUsdmmdpKf2UIDdVNAX8FX5iVRJtg85APMjNRANncQX62JKVhIeNvwFOFHnQtW3spFs8eu7MfBPtImLgaZTJso1RUZflWmaIkQyEvSjHo7nHtwopRD7D5vNOLS9NxVXa2G1u6NzyrLC1hqFoTkcs8lzkiUYrZ,4c8cb89ff7465c6,7d821189d4a8ab50 -IFY3iaDXybLWeMCs0HyhnATTQmRzvnXgHYWfaqOWXz2e41BD3zvjf7TYF68ej0VpEIFkpA3nvU1kaMdX0pwzlVh9eTq8XuTMUi7lhTkEeotoZ1dvoTNft8Oa3ty47CrHeYSJAaitWdW5QqLgf3elQUblfPDmCXEYgZaChEdHYsCK7sN2waKhg9pTTUpuLzexG4XkNkwU69tuQDlaDNqtIzzxb5IvDM6nlqkUUJLoDcnkqq1IM34ozB9JHD8euJAhpnZLHxm1tQhQppN8BMIDSV88t39fHGVP5gb95u0Rn1OIz2EzYaciyKqNYzl2JzvOhFmheJAwrodCE535NFlDNYlcXzKnq4zTKhochhMFlRDOtFDqrQN5O62kx98VuPgoenmtLxzE3aLMKi7k3TGcN6dt6kJsXe8zUFQxBNdu7r4njnNLqBxXwUwZnzc47xXWeHy0a93HRgVFog2sK8pHAcAGyN9K7qxFDDGL5VxQkdsrGmkrX35MkuD0281Fu55tA1knbQrKzoO7JUdgJomVSariJZ578lIGG2O7O3BwFGTWh4pzOKOllQva4W8QIERnpsvc0Fk7xxYPWRm32ue9VgvuSxcPxufsg1gpcplpz2V5EtEKTpNprHjKfShtpS6wNQvnTeAU,fcc8183501fc1b51,3e7ba833ec380ef8 -ufw21XqSsgT2vMAfcCyPTl2TMtcIBi0oqOMZNYEdcL3yamEn3b9U8w3uF3txKAYtaDJ5i4I3dc3tXOQPXhQ0lfbPs0DQr0FldNPWloP5yX4DLelUBMlmqofixbkMEPHuqcIfF3yrzvW6pk71x27Vs47vTh5zs1ySW5ZAip1Osw3cjWQ3xKD6gh34WUuutXUUL3jwWjqLflhVni5iwWaSAmImgwgH61jkrLAtP8lksbt0QkLxkG1lyv0cPekWMik934oLaXlxEF072qwR0vhbgB9tQOcnkQKXTSkLLnf8pL2sVxQ04kxiOds41qqDu8fmWlV4xaB1A5OgTYYAcl4KCMzhxD93rjVkIchWS338XrX7Klwv5x2Wk7YFfSlaBYKIzWrNyjBdbyJ999tyaVEkaXpkGjVa24CLqPloH22e9zVmiQ3dTQbWj9620TC4xtfsofuQbndD3NOB71ZRIXfZgFQYvCOzPflGLiYJclTI3ulTG0iu0GkruHnfsMP9hbVFnQPURDVGebFgdWnX7Epo9q7yVu0R3eFXBm5FIZKJPFcJjDiFDH7sUihNJac3p3Gnz7XOynEyNnmSBzwFN4S,196932fb679798de,1d474297e5cab6ae -emQMF02PiJ5zAtHUgmCv17JH5ieoSKNRd7fBYGqowLT4mmNVh07pLVkXowq8hJQMCPvEyjriRjTIr9FMrh4O5MoPSZSdaYBRQotyxA8RyyyRdChELqKj8Xz85U3l8nBP6jiOa2ljPXebILOrLuhtu8FKNbDOjMpRfYxb463GGbl6Q1TRvKK7GN9XkeEjcbIE12U3yJms2qnYGM0km6xT1FXMbE3kvFvKGiHg704N9U4fccTOKJ30pAAZqIAJbdUHWtiiXB5RhjMGKguhtAK5NYlwkKCbPGTmndFJ6gs8VWBVbXrVC06PBVRquq5MflRBlgZKuGnylvltHtZj7P85wLvsVbNZyxcqilnQnishol7doPcrUgulQKCgswxLseITDTh1wvMyMghpioR1ww3HspjiwOvBfivCOqTU1,73c1692e4425a8a1,88deeb3784835411 -CmTPFvM8ED5GduMmaqaLmKs3hMzmVHyenPCXbtvDDR7bQBOKwcKYYaqBTuQlZEZfzmEzcRxws0bl33GzqoFMzVjfKLjCEMJNwCRZoZMBzd0J9qR0NmbVY6ROZanTrmukupzB85LafK24tSLuWZ1ouiMWkWPIbbGpOQN47kdH7b9on2Qp1cb2ctNIHId7teehDmrPxY0ItliENcbSMufzowUiqapAiG7QNUAjkq1rkMOkg9xk9Smdwg0cAqqdWqakPuLqeXhcexZ7jS0QQZ6cR9OeMCzYztB99LWmL5tz8UqCXvnxTSF9elzrrHan0H6xS5DL9KaGypuEFwQqegZxrwTmU9aZ5jusK6yju8WZKcBOldpBpbjUnxhnNAZu0LayfOxPwucaCFvSaNi3zsawGVTQGYg5l3w6s6RjgRIO20PAZTkdte16YLnro9fR2OuNNrz2IeTIwU5ZZF6nmY2PkJPw1HuaZvUBVxyA5ljyH85IkIeiQKiDI4u49GJlLOEeyHAKg3u1LK2beZJ4,f34c810948880635,8aa406c7479bbfa0 -z3RyQVOfJvG9bm77aABLhoukSn1wa3skSye7YzbxcuZHVBLUDg9iVeVTZYrpXTekruzX4PIHFoPbqKcnx96e7uxZPoBXdxfT,4a92b23c649d91d0,92bddea05d56e395 -Uou0tsWrXrHF1f3xNkh6vkOfXq8wVVOgo03K6STk7dAut0KdziR7ti47Jb6P7ZwSU172e1nFEFNGsAd3eqOHefd0HvrBMFL6QztjOwxPrwVQ9THjLr4sgXRv5A8xTPAdLkTRuz0vFhTUgWTFdE4qkqHE5IdkF71PEeBcvzQ1KdiGCRlkRsZThDKBFoB2nx0ghJue2fDneK944YZ1kB6IG37zFhqZGNUsyfjKHUEcABObMdGmo9jgVOXI5EGRdWb0YRyFZ5txrWK2sK9hDSL1jAFq9UBAY1J8jQLXrVzc8M8EU2wVDAvUs90nt4KJTCdgVMsZ9zVdLAeo3RCSgURRPOizujW6aJk5SBTEJXFB9dTjZmH5vr8EysVwWPD5Q7KaCIEfq2ylRVvNyg5rXp64Ymi9giCH8BFfnabwLDYHdCCy9k8BbuexubAPj6Xl6jvxBS3AAtMboviclu6fzp78VtPGdsPxDKmYbwWhv71TEEKTexvZfLHHqLWr5kOU00qDiomtE3Kq5OPiuq2hFUoeIUCs49jBQNK7p2C9SPhqCSHUrObVYRA0YBz0e2xSUKE0Ikj7h83JBhzioA6cJPNngL24MB7wUsLCW9u5AEp47HRd8rYCwAdJJCzgiddh6IdD19uYLop047vSuwm9ONrYyM9FJyVCrw0VTBmnST7sQ2OQavgEUj42XvzQyYW0XmLp3ouBd5e3HQlUAtcB2GDzQOoAi,75ffa98556cc644b,fa520de5fc2b8179 -29dq98BjQZs2MVxNdVM6UAjzPrfBSBiRTHEP6EESZslIN7b8XDxkA8yYLUkC3ACPRVWARGcCHL5aKHqStbaK07ob9W2lxO1XlzHuwsxauLnDdOrBvRG0xhoZn5aEnt3JsRPj2uJkuTYq,4eaa9fc7c8eff6bd,b5e6c7456606b2f2 -ohd8gcljledXGQYK8Ef4zN73WfZbYsxk2WxNOjUfJ4SvUMGCHcpRxTLaq2kOIvmHjkSxDRCS7d0u7jIq9bRmEAGcOHLWlky8LEVeidk8AkcMtJgZTeiWuCr9VXeZkU7dTfqypjx9rQ0ImDF231dF1eSr7tc3GY0UsKunHEo2NV1slFxY3l5VXXh8DOAx8q60F2dpQ0Q3JUENv6yJNxXML7EktCYjeT2JIIe3Jnsqi82xOL8xHuvqYoNkvzh4OId0rm4g3HnnGWetjebyqk0zpysDp0dDeL2w1GIgcEaIGOPAB5OsP9SbnW0uSZUIygmDzDBivSGhGDqfRKXIrLfnB8mVyk4gNfoxQmOsyEyi8XXFojInDxYaEDXCrmTP4hSZFzTGE5ik0XTTCqqCR839tbB0WQ0820xWtgbyrP0EyXwIPykVlufJdRoZSbiHyD2BjhQQshFGQWnx8WpweygMmDbMlX43bkww0T9nCrRmcV0Euu9Px38vn6xuVWJo3jcW6CCMrMaiKy9nUUnQAJ5cCi85bS97xDgpL1Q3IzTuq2oHgJdwyiOAWSaXP0HkWTUVLtLp7UQdACGz8Dv4TSY0PNef4cVf70srUjYvOtwgGdo4fhwkkwzdc3o69My07PRKXixvEusMldc0KPLcB7TgzaNi2UwxX88FIyzdyf,c46dd1bd57ce931c,c3f0a29a91ffd34e -tzu5xGEHeL0Jl1uxzRqDb9viG8Lxi4ytLzfR8OAkd8Gpe4HENtqT58TIVgv8qp3IVmUyZVSsbcp5gZXYiJgQNNCiwvNyMKD5E32uZUHiEwsrzmL1QMABEyhbrFYZQZE9KwcagwMTtpB85ivt9qdN2JE0hNpp00prBqjKc4rg7d7khLMCHaoUp6xydlE8iQ5txYtmdOYoX7bwXZ5nRhB8qPYdM5g3MOhz5e8AN2JcE0YXoXcUW2A7qAGd8ZbrRJLIGKqg9TpA6AmXc9OK77bei7Y3j6nr9TmqnPRnIoEzh4y2Cp7yx0lPWd1Y5vKabDRDNg3Tj6NsBK1mlcW7CwQ9DtKCv2jSAGje5UHK1dIQIVolM6cLfeVPJ9wzHvUbAMXNRoZwRgxa7xZInzIW,ec08be9a533c858f,e6ea93df827b163f -xd7eKGweCyZy7SG0WJultfEWtORJ71ce8pGi3JfkR8vpUWzxAthU5Qj5WpmIoVwIEGwIRFjeAnB2eo1u9s4Onnz9GdQUJz8MUY26nl2HStRJN271Av0wvARazx7rfo2hrBX4PgeOicsDvS1RnqHIJpYqeAow3zuUacQTnXQWxSEY6ZJlEsTRjcYaexyQu4ykm8Mm76lcfFJQv57l9JfHJ8RtUypK6cFdcvrAjwiH1DLEhJb8RrIKRzLvWPAYWINFKjcS9gPeRyrmXiJGpG2kq55PiX3furEocFlsi6GQ08yzJFqHYNYZQT216A0dLLkqDBnIwLrwE5FwCXVhO7twbO2KL9Ovw13OWTw3vP5bBGBySLMMNclxA02pXoCIlwr6TIf3D344NizCoQyaK1CyT1miaas1VEguvd,6dac7403695171e9,294ba2b59af0bf36 -JOITwK8UTBzuTjCb24mk7erJyQoymsMdv4RAxnBbkuSrbakKqXZqKg7ZgzdaakGju1UHawaJ1dOn8GuL19Q6UJEJqadmcio3cmJ1bE3vo51QAK6m6mYXbSiWX9Ho0wTvINNW9riMyyxFSS3P7puETmdDzHqDvhZFBc50AkZWbqYsfcCJIMSExebCX29EZeHP6Hd2lr9vYnjdQlpOJ1Q3VF9FABabG7dkMg6WBwK5EH2xdyKOLitDPkctwMdaqV9bAeyPa9ktkaJwDEgj5gDq6opZ8bdcHuiOcNeinqjyotuH8ZUNwPdNwr0kkg3Ta9y0FStAvzMMutknIDxqcstziAD1xdgqLhPkJp8LJnoXgTojPwxml0fm9GTwK1HZfoBqZzPYFlCU7p0lp551m0tnP1PiZxF33DFe0lK5NYpytu77TekCt3H0ohd8TZn8K234hxx3wf60qQS3bVlUD6qMZYvsuubZt3JfD01zKEpD614F3Y4iIxySTrc7ft6ZrsXizRXR5WkJ73oiK5gGXVKxckwCmvEuTuHTHkb9aCRLy,74dc0857ecd622f5,401381421652d7f2 -r3uW64XUl1EQNk92YkSpsjUP9LqIbMBd8mITlxCIH8W4CGzJzKts0TA07d8Ttx5ORpnWOSG2ipR57SwxPl2B1zcdABerjMnBDDYcK0Z4oZJP8iBY8EBJDBGo41k786UvKH4eK8BGTrVsIv7NOtOoN4VT1bTp,e652060ba4babab1,cb5dd8c1ed0fed62 -YUM7bjuyW7jgIkS8eyaTI8tFpIlhiy81pyUj3xe9FKerXOMhane3VuCEsyf6n15DB39AnmLseBxO3jKOvD11kMF4F8CbGY3i4Ntyc1vA5tkkDdMGsEGvjHNPoPxHPfb9IevwK7IrJucZCmIleuzE1A1RotJ5Q0a9dJsahRxJlWTpGyotgddBHXnAlKaWJDEJnfsZ4tWReXkIEWi1k1H3Egks4doKwnMbaJDOjJ0bxoeofY5ioic4qgMssmP11JjzxYyW2fa3wR84UVBSObQLfXDfvpaaqRg7fEIXivY1cAxZPoBAHJX5rdVZlPUIv1QAhZi,e5e6581256bf3525,74e5c767d2f129d -npLfuYFQCK4Vj1ZoYgRivV176NRP0G4me7vVs1CXOG0OvW4UTMvyMK3JSs72eWs1emdyAMGQvYR86VuAvHxWnlVOsb2yNK3Iu66FiJuuFEv0sPhR0,a82595f3c3464791,af205669a9b5d64c -jmiDO1WpNhx4CE51moeoYtRADlfEUf9Q0DixzY6s8RDPQ5etDGJjbocRtlotYWOWb2ZbEYgRKgs8y2Y5FuovDWjalNOBVRiwF26jRdvTrCIAxyIsU7M8e10qNQmLlhaCtbqqVdEcnm9uKNvVOSoRpJPV9rhsGyshoTzeHYrxJpZKYdy3KSmsvT0EgRCcfKe2bnEr4TCoSqu46HP7Zk9kmuZtyCExPCFQP4uSpfSq1DyNrCUaAaAhdoAI5Ai0NYA3eB9lsPL1chUbFk0jeIZSCqOFgyjgQ6pjX9Tz0VzE,8809e15291e0a4a5,f820a56c44eb97dd -y4nA4K6pLkN7piMC5V9bMeDjsU6I,3046afd2f7fa6039,3636d462d6da94a6 -ii5BUpgBv3ed1XFi2XYAAmpdyC9kyEGQkW9nfJgSJsxNplv2qHTKcv2TPVGvLVGx4BSKVnzJpdhrxmd6OgJrQVEQHiZPCKKLRJ4X91tkpnTOGzFvbJoSkNDdtr66j8OivBCEb213xTw8BVukJHPlfhaNmoVIvt7Gx82XUlKE4XnZ4BukOVORfCsVR1Of01qHnFZ2BTCQIvyMsFqO0kRM7RcYx9y36XJQtYkZfHj1nhHvlUI1gccfmhpmRMurAXESUjW1T6WhGRWehvTJVuHL5X36CFYOjn9we3Vo4aVgLCcjLCuCEPzV1iZLH4XdxMrkuW47Z007xEU6el6YZmC6x122t5O267QxvEStiGkpFxv9KAClPUAl4sWUsIsChcCrBCm3ZwmDIfbX1RTbCSpakpTdSxoblQCa80mc4ZmJfqi8kKEHdwAcf5dxv5IGhFNKrxBMijGnbI8Ole5jwCiLtwvL0QC8Zg9GG6Sg6V7Y9Ln2xX6EjjrfHaOJ9ImaXGrGK27H88ZgTirxAB7UPkbqUDgenKnwovYtuA3FSezTHiJYiSPuzKDVHu0h6QjlbjCjpAXf1Dnr7nhzzHcauTBLsY71ybOAXv1xQF6I4ev1c6bwEKF9pqUYheWgU694T1MwouiGfyyxFRKWI5jMAhrQm33905ZnBt565YtbWA1ZY1xS1kzkUQp6tYPL1q2TJZ250AcRnBT4MnDrVC1cpaiUiQUNvyNEJnYyLHtMs5F0TVtGW1dshqKMhZsjxL6nwtHm8rurDGY8ViWUHdXe6Rld5h7AH8XFuSxTQEKJvHeMlrFI9SXbMfSdshJi,9cc61d8f21eb1374,c5bb0e3cd03b6d8b -yaQIGE4wRv5GXjZAf9ZcUagu3Yawc1BtHABEHj79k1Wi6p3SbejektikTj4qcX9Rf1Uq,9ed2a092ebaba1f0,2ba813b9bae75414 -c26cw8vBlWj9SOEulDTqreQJ7h9MD2X0xekMsmj1ILPcMDDTZ9fmHb25PxgCf8pIGPDXHA6Xs14o0oG7FICmNTUt85gxSKAI3QzcdoFyRGvMzd6d9GAt0UzDjoqjNMY0Bu21nxhrJZAzn9hwV0ncLf6eL2ZBzsbZat4AJFJHfqEyVnVlNKymS7ta7Uzyv5yYRL3glOj6y4GRkTWHKeRGZh8bt1ZobkWfdJygJDteO5IV7xDFKtRV0jhZQaEMFZjvksLc73M0rdbwUkfts5VfH5z4d13Ej90cLORvVYt9XoJ77ExKA0QcGAetShnR3Sey57slSop6evyNyb7cuy65PVuFEq0o2hq5QGz1VGyIZnDG2sBmZKP62jUz2OUqwVTH3jwXM8wlHOPaaHou20kbqJFDrnKFBkc6pFi3F845sE8GPxIk2mMcaUiLXYwhdKMTwurlsiWZMgO9eTMxqRiCKnHhMxEv7VJ59wWr4DLdjMeGkgIlsmkAp8YCRn4Y07H8M00v6HrQUMDkZ8AKa6yO6M4oFpiy1vAmP9BogI4FnWyR67sT9Yrx9CfrCkwbBnOYwJhZZUlEydsfFN9GjNRkJnBOEKVhtWDr2VzvPxFJpFZnZcQALYCAJ2sObmaaevQEDRoCStVLf7oiEifAsU3XYPPtizvkl7VZB4XFfiJKnwgXpPBYESOkUbPBbFIFTxxPcFtGo2iGlsOc2DFJJAY7RYkbWxbcjA5bQJSIc3rj,4795c1ce14ff6203,6592df3bf9983e0b -IOABH4nz5uAUjddcInPrZJO9xZjRXOS1g4WoFRBmKEd7QDc4zvAM7jCdGD5BDHRG7WCVfCzJrY6BHR0jIpAzT1mvd2PHbJistru0kxxqhn5wo7wdlAYY3zMQYHIVk2RNcTh9ra7oGbGIZVFCKNYhKj96OSZYocirXnf3hjnf0G2RX0tldO29IUGAmBcYefhrVvqCur2RspSDcrHCWi921B8mphjKTpReqwqQUqOUHrFftunP3hdacOwAAL7WwV61gsyhFu312VXjtpAXUibj21QIDlIPAJytbb7aFky2cqRdnjeXYxjiyyxM12dQhFw6hD9gchcEvKQP4Lgea5DUst6M5NgKD9eMArjcKZbQ4cwx8lVaLZwiGx3DBptxScE2c8WYWHFp60Q363Bf16OR4YmpJfOrW0ASDPp8V4BTIC9u9f3DnBu4iPY3laTTnMH56XIyY7Ehi9crkshplg7eEBQtUusURdGy6yBigTNtim3fFJVOSICjTNs2xLcVXYT2e6mGcbO7hRzf5H0Tndd062E7iryOQ26DTBg6gVsyOO8wZQ1hiCPLGQ6OvS9brdRNFIBRR0j1Y9VfVnaGJeieJPpOUHvHDampLTSIsCH29oVS23Pey3SGj5pDJbdVfqPo4iUXqRifywG3venJFliIN2hW8f5eZlMCEnNENumzmB8SvwMVRuoI031osPOgVBJOz5GQx9O7D0J5N1fyDbFjvWLkeMTF0Fr3al1oQuqAv28A7ILyh9lAOwM3vIRkc2U38sCwpEGKgZHHPJxsRFcuxlB7W8xYP3fD0kP0ESEFtmRVb8Vl75jIIEAlzLHbWSMQeCRJwoBNp5QytBrZr0AWkeZBH9BdKJ9ebDwpk5m9AG8HvoW6ekk3xAyevzDxzwW,62a702c37194f30c,49e10f012e40c4e9 -LGXWgYU38F2QQzMysW7GpmSOhqWntzZE2qiWiNMDQNpothqTW7wOBBhSnQsq0ofNcjYUzx5MyndI64oLV7kRAP8VS9MOr3LET7WqXotKNczUGuHSDNRz1zp3QI0CFb5Bteyt0LMCIPzdVOXw6S4AaSVzbRE8oDpIMkNWflipGvwP9fBgCIn14BpXhmIiKz2EKUPsK22Rnsx6dge2CzHlRqew3mkhtDEOuYOUAykiWGclaWrywtCYhRtwiqDmnbnUWYBX6VZozWtVGXFsYDEa2RjoyaG5BPAUveEukioTe4GRBHybFxN2yZ0erGvyP1foKYtpbs33lezJ0kf5jqwRVFEJ0UhTaJ0lXSoTSkR57zEaZQIGjLzmhFFGSLW6FXhf8CV90XFelDyc2XzxU73wl1PinoTXK2VXUbhiUe73wk1D4XvnqLxLIKOIAJfcl8D8osV9p5YyRa8VfWibzz1f4dsRBD0APoMCeV3T9ddMTZ6LSGMiePbmaTvhXwbWpSacCBF1oTJqkVVoi2FnkjoBc0mnzrb43PUU7ipewmDXBoOXB9bWKQ34k20SWlduw4mGrvXdUzApPc66Wotud3E3qZqHXFKO9nt5YyzBiY7ji8H81ISGHDRT2GVHngqXxlb47OmT71MZo8ZiXzWd7tpiSsaMJONBSqTS3lMdtkjoMiwDgl1nE2GK8utTpVNekQ66Xwu5e212V8lWsgQriQkl5woZ0JncCKAJRRMHpMuBwUUj47Hol33E8UQYKe6h1N2ATZQ3MHyH0WVNC2yQ4,8fea58c5ca5523cc,b378042d7007fbd7 -QUZXhp2qvG7Oi3pOwJNSAzmh6H0QXHF0XHYFR0Rh6HDhL9gAP9CqN1Gb2K52BTZkiLDx5sGrPhhw3TdSRdgm9sH3Su5RlVQyUTocCS0NRU3zDNB3JpejUkPZnnu4reI8NEqoZk0PUH69458Wuid7dOG8Ogf2S6fC6kfvgrFWKCq4nQ5MqAU2rAimcFT61Rp8rT3bc5OyYs2gwENyawKVRfgkW6lmTtIvKRFbHTrCQFxNeTKWu9s2H8LVI8jSRxQlhtA34f8kFYUkH5yJhQ2Uwu0Wqkn38LSYLc7wwcXzA9o4WZChbBNBw9E5tbL4SqY563SWgDN6epVyWJMeM8aZwqqnbOiGRG8IOZe62PXOL4thzSaRhNuFgm3YmCnjDLNiNAPwjVUT3gxA9RVHZF71r86lrVzylRnjqpeIikLi1Rk2wy1o9KFKxPR3Af4QQDsI69zhAJdzsLqfhByao3H7Br2DuORtNMWwaXUsU0I2nR2i1zSMEfF3KVMDVfvNJ9xMmX6ocOZCWiioNQoTYCFGdYJFImbgomv19mgHMUVHiUcDiZRhrMCr9Gaa3Xn0mZdDxSP3xRvajb2qjE6NCfsTZuH5Jn2q5gSDUdKD9rkITEu1Q1vqdbmiWe6Ofowt3L3g0M6Lcqg29wk8taBcwFiDMUvAcU8nAGlgRqtEucbBc8vFaVL1aJRDOvCYkuf6klQkzI10ss0hhhDD8E2hbF6zFaqz7QA2HcatlCjsz9DMkMX9d0KF88AcHbZRj9BhBmL8JEFecr0WMbrt0SNCKp8g3aQOkgIyXomQDENcWHnZr9x1KORDQmjySwmwKfP7nlFdkCFplD2yS9QSYHnEJaqqB6,d1e209ca9f99f504,89a16c43c0fd5428 -m7kS5fFFtFDGpk4bDZqdveNVGvtZZIcDHrJqsdhG8SKbfCiQKd33RWKa5esXq0so8UtGZMFwf0JWvqiBNmxLnEvJMmEngqmkDpMno1oa3F8Frn6NL1FBu9BMBSF15IuVUdzg9cFugt5DBwcwAA6vY4CK2vSvrPmbDnRgXlzZGTGAwv24DnKjuaBWaaeV2XYE6rSOSYgK68MWt5wmLFjMJ6VRK0cXF7teBzVSmBHrEIaWDAsVjFeLqtVzeV20vwbGPAaNiUCVLGZlxuLOwEAb6LcmVC9ZNxQXpSioxeGXqa0enlUwuyU1GY3JKS7jWQbRToV0DMfqpjeLVMxrIHMEHGE83gttx5inxBzNNW7seGoTLvrSub3QcrkqXuEysMPmWbG0TXBzMLiYdMmAb0M98iwkS15KbxTgwvMJUuD8RMI9V3ggbclOPCwzCymcMuWoj2nsspynEjempa9XFj3vJHtBahEduOaaK0Ogn2OIt3icKBNNIZvcPmKKidGVq7anYXRKalAuX3kUABH8ATkFCt3neItcRO7qLKv0GnebTRxZDuKKqxTaJXlsTzsDsPTKLtMVqRteBQn8g4VenBvmaiJkcU92rOZkSZc5pAbFOLbRTZ2VGvZrer23whyxZkHYASZRqmECKtUSJNrE2bP8ldTGNDxcCCrNa2SFu4TCrplBOV2ci0kJQEIqNJi134J7m6nomts6p13zhYns126CAJLXU13YbJoIPebiRPKwQ8jCVXj2HEVEWv2tNHClSJPJ86wapX7T4FWaaTD5pz5ymfINRgzIYlIpGdxltcUywHbUpt07UzWyRBM6ctWoO9mELCfJBZoAhNwFPUseb3GZkoZpBa2rBY3dKW1yLFXXpgUS1jCKUKWaTKR95TdJdXtHNdrAeKWrNqTlNffBKvNlrfjZ1pyPVPwzZlL9UFhe7IeOGDMU2erm14GpPQW0wTUlmmTEg1QWdYOUWf,9ba1db1a2ec0db10,9cb4ca76490e2a3a -1o12uEfyksj8MVciO1QG0ln6hwlmfZbauPOpOI62nzQjGnyyvRGT4njN5JCWep9injzmvC3ZDOWGeWOegPlBwoqvlNNCqkVMACDqb4SCaGTg2NhMNNLkT1K71eLB2Lx7llJBSRuU6YyvWUdEd6fARfqSO8BnyEU6wwJpSULOfmoputk2yfHhRNdSPYxFrM0wMAwRRmoLxZpb80P4wzlhmVCJoBxFPKGZRJUoR6yK7waddLqqqDpenID4JZPHq,34b9670c3e42bcbb,49646260cb15eeb6 -Msw4zxyRtY7DbYcFzZ08A2vleMYKCqW4b9JlPlW2O4eNPXQd0yfvSoEboSXabD3rGjnqKs2FLhfgxQcx0qOew0gXhXFrIgn5B8KZaBwrofI1s1h40uNsGYh1YTkIGFy9YbqKqX4HtciBGVxezxjYV2qd6c9hbS1CLo2MMFZeEvWf2weKur28QXxxOokJWDbcy3ymaofIwkhSTZEN9m6z9tpKJeABR1idiTcdTxOn1ojgONxLjMSUdpJP5qn6HHGjQ4zB34Jac9ThM,a0d67e68423752eb,e2b5f74a0be1a554 -7ZsBYW3QQhk3BB3UwLEtPSiUOoDBcnYasDeOMDTMXj99ziCpGZQSvMl8DVBX0coT5qlwkJyocHmzGVJ8j1XLeLr70wfZ23haRi17DKY3HroAHpURGxkOLddgpZ5dQtIPtqtMMnE34DDLuLJIxbl4N3hNNzYZ5VfoI1IdmTjHI69b5JibVJXSUByd189wkSjC2dzgyLBre0OIDjOgkPOAovnwldx7eL7NcSqxvub4zyVC5vVSJiTwbLDelmDgjXEu2I57RcEGCBHVGKUZe6wnhKz8ltety4W8jKOVaNPTiN5ohEgDfSoXandggWubsEcG0IQMNXVnDE7Oga9H0ZlC4tL1Dspqdrwe6eP8GxgogTp6xGEBdagBCNbXX4GpAeEc9P8EZbksW2CawgAIGJO3BFppSLeYdXQa6PS6Fg52lPW8fvao2QKJNfuBFuIYxEyMYiS1feBZrlvpQb5xihLSS9TqCNzC22vVPkDh8bOEgaxM5VX0DC2Y8bBrmgcpPJobniaj07dFsK32DgA7bZ42xFPE2TNk4Rrw3ISdyb9z62fErYA88ePkvx2Xnnw4UOasyg5IQSGk9UJMwn2mJQW1iRZmM4aBwfT9VViSBfsZDkX4WRY5K4tPE9kZM77k1ulzODJAWOh5owfkqusMVxWREfm5cDgMPxIa4IuWMGuyj6zMBmWIGdSLCMIrQLOMIfEfcdLYJcmQDcxFz3Yw7asEuanueP3PabBnRTMbHvsdo4Bz,77322e386aebfdca,36abe9260671766a -RfiJwq4VreITtFBkmhcdxPh4mrPUzcAYViswLJzC8beaBWc8OcgfjTEadWFzeVwaY,94ef3e079e5e88e9,bb77944c46081331 -ovmAsJgfUy53UliHHaszldsWX3ggo6Ioq9Q01lEZ0u0enBGj2iDttL78mg5MgPsmz3EdXPMlN2ssx7gzHrFOLp3LpEc60d8Rh8rc8PNn8BlkW7OenjDKSrTyf31JJ9nMfOKXhz3QFTMCnnDB5VUiMNFWY5Nrmbt4E24Hhp30E4tb48u2PUYCvJSmpKooBqMvc1BzqZZvnwybKmQS2dMhOEJaeCE6gYbc9bxLhxs64dgg1y43Gc93Y3cSTSbaW7oHFVAinvNIuLTeRhKNtecSN3hMa71N0EckEa9Cd0dsoxaNKkPXOnmpKQneslxOc03U3gVMNF4r9MBfb1vnby9n8LnGc1jS9DmCUKRWYHiAhjuDr,7c2eab1e0e4e2b52,e27730f7526f15eb -BCI9QrsnCSvXZFKzOTt3suOuPpI1KXlJHpDnVPKVHSl3ymmihgZsI2JcWXmxCxnpU7R9JKWFGWx8WcuhkJNiyaz2USso9NFumFiJCd9HGkFxGlPe0jJT5hhC0yr6F9MxbtnGFuj7NTzpHVHw6FKW0sGNxbnvReY8xu84hdM7ErNMGSZSPOr4c48WXlI65bdgP0xtjFU9pl6M0zb0XF1OgThLDZAiXL4oKAu1Fj3V,7705f5586e3a65f4,9e2766325ef64b7b -bfAxK92HK9bVy4A6vNFtQMT2JR7Y93ga5kuH8QXNnCVBuRmnRSnneJxIjcm44dpeeMNG7qd,968d9152dd27b167,cf78b61ebdd21e2a -BOYhfGcVFrNZ2vfejR391yTzhoc9OS6ZBUfssio,7be3de81757761b2,d3989d181c563eb0 -r3r5mQwG40nVrR0m2SP8TsEKC1dnHL35oDSlEHXwB0WX1peFSVUGb58uno1yaYLnX5ovH5f0fZaqjg5M4WMNhcPz01L5FxhXXUnI2skRZavPZ3TOPu73PXntKseE36MUTyJtoPCqfbTil8f2FG2LYucDOQkohFJZ0WHmAQso0Zs6yA4QCvzGELlZZ,a1cb2c39b50628ab,2ec718033809e2c7 -o0T5p8ywssfPVvWz3mZDMwTULS7yatCVQrBV6qnnpmx2F70rByVQllWLzPAuBmErCkvi0OOzIZtcQTHohA4ja18vqJ82UzJE1lIXSwouVB1fIa5Kif8sD2eiJFkQH2NSvr4W8ptrNUOkhcLwxjpRrScJuJ0E5sHQHd7yrOh9fzR2bpNpbH8Vo8bFvK4pGlPfyIsqF8PyAV69pDIDUlgtrIx1bTCxQj5P9cKOE03Vax14tM3qXkavzOzz5VuIjPWyKd4vos8imQwRqQyd444cm5REFctybLrwdb5muXW49ZsZhgOEjEj8aYnlHtHwG7uazgY4k6VAfzoJXr4IE28oCXAkSaezeam9lCrQeRNnSdwb8dVhwJA,fabb255e305818f2,70bf53fa7299be7a -meqZ2ZgLWslEwf3eVLS1ZusXVU8kOp8zYlVesIqL4d5QOpzI9yEqK6utWWoURmC8zrh3yBfnsXDXBnwrdxrK1kbRMSeLKJXPEjrYkUFW9g6W4S71Ju7nwxwf7jY8EfXrUSnpqtPewnZZgRnQSZVJ8RODSfhf7btSCAxbZlvtq6ZPH5mvuxwyarr95XROJsFPoIdl5itAznSOG3YVpYUE8PJgPb25v5gDPvCdxiN5Xxjjq6xT8DVAdGIm4KK7wiEhviw7Cs2bnhHrtU5EikIYQa92pkRMNdfsU35NfgAHfocf0JZkOgRFGyuvoaQPKq7ZSUyc0mLBD7p2GLysFPbti5Dts9ctDwjxctLAvvM7VOEIYgLgLrghyt1zaO4RiZ9wBmLjMiqkXgWkBvcZT7n7yi1jgkMQYNhT17062mMxEFr24acsL51Wxfx6oENrZTRRigltbM0VhlX4ZL25vJGpBnxmFJJgWKvd8F5rDutNvK8FF5gRYeiC1UfvTV4lu59P6JFhBYbrJpewTqujVsvnm0ZZ5OkP6eUWM5BOFF72LrjRMhkirT8uAEGOqJvmmTc8vipQ8gjBbtOMQCml9RRFj7d45pI7NZccueVSU9YZ0DTmINRf9QSx1XpEcGyU3HP737JJ5hEc,dc722a8bd3b906db,dc1e672372a2b9e7 -m90NEiRC4X4FeCEnoanClilQPEebXruX3KljFyL5RPn7ezSRPPS4fVdCxo4V3HSKtjPGIYWQjWR1aba29dXTAd0OdZmBz1EeNVNCzplxVVLS8ZCl3FY8vziyQYK90stwhpTWLQmfGUu2lkImXET320hdDsBFTxIbgjRpfmnSd0TfuUBJ4rBHu3NZcPhQqnkHCtB47qc2h39aUZZXRtQF2OdPhrjsMhSaeaa8k854QMn7KWPvGevrh3qM3Sb4pg8rfUNs6S7NIgoz9ULYnJAKODBByvwwXJkDDSBb2VV5zr8nVLNBxptHkddxRhPMT4Dflrcg8eqn0ThQKMUqvRVtstvfgGw8A0d6KWL0d7DbE5pvv3GxP3QbN4ZWmmUEFPhBr0bjKUo5pjeoFbleW73Ljp33SldA4GQhW7oT2PkvHNpPeKCZPojOlbRf9hjGcuN2X9c4daufXB8SnXZqniojUpDUm6468eMdhVdgap7ddKackoPrizjFYXqtoY6BcA53ASXVT8cmiqDNqok3E3xCB7h7yV0NViGuq4lHZnFy5BQ31LpCT6zwZQGUIilSQXpUUpe5M0jhy5nOpFQ0srME8E9yIHW4gZNuIaWmKnasPwu5oZnd12prWXu7V1wpLOYkpgUKZS98nmIJnOKhprnF8EHeeN73n1e4wjSst1Vskf3znD5GcLgk6E1QFbrjxKJxOmtXcrJ1aj1XxB8SGAWlnRHjrO3RfFLS0K0XoVFkSuiCSyFET5kpyfrIFPQgomsDSTwdIcl1zh4jGlytu40x2Ny2W9AVzn1rEIo9iBNhAaHOYfW0tevpHDPfmVmjTtrutfEj6TnuP86vJR6hgrHSxcZC48S2HtoddNwXBiGeedcPc1Dq7mpJm53SM7Opd5mnp4D5TFYKMerw1SfmFXFib71GOfCxqmtj6A9jwLTNcFIAw,7748c16b654914c9,29c08e2688e022d7 -OnXyX72G0YPiOAyiai4TUgLQAuYZenxkk1pIDIte10D8OnY7S6DXSl4d2TGYL1oMgA7JWzCGQSdxBxewCEHT9RdVI0GHjWnLIbG2oDi34EGcsDEiICRtsS1ILTHAV4Dmt9w1kFwywbKd1VCknXCLtgDGq3AJxierAysNzw0BN0NqPZLmGHa5kBQIjTPx8iL2CO5QFiVHJWgtyobFT786nhu6S0FxKvgfLFCv0f3MOIfitynrTCfpvxxPKSgPMpV6tFnFLrNXJ8NilPWsr6Zwm72sTtONn3XT7b7junEr2uaZMfpAaFuUmEIefbI2QIqi2UMJ0e5FRQYRS0GNa6Zi4AocCXRtFP0tbuS804ixkJ7ljG23hNV69gOYQnJjYE9GLVKjGQcCdHWIdwGykd9Hrw1OuDyiyp1GuJ90HZNTc27rSRtv3pQT5nFqYqFgf3Uycalo6kydM441wVr8i91tYEQhzTUdauPan2cPg2n41bwP1YNoCDDFLQQwt54batE0SLVTzYqGWxuKe8KqJROjw5fkYmTv9MPPDaJ4yHy3bgddNbpSPChY0BEkIIAOR10vUGxCM4zVjnEF6ckvRMK3TkB4Ih4gGxvo2Gc8akTNXjHyeOejaE3qoTEObnLQQLAa6BhdFXr991Dp6HtgNxgEEppnWzJki6Bc0nOhJdBIsn912VpIeVNjgC1zSiOAiTjsIDaXSZdjR6N4e2TAlzzeAcG6DDxkfSVGfnImD6bNEX06RZJx3Xe34M5q7z96db5ADEgnB5szz38HPehAiyboUqRSx1km6y9xOX44AhPoVJbhEvjH,a5d6d9d690cbbac1,46e18b102a225aae -AWv2U5JeFeCw80OwRXwQohEhJYxs5MB4PqpnbvPDFrA8RiAWAXgKMTR3PKTt5uIbp0Ua0bOtC0LZAxAiuEmg8zz1WlPcCgkfUbZm058HQsUSdqrfVVChgkDExGFlZCs9nPNliVt1G37tdfbuF3U6kOkPLgqYfex1f9pN4x9nofKmiWUHASNCxej0rHLezPeNimvdHsaNQkfsIrdgtG9xZxZehdusn1jZzpmTU2pzDhLwWGBc0JwA8MyA051TmQ1jJ2vfWUapMtJTq2h67M4A01IZQOt65dA0mzkTCwba68Egumcx4xn60S3bVPysfEINl67Clgb1P3qFCSxaHXGM4FOImaOE307L3rT1vlhr2bgAs3xBvwBKZus04WGHyYbqs5qfWHQ8cPbZtA2FL0WK3PvZSFFmLKaTKiAKXiXmwtcqKKaXFtOFOBGuG6uzrkrmviTFuvZEc9z9movingdse6fOLSlOsYR8rUj1uBDE25L1naTiPhizv1mMaePDxF0A0mDpbuMHjGjzzBEFMYgAYENC2Mny6TocjjX6wb2xblaIgDiuy,170d7c9cd98cd705,1df2f213db30ea9e -B4OqemZHda1tDJrqVKnQMcRRIuort9ZrjE8EKWAAAjgHmVwNGAcyoTEdUyfP0zvFUJZr6EF4PQpsr4hCuFl7aQOJJoze19T61PdRGPHxdk5Cs6MOqEaqzbiyKTStwLaNpCekEw8fCenacKL6va4qcWonrAtDwF1wbxAGV1XLALCfFXvBR1QJgxBRxB2t8KmHCFP1KkHHFU9YuSptMTslcYYWoSxB37jRN4Fvz1PNGK6SFdxynalTEH3Pax82NuddDTfTugEcDngidvjLMiRAZutnVIPw2IzlTVevyIIdJXKFET561xfCOzn3UZeeaMQLG8WcsAJt9f54LkuAF02LMVlt5kIJp1gWFGUsBuOqJ2GeQrdaiv9xqyuqbHjRw6VZswrNQCkEt6b24A1Luy0P4MXbi7kjNRIiwU8vztKbEASKDjnRQb,b2a24b05e13bfe6b,a715e0669934639f -jF5wad0FBApaR51aZGyWZEOaS1weB3Ee37BSOWIwom4uvEdlirkiGkTIh6aE6XEyFUz9HAzOBHmIsDN3pQOxDKhZrg49pt4bNXXug7wXUuIoOB9gfaeKr7LRAMCvTZpKX98D6untUHa0EPTEKGhql1hx1PdYF7HRuf6siCNgG4rbJksdzXlCjqAQfeq8S8MVrDWZoulb1v2dT0EJNoVjmvjmcB8AqonuXfUBbgi1djzx7sJEKzlBCIOeRT9EZCsAL4uFUZwbov3eemIUhKsu4jNfZom431vZ7LslBRPBdWvpd8Dc9nGigNVYNxN5d8ZKqT0kUPHpBea9qgDQEhv0KVNhyPe2DzE1edCCULp0PPRlsvR6yCL6PP5o1XC02XkIYs7apO3YLBmhlwbXTSn3rWfhGQQs4NrGUIvYCQJHCtTF9H08mej3xpBvKbcolporP3b2SLxbLd7GXQyvwxqXsPOAt44o2be8DV1qmsKdikh55sE8MT3pJXDFTebWtbTuIr2Mqaq1iTooMcnH9aTbWP00EwHKzEKUwG2IDHN0DLqKWBfdE6aaySkX7bXUU7PInIAsI5j6qZKhuuQu9ZSxbWiRAfVEZy8VyQI5VZZyxvuDu5h9E0b7rSu9iP4anls2rTfEpKIQsvem3GHPY42cgmZBypTwuicW4uCm2sbQohN5GuuHmFBmkOfnxq0uRAKSwe46COhrSV36n0xunNtzaurMavQ96CPnAIxM2YxEA3gxeLu2OHkBoLw39RN8,fd8431e91bd41df6,2b48d81106a41687 -MM5kzk7ECsKYbBIpq2ARmLkMDeSa0qy9aHfKelGYA2CE1VoObnbgLFojyKWBhvlkbaSDqKFtFGIp1vgX4iRTZS8Cok691CydRGJMla3y7A7GKpKGUSr1nGz6jaeLeaNL4znwlmXvSrFlzGRSuaa5oTAvTk5LHPunB426dzZDb7YTzixNe6v9LbgwdtHCdgO6SnAUqKgo0KYCKpLgSD99fJXpj7ZddYZavNG1WWHPa02ts6MD3HleF04aZi2Uq7c8FDZDfuGfkwsDlidgyE5cP8YiZc7z3neJXfyuvumf6OdDpaxH4qQ1B0enIZoNbuJFrITPc5FXwfvAsgKj3VDVaKnIRAjayRrzW1DHbzBNwlhRiaBikwwpUhOReqSd3Xs35Ocx87ZbOO22YNTKlTfTDLK2UlhMXnumWcg71LyH7gDG2f77VgdIamnCWN2mWGf0u0F3n9YV4ThINGh6uiYmZ8ZzufONfclBxsf8omSPoqV9curCbgnbzGQDsF2420MM4l2ubHsxF8zlXfId4cRgGNICeAOjYU,3c3671231e8cc2f5,651a389be3cb36f5 -izNcC4VuGXWGdKKbG7ry80pn0tXuU0HyS2ZYrXftAzGQLAnv3aEM4i6XfuyvsTuR1lLj2DWsnIoH0ObziOciqJSB3VJgbXMeSSCLlBUMRv0DhMDy6zg1Codak8fVl4j19lcmcpc9aMoR1nUR70IwK6RQWECDz3c6aGiVirYpQuWrR5XhmKZy9D2x5kdJO19pFTWWP82oSYIbLvBO2JcSmqRgnTVAmPqadiUQfO267PvyHntLk9BDZPm7DMXgXOkqDlTHxxaMtr57XaBwO5uG2ZhJTZLpTX9wVrHvYo4qK8bo8FiCMHPq5bUnFjQSU0pySdLO0QXHlWxmHkoYhs2mAzc8gfYyWXGFFcYj55h5s40nz0Ez0XBR49z2G2tYWu6PYjTPQTkMFyxFr2hLoOlzT7KQb9KXymSMRaPRtWJsKVY6dMSJP6T9xPb2zAbYc2d66tdvhOX9W08CgLKSrk9xv4iYROanc2doyQAGSynsgwpyecMDGHbDAVGhg8iBsvl8Rvdnvh7R9sB9xsFZSiPedq8TfmgA2GEYvEzi5o8EzY9TF5mrusJ4PoNTjfZfjPyTjestygcgpxcBdwGgwyFvosGrirePZDu9ud83MT7YlIHLjosAI1nDhmIrei4HkT237Hs84uiuLpiwxRPscnupyFHZucsY4mNmSG0NJ8SddATjsQQkhAUbdE1YW13m1qgt8tsKatCQJPZQXb7ax6s5HguUSHxjoZHswIJt0DJRch5dG4AU61DCbc0v0sVbaK2lDjM2pDo28qAQwtam6pVaRFhBi2AL9nvSreJuI4N4V8BCn8sJQextcotKWYgv3wBk9AmT5deqIGYfnREy3NI5MW6dkhCExhghhkaDl3TeIMJSmIzXhaEAGpCKSqGHyJr8S1cyqMsoEeyUgP8H3BrvqnXC9MC3Kxz4IkIJAYg5E,b4f61920292c030c,ed010a4729492662 -m95Xu9jcTThJIaDEddKTNJnW8upAco8Q0bOeyxPHgnUvKGQ4dUckyXiqBc7ggrrIIBzVgN6hLEmz5e7FoubHffLCS45IE9GXWymGVtCbnAsezQKwWevsBTgaCg1Ta91FUtfk3G9Mb1pKP8diCYgdcdZ3ky8r89L9Yv484M1PnCGnVqlr5N1bb1gN7qZBawZQJxeJJM6um0dADrFUjEag0FonJHETnh38i1b0pceLu9m2TshKwO4ivTYDEjfyxSwCynciQOJWcT6H63XduQ0Kx7kFHTxnylXMXpIad7bA4SHDIAPxXZiHC5d1tTVc8IN0aG3mxbDiqhIHcVnOvYj47l9Gt8GEZrkgkkyZTQvkXz4H9RicyMdH2DysBTHCKRLjV643m7xUSeZx9FpKn0P29h3EOF0uhbcp7n3ObYhYvHpx92U2Zm415yd7R1XhRjEVO7BPqUs9CkUCo4ans56YyS4By7aJfs232nfQ0umrOVpkRy9rYM11uHWBPNMB078s0SEkXUw5319maP7mC9h0n3OkQ8tVvYKezsr6gYwI3gprKEyziyPthjRFijXaC68mBJaVvhxsSHJd96Qvcj3u6JE0MkLfpSRDe6KAq2155IJgn3d2C7njnA8X24KxlnNXOOjprO9tWoFJtuYjcQUeBHBJFrCXr6fehpYSe5DMUfuZiwhDmKRKyyjMxefyWB5G3Z4j0n15pIJiEEGhUPipWaDFghq0hBJqBnI5JGo9xMZ1AfSgAaIX4QgeJEOP7Z0dKXXcKyIBvrOVeAAMnSd4C122j16m2vWa5xP0vqovg8wMd4d79pKIGydSmxn5KjSMBI95ytWqGXp7X68TQJBJBJbVFAsRbrdMxjUFUXcBkTSGbHX2Y8jEVKZ6BVUSjTjkW0OVElvrqvSnTx3WNooCgnnIiDpR9Cc46r4rMeKpbLUr,4ff7de25c927502,45cbc871c7f85b32 -UsuuAuXsXzJuoSkSKpcLXgBn4EQbveKon2x7AUPCfol5uCbWPUImZubzk0qpKDQALHCMJrq5al5xAiwz7RR6kQg4AjZdmk0MMiI3tKNdclG8khyCnQJ7CtzMUXGDJCAhWeQTtlcQZopy2EplAQbQiyDWHUHfLmV6fLYNf,612ca23af4d8f565,7e417bcf53d33f9a -UGcE4ZEF54YC4tNGZHolML8D3QlLvLQ8yfkHhV9hsnrRrmeqGcJ81woaqXoVdzaVyAFYSlQbDmU7G8JYs56TegF6jUS5yHudHWxYAtGGTlchATq1bdVmLbTjJSGRb7fNHMvn4z6qn5m4TiusX2RJHWYoCwl9mhcCr3afknlrXOqXjdZ0dTBy6S3z6rXYmdAGZtX5cNdwwR40YwOGUMFfOYv6dQY2UuyHgFJqu6sMBTZW0akXqY6YVOihnbOXmPLjVhkC696SK78ve7SpB4AvtoxACPuAso8k0n3JAzFC7Cqwt5a99I79RgMWjToro7htT1kwf6pV3buEzEDigcUPYdoPWBGiDnrDZ3G3hpLoqbIFmRVSISMwmSrZl8R8ClOW7X3py5vf2j8D0NMWXqGFsudaBot1PNpv6DX4IrEBdqeZR1Ox7Ti30CAMVmgoB4DDs2wD4E75GR14llM88qpFdn2Tdz2pueQzwur5qwUtAIZyMg9b06F6HU7ta2d8bGkMcACzqYJ5gxzIBbnkR07mrWvP1cBDqPIzfGduobBTZ4SzfY7tu4dZgPIsueuxSwNfS22T7mjv0H3RHCtnKIeWJCvx9gVrw1hHCQpAiICRE2U4ySrABgog3tqwa9Lt3mZHgQJBvd2KAQbDRJPFKESW7H3IAq7IPPwrozWYu8LTgdVUJzmcW6hQVafrHXNQf2cf1J3hK6BmJtccVm8cjFxPSJR9GF0lqeteOvEtqRKrNmJjdg311nUNsEJ2QzEVagrEkE1mMGdfzofNqjtrNS2SeWpGWFcrH8uHQgpHCGMa0rdTDo3U1QBlOdWhTFF0i548txZK91uD83iGlOIs8sdYH9ZuqQ3tR9dKaz5z8Wmrycst,135c45d752895526,b808d0bacaf63732 -BQB06yARiIChobNf68ri59gGbxoE0rTOKxiJPOCjOtQTuR3WUJ1G46Wwumee0bTwMMuJo9j3vs34GwKlyzf5gSuF4o5fxDcATTbKrpgbfn1cPUiBwNfcMjO8AXyK8omtxbds8zmEIchPGX8eWxPRc03so0zJEmy09fsTOI0IJ8aqO0ougxg6lgTXLVi3GhfNkjcdZckDmgEkOgteaLHMirZ511gYBFRM5c7BGtNAXgrvYjghoigEueTkkG5peboXh8UyysKJRgxKpCt13JzePXrXD8xVeISTxd1HrDjuqjLzr65ZzE0xGIR84KxPbq71KMXMheMvyIcBTnRRmgFj3DG73vnPLMBqkySYOujSrTXEB74V4XxNQpOPHrN9oMWQ5FD9frsz6FPIYZXRUBLViNFb7tjZlpWzmhoq7kDytfM67DnlpnEU4CFVSgCtT81mdLenWnzjaTwlYEPpkjnofJFNgRaO8I5gX9bbjiGs68KKDqEW1FBqU2QafHbZH4Ri27QNXejTOepI5hSWKSUaIgkjtllfPmMovsrd68UFMbBhYUu0lHFVziATFF6TTdYu8TJ2oAYrcoDbT0YOEvbJQW5LoBygNNm7Y9v4h5KpjCpJT6dr,f38dfd2c9205e01,ae874772c9a9c94c -Ljan3MeUbsMTzriJAbb0UOYdlNjb9WRVpRMYjbB4mnnwGOYoejX3ygoIuraKUZO8K9TGQClQOrstKXHts5RRl0gHB1hULOXbX9ieD168Kxdq0zAwgVmFQk4wBo7CDXMYv8mOU4CCmqt6nSYCtCr5jYB6vCRoXzWpcXzM9dAuVhGaGQDIGCGsseXMuo0qSgKpp0H6gxGzbHZMFhGxENUID6Q8w8b1JsglvVeWuRIUa9wOGFATzPq8Xe2Op69mUNbBzIU1Q1FIWDzdr0OQ47PBFPk01sO5nzkwPMHRXBoleYhCuu6Q4xYPSgqXWjLpCMtbiHoe726mGWB4qnB0MDfExzlIRgUTlZPlK1I4qfoZTYODbSRCKb2eI6FQWCtrGU62LDK9xZbH2BkH14cC0KQORsNozEWKUAdz4rtMdH0EvY,cee8f0f6bc472f5a,32a3cd17bce18f37 -OKD3IoDxpK7lo6hevS3ynwWppu6fwUlTChb054ADFkGngatV9Rhfqe12jjfdE7rQgKmINkgwtYno3O9iNaU5SqGZqMgqWXfn6iiBub0kGWEmpdEnhscwI5ya1NjjCyuePxNUGFXXHNCxBL4EcfgJfNtyHjuwUVyQQhZ9Q4EuyaiaAMlJgvEfIaJkfmrAiv5dgL6ZMwES9uP9Rfek9Lt6eTuK24JUorprcMCh,67c29cf30568871c,a7011ba5e9368e7 -QmmhcDWEfIvwXZnne3jkFIn8N9A3PW3aMDm3SEyeaq3IfTBXuxKizAv0CJydUHejfWX8Fhr26O9PYPeUFQ5GcYlEoSMqJkZzNv4SdwSAQL9KtDMOf4bAhhkH7fYClLYo54UQHwKBK0b4eDHgj168uqZy1BuBbI0MbaFgf5fivZc6nvjfKjPEgA7jaOzIpRsk0W1k6oOCfAAqbZW3V9FXsbamOs95aKF4FbiS84YhGLz8Rhz0Jq0vgnCBnGcubTJCzWuvK2Wq9W3bcSDvGW01tx2Rucb5pL4D7uVz5dAecfSNrlr1gwJEHobygUW675v5E0dFXXdEkNnkLlo2CER88WTwWaxOZYKTjUZ1RVI44Tn4E63ISP8jGOzVoHUuTzI3oWruxRIaYL9aboPmsJRXHolHACdXgUgJnxiUUJhUQg3vvK0H47VmTQe7MBNnnTSMIqxzzcj7YE5WNvbe1xk5yZ5iAgeveGjWnlBdAQArueiWXAqSu9siGCw2eJDktwMu8N46Q9OmhmREQ97HYLJ7XtvXWboZf8BkCfi6bLGEjg7jQ4PKY6tcGO1KTRoXr8WUpUj3jf0WC1b8hherXgeYJAYJWuIRT00xf8rSkrFdJwAGURPmBh6ASdpguRopyn5Vqn0idiN6h5lNdoGE5olh9hyBRQCZPXwTfdemMpvd3y7ei9orYFGMe5LlaQlyRx4ONN2SAjzWMMYFfeO6r8lQORQ6dODPaiFsFKPezeNA6ncUstUspdEx7KrdqHmVoyjVWnTxMO19q5cusIFLeDXN5LJa92DSlfiEf5kPbzSx7r6a0tyldGDJrIHfKCi7BmwOhFRvyucFqouNj5BJbmcvp2dbjbgSFRJaJmmiyC7MYUlTXyO6Qjlz6RkG0XwrC54TJwnhVVTPjWsX1wcrZ4YgKWWmQcNyPrSYWKibLWZkAcKGei1wBUVqdbsJ0Fhr2EA6CwfHJRYfTRtWsWrWfJzP,38f95d14b3e9ba23,ffe894e01b97a955 -6Q8P9Z7hWlET2HBbAbV0yWABpaKENmIx4oZ8xpDubfjc899Q9iepm60UzOkOfej3bxc7eZo32NQj3ua1gtnfqfah5V2Ra1W4R7TEGxmne5Uilu0T3rGkSpEB9BwyHQ9DuSDNLFqymjynz41A3WjVLVXCuzGdkxWflAmvi8krpKdCs8knGbyzilsI4MZb887kYaTnZ3ul4HVEJsXCc85fkSUyxFwbWlbHtbNbf5MNOqmNiJ7wOxGoBboUG00Dsa0ndRlHqmHd9CybhR8HzWniHuc4W8Mp5lsOsOj5dyhujD36Jzv7luOmM6LkZMjJnC2drpBEq6zO0ZEUDWcH2FL7sNLxyL8hLDcRqSdKMTrIw5N4Im8dOMlxQ33x5nrdJ0D4siuJnVEsimY6nV8aOTBwGIpj1uHDoh5rNy5CeIZiv0dCABKbMnTcLWSYVEQGC5k10IdWzjY35e9ihQlKcxlCfId2Mj2ZZ8y0ONu7Vr2gSSu1WzJGOyoISThNUjrCF8tUFqQtswGHNSL1,75e4240dd09112c6,80e74f7f588d4bfd -z18DW7bXmPQJCEz88PNF0HsEcMXHXSTLRBA50ubhoKj5FjAk3vlVulUwO0oCFiMJxrxybvO18BNnDrWFDSijvsaAQh6g7IXhpTFcOGvXYsrEvagWwOGbEIgJREvaMhsCJ7kc6VBtO92wX9ZzPtYRnLSrfXumGtCjdh83xp1CDDcjxZw7ulIn6hNLkE0sDW7IWIppwteHyTadrmyjBrln4TsZxNLd3byWeDg8PQdiSk35ShHoz9YcKxpKxJ0mVOvg5eht0VNjGQmVmXU7TQ2oNaTh5Sx4ZbWbtixUWhmZDLoE8omsHnnxrHjyFHwx2rkuxAKNLbQhTKmUpprjoQYRDCnZQOgLkC1voy8wUyyx49L3QY9dkfvMNhCsWw4R06628L3lbLcUXSSfOajqqGpyfQLdxQR2czQzQABJS0sXXPIRcp1WEFt6nvk5uzkAj5ukb8wGXhQfGykrB0f1g5mVf0jDNJTtw0SwfZNT8k1onBGVUcoi5BF1MqAJJkIlsKU1x1W5Nik3Zagg1kdHDGhmDdFTpRWJR3Dr23MBbFt3ZVyB0EczBANXE6ipG5yfSmibDdSQwZi6ONITOiNmk5IgCV1iUExQgPLv3RU5NpfMhqyDwhHID0vnu9G3jNJhQosdIsyxFHoTtg5AUHgO40zMxZS8RlcwzpbxyXnb4mZNIMDao0gRUVJ1cbqADXOXQa1hKd2342DOgXqvOakTlLovzPnbbscKleXXaVHy8MZ1XlVWKtaTwzILXciK37cr6C6WBFhvDxEIQJftvNdvg1PSU0Efv821EeOOEUQLa6nWdRGVEoHiisajkkd32KnmpHaScGM9C6SzO3LbthTxw0sp3BBkHEifEHjWErxrX05X1M82QLBNEBGan8JWc7QiY3rn1Le9878sC7B6QM97bVUFpqm7mI7gU0GDqip7MCIXOnPjdMOQW3ycakTMMwgdC8o,902b3041f0390d0c,b43a05381a457031 -JplCz1sGDByu30UU8trTlsa4w7jse6h2v3TjQQLpcQdPnFHvJhuO8TVHXcVonlEG7LI4dwJMI0eQUJgWyUQuJTlzvIywv0dOmb3xpHSSd4hckMRAtNV3uWqs7ZYPN5GAZFoEuFiume3zhlsugMakdnV3w0kIVNPQarf9Dbf5zTWLfGbou2O0j2KQ40v0DyOwL3KsD9jbtIjQJTG9RSpPjPytpER0gvboSDsubsdq0spdEMLdWHeIujtKgIY8k9aGzU5AwllaNnLrRg1ysmkkFtKDdqtx3eVaGW6yf4adYmN7LD9AP95jxJJCpCA7zDPX97Fumo0N29diKF5zXre0aGmLRGWBuue7RSyee68WobVe6Eqs11uDWVN1YfkBLQI8hriBgEN87tjkdPHq2wg26XcAsQHFUgWgr05AfnX4VVQtLXo5MpS1Q72k1eLqfZKQslHz5BWP0IB9IlAsUCpUY5LMj4cAfLeJP05JHgMf6RHmS9C7buYQv8IXpEuuSGyOp8oIpzizhUQdL2RYLulqiddK84c5iZtXzSqm8x50nPgPq6w4Yyl7cndjYLCyM2PAGvfvomXtO28IlYLgNm5p8EfP7PZyPzsiZb9ogTAGTifa0WgG4unr7Z0QhCSTvbwiU3YlBQv0T6MByfw3BrEb3eAPxIiXZxi2o8EP26oQPMLkw4yvd2zHeG9jmEY7HVqts6CH5cYNXqaXlnmE,ffba891e52851bb1,6929b018a40e88b7 -HJBKQ5J6xe5oO5jpirtxJMNhexTx35QF56VfKFN05ZL76xQtA6GgLfx86OTHA4x9RyXCk6cgShvjH61JGu0zaqeug6hNBlEny3m1OiqcymgpLrDI23h3j1cBAfObF2OUyDFyidgzhAMFR97CtRR6SYzUBZTJPiiZ3omKBL7eDn1UESwjus2VNG4KYupPnI9vZkDWQ7QWEgUSs4R8vBWv2Cg4vqhwYOGgvk1DkSE0ICv8BMvwfpvmowdk8E1CL5Q7IqbNK9FOn8TOaS4NwTT2PHxeLwTNpgYGBng4DX8JH835Yr3kCbpmzdeuemfhUFS5y1kNqM1nkM3FvrYkUTheNYEC0SQ7cFaDEvjZnmp1hUUaqhcsiX9ZBXxXRbbC5RKwrzIX72PLKVeh7ao4r6yutw9YWokKskkU0G1xs4j5IOhPfUGgfyxasTJcTkUAAl9KEjllMtUfrdSeDuvbNZU8paTWPtLQN9O8THAssJxy6qT37qbSubqocFMvuwsvWHDxfCldkqRzM1kALGUMgHO4J2GPlXpquWxYwWN3dm6Yklkx3X9HOGhAsNz2AmwiRqBcwHYccQZwKZnrbc7Bixea5yGVq81hWJTfE3bY7AL3ahFagT9GRMhBe4kUbXIBMbIEwy8sqG2QHktsgvVytHHPeJuEYsjEysYuA1gPSVCLWMj9YYuPdRG4MzAlcITlzNtI2wbz37nS3AJcExEfrDUFuTQcvTjPXcJ7gCW83B3kzhgfe2w2hUHPbEZON,2b1503e1650a9231,a4ecb597c97596d8 -MQpG2MRM372h1JT6nmd0wrUDphIW8cao9fEx5UYS09ZJADX8HEVkAbFCBQfLpMkzwNfzS4ynt7HBXNGuRPVpuYJKS5RnaHMnszYPRENPXIUYpq3loGfTXZKshhCJvz1TmNRJ0DEQ8k3bdLcmfNF83zh1nGFNH8fM7LKaB8E9yQFs5MA22PUdeT5KOi5rguY0WDUhXFF0qnzMZK9DvOp8MVMvpd6B0Dwwc4KoV7a8yRkXmSGfOHlark27AaSh93NyGKD7ckw0tW4UFOSjQs0rASGZDRyP9dZZW97W04Oj9ErYP5FXotycX13ZWX10GsUD37KE2cAhT3zU7vPKMLxabHkI4SyKBDy9kte5PWysVs2mFIs51khAp8bwk4MpFgUGyjOsYFp7UY8UnIN8wfrnODvy92aGQ1sVjm65emDciA1sqOcp3l4rxvdj302iI1y2yB5ZvqZesfkFeP3GW7DLzqJsnh0XDJv6xpbPmRRRTlwtq1dbpx2OPiQLiNZN1QZ0KNzOtP4UknYYuSrrHHyqT0ltQl4WYMXt64zLayfCI94Dwa85gINxAs0NJ8jc4EFmiJy42OgCo55NecuRL0ZPm1oFRSKPxhLtD6gjjtpL07RMxJjvTOztBZkRWOkoFe1w1QSAR6XqzfOwxrdi56LqckY5vsH3C5wgTop8FqM2YVQy9PztHWvBBsfhSKxIp83KuvtO7zBgETTyX1ujNjsKyd5gI2OXS37uhUL1qdBVQtvRY,591358c305709dbb,66a4444d2c6ccc02 -79VZMp6c2I720sOflGe8kygi5BPIVuUtdXBwiDnwq2NqFsD7sxmT7Eev6bhDKWzJoWDiG3i81bk5RUPicozR9f50AGOYMbxPNnI1y42Dh4eq9aZZT5Cuqh3ZBy8xMInVN47yqNQ44tHQRP8RGBORQdvrJg0ZPD35UNVEHMStovB8fzMBuGC543ye3poclCkjQnaigoNRfWTZofKAQdFD4kBUYdVT4qylKCJ55VucZ0NzM5K3dFrYYF0N4qxM0OzJfPafZad49D8OtFZS7gJUurINSNGCDtJTvJYqnsnGMnuBTYuhjnrLp3vbjo8UPd6FCWjHM76tWiBE0YHCnKWknJS8d4p1RcVSoTWZaZhg8gOJ2BHVyXEqwcG87xLsvmqHNVvxqzWBgtkrNBWIMr8MoXT2xwCSNl9gpBC9lqPzYsZi0RfcCjWa6a53rWflTASpJUi,e5f9819bfda07384,5c48bedb4d05bc0b -oCF8vsheago86Jfvbnlj5rKR7dJrCwcPWNJROpXCU,28b7204c42f44ad3,226521bcb745aabe -vDeGYwaMYFBNThSkpgoIybn0c8YgfniY7qSPsLir9qbj4Y6H89C225gI7ZfDtvNYXXAsr3YTqDxTiy62QGsYIwALWyKhSzNGzDsQ0zV2UnTStVsCzj2DfiKcn4nOjxN80eRwEwsThOIqRflHrRyuf508kd2Shqj9D99M0ooYxaBOsFvfpV2Bp0tr0,c6914f6695b6646b,a9ea0b812faffde -6bEb4UUM0t9QDFg5GJcVToBeUdZQN8AySMW5G38ZIPryVYOpSQnEZtgWiAoAma7ADHp44MCfpvaG7S0Zs1dBhwHYS3nCopiH9nBTkI0q813dxfpBwpo9AjUxR8nrEUJeXdLU4n8zQJyIChVnR0GfUbZ8N8VSjAseq33XhEwT7Q1ub5wzW6r6ifJah6XCcHyAPAFcUpvF8tBlQ1oy5G5bN0TuLxYA9yN0n0G4YLSvbfEfWVzTavg7MHP9UiT0RiFToqvtAG6yNhsJIfwclMVRwwXpWVX4kuQllxPLKwghiyfdzvylBGlL91qxa1SpK1QW65m17hsnK8J6C4IHQ9yg2fP9M8dk2fDEsA4hR1FwThzAMDjyCQBGiuejYjFnBoBDvtJqHipFG7AVfhiLr43BuN8Y7qyQGbrX3Ar93aFBD7aM0CR7xpZr0xjhlIH4ngGn5Icif0TQwXU9JyA8dtioEc0cxExkahUXpjzkeweznhT2PvmnPmaFUY7wt2jbrwZ99kxxa3QwzulkxhCWDoknV45l5BUo78eq7eMZJcejl347jgkvnfjrVTTQHLMRc41yVVCFOt90fHVRaGtrfY2k0laIDtEXq3ZUV4mKKWta3tMKtN3mEn02AEE5g7A4PBOWb22jrecT1M9aYsqp,bf0e9b1db5ab596d,fb49034ff36c719b -i3Dk6LYysCrL9COKODZ4Pp4fHvXgrqsx3wIBz2GuCCtFwlc1jFuwAb6TiK8ULpU2xe2qTq48prvlf2a2WGf0OD44fLoyyKy1JVS6gG5dkVqDrJP7PNsNyqZIEReWSU3RaD0W3MUGRYFXhCDuZPmIOrCKkYSzyPyozkXnmStpuBhc5WJKbeL7Rvuiiq69vyrtWa0XFhsPi7p6FwTjn2MLckl2fBTmI0jXVMjdVGYrFduw21bD6xO9y5cyNXGZ12NZS5bYDQsmaM7MWfXHx9TyYJovqUBvCvCFXGcVoTMO1OYccdSQ49OUbu9MUHTCl02VmtJ5o5KqGEL6jnekyXeqOseI5mxFI6Dw9RZbM4RI4bz7b17EubEsE6jGt6Re3Zk2ENksoizTeszGC5u8sWQZYxhwWVKUn3H7ses0Nhu53yjl3MvvmEiLVGdUZfebgfpXwkYtHVeGi9cdUyrzTlcNczUEXq73Q0f98gy9WDajxkzGqkhxmpiltPU8TvGeoy8c69kEIUt2wfrU8V6mEOABUiv9aqs09TvuvXUwHVFdkrFkQPb6yIFWY9gDJ6gJQE8zo2nZIigYTL1Lo48VmIjVz226gc6BLFSS9lexOZnjTSRYd9zn6LSpePFDBnuVXekx5R8QTcRdGnz3UnKyW3aXVWahJtXxHTnv6NekyKG405G2yngXMWAnfqfPNI1rhfle2Oao4gdzwQnS6ZPV2DDtkz3Nh4b76ynqC64UjlSKQvxb8tf2vVQ9DAMwI04dMDecP2s5pLVqinsYJuldLHbcY2jKI1LDpu5l1ABNT2FaXewsC0KIlqHjW2kfvujAxj0oRDu8tCf3ZQee2bDnTXAvANt4cv,f69031af672970c4,c87120d425889535 -H2mFBq9nJgVB4v1C1qSR61I18INsMSXttauPcp59E2VUEpuWyobotRrD8t9qymVmBhRbwWJrJDhSAfV02ScNzOCo8cii4tC2f44EflSqcSE6Zu8DWfbAY4FNiCDJIqFfNRj6m83dnolsNgFnR7w01gZPCehQxVQ0742RWkBSv2ZPDy73pTlUrzSZ3aDYKLCttWuYwnHzkFcP1AzMB3l4bBE8ynmILABggSZ1hvKV4XGU0dXPGRq61nAsiObfTxbEbALF8V,996c87c1cb60bd0,25f36a45a771786a -fMbvNUm5Uwzh0gXrRwgK9f0tUYYoZ8Nk7TWHoxZgIZHFzK4mBkIxPYbKgb0JfULRUfmeQ4KVN4hF89ZfBzVZuzhWORKpXaahjoHPYrPiAbCBhTBOO9gi4F4VOeZSv41MgiZZWlcmDSZJTa0LbSsqUBfbN5boExHlcmKbs20qArsLoBmL67mS8bX2eI9yVtG1GvQ7j9xw4o8bkhzADv01q2kizhunTLjuTBavmorlnAPJUEF5lHb7sQtAWUrH7zsfs9kC6BOoOg7fLk63frOhs2ygc1SzxUumzCH19agP55SuY5WDbcuntZCdlq5n3vjDMiHHLrcRJia4rLqpIae7QacQYAq1U8d0hXpTFBaBBJyh8MVRZWxjacj1Y6ZHzXeQpEoHuR42p08b2NcuYzInieBnxgQR1hZFs8rmPvuhpi9AqqAiSV9Mx51sfy1RDDkPY6xNbZu3GQjffHYkU2FISTuGntzl86jNVop9RsvRzYn1TydQ7tDWc82rOVyieflfToP0OQ4XUGWdKCD3RqPcW0sBfmEJfzMy5zBXQf5DQzwbWKW62CRIHM7KaBaRkEjidit4ivZsbhAlDipKSsjzlCkkRZe4D9XN50uS60AWJ8S78vNN1biaJJKsv03cbg0jiWarrkjXqFoEMHVRicOD7Rg07PmWwCyBZDEQMFxHmCWXvOk8lld9P0aKXq6A8ZpYxqd869aSVPJInTygZFLRvN1Yd3mAXjnAWUYTE2wH9j4c2MDxEGevCgjyWwv0zBt3VUhsqpu1BRGAgQwVuqaQmEQLmyyH7P3STVotz2yf0AsxRLxKQDcBNd0nNHuvAMWjFHz4HoReH9vlmA33s3LGDqHoydNGk4SR7v5ECH0LOnXhFcmdZ3npfQ8Ftk2Eg3MmJooQzHtNS0LYUNN,95c737830ba1c75d,8389c02b716e1546 -FXgfEM5s39200OLiGZFTSHXiRxEhI5hoSZOvrKcJVkqNi1lipvCqVO0L1EgCMBFQi5ga537tHliO9wObWUkSovzOw9c1stMjQDqEGXDbLB5UUKwtGpYtoz1eCaaF2sQgshatHYfjbpj64VBb97S3DaS59aiK0eYWRt3KyEGQufWuCVlbNqffvrTI3KwLFz61AZqLOdWcYW985VvZIWyxclnFrsFKuZrz8zylyeRZi3Xtq65aOjJ8ujUvHloeOnxc6HCiyxKSRLYDkZw2lfwipUQj98LIz1Z4sbPl5J4YRubHPdkkqXw5QrC9DvWNKDnCPH6wO5dnMz0gmWoQ,6f191b232ef1a324,d399c07acfb26617 -yzc44p3fcSa85FcWzawbCGI4KOFCdA8qFsshaiZBO9kM4zRvYPXdx7DWiwxnMTZ3q9oM0N8N3GoZZxMoZXc5a7cUGh62NqZOzZaMs1Ptwp2rpr97dU7zdeZ5VEXt7vPdxVvOFs9mwmgW5PKoG6e6rolqKGr2xKRds6VCJPbzGpk7HOdST4dlTaVkgmTfBgrVz5QTiyvArW1I24yMjZ8ig4DtVVxNo8qRtVuP4HrKZwkUBt6jT1mxYYI1fjqoCSg4o8HVZ407NMlxcs8JNYYplYtgikNyGuLkJe7xhYiUlkdd1sqTWf1BeWS7vp8OT5UiN80VtqVsvakEWWAWgpNb3esu3ZkChMFO8vwrcddWD8YjJjgmT5LLI5gTAo3uaCV4k7KSn16Y5ztFA23OZvaPxj4M7bH7nDjnOMKrhMwCw8tO4fyNE2fZuPKTgZAJlCn3nTcbv67ZAZslJxfACAEOggjzSKTkDpfJGMq8ucqcZ93NMIm4U2MgC442lmmccirbQRnrayT5g7I9yLltNeXqUDbjHOENRwPw9BQQozmQ9WbfI6o8dlcwlWGxX0TdKk1Kkaz9ujjGdBmeNITaYJgdsRP3rH2UEiG24smLgV10uucBj92JFvhbjN1troncCYAXTi6SOAbTQM87ewdp2EFZCeDYIBxf61P8iSREWtDE52EZG6ofFHYF7veKOn4JfzudsGbVApmBG94LScbVt6TC8CtxZUfaNSIvWxNYuWV516hciYShT,976787fa6e7181cc,cae474e82763c1a3 -balBFK3dRM9MgHCroi38adGzzJzV2yTTolio4PJ1pMtlG2L52PHUkSJKxxY8bGoUOFf32IMFa9d01Ip9Y82ZqlvjfNL0Ja9brfjutIBvB6W9qrHTEPEAYYYmhEBh7kxTTB5fPSk0iFQwSQRzKGi0pFpdCK7EUQ1FumqxPBMTKILUUJWWvl1tD0438Ykn8U3felMYxwpbhyaaAJK6gJYNuM8AIoDf7fChnuh0qMHq3KvqB0kCQ12NGzMggVnqy2T2evVpnmOUXYzrPCz7plfBcFgtVE8xSBC9kyZHzNDhhw8Rtw5GFiak8TjlOH06cVIpX4IPYxKcwkgRX2ryEgQOkOJA8OyBl821IGf3Yov3N5kSf6J9ST6hkjRr0yc9YffpqaA11HopDwfAW0wLvGnvaue1gUYm2oi98XByb5x2t6xH5437NYwWRU31r9Xxk3q2Lwm20sAHMedqP4aEyfTU0d3nsevm0EIV9D1sH2snQrxhqBitweuXmhmBxeit7Eg5mVoqzmrgwV589sGPV9uItTpO3y2Zl4t1GNKt1jgLLEbaPWUU1ie14bQxWm142NlqaXDcfbDRIC6lTfoLFKXNXWsL5n16s4tLl9sCaWJdtzsxMwtH7ZyZeUGaZupKq0OuiBvKKzwvl1W0L7a35uEg3Idtayeg3lLleCDJUJySDqbWOu1grVptW5M0qrKM9LSGB0D2r4WfsmjFhdA5hTlwLbghBzEoLp04uOfdK2p7nMY5gIqAXqxjh0yuazaxjydf4daoDnl0yD5Wtvl1wToWxt9pfFBmduA4QFkeneaMmgGgqcYEFZqOe0MC5JC5TUianoohRz,17767681c4b87d7c,b137c084b68e0269 -nnRJgI8AcdkUWBuxLnOpxJYPB7pOwJu03ULiKmRkrlDswocXKBzwtG8UZIap6N3qBF6EllBc7yfQD8mllSeGpp0BmxN917LchPFKJ5Eq9Fr81ZldAl9Y8tgVWZdZgrpjJFaS9M3KdHaWFJDfTrLtrJQWLuYIJD5WYAJGigVYctSqVBbsmtTasRtEARGZ2Rof1eKLVCzZ5E6HJ1unyP2cUJt2JGBm6FNHw5Vze6E,c4fd6f7e13583cca,5b4f8a57878052f7 -3T7TBz7LoDSsmBdlbBa114vsCRuBi7pG9rBzPkAJ5teuPu77Qhm4ctTaKAVKnxYyUGTIAnFCVNANuUGAveKIhZbRv4d3Nlc8S3iAUHU1OROu8IhBPiZA9OZPQ3C8JDYXUKI8UHs8pCKChgK0XKgJ2nfmBPUKNEQPfEOYjO45rYXShJbd1tiiS17zvNeJg7J9cM4AKkcJbMc0nQR95bIaQMkIz64ohYpuFjPxOzWD25AuG8LwM8PXK3c4HGLzZzd4RjylgPLijVac2OvmcPsthqyY4KcGYSCQggHGx3uAAFzF56Ju5GS3E6sgQ0Q3CxgEW2FBfQeaN7G2ApkMtDJ2ZhltglZQmZ2a2uMotfgwheVCTfdwXwpPM90ddmRKDQxShsdN7dFNJ7bwGmiLYSFvWd2Sk,d7ca3bc10ead65c9,15bf1605d59875a8 -mXyk9k7Da8Za1HC81XrEwUaL6gfGBKawr4AflsI9bzg9EwtzMEvAuXkfwJzv9wVOgmd8XhrD24deNe3jRv8LLObQZsjdNOWkzdoMYCRTv1iG6HmUqBtXYNTYEdVES5KJoTh2GbG2sEVmWcrhmGEn4lzqPX0TgAIDdCPgNCh6rYAxIdfgqOe8pmUsLPDijEVrINxQBiBKFxduhXRU6K2cfulh1Xfcdhl72gUEx7vq6Qk0ntFMfMTWiiFjGDPn3W1dT9H4VrLB4fXDUFhoLLgoTNqV4iCCNtwVc3OZnx1fQtnO3ThTYtPvKUIQgEeXLtwaduLM5XpoIoxsljxBQqeUH4OLbpcdXFdDiBJkRiL8VNpZizC6J3MykiOnrlaMnCGid1jOBhtvuZcOCpZR05H3IhIwiSqfvLSmu4Sf5mK9xrrueHvLT7T5yEYGfG6lXqrNiOVpDbfAgu2QJY8PHD7ZKx6COWiArkOqDLJBL6ZzzBg2hZOKXTHG0ta3fyHHARiEHUsnSYfA6GU6Uvg4ewewanrd84tvvxSkC5zCtrZQdabDkLH,8c175f1a96b104e7,634596986a836aa8 -dY0QLGzbqrEvtgB6RferTys3urqOEXLj9F00ZADtltpjDTD9cv04ryzPU5tbscDth6m4IeZOV,ac8bf1d0a36231ea,ae2daff6bf6be0a8 -MXTWpUaHbBENqKr41kAEr9rtnGvY9Ny219jMaUfFwqizmeSPvWcKbleaxsIWhB7gsZLSHtpAa7zdl0E1KDMm8JdqVFmOioxmL6FqcZGAsfOsNcpkGtvZLxG25u4nrIYNHX1ClY99czxaBVYkMobDg2rSvo1UXnRe6NYLh56sRdv2Woy8uyP6K2iMovZXAur4NF7owKVppmCC92II9pLON4LfXvOp3dLvkXdk8NjJj5VuYiKscTVkQijzzZShqK6S4IfbrhMIQ9kR0U66rnA1gb7rvEUmTrRUG1LplMCiOnuXsEqgYqkJNNl05fZbiLIiJKviu4h57jOPwl52dmJrOOniiasoIhBuZA3zCZZ5MAaJ9ci3cPKn8WmIQzYvumy5I4koQ6U1ETUE9Xn7soNNf95xBj8pYdB0uwUzwggnPThhRTAsAdM7Ujz0BUGeWlrYXZKbqq2rk9febBq6XglLX7FvOnf6p58AhFqCIj7Kxzgn,a377686c88500ab6,349911a9efb4f8e3 -VhL91RNqyXiqaQQbJXGZz0SzzXArCET8H9XpxwvIymlmkEzjjotblhilhC4ixo1hpuHQvfogHo6RVe9EVm5qnvUL2PiwTln5h0eVEpN8TxzFSeDywRpwxNcKylnZYtyJwauWDk6QJMRcsX3BG6eZJdUnujzcn39tuE17oa77V8weQozhYC2il4UXElOnz3hPe6inzXTMkVfquzhxvS2qzdJ7PLq9w3QZbB9gAG11M6hs9xQWzGaQ2eGEDGL6jqetTl8MhgVsbCmQRk8MPHWKncMHiLcLfjgt4nPk0WchLiXVFC3ewPUP4vox8xKkaYrLQ0OxoSVP7yYAvg85S0WbFDlxBhYIXDcXRaWP3A09umYM0TckKkUusECEF46bxpEIRtRo698onXUm1buTwY9ZMvF04rXFgQE3hElqzRfwczZxVBxYYoKhbEpClRqB6OszD5WxEY8PIQnG57G3Wi5ytB7IZQFkQJUjbXwGOVuXZVkU8HOXXZ2Kfoui3ljwyX8Vci3ofBInjloRREM1SIuhmWdSLeJbBrCL7KFmSOiBnF7SnXYYYIDxnxfw6FZwbyBzBaftrckAx3Ysk683gG1tQPmg0mKCvvkeac6bsGFxpHTjXUTi9KQlb5r5MQaKRuxVErXJecYqYUtS3utQwLX4YjmXlksvw75E4XWsnyY89HqShd8ewLFUVJrrgYnAOEclEQWtLz8wxJkacyjKAsXlpvqt2sgNPNIjn6vJgbsaRN9bQq9W2qESwXLvZhNABMlyr,a5fbea611d8a839a,5b500fa6ba7e14ad -09TRy1Tp1lp32wt7vnULVWmo5D8YmSiqhQV0nm350SFbrfUCe3xlLehFXaWVg,38cd10eb8cc3c1a7,fd6ee7f995b8e37b -X3LKK1m037SA80nk18scwA9tQWaursmMiIXXHJcLEGUJXv4vgfzsXtTT9K5OnjVAI2DB6agGwsfvodlPCcG2pneRinAvESfb65SupP3xFtvGiT5rCYcwpn9vMnwvETtFQsDjEbSsgQhED7y2XJEmFVEyHq0ww5t9owpCMQF0lPhKuIl6Qo677VyEEW058GhXOia7exI0nkkqkBtgX9xWfwH4qLOfS6gwn4ZoII7B04FXl5HCr913NC13JmFmcU8VUaRNeiSVzX6FFH7wGikiCLRqGTPkKsEZHGVHLPX1aroJ308nPDVgOnQZhJ0yCum00SaJYQxUWXmAgqs6IY3Ro4j8urMNfHP2kePbZpViGMNKMVog3LaYhmrBSENwJZS6mdCVyFrNKv2fpxc5xho3BvdjllkCgXiXwrgdmiK41DW3LRsY2EXPeEPPCVr2HbsfIDGHFRRlXui8jCqQK5vWTCWPChEZLLSSbVwrr0MrzX8VXk8KUGCQZkgURbehTdhkcTEfr936qJDfxUxo2Ncc8WR72DF7yelbH0EBNdRV1gu1Qv24GD6jSHuxSU1QsRZCXOBNKQsn0HIfwhvzNWavSxdN9NIUr0mFz0vX45b8vwx1kjjQ7LsCbvxlJCoMcmTH3HWFMwwnnqBV9v0oinWexJtgaD9k0fVru2RWm2X97DtO0Qn95WGZcqxPLy1JtjlXLoSTBXJ2G4rw4DDjpJsUEIyOspTN4VJyMAiJcT1SCrX5xQ8hWhjo7YzZUGPFYbOiOvQKx72Xk1f8pgae2LregVCVDA1jXlYPrCoCWhANOEVx8z8Wf2eV2fZDwVBAvgwtpplNyxZQbzaLWZyni0kjvfPqcPUN7qU9IRI6DZFGJ0peZ5LeFokgzUCKulThG45SOFgHCSDFAorz,269e40c5c94d8628,11409aa5785198db -0D1DEEJzD6hQRwtWNS92gSVXDyruNoRdal9Rqs5UUTAvBIt3TtFXbGCAZq0KUvD9x01ifJxcTLBpPGLsgpFRZzKHm47ElozECNPVOcCZSHyzJ729zv0grw6kzQbWSCoWKnRXndL6irskz0tbGwyYvdecCmCRGhSiu3rckAwEcFaKg4FeTEUEbTOaA5liNjz8cGjkg3Vy6jLViyiX9u1Nr8ohXTIWXe5Mfq5vRVQsEwq5046YD0l6Tk9G332EWFlAEjbEaTc1fyVmooNAOvmq3uvyE4OUP6zZKE6YefhEOO2iEZnIrq9sT8KTlirQXoODOvUBANo63xNxVqvWqNwUj0QVnlUeJt5Ny4qOcQba15k2xVY6HZd8rAEkIX3ukpGq9UIHMRyIs9fqIDBbhzCxSwf1KK6GQj8lsAfgE4djuMZXJgTMpacFTRDBwtBY2yWmvtZe7iocwldfVK4txT2M4jovLdkWk3QYpff0fzWPlnseNL7i6ZopsPtsf5or935PPiqkdo40Egv4l61pDkh87q3Ss5zZmRTdPQeByR67Kblen0rsxJlaEMBbdqTtJXmzYuoLM6KjG6M8LL7sokxD2hMSn1ZT2LwkfrIVkEgkpFn6Zd0y3clkUZIQGpFcGkRqeOAoybSlwAbKPeKFBM8LHfSyE9MHn6d1,1cee8388574b2052,a82e8db12afb2ee0 -XMTLuL1LZWw2VKzwl1QMBKn1fMOfq6H1YtOMPXhkdmsxSk5JgdkW0NYfRaHltMnKQVplQrgZNE6U3bkz8WUlX6nKwUMrLAHlaioAG1u0Y6Sz9y7JIgDbn4HMZ9vmHqNOCbmta0tfHAVvz4UURd7xUuI5qE8QjU1V2Q,85b16685bd7f954a,689b82961d3cf304 -ZG8x8CXpMMisworVntqCPD0KuORRo4xlgeK0O01uQECjHvOlZyVFegY69D5DQYjpJaEH37A2hOf5cq6BfSd2erWCek2HWJlT36Lij7wN00HHNgoWLQ87NNjt6RPL2jKfFv44RvwaroZsvMabgMuvydGneWDZoduEnsDM8jWGxuePJLwk4VIdtjL6HCFXL8uYbpbfO36ovN7mvUryAhaBtREXZbWzDEXmWUjXNnkMFC1Xn,37237a67973dd13c,acc166279034b6f8 -lhnuaKLu84Lg5ojynBAaqADxSchobuWn5nhf0SAMEH6ibhTlCiG27qc8UuFaDJaryKNIwmwoI2oHDuOBlzasFFGmYKJyYwZteKCObiq2nOkm2Vkq7En0tSl4JVOgIs6fY62C1mc7rMJrI7gQYyKYsblXEeBdZw8TYQ69wR0CZe2wPvyeRexNVhPIY2Qht6rI4gi6XkfAq3cPf0ZxkEjfPa9Pit74sZP7iG1rPQYemQUr4cHoa32XhmytJVzpUWfWK0PeOlHWMpCfW5tRh0Zt8Hfx6nw5j5c7sKhpiCXYBreYsgCRhZcO6qgFCk9qBCXJfLOwPoGK2QyGVnJTjGRzefv1t07nQGodrS4yruzVrP5iGsVqt83aOuzOuaZIjZsatqGD1EJPGKhGdQOKyEMk84aADi6QFIHy8o2L9SETOOVS6AevgGTjuk7VQDHqjrip4Rx3LshohMXTPpTSFIQbB4OpP6eTt5V5sYLKB9lmvvPJeq1az3B7DpRgJifz1YOb8nYuXzY,1af83c080fe7e0,ea791ba7f57b5c56 -aec95fLVMvhI9UdsFH3SHx59L,18539b424c988c4c,31ecfc3554991b97 -sRlSIVrYGwWV2Bzg5eXQTMmr5tqVtUvlvToCUStYBxFwaNTInYMKJyChpkGKayFd0asx4cwhambi3YmRzs92zugb1A0y168WCA79vKDlxKUmJKh2EAxY3461q3A5VwlrGV89Cq94Ifzz4NqdDuMRBFvOlLL3oOVPDnlNt7YZf0ckQ6mSF7XWzovWfP1OvatWqM6SSr61AvTSm2y4y95xpdhlgQUKa9oFdWvZuLDNa0PFxkulL1h4jHFOeZ3sGEaGdiwAwNVo0BUdeHBAAwJ0hEIeU3mcW8bPkGAIquft4mLK2MlJPuXGHu7vDSXrYqi2vyut1eTi1W948V4rztK8Cn9I1FEw4HFYEyReNLcC0BmBk1DyJ8qpyQNdKCeCBtZzquZCVGnjCFghK7v1TwRNjY9ITdkq9QTPBA7nuTMeAdKQJRcdI12JFb9eUaKYZBKdOgq4ZSxeBT27f45YzhawWqu0QJniOv001RmL4qY1FoF0Gy3zLe8ai02OE1CL4voQjZbMajlhxbVFnVUMuDf2sKv5xCPumSK26ncr0JlOIrcAZngxVNV4sFHSn9b0fMHvURypPiN91rVs345bVKqalTJoEh0788DW99T4NchdnMyswVpfsXTJUMW0GkpqYneMfkbe6fq8scJKyLaYDO18xGVFQlMnyjF85Ncb7PdqPjrpBOLAOoekutNZJK62Odz254RVDQerA54R6ZkYaghF3URRXgVfBCbM8yjLSDukfcJjC3ny3XtSz6lV6e3v8UrvWexYqqBWNSM0QMzXZy3N08u54BxBsLjzKLA9Sv0Qm2rVvGGwPMwQKmp7B1KfXKxscMHBE9V4fncN5sxdYhjZ2thtT57xzWPrxJv1yMbkXmcGOSZWUidWMNTd1kMsxhWDNSKf9SQ8td7DCUnoyv1Dlat7nbMaZ8PmXDHZHjpOqbcIMWGu2blNlq2Uhla4FuT4w5eB7srnL2CAw0E6XmqXKxbzz,9ec24c521938412a,52e95325b9be25d5 -3kNNkKLDnha5zdBxi3OUQyHqrkpd5JUktjQHldNDG6T5wCDUPLqOVU07I7HqRCOerOXH4IE0O3oCgcLoobEQpXdwjmqRxfQzk49MVr9rFov8P3ORPxtYcIE2KmpOYaDtjqU6mga2yOMrIDIQmAK1MW2e3B8QNs6wCHRPpx0ROn0n1HjpXIfM8whjs8MlzoVTW6D7VMzj30wQbOnkTceVjP2X6i4wuuhvByvFSiUANDareYqU68u23oM9g8NIrL6kkssg6D61aPglVHVYv7jn6Wht07mVQgOWEh6XC1ghChV6qWybRVzX5C3QDo3JsyF1G7XPAq3OLDmLTp2X8IYWeolUZ2VHVwqITKRP4fAZAEoochiPPFUtUoobQ5GphHGh6UAD36z4hD78Jf0yfrX5bfzMtZPH5uGGlHq8Zu1LZimopljLRQcihQEmlKSps6FjBNsL0wlSCAYyl282jaEGtzF04OSLXhD5qIibmxo0HNEqojkYOPCmSv1zHSo9t8VQjhq8FxPIFKxasJw1xFCwa7p509uaVXiRQj4sj5lsavZ2uVGqLR0Ic3ONb8BeKwqDRjkLOTD6cHRqUCkk1oblr2pWHcs0u4f9g,f1ba6db9574139c7,d29f01818fd60487 -pjUOv0YTj0Gl6XZ7QqGlbRtd3kLvqYlWWFT41jg7rFLGCWXfpuRHtoo5mX1hoRCaVDrASzbhGxph31TNNJ1moUgYbUu2U1zbFxETyQ635VJMOwZ9jYJvE8zcjPopjgt0hCGCgaa4693QSbEHj4tZj21cslb53sUK9vG7NpOiGUhPbnMPJssQxHAmZmfsJ9oM5wLcQ5o3uAWKDfiQKtQyyYO3ELkAQ6FtYSXsua3Lyc78OePQUOPRUJcpncsSLgkMRCmpgXuTxgtfMgtqhyirUak3bjXpLh7ApKWWxYObTmnpnS9wuyRx7MNEDhcrJVkU7WpTsLuACvyTrbkTRhTT867HYciOkIjImJiR5oi2zYE8ko7aKAWjZODyjMhxrAvrp7TVEEDGPvsKEbNrxFSb32axJ196wA08dg2k3LZhXkG4Rrm474Pkfseduqe1jsRoLpw8T2GQ3FFLKZxft8t7JgMMnPdy3oeuPEVEPuy2RtnQQ5DxZXvFpI0R9ejoCGPRQXdgqZOXYNqr3AiNWkF1Qbq1TFgHumXPnpD3sVd9hNAa6gk6ibSD34GDpJRF6XYTLqD2qd7pvUaAokTlEj0aLVPFuGd8bVqGrsDxgeuL2hQpb6p8sRtrGiDsutn2K4gdm2dwKT7og5CQDR8xlTa31EjD07pQFkubOcwjNVX5rfpQ8qa4Pceto,eb83ed070767f27e,94e041312e0bbdf8 -7sfO1jCkMVdMFBRgnoVCl1qWLyDjuI0UhcaO3sydZvtyn7QPaLFbI1PUHSk1hSf5NvFlFSrEp80g1g7AiJZ8JK8ByQIFQAzTKCLFkoYLif9sDVaWnkJqlfnyixUIYpUPrpJYxUvzytwFwzVRCNDZTk9ifmrxsW1uqLAdNenQUaajzNjrzqzzlXvmapuoCMFJqSwYw3pd9FOcbj22pAEaelS6ot9JClTJ6FOt4dpXWtxPeynOowzeomkti43PDhxaHWOKBMqkapE1FxdIHGOTLofWxEbB2CEmL4fYknUrSIXz5hbM6rdwkcULr0TlanUu5l6LvmfiJ4iXjgwT9QDhg6Fwt1EPkPG8vZjQjECTCWHKDzj4AnvdzzXKg6nAoTt81hkN01g59QJSGdpLD69ESN4wV1jVNypacvlnwC9OEDTtdJApnWaBGXWayVLHwAw7sTpBEGo7ip90b9LHdghbz67WscUYtgd8Mjau1lXQpymdu6hG6BRBM27wqblpjuOSQbJdRUZWCGd9hKdidYrMcIctnpPMTJ5j7dDhUExkT5kTlSUnCLeFTcRMEFnQDoJSGltjbOFjKXOsC5vPAc5Id,d1aa7cc5e909d9e3,dbc8fd79c4f53ce0 -mmaZLgZxaXbHnkm6TvAf3Tnrr4t5LsBqcIk3GYaCRxXjdqeVJGlQslUZGnb8Jk5CXN5tdX18YqDVWy1KxdUwF3CSWZrHjCtPKLDj6C4YWvk22X4rnpGgQs6zLHv2CTwdMBz9TK6vaeW0j45gwctofX,f8c2ce891aabe1c1,5422763d63671471 -eSdhvImaNPdzDGco3WF3pNytsmGLewlmqlx87SKL15z7OSl3q8zhgk5ZLqgqovO54SZiLN88QlGReyrvFsxM8RTX1RLNVd26pL8g968FxGVjYfg9FEnxnPt6TgUWgemLC00PxFige9HzelCEv0l,c6aadb00c5853990,a4059fbd111a88a0 -OsruBjdIEN3Eyr7qcJaVD4UWhCfy5FzYzKADfFcQ6dEC8sLw1nuuGOSqLBsxqbKIq8kAPgMru6kaOdXQPZ2KGWCf89m0uyINLsaWucYkG7tfjXSmC89tbsLEpP6pAdz2diN00oaqn6wCaSv8SSOfLbh9wlyU6BbzaFfc1y0HdtbJOb9ua62yBs6AhWo5SX15cmQpgoRmf6UtrvwZJ8oNpnJ7cJvhDvNBT1oBehS6qakjlaSxfi8LYrnUSNCoCeU3HVqhTH6achjZpsK24jezMc4VY7YOfIdAvGNbtOoba1k609GTl3UsbJ4qPNtYQpYlM86TrjL674kXG0k3u9ErI2RTzBjCuULHFFvY3qCTJker9HMBj10G4MYUdU69WZJkRlIe3gxz4MbyoXSGfryI1dWgSHMDyz21yfDguatDVrBGxMGhMuwZ3xLLSJsdaR7rl8dkL4jwn7y7qkJTSBdL2FfAhz5qex4m2SNdXltOMIw4EfWTZ4v2moUwX2Yg4KuXwaBQ58IAsD6A1i6ReNhFp6i7bNhaHPASATzDSP07waBqb7QwIyMK7FDT0VjXOnElzV0amltljETpX7YfUit3S2vdnd1R7q42iExB4WLXqLWLsMOiAe8ml8oxHXLdJXuHyGnkfWFcz06MwiR70Jriehi,b2a95045c27ff8a4,174a4a18072de333 -WxPRhFjqPETfEkujGlXobvXay6qAwqYGHh2zcEYtanROX60hBVqB40500Etf0eplJBAWKPajQiF48jliU2sawkM1Sq5ClhcsgjHZ3eCyo7hQEm3m3jjzIiMiLar5uO3jlAWBRgPnbTOygsGEHmMcvipGhfTLsDmLVaB77L6kNSrzCIvtGUZwXKnOkEllbli6T0U3J9hzx7sBnO03CT29VzPSzazMxlnbs5LZidHfORMRq64dkmvv43Xhpu6kG4QEM8Xn80gtKPWuKY8t5mpQtcEgvTRHPzo9JTIT0Zx8uyItRWXdBlMMg4qXki5Wjjmv4grS1NsXub62gD63aLPpITJuOlPIZslSLFHRfWXEA0UEYONFv0VJs8LRaprk4hEIIe1ElGLz8S1hRO8kQ7P1MP7mseeNTGTy79Pa1KKmXew3yGgILDxj3buE9fLKe7wYTaKUillyfneZh2A7WEP69vv7xUzehRwxr3ne5ZVNbhDQJBtYji8hwbqd90Di2DNAvY9lvMmnwrNHmlv02vnYq2lfSHGXq7Zb1EZo6FGa2QZdVAs5xsD5cjWQnYgFvn1ZUo24Z6bVS0bVxPerRUyovQcvrrknq7iCV1yFcYgT98RPoTaHdrwcbuU7PJ8Zc5lI2cYP7CTLB9iqteqGD62uhiH8HSiVUdZdITH3gFrQkx7N5MzZUOEEFWzVcpewYqWWXRTY8f0x3t1Qyw6w1v6dLRDXCdcSUQuqKPaepcz6Smu1I9HnqmjqMprRJPdYD7QH2eM4shWnRUj82e58Pm3MpbnisEKwYmc8gd0ogBN9P5QLWFV7H9txjcMO0uYfPNcOKZWFXNJ2r06jHWzX2GffvHrAmvVunUiCahdj5dhVK7gDYdPr0jPBBQjNmHPcJ4wLOEqHCasD0830HVVNdXOBELOmdE6uj67aLaTR8c0NaFGETYGvNirPRPc7zPmHa,add03f1cc700551e,53c7a50f388b5dc -uz1nErSya0OxaiDgtyEr9bgQj2PG12lzbi5BfgCDsEFnN5mnKsPRggp5ztTQebgG2DG9SpfUyAxLK0tPD2ncX66UzlgZaXJDUayD4uGmujnY2NLP0nCwddPOgjCd0QAYBI2yn83ZASOaHWJ6XLBA6qjexGviz78h3GyKj7i6KQxxaWWLQVtkaboH3Onbj16RfDG5duBO0DA3kWZrvS7YfQxYKAHA2xcLYPmwSRfQRmSy3e4HN5o396jYkaWbiOZE7YKbrzQHS2WNudWJiDPCA5mSpZmqvgMngCRyxYk3XxBXIvvbaf1KvQCcjtTROgLTzxXTD4zOusf4F68H9CRcRBwqm3eh0l3kdXhaIfW1DlZvCzWHj8u2BE6w32vMfqsChQFQrDd1gofvby968exULmT4UoGjJVjb1EYdVEMAVcmV1g9oXFSINBILmBjrsbwuInwjIhkk1zzGq3QBwqKNcZ66RBULSwXsluAYe0oPV98tMILM8HUsS70egkxWOnTYXIScIAmP3I4f6pCWkFbez7dOvtae1PPOH58BxrANJyUA8S1owDYh6fOAJl26SIDgJa9TLJBwrI6fn8Z6PuJ7TyghZ9bChbf8tvnWmnoQeQmdgoPNRSjqVRPyZsRZpxNxqT7OSIUHpKMUDEdNkmO88P735eXjnnOGTIp1kVLvr34tw9N3NCtigCQUlP6nHkNtfowyV4zsgS2p8F0PR9gPe38HqeqsX0O8po4ADBz1AcNkaJBoLkTxqIPbvS2VNp65rggYqK92wc0ATU7VAWJL6LMWqg1SSkf3sW4eE4KBIdfLmyW8F3pePijFc4TBglekpvCx020w3FpFVTrWigEpLa385MMnEYvGS6ANtPESqlycZKVQuUkOSzAHmn4bJ1ppSsElEF9oEaEe7W4ZgppYBsptlbCLtEAJe09icNFd,63d7b1b9ab893f32,fa418fb36eb69a58 -1NdbAsodLC3vvFSRuND0XBJAPv2B2yFqpD29Vuz50mfjx3jZ2NoJUZHQlOXNbh6QvhC6Zj4cgLiKpNMVItuyBmDNHxICFxSlfVBBnBu3Ir41E0DIiBTW9rjJXIIqYU9PFMSv5Bai6hQP9rovLgAaV4XadYOLPcXuhFcKgYUpP116VJk3FJmRValp0Jp7GOcMjcrEipdkhaErQ2lrOfxh01KO7Bof1Z4n01kdDoK,4334f1eb7f21e250,c26a1adb4155b05e -tkrpRJAfDyYKtzKMPY2BwczIeyyNT3pwNDNxyQCdXFfHL46iWhtQCfbKCOXy6BX579iFsnXkOnDZgGhXmJisIoh3CFT42jSoV8xWuvNY0hVtrjxzauqDfdlU82g3FlYqXqchI8JqRUHoL49qlWsz7NRIVAUCajhLbTHEriCSTuWaRN5D5HFfthaP2MSRUmfkbTFUHvBlX5nGGpWQbU0sdOynS9kCAjZds1dHcw8vVwKkFD7QmXFREPn6VlK30txoWWJhyonLrU,28d2486638fb3633,e3b2e32d11653fac -N2QlURsYYgP4fwIf1zs5,8ba3731d505d261b,3a30c6bd51b85404 -3Kpccx067xdN9Il3PyFOe9zoZs2WZWOB8ZqKGkgyO521EeYUthttwPQF3qig8P2IvzsvdIBvBTUCDjhMYRVMIdGWzWJjvfzrySUHqofBgzYedJw447nzC2Sp4FFjTjWUm0XrrRp90PEKHEK3RFtn535enZQrZ46u2Eih54JLhdY8sTtQN4IxiuUfzMEQTIx0YjzkEzPMNOajxr9cWEc7ecDKG6BwCHTOLE00qLhQBCntMeS6zJ3wKxMTkCWfB9Vwai13QWxJ1u0gvTRNyNCpqg9vZKqsqmb9E67Z54sjutOJHmtPleACWhU2ROo,baf2a6ac0e9e1499,75adb1566f3ef935 -zSjM5nJH92nwyiUkLAsr1a6EGc5MkK4s2MkHJ6rN1ZO274MAj03FW2kLoMDPXjaQzNnSwo78Bd4DC3gl2C32t3DfyRAH1hQK9BovjcpRJ5Q1JoCRQGyzT1H997LgYtyT6eVGa2DsWGzYqZfVCCqzuMUBaTE7fYWtWpsbfBNUiOmVxrQQ9m1lNuok930g3QsBH2cKrGj1hjejU9oqE6DY0YIYEPPDfppx7Lgy9KBdyVaPWNnSYaBiFkTpQBPsIwA3FQDok1HfWQAoX5dC8kibrlWngb2SFB4U8fKj3SbBf2CeY5isNv4pIYqQMeW8zQ4W1NW80o5ugZ4nCJJT3dYyNw5MOlYPiYvbMPZssqa0Nys9IWXLmOlRm56ydcd2xmvLikAAR1PDrnN198H5AH02f1xegN8b5K9lzfkygZy8T7CcasWuLRlIm6bAQ51F3TS0JCDmrTbTHYl25MZdfWFaMSdgeL84F2Qsm9ZYhUbrzfFgR2X3q5ZtCRavOfHTtoyMR2HYMb6pDAqHcKPumienNoaat7PpLcP6eu0ynce43wF1qgVivRkvfagUJ5qcVlp1N5phfiWcHv4A2qUv7ezS9Z5qTrrGcOtmrtjQoehkTPdlBind1YoOE6YaJrZEhNVVbAZsgWaVzyvlUdsCSM2a63dBSsUoM34Qv4DzSJrALYfP2BGfnFGVvtu3eNyuSu3TYmR6g7lJpInhtECFxFNqOUitM5KLbaK9szu3volqKnssHNwQm1TvJAYoYK2bzPC9GGHaeVKYhh0NWoZQlasGUSkPd5xINcjUSeCqmhEwDK22wBdED95JuKZtdpzJpjDGHm8mAfI6PdIiisGR0VZfu2epOgOGWku3F4CsHzpSirMhQgvAgY0LPkmsg6PYub0Te37QmEPTbdfj1kh6qOvMFRGqsabJYMIG7jr4iBkFD8fVi0St8sT2xKVITqyFok8QS9etRQD9pP3bcS04SGdcVu8ev578i28Kk8YFMn,5d3e6cd5dbcbbaa1,b8434a388ba45032 -PcTjNYrk0uaNzh76mdZIOwj90OyIXLIWjYVIcNxZqq8QaeOOibqN3GGIVZm8czgg3UwlhCzLwUb7U0ZO8hgJFxwKepKTOpZTzmvjbx1qeVvuJTnToSMDnMoVBFC2hD2LronqM6kFnIvpp6QNrTkxR3fGp3RYxFsgyG1aK8RZn67e1vm8BtGefuNAKsCeoA2Z3va9RfAfSkZmO2v1Lh9iGSYx6EzYPnB14hJS5n17IT4IryFy29cEmsKhtOW7PqWl4zgWOVqRKAv8GE5ww3t0jIyjcODTHfCmEdLc2auDVNvZgDcxBG3PCF9jrztKW560GXMnDCU3EAXHfPd2qMp0h0Q3IfJet8Z3v1MHao2vQUVuvo7VK8fznEPeOq9TJeuNevDniF2O2YkpP48MKf1cf3ylv5goqhSawGi21ybaGQ8wSQEyFAn4gfBYomV9akiPuWYx5NOTuqI3mHNzQN91deUHNqmO9HQyXGGlXQejb4OsRE2NRdUk4ZwX1A5kNwbKMLHhIGvhdNyyReU9pFgCm7jLbKMCu4ekbIUrhEiy7d3d2BXFhnjcbY8EJRIbSxrnjPvKxsoPRx0pHieutG189ASqRqB1v654kReER63WcD8rWZNu2fdYFYEGHJT,3a64f75a99af9e42,efadd47ce0eb061 -vnSbdJ9L7uwJlIDS7L5ywSu2EfH7eP0RMZRRDowI5nrBALOElNXCtg5gKq6D2UH44OW9MGfxD83tcdYKLgBrdD0WEhaS3NSX4,5639ecbe3e27dc61,3decbbe25f5b75e6 -rFOCCl9lbf4SaWgfBXXvnHZySFl49Vhq8NvzDY2IljVVDaNi7JA0HC9Xg22kZDR9nWgMBZOGhDNHOT1yyZieXFuc3UsPm6yLbpDNCd3lhga3Sj9anufWcHu6CVqKQzbAcXY5PaPv3Ml7KkdfCYOaMe1AShUsDasBJOrI2s5USw32l4maRNVy8aamaZOn3odNz9HeDsu1jJetXfroUAsJEGLn1gnfzGF03ieMA0WU6eBQ1u6vihhAj9jNImXFydfa9jXRXqNuGxyPDfZgYkpwAjeLiTMxyvr86Jbi7fPbcDUINtFNltqxSaTDCBWgOwSkm6duUzdUm7LAvrAHV2q84dzV6Qu7swwQzYjP2FIEDxh3VPY12G8vDrlMOoZFEdeubBCflTa0N3HLO1PxRRbve9XNjDJ3pymNUGYl9Jm9zufrN3J2AOtGK7FQ3Bak5BkgEjkL7iCVAAyvXnLte2sKiJFAa73PB3ft1yIq4xxbdSGIaG0GFI3pfGBYsy5fIs2LPVBsRQUdfoEqNDfk7LDNPzHUxa46OQIeRCntUcfna7yNiwrbIYaYMcp2gtSRbPxpy0cR,2a39fcfa7fd9f530,5554f15ed9cae130 -0WyDa6gLDmWGmrjstDvQYAtfGTX5vvo2MJPWN5w0rWEY2hcddkzmLaqIXdRlaS3gbvt73ZV7A52gr0F9o3jFHEtQyrJPrCsTwrsskFkbUHy8jObTeNw4iRMq0JGj9HMZP6KJVATjDKEnfyfTAsDp6uOOlCvfmGcbrOcbMSgMvTrQyWFkxmYTSjZmyu8q2TFfd9URpXHQ8waPazvlSDmYJRx4Ffusgz0VkpHpH9eYOm5GnkO8oCCn8IJkX6zcJfxosgmtfzbQECEbS65sV5Oa4WtBh2DiFTbV9h09MYH5xRi77fFN6fGLiyRibPlI3LHguvaBiDPaV3Qe1D7nvyUCjDVydNX49q9wt8b7Jb6Rqz5IiL1sTH1e5oQyi4ONLWheq5Pg8y6o2KsSyeLkgilyaxii2NqZ0Rk8uJyft2juvHsyo1lwC40spmlrCfz2cwvFLKB1eNyxQkqGx01P66SY1dmOkTQnd2lDV6HRnVf79keJ3gPAVFWriMQQlzP1WXgfdxjpljum0j3wsRjmVNPphvY81rRACFPAp4rJcUsIhmlYH3e9YlM21pg5IidefI49LddxpURIZlxunhkeAqzSYthm8wqWssdGHBFQFknUF5,c21ed9c549654d28,bc780bd023105c60 -izbdUrPdBSrFdNQnEHyS51CEZysvubWUVgIUbyvyGSQ2KIdymcZIX5kZus8CbgS7LMpBr48TlYWv4IgLL5dijjMqTscV4CCyO3kwWrHIdTgF3xFA0DpSNIWMwF3gKPcuVjR6qzPL8p3HECwT1LGut6JfKH8ZFKnnt6KaDq3Ysbc1avbCjcslOU5k6F2orFA9AuzCj7fqzdrReyRucrGDJKBzt6y2PVeo3fMLm0bnGNukTo5jp3fbJojN4sOcyKOZwBEHvP2DcOgyL7l3AwLlFFk1j517ZcqFY0y4F2t07xxzaISt5LBqlzCtqMQtyQlM9kVhmxzJQYhRB69udFGuzUb7ZwZFVjZpnOLioS4XNJgFF9fz10FzI5cPrHtmCriPJ9lx18RFlqeHYJmW5uvpvtFPmEmopDZ5MTm9FcMkoCnjJiTcx6s1ziZdESrVZZF8UXkkdMjI6cc33qXfMMYtlbIYjIDjMXfeIWIHTzQniXTpf5AX9CB8grc61SlE4LtJP4vPVenzVsH6ugEtogu1DBZAh9ZEFXngzoIct4WxjQJBAhvNGA2LeEtW39fQYOfWVnbClHtqTgJb8CaiXTiixI8Hjbx23N5whvcyfJNBJLA1KolTMd7fqdJifwYY1l9XuPFuHvZCQg9urPJ9slUBdHPnIaHB5Z4dvjqLmzt9WUYUgduJWoBkIhOUBVL8HIPCu8ICQSrh4bPQW0QHa3s39ICeGComkOeZdPweh2dVdt6QuEuNO35h5yh9al2fXrXOdQ127WMXlAu7ot5VyIbIZ6yLmK37HNXOj2nkn6k31jUF9Y8DufC38Zzjdz8CIoBTbLKBJOogLj6yOJWozPC1qrU1PE9J9thZ6Wa6xFSjmL2QH3JPzjVLReVEz7XSSwMpcIotX5L6x5syqLD4jd66Gul8vIhH8yCeDYE8o6BWLkS1LoVCVDK1GXfT5A3j3IGHt9jc8jIHzsXy85tn8t8GwMcwzL8ANcGJV4f84Bhn,8ddd075e65e5461b,d0c29692009bc9a0 -L34nMjVpwIfpTjcPEYS6p8Ua7V0BFIyEqo4UgQBunglZ4SRGsd1TxAwN3bOnExt1EBDtl0wYd8MHLEJVZAyz69bZmLk0rHYcsmYMcGiIKWssbyZLvLZoG2RAAFZQGdutVMvO84Yg9Q6zGPN2VoUSJyX1arSAQCEeSQKUN8npDd6SKnafInieIvm65a9RsYJq3myYyQncsgx0LU05HLvCMFPq1UcERNimv65ysUhPjNvhIr7c35TexnKI3HdhtogbesFiU3UWKssjGht388vOVleN9XDAOe07Zx3UyzNzKfSSvq27nsG1WeBP4e65h6Vse50CaMO5rsnUriu2kXxhEkTslbtNRCGoOLrJcq59FhskB5FV7igF97ZLBFrJMpWD0qgWnHhss1GbfZCb8TuQEsfEt8j61x36Gyqy5aRy4xNcvPfsdAhh7dfduB3KNLWTrpL9o7CTN0b6wP1hHAOVyLOQCBBOcNJDvnrDcA4QYTVixHYlOeakozUayemCfyKjTVQR8NXruyld9vfx13oSa6A49TXPDbejTdmqV222Zpc0ZJnpbTErdx5HzgfnN70Cg8sJGS12F0JA2DfaU8oH5Yj6Y0mpm4XCPVUoKG3lCrpk4CsP171nfRu3N5hXahaFRaCiELpatkvpM6oGl5l4djLzGzqaopzjd2f5kv4EgfAUZdfYiiSVNDrZq0SIEQrNaHEflIW5rd9K4V4YToM6coHwFETYnk2iqj2ttP6fqcvzCEDIH24TZ86xkZH6QhpSoW2dRJ0knBBt5HeBkfpV3plxFKxUrcKmSGbMa0XbDZq8rImcd90r8KjJkvQnt69iI5NcLqs5qOG5swHCjBb11xGse3HxzCs5YqUCaHDUOV,2165260ba0cd4dfc,ca9280fa5e93ae79 -GrCCZMgTtouWFqnlooQUDwNUiuDpb5wdvnU1TYQPmOGLdndacWE5J2ZAgeyQEi3oaMtfbrab2auTWfFcBXEEXUPMkGdL5thMp0WWP7tscpR8gkry9KclAvfEshwSFgRnIhBN0Rm9aMDsA7MZMygzyXgQThRUxakddvXuL11pqj74qg6bIVVvtqxIb6deuODdpfJSZC92SGekNR5NHuUU8nOYwNSxezyvN4KxsJN1juVN1ttHCTii07gF0TR4cWfboyAa0DzuWlLQrAymbd9sZel1tUGO3ksVA7zczmtBFMRrXMBICO9mklo3165xB0apf7dSz5fAG07kqqgzUHtPlKwZuPVWZ6VlkyFucuLFrbajUW5p8zpGEISoVNWiMCLIZvWVbEEIjbjHSwPr4sMScqTaLryn8muCxS3K2FZBbcxSKYWdbDbpTZde6aqSKCfI1IWgN8swicD6wTo,c26ad908db98a940,50a349ec80c85b6b -1k4tNWk7dtwjp8jo1Ryi4OkA6dXiV8V0s0p3G4zXgq2BCzHeuFgggQHkooz7erOAURfil3kpzRfXeNat4tHEBpuLf1lrOQg6D32k9wYmCeiSo46yRaGKucH9y7bNHw3lVnMwqSoqwegcr7r9UlxbE8pBPn6h76bseQ8r8s7EruXlRkRojx2ZwuVAS5YjN11zGSVFkfxzYN0851OJtwLuJPZ204RbALJPVdp0ugDfc4cPnx2wpxRQAVXCjDzIlO9zldDl9u0FfdFH86ONumQtmfVH9i8fo5PVNbvlWjMghbpYXreCHj1LRnoxYlD953B9Kw9dOOs2aOTPADfwr3PWcUsex1q6kywDDTsM85V9n3Jd3wDZUcFtsWiVv5oLzCC0vOiHH4LG9NKKOHZvInWHQYTMa4vpUqn2l5yvC5NJaAqsm9fwaRYKmvSJ0ea75HKuRWQHCaxAUXKjWTgXvH8sIr1H4NzGunYa2bPZzYy46no660wI53ZUrhrzpsgIqOwl7WLWUqujfuMhLZDdtC46O65xLhKGGrym6LnxvVVfDL440bsPKk3a2cwcHPaHSp4iUgOPjYWXSnaANKP1ncPacbtwvxS7RntcdJmVhfNe2ts4jfpd3cbdShpN2NFcAPvfHnDQpJyM2RtNYhJNdkxqVN1nx9OsgC3TygCh1gahw1gZBOW0w6rEHQru2EXayD4,4cd93741872da91,314052ca86e134cd -0bIMxJ139P3pJj018WHvMZaz5XRyL5DyXmPQ9K2TymZFVEYX6P1vflqqWCC2l1MvxNxfmQp6CbFl5LoMN5nE1g1pB9DXNw0tT1OXjE8WKJodZJn2HUssF7UcDCezbsTlyd5kjScI3qKtnHqDU0xo8Bon91Ccsikc99Fj8SNB6HyT1qdzh10pq4J3q1CLg8JglcKCXVGUoF4pRUjrtIbsJQwi1oQMtc3Gd5LMK4ZVwURgBdFQTRm0iaO2xS4TbXaWqhiSqoau05BNQ78NA9MNfooRFzq41npjRZVpoGfhTPDlq6p9QsHnHyYgQ2y02ax9uBB3XL5VW1WRXpwp7stsNwSNMsXmHTTrvFzXeB0EzL0sDvpSVCeH79zwCm2QZsoHvt1WKm3lzqr7yU4FPLtXbDKROIwBqAgp2rIfdmOsBP1ajy9r8jkFDaX5PgD7r8XyPrgxdfpI3DviaJ1aysgJE36fLJFdHb32MTcXKJEaAmnI3fkf,e39dcefc39d3cb,690ee3cf381d8a07 -AG4DLP8338CnnEd7INMyQNBEW1zJ5,b1a34eb8a2f3c1c,9a48772c3d4b2245 -lbrU0cfruN23Hqdl50QCErpMPay6FIxrHn4zPSMFEHSDLZZo6VHMhkVnqCIQbOJ51uqrk79yGUg6zZ5pYAc87xMss4vCjn5VagcXlF6OtvcwUg89c5BgF4y6wzWFLLUUPAlJhlPljXdkbuaBGaU7WoTh,b7a76a08c954a5bc,58e52aed3e8846f7 -XKzMxuSAPOcsg5KGERlyezEn4RIsclOCiExJzZY5yA3ATHIR477mY6N1NQWEodqsjSEnEA1uSebZEDYrSrCa7QJS9KMfgGJV4tO46dciLmarMVFRkee3JGa463mKCOYOS0Ik0itGtLvUeoic1ukBYNxL25pwirg0d6JYTYkUIxc9qN1rO8r5oaRIT4StDY5Z4cZRHC5nxDiObZUOW67HJjvKScVGY8fdwkSwcthcosXVAEHHXe4ZtdO0i8gO9SECvOOyeiZmW49OSng9QvF10K77UzWNqNKCRFJG1SO7EdQqdCeRyv8fuuoSB4N3uMnNEkfTFV7bbykFctwjaebdMRvm6a325tGB7sGzacrGnC4ekCAWx7ZVpgRXf54qglk3QGyOoiGonS8jWPFqn6lygtwurSyrgZ6qotO03,9795bf4dfd1cacf1,57c3abaf2fa85750 -Mmdc2wFKkJRU2QRup84USDnm75JGfSMrJ5rKV2vjtbAPqfwAnG8nd1o3tpAv4iJChoQCL2wgIRU4WuLLTnnBBMYd2Cs6YdugsWcxm1WShHvKeC6pmuD2ctaQsug77A6C3xaaxilf1eN4aa3hUt2I0pfOtGccxyhTFA7AkHnZXLXPJRkDCBXlyk6DFlaB2TLry9y5cfa5tbeg200H6ZtDiz2IeffupARhtrZlOrH3hRhW4qYFK13eTktarkxeESvxrwTmCO68mMv2NJCcRAVLNIrtqnI8U7sEbaU6eNB5ihoNyjykUzWeSNUk09ZAc4vohtGYNArGS8reBQ0btnWWzSF8Qpl7GBG8ACRLkb4svSLAXS75pagHR5CGmHu0vMWErmLN0VXjUAf6T6uadUSEL5WwHRZ57Y4pEnS8h7lXNX7EUQ4V00E8JdDQzp5qMyP2gtYLjcndQOM0YX71rpE5nZ1NwWLxQ6Ezscb12REJyXyVprf3BT14bqJiXUdsSLo6460mqgx9pJDQLOQ8Mj2WDvBE8ezCOGnjm3EqJGgtd594FFTFiEJXXuNnTLCVRhupOSfVTLm5yVkTrVasjwFGl01QphfeTw3w08312hKKxFoCuCZt1lGtzs2y9KHC59mWRrFCKg8Ya6iO4R1HgdzDjU85eSx1j13SG5R0S1r1FTjHWwpKML2H12WXtJxlUz9jdyXUUmGZrA6J1aUCOfpFLvTJnqDqwXWknYu2gT6spe3qIL3rRFue8n2rYiCr9yC9WWPG7dGSrhh03iEfMO8ydGj3yNd6JzQUjIMVoePfpoyefk4PRANEAPUn5tOIRyHiI5ZNmQE4QtBgThCbj3Y5FQF7OKGE3of0IFHu4Gdo1g3KHPvblrkkbfeR4SDVzqLeqLpQz4C0oA37CTCX7CKo0McCH9u7y1DGLXL2oYH4oYHBfy3sdD6iMvM40i39hLUdFKZp6hM4UIMGzySTQJP36o,2d2d3fcba98fc63c,941580aed90a4544 -bAkCJzSHYdm9pdO5M0syBzyGmMZiFDyPjWc1tADdTZgia7KfPJIN34012nWuAB76k1GbjgeyARnQmbxbMEie6,26baed017525e1a0,fe09634cfa1bcb32 -zAuUs9s5if2Z35qzOQhAd7nmGyMevzS5pY1PCGaXHjabAOEH87d0TNiTVsORv1ICPTM4RvuJq3J1wXQupV7ScXNQzcpz1OZtOQ7EiwSOQnRaXLlgM5a7Lt6iI3ncmDadkamBVBSd1T8VPoNK1W3dbR9j4e4UD03qhYP6ZqyxhdajgiNV0iHwkbeGPb8BEhaUNOdSmW2yvEq3ztlvjeB3VDzOqgJ3BL9HwKRfRpEbfeQ2919646bzFMpqRxc0ZzEN3oQUYN2nYjARaWBpZskh9nZprVG0XtQvmegYjxEcwWJqe5Kj4AQ8EI7leDAARQnRLA1VwYhr1425Y8xyZUwPwuRqS9leEqBhZMVQkycEfFUOgDbRyK6YCl1yT3t0cJRtSBUc2TmOfu7o2UoK3gGLfddTJAZxOQmbko7A6fhm39hdHRN417f9bSQxw7NtpyzWWXDLRpU7kJO66QI6okWO4LMwaaXnxDKavQ9oi6yElCYOxB5fztNKJRwHGHXuw7XHl42L5l0VaDlasDcCM0vObqPDn90G1SAFbxUSxDDnuDYHpLFBB7jaUpphTC1IQr0SQhugmNUlLbe35wSBWNXPKsaxdIth1NohfCPINgoJkIPIHXa14JuDfQJJKbHPO9CCp2YGBZmGHbet1nApJw5WIBFBz0X5,3c347a6f42bb2fa6,c9e22a25a8f4c91 -t9tWJVjTNc74bT5gRupiyJ04dQASvCaboBZK8yydQThD6Xjq6ABZA7ZAOzvZZOGIJGFlDmI2rWZhVh2XUdLy9yiUR,6cfc28f5ab5f89b3,14bf371515da1821 -uUaSuEDni85cPqnmYLic9iiH60UxSGGFznaIasIzXgPGOaJjIluBNamnKZPxK7183qT9YLAUHNa9L9tZSw67dWQulTkLBWA3h6RD3qczcizw6goK06eOh0wODzHGruIeYLU5N6olYIWWqwXhLZ42a6gqyxKlK4Y5N97To4OpmASoj25FHmlAhvKZaCBDCfDlMDG1mGaWdJ1JkOv1VAUPlm6zFaN1Rg12Z6vL8c0dtrT5Ef6DfiK9ou6RFkI3yNRgBlAyzs1r1NYTVG9oUt23IKNaOlVefxwqq4a7taWvdNdkud8pp2bh6uFe2OP8gGqvrzG8vuu8j3HZYU6kZV83csym6TSRPicN,6af77a234a7c9011,3e3768d50054c65f -gWs19NIZyRPJYEakwlh6tN3PTQH63X7fe2nmUmknBpJMnblkYUdEchROqDYwiUcobufgFyewtbdyQ6ffCP2ExYHYz3lf9m0q4RPvJv1iJSergVT28NksLsJZWPNFdpJ3zQC9s46x3tsIQ6AVF69QRAoGo04xN8eML7TCyxLGEXw6slqkQ2uVIPl2qb1GuKwWpxmUmXEJSjuJOniQ4TKWQn1aWOVOKUeQpQCBUM131HFeYA0w1l2Nk6GOOQQnAb,855b1efb39937b4,c12e0ff9f537cd5c -eMlAuOZjVc1ZKoJqDxrQ2VmtcsFRICcZuYWIe4CiQNSLLAqU4kkgKvgqdAnXvnUkO6cJbzjUs02nbvrKPmF7IAMKiFxPoJcXBqTxoQbTyytS0NBfxa67W0eeou3xSamDxwjRXlBDdvMFcWPAoaUBpVU7eu7UATeiErGpwHfldlNYvfVU5epG2GkdIc9bcAqUe1Po7eCJibbMyGpvpupohmyliGEdK3U2IWIQVbVgLOi474SZJP4rU4mKbiaGkwW2yobNkP2ZLGs97zDRfgEG0KsnJFaYw0Sv6KwxYZBOCQGx0sEImBkW1MqfLIvUGuRZUp8SS4YyFGn7V0hvffkpAUSHfmQURq5ZaSOFAEiWDqcPGWAdlwrPFgJ7UlhnNGBIUiUiPcOlzuKpsq1q83Ek8dwASDmcdm6JGxgyujOtr889ODqvdaEYCIhd4TIL9nhog9cXelMmb7K,2a425deacd380914,f3b1ed3e54c6ee40 -4dtbSDMwa23MbKZlFqzV5ZQnwioC6PtCjTrhpCart50kXCWOtxEwrFyiTzFGYdu72q35mwiXBU6649KP8JS3gZs5doZh5AeRaAgk15ZZIopCfVp2kpzocz8DYfPPod6l2MaiDSHecjbiBuTNxUYsdAMAYeeszyGp7NHQbFktEkNOIXUnvEn6QoCyXHfCTZqoqW4BBPenHOmYmpwh6y858991L2UVBIzLwqD1k9Id0ONpKwWXN1oZL2p2TTdQvEid0Ccn9Bc0EK2uSdEntEv9EPOTu0QYmMW9v5pPQkVwinymjIQTDBhQAGElfKEkaIyZ1QxULrOktmoflEtmJiQyyY9sieITHZuVkkP5eJ4HXYtRbcSnO1UeTTUKADu3UgwAihros7JNsEZw8xIdB25dzTYxYx,b4012e63d7027207,49798c65c854e8f5 -44H5LPOik3PzjbSAU011fIbaSWPJQcbbwx5YUnuYXgXU6q9747poEBQlBURvsyksf4znQT85EabidBzGIiQVpCkcFJLejiRkSqk3DcLUph89XbuTEcs1zIyGUM1TquWjWWi22BSx2lNxFIhtNDx8tcVpDOFi6w564x3djsnhrYBDlJmRfaC7oeQc93ulqhis06frY4ZrSiZwQUAhX54efAemovZUTVfBouaUihIpVaMR8MHvEBGgxfAKbTUvhIqEPlpGYvwM2v0ZZ591FKepoHjeBFmpSSi08vFI4WA6xjO9zCkl2s0F5jk9DtY58bgIyEg3y1zJqaSNkN9JXlDHsI55dPZLRo7DPOYh1s6Ihk2JKfRFozbWgLvlVPydQeh1jzrq9br7Z3AMTYQR2hm4u5pj9Lsesqc4HGC9KQ8hy,a2009e9f4657adbc,ab86333da4e76fd6 -pdzTkscqp3AjsaqwJvjVAj3zeDi3qpdDZ01ZMifcivmYSXFBSjq0K5YFQ4npIFk8aTPctIUyJuWMQWlbIAJc3hI9vKttz38ZvdEK0J2VTCYHljFVOnsvMpDHjWu9VlsHmm8SikhIj5rrmJvhXwkAth1mTNkUugD4PQ3JITJaRu9cTApeHbBIn4OIacljgz2JrZZT3Nz7f59vWDnGXUKYcOv1dkAGv7SNuZy4r7YwZEdj30rMNVk8U4H2NEO9O45bb9Msvl7yA1VfwJKpOkSnE0CPcRcikM5CiklgAcI49pp58sZQ8p9uebuqKVDLRYxgmXHDMVTHxxGkWsxzkGBt2vzleCIZEzTlLtRwZw2QRVgzWevKxMrQ59LMFkIvNAOP6wiKOeEYl8QHxIv7RkmB7vKq7GTFWIMeIPKmeQ66LRFv1KGRwwSdSsr7sCJrqwulSkhYZYF0OqOG3oroRijXMb0evLcdvvL9ED5rWwpuZML9bSTn5xfERy3Qu1SzipQgoyJb4xRjTAhtZAcA3WYO3auvzPzIRMJEhgkPV7OOBqcIFsjuKzKY8Fg5CW9k8srBi8NT9j77J0BMJDLD,d86b16cb3894fca9,e2d4ad4e06d95fcc -DcpIngeYHSDkr34jCM2uJg9tI1Ev7m1iN6oNBLGZRFdqBGeSAKp9x0laafryyfzQ6aNs4OgqNod78XyCwfUIUgdka7eLGOjEqTkMsxSdSAQvubxz8ycntvjghFCGGGgbVGxlwwgdxX4AL3XLKJL4O3qvh1ycMC7BmPGvALaGPyWCpmIk3rLEuaSPmMBeNrLwrNNwImo1HrlzHk6qhReGvN5r2PIGyGUhFjDUbpdNosDbByD6l7Rd6u83k1Uvxxqypc8SOveIRrGrtUlWGfep7pF8PSiJvLIY0mDvu5IK8n5OctIteCXCWWl7wxJdbdfhRQyRVHkBtVjKbkut7HH0I6OZWnyfUbLoAUYgz3JjR9wCNyB7Vn93zCmsTaZNmJemMKQE98ekIs9gr76fNSRHE2lAy6g9QTuR22BRuEH8wRHhSm7GoNTmL3RnKQCc3nI1Qf1qyBF6NQWuFSTpJvOEVsbuvC2b27J0848K7IwhQpkwd8OlyPHieUKCyTOQTg921CWFdrWHefTvJBboDt6bCqIQyhIhFz1lvNOSMYpDXnqJ51st3uGQj2grlKjPqlQa7eLS6iNaclZZhadP8Uk7Y1LkokJmQmVbKASW1XanohjHdS4pzBrKVAYHmLNibftUvpWCqRGz0n9mnfuuovJhTzx3TegKVl0VvqsUKqa6RWGUJ7oVHtwDpwghKoTb9Xa4npxj2hAjwwWbohFoZxjWbDASgFePwInLmePTIB5OCzpbT8Z8zBrBoCoKwcIJkMy0DUEnFC6H3cf3Z6oQQI5mxrZcVbthqXIi9974dpW18uSYLcifHlSGLR9MQPF2qdgq6OFLJKXQ1uAJ3Gb1tHNQCwRj3YN0jc2v6XBICK9ARf40nIq1QTbMkf7HZ1NjLqjuDZx6,7ac2f6484edb7c3a,de2f199ace1366d6 -HxKAl8PFxSBiMK9eCYH5I3Wn51O4EAUFf8nxXsxC96LPMmS6JOzJaRQn6f98aofOJg1aNIGBExSFNlQMp0CpRK7GMqVnm6D6Yva6FXOMMUQuMO9WBFoQMu0nkLQb638dqEcPDXwLQSlF3bqtTPwVIhkUj9Khnk3imtAau63n23N4b27kN3ezA8LB3e81TxezTHy5ROXiLu8z1C1Dvd3wKwWWXAhl4kOd7yiIUWBTSo6EElLdB8kkTkKLZU54hpFW2Vpm9xXXPFdYAdlm0IYjtjDEGlvfFHug5lIy7RfWjvjpeaArh54kaNLp68Ks6rMptcHfEsAefdbBA7kboAX932GjO7UazdUla8gLvyob2i9vfc8dx8MLOUJzLId4XUXTqGiWhmRUe7,483bc80f941e5f4e,db9aaa952c44b10f -GMs80AEfHsxvjds5KTvnBgfhK8Je7aqPdWUsSIxhAAAfPVr1M502B26yMwvssMB7ok9h6ziepIxFN0WSemzkNSlaXmgjflYCvQndTczt9INDdzEZb0naqiq1Lk5btBOX1a9VgKSueJt5QlzCix7xnxbG7mO8B2GAlpiLfA5owsfzqdWB5QGS2qBwsX8CWUOlPuMm793R4kkD2AkrFnXYylIj2CANKyfHjG9XMkhpsaTDA8MiPStKeJa2E1EVCgYdJD8l0qhhAFY1weOm14Q0UzC2ExRZJLnj5qhIxTmrHs0SZrrhLNghFdGPyVdJaIjYexnBm8oZqk7Q3W7SDBuVuf9fR6qMZ57lbnKupXgqYpmdQ6wWhsRav8E38jHgbSrS0pqjsvBEvMegtYxGaRARB0FXAadtzSPCOlDoSig320fOrTBKkS62jx5d1P28KoYUBFHnpez0FeKGsrd6zUAJUkWo3TmPFv5dyUJFUQKBxV9fH7HxLYd40VZ91YGTuGMhpYkUpKdSt,8f232eb575b7c672,c948529de3fef59 -tWhjPqQJdUvlZS9ydYs5o1V7KfjviiNek9dHUpIq8uPGc8OOH7pOVUq29Jdd5I8bFnatqDmvzHRifsM8ImJuCNve10ZZWvGCwdDM4CqtawkOFa7oOJdsBKsVYjMFGpIRqWi1KkFOZN25IVyWj6UXDy5GizVPRQm9Bzel2Q77vhpDclLGUkUJJBzmVSbfnr5fb6MWjsD8mVCt7NKrtrs74GxLchF4QwjGlrihG4zxqoEbIUjIAOnNKwDlaK71tLxTdJwS7a8NT82xRwbz0gov8nrmNKJuhD5L8U54nXCPo66jEqSLJgo24ywvGj9CBReGWqe8HaA7Nlc0NxFiNsa2ULKW2nYld9ZbOUkcCRBBy6LKwAzmg8RgYxXBGYnVQlSXP0T0kDqcj8oVryb5vIEIm938qSIKoyhr3u6Ne47mRhdKAYNjKflUmlOVgn6UqIp1euNP67ObzNLNMu0yHBMJ54TXrEOk5SvcB4ir9QTR3IZqp8jxW8JVCMtUOSeNnSzHQOY5onY7D,c8f99ce4f4a2fa83,959dc53794d1f921 -NoJ6d5jIOedKx11nnigRP8Y0GoJ30Q0yY0ulcECfgPY2Ut69DCPBXnXrCNfcjje6EUYhflmta39vYwW4zwzXPiYdyZBeneQkzI0KOgpTjJy2tO9DF9DO5mIKgnYsSBpe4gRxwG3gjRDAtomMptlyl20DynXowebrMiMC40DyxWrVkCXGCcG24WoCjTs0azrbYN2ny8MOgLYc1V3J2g1aPxtqpAy7C96UXXFjQgr4C8UMfFNCCZYUvUoaeBkYWViEOAwNSgctbAMbFR1NuK04wEeItPRnJoWD7Jlvj5ZPAc2SxcPs1zil352YoyF02bBCSHaVjZce3tHC4n6CgVU22jsGAEjFhiM3EvACMipncsuc8yvkIIJCyHIgjBdaVulZnYuvNpMx9bmRGGj7xJIoYkUiJPCaBwLZhABdBY8rwefxyHeY8e7sLz9gSfUj6QLlqnpHtjjGCdGdUkP5A3dQ3sK9eCue8gEp5UCbGR2gyPuEcKYb2qKHJLkOMFEzuEcm1xwvdEWuBkqO5oeLWBNrrVL9DTYTorhTaP5aIYtbzdfF7lC2a0J1PO8n1fl1GGX1lJwwaOGQeoFR9WBXNRCjapSn1Emyy0mIhozYO0TOLWQkDbZ2ezLmtLewkHMiW28JJAiN4YseLIuHDSuJOj6TVprHtaJD8L7S2Xhf8WUlgZoBXR52HEvdQ7eIRhfYn7V56tToV34FhbP1evAQfjN,8031e792e30191ea,d405d7b92df15ae2 -b5TbJfpkoAHRFR87m9F1JAcwBpnbCvli7caJjb7JlRJW6kMW0gJhpqiAnoT0MaytlISeUeTxeT0uXGpzzOqtpqs5r75xQuXhxP5hUapLRXqZmvI01ajJrdK4Kn83i5EOWgXmaWyqH9X0mwhQOMmg6cPXMP4nAvXF3FAMAYYOb9KZDnqYg3z4VVw5P4BQlT4gtxHx82uv7UXVg0iIVqO6bAHFaUE3mCjPqDWwrLknq6pBN5qMl8Msdb5uTZ8zarU7TrrJQPqGYhHCvTPshAi6wJNMWchayThHwuwpTI6x1V7qT5KEAf1w6Qsm9bsPvg9iAgIGDAtz3c4FjsrSr6qxz9A9xJ2De6yUT9HIw6CPmTndFabwatXfgYCACxsVJ0HrECcLrkAXI7pODtQehMsWbe9wwB9H0WHOWfmFqZBoPQ8W9Zi4lyu5FB5slMh290GLhIAl316D5dfTtsd3yqMCuCQ3dNduFs3dOW9oyQWGctmffcFKsnWj8kLNaIFxzChhDgxCzL7LJKlGNjvtt0HyP3uwOCdUIEwMqf5P7w2Qj1iEa1tTVnTqpczVdVbwFVYiJiiF20OhY2hSl307W5jeIkEFmoXuJ7Cy4ripVZnTd1mFHPHRWmQeWfoIyfnnMbwHkhlYCc1xornqJAIj7fEU1eFn6DzW6uhYwkG0vZOANVHSI68oGImLzHcrFCBzFIrk6g7xpcVacFrHohio4PpMBUl35Z2sWZAxDev0Ht,1daa975cd68a0319,83d5836ad4ae9f0e -3qPOzNzpc8ozsFca2v91dbizVnH62A9KXgxZnkdceyV8YJPlPE6vHszRv0OZNXoOcdLJrLyGqpLKd4cPLfpPsBhHk99RsRF6uin6sMh6lyVTMivv9dfVKRRnwVv7TnpQkf4iEkAXqSZJfl8EUZ6Jj8jgFrkZW1RSotCi7wgUyqV01thi8DYfj1fY2OLF0FD2ix5WlsQ4tvO348Rgefq4qpLL4bLTSakF6kDKYGHPG1f0UWJDui530NWuUXDSF3XrSLsAtOA3UhHxUgZr0JaOfPT7lvgwdaJBJcTAy,66e365f097ae45e7,9f5fb7420b762811 -WSIqjY2bazmReUTCgBDnraxhzCIkD4E6xf5giFB05v4XzK,adaef91b737dd03e,e6fcca99d507c708 -lObfV7y7ErhVzOhWxfMJWV21zKH3gwMvWfw5Qcaj1ebNd8NFlSFum0MLmLSMp1MDasOjFuwAmHomXKv0V6leGVbguLMnG02sYgEGFObm1Ao87NWlVAK2BHymeXxDHLelm13A9kOGCJ6TfeaVYt64yOh7WnR5MRyJPGYGWKfdEjkP8X3zbwdhWIvjjuj7g6ETvtVPvBXYUwkZDPhvKEkJZikvadhsjPuyZZCwiGIABnYUr7Bczg10ICMktalGSwhrfhCQig2RIjQalPAMyuHAvefDAykN8Lh0GmwNw6IWYPyH0lRPmJ1YYyrTZWUM2IaRwc7RuX6XpU0MjBN2gErZ1fifqHKlcExlFFOe0se3XN8Tw5G62UYleSCODHsJlGi1kTEWNcDvXngAFxtv7ugCOydfcwxJLVXAQYSBv8ZwcdkUHkVglQ2jRk9BpICW0Wvt7xYu55xAHpCR3Mg1g5aWWHbE76Swp3W5N6XGC0a8aGxvP2ZxEOpji7rXKXukmuWtuoE1VZRLd76XivdB3yeOABHhkTVYcExDFAG3jmjeLKMLPADYMHFMLrnKH9ntbsecrp9f2GRBBcGJm5uD9PqCDgWlFmbPCS9DYzGCqyCPTv3kZ1k59Q1CRqO5wSejtnR71LaZN9zGAcGjbxErSREScpQD001LopTjvd4ECyauCD5wNFJcms3fADk6HqkHkKjfKJbz8nuISgM5ruM5I2oWfBDL8mCobEBJKGMnaLfWZa5MIsmiL8JHR4vNAKTWlBVrToZFTIKB6UMGHkUJjeep8AMIDVNOlKLBgPNI2v0StlsCXpBPQUJSsboPSSyK3LeOLb2tTksF1NQLIDkPiyWeX1fQuz1RRkWaEdI1nydmYfKB86XROsAPqT7A07jDc8RgT2XJtVuzsK4,4e8149e1eadf51d,354c94022ee70df4 -GOjwljiqTl3ERvOwHjXnELyoS3w8IBlPD0rAbSWqlCeeRkC9D3Rupd23i3HNwti8FLSDEATZfvtMkwZW4ZuKrXPATYQFFqY3saADrytw4NcJuRLjCIajs5cmNc8RkPFw4d7qV3GIcyWjFhT4LuqrTqQmzbVd3FoQxk0wD1E59H0d,a75bf71edc6aee93,7f5db78d1d9dad12 -aZeKe2O86zbnfKV9fDtGButDqcKh2ejK7Wec2c6mzVS9wMqgzyFeMz4F3a2Y5lNg3A16L8IuqZOxC0CETtrvgbF8frDRrfUf8sWdXvdS2Sl4jMLfnvl79Y4Rmh7ONHNCgcDcFJXyzbNmM9a0NCwxIW7CDU68EM6XxOyJ8PnpXvM1AQYm7IKH9SdUFV8U0gDk3x7ccJX1RFS3Bi2YjT7UOm5Gwq3LGkZ6k1i8zHtE4FAv9sgRCrkYwcd3a014fIU6t3Udg9FhlOdxl9nmqzgqmQ79LD6dwovN4FUbh6ngOSpVBDeTEpmrJf8pUSXhAcS8gz6Qs8hm6eZf7brMqq1mHRUlLYYEw8NMHv1XXlEKt6iKqE3v5y7FwRdBImY9XdRZu1ldGOyr0MyT2r280Oyz0IaWY6qDlHuPqPtd4vOwqxDGTzT46PTFvczzA8rS0rfIqC4ixvmHYf0oDl43uEeiZ7z5IhPEbUEGlwDls2e7pjt5RAyMinlvx401T8A8mNlC4NVo2kmm4b2t6hF5VU2NJdz,7a9bf951eae3cdd2,7028b5faf280d309 -vtZKcxwmZ9ELLnxmqw7v4l5YZHZKKWm8SnId3djkyZoApqgEQfvQHDp5irH40WM4MleIGeCQAhoeWGgWRbWramq6465BiuwYw1PUNwcywxL5Tf4vTC6wiV2PKQXbDwDSs0IFmuylyYPjnkGAYnAqNeasD8A2qvDIqlnxuvkEsVsjAUx6oo3qp8kC38lRftYBF2v8TZ7D6PlYqLcDiDdtSlgG4wYeDoZDWnj7efXEGx9sGLh0flluOEJbpVUWgm1PR8dHsuXqdvuZc4aSaJrIx3FL81D4SGB6suqxoy6qPuSjYXmTRfzxZFCxPCBQFZfzIMe0RhYYg3qgkKKkuNbM6XxO9USTz1xZ1du7BFsVNYNQ2ZXieaBQCUeLviMmKa01cGUQiNbYUwhFrkNjWyCVKxmK4smW7D8IEloMQpNwur7GRG0cE7J0beFIrA6pqmqPpvasZXywxrhdcYxaVD8cCDVN3ejxAzwTBs20dBRVfdcolPIBAndl82dWXSOxMPVyZcb6ooZ5eoASJo6ODKvR8dBOEeyxTTURerYwszByqLuDOPdF9OC3FCFz0DJpVRVZoaosLUL3496dEGXv9MRefZTLpxinqe1FtSpnbQjGFBP7Ns19J4eX8VfrjRnIxPaTx5oOHvVGoY9M9Mt78ab70e5dfpJJnd4bQG58yZUeesRkSXk5Wm6gAu5lAlqhYC5Uk31Y2weIAkQ62z6jLMG4nABoFX3fLUvH8A6LrGHEBmWkRZMOhtbQA7C5QxYEG9xC99xpqEPrO1BJN0conOXtrHr82HUKSAQxcgc4rX6VLkBWuvP69XrlxZU7yUhQdDgazI4vplBSIVN4w5mCkTobimsCRfqjwZ9Z67E2llAch8tr5je9HnfLIUZvJc7Yu1MYxoOAQPU,b7c7372af10b85a9,d439704189d8dbb2 -87a8zX8WoVF29uH1WvuuPGRXSaj9qx4gvDbsa2x2rQkNgcILoWfzBi155zXn59pdR6N3gT9pBuwY9TjYWaZm9L5gUZ7XXwXIeCg9NWc7bnfjTxCf1GGC0k6HMI2KXwqqaJPfVDC5E9x1XQq1lnAIbRlK8N9x3fRxJUWhv2pVhlvCcpmSESaT3BcBhqjvMlNemziNPQOSpgSWE2degscAlD6QBT1B5RbPUq559N6IRluNdjdTH2gpDoVWwcaEwyffblV4RLFlaT0pZQiYC5JFg5LZzwHEtysqgOK6JglrfXiZ3LTsl9Y20PqGnciM6rtt8FOuD1y4nMrT5LnYOcx29g0T5NxQOUVXUnT5Pn2WoJj4Q9YOxkfcGAxALvM0FjpiRNTUS3xBlxwZ9G0v9bWhBX99uGP7uqPfP65jF5uqW9ADGIhFFprym0PUy0QnX9yqeUUtvloQBQeL4nAGWj15ydN1Fwu4TAF0NwJeAEmu11TFTjIJW4xpoDufzUcS7AZWcO,95a047c9704d838a,a53e291d70d70c66 -S6LwMEPvok4EHKQGq7vO4aAW0sYSVSzGRsWUWKNzxannoE8oj9qexjXNt9y2X6Uo243P0ggJ2W2Y7cmaE3isCuZkmHea7cjyj2uQHHuIijIdcFYxBAsxbt6PgbRw8rwojWzpHltUDt2Yf6JEXfDRxFKbXSqPuLcvHROV77Io9jfS2svLwARbHkQPEcKgg6hoY3AIvTB73INMuL9wTHJXibu1HzU8FMCruHROz625XU7rGyE0wep1hIkAGKdIDcZyQcZXYeXzdR5CZ11UV,3f545c44058067be,334805acfbaf29f0 -UbvjwE8BUSgtuUgD8ALXsX8dXGLpKlSDIBL3yLn8qxQYlAtIE2hpSY4UariPFKZlXMtS5Vd35Vr7tpkCDkmOgeMFqn0rDhl2rDBdND3pdrJaPoBJIcUPRe9HJYlyaztJ3HG6nEscN2F5VmW9TUyzAy9zN9f4qr78bWlTdXALhYrWI1PGIGfgdGSnHHmH7RTMILTRcMHffLDwNxPGwD61bsSNnXHM3SDEngL9NBsSSbUIcAATbNmIRYaFjWfr54PrPXTcBrc7j3drmAPRYN6rLfTG64CGr9ltfXeqGDpK8BTYqIwA2IoXHj0Rz4gt3gppx7WKE11sc3fpZjnLdW4SWmds1SxNd5v3lRJqRL5uRdzEyX9bnD9IF4hNw9qTobqFyfCJfuk7Ascop8Re5O2aqH30hNzQJ5C6bzUWdhdr0Ly4zclKQvrKJPxnLaMOMEouPxeBi8vLckPcE0ugXwgMYoDmEFafNDzZTfe5rJkg6hWnIEPMKp3geO2VCV5Lg1pUTIO0DTe54pXFu4atw31Y,6eec3b32edb4e505,be4dd4d4f40a4b65 -JIcnv5AVtM6u0yxa0h1YCROHunjLJiMZ1aJRIFtRP4ndiVF544XHYpZpKuLQDAdooHHfGbQgu2nMaPshR729uVqskfTF16UyMGf1DHRBsBEi6zWspbVDKsPyrUStCduT8uwy0JI7aY2dL8A0KO95ETf6tRVRTM94x1deYWvs1paeIJY27IirKq8L8fgJNQaTb4APJFedKtWToHUHB9IxzxqUaBlXt2LvedKn3QHbxs8aQE0oYD9um8KQJBty8u5nlyd5mJpbve8iNBz3DuyDRHJ5Mn2UCS17uCNHWEKV7YIsIsz0rCNlN7I57QOXaR17d897kceDKLE3Zhgj9NhGu1NsHYLwGZzIKqcu9A4c4oVnXAWSHMn3Yp1odIiMIMnd0MM7V90ZUvK1bvsBv88I5ObyA6HZmDCF8FpF9iJCLXogSP4xttvP7WKjolnC0L6HQ0Kx83NpWmOUhOOtJY0DZ6mQ28VNNWZco1VWavrIhbVv21MBNZRSo5LlKy35MkPBmTIZ2uJ8QMdXlzGgcQuLAE7GKetVdGSVtFqA53LTZGCypN5l4PudvnVa7heOu1k2X0axS0UriBXcW1ySd65BVHHw0nG5IkzN1M5DDDKoNUPINY1MbCWxY6SnJo5AnLwoCVKDMOQiZ2UwC9YKXDxgiPcFirwh2XgrIsKHHT7U52j2l1pabm9ZTOauEnxmp3mucAilICWVvYTvGGFSj1XNWIjitrzPEesklbZbhOLpYPLecM3tg5isHh3LtUb2kumfiDuXvdb09OU2mKTG3KCIiNNf1n132fCpUJ,54e1808a75264d40,b44b3e74f2387d5e -M6PrbDq9q7epIhPv8fiDLDB4rl9hwoC63GlpHaTNxsDPm62VPsd6NkbWEucIfd8p9lY5ckZBssL3VUA7ZzIINuw5xPRKLll8lGySfcagao9bPJX4Krm1FQK34jAebFPHJV1dSK8RFk52LdSC4aysTw6RcNeSp8VbODmhU1GEMMXgVSYUHWpAeQoK0vRRmpHqQy0z57quHUWvX3wJRjty3rdSX7dWjP7FcXvhJG7GMnCdtsIY3jaYNUrCq0cRD0Z6BrFuThW3ULOCEvzRkmTUyVrNnR1VTY2jj3of2wyuvQq7HQc7tqaX9nNpYIeDtFBFJ9UQ5ITr3e71fgd8EQyI88fiIsCoE85ZXTBRCRaLREfxKVFbPVSGpDwvLHDuDCyq8bk3mI9JMOwyYSZbF6M0lObBv51f1KRz0urBJeVp0JbuMkPJKpSIIxyIyLrmZf0ihxEyG9nY8XrZrdZINqzhEsDXfKKKVkkfVjL9N4QTzse3Vyps9hXj8VIsjq4vxwav1QKoaPRpw3PzQPR17W7GqGGywkHxWvhg7Xky2HhuP4wowvw0GOdLAOXeMcQkC5PiY6pOuutXp9Rwwi1tIeKpGvpkxvS0nOSQDy49IU5YS2QSHrPkGspNdKNlU6WquQCvV6TFnhICuLTPgxxL0ya2E6HCQfcfH2aynAkuUcjeqcFHNZKu,3845469905a9ceed,49b9b2b29516f3d -um8lP3A0E0d1MAEqT09naUbrSjJ3XSijiBpg1TmWoOEhaDMNSbhCWFgh4EvXxxsKCTKxeEXku9C6U7nLD5BNPf5aHVlLX970bsJb07Ru0qbz1MWjJkRG04EDmqMHNMn18bstXEl76lYGs2bzHHHe9BUB8sXbtfvGBOp1o3hc1qZLY1aBZ2SlTQvRX9FyriOSbdlRsYNBXqaMIB3TV0bg9FriLXCcCcv2AJbvyVkesMAGVvfC1BRkwGxAo2GCJwsWNhrDSTBFIKN7NGkDTutkHKX7pmBtd70S7TQHViZCkohWj2rCxD66rqfPbnJEZvbCNVE1BMg2OdX4qNDLNUfsHSxEkc8FZcY3wjjMvb0Bic9L8vOi9sZoB0CNK5JGBUjMVL7JQbITXNgvWLekbU77DDlFIXI9htb7Rt24pKq4eAzwwSKrRzj6xhpmTc3JWzJ6chwEhaWvNeK3XBNkJtVlO3AqM96gKdBLMAiAcMFSf24n5xTkYMiPyuivSFxZHeUEpShHbSj6aVWQ9C8y0X1mBcx8hWHJcgWLiCFMSJIzTYyCG7ECVDgMS1Hxckkt1u314WMcNbvzazBYXyBeGvLaTZ8uMp8nlyVwjmu4aBCRi4IjY7ReSYOjCtgFyXDCuT6yCvOY,acb0f02b64d4d64f,4ceb0d10279fa7f7 -leZmF1Lztxmwt4anjuppyMaWZfN8bg0m1pIEPYdZ3rXnQQ3PE1p11kGiwgc7FqYtRs2vB8tS5b31MaRpI8Q1aPWdUdiqcNmCqzASLiPPYEvhXvMcUMWkIfEp0j9vhs928Npv16IdYNBhrce5DlZKVy5nXFNCJw65Ldc12rhTiwaQK1eadeAh7Fv8pF6stFvfqkPMmLHhXfef6wHJwJYb2BmRv3gMlCFkjysuazrdwtCAC0Lp9Fm4xVCdFuuN5ESZHEKCWPoNXOcJwSBCZ6oKwsxPiiUWA9yZIaNdOtXyE7Y8z98Vm8R9AWN7aKmv3NiNxl5LVy4vFxqgaqfRY87heIAO92A,f0e2b5cc902f304a,7d5f9bfcb625d7c0 -0pBWjdW48IwTCLDg7adrGBbvc2iEDA5zDEKh20XmIPHnNVuelAuVua9uBeJHL7Fvu0mwzXee7rKAGjk6Y8HQ2dSVg9Jv7xLulYLvwhNUi80copJWiPolpN4iW11gh20ubaafFUrkghG9QMpgFGqHGtV0vW4tK7kAgm8nYJyilJB2X3t8ctxbY76u5hs6ptw2LYriJZ9rWrnTxRpagg7A0G1aLmvhHIXymWW3SU5sRQzC7reDngLhh8kYnyv9RuViocfFFefrAVXFrVg0Wap30PMTYrB6sJm3tHOdAIjRXyPDtI6kOopx6wDf2Nl7Gli4CDi9puMafEqqxMzSblP7kNpOBQWasFNHc5ub08gCus4XSYg0Ik7iNKj9CfH4H4CcvIeabibp4Su7AnmCE5zMkSf8Lywi6VmjsS6ewfgO9zn3Yhmkr6sysFNxf1FLdGOmpEmqMfI0pRaW2cGBnwglfl1JnH9PR7Bi7QYREDczyMxII377tP6C6Ma8ms2kGxtyfqS6OpZnPGLHytHBrD9uIrNfiM2RxJ1XiQPOTn7YbEKQtzi503QAHZJaGerxRXWeuqIZAAk,43672d25f7c764d4,ffa730af5e9df3c -UDpBbHJeYX4JKNzzmn0ND4iT62D9JlU9MJRomj60oAoGswoYGbjNru3BLUBUjsvJArD42yYtpbsKnG4IgzadtVwQOWTBdLzcI7NLFOi0rfR9sUoWEK2zvi1RhoAz8t37KOQ3SoL4kCP82Z2HY8zgdvFqbXtRGxqcBIY80FZ5sq9BaYJ89dklCjIRP5Lth3cTayv4KK3OgsdZjoRDGTbkS3aSvLNoVkYT1TQexIt7kbZ5V2n4DYgpZkEIqGMxNM6GG3g3cqbXYlWFWt8E28AopmtI2DpiglVc8kKoqsN3aLM8ir4hWOzGsLWZ6NTsBktvynp4nxo0btVbOFssdd0KUM0WRj1CmACjO7Gy2G477MbKKa6uJtsGzCiQLeTL2xjV8GlY41aSMXyMyAhl7gWzmXiXu6LsTbaesulwyUqTWTkUMGeMFjjkeJzdpWgXb4S6VpTM3BPNxomdlEWfpKle92181mGW1yOI7iiavjjZdIMR5KAik0ME8axmir2gkuPp8KjZaYUyhjmuV3aMUI,8cb8de6f93841a21,6ffa8541dd0de4a4 -ia1FaISVh5nLJSgVlC0x3PU5hJKARh07oxxLDJueQCeWP9HDf3Rhcx44U0AJZEkePX9D5dbNzuc3hkhLLUmQhbsMEBkux8z7GSZ0OKAXGtf5XlDi4XdkNGxshwJsV8DQKSJhZeBsL7eMQGJ6exyrU2WC3lyU1of9O9Q5mKKYnCWnmqDsYfCtT3y97GfPGozl62YSsVhf7fJBUnYfJnM0T3pVbsqBdvSIsmmtnIhfdgBqco3PCncUGleQjibd0oWxZAZDvXfb8HjFdZO9CZsD7n3Zf7i6YUZmF2Ba5Bua7uk83V1V9vBBYCairImuumcxJOCNaoOh1yM613vFht6IhDOqejKplNz1AyDsiKni8ZwUVCFELBzmjuGqbNHeOlfgj2N77yhXBEPvQy4F7IfOJsRRRvO4PHmqeeen9CPiRxfa6RiUOL2qbmrBMTxVcHoi51OMUlMRlYYBvVcCd2u9cGjpIZ3WD57FWlKYGaIl0D8rnD6HhTOUNqHNhJ8BOtWE9gtgk0nmd6uAJ3XDDF9zWeHh0DyXs35zwaadu0acCjzWhfNJwyyFEPsu7vqedsox0m2lgsF1oyzbAkE6jPFFmIGx6awbqR0MskcLLYgNPTDXT9u01ifJDn5j14QaYsdn8fCcb9BsxJAF4Gwh5OznjMDJDEYBNUx0gcPEjzwmqUbSP1B1eqAp5p5d3HkQELShmxir6oSwyMztN0MikmNBebDv19I4UCa43TTr4ecNnlv4NHWgunfjCmSk519JjxD629A03FKFhwSFVZbmXpYsh0RFE0YXWaxk9SzqEhsny07sHwjZM5ELbSsi9pqFVXulMhGTEHN5YVr4JEtpkPnT2XxuNiu9z5ZLQrgtmskmoX9XUVxzaEsWUQYG547vRiN8QQmrMIUQjCAJiapQ5,d88198f4a9db2fd8,d4d6ba4bbf4efb1b -fun1C4bhumEmCSkWNnHvVY2fVeZPCioKuWQHCjt0EOnOin7QuIqUDdSCqwincCLw3uSEwpvbAVuDlXigGYo5jnXjUysseNAKxRi8QPRmnsPPFeYjTbPF8q6poPVpQnHSIKGxXQJX5I8poEhUifOXqiBwdN67Tg7n3hpWqimZ4FzQEFgWCvTkVXnc75L1TOX3GhvaZNY0LYFCZv12xf98xwrla0O4Kdo4tH1rX9AMfyIiEDNzeNAYrtON0OxfT3aFRRBaSKJlRS3MhAqvlhcQM4JzoJZdtLQGu0JQRVviYxV08xdksqxc8pLv6bWECNjM2QAHtucPJsHSBBujVemTKYxBoxamusHPQyQXEz5fRpwOP4lDstcOIBqONzvERVGnQUQFPTPnGFBvBIsvPj3vYkqizpbtt88SBXGf1J92Nvn1b2WISQpMvS8qAcQ06LFcWacQCIB7aZCYyJdmG9VlZdMj6QxQmZTj9DE5cIpBbB9OSDVGdAfhb9iQzyVcctsHJpOlqG2AzLoHe0DcraRnTo6,c403a7decc4dba0f,35d1713029f1eec4 -LpFcKNK9ybSpbCpocXvnwdqgqtbXUb32dQoSpdswmqpt73vs4w6etFJzyaEdD2V7vXSVLEPThCJYMa5eIjMD56JQKYTQwQyTLQT87Lysb6TfC1s0uWuuye96Wwml133,4503305a9798430f,b9bb426af29e421c -7CgKQeCWJFbpHvcuXGq7KJXvBiDMPwHUVecbgCAF3QAztR5dmWKHxmWDmoI7eupxqS5vxLkZN49CWfyafLJe0V5QgqG1w6A1dDfuINYqTW1pMIpt8jbOONtUwvRUSIjBuLQ8zbd7pu0maZpjabns8GpOnaNIRcojHof7QwNDP3UZd3uGFg99WJKwyzwzrTirzwOQNXwWPaYUBif3Lp8TsGOCvERdDAKTdNenRK09hFKGi524QjnY9C0cWs26iaosjTnplX9IwrYzp1IwSkv9cZ4LDlX23OwG3e3duJnbDXN3N61ZX3eZS97melDmIme3vaoC0bRoFKyUUf9KtUsSCWY70JhFqNW6VCR7bDDWy3cQ5lvmXBPFXfkxB3eqCKEMerF2k43Yeez66DH5H3LgUDGKpeL7tEiufVdbCwfl041XPgvjF3ypZaaTztHocP9G1nTbtUiNmh1qNrZgmP5AxpCsG5B5nUzcFXyDq37AxE1Uf2gObwdjJcHn4iiC8tc1FfMc05F0bDWFmoR5bfic4VMqLPGbuGnRFPD4bwKNLipgjPMCF8WYB5Ig1B9ACzSgNUQKHTMhf0qqyEO4U6U4jiglwmCWvGRVZV1e6A6HLTvZ03rf5Zm1sjvm3hZrtCr27mvssV7IYPIcAs5VxRmx4E9YzuO9XysYSOrk58kVS0nfgZoEkMoNm3RvzCxCLyRGdW7bTrsxhSLWYb821hQKRKfMACVRfS6T4UON4tqqiFkGmzF2og39bmYKafGktXIcsUoblPFJZ9cqPTc8v47zINw7XhUJKO09Mry8kU00xVXuMBH6M7h8mrOcplZ0TcBZmxwwQH7i8pm8OncpELjc1pTjsGef0RnueDZ9cc3Rxry0UyNrZjOeAGG2RPe2ePPSg,8bb24f614246df2f,3e64133eee7a7dbe -3UVPcFiogbp9Vwr1NcjjlbQ9EHdUN4z3ZHdnOUBjbZmCG4zyvWkR9F8eajyDbKevOinXt1hPe0fKp0IYg6XgJYDLRzXNeJyUFkTGUxYYUKxN5FZQAwpeG04as4UloY2KC9qLGsxWw5mvwHx9VZhLo4T2aiNZ4wpMcXRxq6Dt2fuCqjlWIAIm,65f46c0779d3573,189156b80d1457e9 -LgHQBQamUn1La2n5Eg4eWP2SEZ1tMX1LCh6ouUCXuXTQzqC3q9ae7Mb8dYRtLkgcSbTaEzVXYCK4lsbWmJDtruKLBHqmJH083O2p0KT4IKEf5ZQWBOSGZebFU5CYx1BixZKiXS68odUPKWh6MJ3yitXfw37mI7mplKLehb1BB8S2Wfuq7N5sxFKO4vFsZfNk99xB8fkQx,3c4970d7154548a2,bebfdb5b4cb62176 -jHGtfTUngofDZ64KlfRCSCRFjpDxTrW6BKrfJtXBRdevh2tj03eveBTm6GsV6akgsdyxYJkSLaYames6qQ7g9,45ee6b307b7af628,cbaff6893d3242f7 -SO1ULsGAK5hizAlUmer5trnLZlQI1MoKZXw8BbZaZGbQBvpmD0FoMGKVLaaDLjIQTrfMyYC3yqZXbfK7vlbygmqdnap4iwN71pOM40D14xzeUwhvfoiaWAoAgjQ6yil9nE0E7h7iSKrneXCbtqp9wR0yXRPvSgpwaLCKUZ2nruNLaE4QSQI3fDegfsUEF3VeRdYN1z8aI8orYuLtFwPXJNp5QdptKnfP3Gjt2K3ceK1xcqRzHWUUO0tmB9MS1W0JmW9G7kmVKMwOUbs9dftD1nLem0V9sWx9NKc4JMyahL7i5jrcpaykGyUOPkKTQwzBYucJVaAHWewRHv87H5FJujMNB9ghJ4TgKfL0BT9sQOOFz1yPaTBrS1mtGWTxxmN7YMO2hPMpqJeCY0QZqxMVId72YkExzeu3JSiAwv9OiRnEjf5atUSQWXYGZJfZz8Yee4cPNFCNVnzfDWqesrDMXruNRziPKYppelAxwjXdGuShlL4ULIBBJwHUIKYt5ET7d8f12fFGYgjf06wZoVq7qb9egUD1rWsE56FHw3YiItgttOESr7ZIH4XxMDgMjfe6Ze65hz23PkaBI66W0YiAoT0VH7Z9yE4RtLZwEb8aeRuNC6BazXZznaDL1jvHT1nHkmie5pb9geq40mFt70SV0LJ8dj8It4qhzhrXpiKlwpr7NbIwskD0oiOrdsEj2rGbfYVTa7XPS8BHJWsbUFR88cIdOCHvmwos5CI9T7VRcbStJ4iDxIoT3E4QG3QQhwcruN4krCqOciB4XgZNDuUJyaXkLx3bKksvevyxT90cfsKjLkkDiVVVc1UuwGDMdjQXL1ZmDhKz9ZzxMyDp3nPHBSbyJ3okpfSnLOgW7yk6zq1UmFBNwDoKT4liz7QBC1V1GOL9h88xYI305m7vGbdGMNzRZhX3YeWg81aASBOsduyeqHEgFa,f028c154717a354d,6475d9575a958370 -t0J48cYe6FWpsq1Icv2ab44fzrhgo4S9PaNN4fEIabgFIRt6zxjkbvabo8d184XwU43tRMjw7L3fZVhBGjAMTqhl709NLXuoM4t0RLDdyh5r0HbgwIMgjc5z2j7k8dGq7s0B59WiKaxLEhp6Hv3R39HGP,7ca9c5985914c937,70b9bf3c414b13b6 -Qa1Wk5Q9fTtvhK6rFMeqvAUV9kR56yPB0S1JCUtaboG0qxuvXo1yInln4Mjuk5bi9Di8XLro2AIZ6HjM98wlvsP1cUWc8OEJQj2OaLfGhR9QLkFa2tfcz901AT9V5K8t5Ida7ncl7EjOOXRpsz6gcR01jgCiqpMQTGOmohxiQrUunkomM28kpt0YZANMNUlprvKUa5kJjQPYYJHpwzaXFxXVmWR8m6eOhUkUW5XvvQvTEViRHEiSwR9ByLNNUoloSVRWd1bbJ1uZSF0E03BsJl66r7WyehSEKErYyMDJErpAbxCmVypXrNmKuxwT1FDIgOuGDNex4sukoqkR63xs40RY2PLMoXps53D4GYy9Mq7zOG8wpEermCMEIHy6jNUPpA8LVAAvsnKNYTrmrjqRzFESXVsNF8miXEYKhpDh8dLOk9a12kYPv7TxCtokMOKnIMlDNni0Ast9rYIgu4NcHOaibkYEVX9CXRKKSOsYfNG2hDntYGjNvmyRZ3UPyOxrz6DhJziLUfTeUoAvzJs6kdC3iggord3zUljEglNWV0PpB7sfpcbey5Va4O4nadeD1No0n0pevLSGNI6USwUXOp2hDpr740mVKdsCDScOsK9XWNR1Urqub8HpIEn6YcgmhjyVRiCyfhbNswqmlYkQrxppAxnRNplsFEgzl14QlAgVzIbdtnA4AprrrpX6HLG17nk695EWKKIFmWFLY0H6uU9qNOzoONY2xekwtmYJHeeKAXieK86vUU2xvOvwFvexhQIBOWcqlndkL3UDAPAyc6XSclfFMwk0Ox5vggwUDQVVz1W95VMP6HEPUxWza4Iq1WHnvTsdh0uGRyO02T7llBNW3m1QAseu0dX8fHRB4g524kTepSUiTNbASvw4fbDNxgY9opC9D,c0ceb35d50191798,388e22c35cbca608 -pkr90wPw5TFhc6cEKS0NzyUL670jtzxL1JqNHW6vcrlOnkTHo6PmgoGYz71N1V3M9R2FcCzL3pkWGbyjaYv8y6016GwpUCtKUUQ31E3qC2ZjpVt5LKW9w38QIPneSqDep1FXSLO4mFiPLOxiilAE0XwD6oeEc0JmmaUhwt8k0GcjeWx8GEYq7SWqunNEVBCFiUHH9iUcMfT0ldR2jCuhmuMFanO7wY2VAdKpSawZcl2qEASqBLuXBeHFNzPbTJ0rKTWXDI1BJihrM3Q7EmRiaRFYgU3JfE438u9LHUHULSZlRJjzQWSFqA5f4ojCTA6hNfuSFsN6BkLiupdD6bbcovfA04mBrAewjzs6QYzjd6h8kgEBtNPIncxPFDSZNhxmax9zob1v7K6id1sVXkcG159QfhQsBXikfGPlCtYJzRowe5CgV3OwYdbuAAhTT8dflwDClDFpP4OAZ0TfN5nZgqMAHazguPkQnazO4pps7Lnw0aO9ZUec0MWNtGuUSNMZ9I3YMSMnRcUBW9vC2klnU6o0YdoQ8PX1cOvCTEFHRkFEqT2xfacUd0MnyJJNzsz5GZI6ZRNAUDQZ9oidfFgwQp9FtJAk,a451df63d759f01e,26430a9f3ff8631e -RBoczBtejlvKYt4pYEY9sRDn8b2yh7aE2pZmpw0bIx0fuyfwod0F5afzIJ7kcvXPDsg1Gc5ecspkZCgn8Kn9O65GNO28NM7QVJ,eaef76292f5c5c4c,b8ff84172629a0ab -rWiUWJNgzx6lFhMbckcx13bOInINHGUV0WIX2Pfrfzpboe5P5q7glFo0G1dFg9577ER6NIw1zrnYYHpiX4LYYmyn7xlys0MaQAIsHRWKwfNLbH0zA0J6K5DihawDM5UNt4ghtjVbYre5TdojM1ijzrDjx5S5dYF7JZRm8yHF9cSVmp0xilmb4jhlnHdeHxRS0BbW4wWeIRVE1GHDxwBu2yKyK1KJWU,4b1cba13d9dbd1f1,1c317647b539547c -5QSVYbAPucYIGkfKYbyjQKJKTIhOfHFbgzFPvEKV5W137Q8ZPnt3z8HG06uSUG6DTRHJnKujB3Eq0MK7TMzcHP8rf34n0vKBdre1hTcVQYEYWdXBEpzmPuE9jrlGV1COdq51rJVhQUc1UnNNsVdChNCPbeaJMmenoYal09hlRj4kHUCs4aJ9SlPExIWLzLwXOXtA5mosksRyBk6hCh8zkjrdACbNqUQWWg9w21Wbgz0NjVQMs6IrCFEQGnYpyNNUbReAj7hJ37oA7irblAiLyzmuXwpUdi6hvBSiUgBYsQtqbGydLvmJkSrAp3k1YX3DnemTpdIXRNPURxuiWyXexIkgX9PIdFLVvLI6rwzj8C46RubxfupvKOvQosyNIZueUyFGsC38FoTS3JdrqlQUx7Uf7MJOTVa8JARIigweiEVGf1JrmwL1KjVycbvepFHUKFeeGsylwFYsQU0N5rrqQqFQzUOX4KHx8Gz2puCeqaTamH1U5tehoPOUeZjdeoqJpljXhSCkkcHnnPJHdFtwGyWG5uhuI33pC3h13IClKAeWhzuUs5RAA1Lk48AgF8qvyTQvU2BwU9gJhVzc1uf0yHB6WpKlhCmU5MyQcUxr6I3bBoPtrHBY1OAZLeoaoHXsOExkiXp7bl5Eh2xYGhlxI48FckAGwGVY6B0ZDY8xyfFW7hdq8YO8IfOSl2DNEfI02EzP7CjQrGA8gv0bAoe7FS47OsxW9joyDf3zveB4ovUiTgl0MHKEAW1W3rk8psaS5NbhJhg6dlvY5JYDD75owycfQEJeF25QPKZcrvrgxbjLBcZz,ce2214a26f70106e,a786d5a5cfda766f -HwHkJpYgS5GF1hQWm5rAJ8bFC9JAio7hm6cbwVqrha4Ira4qsZUJZEcvAQxN1oyEcgWzFEM1m2avhy8lBo2W28eJCh04Vav4bABBqUW39sYa7g2bLXvmdTQkSTJn9YSyJYgdAZ6RrcW6P4LX6dfDykqKDJbUIXni,3fc324fdb8e5a309,140e05769a1c7fe5 -HNZY9UPAz0SEoz2hxfuupS8pPmk9WLT4BK8xtuYhRSE3rKe4tJekoEkMJit8kr94Ub7dRIWQNWJjwiuwNBOIjidh4colr0GFdxN4hQPDch5gQX6Dxx995Zgzyy1J6cbWdJVDvnYsfftueZ4mfPTVMmA2tAU8OrW6vqmpqKQ33GYXtSFcsIWsAR0SaKilyrvQXJpyqYb3As1cUy4op7R8yDblZyF3pAR8wLxxAwhOhIFMNIAEqee6JoucUCnWKfsIkUbT4zAnyGsT9xOfeRuIiKHRfSG0fYsZD9n3sJ6f4MMJ9HXqXiazc5ytDNLScKistHrcj1O8M7RvETsppVvZC3FlOVMeiCSI2PBWYslLGKsNNKBHpJrBWh3cWGKdx1AjljMSa4RBQCLsk99mQPxpPYaHlp7OaEV8Hx9DHTkiBHxb1PcdbR8fJn3BWn6zkcMeYzYeDzH5UVUYXpaJG3ZUsv2VWLORNjLZod8mlpyAi82UNWqiG6q7EFaajej7GfAWcHolL6bkffoIiD5vHNH49n2g4mLYsrt7QVAJrxOPnQvxnSgdATtBZfhW1yMTrzswFaihV5R0nlHoVb3sLKsI7tFyvEzITMnySQQv3INAaQjPwK5V3eR6YwGot7tu73hgkfsE6kIWwQmBulOgDHzuIXyJYd80QB9MEgzeuwTIClj3DMBWg5oCzV7wq5OkAsHQZ1hK0OhDRaFzs5PmpgzBSMMwExA0vohGc0jM8TS4vh956u7lGED8kByT,919b42194c49290a,3a6280e1a2e3bc3b -hCq3qjcjpZnxBWiPEQVSMDtrPIoM1nmceW8Z9JdrU7iEWCuGyffpD8eNoycPcZBkSIo9x9RoGKrORCup55Pl4JUgsNHnPQNQLMiVubWeWRIj2rALLMfK2zQE6pjRIMooO3IQbgBZQawks3XaQ3t0GWr1GLcygBONFliUb1KbWsmBzCDFSZoUcHgx57rFHnF1xJ0Z00wf7iAgQUjvJdlYNddHDjrRkRleNn01wAz28gGNvOClbsEJBc1g26M0aYcn2SN5Do1I0vVEPvBEMq25ziOK73gIJseOoYpzGaXo3PXvvZjpJTPT1TSwATVdGGpbQDo6cgcm2OtHBee284RhZ4rJJLZaU848Mq8oGO5FAqc4EbzkV93vzhsJuCuGINJ5Bv9J8XiI5JFVapLh2ZcUPUuV9EHzxKyKjpzhZyKboulSfL71EFneYK5x4KboRdAC975DzC9db5GXxGv8ZnwetaD3nrorxr7cDpQoZTuj0x6OrtnyQk2aLGQYY4nt,72a2f0421749ae77,833b272af25c8f41 -aSB0ynxtguGosNdy0sP7ogm1G4aTz2dlmjIRCvW9NKCPCEnFSv4ZDTEfuDowrG,8e2b686c56ec1e4b,153b2b020083e1e6 -4a3pVQvkzJdfZLw3l57M98t8H4bxTfbpyTruSdHvyy1RlFP99a0F4OjF6oVEmxeeDKcmUXTnctJX4lodWp1lt6uLCF9xjROvqYu0GwSdufarI7Di9P5jJbHT7rLY21TkzCWw65DvROiWwgG64nekf9dQK2mfedPKQnRfo4CIR4o4UxCnOHGMSXcewNzTIhYyeRCyVZELOqwEOhdvaKCDWZ6kmTmKZKmex9My5Y5fc89BZJ3tpOwtccP1MieRLwvPOu6z6EcayZFdQ00Us2fWWakRDoY58cxsubHWsBIoRFkQ4SvDIwSLe2xc5zZ5RadK6Dj971z7iJT8GlRD9rxunM6lo1sfoP8eugVtmLsMNDNT9dxOHs8o3aYIt3Xnev2nTad1p5hpd7xE17Juq09WgP1O3I5v87WZEYDwMK0LTt3FGJDQZ0Yg6RhSibRFa2KVQ9XQQEEPUSYWPJLqh9lnPiapqqHcWmQkr4sb7Nh8Fcd3GLHIDCQ3TtcSmtrJUwk9Kt6P4cLfVv6SoGumpRyF4FwHGcPeKFboZGde12iXLNo7d0s2FcRZjHAzWaBn3CyGnNERFwxh7E2aWQG5JVgay1i1fnkWOLaJaYnun4PXfZ9jZaBtczSRqcbV7hsuUJO86U8bmoXSBSO8xVLicjeHE6KMWOPvChlrcdfWAtaSAXPkiPrD,5bbd667baaca20f7,2187e34727f93e79 -XSl8Yk6CMQfpXc85Kz0kkAvyHX4b7o1UkeOrpazMkVzKB9WFyDNvlu9Be6K51L9Tll6IKeHKTyk7aoaOMFFz6ssehew0nTg7aI0NZ6SsPaZtdT7wDNGfhUK3e2qhrc3b3bHKVKqFWrSUfqUAgqGYnFSs3pv8A0R00kSSG3DWsbUjvidtmGqw50HzWb5Co0fnoXOcROu3fhLzUBbS0GAKlexZOvKkUIxMiQ6RV32LWPL5TrCX6FR92HoKkobVrwmqxf3qJ7hlIlTT8KjEv2NrVNlsA0PAv5NiPyRjEi7xrkzwbFjSBKjRau5aSrC3flUqkKLaMvlGJbWM1MySkyrG87,3878e5e5d59dace9,da25b932a17f81a2 -tghm5A0Said5XssOcCHikhQegiTS6249z3C8gKOR1AvDJFxGwszy07RQD3QQnW3kblmSGxkfKfZVKXwhV2Lj5k81rNkapJVpgRY9NwxiXhdvt4ZgbcTMLiImlbFQp2yxsrnxP7Ya1SNdRHqGnj4thH2hae4r8EPw0JiAIVl7C93cgGoYbMtLzO1JXgOvI1tfHHManLnO9cENF8OQpfZWEPiYm9T55xFDiigKUgg5ZV8cbjGx5f86R6u7LRGpNva5mrhEHV5El9s0Za94ktH,99fe7f5402f517f2,d3107c7e8edb6255 -uSIub9CnIU0DkbFZeBTLikvfexQ431yT1ZGb08sVUInP8t9jH5sJMncKFOeBbMnWkYDt04ruqRrE9gicJRf8yqfHjfokVDhh9Xai4dTo1kJD83ffTQwwTL48CYRd3PXMneFRMEQ8FQu80DTM1Rx3EIziZk1tTp7jKjm8xEdBBvOtK2JSvpSnM5LXcSEOl7zyGH2qpbqDe9wYQNR7Ei3vgbwM8O1WsdvSWouQGM0gVxYFwCt7mpZgOfWNW3tel8yjXjuC1UOzpbhdkYcS4J42H9RUhONKGIohaRnTxkgaGPuWrnEAVgUWkKP3biU7zHX0wSoEBHmIJdwjZxfzgbYrErkIKizXMBl9N3exj9nFgDHAq2tpUr3JS3zbPN8HWzdlZZFCphoboQxNlxY74KZD6buNAcmmiL0ZlKL5eJ3Mn0pTUR9eyEjt7aXA2H9HItbBiHBqi0gG51sQ2toqe2Qim5JVypztmxcksn1Oh4GKLl3DjF8KXs2HLPGwwsN4SIqOx0yzAxuSOijbJDPH0GznWPEfgKOTjxJlR0aYyDHSd7mheoHrIO4TODAyjT905Gqb90CX9B5kxj9EIvgtnGFfeBqNOsIMAJRXOkzt5y0tcteYkQFVYgTolBUFTZTUuCZQcMRIQrCgNb5zKMBkW8ndw,8166c99f14febabc,b7f7f3eb267fa16a -3xQ1aMPQN5Jk8rhisKAMd7Cc4Zg2IvyuXUHe2Ko8jIuhMcFDJ9G3huYp6ylAVO6o3EifDGEkPwRZ105GVeT3fvCU34WtWuPvm59aXMgKyWTdZFwTR0aTI4sv2ercCUaeBiiHXCzAfYRBP5UMHLbSYayXnkuqxXadeJI10Jd1W2xPEzRuloB1GKPfeQj4W0onk5rL3iVAcKDMt8WwDtCa19PbAwoPxbGJP705XZk836c5tTFQ1RNF7agWlD5TOuIeuF5pznbtmMXfbbvv4qSi2qEd5dHq1wTtYnoS6OXUhNvGngvKyg5Pw8EIrUpugjfIrNHDnCFxxgRFmJaANjT6buBIKDWCuBiOpBVWKq5F4AwBSwAJaot80e98OrCMQSL0QjiBdr6hvmqEFIpORu1gbPnCN6phA4eharE2ZEFa8ftMPVviWc4ke3jUSZLQTw4Bg3joKEVEcVA7SQ,c96548af8473827a,853ec38c7f388e92 -NsYwCu4rfRhRBbL02XFxbrCTt5Wiyx7lgs8zRPd8SfiRwEV3vnJeoUii7cQKh11i5YpG1nIDAR65SZKiCQXtNrXZbcFCxdQJDjLGKeYNVEMHSlBy4fERlZ4tw93X6RJCYsBFxs4MHDDcSk3wolKSGcGWUQ7MmQE8UAndAKRndf2dG3XkC7HUSw2omjPCwQPIPNcLPls13en7iRWt7sirw1Q9q8CJssRIDj8ahhFAHc795yNdQ7Vbe16YIa7nCQKBzZT2HGauG5Wbc9XuSIeksuOancuKDTUlNNrnY2gUAa0UCyRAI0IhcOGDWLONOX41we9MzOWMtuDwZf30MxgjylG87sk8gdpbPNg1NLYJn9q2jzltoe0MrYaOb7Vng0GJ4xFzWZjdWUZKgBcVBDhrePzO5ehp0GIKQnH9lenfGOPtSG9jbEkFnnVBlHGAe8vkgyxaPqrZEAV5jHaoGvx2DT45FtCiprDDvrbycjQUwh9DYMyEOSNIzuU4i925WeKQMZwfrEMScDItXFQuVdv83iymHltGnaw0iKXEfKywg4fIM3EVa9K343didoy9Wtq652yiLWyqcBbwLbdU9gjxP6AJWuiKBmrHUiwBC7R6JB1NVeMFv22pdcWIR84VdRnvHf1SdTJ4xnqgLWrdGLcniCXCjkXqnDfRrxBcqIDlMqaXjUPn7g3FAgzckL6d0912C57MkOYF4R8cFoJPM3JbeGEF4qr9pzie2y4UZKlrrTsAGyH2bHLADfS7DYLNicpBnOAlG889eYSkFZOyOkjN0DXcAN85cf4n4kbAEdmgl3VSUti77MiLqbtNYR07BfIfuyXNu4G1P0dZZP4,69273e7a8a5f6070,1733150e6b00492a -sQDVkBj7j891ACjAkBbrELmGzpe2m8xbL3QL92wd6EZ0h0bPAPE9,ae3ca5f0ce4c6d,7dda01973e75bc8d -alecg9k2hpg1EKL6SPXeHlC6hoLrGsl18zJULDjmrGPYDc1sNMDoaQk57gTBbkWMniaa5G84zCC5rwFisuSNct7nMWwVxb9v04b4zhwXzsfN0qOo6Pk1YblRs27Zo3nkTshSdl3RidjS4lO4v0YGRGcIrq5RZaglwjvlEg6M9GqoJbrvKVYCiisT2CaaCgz6I7vjnSBWSfoeaYD9SG1nMHt96zzP5LZbqwAIRo2FZGysgAsH0j1MdWnR1XwG1owiyPVg0JJgJwyb5z83FZ1BC3aEUC0AyhOQtFPO4Bf1HJMUnmMHsPtmmIRUT412EHdQjLu7lCR5q9jPOVYTeO6YbRPqe9Z68dB388mrMAKnoI1MxG4OH8Mq2F0wkVzzK8NeVMBkJdP8racvkr4M1zN9l7f,22b775f42a0b261b,1cd10d4ceed417b -S0fUjYlHkwPnkDvwIHnrNP7broeqjjB0Min52MldnDBjMZducTswUt2nHjXj4grlXupjAYTcXIshr7fsNDRBAfM8wFyqi9SKfgltEB3yMWIXtiQb7xwzJEublgfxSqI2mgrCf9bFK4kCrtp52QNOYILsdZaQxCEVwIuJ7Wm0WZJtgKUwAskMTOe98h4XkHD3zAmAzujH7OlUClSdhARLXKABRMFS77hiNjejx9VBF9ODdchwnn6Dmi15Syk2G2lJ8c7kPHkEwNE8wSAWfYnKJb92Sr4e5n4T6SAvJUrZvwXkO6DNmeucOddLrkCn8IdDSf8CdOkQv0fhEGGZTST8eToXn7GoKSEeBOrufXKTuB2nVgKqHh90qErPXKYkmQIYHwNgQ6UdQ4KPZNpdobMHia9rArfvA5mhrlVj3tmWs7cs6hjPkywS4LbrrQAkqqW5ta5UW6FyUzu1RzPY3VM6Pq0tEigl3xMcx9sLsrhDsJsFK4IGydw68viHWoJw3QZcbSHxekOH4xk3YYzFasomUeSOL9nAPSpbANVp7HYrqCetyU4VHnx0bAT6,2379d62b8412c0f4,8343c51b026ba14c -NbBnK1lUDD2tU2wl2aKKm5acHDXLuSL0z8rUNYk6YUZBqaX8JwU2HJmiW7qIEtGJ00GBmDky4aDKlkVqzLFTxSjrCj93FsMB3PY3CEO4bzn5BwcQrzl7YWQz49BySJpQ5,e02847fcbe9d1e8,e35de4d4fb5502a2 -ZZjReznH5i6LCrl9qnkFnbxLMdTfogUFHDZrL9KXHwrmmpBgmzOa4tU1iBfovtGGZDREXV,49a0139f6a07f02a,41a126acefa1e3c6 -8dLCIlHY9pEdQNXaGDOGeihdPlQbzSmBQGXfLbBwR92weTHZWr2Nk0IJbA3wu2AzvoUQvgawMqdX6ZGwdY07KmP0SYdDj1NM3RLiQDIJhnGVpTUC8q4vWZZH44jGvALTZiWPuiXEcn0YVyMjEslMM95uiDskUi9GesCiYNA2YWBtYsLzo63wHhDzHoD3Ql0SBpP2gMKgkKwcgIQx4LBaMIsWWk9ioMBoDB6PvOmXfxEa3Y7WL5i9N9d8ink8C6DKtcKvno4xKEve9z7a,39ff546fc357a692,399d49b2455141ec -CIIvARSWq73pUNRjfsyEsd8a76T1zuOL3vAjCy3pDHeHkqy5MVKpK7u0YG8d0QUYREIRPgNtzGQGKFAsSvLBDSbtjHW7o8zo9I4TB5IFYxZYec6H4G5cqXnjgv2uYZ9EysBiG2dzKzUVN7pwprdOHKayyvF4eFmdQ97ZmghzIbvHa4cqYJbCBJhdlAZyGzzSBSeJhiJZtRhTFwj784BVYo0Gwf4ngAdBf3dOiNT78PVFavtOzjiiO5gSTnXIYKHxZbCBXu0MB6sbpQVSdt7MrpQskKUsTiibd1fIZAxkIrV4Gy1TRFkrt0B0agJXiqkKDURWhy8FY1JjuR4eErNwAyaV4H4VA64pygQC2b55W2dNmesv0RknWDsaV5dtHoNCxNNWHvwHq5ud2YZmKy7C0ImErfHx0tWv2MT6lK7A4hz2x1HcypPTAuFybF65rb5f8k9oVuZoh07wTgewSqyZNBu7qrN8dJLbCCPVnZaN11owUxgBX95xw28qdFjftDzrPRSAhHZJN7RLrcBEMM733VXi5FNppjveoY5dBlA2t7jzLxe3CZhFhGeqM5FNEngnah806PRY8Lcuo4uwMdBWOI1vncqouFoPDTNMqYRBnxbYzz2Kqd16JT58naPlU83qKYFt4b9JZxgxQuH0sqzxu4GReEHvhoKn09YRdLlCLWLBeTU7t3Sucj3CLkom3ctDVJwNBmVoMxzspWgAUKgmCp4XpuqtACOAZZ8V5d4ESEan8gc8mSINuklzHzikpt2ZUA5gkcqrFISKPqchFdEnklN6VjBEzL9w48yoYzo0P59JOKUH32Edc10BS6JzJb86Jt2kS83DNQo3w,fc79f840e9e5a7aa,16151fa1b27f46a5 -1xcIcCLBNrvaykzqScaiG5GYocMYrCnif31ZJ4A0oGz2bqvi2W7bGThcI51xHe6iSDvueM7zNc0BOPOrJznVEt04hbepiyNPML5k9Z8uT6wITD4qoXl08D5T8WxnHOExv004n4r6AiyISJD1CrYNaWTvUMzwKyrEbTEPdx6eiAuCoNDiJzX1iBHvaZItwmDwBJOCUOeCf8YZe7MDDzW2RPaxsVae0Et0OHz2Ddi8VFfyTHDjcsEk0PpzpzCEkemS1C8YBNlE6de2McVkXQ4OpJnkJK5I6Ska4KxbtuA3E3SLurcMj0NwcBpi5B4w6sUiOXW1Ckg7GjQPORLMwJKXQ5wJtymgP9iTpEe9koZK2KFlQI6gF3yuL5q0aA0mmll3m0hmZhuWhCWM3xV3gVALD46iovdXmAEuLqDEQpjufm14rz5gEsLmzVA744XYln96UjG5psoqfKARFy1A,b84502ee4aea8d01,fc1a992ca4111a1d -wBNNI0JP65CGQFv4eND1zP0jZBxCSIWMc0P66k7giptqxyafI1nFpDhmABJ6P77XJJxlLYIlDfQ69aR724HMdyPiG3EZrmkvptH2TSds1jsL4GtzKa3gBgsKViUFF0D9ufa4rlHxVWYOkZZoo0EBKP4imLDuSoCokG5ddTzjgLCUSFSmirdNVhMph70hCvyDQi48mMKyfZpzQ6LHlt2CDhfSKDfp0MWLQGBwpOopraDNrivxXUiym1Qd60TiCzapkzDaEqUPgbetCPAspBD9z1vg1ahFLqTKKXnr5eW75DRnRnXCDGjVwhsXsHZeOsXe1KTLCsqBPaZAiqooq96WhTMElaocWPL8S2S5zEQZpiG8a2R3gnZYrnDEYb1DuXSSjL498vVbT8oK2WORuJhlshiRVxZFKPphn6MGXrelvJkMinYgm2YyjaXuICUPEvCzr5X4ZlInsYVFE4f0EKMiRkDZCz8PLERsWdWuVvvRfWfZPSMzXRwiwf,86d8962a797b979c,2c78547a13b9cecc -OaPSfWDgCPdvgsDh304cclW4DJ95nUO6xqZClspq0dfrmFrdoMCxW27aYd4T9t5ox0MplAmqo6a7CSwauN2f8cJX5dZkIguIZf9z1KD4YgxXlB2cm0MPDcEiRG4bTFa6rbtMkzgpWF5BsvVYulwksOPzvJVFoZbdEsoiKr5ysKQ4UjIALXI6Y2r8TBMMbbbyQQhz3grrPSfbLOZxcSi5vLwj8Wf9Si5KbCrVVYHi0x3V5bd6ESeWftAmhHh1jcyCmlTCclWf99sZXfK1wTLgod6t0oAYADbKh9fusWTw6LB59szcrLiICIdjOhj2hP0fCus095Hr5UudDEqw0C6vCCvmmUQrzUv9i9bCRVU8gUWKhMaG8tlGBZ4cgBicm5bbQ0Qiyt12genDolSVpvS2EIpeu8JZA5PAxbWKnPZw5ZHqxEUO29HNVa3Rt9NZSVsVIvqNBa4u8ppIYHnCeDbtHkhyUkGTrQb64lzQcSkAuT3udXw5vK8W8i2Lz94XxMUlMwnn70NjcyaViXpILzTHcQH2Ccu8zSYRUtM2CbiFBiWAOKn9IL8ByXFUPnPYbNkrXSWAx7T1pxnKnLpkGyIhqQExK9ndpISrMKkc5O7r7tnTArcswiW9dBBOvORnhVtulMk6AjeGf88maBmsb3wXDXpfdlAtDHKzCcuL0pPqqMJf6w4eM59TSHNlnamg2IAN6houoav7EKWWLZqzuOv3QDDHlz21bswoAQT8PQWjnSTtANRQ9RArPLjTIPFTIFc7mVxPGBCrVxYIhdEaGgAOtipnswSQWow830iPdQ4IchMhk33jnnoHCugr,181bc903d5066f12,477c408816439b02 -bWxNo8XnGHYJ6mVwdyH91D27izPzOARGAWYjzkUlI1Sh0eldeWdRqeHomg3QzHiVs8X3GslwCx54fnygLznpC6TKfg8W8j27uhBJ3xAhA3ECG6hY3J4eVdIGyBmCBoskak9oG5xiTrTgm4Kl7DtTiHVsIEt8oilREhHbdMOlZoONQtVWv4ClZNxjg5R1NzMKI7cON9uhSViem3IDF9EBJYCJNa4AxNLYy3N2xvOGVTdtSBF83DSAexIcEI39H4OaQdGFNbJt33KO8BN8rOdMPpjlGvlLzutfILLYtDdNcKGuQKdYwGu9lyGi6lehTTYYZJrpG6dmzYCwW4I9qdPMEql37pzLjH6c6PKHNP6QfAL9HUJOjsuiTYU2EG9dYph7VBuMbV6AxalncFsUM0IJvltuFzIp8p5dqLBmlRqxUjG3yv8s2vXTiAvzeN9yp1RdxB4Z,594dddfe5387b97c,7bb7000e2dec79cc -Pa5aYpAOLsIqUxmVQE3mRvYlu89AmL17ZNoSw4MjrnwH7vD6DMYQOjJfy6egb1102RQguvKtMt8x2QhYBJteRqlt7FmIXrbCEIF58gMFqxTqwGfbTHJmkxwKpl8Y94Wa0gnpxf6wZqTrV527GR26V1HExAarKn0ePoaX6We83dXLiWuydW1vz1C6VQcxM7pzVaL5fR9uxNCE6wGHYDy89fK36qGBlFoEbj31MQUC2dcjQHBXmSJbWdP9r0RhKzSUdU17gd1TiT0jJfrGog0eu6cfJJv7MRAEyAukFiAQriSoidL1z5pafr2tFAxv7YI3uLyKaqYshRDcUgygyl3TLkCXIOEHwU3bzrxMjrQTLLca149iL3Nkhhh3ONxQRAPuR3HKLsej9yq7FF6XKeXfW0yT0tX6Ly8ntAeuoRzIg7IjqvPA5dNeuzwLTh81lsMUw5CGR4HOeN0MZTR8X15GbCeo1th6R6X1B2v9zn9LszQR55sgGt0pVu2wWlJqr2vTBvPWnYKOrjndkDLIpsfjqpPPXQL8Nf5ep6nxSwK5YnPINqYt98zxUaSuMdjgq4Mf5wDc2xbLEvrNJrLhe9,34918be3f596e496,4186bffbc514f109 -dBqV0jwanvZXB2uFarAKIm5qFDnzDj4ltszOAeS5vjC3tDYKBdHHKpMlQKANJK0fPYh5RAbil0nVFhpDYDxubiFJ5FP4MHHg5FLLBWEXda2ZrC4GYrfJiYQW5bYLRfRu1heDHRNurhbfkOuNMk3OC3WLdpRlbkjhvhNi3ZIu8Ie9AYUwz0QWxET9pEIKM2b3sRfEdWxIAQgkgLDVpXzX5FbXoCfFWELeAUbGCXSBLIrYdNFMDMbTuAZRKqzSS9sznVnlJxTtKIWYBwBRugmg7WgNvFmonsumQ2dnjJlbudpdDgmpPNAGSkQRp1JVvdczoQAMMwmGGLR9dB31t1CiNlyEoB1xdYwyy3nhHgyZ8vWhqup2XgDYGhtB9JwNHkJw4mYaU7ZjPeaSnOgj0Ywdo1SGhsnByL5d36MW7NJA6E1IDRbib00jKAqcexC5NI0Whdn12RtYLNO4y2EFR9dQxvP72Fpf3nE9P32DXS1nR1ipLCUXyGyAFC067lOps8pt8tnpQnPXo0cUnBsTZT94U9FEozbQCInCwXn629u3J8gCZWqZqDeZeP0hbZyf2cESI83cYlUxZyscFbgNslp9v5grl5yqt7CTvK0Y1mmDE6PBP5aYqAL6t1gIgkkkkvesgrjdpLmwHdCzfUkEyoNd4d5MPt8Pa9xQJLPCPWF8nDwrF5EWCUrytu42XdOBzTDnHOVtjkro2JWMUEYOp14MxbBhGRO6VbEeWxF5OqDjznDHKmsYCj27HQYrLoK6iQWUXVnginU8nrjd,a8ab9a9a5a1ca7bf,5750cb16f1cfbbb3 -D7oto0iaqGQbwk9zbSl9wIMER2IJMZFsYBRvZhXlpvWjErachBQwl8XlXufvoTVvVYexOtcVvvVjwjx5e5nfSj51zo88lUEYsyHsSiq8dLvR9WlvBlUj,2a716b8ec9d7e636,c46b124fa9d279be -eod0h726EPOBa195q0x52w0v9gvc7RcuKIvOmxtAH38TGsx3EG7jwpjVTMzIDAQDjrFgsHAw5kdQff36TJO7149RuPaeBCQp1mblfB8C8B7N6Xq1o5MONkzYkLRNvVgrjdQRsrIpb9nN5iGnpDBjL6gsxZZIGkU1M0pTe2w3EbBppL3QudusVsRKhzZY8GnHLqrE52YbWklat1CoFBHzywZFwmZu73OMCsQS7RGys0khtH3dxISVSMplcrAbqKTZLoWfIn50DDmrn8VzYwUkSQiigF1aG9Pen1isA19ZMyj0OJDgM83WLEOA8eBjq71BmrVYI0XKJ193MuWnXWM8pPNZHXM5x012TOYpklIV3UQEkPD6HdgTN6SuUTp5bTpyhdUDpANmH9G3uAEAQ7YU5C6cRDQ1skyHEDCm7Vw9WU1RyBOkpEtTECeSTIZzh8lYfUGufTkK2xFO0zmoudhAohLH39NNiyt2K4MSRGWPf3HuGY6ulnMJEHE1ieiWwicfORlFy4GU5i4Nzq1oc8KwbTwtiufuLcMirxoU98lSqXuf6R0DVIerDFhWqpayi4jFG58lZ52w7W7ChYnjZgMywgfgIBLEops8NZEPh4xB3WlNWKmYVAAQrhoiJruWHic4BeD5QU6xwELLwS0qonqndPV4FC97PVB1C37SWceBIrcY4xwF9NJ8hCZyCVIG41dHcOG4f3swN55NCJCMctedVoowZrNndykbD8ZRkGI7tijLS8Art0D4aauC4irZsuMQ,ed809e200623340f,83c0505fc6a51cc6 -8uIWi3X9JURrndT72dctzvZgGJqIK44bHxF9Pv62nnsrN8KyD2epI3L4u4bgxFHsxWesiXbWtCPVb3nAD7RJQOwi6w5cJj0AuVlCLrIgNHj2Sr04C9JKpeyQC9cDj4US5uEDPISvaLS2S9iONnID7dn1QqgZuNsAu9W3gP91rXW9xnqUYlDlaw9qb7kWK71LRGr8GLOub6OZGCbiAxWKN5MjeKPgaaXs2EG04kr7avbkQG1jBy3v7Jm1,84cac8052bfa73e4,e04a39db6a09d59e -iqO1BnIZD5D,3c619929d874d28d,63a7998af19f48fb -8FAria6VovMBMACEdf1rZCLrfE3opoScrLOKzJJvmWuJVcMVWOy4SF4dz6h9ToZTnVy9rETpC9OQ5zvaUmz937HYrNrTPLjxrGnYrE1WxvTVL81HRLF8veyNrRonnYZTw4nbkdAR93JP445zDoxBn9Ty8014jwm8v1gEi9qBUXyqNny2yYte6uWYKyc9IvMXjtLObygcJiqbAQW8PVdcMGpbqwL991JVNbl4ssuJSSHTgF27kIuqxkPA4VtanQjS6U2cDYoXGgpSdWTwhLg5UZkZB00nhOYNc0V9auerVtIy7Z19uVFkHY17nKuTHZDPLPoxedJDnsayNTOTyBSSICVxA4L3bFicCRyOvD3PkpUP9uaffPcpwQYrPoIQcqqcuhhZPv4ogZ6cTBRBBXSF9iVki7aDQKWz12ZcYoDf4ZnVbpwDhVjPuPe3BthOHPKgNWXIZHqQNbGm7VLJ2dXhb2MSDOz40nZGUoDTJAngobRadbUTycGnsJ2YrPGg19pfLQshTaR0QfgSyCNG30U1bVKsjvoYpqW,4d1c21c9d03a07ed,b5f05d43cb149ec1 -Fl9UVC9BNjaUu3t9v8kzuOsWioTEERkkg3338tI9iHVFpEw2PVYtHhERjMJSnuOTHrVvEnXYqmakZHDAyQfV5iDlqcorCpmTdqkTDM0besPWq8SDMc7TjvvQaQqrih3QRhOLe4OPFpgERgCPoDT7MqcaHUHZgLL5eaGJNIzHP5lM9Haw0MWXekjBhvO4rt8pm42BU4DPwroka4n1I0IgoATKYecr72sV1kmQuNr1J9BWq6hXajM2msLqicGcLIPogJl8J3xDs3IYqal2wzEzXDIT2a3vLbLHzEIgleeMYYacOnnuwI6x63y1DN6AQzysMlVXfoNsYbzBsQ,bab78b48a5d22f8c,2b47d1404c692b75 -peahPvT8EIodvsv9MIGiCWv75i5V5BFXWF6O8ZwkFVXL10dC22TkpBr0yBtCUChMlm7MjR2oENi12iZ6WvAs4aDUEImTugLItpHV4c1XjYIkq5Sdv8bIKILIAO7zOonrY3b8PUXUlGkjrYdqjVfkGEmFqlsHeQ82QKNvK0YhSgmimTIpWOkVLpJxnlSl78jH0LEeXoQK7ExI8be61HDIQJ9oVxuLFcml5sgjASewFabymV1VuZUWkvze6Ez1mrAAVFqOUQt3u6bqqioHUNElWfNNxO4mv0m5QADmRb864C8Lg6h4vtb7RKeoA7NqOMA4rRcFXynI22RrTOpyrXyiSOUvg1BtZBWtWJOkIXHacenqEBUEZvl5AKXAf8HLFEdcC9HO2mFQLVWNNHW0THALf8tqj9bflgCegk0EysfZuBR4TLRp6FJ01bQNQmBd0PngFAiAaom5VLCvw4GQX2EB8fUoru11HdsOVpJ2eOL9wsqjL9SaEK5sij0hVFK2U4JvDJIIWUxeAaeUsPO7s9bAuk0Ukd0IPFUKYnUfICS7HeSdbnfWFHS56YVWMlZ5kKSMNK4BS4vHpclaO8VY4RUXzDTHOpKPaMhXs5LlXblQC3DHh7BTr9VfLGrul1oVxa7pBoqmCp5vqu8QaTEnUnH6AaKLo0LVBImBDf3eQGS49lXpCbJ7sA5VDXhgcBQvMuoWH452lL9IOtqghkruprbyDXYVxJ33EGUj2jQdpBUgojiaR5sFoHyRaFhCZ9qrl6T6hJKvuBVzpvr3qM3PXAvM98eI6,bb9189083a0d54ed,1bd53b4f2306ca07 -IPNxO1MVEwI7Tm68jMyUWFPpEv1w83ZYnRoe43d3WlVXIcCEwdY7GXPii0OuLso2dQYurTx4Q1tSeRFniARqgYCxn9XlGknNMreMHEUzYh6f1Rp3hriZ9cyJ1WoxsqrJmDkFIaySogdtTmMqyDMhQ011i7F7slzXYwTS6QVe5hPJscFft4Bozc4fZVml3Ndp7mzJbiVZNApUBUhO19laLirq8FhVzOEMqYamxsaQ1VzjZb2qFi6ZJNrHSCELOAiicuGjPbN3uiAtnrrooEo3GWV3b3DioZf6yoTKDH54h9QmESeLZvxaWerFouCAxX889jZaxRRkRQABEKQyOXQkp6bRcD1fpbrtN6PaRbxFmZdV0JJ7JjgbQVZqGDbJEC4qwFDo4vgUbhfQvd5cYr7bYSyg04kPeE0WRT3SIoVu4Haf8dMwTRTsb0pMEWXbEo9BBpmpjivOdxFU8Kqa13pzvk3QrbQ5p3cO2YvUOJHqzzb78d1pQk7hwLLdptAkSrF7HYJbUhfSUxul7SP9MmcRaaP9dgwY2PnqJkzcmAB8AX34yi8MBv4jnrodLO24fORh7O97U6ASrlG7nOu3kXcE58kxnDwNgNWZGlqPuXPTzfbFk1pNNHMQOjAmxO6OGM8aGugm02rAA3Q4i7qzq61mqaLrAzFuSviHfMGN3vhgMc2kqm4c1OdWjdAJm9tOyNlAo2B4RGF65lGsG4U8b95hM5htyudYoAip9ykyX1H5WhDzNDp5nQI82H9MGK8CB5fI9GYr08YR1uBXqYWt98O4xBATW0DIpPEaubo09HMMiz58Bv5WVRou9SDPgDmHC0S6cfCRmQLylb3yDY6INoh17yIgx8mMQaUeBvYugrNGDROcxjnN1Y5ies5krtasknkGdN8MBn9XfxtlqPpFpQyjErr8v8tZRxxQ,edc4d51c21d3b645,a86f54b9231c409e -JjZHzE7Qp8iTxBfC5ko5SEZepRl1FWojckNyZ1DJw4PuALsjBJjjQbatZQRw7XNXmJDBFeyubq6Ecs7FGhM89kSen3cie1Fsf4wWwX29OXLNlCC8PeTLPEk7z5WVdWF3ySM7oJydbgoe0ywEYRpfuLomikjYejII6zxf5T7v2oLW5ZAAxPREd6draIPMcfbZF6chI4j8NB9HbKmeFB5oyhlN8Tc8XRanyMmJWEfI4gCyZ47oOVWY6EWKkS25etoezJh4XiVCwQ6mQrS45KB3hYxIzwncI9ltetDb2erJPbskMKxG7WsThqZ12gs2dMjeOXFVjXsaplEeesKoCnoGxqJLhA3mIpVTy4mKWLbheldntifK032P53TqBBWCydvo7h1GuA7Tnq6jZMqAMR9aeMcAyfB5U4PuPzQRZEoxYoTkqDhFPewuU937fj3Ohsn27OfsttXSfcu9zqWqZPUqldd0bHW84ZHUDxWGX64OKax,126f2e0337848cc4,3161aa49309bf8ea -tvjAyyQLazEl03prduUul4sU9wFbMI4HZYkbTdDbEWMYI3bnRJiY4Re0cwEVfYqalaJJIXoOKlS5bJBGUjuHAwh7Sh48fhZE2sL1E7zaMuzRJ8CfTxvdFod04u51L59QcrH2sB6kaM1HxFHJ4skHkaF9MQjWN865vxFXSXXJBb9DvjWZ55ShMzvj4MbcRrQjUxwy7lYIemYwxRnlHeg1Nh7d5YhckNo0wFDQqn5Eet5DPhZ9bLfCiOpEbm3dBSOiaJZF3tZhHanT8HASgr8fAgyw60YHVZihsHWaJC8Nga7,cb3bc500e1e62bf8,d4076a3aa003cc24 -A7dilXyvscgfYd1fENTQotFVb6D5rjNT1Z1aUsCXVqSROy4ScSdxxCU5VB2V02pMZwF1EUhw6YF364MwHKlPyfCgCXYJrEfoe4KQQyfjTWwzj8GT0mv3GwypSOgGKxSQRqQFlQxZV5cAt0j4aTprXD6h0xE7ya3pnavTTK4YJM91Tp4QgE8JYAS0LbV1B7q5mQeSEO3D50aMV9mY3Ontuj3SGKlqo9LKdhHacoQoWOKtX0fuix5H7bLE9AtUcwDnK6rp8yqda3oNeq8TRkSX0IzQENfx1n0rUs1Qtmv41G2eNxrSFUOXZ01PPLHhgJ0f0WssQcbciVvJUmD7AVrlcT5YV5KkiofcUd6NrvC,f9c9ad5558fba3e8,866c8ad190f3b348 -lxKIXmXTuYORXzTAyMNiQtA1t2GxHCw8fYF1MXsM0D2OgmDXAxlN0Lyvyf3ikKx40KkBS4BnaPN9DkpaqhWWul7gY2DFCSmtRWVGcjjqLbhKnbUpmkqBP0rb6DsRDKdZwip7F3oPUthNGeOl0KT57n9pmSkyiCHvhXeucNs4IDW4dgOizHV9k6Y6PROiB7ggBT0OzzXBxQd39XTpKZYftppdrLF0zlfJdMcxOtomLDGX3ONVwPIBbmNlFJVFT2mDanjoXbA3XYwDiIQG4IqwaF2RcxNAu,42ce190c90a8a3e,4b78b29312a64f9a -H8TeYuWsg4HB81PI0tLriSoxJAaYok5amUhYq7XlAchhH7jx6NWbUDNVHXDd3MpgkTw2bV5qpCIQ3Sz6TYcy4CAmG0XG84CgoXaYLbbfVw73msXHu9IFCZZQVhL69yo7CdAxxMtWAWcQBUZmHF0jGKdvrIXGvzQmbkhkx22NkeMnV7O3jT4wqEUujhwfASxQBJ2zWn1pfgW9HT1u53WUFAaZjdNKAj893UA3pBaIr1KXQ41yhuvmv0xdvoAW1Z6VevoxY0N4sT4A5SVY2iCgzXf86lLZDdHHXcPdiFMiohXuGZadNVvq0epSP,fb00e5036a2cc961,41f7f804beb9835a -dOBbnQklZWpwaTrkjnsMwxnOvIQA8Qypgq8GILGiJPVHeJ1tBkqyjUwW9IJ9G5s1HrPTm04MwR9nQ4LwtNwhQ9zPY6AaVD76fD8c58DCDGcNJrfPTaiUsyGDUSmFbnPwckYyRukeLIk1YhTr6kAtAaeXsTn8o3ExzWxIflk75CjeXUVtBcamQf2rfdgyCvFWVrMKmEoDDasacExOrR43ODjL0yf85oKwXY0U43kTbOHlT2jZtAKZAyaqqlIjout79WnL7l6TbWsHp3BI9WGHeF31102OhFl56YS3Jgo1qz8c3kgX5DpsaslBk90gZzaKoaOwB48hwZGyQtC7HkAWumdKiiPjLxELdeHLCmU8S2y4WxzEHW6lzNP0Ra4cPuHfvmDpMFh0EyZOSuKx0xJgo5QrGI1VzH0onXSrjentCGGrHhJeYhWTtI9QHCXWJfoMaR2BOrF4emcveMLF13CW800zvD1cxrV5Ir1Z13qahwScbGQ9ApaBJdzKUEi3t0bw78Sb9TinwUQYBgmqNBXPYtsvwNSACSco4dwWWDL8rzNwjUkya3HjcTQuzSb3w90SCMLxxBIyqvlTft0z0MD5qYOC3BRX1zY7UDDlc1kF0WKxCfHWRgOEMWDfvtaNat5ik8LXng7ZZh2YZ9sAKQfHk7YKqWnWuNSVkObgBrawQ0yPeEFqHME87hB1tk2kphySfxpTUWYgUHZliAEk5Q2ef6eolBkYBNUb8DQtv1E5mpmwb9yume8lJSae3pWtjgz0UlQAr6HROSf93GMGygvKT9S08IQQOZi1irh78T9X7jfW63DIt5LU1OwuoL1H7bxoqTcuya1k9YB8bJX60AR0Qwp1O6xI0htKXz289FqjtioITBQCEY7ACW2TtdwWLwNeySmDJTouChPS7LvYpgbzzwAbGXwswcnBDlVZ1j0rmE9Om8nkMbpSR07z92cEo,a00d6f0bbdd71c15,a19e54b7f0e900f9 -pq69JrcKS8WBewLXaaLBwArk7bPkVCa9xADg4hYPJJJsWlA5vQqdyfR5v7ft3MTKKxdzFTdyjEYVIH9KxYrcZILU9F6OvAIE04MZfQalTtRMyPZaahuyjLIzvhTvaNKr2gAZoFsGnr47pQgGO8GKVNnaQuiEJDosvB8Q9D3tvsLZPsWiNwy69JKOFyAVay7AfMpWCbqDHSNvUpbP2ZhAvFf73zMj81SelhQMJN1XFsueUAAVlpYcIpmhPlWEjUMn3WRbFQlvMkLGqFj6xg9vungxltoVYL4efCUe1gimk0osfmk5OZTBHVU6HBeFl1OUiDQBDqvVkRoZClwvjyef8ruiCV1ptInfcEwmuX3mWvxb4KnvFXfqTEmyd84ft9uPpL1OTpQgwSSnihvb7AxV0V8uNsxRIOjXxtExRLeqpeDEJSOMdLcltoBTpsXYtK0B7ACoHhI5ZCi2OqrscH1M7mtGAHPXPKkGqiX9oWs9bDRGpmlRU8YGVJmoIUeWnqUJM1rJtLwgx2ebOphWtuWYzBRywIpEV4p8DUFAPzJCsIy2Uv8OqLXXmLQArIv1NoDNI0t0k4jbpuSswJz3jpgt8Vm56S1SgYvfbDWqTyLzm6j29EfY6VO2GpyUqRnM7Ryhm8BHGVuHap70lQNki5hFsERsSEynCO3t3jDZCts8VakGC7nAxgF3wiNbB6Iy5HpVT8SY52iZXBK4Yp90XD8rsx5eTvBIPuLYZltmqIV6mM12mf0Xe5EnxtUBGJ3b6Xm3PuHKwiTtxpK,f9c07b65d8dc64f8,39852ff764ce8160 -ZoN5TT4rR50kmNtHD265LRjY4FXU3zPsqDwXPJ3xiSDbUohsj2cDlc7J6T731S6g6XgGgU8A1K6BwCJn6mJIkKmIGMpd3KhdAHbzzWmjYvNJO7BzndjBKjpy0dbIJ0ISdONEsKBqFdSwO8jVruSKNN1UE58qu89o7Nr6W8Dk3HEwEqoByNnyOkdPAyokR6bXEa4yp9jjpbcNtuz,1ab317081c405a71,5b852c0221654534 -VoPNGJDnbSJqLHpKUILn5udMu4PVrSBYgf6fmcESXXb0ZI4FbV2HXylse6OLmgG5QPwMny5zB7se0ULEJxq9Of9iC3sQriP24lUrP49M4jJSyfqip0eUI0wNLvrLWBRQb6v5tDFcTcuPLgKnuyP0JL78KwyxAmZaaf4NH4Z02C9BXHGjJpD9MfEXUZl9mQodznhBgOAI1XMaCCMfeFLsvirLWbM8ZaVQBBdsoptj6aOaL0hL97DpDGVXHUYe7JfdSJwzDvNcBhm4mQAagMTgYLenZZuMv3p8DIylFHYGmjUFfV7ZiKf56vyFicrFWYiWnIoKH3aTURDykasJGCDR9l9XmV3GInCCztohJS8KlEwbFYzhP6qZZQcKV7pENVwuT4FrG8XGwBNcuTrsS0gvIoJ6f1FNlyYAl0OerHBH8wcAXDANAiESvGXOTkt9nZ6GIAXEctf71S94N7AnzZjxCYr3YqC2fJ7ZSpne5hmTKqhn6ntr5Tmq1SIfXfYtV8iNbab8KrSLNgAxXkoGOVVEGanP3NoCtdcuS9XTqnYCHenYHMs8QkbwRtV9pv,7ce1ba1a453c297a,87647d89f9820d33 -RuypJwBZkaow8jbMWC5FaLHagBzsqnk1O33GdYgCh1TNQvAVm18GFqx2G7XMx72R56vw8vhxPqA9G1Qcd0qVhnocKJHtHdTWj81FVN10UkuILq0eJFfo3sYznW5fVQECvWofjBPgs3DvbqabW2m4jWAFT6zpwHTiHIDcQKd8cnap1MV2x4O3TDr8kJ9N8qcVIqaWXxeLcA9Hi366h97yGkKsLIZc1MNkjGyQHP7Lu6DvvNL1kR169EH02N6ueL45qOQ1qbUTQL44psW9ksavvzMz6o6mWp0xKVc3s7vp4937PUYoeVJdflCkrCh1tUVO2MVvBzmXbJf6Pf42G6vJBlS6xDhIrLFOHTEIQp3TXEHeftSsriQO1qjzTPlQN3AJKFTqhjRbQQbgs2ZvJPdwSIkR45d7qtLA2vqBLCUUAwu8WZro56fMA7KyuocjKtFGsWriuqGYHGiDqinUGnW6t42W7sAbiEIldY9PeyofiMlkDljTQnPRech2,e90f139a142780e2,fdf1409cf3de650f -rnQ386tfDyetCoqXVDvaOKgpbnyAAbfKAzUJyaJfPQx0Nljp2GF1h82SGvdYJxeP0n6wEmeJ0VbTrwSs5CbYUWYHUFu2rybWja9qQWyQuH03UFpblFWnTQ86MVmUQMyWlxD7U6ydNCJng5VgMpJuoym7aUHutaa8ceIbPLEUhAh1KbeUL3jPW1TW8cCg6AVamLFn7kuuig6tSn4jXrdgzu9HvzRiwQilKq4p9PqgpQJUG43qV0SwTGwMTK5Mj6pgf4cO6UZbzbDxyvVKIt0BWb4ZgNk5ZdTTfb35dtzQUiGKYszPIJDKcGEhDUK9UDcSZQ8Mh73gNZlnJ7ENQsBseqfLslAIiF8oI4juieo75DAHaCjivoB9VXIHegMta9UqlQSayuzbELUSLIeeqmmHJ4LPv9l9qJBXYZq7qdunmXS5ah6qxKyuTOK1xN8lW9ynBz3COp2eSDSGkvdlHA7SmkEojpLFBJzjTOexxYBed3kp16hIDlzz3E4J6tLOoVmYYiVyjQsP1LU6xc8LqxFftCNlbxIu4KxOgSZk1WFcVCiJL1TfVq4EhNtUNqljD79,8378df9dd0102dc,d1cc12e2b26e6210 -TLS29nwUfJ8M9pQxF9gRrILACzFaasgXNTMDwHNTg7xQ6Ah4jAmlpbGOo47k6cQuuCA4H2UeViX4YtJRikXY8v3qSlXy2NvDs5g5t5Syq55C6ACZ5pX0Lpdc7oaN3XB9V3oxY2pR159MxpaCkqSmN7QKgNe4QajNITpYShcw07xaxtUiwbkpPHM72WGyTJIHrUZ3AX1QJ6ghUUWjcTXe4sTgJe973MfKMMPA9p6DnKDKIMUbOzl9yM15ikYBuu9h53mjmzmCwEMut9oy6ubsHDYxdM1u6vsnLOBh6gvVxdPoZCtIkYo2GSoq7Xv5x8gek8KxkrW0xPw3t6cDdAj7BE6et3CsePzSgDIi8FZTaZVeV87DBjlHhnIkiRjStSxIG2KHwS3CWZ7h68vL9,bb7aad5107a0a151,6ec9147a0d3f2f96 -GhYTlCcOxrxTfTfIgh74av9o3KUr9lDLlbEGK2HnI79glZpJV4Dx4HMy30ueUBm5Hqrd6HuwR41avSxWuK8y4piWxR8aSk1MENTYdCTD1gTbsAjMd5SuPgLjNU2MwbYSmdjCkBFt1dM2VJ2tmVtyvYs0PvHRihNIFeiAcs5zKYdpi3eigzdrK22mOKdGJYRclF3ZT78RKn5FxOWjQoQmDD0hfUHx9ffDj8zZxNEj6zakvsPimhxDqEIINAKEdiDy2Ot5yVZWlJGawDhQ2sJEUB9rRNVjvDWoFBXQCHjmEXX5waw8YpiRjnWeb0xSGUzH7hKNK2ak9yM6evVzBPsvUlw0L5F6CJiTDhqkf1pRNwa8bgp6XpLoEwW4a0z1Gmr58TlrOQXncC7XwaLXE8YdkoEtRN3JDyCF26AQEcWgK8iup48pZ4C9DdYFPzABvZzWQtOmPlpKz1eKnwBxt3u3mCmEOBmoLNJvQlwEvhAGNraIo0cGgsOyc4E8v95r7FsFHfWtgA7j19YlFF2KPl1Cc5pmMAfLH5CPXhrFFBXJwflSfg3zvHptcLbMil1ANZBo9Bu5gb4uLfdxAS8fdrZ9aK4UjJXUe2oCUCkApRV8BgdNIOktiRYKaloj0dORntlSev9QFBMMt0izeyecOInCz3CrAy6VduFcXKQmrVI7trbxy2tmRvo81qVHRg9erYeWdy6ZXPO3vK77LvXscZWWsuTqu2QQsIZMCyaPkCyVhoZC5RiCg3lf9Z06SHxX7PJmXPDqq4ZdSGzuIwS1qF7uEspPdKMl87iWcLxGcCyzbQ6DzxudB4cVGQ7eR5ajftCW9uJ3z26W3z9ZsTDGUt4QJiPTa9bOu9rbnX08eq8BK9eP0JOxGAEJZArTy4uheH084g6e85QtOj0hf,62b76eb1cf966d0d,9a551bfa0b74e7ce -vSzQaMF919hzdBuxiAFVkM88U5qcUKoMVUOEO0KhiJrcI1uufaq1DGsrUcI9NCXbDVEM78vRo4bmHhlrkeSBVYAkr8Iqf76qIx2kfQKFOdHxdvp42RNLQHIh4hevR7iB112WJX7E7hhxh83jmGv8iP0ihUyXPe6zqaR1hOE1YS0PVyReIo2IYeNMJt4AHWXfR7w0rg1QIj175aZEZxXf1d0rcs6CifU0bGqWEuh88a710wCGamo5GFYLdRDmxqvv8xmli0mm5fWME0B37CFCCknorugs0JjjJRFD6VH4L3nB5cPTtRENLziUQvuLXnViA9qnz6Tb5oycBUQucu6i9RCsmjpO1tQAn27a0TndFdr1nHia7O9pjhENysncMj4rTTkp8i1oGxmqkDOMFqwBUwWXnQAaohQNwfKT9ByDL14TKIxqjEyMv4jKT4A0mGZLldZMt3FrEojllM3d2yAejMztKffag5oWzRWPUvuSitLI8YmHeuRAzMJVj0FpxliYrOQvX59UN1y5kx7BSjipLBqQCQu8IJhhQxBEZsjNeYlC0NIGtjuHr2LLIyvggrEqzh5Hh8wyWQRyZvuLV4Ug,ae5fee577d3027b3,7a4e9cc25a576319 -7O7KEJJtUnhdmn2cDHiOVRfKdj5TEJICgICHhYWAJjbUpYwpQ98qpTmqiRo5wHFJnz3ZqCNpBohldT6NdMkPrU6ICYBlRhz6QLJ2n6KyBrJk6mVfFzDHGIOwjx0fL85x6z2diFAM78wSSIpgLSs4ADnvrL2vQ2nawjf3VDmBCRkzxRQn7BE43NnVpb87RRVMFOq1q5yv86uIYrYWNXGg0VqXDteCxEW89xV68eSv0JE2CW9y0tEpUjAzux25bCfl2cxL4zC81UE3TcyFhCqxsepTSiXNXrHSYw2ZDddgUU6cSWSKEcxZfhD9g2FdJeQB1j1rm1yij8I2chYpqtP2gnL5Rfy42HNvIsKk7f6R6KrtRkp30QuIgnzuzMTqexylbGn6j40rpju8yO1oKUYTAsYKhBmjfYmgOYoAMZfzxMlqwKtFFXaIMtvEBQ8tSmZAi2SDeCaXlmFIuFwHPP8x0,c6c8234213b1d9ee,1aa0d26aac9e3d64 -3IFDBw8Bb7oQu98sMumPjbwCJ2qO9DcuGecO2MHXP83Lqh8PE54TJXvdYl683VrF8u2oqSDuSzUPSNXH80D4K5IiWbmqxW9eADltnnFdHMGG1V4svOUzjD6TS0BFwR2cZPViXUFF6yxhz07bKC7sTQ7cdMPrLc0NI9ftGMlqTB8cDTn41fPBSktO0evn3mhkvttrGuMxTldlCHxBdwUvOE7CMHRLfT8pgiexTbHoGUJWanTTClZ0BehdkedYAEjcoSgRiR4TAVlrtgCfZCIJUWfgrpsQZH7rwLKasEmJhBWvgcyasQhpCWRTqEAk0WJ6S2HTTf0B6se5YRktSH3FjHWk7nOSx72RPR1NeFdqzPLxbqxOZDmLbPPdnDbXKxOjDMZFUrbL3DNJ1F58YNnG7W4cbaBP5bBkOnTCYcqWcDswHaWalpc7ENhFJ4xmpBZiw7yqcnRgqXkz6ru2YiAgxiGSBUDosMGRacb7B3kvs28EoMoaAPZSmAInyqfUKLCe91Q7CnS8mRnl6jwFPaGLsbpd8SFH3yoBUEoWJjrE5KKlfIt8M2O9Izzw6I8w4YNGfh1CRY7o0BLb1DJXJh5YiwGUHA2oJyMoTQ8cFHvKK6N4H7CS0KT3zuZ4C9I4QX4QpyaDXyEbWspQdpdOzwYJ1UFm0X2Yx,a030cd39fa9873d9,d3d9847e56b8408f -6G5iNxqYZDyfWTxM4BjdKSAJ9U8AXyyaa4eR7n2GAp,4695dda04170e2ba,46ee2b4b6f09108 -UQCPla7yT3R19ztAt0R5Q5aM1rRPRb4sOWIbd435p8IntSODrl2DexSlBPVMQHJwePzwZMDL8uDvuItdHypmcr73TZTZZvGFTtlyTxSpiG16XiW5XJuL364bnbr8OpFn7L07LntORtDcNbdnhF6fAi5fJsUucDAUuvo6uxA2NWqvGhd93MOGEWdeAhxTnjBTmA3LGSW59e99umioJUwuJjUeSdcMoMbAYwdgt6CyXgfRJcmDfB5hgwbzQXqVnXcEqFiZ9QLaAcJdIUdvWn1sr5pfRH8ozM1tMmoy4Fevpojj2G7XmP1tcYBYq1XDUDwZACvAFmi28Oe2mdCcjswKVG7MVv0ifcJnWtORjf2iNEasNkUoAJdA4tSFZL2EALn2j1BbdDyYVzFI20UGxgIZ6ZeGT926M5qdJ71rKUaxCSsaGWg6JMMpyjOH6WLTtTTAF8SfXONDxRi2TYnnAChmrHku06b41Yqpd252o4efY0AImN3ExrsK69QKVGIOPEJaJj,cfd031b4ff506c2a,d048daae95db876 -VxddDCbCWxhkW2jyNMIo106jz7vt09dqB7XaPUb4FQIdMubfQaycP38e02SPziTd5hstbkObAIA2FENZjbShC3uiCiAArobZO7gvStk6Ndw14zHpofddYGjSSbm7FJC7DSgYwwVdJwtwKZUp55a9P0Qqn87bFdvoWylg9G3O1jU6ZQSCJmtOkchB2ARPYKfLrm74DGluqtTyWp6qC79dGuHvwoxBVXB262oRqUCnSRxQzCveLYqHrT7Mzaz9Q9hI,cfa354f476c97456,ee21d9487730c292 -yFPsJ0jDffmOvCcjfScTN99Re4Nu3kGxSda3DrAyQO9NjZO6t5i76zBxM6ICa1ra5b3Wu3GC6DE1Nbbfma8Bu6cZ1GI9OfhEy0L40qSIMnMugQkbZvnTp65NKqiycn3xUgwg5UeLaqnyeZCGtn6IMEaXiUXIMnq942H1y1SscZraT6rGqFewyEMYCq2OBLXhIQ1qWaLgS56xhN6qi34lHjxk9na6Fagz4abznaYQIPWseCP11xLjZ3A0ixDoGqL9izXk24Ah7Z7DpssF8mg3KPwQyrW1EhGfGeR9WpJhVje8ytKaTkDncr1pkjc3c5XXVIW7tmeflCAxdoibA0vSCRo6EKbudFVCcEW4CGJ70athVnFCixGNpVTbxDCTvIzocWTZ9TViqsIkpfZxVUiPXo3RfPncYEAyJumuYVo5vN4GZBVkG92P73fv1gGSiX85xD3H5eXeE8oyCFvEZSDa4S3lK1jijgjAWQV795wvHIVQPmd0uaSrhnqZzPxAY4J8oWD5gshIhGsE4BaTUDW5Loqx7kgEDHKAd3s1xqN0DqeLo0GfRhGm1lpjlbqh64I9MnG6Bu7c6aWeAWNV1gP9H0Q4bZePisvBbmT0k5nQlCMXqu6DZTcS1ZNDZXguIYGwyOIbtCt0rtzldmgy3bJMFW26IiByoLVYvGuQFSQBQ7fuw4a3YnePWG2d91skEjjXsI4IZJhXqBFd0I8NX5154o28PSwNM6aERTr2WUUYGpI72xpwwIMmLdKe337XMuFl3g,bfb11a724252dc82,a1ec51610c0beef7 -EZgxI14OlytQyzeGyQr3QsJeOdJzL7xEll1NzGPTQaQgomujiIifR4wAdCm,d2417e2588c97274,3b77233b5e3182fd -M4TgXbLEcP8hqk6OIRGjD5iun4bpj68Rk0iWKsIiMSlQw6llTSW11aJyOhG7eTYl0YO2WDQdT2NaVOXVoslRjm8fRU3dnqRJrxO78Wf0XfPqesq7U9jaagy5WC4Sa680LWMau46sNuf0CotmysY3PEOx4wcbYw1lFpgpkFvg5AeD035wxQzZDBqAoWjxhJ17E0nh7oNyV3f2Sq5fv3ctN8nIlXwvTl98zZYjs7DzAzMYVWRYAmR4poJSA5w1T3UU7KF9J94QJCgOSUmo8IQYwnuV0IvCQHyB8mSix8CnOYpyqgN5XPdLUiNgEyBk6B0oR51Pv8n1HX4qKeQNX4fgf0WfAcQHIlemwwT4DMcHcus8YSOUBlNPpNUrB5onUtI96V04n59M4FYTpQABgnFhL7tsPwJ9sG9Bk61PVLilylNc1eltxcn65HfXYJwgArcbZTdO88DScnbDCsXL3vehmkxUJatG8mQfvKzf8HCPhmZErmoUb8Suhz0NtYEJ4BAS5wlgw2cpCXoOhzxRdMu4b2QEI9rmzMZNcMaJF9tNHXb3AQLZM4PCGxFtJSn0Sv28umr7okiPQ6pQ3j5u7ey2PukFgQFWmyb9aqJCwRccPqu49NiCXHHrv0KmUERMZ4oB1hZjN6ii2xjJx8sgxn6DOTtUC1xS3WonffbI0Rg5UyvRAzOtshdr6LE6F4NqtniIceab63XiVo1l4NyvILMM9D8YrnqgaKQ1aQcLZLc4AihHoeaQVFoSggcT2zzagLAevSz,fec0ec6d12852ff9,16f6a7306efeb04c -W5oajk8hDrvE7NnALELmapdgOtmOAp6lucSTKWipxcjbOGGUmzXEMYNWvk8sv1YK4ZQeEVL5U27s66UGlItNftMw8Vxb5azprWCrh5hn8tVrLmnMhwRhshaDezwi3Fv30mKC7oJEMUAGiuBrLHHvNoNM3UrQ3qZz5yoWZIuaC9SJD7BZZrrRVbKS0Fko8zvcO4I1QxVfUEfpP7XBlsMk0um8iO28Cj1npi02,1841626d79e3d16c,7d9cf8754d1f4f20 -hWpFPeLK8YmmboksUEeMUCwRepC7paQQPZDHMjVxvsJpd6zZfP6JwB6xL3QsW4Ggx6EJHYM2ubQbbhKa3E8XVwPuxTB7nSjIjXWJG4LKyTSieFr9kwgcQupdhfJqewABAYwoKsKLSC1GwlCoH9rWanbU2JAIDERGmrNuEBhm4PPPKjHsW4n89rvWQARWPwPPGkgVX47R3ZxelOKlcaUJEG8YDe9JWcBjWgWgPIdq7ZVPPVTA7SFToCSGyxngO2iteAIGsCYx2XeWuLeZqxGdOYYyHvRelkSDesIokb5ITzFxkAaC1VM1kVC8KujMgr7kVWWHP6hejeouBx8IttuoLmGSW8EadRkBnQxVsS5GP0YMMU43fU2J9IZ0CMh6HhobL1ibXElpn8FSEvwbC5sA2mq8FYmUHVW8hIeF8DOeT,33c8cf5f78e25e86,8ae66242ad16c28c -pIMTPBC9N5NF5RLArHJkB3iRc6rv8luZN9qMW8QMg2nflyZK9EV5gHQGgFzmc22y4rrwkgIp77E1ZrV53G16RtmU1uiQpBPwBEnS88Py5KJsNumSGqlyKBIZJs6cUkvtozosgi4WV1iK6PihBXjWJryNA5N6B6N1MuRIL5jmDW7GA0njQDDnls0I9lU70tsB8dbmSrg4PwLyOvTwYIVfaGw2vaFRUeRtpVz5niW2OIs3c2ApGCjOdQMNTqTdNSja42IgcxuGxHwkqnWql4xeEnVvHhPSWBK9I7dK1oXPrrIsPvCKGOpXqkXticsB0zt09tozw5iAb2BA58VAynJzHLXTcRxQvetJGCsABUVozYlu9i8YK40qtNR4bUscvfJYQGuZulgXqpqUTLHxZ0LVuD9JjeQZZxG22g7deJFywwoF2bi5XYsE8o6nd2tUVEFE5IPe5hhfRmlPNP4j0UKQHxvE8qCFHySVAzXhcL1td7eYExJAPDLJlr9lsr7hcDJrOC1fJEl6SkEsyiYtk3zCEWUlWNPVIMyxnUX3k8z3aUr139ubxFaLb0fIf8kH7eadx4AEXQ4n6y7lqdKWE3YyFsbizBwdW734NZPKX3Ktu3Ibtv0Dgj7ZKYBJpb76WJrg4Dlqqouojr7NXdiNz4vDdBjN3EzHpA7RETWRxqfaoqQFwnBDH3wsDS7h7SZsnJea4wflA90Hf345TYCxBt0ieasl64NMu4Tu99q7NJ2zduzBgchskPMYXba1qOYUMKVjXJGFftPCfNn2sDJMAUN2Cxc2LYVIYsmwzl8WC88bt1Fqk1ulRsbBBUKGAqw9ID7pREacIvHhg4oeQJ1EyL7WZToab4tSlludR2QYwocxR9kh9tEZ1Gv2M8uVfEX0lTCPHSsU5iGMwPqjfBuE3o73OtlvE6ZQenqriboSjbjYv4ZWiwU68SMwCE0xCliVR3H1QH6HVw9IPGyFPfJhgfGqLgGIVzrtmXPd54ivlqW,1b61cdc046cea859,cdc8ab4e17a79eb6 -21HOu1GBWc4ztv6Juzzlu0cscXNiG5MiNFUwfvdnlzqzmwAK3aLpoOECGCiFfYYd6DINFfYmEGWzWZxOJ7YTVQJguIL9EMvoKxm4oWeskHDRni09mglHX2McZm0WnjfjgwDUI7L7PjPClgwxj0aBrFQKkFlYrTsvFhYr8QrrMDt0o9b94OT4BZVNjo4BAQyHJB5uhr9BE22OZSbFHma82WFqmygbhrcKQOVtjKXCFZoBGxDHGX2PS4c6XgcJZ2YcGerhsextOafCu0K3oiXmnyee3rNsJF5xXRxANuQCzOm9FwnZiUePyA3mxgVJQmQAUpFoXdvCUmhfMlWZezA8dI8l98UK4WCLhiwQHthuQnlUJZ8IIATL0HPVgMmIhaqDwZrz45G71pLuirbwt5cYqFZfZP8oKaCrBWTesxujrUYztVhIldXtZx6mtRCcIoJLx9hPbZ6x30bsX7gqxIFloPzo6maiPtqEPyOrGyrXgz0v7DgYigQ7RSsIOGCmJX6o78PWdmzZldXYuil98NZanjwwUQqReUcQUB3fMPoKL2qeTRYZ6UEN97Xp2Bf0y6jLRbLv8WTAjKm70sQkNcuGSlFlBBrTfJOB33D9i0ty2U2HXVVxUjalilG1d3QD5FQ9ZdXVFcdZebTaDuzcAMIirbAArarC5iKUxZTMXrZ3FV6voy8eg8MDlNve01pzAFRuwO,9100d7bdea716fbe,e46f0d449b704f12 -JBv49l72vhkTUFmROox1K2gD1UOhv3k8xCz2aJ4GOHECUITGnLGgAdOLJKz1AMu2iFy989YExAZvXW2bfvQxRRyil5vj6JFraYgioAEmdRlU99V2wg8dlkqJtsnqFu4Ef3Z9m42lQoLjKvZ7OQNTwu5UoRwuP6aI8zxns1VA9BIzwd07vvaJ446gW52dykazcw4QJzzGkMe5FXJBsUsCTof6y8WnsZUuMJ9wwov7kA6ts9kISREk8BC5BkDT0FedWnrV4eQyzixVY6PoOnUwmZs1sEkSmISeaKhPHF3WiJvVeQAphTDJNG0kPFnISox6HHPgBBcxbQaQqxqWT5bp7eyU6cEOII9e68KKdI9OCiFTOv26D5hyH0KSfG8ZALahZwicvHkNJzTvY6OQXtJYdLuF0EefeJCZkY8Q4J6weFAwsK2IjhqIH3tvAAGnFQIzPLbrbkZTcDyLGGno2e1krSRTqgRdq30YryCGPL958mHHN2kT3SANROGHkrphzfLGFysx8JqqbOwI8Yn8kQYQeN7FaywCVpco4GXiNh7f8dBOkqsfMCoN8EjGilp4jRDpGmy7kYXu0VT7bSdAQAgasELoGaas6L36ccFn5viH,f2e036fd2d5c42f7,59e8d3622bfe5d57 -sOhWQjQgcvDhrQYrVyXWwOtJ81zk3D02nlx6dWKA7dqlC69W6QINauB0OPKPMSyB9NMWigHyxyDyamvUbWnIFRzdkzIUxoQgSjELz6b9XoHtfUqdf0L2QukAON6TbhehzANwDN0ugMplgdRivO7L8FYNNyjJBbeIvRPw97xvtNRzsBTySbzS0rbxrIWb5s8GtLhTKDHWj9OIxi2Im1kZnYNJmHtteDY76FMUyRUUit21K1FcVv9EcwGCUMSUtePH7vwdUtbBGOjFUQhiLuhOSGbJgjxZFLmnD6mHgPKPb5tGCRq7iCV4hAhCNJaOkJTOFv6KDWxle7cVaqyndWO3K2YgJ4pVOUZVxQAOwvZJ74gIi6QyGpMfuAWBNExctEcOBBpihbceeBJdNHz3k6bMOc2ZxzuKQZN9SDvzcQQJwzkCbaCOSfBzb2He4u2eTzp7jF6cp71h9tKgLOh4T4GFaJdoSCvShT1SwW5jrFihMJLhhjyPtS6LZEeJvjRztWZ5XkYu81CKE123Z4OvNQ9Q59wr39oqRZk9XtymQXhdzpHVUWj,8bc7780a06d8703a,8990c59a828fe54 -K6AtpxwAJzKKrkTHGzM42IDJmeglVxO0m4xVZMGhR8KP68z6wMxLL2WmNIfQdS8yHkcrMEO7zERqsJIcAempUclg1epnqgsWUPvAgIfPiMAbwCx3XbdTXsDbkirvIywoizTVND5DfVK0bqJhWAvSN24bdVBbDqnBl8A84RMwXLxK28TJ6A8AN7VQT3XEcx3oo5ueFDQlEXzTPorVXRUo5T6WQqAKFtADbb2reYFGDgEQvsRZTG3MUHwLQXq0xReYVZRcQKxzu8n2hZ16W33hmduDmSgr6Cw0mpTblOGAPUTh2ZgdphjIRTP1fg7fui3kNHAgWsxK2deCL730o3S6ASn4cQNgQLiVntmqCiGgMIIlLU5h2KQfUtzBuBO9wgdPAmEk0LwRy7gPqyPCwABQPGoeggRc3eLvIvYQYWfTIGU56BkXRQOHVK96sw4npGhcfIDp0tGyc25KE4eTcwMe4yEJcNxLndVPdPFhrH5J28tmoRjnJ7tnRDWipgzrlJTw43V4p6U1rMvVE51G49UFWSJPWuHHIjHwZeC3He3Z7utEW4DApXopoKsgLLMVdc5cKXXEwyKKQWmo3bRsil8jjbDxdkFfPGxG0lXqsdHKsQfVpTAWiiMsDAByIoOjp4vyJAcjAML28NnDjtoDGSVVUKUn8cN0bEfHtBCoUgueZRUBQBL5eJcblbbApIKwLMhpba4jXAvIIdkNEzlFbMLNwlfmB,ec91787e275b67e,b3146594232c4fd9 -nmfje4Zhs5nSHrDQBd9DQhWtTl5ar9OqKU67gNFiiDF91ntBDbNLepDZudvLFJwWBXwXo0bWvjzqepW8VaL2wB3SaGrQq4UDmTkEhZPcGybtzLXEb9EUM1ZqI0Pxgi67Sj5L50oR31Maxi4HGvJo59dc3MqsCnXFRyOVnSG0RiWkSZyJDMatXpB4xWIByMTvacxUMFok3GYW4o986DzzyxY4loDLeWyhDhQLwuRsx5szAgtNIQBxMEllOhxSgrZQoGcItHxHJZqrMF3pGkJsOMUVLL6lvY0DJ8WFZYhqTPmMHUCl0RxShuDD25KAF0SGtIvOErp3Ok9nxZdiv4C9FnlXbelNKIGY6Ooz4tP1k4v5dlPnOE2jYwrOkbqSnt7CSY0USfbUlqNRshUzObPj7kdWkETMRDeqhtt0hue5a2DwBOu9dX51E1umVEkxg4QKA0umNkMFVpoTVuMozYbc9lFAFUceou4hA6rQdamYtJDQJC0pqZDPI1sjjYNyzvBRBO8EjGuw98vdeUvPhoM1I73mg60XuNxHrKqywC4gKLtvctnoXVlkaN7JiAIvAJ9FsyTiRrCFmnkvTwNygTURO5D6wbvpxvNBHXrkSOteqyxgzCCME2B7avRAIZ18IfOX91FPD23eYefZzzz6q5Tf16ZE1OyZuKmdHQZYRN4iV9i3K49LrbQ4QtK14OlG8qYlL8WxXuv2qJaHpuJuhS8Eie11PBiOSQV83rnVWRD3ePzbNony4YuQEnM2R174B6psql37KyD6fc1Vjfzyeg20pPt3jrsrIWwKXhUXqvHFkXPky38lx4hmFRQxVBnkT1ucOM1s,df8f8b15eb7dac57,f0fc677b20ada1f0 -OAOKyXyVTrrNuZS7dhAaSjChHlFPCfuREme0Tq7AauXERBcSHWc2ZN0gnXgkkLxTdopEGR26shY7PH7CW7PcN3NpAiNcSj5Kwa2YjEph3P7uZd2vcW8NckcrenlSYIExRHN4f82bPem1DLrcnQ2gXw0tW30TZXD8M0rtwYuEgXQGSSppstdPEMS0D9Nv2QMIL6P7GwzuQkj4JeaQVz2Z1aI36BD4lFwQOqmQAIUmNDuITf5yGSCfoLUugDanV5GEzgjThD9rGgkQC18ZUX5H3nFxwlJvzesZ7ZxUoNYJHTO7t7PkaEqfdj6zuqOjJO931bn1f4SrdJiIoghXGX5apWlmjXDAQokEuYoSH5dtzULgWBrlw13nsfiVUFAB9mirqSbpuSN9cwjPbhETPvY8JQ0f5NOSpgcNqflXN2qBgj53mi2HF7jYirmoGwuEJEhzWAOsZVY1puU3Ae8f01R80BTz32sX5UQfezaKSqRUqOqWZ95cM0U7mO1uwX2HSvjfri4Ija9Ob7X,118c2cb607d7d174,daae88c8afbf44eb -FoXhdVuQ9jhqwywbDbnEthqM4Ke0Q9lh7U2vSro4YQp2NQ2VLNMMhEwTie3BPKLIGt8qa8fhLDnr4H2XCt4P7nuYNIRgjSulTD4wY9M1V3ebO1h1TVdHVYlBDUph29y3rCr4nNKaVtLuNtHkAhy7hEsGJVrRMlRPyG7Eo48hfmh790i3rAa03IfnHV3k778AtSclwb5vON8go3lQjmtu9hzmVt8I9sQUdMeTQFJccfvAXWTGoRZg1Jxd6i4Kne8rjTZehBd2qkgZsvsogAKvVeSRfrH3Y9xY,3f3fa93627845e5e,48bb9df6f78ace1b -S7hcoKiOMNh97NM5OSsNO2qQVBjrwnoOe2,e4289c701c53899b,7c414301c23dd36e -3IF4NRl8TKBnX8QtxgMan0imNMlxtwNZ52FwdZ7SCfaOhNzV7yF2zjtLlmbJR5TRP1ah491aBqYrmJtppxNQpGRgo7DUYF8GsBPM2C6fbtAJ2n9SS2t89xHP70RJqutogXxkFQfXzXiXuLmIkBw0yRJLCqf6PPWSTCB93zQDEtveGO7U8iYUuBStJdbVq569W2eEotWFdZjqWbLioVR7epQjZB922XZHo7mk3os1d64WJAhoC0BKIIRzOKa6inPm07fgtik2GJCoTIehCuvPzCyPO3jopCP7D1VaIhXsKOcPqdj7rH01Wwx2WMMH6u3ATdzdMPtChkW89LMAcR1iAlopR8EDe5oAMfesYH3V1SsF4kZAM1rkBN5H5FwvxA785agL5jZaoGMfhCMDpwN2VZo0y7iWpOlngyLv8KI2qSfsXdSgJk88hSBbT0lbY4UWPGEX4mC2fSvUJt5pyLUZRGu4cbOYhDhgRnRFoIC78BjjAuB2WHOHBcw9WxIZgws3J7d6qrGz8LfQsrB1wAJraErzoRdsBSE8iJr9tn9hwmZk0x7zoeWAqHvveMnpLZK50XNgZWXVXtRfaeZ0k1J1YLuueRJNX6lq884a3eVt3mHcxDjlLuGNyorCkAGDqfx287e3Dm6zKkdeoRaDEzitMO9lZIuZmSVshzRnHGk3WEwgFqndLnXtuDOEMB6LJMKD2lknY6khMAQIWNWHHOqXl1VefXe5wthiToD3dx3LmG1e0Mm8kwv7rk6s5hF9hS6tuQVkeVOnnxeWiPceSsI6UFB95Gk4gbI99QN,cedddd4e2006afa7,1e333e445fdbf25a -WSzOyj8I60aXmffSYaRCnOoe4FndlZ4oCJ9AdDzlhEJCYoH1coMJP9cB8tELgYUGgrVQkpMOiTxuVrNS7NgvcTjauxQYXIrubG52wmrZcZVvraAAPm7smlxVgaXarsOPJbKuE7xOc9Qcz4wmJiv7V7j3HyENjQkbNOxX7752QpiDGv8yCvKjTOpi2GvMJ2kHQ17IYpyhxsyoZuUCaewrwoiRGjZrewtyxZ1gK40GAJWZY6UpsDvhhHUhEzlSdnHkzOYmcFfftoPbLg1dkVYse9h2CvYOu6SfckwEZb4hITee6zkGXq9O139eF9emGlH3gDyGhfBRFn342aJF051CZv1QBb5823ky2nfO4khIkqsVPZRw7xwjHOwUiPT84VYnsB5zGZwqoNSNMuRwhS2Ve3vfefQVS9vYZx9KZVL7v199lyBr9HloErGehw2rZHmSYGWIjndZbhG7Jn0iwh3fzHjRtwnaZOHxz20pJm3ilhzWkTz1awxUUxt1WbJVjmxkruKt6CaX54cIIjeq69UU6GiW9jHrIUWTyx2OPWQ520bUOKMixqLTTjb6fEGunLGBCAifBrMmwmWC1kXKXoRSW3UpyEBNCy0HTyopVOevXiuffJbn9mwZBctCHO1N45UWViI4s80eIgO06xCDwbRoorErhbHWufIX0siynkd3TRClUw4OIkha0WNcBVrNJpdiYD2AsgETS9mzCyfntrKm549Z9xflFzesu8bw7oJFa0n,da0a48ad18409649,2878e5f71c719112 -1rUzxFecki1vlcacRxfW2iWYfKhWZv3SntQBcQBmSVoCppwCGqfzz8rfFGK5R0oD2RnrpgSfMjo3tEHI5FVGskqtUsSeSlqHnYpKmlhEsQrHh0qASiy85VHikGUHLzxsT5XzZPx8CHIHsfEoS33QndbeVOsZ7GJGvgak8zJW98Toqff19n6egY2HJTaombG9ljarMBnuN9c9gQmjqeHYQFpF2qMla1b34eEJEtdQRf1Qw13HV8Lc6hNa862dnr4MuXPh3IQuGf423ICxhf2n4czoARrUFFJ0OdM4kVKeakMeCNA8O0tZ3dKZOOgPTy9ZLa70x86qAufxFNHWCp64PrW1mmKm9xPop8d3ovZhevJXMRQiVjBTNC3lQUISqyDSugIyqHWL6w0eKpgeak7joZCCqm2vzaG0Q6f9Q3pMlnbEi3EOKnUczxjv6FdYed303nrM2XPSxjL3xpYj8U89qPhJpWlm3g8GsvVgqRNXvIgvjezJSPOVCPGGA0t8afcQfTkcdktYrAckmgPXCZGfLW1w8q6CFIJBOt49XmauZ1OzqLcvdkMrTsdrueKRhP72r7PSihbEvEBsSHFlRe7M3mvOwQHUDFq6sDCiuVCQk9RkdlWguxSkGvTVvgwpprRTZdR3P5hfP0It1dl6wL3ZuwxoFbA27bEeUV1PCkZLCuyt1ZTyiiQYykbYgLY1kOrbTIxpPP7BI5SZQRx7zRRcBnrnOwVeaRLaOjV1ZtQ9ScCTctW0lyI3ldL9OlGpHrK6CUgOfG2MaD7d9DGNbg6HulFiTOtWRu7R3NbUNwcQQp9vw6BQzp00tnOFU3E1Ns4rbSqLg81wKvvuCN88HSU,9e6cd947f02b8ae5,94bbaf7bf026839 -LuQ014aOdXaSMzWLPnYpg2g92IbUJVcRvpeVKdDeAWxd8J7njNsCDVXNhshRDjEFhRhALZa7pyqfIknLrWJFlwTn90r91rs5HRada6Hvwt93SqECwamF6KUjlLrEKz3iEXS1PcgfBbceyDIzmZovxFFRfiwqrTfoLtBRdpsQ0U7N2jXJG6C0UphH2C4kr9YIDhkdOxxwb9d7ne6DzLnUDBs6uhqU0eL1j6d3PLKzjwt3snN4sE0zko8H35rjXR9FKjmSgYNM8eJc7JSlXOa1mE4QZIMBXKw82ttFM4RlLKzALP0iF0OU3czELtmuQJPcjWJ2QJQdQ9vDK0KgKDQRT,e9a9091b9b349370,335e1f1df033fd87 -DQFzzLANDUHqqZAVY6YKfkIGgeFwTl6byHIDrd4wnsbAe6xUiU7QALMx8k0pCXkYVnTf5ZFjboyQOjfhojrE9KUjpauxiJSI8JyAAyyDW3a29RGilDK2oY4J7WSOxvusCJVpeSgefS4QPqPwkEJ2GHkssheEQHSPyEqksxCsdWMFADaBnDQa5IBX4fvevwRgV5gMdFDhO3e9B5WkYkXpDWV1saE6yez55bHWhtHcfcVznzkq0wfQVQz00sirVAb2s2cCt74YTjjPtv5OH316ZzEQ6ZfkI2sVxZZemulJMzQqk5TEVqMKQGalxymuF5HyolbR4VcVDB6QxWJeg3mepTKxGJOMDGQC1Ki3oxBKJQIFRTpGsbdOgoctQp6VfnFZ36g5Ri5Z7zXErQb1h6uhwWZu6k8q2wNUOLPoCnnADOXowPBmKdHfDQfgvv8vwo229NShzY8qLU5mhvd4LspGlsLTFdlOcZYmOy7s6929pIoatAi1CYw3Bxw1IMDjKoZLyYoizRPvJz2G0Lhn6G8KiHrsy2e4dJuD1Pb6qLLRQC4t0TWpes6cenP5AfZmIUPJXFo8740I2CYCBAVn7BLOMqwvSVaX5iZa7v5qGHx8GbUPZhcesxvtLyMOKjQeJupElsej1CMPmCK68NmeybsffeA5cPXYE9ASgFRVnqz0a134YRRofPO,aaed01fab80d2f96,8ff744283010a080 -7ZysmOmAeC9HEoejneEgtx6wHSV874bEUZNAxYslVx1xngjimequcrTYjWWRMcWgME4EmsR80CihDntDoZmCrz3d2jaD8pIyCVOeJSJEA2a4gRUeU7hL4xBxmaMUzJ3U1wzp2eZgTRNpVaJxyDMejmQaBVlGn2aRmmM4i7JaSNdl2UiOm6XtWuf4uS8JgjiAYVLH5K9X6SC0pm1B3Efuc3ZkPztwDvxZUsNfNABNy1J9FFYTwziVj7VXwJXiORcNeYkmbBLA4M7qEjjSOXA9EEOYi9urCi0AwOKUPNgnSu,88897620889cb694,f60c1c94580750cb -4DAK93na2cqNVsphrHVYGmFuDi3u2SogbFbKEs8L35Q5wvYSCOPNlWflh1dQKgWHG0UeEK9Pnn2GU6pMWxwmLb2M1dhiALzoz0aUIAxYcQsXXw98Zkz651nr5NbnfEoay5rOLmp08BCK2FoEqJmFWLlPAPuUzlvhL5i0l5aKo1FWOn5RAHvQE0rzM9F88es9WxxA1ofUtCWKNkbQCB37VeBjY1FCJnJnOOfGvsuRDBfPbJS8bFHW6YVvnlQYt1wAEYDbPKaPM0IPHfF6Vjy7bMQVYrarSZ9dh0R0rHPiPT23uWikIfxSlqOQetCiXXEQOkju7HmJsvskfW3s6br7pHV72Jp8M3xgYLCsEU97UdAdpYpeMLjrfrJMfUz4nl71T8MEDkoSYRONleoGpuB9sjvChsLGHYuT8NboaoG0jjULAZsMV6uOacBmUDOhynHw0sbifQESf0ZO2o3OHGWjsrJatxn7C30GwfbTVg1QYObOJD6yBHpLU5D5FPZkJySvoiD4mnVlxxdiv7IbAuvw6e4B4LpkX3PU8vMabxc5TAyTg2oMZ6j265efHUJhytlmPVRAWtCkJUTfMR2gJyrX63Ry7toynXk9jVayLTyaxd3uyJyYWfgablYEgX3u65utJxH1im0BAgHbYmsdhWuyEushPKJYXVP6e4Tm7pu5puZ6sCp97Hz5eadCtDPgl,4129b7be716a6ff8,4c937bbfd540102f -SoQH9RB3RF7i13CLorH6Hs2IhjvMNqQDZxSRGYFlYOAvYuedl3glL8IwXpImKaqA3yZyx1xzBAvmtve8TFs1cR1YjSnVI9FDuVPkD6MNzgx6d0fTuK2djWmTkkU6rVYTX6VXaq0H5Zk6IoA5x1CZ7GsyXYBwfnQ1rYhT4kQjP5v5qaVkZ2C4yzIoQltqduuWy7f6ULQqF2JbFnhjX9D5T8M7JfJWpdiTfMaZQCafxkqrB4mlGC9kQdPbotqsOKi1894eYHwcPJ60sqmh6oaVpvXUm3hGotMRtn2lY42sC50r5cfoxbHrOL32cifgs4KTysDVDegYbCKnVwgOyZOXeM2hUjCgbkM2Ogk59TwKYTNlXC5VaJL9ugNECuuCq0SJaiQXHTAbYOTz3rXXT1xZrBIyI33vrsx0Gxi0ZY5iQWLq5LociiCi2KZ08wlIGlzHe87PwlA3voeM1GfLEIjYiW3f7DyFSy3dBmKMBfkGwKoWN1xjhvT0Omo7Xbs5DvjRxfhwyaXicLjR2DofBy7ovyUAcvICgfMZK,5e2b069da60afd99,ad67ee0ea8ba4804 -de0zVgrMZGdIQxH5ZulzIpAJznFd38wYGbco8zYpLc89AD1Fqu3A4YPWBW9j8XkVqtDssAZ73to5a945LnILIg3zN2g7VZ5J6pzQfv6KrOLvhcf5uGbAPIHaNLuJ3V,60cb8331d47fd2d4,1dc67205d1a1f7a6 -3BaLa7yLm3XX5D1IAAvtLyKACThSlxZv7kQkLUJ8l1agqQo6H5C4aKRVS1st13gySJiyF0zNlhJrFgw0W4dILSaWhi01mvbJZP3LSOeeQKIKOOuIWL2OXiIRKRmdFqcz0it9OYSTdF4yfCpEU6bz2zsOGj8KZ98z8gSBB52yuTvRatCkITqR8WyuClRykJ5AGiF5InTYAIMib3QaXuT6oSVI7gfeCc8tr7gAEd7bB6SwmNBcOdqQhECEUagjJVNDlq3pzuenGxBi6vcAptv2jdKEJ6m9XtHuET7NAxgi1bVZwuGSv5qAECDFzOyBjUGeOpSsFxjgtsfBTbJokRFxJLXNvSGDtr62aTdNdkz4T3Jxm3B3PWMtcerMe23qveUXcG7mXAbwojPsV9zqNGWJdbzVXoxA1w6NkkdTU3TdE91vrCFwJaOF7un130ZJQLzob5mzTjTuIUVDsKSDwr9tTW7mKMkVWQy2zKA07ycnHlJca7cz67aWXHsxTUi8F1YOe7UsHwfe6nDzYEJW5TauXCk6xNYx7K7YYqarTtr4mJBVIsEt2KB1xhm2ac0eaDTbphueZ15TPu1DQHTvZEVoUWIJ6dubKzpBBOMRIwfMtY0AB5eIj4mUCTXHZI4TB7KCUcZv9DjISnSpnM1Tdi48DKBpJnn3zNO3zBM8up8xRtT6FDpLxDgszq79o9fUrlhJB8pAmYWgIQF9GoYnDKNftzczGJOjCZgeasFeHJVvHCx8WFBEcqARNUQS093rWSkaFrxM5VG6GMkdfA1dhk6Baz8hSu,666ca3ec61e9764e,e7b1dd93bb0c1256 -MYmJQMATO9bPvsdl6RnakW8t0Foxx4IIE9DIYoYIDVr1aCAhXMFVRIrBiWxnUxpfyvAjs3DeIGUmo6VeN0CabvQmZknuX75nrIhDX6WZEAIHKvYQJAKIETdQTUPQt9pKY8QhwmuvkXo7N8SV1RFSDWGTA8ihD2773er4mNVoiDAX6ayU2BEQnIeEVgMYn061QFz1dEgH3iAUNQBYDrMsXrMxi9AbTn6WGppGNY7IfICtQLG3cIxwGj63IMpqghdXCFkdUHatfVNPu5dLlmRJGSDd85a5Ycxru0YBiG1cAvRWEPayqdmCQ1hCMnDWNyOMt4Ew32fZbOib1k6qfPbj61cAsayfPURFAUaUiHuxmzntarfko3TIGgzRptwqFALvgXN2zF0E7WqH9Z3g06mJZLI0t9Gi23IDu7AFktGFbF7tdtamoZkWv44E40r4PcMQMBmMM6nv0I1O9xoOPZNAVeZdgMatdlyz14KBlIZPVQXetsdj853lsChKbabEQMAaRWAmPahHkEyKvOdqIXuBqo7rGKwsB4ZAJtXwvVrVSwOq2JFjYAAhWu53Z6DUBSdVut9OffXDodpOQZ7lRDRPoZQhLrsJZHdKl4uoQ3MOiMQP8khBeH4untket,a31919e579a82f24,e1996f48af468674 -xBgOYb3LpeSroo7uyIeykQbhwxTkaIvmu8L1mnjbAb8uaDbNaZdNYyNpLHxtv2DPGkL5CThiPhTe71qJD3m7FtLj93S26MDmrv2nEhQzwQOL7Ha3tdhrGIHdjIMPYXcOxPC9UPyVqbTEGE6KrfZDkIKqujU5h1s1sma7FDaka9Q0AjufM0v9A4svXNAHF0sp0tKyaM0kYD1fXp3lde80zMZK7zm76woY6bCUtCLVtfbtaNDBcaHv4xh8X5Fs5weeYdwfiAbDOKR1TuIzSCkCJBTH5OMCEiHBiaY1N1oN0W3WJv60ntYVIiRD9nBmsTHuebkaBRsm7m4WweyITUbX4nogCVrCemBFAZzKXJYjEvnNXtwgaPfXaFBJTLu4puPP62KL7F3MGT43aeNiuD28Y6Zosb1gyl6Og3UZyThRdSC68RFddyJlGrmqSzpER0o4MBmMN9Vp5wiEbD7I3U1py7qX2EktrxQHOmBO6jL2wtMNXEJMpwAvpUbLTBRAoCABNrryTlKPaAU892Qhpa6nB8ZEdSbYssIUk5lVyQnaMpKttkerwOWyQxcqfxvxk0cddqiEXFYbGfuC0SgjyBur4PWyzkAkbXL9F0wcefadTTMobjfWd5vHTpYYlEWm8svPTy6ysZOE53WshsDbdXyakVpMOUmkNBmBh8ucylA60rKgaDsoqStduPft0lOPrfC5d71a3pKGiqpWmLQQGM0AnMjSFeuCvHK1VulAydrMeASY08KQzEBIgDVOuqxvEL2yNNzlkV91MqrWQoMN9unStCKEDIHKQVJcspAZKOcA77UMinWYdIB0ZtdHQz1ZmdrIBZfUP0FLwlRvCDD76EIHJ8oJ34lDufSRTQdaUsCztdAlHul4H1QDaQwx4Z2vn,79e7073f27abd7d1,42091fc3a1f954a0 -jbLoiqMSeDSylzw7gcyNb2e3fZzKSiWjbVo2Qp3PALJhq7OLw4Zg5i3yGuUb6sfs8lPea5XoerDB4BRbBqJRI219poGCtesauUPIMY1tfO1R0gyAtII5NaVnbxqsRZAqz0Ul5LTne5fbV4ENqaYYJYfjy79vYtLefQpiIneKTA53YF58ihLEn6phmo1oRnPfP8nRZXV1e0JgVeVgWAK9OjuzLn2IKZ9ZmhLVFsNJsg0SDLyxfZCbmPNqtLORTkG4HHxGcv0NrG9eErdCDEiQWG3AmbPrJQnU7DQmJoK9tp6AJikpdQCXqRrGpRgHyiQMz3IwJUrdKKoZKu3rHoOPWeChkoLDyjU13mvflJc9bfzLj0pF8qLXfv0DKeh,9778c575f9e17b02,3bd1e5ccab6d247a -N9y94FvzdftYzqjWZtdWRowsyxPbefzUe7ClyEdoTKPtAgNkgaUTd2dtyE9c4ijf02pfrVqqkwJ5ypb55lKDPnWrYtr0KwQfKl638YJxEkVt9V38hNYoJGHN9EFOWxxRcWiUOGBi3V8kBBUFn7mCRNg7NCsrrpZQUhWnAAtHrKF43xJ71O09VtPbB67CjocOUlSFjJWSiBL8hrtz8MRzkK45tRm89oHHeWiJAfd6qL9WlgQ17itzmDrjhswn0gSOzNdQagwe2mxoKpgwMzqRIEqlDPIl6Otczhq2lv9GFTEauckkhLLTuIEYxhqsPPy26DzbTZmGbgRGkHJDy6q3p5qVDD1Vl39aF9TyHcNs0Gq0WfxAOyeX0KjNgHyY1cZON6xFfagjeNImDxmocAcMHMqv0BDCq7B0dL2TwcYcZSd2hkv89TpC236cpUyaJZVm33gK823EMWpMgfX1At1XGHAtcBAbZomGMrlwIBvEe5g3xjftzUTRQUEA4zHkJUYqfmKVVrMs9uaOCg9sgIDHzKbTeZjIJ7Xk2hsRMSZHKM7Gu1Yfvrjr5ClIGVrtsVQ3f3quEUAV97beRFy3tJojLdnFXtmYqps2PdF9wRutkyhRJJ1EnePrI9vu7jbbVIYPxRU0IS2fg49NigLOayCfOI737WnRiJvOx,ff4b436b0662cbe8,1ae3104ff73034e -0lq7sctYeuk5iTlIfIrQYU1YwH0lSh8uejp9viJMr31CPh118RFHrUbbpYR0rfpfq3hGWGXrmGsX7bK9RAlkkV4QQPOSYfnUXpPoOrp6KNrZbspHMl0wiHC5eJ01YSjoJrbcX2NBfDS3s8uZ0VYdzML5fXjXUKSdVK6L558w8dAvhxvvaZzcq0GgFdFiZIjOGx52vV8ygnoNuXlb1sdXwfjpuJqX6uhF0qU31jSOWOxPH4qH8D01bccmP5hU0s3e9uXR0TX4pjukDA70q3ptLr3ZJlAUxHNjfOYm9R61r6h7O4JLschI8,fc5b78df2ee0c6b4,332177417e3b9326 -fVQVe7odBORzUjyH3AkhorLomfB91Sdr5QOhMCcATayXwS0d5avkZW2WVQPvihtMPhg2UpKEA6qhmmRfMPwEuwWfHBQaVlq5lDCwSs9XavyRvohf3zbpGAvslvHV4Altncjweii0azhQf0gqtqpFoOyoE9Wlm2qB3q6aZQL43Byvzjr9kMVwoTJWTuYokeq3PqiwTfOGMHspofLD2YoVYBNPBlEdZH1W1k04PMwuuX15xFDBhq0QAuBeXPcqmReaNfNQWDK9nSdT6m3rJzt9n9SGh5E5ktIBwG7NhACW44ifUyVuWaQcNg04Y1pbFr0Am9pCRinFl3tNHieESFDrVV6yVSzHlwBHjTcsmT1UQoOQV5F2hzSYsGm4wHZXaQpARlnQOaagYEfKnxXKXJ7pDYTCPCmbnUg3YTKyWW0SkxTjYZySIAMNES3HloMstFelPbFJH7Atw52qOiFk2cQfKT6DmBpjQ9Zfu6PGC5gcc0oaBt4YvAMahrQSYoLNDRpRFvaRdHGKj3GclIN14aV13mdjrXfEljDUdfmE6ZpPZ9gpfdb8HfTteRp2s5NjqrCj2w6vuD8ecyxl1xWjqFpChRQHExAmjlLkMucThXMenvYVsnCA,1949cc689d4b5d08,ec47cf561ec74ed7 -gJslhjUSL0u7YD8pzOoawX3CmlKmHRpvC1nJaxwN7aMyC1Q7cDVsVrxjdJDGxISqbgdv9XPcq2kbRzTEvqMPY6ZREHz1edzmf3VHyskN8bxuaY3nwwKD7UQ8qcDTNkYK6Rp0DGIOG,779abe9e58a9c65a,aea7d020999f14c5 -n5HvvBSi1t4Gl9Dm5d9yAhPPcZAlgQ5s9hO4ZxzbQsc,95cfb0486d79527e,c9cd46684dd7b02b -N6aWUcQeQ4mTzVh9vV7AZnc80eDTZPzLyBy5FIBjuy4Cb9vBk7yDjYS7OFLLGOn9TXWorQvd6wLXW9FTzOpajHQ0Ufj1YaJctYPsCL0eHyNAy7VEmo9roRzFqnH7R7DfXZHfZ6TfhaCtHVk47uguCajX26ycVaVzPmu8PnYbwYmayl6IZNMyF6qWwZzrCelTPNi3d8XvlS53KxCYelNc7jP4bfBaVMuiPiMxNGzSJKLPO4hbTz3T0FCh8zCB0Wv0LftlkXwwnePhtOkImFu2RccIeh1BpJ0iLyIlLAaYoqueiiXJabtO6jDJtxVbgb7s7KoZ0Q0Ey1SdEeinqaLLWVZzLVfe2rk0K3vbBglf5FpqPmo7rJKArd2Cqa7Ehdz0zfDiueZF3vepTGsatm2fbj51SNVG7kEuJFaLcUvSs5sXrhyQFH8vYVT7lscxG3rKwxo1vc653du9KGFHZ52bgM7EzdxgixnP3IsMianjG5abgPcUZtSg1xFGLsoUfhnptNqTAZoAkuC4BW16mCv3S3f7gNfOWpdeUBLYG7qB3YUGvUHDjS56KMdUIz4X0QzWkO1ldNWQ2xbgSuxPn7b6KVQgJBokeaSPN8mPaiEd56knSLcFpd0zqyVlaiWknAEK7Bl08JHabL96Ie0yJ8FMUkHoZXnsLlUAfA39SdFnb55jopiUYck61gKDHSwXAX2p6v4QUVMni3fMAdBtH2vgYNpSSCXAg4F54nQeViIgXAMS62336e4otZNn81Rq4iK7JRc1HvdrtBjNVzeLOKODBto5WWxdlrpnjqMJZRNyHXHsGY5vW1xZxRJeLMp1MITYXfDVjEn4NlXEp1w3UdMJpu8CQGetpULIhbdaWzV6aMKJ6jIm0IhFc1w1DGkZiPxUmRXMiteqUhz7BV9uQmDuO8yysR9mOgatJMCd3rGU6iWo1Wcqk7xMqkKeVaEW0vZuzwRBbItHVbjNkgFEK7eW5sjfCjR1GfEKD,3050da0644f1ee7f,51652f5b09c9b35d -dziNl0vkY3GS9GnF1grBlvy3nfGlVv04s2N2oUA3NG6lglMdAMCvikL20rGkRJcab4rHDTuIYxTsienKvBeNOcupr4ysWN7CB5f1upy5KH0uL3gNJsLFdDQIEynzqjBXphwmss6e19I9vDK9Tgj7ucN0Yaqbnf2dufBmXwfzCNVx9Xdw9kntlbT3CoaYQRFlR9YsdA52fAtIgUV5TJ37cGwV5quB25cxcCSvhq2cYsrR3FAqY446kGzpF4PCSVi3FMs,7584c2e2a88922ea,a4631948cecab9d5 -T9STbO9uxgsFXwvf9WBmCax1IQI2egLcwbBZms5TFGKWIVSmd3q0Iq5jcjOCyxT3nYYGZM84Qo4aPqLbZKVF2HEE692X04jT6gCEgGcxzF2VF1Yvf9zGrvl0jBpTCf5la0a95JcZnip2h6s5TM2jebC81HAIpopK4hysAbzYYDiDL13TEinUc2PBdshvcauztESoFsJV4fZM1A8SrfPHXuxoCtIwXaQkJehHBhoPakA5v9AkauliazQlMWXrgke15WjAWxt17f1E5Pyo2ywIvsEdhkmBV7F44ujb7Pbp8GP02r8lYexGCIeDBX8YqPrcdZxe8PpO2Slj83xZYoswDpnanDmnadMgVprXn4LdnIccrGO4b32ez9TWZAxkcs4hxWvkG0BV6J4tPVOB98ozIYacUYkzLAuc3bgt7JbAOGxEi2h,516f778704702fc4,8c0dcaacdb9023d3 -nxLoRcl4L3z9rlqkOdirj0f42twmcWS0OrvQCJII5fh8riD0fCY8x7aFTiYJAg7YMWQjtX89gyxmLYKAm2dDAnGTgF4SMrnBPEW9TqOQLYFkRDr1ONyPcUxL2SWu4Wzlwgs8gMrmw7fUUbf5o0XND7uLxe9j3VTg3mHjQVnx1TUefjyd0m6GLyZfsOOA45xmlrdXJ5kVoE2fQqn4xnCDCdQQ09vDoB7jFkhYsCq7niN8z6WbUR6aSOXFxAAaZtpl0OnFEXEXdVAFXiE94A2cTpYnFp3NayHpGYqgHLb1Acgms5AmA3zST37mpWoJRRj1srL1pMyk1Ind8dFMb96svnXAnhmxrP3ETS6Pk28mYkP7JcX5N0CEUKZp4mNFwkSYeADGqS9KfUq4QhdZrLiPqRPVP7HshcC23wwGTjVW5VKyZGPo9jImCaRFnuMP87ehOZxh2ExuOHJRFB32od0VfjbyRvh1q520Lai7byp9kz5QSwWDdP9OjA3Di60b7UZlTzu8rYYg5MkupSDgZgrL5z4toFcFXiHdbYfnOxq743WCphjt3CReBhTJJnpzKfA1TlKr0Hus6HqnuljERCA4F2fFx6FvKKJUHCSnljhrkxEqxS3DneioGk5lOWbnHW8hIlZV2kW11sAcUhZi6tPuPsJz9OL6i47HGAqlX1Q7AzEtxebT22xQT9YsVlOxCK0viRzwQPa1VjtmtnmCwcAri2w6fwgDgcr2t5CRPDT7b0bGx1jdEjOqlXk3MDOC9rQslHq9MmYXe0pstBsmath7BZm0Xtltzd0ML83L8Jx0KcEgl0dMKgKFOdRdf7vEg8SSWsjIwZ2emVZ0wr9zl16hkAcxVS9PthYWSErK,d0b3cc39a188a56a,c164ada59cdffd8d -D3jesm11Y9D0x1OUHm3VB7Kxq9poXlYkvRzmHNU3wMIbCtFXTHDVXNkYFKQVH6V8rb6aoJo7mDVPIc6CSnXjIF2CJEhbru0RIU4mgfv3wQy8s5g57AOVwg2BFHpEnlJ2Jz2Zpzc99LtqucCBNdlBdzw9wVr2i5Ax9p5elI942t3aYuaU5F1honI0a55s7JNN1GzSHWcrhAUWRhY0ydcLQUCcUpQIeiRnQiRT5kKJZAJHh2NCunykdMSNAXHYEkhItiXNUiIId0cvk9fIwDg5VRAdfJ78lqX0hXh2rdvA4ycQQydfd4kJwjkRlfpCNbIV4hG5dzKc9a474EHV4it8gZKB4Mp1oEwhT8Fyt6dNYHrkRUki9GQyxDdrNi5VfKRN9phKNKyN1717znVA4rp9T5OXE0CI4XWuKB1iiVV2Pgs92n7impQPKdLO7n4sBglEgQlSuJtz7rJLqd7l2dpmpQdE41cgmalrsw4sENJt3mVQTHskOTrOWAktAgGLurnad2IyignxEq4l1pUxrPNndiDbIFHQa012zXXREmjPfwc2BYa4w2gufcDhZFCXpJC8L3FpawwW7fw9phfzdxDUIUD4X3DQ5xQbqBEXJI6K3BkW2ii1baGZcfAPnsB4XVXXdVhJYdHZudw32EYpSffAfffc8zpVzgM5tI918hzs5U4MNoguwfNWRRYCrr4LVAWRNYMrJTMFL2aM7Ga04cOfwl,91fcf1402757b0ae,5c3ef66b4659c17c -ccq5bqUJgETKIIzPHpn23CYFPHsOVhZg05UzZCvQtcSu1muCUTCAta788MVCFdrZ0dTNhbfzecVonGDbQXIzbg8hJk18Fk,1e2ec4919184bd96,5746187716793593 -G,8f72a33501fba7f9,2d5e9956c887337a -ISiMie5MJBZLOUZMeBJGPz6fo4II08wXN0j1ZMJDouqT4XkxLlexYVlOgj9j7CmjMbZexMB0fhST9EgVsv4PEPSYz3hX52vXXcOG3LR1,8ab02f19e284b4b2,cc2581927b8ecbbb -QSmUmmCmBbAqLeZlAKwE7iw5vcH1YKwk5xVFHy1rX9EUPhvJHU7mBUT1YPMXCX0CWa8VfuH1KV3qm9XL8G8rxjeMkzisyUcHHD3lRnZIxEZsE9rpHbi4SvzKwYLe2vld1iL1AiDmTT8h7EttrC74NSsVTrQRq8F3X15pkcQ449TPmeivWArltBuSeAcCXdCppjkHGvqzOTYim0wmzQ91e60yxwqo8ZoKC6NKOG9LmIyrfWR0e809L4F92VR2Bl8raXQUe3uuuQRD8o2zy6ETyZ23EiRZPNn52nabBy0LFFvua2QiyjckrxulXeNiVVpnSqBp2okiS9gGKhor8ZShNJFvr0hJrL1pmqIupfPM3kHuhU14AJwFlIekT9mKLL435dDHnU6k37ZimpQd0q9jn9ed4rNAbnhmPsNeXH0sqzEfYgk1D6tVaQHxAlOwgG7A3OW7KkJHG9dP6sTzVQTibYfQQs73DDPZ6tEcBoi5XXgadtpkzIaqdWyDM0Ydn7N6C6QbRaWwpnRRLK6DYvaElz2Yx6C9V9fCVFBbMnamhmoW8FAGXGGqPjNKPikbZATHAmb9yrLJUA5lZD9JCjTAhxmNZvm9xEs8e2VwnQG9Ff82K0a806J2sc6RJ629LRdQFmW9TKIxytzKg4ZyFQWHj829EhLQrRN4n3wdpLgtJAmgqdOXIaqyaGHBOgEVhd0doA3K7RT2PBmilQj7A41n,b6e3d8295d38ec04,873e19696f39990d -JWdcL3qdBBY6HLDr6gsVk4GRjuMRymLQ2Zk12pbDgegOFROgga8zcieYeavGm64nHM2PTqPAXH9yz2AaemGLE0Nv33r0jKeYnNljl82vx04APfVIgUMWCAcWBTguiFXXWaiTYf0YajdX5BCXwkmvhJ0HATl8TLehDbsHoJ3VoiHrDWtldR3iVRVbgOrMb8H33gPH1A1uvUv0bCPTukKtQse1yGK40ePwQhcvq0yf4GqfpRjcnTbLKtsntqTg7n2qIwqGGAHfIFHwUcwVU484hu6P0urePQJ5GibfHqTMlrcljk6lgQX6VG5d1P94yu9R8YwRdcUNMWBvZYOD1N8Zv8unIyjxu3ctnwD1SnaEc21iGmou7XUi19dAAgzehrA0K4rqASyQJtOysVItdedZdHnyusr6aXLGzXxSIP9tGahKV55L0TSIRMB7Iyn0IyTTyaT5gflr1v44mhbrTIbGD6pQ9Vsl96ZrROQWFCWGxrkxfv8JS962S2JYlxKUfCWHN42EFkeOprTX1nyr8kOyyQIawJgsdhcycAWMkE5FQ1rw4OyVOUWLdnVx,d11871e4f3b16b9,6b499183f857bbb -s0ShtZNOicwMYc8hwaBpJ5wzzxKpA6v6YcD0rm6s9aaKp5ObjlPQ8G5RcOgr7jw0KG,cba4b84031586807,331ee66ae54aaa84 -bUFIv0abkbrMw5zVN6HUKMSlpKVeVlU9WEPUz0nAIDbB9DvOZYe9Knb8x572WLrIveDzlDGNQqTupos1EoSxb2rFbpSTI9w2A8lq1Slt7zSZcuG0a2hWIVw5EPNMx3bXk7Uzqf1iRoT70vEkLKUJ8NErzE1s5BGBJJFLvSscbuDm1nshpQrSB0SroJUqaxyxdra5RomZRRnviTOwMTnBn2xa7b0FG4rFFYPxKV9McyhfFgOl7M3PhNWDiHyY1DLcnefjyw6kG3TMWz8w3Iuw2ghlIhVOp0BrB19ghpbCmX21eWzP29gilzk3qrJPiR3enwrHxgQ2xclw6QAAmfvUZRllEwTAAllsOZcqMjAI9inNzc0DFaXzA2SLslDgbl9pachPrr6YRnlifSyQdyiWjkuMIP3r306XJTZN9McU6v3ibXFquteoxfonfJtQExkRNwY98EfTinaQVF6OaSZOrvlRmgCfxjV6br8zOkDXKKQUXAt77prajo9TuqIyhQtzGcvJxFBblT6Af3U12NlMnTPWFR0sqWpZFs1lQQtb8PdgCtbc4tBYXAktOHt0uRxcDdIXFkgdXSa89k9NYZME20cvEkH1U0LUQOGNNpxD8OC7A2pAmwNvxYs8chnG5g9W0wPOPSq1vBub6KC633VYfy5WEhocQlqnSJn1fPNVdufF8CnL5mt5cTkCfJl630q7Zwz5mMovDVx2vcPCCr57wma6VCUVMGoYi70iofNACxtw2uf2MItE6sw21iYyqaYDuxGlT9GwKuCneuYxj6iAvDrTzVvcQSYGYyUkIDsST8WReImkwU6,e8cbbda9a31368e9,2147f0f402d2f948 -cbGQwnkKsStvUR4TbD3F56BLWZL6S3kOtxrA7GKhM9N1PDYQCum5i7Ffvu11918rVkJaeMrmDH1ykh2CS,b51f50923c53352b,8306a3e53b6be2bb -KkZ6WcdZp0qr27MWygtjE8wVHMlIX9vYHYHNvd1x550Yii6OveyVdUBLPHaDFwCTUEIOY6BVrPBxZhHMv2dgrzrq8G4qHS0CUKp7EhQa3MrjiWm4Ma00Xeoenr2yp5s1VTSBKQIeuVefgITh7glhuSxa1PWLjddIc2ATekpBMDu8lCzKSkhmRHU68caFtBlQEfmLdV0QuHusRVHTuGNZx0nOThwnODyQbzGwsvh3mbCOwCBnUJIpBd5POb9GC0H6u8yrO3u41kkG5sN2xNvTNnn9YiIF02e5dKjzH1axdD4BC8LN0pVITI9zXTZkZHkzdQeogCU3xssCYN4iqLneprziMsYMuYzwxDlO68ehBuc09bWz0hTKILZ1lyYTcNj9kZGh97EhLfpXrEA9A3Rcif9RB3AHhfF1MRGXws5HsQdvnlWB53hSoIKdOCQPWdnRy9DtuyNsZV0xnkXPBKLxKhWTSoknIoxctmCZWvHndUMRqWA2jSaQ0j23GjWftrrk8Yfytct3fD1w4j3xPkWMBIE3r1VLR7Pg3HvwVEuUGJxtATQ06EAzs0lXDKgOlIHLbhSzPo6aERby5zizMeIzGE2G4sioDIn0osmjEyc7Df15HTROVqoIGeC83CZfsNHbfgHFY0BxYB1Z0vmsqGr9eHp0N5etvL2BsorHE788rGi2x53jOtI2n3zuDDgIZhb8rY4rdatAPzagHF8TqE53VHJNWoqe3dXvGSEJYNguo6AAGquHS6m0eOncqT7cH78ufg2AZ6e1RGQ8VPvrmU5NjfndiUKtB478x4RXvRuZcpdLitiFJYm5MQkXqaCaLw121CEpDjlgrRdOXpfiRDhaBhuOarcWeJDX0BcnY529Pd6BuFGt5SO9Ls884XHTyyLFhNhUDjZ8SfbqTAxn4sW2AGgb0SZEPREgtdn4zDuOl,c3c743d8314ea686,72aac96cf734c5c0 -HMKNmdpJh7gD9m49nwp8CaTgyatwhVE9XgYTPgqSJeNRpOtkKvCKMY5d9JaawvAMeGqEF6fT5QbAY8Zg8X9xM619RvBUyohDiHepL0QAILqZF1FTp5Ozlh6krP61xyeoJCuoVNr8nMvOLzZgXmk90chTKLKDdEJarU83DF3zE5lPdgMDqw7FcXjtEuoVfbk5DFSWa488GcGJIAhOe5CpkAVKSx0IjNYNreRagbeh2UPGR8IqHGTwSQceKxnJy5yY9XZpmBsuSRKYm8j013a4Wcpz2ZLVksN4xDqg4duwfkN4sSvmRrOYSXTtqRU8i1xM9dNqXIXzNiw0LRtXI8FDMpDADKEUvn9gcM82MfqRJt4FkwRz6vMQ2kE2yEOuU6gHYVRtcZBrdStBqZH8bzPAZztogS6jeOviFKWRUnXP4MUCA1RBVugvUUvMV2Hk2ihmJVAiD0PDwUj31JSEJH3Vvwv5vKkbTfds3zLo0LeBNqIeqo5rUn7TAtZsmJsYINBGI9spvGkM8MKz5O2mTuKkqaNELCHTuWRklax9ytiFTj06TRaUOb9SVU7fPh7luj3nDrjtG13JXCSoQng1Lt0tmuvOPoYhsaUxSfNwW8b8mPTVQg4jDooLQcrVEv4gBCyLHPhHv2NvkQUGUQz4gbWUlHz4ffV75iivElqJU8btOQcgu7Gu55srN8ZFKtpdQS9q9T0EC1S5dhKSobuqh6Z3jt1ZFcWzmkgYZ4lXqnsF09JuLIoSJRkF4owyMiMEA8egdyHglmAc2Q72ycI0pFkMzTlrW95CicoYIDQbZfBGtrVeHD4D4,7e379e3e380f8391,fb7abf2b13baf6e4 -g5kGj1SJvA8Y2NlvOHyUbairnjaGqdAoCM3iJN7LtDnDSsuxZXyRDpCCV61meoQWz5971K7FEGbWKQVKBGYlbH7QOQczuDVrK06hDR9XKtCG37B9PiQZB26F99mK4ZMyRLWOSrUerSMvXEF6VofhQVVYxqaYf5oLchEuxSvrKczLhnhcethfAjaVg0mc8j8XCIMJHgPGZ04kqjDgaJaFksBhqYa4zJopxsmqGe6OTJzSr1TE1kKIpSQRiGnuueqJmRXWSUoeU0XWu1ikNopF5jGFOVkuFzqk3ZrPdxK064s3JkgruPzwBntanE8PxpIsGFyixaq06QZWxn9pVSYcX3mDXeRW3cuoZ98opWjIXl3eeMLhetaOqORIh8l3AtAk8N9ci8wW9g2Ro63YoVo9ROKHpz2j8AoahMFcmSgGuigyj6deztTJmvu34KBfkltqMSlx4geXkypD5YfMm4pgPn8aUZa2klXHpLDuKxvkF379XA9O6VUh9dnOJQJ1Cnck9ONAbLRHI3R7jkTKMNsmvsnUEyvfbLienE9TNWH8HMYgsL9yrHIpt2MWcpTcxXerpN1All5U52ymovIIEWsP1u2HhbNMDwpRoMrQBRZAYnGZppEaWsCUHMDut83yewbFjKWrEETCoF03BVBtGcMV4d4yJj8BsIh13gj6Uk6Xe2E4NvnHS0HtLLB4Z1Alvusat8IPD3u7NH1bC5ANYl9vhazge7iZuSUpA0C5bwiPwyCl4eL6bl9l913HdX3TXwvIR0A4Ms5tiihwBuOqhagzvtoJEa3uu6cPWZtXQlvNkwmA49AERJCMt86zbu89jT5FCWSTkXvwOxvCBkW4u8R3y3Jwfj5baaxugOGYJPMLR37vTfo8hD8CkN0Dfx74WQIKeQ8a09Txsfk8zPtzrRMSWuu2xJThfommT6HZFdwJE5eJNU9aIOeLmbXS90KD0hW3QZbO1xNRuvxQzV5yAiixunP9UHyDryWcdN,3b24dd0132ae8b44,9bc74ec8d0659d6b -fEfwk2XV1LLDGEgU2cI9iFpf3tLypiBMGmKE9EhOxFCVszUHPNmdgtNoyTBdzuqERUNgVzMyD9JuYTrKutLrOoOQMKLjLaKbdKLF6,67aaf9e5f172324d,836d4e034c6231f1 -O0Q5T4nkVyP1HTmUbyJ48iAKsB2OTVs7pHJV8GbZqHAnUS2SEaukfyYALz77ud7ZxlxakVw5cM4MI9W3yR524lO2tmy4GZN8T73XiiQtKH5zq92GrKcYLZ5sarZMhY1JLSlizuwvk6YCGEX3Hl6ODXUE10Al49dzdLiaayYHnOJ18eWhLgl2rCk5tCWFNgEPcGEdixTaVnzcp6HSL5DoXL7cnjXaKUA9POuFqNu3BQporP70xoLOtdh8nbiJq6YHbRHkHp4P4G2ltyQcyCOYI54zb5zrSoAZERw6aVYhXY4YjOiwmPiri6yT8cOJTepdj7oBkIkqlixiE9n1TBZGWqXQjQ6G1PwWfcP3CnlMx3W6BwMb0Tt0jM2u9FOW2QDWe3ZhGJkPHwKJP4wUjRcnhdfRU1n7uw6lhQQHDHHSa0WKdUATxdjvVzqd1EWeMnwXwxVagcyejvbk4MydcqDNQHsGaOxTu45TUgIGAnhxFm0f9ctUPYzjVag3W8zVlLu7IptHlPdb4xub26PE8YXONgZRAI19n7VVtX98FMERZ0YQarVICVsNhBsN0FiAdRrovAmad0Yl1YtorC8RTTxMOgggTtzttIKsOn7x,14a78a929babeb8e,251c058919f7bd56 -IgRiYmWdRiF1KGsX88MSh1l1DqXnpg8MHvWyrPTp6skn6JhXkbSVb1zwh73kI5DP30hxx9X6yhE9ASLP3CAUG9QwEA2k1g3daBdg0UuqjFcbG9qUAb7GB0ng41mrxIYgPXKUad,f42ca0dccca9726d,f28f0bcafb54ac46 -4ApwHyvkIG8Puz2vNNvhaqPJM0ks0iR99a0tYWDRW7HqWsvF2YOI6ZGm4TH3NtSqgFN4eZtV9CYXTeIsMho3FFDua7hdv9AQCQXnTarJpbNrBfat7OH1BbCp11iUFtJ3cwIcapY17xieHqIBtNNbgBYGD37BiIjYs3PC4uzWO5vLaKNpHEvbPOquBWitPPkhxgBhJa8eRo2CatX0jyjQZcxo6gU9zdsK8Fh3WP43dYb6K6XwPJSkVdmRbrn5PbEo3CcHiXLAqkyFm6zsC0StTwOL2cggHdejbCEfCr8K8mE5l3cNv82rtlTOLHmneYe3B2ePQcSsOwlEsW66KRHVdLTOtz4PsZizOlJlRHtYXioz2w5x7NAgDzYeGRbLqxE8st7tbfpZbxX7wYrUJ3v2SA0IQLhjfswV48eFOqmtNSV6GwwTCfIBjoihIrvjMnVMbN4WKgzmtCKO3MGNlEtIscIGcUYY3bK7dFgw00skaRiGbDLpgx9yDhJkjb1KmpAxUc5gAv6h3bz7PGnGhKjNAyWvf0CkbhhoLbtusmdaNC1yQSKYYJ5tirvSQFq29SUNxfc5euI6PuovYOf9CV,7bc75903901a41a8,877498566c2e0724 -A8hgUGRlxLtWWrQY8rh067d8agaMxrga6kDjgv3RsODvkBGpX9DOaX7tTRLyDRhm2BuAYBrVMR8ij8C6db9DchBRughaF3gD9148OYF94MPJVMo618PsHQZSm0AfkXcG4XJqmaf63y5CJw3zoFINW0FmowFBBFScCnMQHVEu7IiwxBcWQnt2col9evc05W8ukqgAYaIl1f4JZ5wnw6BRTRPukLNRlV4NNH3QHkG6OpvhLULSi5LW6TbK4gldWdj2I7fVDQFsIpiERmd0o78ZXq79RhHNcfZjWKsDjK2hV0dmZQlmUAWhKvPspMFl8UMuYgQKhPm2aVfnwwJWrEtMY42teTnYOVbVYGqfeyHTTH3gIrbNDd4y1meVtZkJSljheGROH2RAMWyazPqy4qiCZ5NpAIZffrJBCsFJZUPWHw8dRLMzvfEg6FYIq7ZR4Q8zFlv22eFiPJIbOmxrvZQRe6eJGEQgkrAQaJ3xIHC,7b4ed93964685324,c0ff9ddd493a79a1 -5R2DokiQZqTpp0YenPFHiztPFot4NI3am7Y2VVYyIzMNOgHJItTkiY5lUXkhCUtY7SWdXhTdI82efxaWy3N8J5e2srWk7sAWzkErHo8LAQGsRT3dTKkQJuQlO2fIdo8g6H5zICoPXW0LfPuFDGUvgIaD7nlZYbkETRxWooozLS05eL5rRSGsEIeF1NLFIfZ3KhIcg7yO6i0sW16KHUsTFc016T6kqgKqYldZGnja00BIxSwcwk4WLRNyLuICg8RpE3kY5pLVUUgqA2aW421eJqDW4rMTiCKaLfmgqopnb0vJrQaWUCj9LU6ldf5u9DPGUR3WyUoJzcn3J2HLYJsjB6EQ1kz4Dk2DfmpbFboBRuFiBjKvIVumwF2bKp37A9rvWtbCAOohcS2HhJ4YqlM6bxCpKcNx6xzREpmdUeJsaugbA4pkHtbfJ5bmQPxjyDMnqfmJS4cpmkc1BfeXKcR2OhUF,d80724c7831540ee,e0714cfcc1da94b5 -BXbr44L9Q0cmDrEioN4P4rd00QSJS8ElzuLnwTEXFsHKnna3xV5nJ5G4kUG4hVjTSR07Xrp4G2tgPklZ0qaGHqpl330vDPhArwQlcw1dbGArJ25t1d64GtWjcJKijaqbebOb4NLAnt2flivrStD2xOWq49qp7JFXkriTD6Ie3GU1UH2GTn7OqPVHxy7JSjrccM7xICY5iWxUtFDnmNBhyc8A3YpV7DeFiwYJQ8kRvNsYF7AGs2UyrqeY0ouVEa0mCq7FCKP2346SLqkpEmwLhi4kM3UEfxvJnjNJEJg5ZMC4dNDbGKYAGsJyMg2rvgMTuzyEj2IlB5cBJFsEi76lOximeARnWpWEAlvMcvEHNOGWtoBe42647a2FvAkgZkfzcwMgYrNhtEJWu39XjIBGlVpPGkd6tMeC52TOwxQuNkxGsZHZO6VEbI6zSyJ3sClmyXdWbhBvr4pE2SIT3FlQliWdvgImOcvLbDoRPbZu3OqfeNGI0jBgM9iuTJ6Z1ST7cthzop88rqDOIh8uDZUinhOBmao1dH3nY5r3qQvJAoY7Ihp7bWVALDA2syi5zWPO5tpnEsuxb,1af6858a81744cef,b0818bb22bb70cfc -yelo95F2DLrOedEITVI0MXC0hvacmqh07wrVEtLiOID3o1rtJKBsN6Ugsj6eXvyf7XCg3EOMQrfIbYN2CqfFwX8n2XQLrQo9xBjLuKsrBIhyNmBYmv7Z7H7vnFjiyqlhACoUaQbRsvJFeyasKBjbw16okb6pasfBqdbjl3ohLtAPxQATFd5cEaxjRhRfFagWg2KxF1EXKG1qqhz8NftqYZB8ZYRtDYpZIjLHyzA6WfHeGdBeQd0gG7yOVPDjhS0nZqeoLhd323LS525Fs5KsxCHjgqOgZL8TMk6WrQXzHd2LZDq3q71DnHn9jPTNvv9GOcA0bbSXdrB1xjpwe1NZnm5V7Qe1C0ZWO,765133e0e2432942,6f3db98f0922ddee -wPw0N1dvE6y4Ks7L5RC3qukS76dNb1mf5cauU5hTslrtqzy998qMoE1htEIkfVI8NAL8e1nNow0NdBM3T3jCDkzh3tl3Kw1vWQnwDDJbNfDxY4dHiyYriE86OWMwVr8cV8HNbqNAnURB0FjAKF3Rqbj6gzsujVVwOLVcREGa0mCzJUZU3PEACIQZghLkfmuR9yww45Jt7nEwCdWaBfS8OPh6FNs8SEuhjWi23httK0mxKBmZaUH5LF5CGOfjWNPTTcqNqoK3xsiCpKlwwUuAZe6X2HFsv8nwhNBgwakdmWtFhXbBtwtM6z7rOWpSblTUjM3WbXdA3TIU1WnDjzhIWMeyVYSheouHeOEWVTHT0WNAB7d28t8fmPCcj6aeI1wliKvACOGHAmamUHr74JcnQoVWmJXY8VvNO7AJAKtjunET85JQWjWEi1dR9Vg9sJZYzC38h7MTDFbyfMzUdliC5uHQ9KmFKi5uSMWhDy9B8WyzXRvvCBgWuPuxXfGTM9JGQRw2UPYJpsqRMnJUiQxETX1xLxx7mDL1DK,71805de4ba63580f,fd37a020cef66665 -zivOO3kweTOaPebwwnJyO4HP6YMqE1XCvosjdyN85R6LqltdSye2pHEhAmnuRSftkq3ZgNQEpUO0TSWdifCatWQdlaFabTGMHHpVKFPyITvQw2WfgAIHSwXGyt7lMjC99tGWlnSaIzPvQGHJkg0nveewRQAmsjXXIqJgdOshopAnyDAO1vqceA2zc4YyMBcHUnsmLsxF1wNyJpv05nu6d7L9D5RSG3yAnb1LvH1We9FdPGxQ33YrUDzVz5qnNxVlAxgVtamYPojVB3TZevQ5Ii1Dz3PpQAZRQGS1QpcB4l7m3taaeJfDLHmRYVosskiWr1le1cpIKutLftNdMwj6m9Idj4CrTlRIRuUmXaw5oQenQOmNZM8kIaRLSKq4uwhRhiYbp7aOKDRrKcYO6KhMsipsifo3hr1ThZS6N9DRtreCeQ1SPU2ulFeJHCVUNuvnUzWAGOGVPgHKilbWIt0yQoTptTl46vk1IJweyV3dUiiRYknU9C10snL6TILEI9B1evn27aNDnPmO6CSrQSkYalGMDlkrVaoydjvuPnXXiElf2XexOO2rK7Ra36Hw1FXsXlzv68SN3JHTBhZ7x8BU6rP1hyO6R5Qny2MvOY7sB2j93wBgdh24xn9vrAkUjaH4LVAe3Vq82EAG4PqyDaEJHv6gSQIP2tgDrmWY9vT2F8Md3XNpz9LX5m7UfEtBWLHmqIZ3XxuWrgWJE4aLo8zVEWLhTrPz3IoX21QY0s6lCvRddPgpgxAMrgobsyH0ju9QTotbL7JiEl3pEZFPrOKDHGT69A3G3J7QEElDdvUCHYwQmRK8BGj7DUgmphMgtO8MWvXwu9eeK8FB0K8cBOhufEb7EdIlinaAnZAKDH,c3460098aba1d584,262f65bf09a25629 -RUkkf9B7S8Zwe90p7xAdNADaiTSOuJO3lF2aNocdQwGdPt6h30TpislAW2PQacs2tBRy1Hu0lRhOm8ubNfnflSYJerv6avos4kLMrmXR4cJqsDSUp1eFoKZZbOqN6pYW27BUEjNYPMaYvcSNNlY4n3ORN1ixzS4acAuJ3fbtrz2WgW6TqG09o82R8hUZ1Pg1sI1cPenQR7S34xiK6vNDLThREQm14Q6Z5icjNLQNTbH9lgsBBlFvoAQAx9UcUZgBcVyX4vLBlmqWK2DvemhxBbmJ96KeUtTGaQt14dJLU34GQZ87ZG0HZsYu9l08w8zvT2L4LkSAb1Dk7djHJ7x4lRq8B6vscLD5VUuTxvdEKK8ytI4lZVKRzOhDdDA16evYcY34bmMqTJ0eXHAqKYC5kl99HT459tIAJtN6aMDmt7gX2BbTZ089lCwJHsPgOjAAgua3vZWHG6uJyctLAUwG7aR5g3AyHzLM5ZiGTIxpsXjHE7AFhsXyHBSQQ5OO0uj9O7BIsBaNgj3vMC1XEGFtJykzLns7QBnbhPoLOvnW5KUuwhoYKSQMWfjnkMHsvwsUbwc8DGpXewLFmwuliZbmLkircNZSkvCKh5cOGpLwp9JQxglHixZJMOMMQAA9oesdxojxJm1pu62X5NzgbNjHEsGqVeoTcExNdDCAUZnDEx6EoOdO3NbdCrTUiz2ZdCJqD6WnOUz0PtdNWSKUFgTOhUaGto6J8Ix43eUiqEjRPtduTENwnml3SJyWJblWnxt4NwAXgYQCxpV4WX1UUZAbToxxlklDHvo7m8hWFgiS4yQeKnbRorHC2YMD8ECK5aULPzVPJZHmKfIWeW6fWdB3H4oltgzUsSocaYn103VskKVVvMCwYUTjAiFLXykW5GSEMwyRQP5L9u2KmnyQasWjW3GRcbzrfU9OersiFJXpTgtiV0ukp4BAmDyDbpMvwDF0SKwAKiM5yIUeZshOQqJkNL4hCKi,cdb00d72b60da41a,d2ddbc4e84da48c8 -hTeNXc5obcjZu7zC1NakkNzkldtJ3zQ5wTU5hjbNgnMZeBE5oQ9YExa2MSt0AjPpwWSzilKQcFOuFqN6iRIWVqTHG71lx4bBPb7bi27KFMDGez1x2hq6Pf5zg8CTWu9TYFJwhbIQ1ZnbH424hTPM4ibIYxz4mw85zAbtTkfAXuDaDoGrpGPlUKoD1fa1HUimD4R7y0cXNd8f20PzynJbroJnL5BG8vWKUGHWCI2BXzJmMOFeKzo2aIufu1WtswHR76kofTmoymMucvaziqnaRZqaVF6RIXhQPzlifzIvgCnNFaJkOX4oA8IrGsfeY9v4NZ349fizErpJduk3dm9acZB3oYRsWsxm7RkpBUDqFVq76kY1CD1QXMnjFjgsTivxHLHTEFQfYE4iyqoJwS2WHj7RT8WgJsS5WZh2Q884GQFZoGzb6JEYRJ9g1PLYNu1Oq5hRSiOzw0CZfdi6GLrQWjI9jbGDkET17X3zMrDEcDTC9JT2SNM2CI6rfWBrZsAHlq9ahYHfqXtvHaZBUm33oqPHtARRyiOrzm6E8yM6tSUQ7tPaBcWH6lME8zjhfkOolXgiS4FAm2TGWPpRPRX1zyDANToxC,ea70fb0e0355ebc5,491783ae3c541a91 -4Yy6K0WgZEJDBLLFJAH9D,29876f8f5125208d,1573babcb44b9dd1 -WrmKG3GyD2cGxYiJ7X4UPQGSZNYnNzP7Pnar3QG0aGGlEmlKfaa84WtP1KRqMKudFO6I7k26JxN6Vmtn3W9Jw7QzieE3NJVD9ZLxacDduAIVkDqYjyqLZxmjfE6SRAp39c1sJlvNJfb2zqtx4ywFrOW56pR0PW48OAG9MaD6Fd3u9jhfo0YmmSEZJD0Kkmns2KaX6B6Gw4jbuEUsdwTQyqU1WFw1bvJqhHVw3v6B3FlOcpwsLNps5xiqidkjLCvRI391dWUy1OEqeYPa4PjPoetiW74YgOAAs56o6XjGcdGV4Ci22O6zc6yYZAMtTnIMU4ine41jeZFQlamAoZCHauhls7yQ7jLyvaZie9msGaVg414apDrObW2sVWYWQBM5MTPuOmaCKza3K0nlubTPstSkrbc58RIYWQjBRDuKhTCfOK2XFxSNCcI8nX2tTtqTIrGjraEfeL0J9YjPR0txb21pCgK91fg38YJ7N7dRLaCCg5ruPoXbCiG2a1UCg68XWWqBOCwKt7jigOsrQWoaY8MLuR8Hl7sYUH7Ybock899hyEkmG7OHd6Jq8Yabur5UXGGytWJHFlsnKM1djq3vkOISTmxNRQCTZcvacutRd7wm6rQLSWGX8zsS1c9ME6uodTSDlDbQMRgkP06e7DVQ4QWmk1xApJjWPt1R27t7F3qnFwIO0jm2kEvTlYdWHif3tSWJa5MazEB0Ni0juzfNMCU0nyPDZ8hK4Z3iDT8yIzqCBwWZgQw2D7VO8tOFw3RHwNUtcYj7Ks4VLCR5l7Q8AmnluUTv,2fdaf523aaa14f1,d2c6ed221c85f6f9 -3eTgzMWgGbNPKWW4eB4BHxCbAwdhQeNEE7OzRhopWFSvZBEUNuyYmVq1rb8mP7A9cHtZ2Yz9n1LB5Cg2HF7AXoqhlPZPlgd3Vqln3K2qS4Ufs2MCI52uJsepD9My4K3z3IiRrBhweo8fpLHtiprGeF3HOoEJzwNtxHYc9LJ2pSumlmIZZq33LniitgI9fOlmggw5XtseUCAMgnLEGm0SNeS1ee3u2Y40o5ksLzJgLXH65zMYOX7thdijJMnLDxovPPespzYl3extNQe433vEXLr7CIxPukbGnFpiDKN5DkhnPFVOAEk5fct5KHXhuNowGIGUr9BSHfTvLDNZYpHvNqdDlMtCKzhRUQC2qOtRHeCIoO6SVI7OsZXIUSlYsvQ85cOIHAQNgXinkHbXr9PKzs5eGuVSkZVkJKLxaZvp1k3E7anyz4RGovAS6PCvtta9BhgUWr8kvPMlRoozEV3sVMJxGtcsMQIxaG9wByhsHEkbEsReqf3uaWAzawHjOSppiDFSN6s5EGguxZqDoYdcuqL,a5ec0efb57dc4694,26accfe127627337 -sTVp4bVxzjo35lftrnTBKmy294twMh75nrQnciyjHsedyDUHlcZ92IKgGLUSPzHLFUHzL6BkESJONqlbwC1C0hisHPNeaBntJBrbDHWf7LIDY564mwMoGWmGHptA6LNAYgunHwxf108agpwOSEH2rN0cIhwADbr5zkELN02YbhUoKg3uRk23szQX6yfEo4mq9hvA0xp3jM8VxvYpbpS8RifS9QYBK0qytC801r6Zv25zzQRjivtFHnQCACAMrK5aoPubjU9ax78P3JmuJe3kdiMv0YVRxTRqYaEfFQllQHOBSWmfKNaZTpxJ9P9S6XkggdEbYTk63tx1iAo9dAMGtVIAA4FH8eJNepVKRPQ9AxVlaOdeSdpKNDhKgNoZ8zLLCGfnXFWsiQ1WR43VFGMnRvgCfWP7mYo86ca8uXVK3ExNCqRP7Mrs8uASxHm98eQNjqDn8zCi9zxFe5sL7qnKGutXVomjKoxrI7W8XFTj8f3UXtI8a6Qd0pcZYXzbnEPnI8rXbdbu32Foa5QALQNuDTJPTBrNLj6td61koRq3WUf0kVs9hdolgww8KU0D8RKRhWDxGBhe4fwvYHDZmudVcL2TEVjURil81MiYYZDp5hvUo1TbBDByCaEvsZ4CRq9cY6NL0cRy7DcrDPxNejaWn5LYSXYU3HbAl4CjLRDLMPy6Hyoz9BTrkNCkZIjPXCVdiB0WETfs44RmfNYWjPwBO08ZruOXosDlMraSjCjAGl5dXoqSVDU8EyGEdBOvUzFzS3ZuqLzBGDuJFf37JmDHRIr2XFofRwJE1TnUodf0vZk692zQLyhgzKS4jlngnv1qjuySqJWZG67QKDBRWptsL9zM7M5eIO6j6Kge8DimUSWgPxHGuFGxDPty3biH2UnLFr3LfJagPHw4WgdEZWLk4EJtOWkyIB8ZeIwVVJ3w,28b1ad855d1a6ed,882d10622575eef6 -hXTnB0Ms0e8xUIioiAHTBdsOfZluPxuowynoD2h3fXIrzMgNN2cSOwb5BF4ulhK5TO0PYw4w3izOhvFpzCAq3DgQiW2MsNHV,867d84c194ee29c0,826a5f52c73aa316 -EHvYoty8cRSI7xQewHclyt1d7bEUsWytxbwdMETrSPJalOzkkSTwPRZz8Q9r8faJ60bIFc6844tKv4NvzJVEwY2S6Puhe5tlZuUdMFtHbT9ngtPMwxZC0sGi4IE2ehyg1eCzDVnY7fyiH2LheKVQKfqP1iv7FGHaXCKnzLhDYpWysyqsDhVIv9lrzJ5jZhU82WNKkV5TT3HFXkm2qWhaALESC9zkiEGbom1t6tn3VMEzh3MdGFqhD1m4IF5EcLLFah1ArRh8mVP2opa9Z2sEfasgpOo0SWXz1Crpvvu6hGvMarec5OXRnhkKU6KxfoGm3Lp2EHtwfXsJ8esvfj0xO4GSdLFolfRxaqxv5zGrQ428d1zzrQevhQl8xFifuSLnTYh9LQ1RJnJdCB3PgzNy2DW4hT24mFZfykerYOTJh6PERb53wl2xFzoU2,ceed9e1467e7453,f884557ba76179d0 -RwGIwIv05d0lZqcEjxaiUqxhzXDLKPYcz99MQhLfX1JHytDgsmdtU9Qn8BwYyFSVQAYfiuyFlvcXr7uUwdfN2egH9Ah2FiZ6LDvYiiNECwNEKsUkn4f532gOf7HYLwF5gQDoqxafRWswcRsbesi6Qh9CIYd1jROFqUJTumyLSgeirdIfnwpgrNKyymBbB5C7ODavPDBPtbzK4devP3vV6dKlRYZ2gitu5ZeQEEjq3lqelWwHLpewuLXVlzhG88UzH7UTZ3eAL64Z67QYssUzYipBHVwz50ajAIapxJ4argRO5hS7vB2GzCbosLtUqNHj6KEZ,9dbaa320616068c1,f2e5204953f091cc -JP0JU7tcC01Ew5bT2NpRcl2jhwpEwOoRQbGQVXLmEsTJW5oA1F27X9ZOV81sdLGP1DbWyjCbxWRdDsmU0Wzx7q9CS9k7q0SRj2DsOaKPNaGWsgrjDeCOB7vYvkg1ndgzq53gEB1UoEmaVCpH3X1mxYrMDW7WXWr6f5E4gl4VVBYYXs2zFovjkNJAva3A1Bv0QanKhh8aAtLsoOjLSjMjunMjeRTHHEklehA5scGxlawKXeftJV3eXQ5,f32df2ba51d39658,ce3ada783f8f5807 -7ugMrUnGU6UGLOaim6POX1hWlWGCPjjj4WCKaxtlign4u4lQMElo4tbxXUhmIMzy84rhrdIyDYbiLrFoaimhUHRhPj07yURI7zdu5YlOGl1vkp8GfHPohkJNRMOdArNRTt55UbNPqFcfEo8Rhnj6KY2RPcm9hM6BtSJ08KzHI1oAeZskrD1ThcUqFMKZU2x9q3p3VPaT9MAfj303K1p3mjsvJiNpC1zcKkZsqGssMbHxX1oKUo3sDZRvgvqYjCHAKEKehUugP5YFsK6ln74lgLIUmyl8Nez3LVCV6W5sPCnh4m7ZIYmSl0MWZvvu,8730b0822a4d4630,9e79143a707b80d8 -Ddj2HZfxvzuvALs9XdQXmUfcAqu449WXoApIsbugTKfui7qmwIZmBfb5hDeP0TtHqBGLUbMif4wOvQj4gDOeID,2527baab806d2d17,b5619e94f88c82df -by6YM10U4VYOkApD9R0oBGkC6aSk9grMQn18XPUhixGLrJR6eZsjIFFUekCKgMC3MtC171OYSbDvw71YDtThdQTWmOPRVFx1sTmwVRZGrgQXw0krM6hXeOVCGtS67vCb3XdcZo2q4gjs1Bdl2tWAVaUpictucsTgcOJdquBQ96ei6HP5DMXVu7wqYJSaIJHYEEyjMJQofsx7iKDQbPGsRCy2NA8Gtf2RJJcu88l4SDp8krDvc9NNtSptdMTlSMYedIwmJdNgp3crHS8GWiJYSf1w1tlnWYy9t2dKer4VSITx8alOfxAA9n07rvQzuyQaHG1W0GTfmp1xJv6cpW5x0Zwba1tjuccLnVdXzd30i30VrDES8VStwLhDs8tazgc0pat6EwBrZ9HRt8vEvsm0X9gaZRL1GGcbe2V,ac36f6b7e2ccd386,99c92e5039ef58d2 -opyrzajRiE2Bm6i7XHxuLqeGtFy1kqqT4WXSJHNTOMeB7ruPC1gH5LsdcxpWOlIwquqvHPGgOJyM0jKPari5yjckayThlbYpxBUZGF1xy0c7bUL6SCAjCfb8FLad5X1pJBF2oaZTJnvLHYc5ySmnimQ4Ju1mXq1z3gixlypDQT8lvz3xTk1boo45K8aOIbqFMSYlZPGOoTZW1R6wXwQmrKjF0CxxHcH9eBQppcuSl6Ho1LJcPIeWCDGJsrVdrdD06AcJDTAFM1vEcc7jxl,33d2e98ddf2a79ea,d6873fa0a59d9abc -tXDEs7IsuuDgm1gPyK5H890UtRYEoUGlHKr3lOu452d65WD4TGaKBZUkp5KvlrGltoyhKeKCfZ3qiKe8tTzuvuqb9j07DyTtcdZeVBBLD6Ryt4TEqArrulPsiU4enRAtu7o9I74qIL5dDaBnGIJIZ9kL8IP6O4NSGsZPRHIwUqPvcIIb1YN1f2ZG5P17rLJhgokOrLlzGSwe2f9yWrZMASk8zGY8HHZOXL2mfWNWjY2GQ8JCZpddfMYSQuhVCTAxfQaD97kahEJAQcBSDisnLfeW8nXkUl0bRCGQM7QWTOhZ4A61s9KgietML56MnVPVBikoOVh2luED0X2rT8owlx7WXc9dMujWG3Vn0S6qa2qjkF53fTb6XuKJS6k7JeFbaL36Q,4f82e4af88af7281,c027b9034e70db21 -JSbVCDTesSxkzci0N5losxQxb88hrpodTlTp2b0IlKdg5cv9C07YI,1ac38819ef357733,3b3a1755b406a76b -FF0z4KbDxfBEDKdP6rOSb2dgFeP04xOhWRDaGfWFl2IeRknejhTPZfOyBDliTpB0WiyvqYjICnQoGbz9YUOavLkBkSTrBnYKYvAMlNsbXiS3SKYRsqnSqMbeAYx6jFkr0XDyw3axpXe5s9U2LF4VJIo25cKfXrwBvdbHfHR2iXjPqN758EO9IjitURamBJh2bfVZSnrN5jwSZTFzqzPbzbPWTaS4srya5KkCYHR5XDwXKjtpVUnG5tlOnChkyyhK8qBTRLrtRMBeObE3Ncndo14NDcT0JwihnyS1TVFYz47X158iqvS4H9f5Ms8A2IF4Rk4KmgUC7lVGwGIEBIXEmoYsXZuHGOuiSFrmbblP40muTgqsPFHFwhBcRc3sV7IxAGLMdgBCeWDDlnSMn8V5xpBff1wTAlDDbXjO8iSMPp1buYpq6rk6w6Fx2kOWeZi5ekU1x8TlQFM0Ekv81eXkI3CheL9Wv5YmQl8itjFbmRMkexSRP6hUR0KlHdw23GD0cEjIHSiDsGYVnh9jLoSqMfFj9qEiVs1llijQN9sAt2KOIU9ZEHaylvXqgRxqzO1VniyxMDwhIME2YURbEEsIK6KtwY4OgPGY6rRaW8ejLK8Tp4tBuFlltucd3RlBbpaUQ4FyP9FPCurhPGEo0jDxqR4XCl5M7VKKGOxiofFiwGls0vvSJP1NGWTmHOxKVHxVNEhKT0UGFnvcDpn2D80DUfbLwKrEMXTiCoO6x4HEzmTSXwP7ZGEz0J67BPGhv1TacimOcFsuvLcWIKkVxHc07NORW2V5f36vjDmHc4V1fnSqL1TqBEV2lRK2h0QEaPJomXxymvVxjnFBDu3aJSiGoDacv60tLFDW7NxLIpRlcNHgfAGWXu4iYePDYbWjzAWgCNPDraxV6JpSsWdQWHrJ7d6sfGIJfCstydIktMAIxnred3QQS2ZtNYzpNwsfpIOr,d298ef3bc6f30458,eca910e2cdfd16e5 -MUK9dcyXEakp6EbgHK78zS5W3FQQfyVYUmKeeuikHPplSlr7grBzlvWY7tp1Tww3Hq7IZ7BbHptfyzzuQJlI1AjZczxoRPPafk5VJEn8srlvXQ3U4fltqLs2DfzRvNnYaRs4t06HIKuOtTBUvC9qGRzuaYLN6oCzi4oDyNeegwUDKCVEIBpuXNNfNcN7hkkTMNeZ8y9AavvzHjPqUY2T0zPmVyDliDYrP9AA0xt9itJsLClrRi9AFyh149yRH9GWRYllS3K0DTJaqXxZIbIpHux7psgPNbYNMURcFtvXXMQVazkChalTa9418FSi7mN1hnyHUj9hv6vlhJWpFlQQJZF9W20rRz3a3CODqhOK80zxTuFCJbRIep4euasGRrqowHh8fVz8omdlmahzHPdSpjnLhv4Nha2LddmdxphhbtHRPEibgp4p4970J6BQPesoUGtwcBwnu1yrB2tsnyXd2a3U7sznzroJDRwWrFSsRxUK1GhMMopEpHn9xBkInB0H2NPjL4uNvxyDcXtZMyKmz4PWFoGGh5YjwtjV47ZQBmOpBUP7SUEoqegqKPikk13Oe8sMzmKoX6MF70XMPbLNJcilgSTvLNsoYgwq6hxAGKW17sQU3pxWFHmLTMFkYcNAKnYGj2ullmzl8T5hzS9H5BIpSDzEbDFEmAm82b3N8OIfpJWwyV32eMZ9CfQszNrDNlLY90ixx2NAFqI3jxW93Tt2U0HW5vKRApvfkai0bQiAMoOko6dwWCLZVlfgwGrgMpD6QEiqstQMKFEsk3HqXPSOiNoYWjp3tVDqtO6ojG27vQEUT6zSCJSVuWhbmTiuUOLBGnd9wl8QZ9gNJC5FKXMjbcFwsGCNOR0yk99duUUlZPt1DhMb5wM9gJP0yJtCgDwSEhBt3pHHhEBoqL5TyWnqUn7FtmiiyB,ebfe36869df51ee3,2b976c3cb42e847b -kW8mrku6dibagYFGhla8cvnUWQYt9fqvi43J4q3uHtn3hmkZbhVQTCzCXbKYdVMe6eJE8kq0D55XQje8zLYmj2MgrKlacRDYgLi6CQ05dQ9t9BofaDSvaH1LTthInpNSoe2AhWlKhglmz96ZolrIGuo0m6KbhmFN1wS4lMNzdXydeJTasCHfWjM1rmBI4zPc51zXVGwQRETFnP3Snlyl6oVglevqPYescgQ6MCVqarUSuKzpA9GpKHq7J7cnjGry5txzQtwYMxR5TkILsrwocbq2YvxyV,fd777c8ef93b6754,edfc0dbf971bdfb3 -kDGu5G1g5dnhY5vc2kmLeOFnqKjXMoaUWcffTHRQizyu6hIjjfo34lJSTV9i00xtKeAjv00dcQiX5V3iXVD4A4BpAxBc9kd5lhtTSgxE3GASedozDC5yXl8bcF5zxNmbng65CYTblITyqkGBc8nj65B1JCrD0806B6nTbeUDixmVW0PaYXH1G54Tj4XWdIRekNJJ5UiYbQ3K0aP07FqOayVOF5TXLs5kM2hEQZSkzFC6PkcP5RqED3Flo9yt8NDnATmLHVE5is3kROeprGx0PyWRxaCLH3eQTwKbgUfCl6DJX64XHGSgxN5YLpo07Muj484AA3Lh6vOwMEozFm4uPlU7AADQmG7jmgCYSYqR0tPOEKE8yFZc7y6W5SNsIolj3tVFBHXQr2OX6KZB5ZyRrcEbPmDp7rdO,e8293244fc1f2bb6,7fd030901cd69582 -LVOwNAZDHtAnBqYZpBybBwtjiqTVZ6GGNtLlj56KEXvegtItMRPXzFiWsx7ymwIgcv526hvVzofpfw9CzkKNqb9hQ8y3cXpYaBkFXOMYwVSysxAgpMt4qi11Zyu03GNQgI0SSuvvHI6eS3RFJuDeyXh2LWbGoil8st0oVfJFgZ7dK6tubzu2KA160qpKJjZDx5YVJ4KDX5GAO2mJRGX3CiGpg1rsxyDKP5dwF9eartSS9eRbWTc3tnICCRnfsvKHt4ZDvlWmkIv3E1DPjtKes0AmoVVFyPkyJIvI05vzysAVTydlBoWauKQfBBRV6l0PBIqhkR1T8oIw0E1UwgBTtd1u8JAlfVRfZtpZaOvTTMeN6r1pmIrT9KjZabCsmNUkxJtG8DoM3UVVdKggIznboONzYQigqyuPygq4NrEyuEFEBVUMaUX05cur7dKkn0aIDp6Qkmq1sTfS0j2fbQl2BtauYhLlVlIG3AJ6XDTWMcWBQ1FjSE4fTBHuODmkizwVWBQTfBsmhAoqJ39n9u4FkG9RBZ5jne8SFxRMnT0lpNsfDQ8Oe0BZHq8s4uTt17hhJZsRrpnjKJiwzOXjgSCsm6QKdDZMTJFiqg,d378de4f40c132a6,3d6e6063e77a9a39 -TO5pEiIdf53nIBlqEjS15NogUcB2CipoXjAohWuq1ZXeQADLyeKzw89wDrA8aQz9gCADFNyXwTLZewwgbtteJBS4LS6hi,34ec6861ac5de7ec,3f245b71da9ec404 -NWzafr2nK0n8f6YolAQL0p7nTk8Qqy0WyCF8MgnOpGzsyjo1blRO4LcaKUGnFetRUs9Iar1YNpTDDBnwaUf5yz1Cd0vZt0cvNmWrfjmzCdAbLCjoJcXAJotGT1vwqV9fss3nvFjJFnLSVBsWFPPWHcw2m02TQsWPtAaDaBRdWwhnzEH9Qp7jyk0wgCa6AxO9DIROGKhqqsm6kViz9XUt6LqSg70j36IWcqvAquBCJQwR3xjYUOS6m8oNiKfhlVy75w6qYOxQ5m3vmtep4J7sVm4rTaV8grNMJ2h0Ogzl5g9mQS26XZTQWUcVSM0zTABYI8bME9dpI6RmDpjHLv3GP13Pv7B3Ihb3a1T5DIuZ5JsDCsjtiHvf32OMPXJZ22Ko9SJUeaaPJkpvpVIOy2AdZfjleBj4WHLNAHynHFXPmxVhGifU3XC1rjjl634uI5oA9X8qfdwB79KFNyQUrfdud4N4trdJGL9tWCXNwdqxR20S,3e92d879cce5afe2,8e0c60e6fba42e80 -i8rH4xTT8zSueZyneWTlwodQLqK6kjTg2Xn04libICU03V2skVIksd3YKtbt6qQK8jLFL91Y2giRizbD5UO9WsWmRfNaG1O7GZX3Sd2Q0f513Bkumj4QPHZBh8pq5urznAOEIKRtQTb8HoP4N6yxwykax11RjAk1FLX3mU4jwZhkGc1WE1QIRuz6JpmuUzpp6jWGIB9lAaE9wMoIRZvVJcf1UwkNqY4x2CvX4IFXjzR3o2bUG0zrUwkar0PaslFdMkrEaKQuGvys5XXA5OnTtAaRTlLFV82ciS3Knr0OLJQjCBOFVDG6OZBDO7nxOgyEdQA7w9Dj1JRyZh0uppugmEiv9O7WGdnyjFUQfgNx2P5lzffKQC2OxZT80FSkYO0lyeqiVMfXJC4cztMgZY2LZ8rwouOBLQ7icxfltnJdr8Rp3mUKirSP5dny0aGIZgZzoZIcabB9v7j88PZ5pp,9915b2dbb382f8ea,cabed427ba316c6f -FBEDVed3uJrNqDDtSumHy9uH8SBEjHIVIIpHzxPkOlTB7RLRZK5OV7Ooi6kbgI1jOrxrSHEhLvSmS43PnfjfYZRR4loLR1V10n8U,a4b5a2eadad2e953,99737018ca2fa11d -urgRbeCa0UFWmnGxu10sacmroiSgL4RtPC5SVTWrdguoInvpfUEkISeEiAvvcjsvQzqJ6aIdpYSfF9f9KsjShcjBqw2JWbHKlspAP8Tev7Y4r3Al9hu67QxXBKY8fv8fYCwDlKFQKZ1i3WSDvgFztIYG5GEq7dkdHFu7tQ93vg5ecqVrqhyVQCTY4dHp2F7Vm8uQbkvQfqGQUkX6032ZKzzm4mt7OwynxC5nDRjgnpw10A5lFEtss4M8w3RCxlXVWDOY5Zsfq0k0EJJBahYdn498WoGnYmMDVU1oNfRZCSRF8B575VQYRQxfChD8R,62c4f30dc859bcb4,9b9cbb444ad47e51 -KNeKPs9Y1h2K9yrgptN5HE1ylQaLeOJ3NMzyoBRpXPXCdi7WEHjhLmdmtVwN9bfA6yOrAWAqSa4Bvi3tpXKkOPSc3ABUikVuqEmINHPZ9DyquM1OG3Q0VQPecC8JZImg9Pi3d8Hz3JOfCu6TcRpvbWojkzgnLBFPCsnkNuDuQf0QYJooN,209613f3473716bf,a0f84c8c35a5f365 -l4Oyc7XzHaAdbp6yOYwXYknnJKfqgGD07QFBab95GBzDOReIXuU5BSfg2H8pAOqiRALjOayOluFKfhmEAkP0HZfO2WCfGahDeXNIFBQI5jzV4hDP6L04FZ9g1iR8B22OQYeetMqc5PiMlMxaBHo0TjX2AA8z94NqDUUt4CfObjlkOzzhLpq2MFSVOYVkwJyOLtFScJfmnqVw5vWC08yzvs5Cv13q0xOEFRqFPYrZFPng68uvN7jfqEY1ADR421ykg6ouY1vHMKAywCjhL4A0JtMXUZlR8SY7me8CkfNkJC2QrMRtHnkhJiPLIPd2ViJtao32GKGTiZMGwrKTjkIXgFSYYwgj07zkBPoeHzgVvcfkgiao5I4VsfioMwD67MXmIE2YKlCHMdiO7QCuTDsctimcVMxHZOV655OMZdwOJw7ifEuA0ICDZpcxGdbiZtvh3ua9HeFyu6yEXTWZIIPZmz5F6iqId3GUPqvBeqfQj5ttVtUXQ0AoRnvW0VZ32Cjj75j8MvUk3NDYWhI1G0rZnhoLFf1GydQTFiifhrBa7XAc2mB3qqwIPchKfIcoF9nZCQg5zPwyidMVKtJOlhmMJcy98PgJcFERCiQvKuQYszZuxm6NdSIgi4bQUwza8z0g2OGVaywkjIuifYcv4YbYtFIaemtrnwBBv7ha8MDoxC1Tv1Ol9kgFW6bJr2CDI9tFz581auJbxy4s1xRyHCYJUZy70FKAQgzn6Ws2TpT3b11gFBE2blAlZlFgPozWrIiAYV84oKIMJIvk4gsL54mPe7Neu7boRq3EYlDna2DwliRdvuqnMvRo2fRcg6TkwHryiAK2T4aG87Y5kVsQHNUyt8PYauhB0v2sAf7Zu2f9DrIKaJPbJs,355d9caa12901eda,304f7c26bc1aab99 -qjxh0bkyUpMB0sJGuE56HnKkrgXhUjCNxb3VmEoAGA,3152aa72a4416006,ac569aa35a3c28b9 -N1O7SMRdg7Ts7P4ky9rJnb1Fc3CDcBcCkQmz7ZOymEcOzSA6kHNTZD0OaQRsQGuqyEFbRthg4k9FhA9ySi0Kgzz0XaCPEpvG504aPiJRYLiGNjJ0ljw4RRtmZiNpOVw4V49Kpsev8zXYxhlYTkOCONccZvw4rgsRbTNblWyfFytB6yH67dZ2D5sIXwcg1Vn6mXvOBO7w5IupyECNTyWI70ToruvtTDEFM6zjEf9ANGm1N,d0d11e4153a385af,50bb066750d3ba79 -j38Bu6B9siW8yfjCIspIbLMozvgBg3RQOPckr3HACikTxlsqQo4CKE6PdPSos16q8gqWqoKNau3V6AUSHWppRCulmKAYs8UPhXxClkOv61ephw5jsCRz1d8iJscWi7j1GCby93TQXg5hh55swe2f8IZjaehV5S719rplvLNwxdtxx72WF0YVDC03MgZEu5orsElUnJ1XHo23Vvcgy0Ae3pQlTBQfUe71bCoVB0FHIYN4cQh2M5vb1SsvsHpprj1p0m9ZmALJ3BadSquWN5eUY6YoEJ4spLHLoDpvxlBca5RSVyVQCW72M8VtXkukXGaLhtgZHxZFlvxlwKAWqa5oDDMIXrHCLchWwsT95CVvLpMPQoFap4Qh6MNlmCNXPORxJVL8iFIPOoNjI5IYd9sWINola0d2pEwyrWuj0NobCz3MPaoqJl1zgQ9Z7QMPkDvu4xMo7e0vtVtt3R1CseL7dekO20Ys1VZadVNXMuNk1LPhpSCtoi4fUTEgqgv0nZgTin1bmZ5XuViaq4oZZ2otzTmwviWLMe199xITVOi8mijIBgRXNREtsbrwjnd6LIkS5MB3sVzku9588a3Y3SctmQMoJ5ry0ZcZtK2yOIIEuIPog9R6wd5SkuAaOIGwVnhEh3L0IoCM9lE7cY4MKTsnXy8G88kmCkWRzLyYV2ZJhrzbfxE5NG0AipTjxDEfRt9shrEK3arw5ZZNTmQs25mOddt5PC6z,4358a9f41856a0c9,845080d5ffdd7e1c -OJOhbPZpEyHZwW6vNjebg3m2llbbdJKB9e1NLgcQ8nI7vp4HfEiFjjKP8hT83CovxsNmHsYwuC171UdY8nQN1scLh1lYO3,e80ff285bc38fe0e,5c355900ae58a779 -UOm6SPvbylYDbKZCqvz7VImTp9zQ1eXLnraDYOY,9229b339bc02037c,4beef0879b0438d2 -fWV3sm1BzxwSzyaXRqop8pj7kC3dMyO9gEn3ucaPTtweikBeMXHEDvwFwFBkh6QnqNd2XUDh98KQ4cygTKBSYHDLE0PfsOLnTKRCmges7gFBxbSRIutrBTCuJufbYnRv38tsyLMMOPBuN3wnTkM61YOwAajzlbFB4d5fTxAfccuzVtplfiOdafQehmtLnfLyEuM4xcK67oI5nZVabFnj7MS7NBiJW3u8w5Dc9OskqX3OL7i1Qj1yGPO8UJqKiPYPGYYQj9h2XtDP8kwR61szpoTZJNr7aziB2KayqCvbCHkS86Y5ZrjVof8Ko9Qkn999LtfgPsMku4Ut8StdPnFkuzR3Or0ApACF4t2yXd1i1cEJRbEhbWAxtjGAuJUw9FeCjXU5Qdwl1KqnbgZSiOBNuy6rBbG2BRDP5HzQyXkeQPbYQ7WXJ8JFjLm9wZYUXlI6zXXApVW0rBNLHgBOPkt09b4Eitb3RJ4pXP4ZlbLjD7aTAjIuwBd49Di79iS,52526c402826bb05,c5c42e9c8c7eac69 -EU4Gv5RBpjTKbMejIP7g2qNxD4SPGROwJ1N5OeyA0n0JIVVfuu4aGjThQ1zlYQdTrwgDm9RQGQ5mPm6Y48hXu5bGInVwZWZnhZPJCylTp1o3HLlFGYAOkSCg8NvCt0vE8iYjmYiBN8twjUscBtxbubwSwcZyiYNkLCGjq7uLZdCHmMfL8b6TyAmYWe7eAr03DzWRRbXkAS6H0cHkgdnKYtld4kFDvGxmvNpX44Hhol7ZFDqQUBwydeJSGdh1rInMuf15F0S7s1KG5lzwJDdKSFap3Uc4tthX4wuWvvDotUaBGgQbv6DxGiVH7iaWf2u31ZSUxfRSza75j27oQBd1dObfeheyND3teNIZN6tEVelPui9nAacym46u88fjboZX0XQ3jpvClGh2jnlKCOFXJcRKNTXpFJWOqIC20m8saGqe8dQIlSY1Je0IkrCQMnWAsWOqBPwOHGyOEV03IYY4GRwBDQYnoRbSu5Z1i8V7tDsE2Iz7lpPKBre218BrW1llp0L2tWJ8dmJDuitUKeBKh1EVHtWAmcOm7yo92wMo6Y5AvjzfjSly31xOvHCznmtylroQt4UzryJb15g2BLykAchbctHKLJuQR7qqFDIlQ0aAcZ93GFTLPLtcMseMqmD9ZukxstLdgnQuwh9BobbttKGW9W4ulXupP0WQwRv0ghNCbNVRclZP46H1mKKT8pCd4iG3otBDXdxYL0sVCS3cOikBzsu6utdxbmpXE3kXdttjceAbXGdPTuTbHcx9RJEF72a4cCRv7mIlACgn0E3ves65ri17312Zc8Yx3mnQsl6arN6BBsx284dOPfVREzCYgvaACz8vDydmlNZxQStOfMy2AvsJHSVRELsZfnv18wZFp4WRB50EZoCTBaEziefWVJwPQjB6WmtfzF0TuyeSsSQzytTh8dGlKBDFnANnQgVFO6fbA6H44JFvNsFoNK3CxXcsSTRIB479Nn7tWEMBMf3dLBleXRzAVUIGXcXf,abb7a9b67cb0f92b,4593534c9e2a0b82 -QHZYVK41YOnjYw5rQ8iaW7Sxeva2O7VBpmSNsCYFLtglweRWVfVlvGKPiis2QTMkstrKCFBA8sjVEiBd65daSbGla9NxHQTi58hNs4eJiCsQRXFTfLvXfAGSNFxecWIoQyFxJSXDT2YETbj3oDzRai9LPmHZ4GaOyZdAnNiDdBFmLODwX4CjKBB33MTmfhRmmFvrGmxqlGQU7hM2B6atGODIlNxrhfExtAmUsbAYjl0yCY8LxzbuYFzXP6eTyKC3UmogB8hU214fqTYte1RRlfB3uR1ss6TxO6HEnOtj0Qpha4gIaSMCmTYzy7vctW6mlVRxiwcrGz0LBM23uqJvkPPWfshEzVcizcW4OMkhE9QyYmdmNBiJRWTguYMHIS9EdyR2uYrOGqw7eDAudN6FA9ggCxBKr2hiRf5kibjDAt0vJTknTyNk6XKjoL5MQ1vof3LHaC13bYrG54kNxkf284uKjw8WdrheczB5n7RLC6Nm1w6oV7wZF1sboTrhQ1Ms62cheA4mO6BVGKnk0t3KMjp1CQjOQhImGWkWsxRBlnIZYWpY4zTmsZ6OZLhEOwsOoQ9MT5xlX0nP2NhJUnFug2EAcdafx6cl68dvRcmSYn9igofKxTRMWG4f57l,f39b46c146738cbe,edf6d6ff4354e70e -0R96xjB0wVnZxyYuQLl2ZuRYFulmVABKGYEZXy4YwHVipwes1c6OlpRr1xLabH3NwQrXQbWmtrtGlphH9XvO8JdHgi2fL0Xh2NI9ZWWEx0wKlChjGXlW8s9zUN6KZMC0iCknCiy9gZ6tBuFVpBkvFvOf6ZV2ouredXSkc2kCNCPfc1NRQxmjZM0CY2M2vf7N7EeK86NRhlFQFVQdBGfNP2qsJw3AtAnfdyOjHPhJLX92CM3b8LUjzLRUJce1USoZM2VXYYV1HCqlIyqVKihf08PpUmdmmTVSag2IyszxDB,921f8a595203d901,b4493febe45c9700 -vEme7uBoaJZOs0q8CIWEdRc7SCgXEBKxRO5aOVEYqNNjhi4TUefiwAzwbPOnQHtNo3X1A2Pd5eZ8ym4LQUoJ7YCjcesGVHFPTdaGtUZDR5GBHQoJkXMGhWkWFEB28Bj98BXLuoPZhVRwjq536JlabWSli8S501TOw1SS5c0BIKwrz0bDFSRUZtq1Gm3ppSmoAp9qofTmHEEbTv06TDH9PAd8Xj57NAMXTqmq11OMtmlwxXD6WFXQhQftE3bS3CsdIsODyovjmsKNU4Wahem,bec3ca58cbb0d02c,3c728c2a7659f252 -Z57r4g36kr1G8GFMHt57i8hqFPctDWRCiiSkV93FVyetQKEVXBr7cuhTPklB70YA1FBULDRMR8dxQOALb0HjojL35X58EvqAC2nMA3NQBjP2jlVah9qMdSFWxMOmGohy8HVjZQIZ5truqkQ5sz5OUzXLUGSQ0l3DSXQXDEPzfI331Uw9cvG4HOT52tgvqP6zACDrmXXkClHJXxFp6J3ykFsQweSvcmcizgHmxFRLiPATIObwzNSNkr2MsDqqKCEWqMvKf7WSi4nxRR5xpr7YUjMGFu1pa27OQ6T2JOlc6mqBXodegFxR41WPbOXpcldtt2SzYAlZMKtR3kYhQMIbQ0ZnHd556sbf03DvLvYv1osz1fKAlHxyRoECZ2iuPca6ULqBl5XPVGDJUjljeSRPnef0xpzOYQIuFhbFqkYoSZRqIk8tnVJJCYW72tJLsXPbyBBVNc1O0VaPaixQTXGIvJWa5a6GsqAyOgcrmDJrqwSBUiJTSQygDJR0McmBlVKLzQZMxh3XDNfyixgEt4N2J,746ae4e39a55ff52,89fd9de42addf617 -0mO6VcrjonSbUnKyIbPIVVtGwiqDn6jLXL9hTxWvIFwUxl9bSPVJm94o3GoabSFZi2X1fO4PaAild4utFvjqtuaGrbUNFA5u7QxrjpSzuE0q2J7NPISId35mqd3pKfmIsXSTrU6g3Sq4PPSQiq2ERsgUn3sKrCmA8KpQ4OgaUouYZcGzgSRzC1yCx5sbmuEsuSJYLp95Xxq8HIqXLAEK43TJPY5uX5NxaF3mSwZpiz6oJHHZo1CHjRTBN2VN9MkQuK3573aDV1z9KulCvIanDWTeA0eZldEgPq9Fjk5mhvxCn3Tu0mrsBHtobAWV3zVcJzTHBB3vug1L7uLT8VOvhDt3Qgk4WMfQeukkwNGmmPdYms6Te8OT2sjTe47tKR8SD5A4Uzq13PEXQbcHfEyPKdEpfW7iWXHdnPEsGgmSqJBKVwjPiopMgNySf0sYyHZ8YwziK8WAjS6VPxyYPrP0UIWlqspcKWd51HcniUnFYk7m7qYivTSepouFE732iWIIPATVSulvGq5ELkoptTy1QdaSFCBHtl2nAd0kUNNOm80r4DHwhwXnLNrKp0O5HUv1CsDu4R0VkZvZ7NXKb3MXJ4Hk6McXVXuPEvzA5m6JA5ubW3PoUxgx4INkk7k5DNjLef4CVKErmsyxvd4t4pYoxmbHBEvUk3MX5KW43smgJxoKz9mP6B6l2c7YqG7vsbFFa9cV2wWxYD4o1PuzIgaZoqmoprgf1DktxT6lzfhP62m21vX2KYd2PzJSyVybt1elMoLw,43afe40b75d099a0,142627aa3b6e813f -q3sNpfh2ODbWA6tBY,9faa7745b1ecb4d4,1c4b3e34c59e613 -FuypnX3IpO8Nhf3cVgrpGUeVXbBtyiNPBROpXwusZBX24mTTNpachIIThsuauH5h4hhAPGw9KPN6WUqBYlmOlU7RFEeuP8BWIjp31UY5bZ6bVJYhaaRY6bhVLioQmVQQZki6IM6DHJg7KxjnUORgwUxQiUodEKkiegGu5pEOA59KdmrnK064WeXSQtuBMUfgNTQqtU17GMGZXZbJXMzGO6bWXzRrdUMlO7d3Lre9g8OGKYDnDEyvRB2p9Po29fZl8rcRh4g18yF4dDUllgQdSJ27WdusLD3xjmSl7ss347xtw6SY6ME7SNE165h04CXjdky8OD1omzE3RIW7ZliGJYKRvGhXISPNFnINHmor7OZMZ6SLprI31Gli0K2vupIz0BDLCnimaCT1FTP4ZnkV4S8CI3rvvDAg4,a224dc6427844d19,3b019dbc47ee29a7 -V45xzhiPYGW5KyWs8nRIaqkDEdvRbbUl7dGe7jG26uIhNS0QOPNG3yI1OwLwpBrMGexf9Ww96vTw4lpOVnhsQd0Rj8eOGrBSv9uRVWApUvrv86iYNBPhdvbCKgaUk75oHJfDgvoFna96wVG4xO6Yf7JDbPNM3inGTntuBGsvCCsOE56hw7Ww8UI1CHAQfWPlQWXu1JoNmbTsTIrYaQ63c9brzzm0vW8orAFw3NgpaT19DbLvuhwAegkBuGEM6O6YVmwpOrLKLcrg1AhiYYvWTZXDLuvcnr15M1D58bhrf086CHqtUChWydySsPKObmRhgum2WUlEwff6gtzSWAsdQMCCPepNpai4EcbcaxNySRxIZICvdymKjnjAsiLruchIbxq6N5v3GAw2IfA7taPgCpgpaz8cZGbKfqDCndCKnc9Zu9I1hrXXWUGpDd3Ye7aWCVD4zyDcylYmMpvJjsg8OEvGz4S1pYYoNVw3oL3vS3NQqom28oYGB33XOejj0NxqVHlLwBc4BFf4ohohp75fRSe9exDHNOsP3Ri0xRjgYpW4SJ1T1KOiPUh8u2NJawJzVFayGGNnV1Je5LWfLqVxtnOVlHGEZZnC4lEclp0k9Aac05jp5LDSLkNRGCmkSRPwZLRjrtgUDdOJLR2ii6G0QadRST59h3keqjhUDS7Tpvd9m9A4W6jyZkevYn44aln6EqSuEni8YyvBrf9I6zeCLYEDPlXyBUSZngx3s7DrGLsi7bV7y5zPiLiX1lDQPvu0B1e831yhMl9bLDekY5P0Mgym,35616b22db9a7895,7456cf8858cc236e -SyEdYY9uGKWuBcgYEH1juo2JUUJPJ2EqAZqrseikGVx1NSAdfCpUrZJAqv65kzSJlwm9AXeCelsyFDPjATV3NA78CjXjgXhgdBQPIiI2pUZgBrwOoeHgIILFkgrpnaZg478a8OmoF4oVhSspYijikq2bWslG0qbW2N16tiXccTqhQH7XstnGghkMNZ3CgXKmoY2rSzciO9Syfo83v3h8OI2XmePBmd8Cw3S1c3nUhPb9jSg3BiLSNzldqb3vF1sdzR6Jkyt7SaAUh2y4mDqp9Ys3zxrGdOzobDr0Sx7Cq01CgQtklkXXhKZPGLPQONxsQ2KMVyzQXAqC6gbbkp4BF2uwpqJivu8y7YzINwEekwYoBPc3zACBcvRQwU32K6ozoJpeJ0wWoSluo0IhSbF9NKdXikYw3PnpU7U03XnDUoPVInMKRGYvBMB741K0O6mgKJzKkSIoo8l8Bub0EMO0JOfH9IV4C0PtvrNSOlTa6a7Oy9OcclqFqkoomenj403BspesFi1FNDDbDfk44OxuYUNsxz0uY1zpLxKGGcZEiKGOdTzVZ2hzVpYq8sS0oxcemVjOwZIpOhhqhTg6Uo0bCyWUSehrsDtBpIIcyP01oASQv6zCXGMtbHiAKA3HOVdbM4BLyFeA4r4LACDtuOdVwZsGfT4LxJ08lrmWTRGogseI6Q408AFt2jyJ9H2aLgVbx3leKiUoVowC2eZvYn7qWO8h7E8ynjDfJR2b6W8Nd9DEwxm0mPWsmrsyAsYWSuTegyt8uzaRFpyXU4pClvSIjho9XvYKPCxh0Vd9X61Wm6QKpRcKk9NDyYZ4eTF6F37XqzFUv3TH4uUgXKCaqFRiXNms5qnxqd4VDduF1gHKMWiRY5,a6fc506bfef84b37,8d4cf9f206bbc66a -Zv6jRiUa1TbavscAxeggvqo2dRdF7bvQ5w5ilClkqmfLGxORnjwROmtKMLop4D5nMECboSDb0e2LuXRfP9QpzgxxPYvMwExDJE00cuPKzDpRerLWNvMWE39qlHt9ooS1XmB8YupxQjZsQ03q1rHOpRiILwTtsKucFtvlTTpzvYt8kLudXsbIMLz6OCprkXIr9mfgG6IitGaeQln3JEl8aUWZ7H7OPBhl2KPY7PkxCJkLiKUPsYR4elh5f4MphA1R485L1uN6yz7ZlUNYoEreDkWmAoZicx1a3gdeDbtERNmBOx4GnVj5B3lEAuiV1Gz0uPOkzTlJ1J0aDtXZjhM0EDxhUzoQ20Ch0FrGtm1VKxGklHn7FD4Y4H7Djfq10YzHYzw0lKLPCclsy7VDKsi5wbT0D0K0qzgcVL1IwXLR6QTMY3PJOs9sllU1BuS1gGsvvzoTp9WGPTuHX6qCTeeF8qAfoQfXmPV9dwz3pNlODdd0sAWrc7CDQCjJqNj3rDyzdPCfKuRlOWN4Xy2RRXn0Dqgrcl8qjalOvIvv7ZEVDzMf5I9loMUoqxwAPbqsPsp30m9g3PtaAol5fD8nYDloi4GttP88PIvl6VZ8UZWp3T1AXi8TGRbGCVJnSfACOWNBNmY1x8pUnnfrP9TVJwoANCrB4pQlMRRpmNqi1hFht2iaRNyCOC4MPbSzQSY86doKuXq9DYFLWBeOGWBb7qyhzh5Brka92eGBrKJouR6yC9gB7kmhcQTNCnIgFOm3IJCohqt2jV6GFFiGgyrJMp9simugAVSWcCQRdjKbzXAC81lnfrlkgHFTp4geC2EW98S2vbC7kk4nnBhzFFbmwzDqwlNxAtVJw,3cf42ec71cf71946,7b9d1804896f547b -ryHMXLkQ4W5WeEHYXXIfw8z9EuXEqgrQx3UQo4BTkFIHXlqkaFnUPautIuuTgVTe1p9t645BxnPVYqPL1p5D6mVoZaX9HzGiOP9FhzQEwRERHP9LqKpURMKKEj4bKWHnE7THA4PdpqZAgghiSCT6U352t0sfBmEMG4kHFhc4ngq8wOTxlF5QTyM5pAIgzfCuZyACoNk7Fu3mzMuzbCsjb0SXB3Iu872FbFjujlywhUZw1Oivi1g3dew1mUhbFAhuECMbUhflyHigeDEnxYlxeMzTg92f3tRjiZUTTTHgR78KNEU0Val622C4baoJeaBnJZRStzeAUpieXxcK6DYHvWqltBjMXQKzoFM8BkHXotZgFkPDXbC4tHJthDxuCWO53HxFM2PUFdw7jQUfgkY165lvy1ncvZQy0niWrTXlF24PKxweRSiTOxWFPXFJnqO0It6WDNeAnThqpSaGXpjLeqLGYN8YhrBBB4pbpZhDL4tm0Ry9xeg8owOTY9IRHoora3rGtULjtQvzeY6FCfncr9Yx5qT2ZppGF63mrIM57PtmU8j3XfP1vgtdNCcuoYiEJzKs9njuixIaMYgasQXuN9Idux5Jl6zt8Ls0vBYAwqIadivHRn673o3HOEkhEgLWFvsKRF4QUAn2MkculFHwxBmzlmAqaAHVrLQf21aKag3J20igUnwrgVwZLj1r5TO28zbxLu6GnTWE9kASuWxPYuVVj2INKdJnoZpMOUzFPg4fsH1qXdOQv2Q8sU,411d61b61332e5f,fe66093545efef0d -qBrE6ALpQK5EzRAzoTDVn29iND12yLECvjjyU4BdPmFCqRDuENFnc8IpCQ50ltOLZkRubLlR4qvfvHIbiYzmLmE13AYZDjbLfNCKgXstNeHTdgqzRI7ALlWqLWKCPFjSAB76FYZ06pzHMVBpUFKFpDqj8THw8fp2Dk3G5fWFVQ42brX17PQZfMO6UYhy8ZBMBq03pmKj2m922dvipOaRJfMgMH7W,aef0b9ad438c63d5,8d5dfe5be7a7e966 -rYcM4cNKZfjXEtzaB2nuOowsNqLgq6Bp2Rp9zuaSMXGCImIZl46YhpMhS8q7WGNXmfzxhIqVJfXWRDofJVR0haYRHseOWxg7OpwEgKP9UPQdNaBiLEN1dxF4ghjtyHZ4s5Lf9yy576C5OlZNlnXXwIeTE3xEi3PD8PIxNnCdp4hUdLVBDL8kgYmSA9r5D86dRQG5JjlWV8Kyexq933W6cXxIkmaZSfxRHzkHqp3NbDVIugYBJHdrHGqF6tSxB4hSAlmTXMCg0u0hv1bWMsTVAEe9W8ao3lGwy05C8KXM3f8c7MlZNZr1EfpyXWG7AnKhYSUyWVbGOfcEQchnI2uTPtYsDXstJOCnJgR22wy0Btr53F84HFjWWnZO4K8mvfhgcr3857hqCYCnUb3VmGWaP0ciuDwjaqUFABi1ANReRFVDNh6fIpuhjykPsnHtOxinRvHt00lJxchLjkCS1OKIzFIGXksWteG92WlqgwxAZPvAtmYcwParfmyQprlVkq7YQroPONCvvfsJO9LGCRBC9YQsZfnPBiz9GtFPXmKpLlZHzS8by9oDEwLMSpodiCCz8QqL8fUDI3MtPt,e152554306a86a25,d2ee1455f7680520 -nYUkHfL,1a5dcb41c6c5af4b,6e6fb2894e712ca0 -ODqNrrC6PexELj9pJheubOaUrA3vCr0JeV71YfzauoJfH8kiqsfVCOV5Cb9RcALM43W2lwX2MmVNQ1906lVf5gmmsslm5aq2BDhtV8jiFOTjxXqNXh9vCRYGmUcQpG1gLmeQ0GmRBYZSUfB5koQvy3PDY8T06SbSbKb9BSgi6YnvE35oVmZRNc5C2pGOyrVC1io64i7fp4ht9NWEHYgwmC1HA7EEVXaUvZj8val3xw2MS82BHyuwlkWyJUs9mzvCK4ui2HbkthRhhtWoauq2w4JaDMpUxWIvEke051ISHIqghwKGN06Qth7PwIxgxrIy81MpSxXX3rSesJMqkIPJabFoHT96UKX1wCX095aaZITRAgZIgmjcZ9wak1CedFmKQcQpXmyLrj4oueRjMBWiktgSyAjgsQ80ac7MyCH51PExBH52q3xn0pp7hzTPEc7GpZ8sAMIYqZsNpslNaLvqfCoVl85AWmW35iMATwQfnVXZJ2rKEQFhO6wFJvLnrF8xcHPFAI213OrPM6stN5elSEZQDzgTh6qbAfcM49GOwwr4W0lCaawOwfXxx3v8nw699O8KLJ1jcVp4F4Fpdiez3UbnzezoUBTwmbI6XOfWJ9qNu7atbrHJKxp45Uhbb12aeUzpIukFCCk2ic7iHlrEAKNGXPl3BSmWw27IlUxsyzcAGFw3Sk1hDEg6LtP9wIpbmC38kKCbN2LV4ShNqNEzIXWnYFqKSZnSDxkKEG02wBHm62NEQmZ31OD3HGkQNDpKSWmXkIbSacYAvdvAGjDIDNmNFN8Eg51gpUbxJ6zUmvfM7LRuXxa1W7JjLNSPXMzxBdrB1hcwTtQ3522RRs7f2OcRcuHhx4A4yIkV9oiLTKaf7W5YSlNgxyPZhPJlINGd,1147ef0905ddc8e0,4b59ebe4145bff8d -RUCkAL6LeZvWjHOKjLIbCtritLKd7evgLQPULvxZp6o6L5V3pgYlz2OT5jgWxLIvrVwoNjEQLoMR6ICzeJX6MFoMO4sztQNjPDjuOf2C7MjC7N4CKX1GTQieSHMJSJKBvNcEcGf9tbZX9h9dtZWlJBmpD8ZddRWteai1iUC1a5ECDB0jtlayMED2lwER7KUFiFDkfo25vzatl5y1Vu4e6GSpCnfU7e6nAMk862OQyOZ8XkiuhkweWUfx6dw4uJRudTNchXFkdXwc8AiG0Sqt36MeRpifKtuuGzo2NNRVfa2V26wsItN4GPFB5FD4L53uscI4syP1iuddsMjzC8WXVLD9pxIbY4AWmkHMjDLG6hvYbgPGCkpBMRotyEO60F8nMIoPPNgNcuWNjZ4xA9a4XighSeOg8SsdUGLHnNH0Pq8QBi6e9RMwguO3ukd9ptPZfK3ek9yaMbTFMkczzw1WcJTKZJBSnM4O77FHZ7rCsaGsDT723Yz5ErT1h70IVhLjZLvEUj2UYu69wQ7BSjt3YVf3v7bsAnx0V1yCl3FU5mPnTMA4juSsFyoiWOOB2YziTGnR7l3pt6PJwH7qx1W2Z2RKwWowm0qjkouJPgyHvKehtWpFYGbZFWjSeGic7ebEjzowrngscnHm1FQL51fpdyk0uKuX0eHxfzhr3ZIDEfvuUofRCf2qKSgCuQqnYCzATjMp7Km9povpiYVsKLnyMf2mkFi7d2BKlRwgiEhwwyoliTLUpco44tRU1Qg4UvEXRKUNiXZcLK4hyrIwSJ74tLU9Ut8twOxbOfYLm6weHUfmL8Wjgsc56GsDdCIXImWw4nCeVPCiMGHqA5NQAMpL11U3EQuONmlhBUMItq,4df4576afa0a91e5,4bf3542b6b8ec8c7 -kBO9JVZLrKvNO9nU9GhLoidHnLX6pfN5wS6frdUT22nrhq4acFXXqjJwGj0MUl7gAewHoxnG5va2rg8qgXaiLZ85SVzyC6ZrEUcpDwFrVFaegbFv9yBZM2p97jxEHiGTKlVhLYqbJzUr0VczEUwihj1YbSPu9d5Tg81JRqsXYZjO9Pgkp8HERmFlMdM9FK3r3swoILsoi37ekPqZRvnG1Bk0cgxRu3FBnAAC17RDKf2yKeNftZjKqfVqP5Oo4tvHSjt2238teGSpmxUy56IMXnRWOGdGQmLX8cF9nFRyPo0aTC9Q0ll7VyVRIP2EsRkLl9PoOi2Z446LgCR8WzwsxbXoRhyJJ0L1nIYxvoFuseYnkYSyodMSXThXV4bB4jLUhuwoEJf0Td4YEAp4i4Mv4PptnmftuiL9LNnOsBTeveGkV1olyp6KFc9ay6TCDNCJrJrTsnLmeNRLFQPpUExRj3lmD1x4F1JixXH923Pslt2CYuQP5xkYTmZiKBWZrHBgHHMK8IBE424Jwy6GixeWsb1KgxPBzzZklFPJYp7gtOyEe7srsmXF8TFHJxFEGGePr3DSHwVdj61jChjJBUd42CzVDW1YRAihzisbxQ32Y5nY6tkNRxUmiiYylMzmPktyXxHQekl8e89R8RzoIzy5OBOitY8fbD78mKNcMLvgMc4loUg22EZ1MKBoXXQGyrUlsdGYCR89W16eyReFrtyxRNkOiHjrDg1q8Jx6YuUZEZOytObIhHOkcyNQceAtookIBsaCjOfktD66T5LvexmKQvIWaiwwgdWaLNs2CJGPjsCBwbnyCtiHMZYLX12nt8TNo5HewGa02UidZsEZhHyEeh8ZrqXD5HQ718TWHI029MBK82NSV,cc1bc28ce6855105,802d37e5017ce5ff -IrgyPqRizFdJIQes3KSM9OQUtzjqPnXxnLWuTEi5cI2T7l1wVEiR6082rKzIJyeFTZH9w38o1QaBD5OJOj7AcnKbRF6BK7vAxL1gQDvcwU4jKGzgWaVUxH4henACANbqRKxtNDB95sTAwIQUXUZjQrz6Jd7vmuWgGabJ5jZTPjZcHsDvUDOoYN60BdIG2ESQAsuiPCNba8A2q26Zkuo7c8mIdrcPkpUphvfNl9EUdagHHJXf0m6E5qEFeINSBvvxte3OvWn0iw24FcyILAlY1CcaqsrpvxELmQl3fqGYeKj54M63dlUljw0F7aY5W7pSp3XZc926kAVEhUshM5TpnZzCXB4UCWeSeGFXPA85SorymqME50qPNpngyHSjVmDzgldir4eBB95InerVBaQ8DBUK6xjRXbxHL13zuH8GT5W8JGXaWkYfNrkk8IwwfVQNBoAYTM5kJ341fxBGisHGLJfuYtJxiouCLLRF6HGFJd1K7JeXXDUToveWZ0CskpcLBLeJe4c8fWO3r9hz7JxjUQIXAHaipUoHGLIHL8YnvX6PXROO6Pj,d4d6b66a9e342fb6,a14ca7b7a0609ba2 -y9XXfhUnXcQqVPw7JyhNufBwP3bzC6R9jxm1xEwEXJ2ktIxcZBXpOIza9ASxmLoVPuAypkX2Ma3Wega4i7wmMCZo82OXsS1aFhtwrq1wxCgKUYEf3tTVusNcfOqmnwfEiVu1iVkSGBrrODYCGjGSWyxnavq8u6jd8IIS9ZzflbhdjUapYa4TKSWlrqsWplNjwIgQXjsDiWFaaLzh2BUWnfijJA5KxAdjeryGJx5MJ981Dp998JpGjGMwcQMKAUP4Oi2xQpouPBv1vlW8IyRA02yF04WKrURauDe8N2B0EB5W2kGW8zyXE4xqIPr8vgd4K91tVmC1nNrEo1ABUpEpC0BVivz6M5biECYNGDa5ahgd66xw1ZLm5AIA7vVhR76MvHHXAssQsEqnHc3dwvecpgYabV2G28Eh4MqDFvmbD1I55Qe3iyfw0MDA7dYRq4tVocLhsf3TfesyY0aWQUqHh7lWJsLJhJNz2uMDgAQvevgFiAq5tNGkNvVfYqbt7PKO5sAFyu1q0O6cVyahucjJf4ZTftrhddZbpj7COIQvwPO6l1AVMfcJcCOfkP3ApA9r0Je71X2eSxcnHCqshQ3OOweOAaD016rXY3taqLaPd93UR7ykBCSJFH6T2sFC8OQGKIwiy2NRu7uf7AAosPBaylAyvJHGRQtio6V3GwHm27lAsNAwD4if490Ld1LehnNL6eMtDspkm7,1368def5925dd3c5,1afaf0867f4b84c1 -D5ehGgAUsHNr9K0VAUebQ9A3D0DeeEliYDysFz8INhZaIrV6RZ2NrmXe1Ufjs7vIU4IXJVnT51JKEDKpGiTVzJOYP4vjjlh9bPwLn66SUzGGqlkBTcQn35j62g3pRaDL0xAfQ6whK8EaaaEkoNaUH6xqC5asc89NGb7Zli2DcnLKJiOBpkfJ0HO6Nr9wMnGlOkwGT4DQL077YFxFYT1mT1ZU8NhfhTPw9Bo83otW2MPciSJjd0VMDxS5JeTi3f2ft5NJsBzLhgjMiJcaX3ZFsyIQhKxAruNU3,513bb633ea5c62e5,4c67b96e84d86974 -7KTMePOX8GmK4A8sK6Q6jb9rjyPzCNTq6jUxdTyX4nd0NU56CGWnjaIRItvExoBW286Pe1rowVriU7YrU2KoWQmRPMqGOhiTB96O4GBXO9pUE89GXj3tV0krGpVgI0XvKpGw6V5d7eszPaRN2o5K4VUQev8sTooea6NhIhHfB5a9rujycjYfOXgXHYHP1pwXFqTt2AKAWvuqeIRzQmYsKlOyEpjUfg7G8O5riGky65d6jYTIrWbM0u6XHFzqywWFl6v4wCkPoKgPNEaztv9TlHMlFIRfvQt5aXaelNfJ4ENINv21Y9qpNGpLxUHf94Aq9W64whZN06M6QXN4AgL6LxTQayRJf6nBUB8taKokZy1q5LihcGgJ2bSNRMYGeDlmdJkVgkU9sIKI78WEEIhnrGK3eIRORgkBCPXbOEJSrZyXGhp2nqVgUjsImshsFTHh9ON6B7Nql,feca9b9ff615419d,3cc65d657022ad74 -QYIcarOcZERdBLbvvTRjP2Vgfdlu0Z2Wv2IpTFYfC4XdzhjTPFMogKcSP2uSogj9nzCzWLTsmJUrjGJvyw8F5saV42ppzagbWmdo6eqDLtuaCO6alujpZyj8MuAp4uE6cIxeG4v1tJCgO80rF0h7p8ArB7UMvl8kutFFMFTvlWKZ3UDujtECIllcCCK3b3PgX0DIqJ7MMz80OTokpvhIwS30WPOZ7thKD1JmhBIMORCRHHk95D7TMCnVsAK1irwNBFMd5D6lDv9oRjJ0f0g47nmFyub18aV90GSaDqCAl4yucMkr7vrvh9ChXdjWdbWZFVLJUBotiKjOYO68Yl0ctJjEskYy48UGXxpR1hIyNMAAOoaPZW6yguLfHX63Kfn1QlECCt6Uh7DjQ6eEDpLY7FlI8ReHjpYypRl7pWaOlZWoc9oGsJgQa5aweFHOD1S1OYUrwZdwAmrfUW4OYB5JZkXEty8b4lXJhoc3fojbPzkPlclnYO04YddC5ktaXq94CTFashl921ZcRl6GJUwg5VM3uHk8ajdpMond7pFzXDxBILyWCICJYd6Uf8CGaWKUGiHllS0hai1MplvlYV26oaBaMYQUff15dIbHprAlh2akM4FlUFzTcnSi3wmCiiDHhJ6g2rvVgSiuoa2xBfae1JRr9tKHHqYqFK9ByA2uXQqgFFBIqXYXd7Aj0PrM4u9sqwLNNkky2zQGh1W,b555a8e37a739175,2543404b711ed273 -qS0q75sgK2ySMew6Wfksoq96Ym8DxPeAfPjeJkt4NhFHhi6v7o43L00VF3cUru4HZZFiAQAC0fDVlVm4JE3ONmwyt4fipMMaws1QLUE36jUSIqf3394yyigcs1bIEjJYeR8TWr4mOnFm4pue7aK8qcN1eHEhTfARZbUg3X0FEgDP37h9GVu3mKekoqx7DI9CJOeGvpEtKztMkVlyAUGIuZMzFXm2cmG0gmPmxRNxIKYPTwFNfFIirNGiALHCZpfImiHYu0ZJMznJrREtK21JQPqtxzY6v8dqfxnXZzLJEvKgNgzui92Ex8wCXHy8kjZnJoKliEL,9a6229ecd9675ed4,2775622396df7b00 -APS3nO9OjkEX5qcIbn6jJCSpJiBgpTsoD2k45w7TAt3P77ZWbSrwJ3xZLAeJVPxhvzNGfDJFFF5HDTXS6jmPafOaoylHepu9XQlZKJwayuYJ1HSU5fmhwfM1MyuV0HTQnziPKe7EWR288BlstfS0l1AHYJ1bciJfwH07BRRybpSa5a1IWmMziYcodb0cgcyaO8PbDCcrqMsNGEhoVp9quOQt5QqCDyJb,3bccb6fb3282632b,11e58cd7ad4268bc -WuCdsZjrcqdKQdimUPmZJz5DXTn16le8YNEL7m1XBwRVDbwNI1AzPXnc2NObdbkbkEUQ6SAbqyU4u2uualyyHt8TfUDAvlm6q5pXlUhHZCABDG3KJBjcz8rxM2JYVCa6eJrFyv4o5aC077IVFMYRrb03kSxEpNWo0djyvcWcGLYHfRD3pBl0CurmMVbVOKWzd1JPRHIcsTPnTVybzCD6AeCrMARFnEfzgsp9MERbPeTyYVG8kaQIhctw8Pz7DtVGtH3fpH5QkkoElIIACGhwjJpJWkKItG21CpOlWM58XNZQ5Z6grADS2ThqyNRlhirCbC5Cx6nANCXTckm24gXuM67eYPsNPlq9fn6FrBX51BB8gyd4NBgW2vjNVLoSV6fCl1abnEtzK50DicHGbfRsVzfaB5ipkktiBskJXBBG1497PJFQJcwga2OynGc6RmolTPfJ71lpPyOm4q6htW9tv4eKrdN99ww8YJgvPTe8DGB1eKgmYWwiRn1rE3vOV9ywc5qOdeChcsoiXUdiHcU7wEGGFDSt5KhhBwbrmBXoNCxFwzQBVPcKzO8jk4krDAoIJ3Vf8KFakE0zcUrJuVkg1CfMFVU2ynkuVfi0H8DeD8gmjZPUpWot5FVcVXktRMoS7NTjqMcZbi5O2ddO6ivnDBBiTqhoygdkF7UQHalYQ7WAiQa9izz8vMdv9SH2hrAHEhocdRTklW1duXkIRFKoq2tt37XeYDeDeJKPmCWj2P0DUNfXjXJVcKnu4omvAo93FZbII6QqTRTmqoSFHXo30hVa8t9c6gUvMz1iJZyaGdQV4KPjnowig2WEt7QQNO3ibCjys1scEpyDZKER6s8tAWZDRfnrEbmp1ffw6VdcLip3YU0D0WTQTSZcrFRM5S4OJhHHwnAPI2SdnVWn0YwSTMqcu,b40f98693208473e,46e9bbd1bbb83363 diff --git a/vendor/github.com/ClickHouse/clickhouse-go/lib/codegen/nullable_appender/main.go b/vendor/github.com/ClickHouse/clickhouse-go/lib/codegen/nullable_appender/main.go deleted file mode 100644 index aa3d039829..0000000000 --- a/vendor/github.com/ClickHouse/clickhouse-go/lib/codegen/nullable_appender/main.go +++ /dev/null @@ -1,81 +0,0 @@ -package main - -import ( - "flag" - "html/template" - "log" - "os" - "strings" -) - -const tmpl = ` -// DANGER! This code was autogenerated from template by clickhouse-go/lib/codegen/nullable_appender. -// You shouldn't change it manually. -// For more info check clickhouse-go/lib/codegen/nullable_appender/main.go - -package {{.Package}} - -import ( - "fmt" - "net" - "reflect" - "time" -) - -var nullableAppender = map[string]func(v interface{}, slice reflect.Value) (reflect.Value, error){ -{{ range .Types }} - "*{{.}}": func(v interface{}, slice reflect.Value) (reflect.Value, error) { - if v != nil { - v, ok := v.({{.}}) - if !ok { - return slice, fmt.Errorf("cannot assert to type {{.}}") - } - return reflect.Append(slice, reflect.ValueOf(&v)), nil - } - var vNil *{{.}} - return reflect.Append(slice, reflect.ValueOf(vNil)), nil - }, -{{ end }} -} -` - -type values struct { - Package string - Types []string -} - -func main() { - settings := values{ - Types: []string{ - // add new types here that can be null and used with Array(Nullable(T)) - "int8", - "int16", - "int32", - "int64", - "uint8", - "uint16", - "uint32", - "uint64", - "float32", - "float64", - "string", - "time.Time", - "net.IP", - }, - Package: "column", - } - flag.StringVar(&settings.Package, "package", "column", "Package name") - out := flag.String("file", "nullable_appender.go", "Output file") - flag.Parse() - file, err := os.Create(*out) - if err == nil { - defer file.Close() - err = template.Must( - template.New("nullableAppender").Funcs(map[string]interface{}{"toLower": strings.ToLower}).Parse(tmpl), - ).Execute(file, &settings) - } - if err != nil { - log.Panic(err) - } - log.Printf("Nullable appender generated for package %s in file %s", settings.Package, *out) -} diff --git a/vendor/github.com/ClickHouse/clickhouse-go/lib/column/column_benchmark_test.go b/vendor/github.com/ClickHouse/clickhouse-go/lib/column/column_benchmark_test.go deleted file mode 100644 index 4b9a5ac8e5..0000000000 --- a/vendor/github.com/ClickHouse/clickhouse-go/lib/column/column_benchmark_test.go +++ /dev/null @@ -1,282 +0,0 @@ -package column - -import ( - "fmt" - "io/ioutil" - "math" - "net" - "testing" - "time" - - "github.com/ClickHouse/clickhouse-go/lib/binary" -) - -func Benchmark_Column_Int8(b *testing.B) { - var ( - column Int8 - encoder = binary.NewEncoder(ioutil.Discard) - ) - b.ResetTimer() - b.ReportAllocs() - for i := 0; i < b.N; i++ { - if err := column.Write(encoder, int8(math.MaxInt8)); err != nil { - b.Fatal(err) - } - } -} - -func Benchmark_Column_Int16(b *testing.B) { - var ( - column Int16 - encoder = binary.NewEncoder(ioutil.Discard) - ) - b.ResetTimer() - b.ReportAllocs() - for i := 0; i < b.N; i++ { - if err := column.Write(encoder, int16(math.MaxInt16)); err != nil { - b.Fatal(err) - } - } -} - -func Benchmark_Column_Int32(b *testing.B) { - var ( - column Int32 - encoder = binary.NewEncoder(ioutil.Discard) - ) - b.ResetTimer() - b.ReportAllocs() - for i := 0; i < b.N; i++ { - if err := column.Write(encoder, int32(math.MaxInt32)); err != nil { - b.Fatal(err) - } - } -} - -func Benchmark_Column_Int64(b *testing.B) { - var ( - column Int64 - encoder = binary.NewEncoder(ioutil.Discard) - ) - b.ResetTimer() - b.ReportAllocs() - for i := 0; i < b.N; i++ { - if err := column.Write(encoder, int64(math.MaxInt64)); err != nil { - b.Fatal(err) - } - } -} - -func Benchmark_Column_UInt8(b *testing.B) { - var ( - column UInt8 - encoder = binary.NewEncoder(ioutil.Discard) - ) - b.ResetTimer() - b.ReportAllocs() - for i := 0; i < b.N; i++ { - if err := column.Write(encoder, uint8(math.MaxUint8)); err != nil { - b.Fatal(err) - } - } -} - -func Benchmark_Column_UInt16(b *testing.B) { - var ( - column UInt16 - encoder = binary.NewEncoder(ioutil.Discard) - ) - b.ResetTimer() - b.ReportAllocs() - for i := 0; i < b.N; i++ { - if err := column.Write(encoder, uint16(math.MaxUint16)); err != nil { - b.Fatal(err) - } - } -} - -func Benchmark_Column_UInt32(b *testing.B) { - var ( - column UInt32 - encoder = binary.NewEncoder(ioutil.Discard) - ) - b.ResetTimer() - b.ReportAllocs() - for i := 0; i < b.N; i++ { - if err := column.Write(encoder, uint32(math.MaxUint32)); err != nil { - b.Fatal(err) - } - } -} - -func Benchmark_Column_UInt64(b *testing.B) { - var ( - column UInt64 - encoder = binary.NewEncoder(ioutil.Discard) - ) - b.ResetTimer() - b.ReportAllocs() - for i := 0; i < b.N; i++ { - if err := column.Write(encoder, uint64(math.MaxUint64)); err != nil { - b.Fatal(err) - } - } -} - -func Benchmark_Column_Float32(b *testing.B) { - var ( - column Float32 - encoder = binary.NewEncoder(ioutil.Discard) - ) - b.ResetTimer() - b.ReportAllocs() - for i := 0; i < b.N; i++ { - if err := column.Write(encoder, float32(math.MaxInt32)); err != nil { - b.Fatal(err) - } - } -} - -func Benchmark_Column_Float64(b *testing.B) { - var ( - column Float64 - encoder = binary.NewEncoder(ioutil.Discard) - ) - b.ResetTimer() - b.ReportAllocs() - for i := 0; i < b.N; i++ { - if err := column.Write(encoder, float64(math.MaxInt64)); err != nil { - b.Fatal(err) - } - } -} - -func Benchmark_Column_String(b *testing.B) { - var ( - column String - str = fmt.Sprintf("str_%d", time.Now().Unix()) - encoder = binary.NewEncoder(ioutil.Discard) - ) - b.ResetTimer() - b.ReportAllocs() - for i := 0; i < b.N; i++ { - if err := column.Write(encoder, str); err != nil { - b.Fatal(err) - } - } -} - -func Benchmark_Column_FixedString(b *testing.B) { - var ( - str = []byte(fmt.Sprintf("str_%d", time.Now().Unix())) - column, _ = Factory("", "FixedString(14)", time.Local) - encoder = binary.NewEncoder(ioutil.Discard) - ) - b.ResetTimer() - b.ReportAllocs() - for i := 0; i < b.N; i++ { - if err := column.Write(encoder, str); err != nil { - b.Fatal(err) - } - } -} - -func Benchmark_Column_Enum8(b *testing.B) { - var ( - column, _ = Factory("", "Enum8('A'=1, 'B'=2, 'C'=3)", time.Local) - encoder = binary.NewEncoder(ioutil.Discard) - ) - b.ResetTimer() - b.ReportAllocs() - for i := 0; i < b.N; i++ { - if err := column.Write(encoder, "B"); err != nil { - b.Fatal(err) - } - } -} - -func Benchmark_Column_Enum16(b *testing.B) { - var ( - column, _ = Factory("", "Enum16('A'=1,'B'=2,'C'=3)", time.Local) - encoder = binary.NewEncoder(ioutil.Discard) - ) - b.ResetTimer() - b.ReportAllocs() - for i := 0; i < b.N; i++ { - if err := column.Write(encoder, "B"); err != nil { - b.Fatal(err) - } - } -} - -func Benchmark_Column_Date(b *testing.B) { - var ( - column, _ = Factory("", "Date", time.Local) - encoder = binary.NewEncoder(ioutil.Discard) - timeNow = time.Now() - ) - b.ResetTimer() - b.ReportAllocs() - for i := 0; i < b.N; i++ { - if err := column.Write(encoder, timeNow); err != nil { - b.Fatal(err) - } - } -} - -func Benchmark_Column_DateTime(b *testing.B) { - var ( - column, _ = Factory("", "DateTime", time.Local) - encoder = binary.NewEncoder(ioutil.Discard) - timeNow = time.Now() - ) - b.ResetTimer() - b.ReportAllocs() - for i := 0; i < b.N; i++ { - if err := column.Write(encoder, timeNow); err != nil { - b.Fatal(err) - } - } -} - -func Benchmark_Column_UUID(b *testing.B) { - var ( - column UUID - encoder = binary.NewEncoder(ioutil.Discard) - ) - b.ResetTimer() - b.ReportAllocs() - for i := 0; i < b.N; i++ { - if err := column.Write(encoder, "0492351a-3cb1-4cb5-855f-e0508145a54c"); err != nil { - b.Fatal(err) - } - } -} - -func Benchmark_Column_IP(b *testing.B) { - var ( - encoder = binary.NewEncoder(ioutil.Discard) - column, _ = Factory("", "IPv4", time.Local) - ) - b.ResetTimer() - b.ReportAllocs() - for i := 0; i < b.N; i++ { - if err := column.Write(encoder, net.ParseIP("1.2.3.4")); err != nil { - b.Fatal(err) - } - } -} - -func Benchmark_Column_IP_STRING(b *testing.B) { - var ( - encoder = binary.NewEncoder(ioutil.Discard) - column, _ = Factory("", "IPv4", time.Local) - ) - b.ResetTimer() - b.ReportAllocs() - for i := 0; i < b.N; i++ { - if err := column.Write(encoder, "1.2.3.4"); err != nil { - b.Fatal(err) - } - } -} diff --git a/vendor/github.com/ClickHouse/clickhouse-go/lib/column/column_test.go b/vendor/github.com/ClickHouse/clickhouse-go/lib/column/column_test.go deleted file mode 100644 index 6e1a1d1bca..0000000000 --- a/vendor/github.com/ClickHouse/clickhouse-go/lib/column/column_test.go +++ /dev/null @@ -1,746 +0,0 @@ -package column_test - -import ( - "bytes" - "fmt" - "net" - "reflect" - "testing" - "time" - - "github.com/ClickHouse/clickhouse-go/lib/binary" - columns "github.com/ClickHouse/clickhouse-go/lib/column" - "github.com/stretchr/testify/assert" -) - -func Test_Column_Int8(t *testing.T) { - var ( - buf bytes.Buffer - encoder = binary.NewEncoder(&buf) - decoder = binary.NewDecoder(&buf) - ) - if column, err := columns.Factory("column_name", "Int8", time.Local); assert.NoError(t, err) { - for i := -128; i <= 127; i++ { - if err := column.Write(encoder, int8(i)); assert.NoError(t, err) { - if v, err := column.Read(decoder, false); assert.NoError(t, err) { - assert.Equal(t, int8(i), v) - } - } - } - if assert.Equal(t, "column_name", column.Name()) && assert.Equal(t, "Int8", column.CHType()) { - assert.Equal(t, reflect.Int8, column.ScanType().Kind()) - } - if err := column.Write(encoder, int16(0)); assert.Error(t, err) { - if e, ok := err.(*columns.ErrUnexpectedType); assert.True(t, ok) { - assert.Equal(t, int16(0), e.T) - } - } - } -} - -func Test_Column_Int16(t *testing.T) { - var ( - buf bytes.Buffer - encoder = binary.NewEncoder(&buf) - decoder = binary.NewDecoder(&buf) - ) - if column, err := columns.Factory("column_name", "Int16", time.Local); assert.NoError(t, err) { - for i := -32768; i <= 32767; i++ { - if err := column.Write(encoder, int16(i)); assert.NoError(t, err) { - if v, err := column.Read(decoder, false); assert.NoError(t, err) { - assert.Equal(t, int16(i), v) - } - } - } - if assert.Equal(t, "column_name", column.Name()) && assert.Equal(t, "Int16", column.CHType()) { - assert.Equal(t, reflect.Int16, column.ScanType().Kind()) - } - if err := column.Write(encoder, int8(0)); assert.Error(t, err) { - if e, ok := err.(*columns.ErrUnexpectedType); assert.True(t, ok) { - assert.Equal(t, int8(0), e.T) - } - } - } -} - -func Test_Column_Int32(t *testing.T) { - var ( - buf bytes.Buffer - encoder = binary.NewEncoder(&buf) - decoder = binary.NewDecoder(&buf) - ) - if column, err := columns.Factory("column_name", "Int32", time.Local); assert.NoError(t, err) { - for i := -2147483648; i <= 2147483648; i += 100000 { - if err := column.Write(encoder, int32(i)); assert.NoError(t, err) { - if v, err := column.Read(decoder, false); assert.NoError(t, err) { - assert.Equal(t, int32(i), v) - } - } - } - if assert.Equal(t, "column_name", column.Name()) && assert.Equal(t, "Int32", column.CHType()) { - assert.Equal(t, reflect.Int32, column.ScanType().Kind()) - } - if err := column.Write(encoder, int8(0)); assert.Error(t, err) { - if e, ok := err.(*columns.ErrUnexpectedType); assert.True(t, ok) { - assert.Equal(t, int8(0), e.T) - } - } - } -} - -func Test_Column_Int64(t *testing.T) { - var ( - buf bytes.Buffer - encoder = binary.NewEncoder(&buf) - decoder = binary.NewDecoder(&buf) - ) - if column, err := columns.Factory("column_name", "Int64", time.Local); assert.NoError(t, err) { - for i := -2147483648; i <= 2147483648*2; i += 100000 { - if err := column.Write(encoder, int64(i)); assert.NoError(t, err) { - if v, err := column.Read(decoder, false); assert.NoError(t, err) { - assert.Equal(t, int64(i), v) - } - } - } - if assert.Equal(t, "column_name", column.Name()) && assert.Equal(t, "Int64", column.CHType()) { - assert.Equal(t, reflect.Int64, column.ScanType().Kind()) - } - if err := column.Write(encoder, int8(0)); assert.Error(t, err) { - if e, ok := err.(*columns.ErrUnexpectedType); assert.True(t, ok) { - assert.Equal(t, int8(0), e.T) - } - } - } -} - -func Test_Column_UInt8(t *testing.T) { - var ( - buf bytes.Buffer - encoder = binary.NewEncoder(&buf) - decoder = binary.NewDecoder(&buf) - ) - if column, err := columns.Factory("column_name", "UInt8", time.Local); assert.NoError(t, err) { - for i := 0; i <= 255; i++ { - if err := column.Write(encoder, uint8(i)); assert.NoError(t, err) { - if v, err := column.Read(decoder, false); assert.NoError(t, err) { - assert.Equal(t, uint8(i), v) - } - } - } - if assert.Equal(t, "column_name", column.Name()) && assert.Equal(t, "UInt8", column.CHType()) { - assert.Equal(t, reflect.Uint8, column.ScanType().Kind()) - } - if err := column.Write(encoder, int16(0)); assert.Error(t, err) { - if e, ok := err.(*columns.ErrUnexpectedType); assert.True(t, ok) { - assert.Equal(t, int16(0), e.T) - } - } - } -} - -func Test_Column_UInt16(t *testing.T) { - var ( - buf bytes.Buffer - encoder = binary.NewEncoder(&buf) - decoder = binary.NewDecoder(&buf) - ) - if column, err := columns.Factory("column_name", "UInt16", time.Local); assert.NoError(t, err) { - for i := 0; i <= 65535; i++ { - if err := column.Write(encoder, uint16(i)); assert.NoError(t, err) { - if v, err := column.Read(decoder, false); assert.NoError(t, err) { - assert.Equal(t, uint16(i), v) - } - } - } - if assert.Equal(t, "column_name", column.Name()) && assert.Equal(t, "UInt16", column.CHType()) { - assert.Equal(t, reflect.Uint16, column.ScanType().Kind()) - } - if err := column.Write(encoder, int8(0)); assert.Error(t, err) { - if e, ok := err.(*columns.ErrUnexpectedType); assert.True(t, ok) { - assert.Equal(t, int8(0), e.T) - } - } - } -} - -func Test_Column_UInt32(t *testing.T) { - var ( - buf bytes.Buffer - encoder = binary.NewEncoder(&buf) - decoder = binary.NewDecoder(&buf) - ) - if column, err := columns.Factory("column_name", "UInt32", time.Local); assert.NoError(t, err) { - for i := 0; i <= 4294967295; i += 100000 { - if err := column.Write(encoder, uint32(i)); assert.NoError(t, err) { - if v, err := column.Read(decoder, false); assert.NoError(t, err) { - assert.Equal(t, uint32(i), v) - } - } - } - if assert.Equal(t, "column_name", column.Name()) && assert.Equal(t, "UInt32", column.CHType()) { - assert.Equal(t, reflect.Uint32, column.ScanType().Kind()) - } - if err := column.Write(encoder, int8(0)); assert.Error(t, err) { - if e, ok := err.(*columns.ErrUnexpectedType); assert.True(t, ok) { - assert.Equal(t, int8(0), e.T) - } - } - } -} - -func Test_Column_UInt64(t *testing.T) { - var ( - buf bytes.Buffer - encoder = binary.NewEncoder(&buf) - decoder = binary.NewDecoder(&buf) - ) - if column, err := columns.Factory("column_name", "UInt64", time.Local); assert.NoError(t, err) { - for i := 0; i <= 4294967295*2; i += 100000 { - if err := column.Write(encoder, uint64(i)); assert.NoError(t, err) { - if v, err := column.Read(decoder, false); assert.NoError(t, err) { - assert.Equal(t, uint64(i), v) - } - } - } - if assert.Equal(t, "column_name", column.Name()) && assert.Equal(t, "UInt64", column.CHType()) { - assert.Equal(t, reflect.Uint64, column.ScanType().Kind()) - } - if err := column.Write(encoder, int8(0)); assert.Error(t, err) { - if e, ok := err.(*columns.ErrUnexpectedType); assert.True(t, ok) { - assert.Equal(t, int8(0), e.T) - } - } - } -} - -func Test_Column_Float32(t *testing.T) { - var ( - buf bytes.Buffer - encoder = binary.NewEncoder(&buf) - decoder = binary.NewDecoder(&buf) - ) - if column, err := columns.Factory("column_name", "Float32", time.Local); assert.NoError(t, err) { - for i := -2147483648; i <= 2147483648; i += 100000 { - if err := column.Write(encoder, float32(i)); assert.NoError(t, err) { - if v, err := column.Read(decoder, false); assert.NoError(t, err) { - assert.Equal(t, float32(i), v) - } - } - } - if assert.Equal(t, "column_name", column.Name()) && assert.Equal(t, "Float32", column.CHType()) { - assert.Equal(t, reflect.Float32, column.ScanType().Kind()) - } - if err := column.Write(encoder, int8(0)); assert.Error(t, err) { - if e, ok := err.(*columns.ErrUnexpectedType); assert.True(t, ok) { - assert.Equal(t, int8(0), e.T) - } - } - } -} - -func Test_Column_Float64(t *testing.T) { - var ( - buf bytes.Buffer - encoder = binary.NewEncoder(&buf) - decoder = binary.NewDecoder(&buf) - ) - if column, err := columns.Factory("column_name", "Float64", time.Local); assert.NoError(t, err) { - for i := -2147483648; i <= 2147483648*2; i += 100000 { - if err := column.Write(encoder, float64(i)); assert.NoError(t, err) { - if v, err := column.Read(decoder, false); assert.NoError(t, err) { - assert.Equal(t, float64(i), v) - } - } - } - if assert.Equal(t, "column_name", column.Name()) && assert.Equal(t, "Float64", column.CHType()) { - assert.Equal(t, reflect.Float64, column.ScanType().Kind()) - } - if err := column.Write(encoder, int8(0)); assert.Error(t, err) { - if e, ok := err.(*columns.ErrUnexpectedType); assert.True(t, ok) { - assert.Equal(t, int8(0), e.T) - } - } - } -} - -func Test_Column_String(t *testing.T) { - var ( - buf bytes.Buffer - str = fmt.Sprintf("str_%d", time.Now().Unix()) - strP = &str - b = []byte(str) - bp = &b - encoder = binary.NewEncoder(&buf) - decoder = binary.NewDecoder(&buf) - ) - if column, err := columns.Factory("column_name", "String", time.Local); assert.NoError(t, err) { - if err := column.Write(encoder, str); assert.NoError(t, err) { - if v, err := column.Read(decoder, false); assert.NoError(t, err) { - assert.Equal(t, str, v) - } - } - if err := column.Write(encoder, strP); assert.NoError(t, err) { - if v, err := column.Read(decoder, false); assert.NoError(t, err) { - assert.Equal(t, str, v) - } - } - if err := column.Write(encoder, b); assert.NoError(t, err) { - if v, err := column.Read(decoder, false); assert.NoError(t, err) { - assert.Equal(t, str, v) - } - } - if err := column.Write(encoder, bp); assert.NoError(t, err) { - if v, err := column.Read(decoder, false); assert.NoError(t, err) { - assert.Equal(t, str, v) - } - } - if assert.Equal(t, "column_name", column.Name()) && assert.Equal(t, "String", column.CHType()) { - assert.Equal(t, reflect.String, column.ScanType().Kind()) - } - if err := column.Write(encoder, int8(0)); assert.Error(t, err) { - if e, ok := err.(*columns.ErrUnexpectedType); assert.True(t, ok) { - assert.Equal(t, int8(0), e.T) - } - } - } -} - -func Test_Column_FixedString(t *testing.T) { - var ( - buf bytes.Buffer - str = fmt.Sprintf("str_%d", time.Now().Unix()) - encoder = binary.NewEncoder(&buf) - decoder = binary.NewDecoder(&buf) - ) - if column, err := columns.Factory("column_name", "FixedString(14)", time.Local); assert.NoError(t, err) { - if err := column.Write(encoder, str); assert.NoError(t, err) { - if v, err := column.Read(decoder, false); assert.NoError(t, err) { - assert.Equal(t, str, v) - } - } - if assert.Equal(t, "column_name", column.Name()) && assert.Equal(t, "FixedString(14)", column.CHType()) { - assert.Equal(t, reflect.String, column.ScanType().Kind()) - } - if err := column.Write(encoder, int8(0)); assert.Error(t, err) { - if e, ok := err.(*columns.ErrUnexpectedType); assert.True(t, ok) { - assert.Equal(t, int8(0), e.T) - } - } - } -} - -func Test_Column_Enum8(t *testing.T) { - var ( - buf bytes.Buffer - encoder = binary.NewEncoder(&buf) - decoder = binary.NewDecoder(&buf) - ) - if column, err := columns.Factory("column_name", "Enum8('A'=1,'B'=2,'C'=3)", time.Local); assert.NoError(t, err) { - if err := column.Write(encoder, "B"); assert.NoError(t, err) { - if v, err := column.Read(decoder, false); assert.NoError(t, err) { - assert.Equal(t, "B", v) - } - } - if err := column.Write(encoder, int16(3)); assert.Error(t, err) { - if err := column.Write(encoder, int8(3)); assert.NoError(t, err) { - if v, err := column.Read(decoder, false); assert.NoError(t, err) { - assert.Equal(t, "C", v) - } - } - } - if assert.Equal(t, "column_name", column.Name()) && assert.Equal(t, "Enum8('A'=1,'B'=2,'C'=3)", column.CHType()) { - assert.Equal(t, reflect.String, column.ScanType().Kind()) - } - if err := column.Write(encoder, int(0)); assert.Error(t, err) { - if e, ok := err.(*columns.ErrUnexpectedType); assert.True(t, ok) { - assert.Equal(t, int(0), e.T) - } - } - } -} - -func Test_Column_Enum16(t *testing.T) { - var ( - buf bytes.Buffer - encoder = binary.NewEncoder(&buf) - decoder = binary.NewDecoder(&buf) - ) - if column, err := columns.Factory("column_name", "Enum16('A'=1,'B'=2,'C'=3)", time.Local); assert.NoError(t, err) { - if err := column.Write(encoder, "B"); assert.NoError(t, err) { - if v, err := column.Read(decoder, false); assert.NoError(t, err) { - assert.Equal(t, "B", v) - } - } - if err := column.Write(encoder, int8(3)); assert.Error(t, err) { - if err := column.Write(encoder, int16(3)); assert.NoError(t, err) { - if v, err := column.Read(decoder, false); assert.NoError(t, err) { - assert.Equal(t, "C", v) - } - } - } - if assert.Equal(t, "column_name", column.Name()) && assert.Equal(t, "Enum16('A'=1,'B'=2,'C'=3)", column.CHType()) { - assert.Equal(t, reflect.String, column.ScanType().Kind()) - } - if err := column.Write(encoder, int(0)); assert.Error(t, err) { - if e, ok := err.(*columns.ErrUnexpectedType); assert.True(t, ok) { - assert.Equal(t, int(0), e.T) - } - } - } -} - -func Test_Column_Date(t *testing.T) { - var ( - buf bytes.Buffer - encoder = binary.NewEncoder(&buf) - decoder = binary.NewDecoder(&buf) - ) - if column, err := columns.Factory("column_name", "Date", time.Local); assert.NoError(t, err) { - year, month, day := time.Now().Date() - today := time.Date(year, month, day, 0, 0, 0, 0, time.Local) - - for i := 0; i < 24; i++ { - todayHour := today.Add(time.Duration(i) * time.Hour) - - // time.Time type - if err := column.Write(encoder, todayHour); assert.NoError(t, err) { - if v, err := column.Read(decoder, false); assert.NoError(t, err) { - assert.Equal(t, today, v) - } - } - - // int64 type - if err := column.Write(encoder, todayHour.Unix()); assert.NoError(t, err) { - if v, err := column.Read(decoder, false); assert.NoError(t, err) { - assert.Equal(t, today, v) - } - } - - // string type - if err := column.Write(encoder, todayHour.Format("2006-01-02")); assert.NoError(t, err) { - if v, err := column.Read(decoder, false); assert.NoError(t, err) { - assert.Equal(t, today, v) - } - } - - } - - if assert.Equal(t, "column_name", column.Name()) && assert.Equal(t, "Date", column.CHType()) { - assert.Equal(t, reflect.TypeOf(time.Time{}).Kind(), column.ScanType().Kind()) - } - if err := column.Write(encoder, int8(0)); assert.Error(t, err) { - if e, ok := err.(*columns.ErrUnexpectedType); assert.True(t, ok) { - assert.Equal(t, int8(0), e.T) - } - } - } -} - -func Test_Column_DateTime(t *testing.T) { - var ( - buf bytes.Buffer - timeNow = time.Now().Truncate(time.Second) - encoder = binary.NewEncoder(&buf) - decoder = binary.NewDecoder(&buf) - ) - if column, err := columns.Factory("column_name", "DateTime", time.Local); assert.NoError(t, err) { - if err := column.Write(encoder, timeNow); assert.NoError(t, err) { - if v, err := column.Read(decoder, false); assert.NoError(t, err) { - assert.Equal(t, timeNow, v) - } - } - if err := column.Write(encoder, timeNow.In(time.UTC).Format("2006-01-02 15:04:05")); assert.NoError(t, err) { - if v, err := column.Read(decoder, false); assert.NoError(t, err) { - assert.Equal(t, timeNow, v) - } - } - if assert.Equal(t, "column_name", column.Name()) && assert.Equal(t, "DateTime", column.CHType()) { - assert.Equal(t, reflect.TypeOf(time.Time{}).Kind(), column.ScanType().Kind()) - } - if err := column.Write(encoder, int8(0)); assert.Error(t, err) { - if e, ok := err.(*columns.ErrUnexpectedType); assert.True(t, ok) { - assert.Equal(t, int8(0), e.T) - } - } - } -} - -func Test_Column_DateTime64(t *testing.T) { - var ( - buf bytes.Buffer - encoder = binary.NewEncoder(&buf) - decoder = binary.NewDecoder(&buf) - ) - - timeNowNano := time.Now().UTC().UnixNano() - - // ignore nano secends. - nsec := (timeNowNano - timeNowNano/1e9*1e9) / 1e4 * 1e4 - sec := timeNowNano / 1e9 - timeNow := time.Unix(sec, nsec).UTC() - if column, err := columns.Factory("column_name", "DateTime64(6)", time.UTC); assert.NoError(t, err) { - if err := column.Write(encoder, timeNow); assert.NoError(t, err) { - if v, err := column.Read(decoder, false); assert.NoError(t, err) { - assert.Equal(t, timeNow, v.(time.Time).UTC()) - } - } - if err := column.Write(encoder, timeNow.In(time.UTC).Format("2006-01-02 15:04:05.999999")); assert.NoError(t, err) { - if v, err := column.Read(decoder, false); assert.NoError(t, err) { - assert.Equal(t, timeNow, v.(time.Time).UTC()) - } - } - if assert.Equal(t, "column_name", column.Name()) && assert.Equal(t, "DateTime64(6)", column.CHType()) { - assert.Equal(t, reflect.TypeOf(time.Time{}).Kind(), column.ScanType().Kind()) - } - if err := column.Write(encoder, int8(0)); assert.Error(t, err) { - if e, ok := err.(*columns.ErrUnexpectedType); assert.True(t, ok) { - assert.Equal(t, int8(0), e.T) - } - } - if err := column.Write(encoder, int16(0)); assert.Error(t, err) { - if e, ok := err.(*columns.ErrUnexpectedType); assert.True(t, ok) { - assert.Equal(t, int16(0), e.T) - } - } - if err := column.Write(encoder, int32(0)); assert.Error(t, err) { - if e, ok := err.(*columns.ErrUnexpectedType); assert.True(t, ok) { - assert.Equal(t, int32(0), e.T) - } - } - } -} - -func Test_Column_DateTimeWithTZ(t *testing.T) { - var ( - buf bytes.Buffer - timeNow = time.Now().Truncate(time.Second) - encoder = binary.NewEncoder(&buf) - decoder = binary.NewDecoder(&buf) - ) - if column, err := columns.Factory("column_name", `DateTime("UTC")`, time.Local); assert.NoError(t, err) { - if err := column.Write(encoder, timeNow); assert.NoError(t, err) { - if v, err := column.Read(decoder, false); assert.NoError(t, err) { - assert.Equal(t, timeNow, v) - } - } - if err := column.Write(encoder, timeNow.In(time.UTC).Format("2006-01-02 15:04:05")); assert.NoError(t, err) { - if v, err := column.Read(decoder, false); assert.NoError(t, err) { - assert.Equal(t, timeNow, v) - } - } - if assert.Equal(t, "column_name", column.Name()) && assert.Equal(t, "DateTime", column.CHType()) { - assert.Equal(t, reflect.TypeOf(time.Time{}).Kind(), column.ScanType().Kind()) - } - if err := column.Write(encoder, int8(0)); assert.Error(t, err) { - if e, ok := err.(*columns.ErrUnexpectedType); assert.True(t, ok) { - assert.Equal(t, int8(0), e.T) - } - } - } -} - -func Test_Column_UUID(t *testing.T) { - var ( - buf bytes.Buffer - encoder = binary.NewEncoder(&buf) - decoder = binary.NewDecoder(&buf) - ) - if column, err := columns.Factory("column_name", "UUID", time.Local); assert.NoError(t, err) { - for _, uuid := range []string{ - "00000000-0000-0000-0000-000000000000", - "6e6a7955-3237-3461-3036-663239386432", - "4c436370-6130-6461-6437-336534326163", - "47474674-3238-3066-3236-373437666435", - "0492351a-3cb1-4cb5-855f-e0508145a54c", - "798c4344-de6c-4c02-95ba-fea4f7d5fafd", - } { - if err := column.Write(encoder, uuid); assert.NoError(t, err) { - if v, err := column.Read(decoder, false); assert.NoError(t, err) { - assert.Equal(t, uuid, v) - } - } - } - if assert.Equal(t, "column_name", column.Name()) && assert.Equal(t, "UUID", column.CHType()) { - assert.Equal(t, reflect.String, column.ScanType().Kind()) - } - if err := column.Write(encoder, int8(0)); assert.Error(t, err) { - if e, ok := err.(*columns.ErrUnexpectedType); assert.True(t, ok) { - assert.Equal(t, int8(0), e.T) - } - } - if err := column.Write(encoder, "invalid-uuid"); assert.Error(t, err) { - assert.Equal(t, columns.ErrInvalidUUIDFormat, err) - } - } -} - -func Test_Column_IP(t *testing.T) { - var ( - buf bytes.Buffer - encoder = binary.NewEncoder(&buf) - decoder = binary.NewDecoder(&buf) - ) - if column, err := columns.Factory("column_name", "IPv4", time.Local); assert.NoError(t, err) { - for _, ip := range []string{ - "127.0.0.1", - } { - if err := column.Write(encoder, ip); assert.NoError(t, err) { - if v, err := column.Read(decoder, false); assert.NoError(t, err) { - assert.Equal(t, net.ParseIP(ip), v) - } - } - } - if assert.Equal(t, "column_name", column.Name()) && assert.Equal(t, "IPv4", column.CHType()) { - assert.Equal(t, reflect.TypeOf(net.IP{}).Kind(), column.ScanType().Kind()) - } - if err := column.Write(encoder, int8(0)); assert.Error(t, err) { - if e, ok := err.(*columns.ErrUnexpectedType); assert.True(t, ok) { - assert.Equal(t, int8(0), e.T) - } - } - if err := column.Write(encoder, ""); assert.Error(t, err) { - assert.Equal(t, &columns.ErrUnexpectedType{Column: column, T: ""}, err) - } - } - - if column, err := columns.Factory("column_name", "IPv6", time.Local); assert.NoError(t, err) { - for _, ip := range []string{ - "2001:0db8:0000:0000:0000:ff00:0042:8329", - } { - if err := column.Write(encoder, ip); assert.NoError(t, err) { - if v, err := column.Read(decoder, false); assert.NoError(t, err) { - assert.Equal(t, net.ParseIP(ip), v) - } - } - } - if assert.Equal(t, "column_name", column.Name()) && assert.Equal(t, "IPv6", column.CHType()) { - assert.Equal(t, reflect.TypeOf(net.IP{}).Kind(), column.ScanType().Kind()) - } - if err := column.Write(encoder, int8(0)); assert.Error(t, err) { - if e, ok := err.(*columns.ErrUnexpectedType); assert.True(t, ok) { - assert.Equal(t, int8(0), e.T) - } - } - if err := column.Write(encoder, ""); assert.Error(t, err) { - assert.Equal(t, &columns.ErrUnexpectedType{Column: column, T: ""}, err) - } - } -} - -func Test_Column_SimpleAggregateFunc(t *testing.T) { - data := map[string]string{ - "SimpleAggregateFunction(anyLast, UInt8)": "UInt8", - "SimpleAggregateFunction(anyLast, Nullable(IPv4))": "Nullable(IPv4)", - "SimpleAggregateFunction(max, Nullable(DateTime))": "Nullable(DateTime)", - } - - for key, val := range data { - if column, err := columns.Factory("column_name", key, time.Local); assert.NoError(t, err) { - assert.Equal(t, "column_name", column.Name()) - assert.Equal(t, val, column.CHType()) - } - } -} - -func Test_Column_Decimal64(t *testing.T) { - var ( - buf bytes.Buffer - encoder = binary.NewEncoder(&buf) - decoder = binary.NewDecoder(&buf) - ) - if columnBase, err := columns.Factory("column_name", "Decimal(18,5)", time.Local); assert.NoError(t, err) { - - decimalCol, ok := columnBase.(*columns.Decimal) - if assert.True(t, ok) { - assert.Equal(t, 18, decimalCol.GetPrecision()) - assert.Equal(t, 5, decimalCol.GetScale()) - } - - if err := columnBase.Write(encoder, float64(1123.12345)); assert.NoError(t, err) { - if v, err := columnBase.Read(decoder, false); assert.NoError(t, err) { - assert.Equal(t, int64(112312345), v) - } - } - if assert.Equal(t, "column_name", columnBase.Name()) && assert.Equal(t, "Decimal(18,5)", columnBase.CHType()) { - assert.Equal(t, reflect.Int64, columnBase.ScanType().Kind()) - } - } -} - -func Test_Column_NullableDecimal64(t *testing.T) { - var ( - buf bytes.Buffer - encoder = binary.NewEncoder(&buf) - decoder = binary.NewDecoder(&buf) - ) - if columnBase, err := columns.Factory("column_name", "Nullable(Decimal(18,5))", time.Local); assert.NoError(t, err) { - - nullableCol, ok := columnBase.(*columns.Nullable) - if assert.True(t, ok) { - decimalCol := nullableCol.GetColumn().(*columns.Decimal) - assert.Equal(t, 18, decimalCol.GetPrecision()) - assert.Equal(t, 5, decimalCol.GetScale()) - } - - if err := nullableCol.WriteNull(encoder, encoder, float64(1123.12345)); assert.NoError(t, err) { - if v, err := nullableCol.ReadNull(decoder, 1); assert.NoError(t, err) { - assert.Equal(t, int64(112312345), v[0]) - } - } - - if err := nullableCol.WriteNull(encoder, encoder, nil); assert.NoError(t, err) { - if v, err := nullableCol.ReadNull(decoder, 1); assert.NoError(t, err) { - assert.Nil(t, v[0]) - } - } - - if assert.Equal(t, "column_name", columnBase.Name()) && assert.Equal(t, "Nullable(Decimal(18,5))", columnBase.CHType()) { - assert.Equal(t, reflect.Ptr, columnBase.ScanType().Kind()) - assert.Equal(t, reflect.Int64, columnBase.ScanType().Elem().Kind()) - } - } -} - -func Test_Column_NullableEnum8(t *testing.T) { - var ( - buf bytes.Buffer - encoder = binary.NewEncoder(&buf) - decoder = binary.NewDecoder(&buf) - ) - if columnBase, err := columns.Factory("column_name", "Nullable(Enum8('A'=1,'B'=2,'C'=3))", time.Local); assert.NoError(t, err) { - - nullableCol, ok := columnBase.(*columns.Nullable) - if assert.True(t, ok) { - enumCol := nullableCol.GetColumn().(*columns.Enum) - if assert.Equal(t, "column_name", enumCol.Name()) && assert.Equal(t, "Enum8('A'=1,'B'=2,'C'=3)", enumCol.CHType()) { - assert.Equal(t, reflect.String, enumCol.ScanType().Kind()) - } - } - - if err = nullableCol.WriteNull(encoder, encoder, "B"); assert.NoError(t, err) { - if v, err := nullableCol.ReadNull(decoder, 1); assert.NoError(t, err) { - assert.Equal(t, "B", v[0]) - } - } - - if err = nullableCol.WriteNull(encoder, encoder, nil); assert.NoError(t, err) { - if v, err := nullableCol.ReadNull(decoder, 1); assert.NoError(t, err) { - assert.Nil(t, v[0]) - } - } - - // Clickhouse can return a null result with zero value, even if the enum doesn't start at 0 - if _, err = encoder.Write([]byte{1}); assert.NoError(t, err) { - if err = encoder.Int8(0); assert.NoError(t, err) { - if v, err := nullableCol.ReadNull(decoder, 1); assert.NoError(t, err) { - assert.Nil(t, v[0]) - } - } - } - - if assert.Equal(t, "column_name", columnBase.Name()) && assert.Equal(t, "Nullable(Enum8('A'=1,'B'=2,'C'=3))", columnBase.CHType()) { - assert.Equal(t, reflect.Ptr, columnBase.ScanType().Kind()) - assert.Equal(t, reflect.String, columnBase.ScanType().Elem().Kind()) - } - } -} diff --git a/vendor/github.com/ClickHouse/clickhouse-go/lib/column/decimal_test.go b/vendor/github.com/ClickHouse/clickhouse-go/lib/column/decimal_test.go deleted file mode 100644 index 4c56e73622..0000000000 --- a/vendor/github.com/ClickHouse/clickhouse-go/lib/column/decimal_test.go +++ /dev/null @@ -1,350 +0,0 @@ -package column - -import ( - "bytes" - "database/sql" - "encoding/binary" - "testing" - - chbin "github.com/ClickHouse/clickhouse-go/lib/binary" -) - -func TestDecimal_Write32(t *testing.T) { - t.Parallel() - - buff := &bytes.Buffer{} - encoder := chbin.NewEncoder(buff) - - data := []int32{ - 0, - 1, - -1, - 10, - 123, - 1234567, - 1234567890, - -1234567890, - } - - for _, attempt := range data { - buff.Reset() - - d := &Decimal{ - base: base{ - name: "testcolumn", - chType: "Decimal(5,3)", - }, - nobits: 32, - precision: 5, - scale: 3, - } - - err := d.Write(encoder, attempt) - if err != nil { - t.Fatal(err) - } - - err = encoder.Flush() - if err != nil { - t.Fatal(err) - } - - value := int32(binary.LittleEndian.Uint32(buff.Bytes())) - if value != attempt { - t.Errorf("Expecting: %d; Got: %d", attempt, value) - } - } -} - -func TestDecimal_WriteNullable32(t *testing.T) { - t.Parallel() - - buff := &bytes.Buffer{} - encoder := chbin.NewEncoder(buff) - - data := []sql.NullInt32{ - {Valid: true, Int32: 0}, - {Valid: true, Int32: 1}, - {Valid: true, Int32: -1}, - {Valid: true, Int32: 10}, - {Valid: true, Int32: 123}, - {Valid: true, Int32: 1234567}, - {Valid: true, Int32: 1234567890}, - {Valid: true, Int32: -1234567890}, - } - - for _, attempt := range data { - buff.Reset() - - d := &Decimal{ - base: base{ - name: "testcolumn", - chType: "Decimal(5,3)", - }, - nobits: 32, - precision: 5, - scale: 3, - } - - attemptValue, err := attempt.Value() - if err != nil { - t.Fatal(err) - } - - err = d.Write(encoder, attemptValue) - if err != nil { - t.Fatal(err) - } - - err = encoder.Flush() - if err != nil { - t.Fatal(err) - } - - value := int32(binary.LittleEndian.Uint32(buff.Bytes())) - if value != int32(attemptValue.(int64)) { - t.Errorf("Expecting: %v; Got: %d", attemptValue, value) - } - } -} - -func TestDecimal_Write32_WithInt64(t *testing.T) { - t.Parallel() - - buff := &bytes.Buffer{} - encoder := chbin.NewEncoder(buff) - - data := []int64{ - 0, - 1, - -1, - 10, - 123, - 1234567, - 1234567890, - -1234567890, - } - - for _, attempt := range data { - buff.Reset() - - d := &Decimal{ - base: base{ - name: "testcolumn", - chType: "Decimal(5,3)", - }, - nobits: 32, - precision: 5, - scale: 3, - } - - err := d.Write(encoder, attempt) - if err != nil { - t.Fatal(err) - } - - err = encoder.Flush() - if err != nil { - t.Fatal(err) - } - - value := int32(binary.LittleEndian.Uint32(buff.Bytes())) - if value != int32(attempt) { - t.Errorf("Expecting: %d; Got: %d", attempt, value) - } - } -} - -func TestDecimal_Write32_WithUint64(t *testing.T) { - t.Parallel() - - buff := &bytes.Buffer{} - encoder := chbin.NewEncoder(buff) - - data := []uint64{ - 0, - 1, - 10, - 123, - 1234567, - 1234567890, - } - - for _, attempt := range data { - buff.Reset() - - d := &Decimal{ - base: base{ - name: "testcolumn", - chType: "Decimal(5,3)", - }, - nobits: 32, - precision: 5, - scale: 3, - } - - err := d.Write(encoder, attempt) - if err != nil { - t.Fatal(err) - } - - err = encoder.Flush() - if err != nil { - t.Fatal(err) - } - - value := int32(binary.LittleEndian.Uint32(buff.Bytes())) - if value != int32(attempt) { - t.Errorf("Expecting: %d; Got: %d", attempt, value) - } - } -} - -func TestDecimal_Write64(t *testing.T) { - t.Parallel() - - buff := &bytes.Buffer{} - encoder := chbin.NewEncoder(buff) - - data := []int64{ - 0, - 1, - -1, - 10, - 123, - 1234567, - 1234567890, - -1234567890, - 12345678901234, - -12345678901234, - } - - for _, attempt := range data { - buff.Reset() - - d := &Decimal{ - base: base{ - name: "testcolumn", - chType: "Decimal(10,3)", - }, - nobits: 64, - precision: 10, - scale: 3, - } - - err := d.Write(encoder, attempt) - if err != nil { - t.Fatal(err) - } - - err = encoder.Flush() - if err != nil { - t.Fatal(err) - } - - value := int64(binary.LittleEndian.Uint64(buff.Bytes())) - if value != attempt { - t.Errorf("Expecting: %d; Got: %d", attempt, value) - } - } -} - -func TestDecimal_WriteNullable64(t *testing.T) { - t.Parallel() - - buff := &bytes.Buffer{} - encoder := chbin.NewEncoder(buff) - - data := []sql.NullInt64{ - {Valid: true, Int64: 0}, - {Valid: true, Int64: 1}, - {Valid: true, Int64: -1}, - {Valid: true, Int64: 10}, - {Valid: true, Int64: 123}, - {Valid: true, Int64: 1234567}, - {Valid: true, Int64: 1234567890}, - {Valid: true, Int64: -1234567890}, - {Valid: true, Int64: 12345678901234}, - {Valid: true, Int64: -12345678901234}, - } - - for _, attempt := range data { - buff.Reset() - - d := &Decimal{ - base: base{ - name: "testcolumn", - chType: "Decimal(10,3)", - }, - nobits: 64, - precision: 10, - scale: 3, - } - - attemptValue, err := attempt.Value() - if err != nil { - t.Fatal(err) - } - - err = d.Write(encoder, attemptValue) - if err != nil { - t.Fatal(err) - } - - err = encoder.Flush() - if err != nil { - t.Fatal(err) - } - - value := int64(binary.LittleEndian.Uint64(buff.Bytes())) - if value != attemptValue.(int64) { - t.Errorf("Expecting: %v; Got: %d", attemptValue, value) - } - } -} - -func TestDecimal_Write64_WithUint64(t *testing.T) { - t.Parallel() - - buff := &bytes.Buffer{} - encoder := chbin.NewEncoder(buff) - - data := []uint64{ - 0, - 1, - 10, - 123, - 1234567, - 1234567890, - 12345678901234, - } - - for _, attempt := range data { - buff.Reset() - - d := &Decimal{ - base: base{ - name: "testcolumn", - chType: "Decimal(10,3)", - }, - nobits: 64, - precision: 10, - scale: 3, - } - - err := d.Write(encoder, attempt) - if err != nil { - t.Fatal(err) - } - - err = encoder.Flush() - if err != nil { - t.Fatal(err) - } - - value := int64(binary.LittleEndian.Uint64(buff.Bytes())) - if value != int64(attempt) { - t.Errorf("Expecting: %d; Got: %d", attempt, value) - } - } -} diff --git a/vendor/github.com/ClickHouse/clickhouse-go/lib/column/ip_test.go b/vendor/github.com/ClickHouse/clickhouse-go/lib/column/ip_test.go deleted file mode 100644 index e499023323..0000000000 --- a/vendor/github.com/ClickHouse/clickhouse-go/lib/column/ip_test.go +++ /dev/null @@ -1,133 +0,0 @@ -package column - -import ( - "fmt" - "github.com/ClickHouse/clickhouse-go/lib/binary" - "io/ioutil" - "net" - "strings" - "testing" - - "github.com/stretchr/testify/assert" -) - -func Test_IPConverter(t *testing.T) { - var ipAddresses = []string{ - "127.0.0.1", - "99.67.1.100", - "::1", - "2001:0db8:0a0b:12f0:0000:0000:0000:0001", - "2001:0db8::0001", - "3731:54:65fe:2::a7", - } - for _, ips := range ipAddresses { - var ( - ip2 IP - ip = net.ParseIP(ips) - value, err = IP(ip).Value() - ) - if assert.NoError(t, err) { - if !strings.Contains(ips, ":") { - vl := value.([]byte) - err = ip2.Scan(vl[len(vl)-4:]) - } else { - err = ip2.Scan(value) - } - if assert.NoError(t, err) { - assert.True(t, ip.Equal(net.IP(ip2)), fmt.Sprintf("Invalid ip restore: %s != %s", ip, ip2)) - } - } - - if assert.NoError(t, err) { - err = ip2.Scan(ips) - if assert.NoError(t, err) { - assert.True(t, ip.Equal(net.IP(ip2)), fmt.Sprintf("Invalid ip restore: %s != %s", ip, ip2)) - } - } - } - ip := IP(net.ParseIP("")) - assert.Equal(t, errInvalidScanValue, ip.Scan("")) - assert.Equal(t, errInvalidScanValue, ip.Scan([]byte{'1', '2', '3'})) - assert.Equal(t, errInvalidScanType, ip.Scan(1)) -} - -func TestIPv4_Write(t *testing.T) { - ip := net.ParseIP("0.0.0.0") - ipv4 := IPv4{} - - cases := []struct { - Key interface{} - Error interface{} - }{ - { - net.ParseIP("0.0.0.0"), - nil, - }, - { - &ip, - nil, - }, - { - "0.0.0.0", - nil, - }, - { - "", - &ErrUnexpectedType{ - &ipv4, - "", - }, - }, - { - "2001:0db8::0001", - &ErrUnexpectedType{ - &ipv4, - "2001:0db8::0001", - }, - }, - } - for _, Case := range cases { - - buffer := binary.NewEncoder(ioutil.Discard) - assert.Equal(t, ipv4.Write(buffer, Case.Key), Case.Error) - } -} - -func TestIPv6_Write(t *testing.T) { - ip := net.ParseIP("2001:0db8::0001") - ipv6 := IPv6{} - - cases := []struct { - Key interface{} - Error interface{} - }{ - { - net.ParseIP("2001:0db8::0001"), - nil, - }, - { - &ip, - nil, - }, - { - "2001:0db8::0001", - nil, - }, - { - "", - &ErrUnexpectedType{ - &ipv6, - "", - }, - }, - { - "0.0.0.0", - nil, - }, - } - for _, Case := range cases { - - buffer := binary.NewEncoder(ioutil.Discard) - assert.Equal(t, ipv6.Write(buffer, Case.Key), Case.Error) - } -} \ No newline at end of file diff --git a/vendor/github.com/ClickHouse/clickhouse-go/lib/column/uuid_test.go b/vendor/github.com/ClickHouse/clickhouse-go/lib/column/uuid_test.go deleted file mode 100644 index 765e408544..0000000000 --- a/vendor/github.com/ClickHouse/clickhouse-go/lib/column/uuid_test.go +++ /dev/null @@ -1,80 +0,0 @@ -package column - -import ( - "github.com/stretchr/testify/assert" - - "encoding/hex" - "testing" -) - -func bytes2uuid(src []byte) string { - var uuid [36]byte - hex.Encode(uuid[:], src[:4]) - uuid[8] = '-' - hex.Encode(uuid[9:13], src[4:6]) - uuid[13] = '-' - hex.Encode(uuid[14:18], src[6:8]) - uuid[18] = '-' - hex.Encode(uuid[19:23], src[8:10]) - uuid[23] = '-' - hex.Encode(uuid[24:], src[10:]) - return string(uuid[:]) -} - -func Test_UUID2Bytes(t *testing.T) { - origin := "00000000-0000-0000-0000-000000000000" - if uuid, err := uuid2bytes(origin); assert.NoError(t, err) { - assert.Equal(t, origin, bytes2uuid(uuid)) - } -} - -func Benchmark_UUID2Bytes(b *testing.B) { - b.ReportAllocs() - for i := 0; i < b.N; i++ { - if _, err := uuid2bytes("00000000-0000-0000-0000-000000000000"); err != nil { - b.Fatal(err) - } - } -} - -func Test_EmptyStringToNullUUID(t *testing.T) { - origin := "" - if uuid, err := uuid2bytes(origin); assert.NoError(t, err) { - assert.Equal(t, "00000000-0000-0000-0000-000000000000", bytes2uuid(uuid)) - } -} - -func Test_ErrInvalidUUIDFormat(t *testing.T) { - cases := []struct { - origin string - exceptedError error - }{ - { - "", - nil, - }, - { - "a", - ErrInvalidUUIDFormat, - }, - { - "00000000-0000-0000-00000000000000000", - ErrInvalidUUIDFormat, - }, - { - "00000000-0000-0000-0000-0000000000000", - ErrInvalidUUIDFormat, - }, - } - - for _, Case := range cases { - _, err := uuid2bytes(Case.origin) - if Case.exceptedError != nil { - assert.Error(t, err) - assert.EqualError(t, Case.exceptedError, err.Error()) - } else { - assert.NoError(t, err) - } - - } -} diff --git a/vendor/github.com/ClickHouse/clickhouse-go/lib/lz4/lz4_test.go b/vendor/github.com/ClickHouse/clickhouse-go/lib/lz4/lz4_test.go deleted file mode 100644 index 644982e0b0..0000000000 --- a/vendor/github.com/ClickHouse/clickhouse-go/lib/lz4/lz4_test.go +++ /dev/null @@ -1,69 +0,0 @@ -package lz4 - -import ( - "bytes" - "io/ioutil" - "testing" -) - -var testfile, _ = ioutil.ReadFile("testdata/pg1661.txt") - -func roundtrip(t *testing.T, input []byte) { - output := make([]byte, CompressBound(len(input))) - compressedSize, err := Encode(output, input) - if err != nil { - t.Errorf("got error during compression: %s", err) - } - - var newInput = make([]byte, len(input)) - - decompressedSize, err := Decode(newInput, output[:compressedSize]) - - if decompressedSize != len(newInput) { - t.Errorf("decompressed size not match") - } - - if err != nil { - t.Errorf("got error during decompress: %s", err) - } - if !bytes.Equal(newInput, input) { - t.Error("roundtrip failed", len(input)) - } -} - -func TestEmpty(t *testing.T) { - roundtrip(t, nil) -} - -func TestLengths(t *testing.T) { - - for i := 0; i < 1024; i++ { - roundtrip(t, testfile[:i]) - } - - for i := 1024; i < len(testfile); i += 1024 * 4 { - roundtrip(t, testfile[:i]) - } -} - -func TestWords(t *testing.T) { - roundtrip(t, testfile) -} - -func BenchmarkLZ4Encode(b *testing.B) { - output := make([]byte, CompressBound(len(testfile))) - for i := 0; i < b.N; i++ { - Encode(output, testfile[:1024]) - } -} - -func BenchmarkLZ4Decode(b *testing.B) { - output := make([]byte, CompressBound(len(testfile))) - Encode(output, testfile) - inputNew := make([]byte, len(testfile)) - b.ResetTimer() - - for i := 0; i < b.N; i++ { - Decode(inputNew, output) - } -} diff --git a/vendor/github.com/ClickHouse/clickhouse-go/lib/lz4/testdata/pg1661.txt b/vendor/github.com/ClickHouse/clickhouse-go/lib/lz4/testdata/pg1661.txt deleted file mode 100644 index c4c3130503..0000000000 --- a/vendor/github.com/ClickHouse/clickhouse-go/lib/lz4/testdata/pg1661.txt +++ /dev/null @@ -1,13052 +0,0 @@ -Project Gutenberg's The Adventures of Sherlock Holmes, by Arthur Conan Doyle - -This eBook is for the use of anyone anywhere at no cost and with -almost no restrictions whatsoever. You may copy it, give it away or -re-use it under the terms of the Project Gutenberg License included -with this eBook or online at www.gutenberg.net - - -Title: The Adventures of Sherlock Holmes - -Author: Arthur Conan Doyle - -Posting Date: April 18, 2011 [EBook #1661] -First Posted: November 29, 2002 - -Language: English - - -*** START OF THIS PROJECT GUTENBERG EBOOK THE ADVENTURES OF SHERLOCK HOLMES *** - - - - -Produced by an anonymous Project Gutenberg volunteer and Jose Menendez - - - - - - - - - -THE ADVENTURES OF SHERLOCK HOLMES - -by - -SIR ARTHUR CONAN DOYLE - - - - I. A Scandal in Bohemia - II. The Red-headed League - III. A Case of Identity - IV. The Boscombe Valley Mystery - V. The Five Orange Pips - VI. The Man with the Twisted Lip - VII. The Adventure of the Blue Carbuncle -VIII. The Adventure of the Speckled Band - IX. The Adventure of the Engineer's Thumb - X. The Adventure of the Noble Bachelor - XI. The Adventure of the Beryl Coronet - XII. The Adventure of the Copper Beeches - - - - -ADVENTURE I. A SCANDAL IN BOHEMIA - -I. - -To Sherlock Holmes she is always THE woman. I have seldom heard -him mention her under any other name. In his eyes she eclipses -and predominates the whole of her sex. It was not that he felt -any emotion akin to love for Irene Adler. All emotions, and that -one particularly, were abhorrent to his cold, precise but -admirably balanced mind. He was, I take it, the most perfect -reasoning and observing machine that the world has seen, but as a -lover he would have placed himself in a false position. He never -spoke of the softer passions, save with a gibe and a sneer. They -were admirable things for the observer--excellent for drawing the -veil from men's motives and actions. But for the trained reasoner -to admit such intrusions into his own delicate and finely -adjusted temperament was to introduce a distracting factor which -might throw a doubt upon all his mental results. Grit in a -sensitive instrument, or a crack in one of his own high-power -lenses, would not be more disturbing than a strong emotion in a -nature such as his. And yet there was but one woman to him, and -that woman was the late Irene Adler, of dubious and questionable -memory. - -I had seen little of Holmes lately. My marriage had drifted us -away from each other. My own complete happiness, and the -home-centred interests which rise up around the man who first -finds himself master of his own establishment, were sufficient to -absorb all my attention, while Holmes, who loathed every form of -society with his whole Bohemian soul, remained in our lodgings in -Baker Street, buried among his old books, and alternating from -week to week between cocaine and ambition, the drowsiness of the -drug, and the fierce energy of his own keen nature. He was still, -as ever, deeply attracted by the study of crime, and occupied his -immense faculties and extraordinary powers of observation in -following out those clues, and clearing up those mysteries which -had been abandoned as hopeless by the official police. From time -to time I heard some vague account of his doings: of his summons -to Odessa in the case of the Trepoff murder, of his clearing up -of the singular tragedy of the Atkinson brothers at Trincomalee, -and finally of the mission which he had accomplished so -delicately and successfully for the reigning family of Holland. -Beyond these signs of his activity, however, which I merely -shared with all the readers of the daily press, I knew little of -my former friend and companion. - -One night--it was on the twentieth of March, 1888--I was -returning from a journey to a patient (for I had now returned to -civil practice), when my way led me through Baker Street. As I -passed the well-remembered door, which must always be associated -in my mind with my wooing, and with the dark incidents of the -Study in Scarlet, I was seized with a keen desire to see Holmes -again, and to know how he was employing his extraordinary powers. -His rooms were brilliantly lit, and, even as I looked up, I saw -his tall, spare figure pass twice in a dark silhouette against -the blind. He was pacing the room swiftly, eagerly, with his head -sunk upon his chest and his hands clasped behind him. To me, who -knew his every mood and habit, his attitude and manner told their -own story. He was at work again. He had risen out of his -drug-created dreams and was hot upon the scent of some new -problem. I rang the bell and was shown up to the chamber which -had formerly been in part my own. - -His manner was not effusive. It seldom was; but he was glad, I -think, to see me. With hardly a word spoken, but with a kindly -eye, he waved me to an armchair, threw across his case of cigars, -and indicated a spirit case and a gasogene in the corner. Then he -stood before the fire and looked me over in his singular -introspective fashion. - -"Wedlock suits you," he remarked. "I think, Watson, that you have -put on seven and a half pounds since I saw you." - -"Seven!" I answered. - -"Indeed, I should have thought a little more. Just a trifle more, -I fancy, Watson. And in practice again, I observe. You did not -tell me that you intended to go into harness." - -"Then, how do you know?" - -"I see it, I deduce it. How do I know that you have been getting -yourself very wet lately, and that you have a most clumsy and -careless servant girl?" - -"My dear Holmes," said I, "this is too much. You would certainly -have been burned, had you lived a few centuries ago. It is true -that I had a country walk on Thursday and came home in a dreadful -mess, but as I have changed my clothes I can't imagine how you -deduce it. As to Mary Jane, she is incorrigible, and my wife has -given her notice, but there, again, I fail to see how you work it -out." - -He chuckled to himself and rubbed his long, nervous hands -together. - -"It is simplicity itself," said he; "my eyes tell me that on the -inside of your left shoe, just where the firelight strikes it, -the leather is scored by six almost parallel cuts. Obviously they -have been caused by someone who has very carelessly scraped round -the edges of the sole in order to remove crusted mud from it. -Hence, you see, my double deduction that you had been out in vile -weather, and that you had a particularly malignant boot-slitting -specimen of the London slavey. As to your practice, if a -gentleman walks into my rooms smelling of iodoform, with a black -mark of nitrate of silver upon his right forefinger, and a bulge -on the right side of his top-hat to show where he has secreted -his stethoscope, I must be dull, indeed, if I do not pronounce -him to be an active member of the medical profession." - -I could not help laughing at the ease with which he explained his -process of deduction. "When I hear you give your reasons," I -remarked, "the thing always appears to me to be so ridiculously -simple that I could easily do it myself, though at each -successive instance of your reasoning I am baffled until you -explain your process. And yet I believe that my eyes are as good -as yours." - -"Quite so," he answered, lighting a cigarette, and throwing -himself down into an armchair. "You see, but you do not observe. -The distinction is clear. For example, you have frequently seen -the steps which lead up from the hall to this room." - -"Frequently." - -"How often?" - -"Well, some hundreds of times." - -"Then how many are there?" - -"How many? I don't know." - -"Quite so! You have not observed. And yet you have seen. That is -just my point. Now, I know that there are seventeen steps, -because I have both seen and observed. By-the-way, since you are -interested in these little problems, and since you are good -enough to chronicle one or two of my trifling experiences, you -may be interested in this." He threw over a sheet of thick, -pink-tinted note-paper which had been lying open upon the table. -"It came by the last post," said he. "Read it aloud." - -The note was undated, and without either signature or address. - -"There will call upon you to-night, at a quarter to eight -o'clock," it said, "a gentleman who desires to consult you upon a -matter of the very deepest moment. Your recent services to one of -the royal houses of Europe have shown that you are one who may -safely be trusted with matters which are of an importance which -can hardly be exaggerated. This account of you we have from all -quarters received. Be in your chamber then at that hour, and do -not take it amiss if your visitor wear a mask." - -"This is indeed a mystery," I remarked. "What do you imagine that -it means?" - -"I have no data yet. It is a capital mistake to theorize before -one has data. Insensibly one begins to twist facts to suit -theories, instead of theories to suit facts. But the note itself. -What do you deduce from it?" - -I carefully examined the writing, and the paper upon which it was -written. - -"The man who wrote it was presumably well to do," I remarked, -endeavouring to imitate my companion's processes. "Such paper -could not be bought under half a crown a packet. It is peculiarly -strong and stiff." - -"Peculiar--that is the very word," said Holmes. "It is not an -English paper at all. Hold it up to the light." - -I did so, and saw a large "E" with a small "g," a "P," and a -large "G" with a small "t" woven into the texture of the paper. - -"What do you make of that?" asked Holmes. - -"The name of the maker, no doubt; or his monogram, rather." - -"Not at all. The 'G' with the small 't' stands for -'Gesellschaft,' which is the German for 'Company.' It is a -customary contraction like our 'Co.' 'P,' of course, stands for -'Papier.' Now for the 'Eg.' Let us glance at our Continental -Gazetteer." He took down a heavy brown volume from his shelves. -"Eglow, Eglonitz--here we are, Egria. It is in a German-speaking -country--in Bohemia, not far from Carlsbad. 'Remarkable as being -the scene of the death of Wallenstein, and for its numerous -glass-factories and paper-mills.' Ha, ha, my boy, what do you -make of that?" His eyes sparkled, and he sent up a great blue -triumphant cloud from his cigarette. - -"The paper was made in Bohemia," I said. - -"Precisely. And the man who wrote the note is a German. Do you -note the peculiar construction of the sentence--'This account of -you we have from all quarters received.' A Frenchman or Russian -could not have written that. It is the German who is so -uncourteous to his verbs. It only remains, therefore, to discover -what is wanted by this German who writes upon Bohemian paper and -prefers wearing a mask to showing his face. And here he comes, if -I am not mistaken, to resolve all our doubts." - -As he spoke there was the sharp sound of horses' hoofs and -grating wheels against the curb, followed by a sharp pull at the -bell. Holmes whistled. - -"A pair, by the sound," said he. "Yes," he continued, glancing -out of the window. "A nice little brougham and a pair of -beauties. A hundred and fifty guineas apiece. There's money in -this case, Watson, if there is nothing else." - -"I think that I had better go, Holmes." - -"Not a bit, Doctor. Stay where you are. I am lost without my -Boswell. And this promises to be interesting. It would be a pity -to miss it." - -"But your client--" - -"Never mind him. I may want your help, and so may he. Here he -comes. Sit down in that armchair, Doctor, and give us your best -attention." - -A slow and heavy step, which had been heard upon the stairs and -in the passage, paused immediately outside the door. Then there -was a loud and authoritative tap. - -"Come in!" said Holmes. - -A man entered who could hardly have been less than six feet six -inches in height, with the chest and limbs of a Hercules. His -dress was rich with a richness which would, in England, be looked -upon as akin to bad taste. Heavy bands of astrakhan were slashed -across the sleeves and fronts of his double-breasted coat, while -the deep blue cloak which was thrown over his shoulders was lined -with flame-coloured silk and secured at the neck with a brooch -which consisted of a single flaming beryl. Boots which extended -halfway up his calves, and which were trimmed at the tops with -rich brown fur, completed the impression of barbaric opulence -which was suggested by his whole appearance. He carried a -broad-brimmed hat in his hand, while he wore across the upper -part of his face, extending down past the cheekbones, a black -vizard mask, which he had apparently adjusted that very moment, -for his hand was still raised to it as he entered. From the lower -part of the face he appeared to be a man of strong character, -with a thick, hanging lip, and a long, straight chin suggestive -of resolution pushed to the length of obstinacy. - -"You had my note?" he asked with a deep harsh voice and a -strongly marked German accent. "I told you that I would call." He -looked from one to the other of us, as if uncertain which to -address. - -"Pray take a seat," said Holmes. "This is my friend and -colleague, Dr. Watson, who is occasionally good enough to help me -in my cases. Whom have I the honour to address?" - -"You may address me as the Count Von Kramm, a Bohemian nobleman. -I understand that this gentleman, your friend, is a man of honour -and discretion, whom I may trust with a matter of the most -extreme importance. If not, I should much prefer to communicate -with you alone." - -I rose to go, but Holmes caught me by the wrist and pushed me -back into my chair. "It is both, or none," said he. "You may say -before this gentleman anything which you may say to me." - -The Count shrugged his broad shoulders. "Then I must begin," said -he, "by binding you both to absolute secrecy for two years; at -the end of that time the matter will be of no importance. At -present it is not too much to say that it is of such weight it -may have an influence upon European history." - -"I promise," said Holmes. - -"And I." - -"You will excuse this mask," continued our strange visitor. "The -august person who employs me wishes his agent to be unknown to -you, and I may confess at once that the title by which I have -just called myself is not exactly my own." - -"I was aware of it," said Holmes dryly. - -"The circumstances are of great delicacy, and every precaution -has to be taken to quench what might grow to be an immense -scandal and seriously compromise one of the reigning families of -Europe. To speak plainly, the matter implicates the great House -of Ormstein, hereditary kings of Bohemia." - -"I was also aware of that," murmured Holmes, settling himself -down in his armchair and closing his eyes. - -Our visitor glanced with some apparent surprise at the languid, -lounging figure of the man who had been no doubt depicted to him -as the most incisive reasoner and most energetic agent in Europe. -Holmes slowly reopened his eyes and looked impatiently at his -gigantic client. - -"If your Majesty would condescend to state your case," he -remarked, "I should be better able to advise you." - -The man sprang from his chair and paced up and down the room in -uncontrollable agitation. Then, with a gesture of desperation, he -tore the mask from his face and hurled it upon the ground. "You -are right," he cried; "I am the King. Why should I attempt to -conceal it?" - -"Why, indeed?" murmured Holmes. "Your Majesty had not spoken -before I was aware that I was addressing Wilhelm Gottsreich -Sigismond von Ormstein, Grand Duke of Cassel-Felstein, and -hereditary King of Bohemia." - -"But you can understand," said our strange visitor, sitting down -once more and passing his hand over his high white forehead, "you -can understand that I am not accustomed to doing such business in -my own person. Yet the matter was so delicate that I could not -confide it to an agent without putting myself in his power. I -have come incognito from Prague for the purpose of consulting -you." - -"Then, pray consult," said Holmes, shutting his eyes once more. - -"The facts are briefly these: Some five years ago, during a -lengthy visit to Warsaw, I made the acquaintance of the well-known -adventuress, Irene Adler. The name is no doubt familiar to you." - -"Kindly look her up in my index, Doctor," murmured Holmes without -opening his eyes. For many years he had adopted a system of -docketing all paragraphs concerning men and things, so that it -was difficult to name a subject or a person on which he could not -at once furnish information. In this case I found her biography -sandwiched in between that of a Hebrew rabbi and that of a -staff-commander who had written a monograph upon the deep-sea -fishes. - -"Let me see!" said Holmes. "Hum! Born in New Jersey in the year -1858. Contralto--hum! La Scala, hum! Prima donna Imperial Opera -of Warsaw--yes! Retired from operatic stage--ha! Living in -London--quite so! Your Majesty, as I understand, became entangled -with this young person, wrote her some compromising letters, and -is now desirous of getting those letters back." - -"Precisely so. But how--" - -"Was there a secret marriage?" - -"None." - -"No legal papers or certificates?" - -"None." - -"Then I fail to follow your Majesty. If this young person should -produce her letters for blackmailing or other purposes, how is -she to prove their authenticity?" - -"There is the writing." - -"Pooh, pooh! Forgery." - -"My private note-paper." - -"Stolen." - -"My own seal." - -"Imitated." - -"My photograph." - -"Bought." - -"We were both in the photograph." - -"Oh, dear! That is very bad! Your Majesty has indeed committed an -indiscretion." - -"I was mad--insane." - -"You have compromised yourself seriously." - -"I was only Crown Prince then. I was young. I am but thirty now." - -"It must be recovered." - -"We have tried and failed." - -"Your Majesty must pay. It must be bought." - -"She will not sell." - -"Stolen, then." - -"Five attempts have been made. Twice burglars in my pay ransacked -her house. Once we diverted her luggage when she travelled. Twice -she has been waylaid. There has been no result." - -"No sign of it?" - -"Absolutely none." - -Holmes laughed. "It is quite a pretty little problem," said he. - -"But a very serious one to me," returned the King reproachfully. - -"Very, indeed. And what does she propose to do with the -photograph?" - -"To ruin me." - -"But how?" - -"I am about to be married." - -"So I have heard." - -"To Clotilde Lothman von Saxe-Meningen, second daughter of the -King of Scandinavia. You may know the strict principles of her -family. She is herself the very soul of delicacy. A shadow of a -doubt as to my conduct would bring the matter to an end." - -"And Irene Adler?" - -"Threatens to send them the photograph. And she will do it. I -know that she will do it. You do not know her, but she has a soul -of steel. She has the face of the most beautiful of women, and -the mind of the most resolute of men. Rather than I should marry -another woman, there are no lengths to which she would not -go--none." - -"You are sure that she has not sent it yet?" - -"I am sure." - -"And why?" - -"Because she has said that she would send it on the day when the -betrothal was publicly proclaimed. That will be next Monday." - -"Oh, then we have three days yet," said Holmes with a yawn. "That -is very fortunate, as I have one or two matters of importance to -look into just at present. Your Majesty will, of course, stay in -London for the present?" - -"Certainly. You will find me at the Langham under the name of the -Count Von Kramm." - -"Then I shall drop you a line to let you know how we progress." - -"Pray do so. I shall be all anxiety." - -"Then, as to money?" - -"You have carte blanche." - -"Absolutely?" - -"I tell you that I would give one of the provinces of my kingdom -to have that photograph." - -"And for present expenses?" - -The King took a heavy chamois leather bag from under his cloak -and laid it on the table. - -"There are three hundred pounds in gold and seven hundred in -notes," he said. - -Holmes scribbled a receipt upon a sheet of his note-book and -handed it to him. - -"And Mademoiselle's address?" he asked. - -"Is Briony Lodge, Serpentine Avenue, St. John's Wood." - -Holmes took a note of it. "One other question," said he. "Was the -photograph a cabinet?" - -"It was." - -"Then, good-night, your Majesty, and I trust that we shall soon -have some good news for you. And good-night, Watson," he added, -as the wheels of the royal brougham rolled down the street. "If -you will be good enough to call to-morrow afternoon at three -o'clock I should like to chat this little matter over with you." - - -II. - -At three o'clock precisely I was at Baker Street, but Holmes had -not yet returned. The landlady informed me that he had left the -house shortly after eight o'clock in the morning. I sat down -beside the fire, however, with the intention of awaiting him, -however long he might be. I was already deeply interested in his -inquiry, for, though it was surrounded by none of the grim and -strange features which were associated with the two crimes which -I have already recorded, still, the nature of the case and the -exalted station of his client gave it a character of its own. -Indeed, apart from the nature of the investigation which my -friend had on hand, there was something in his masterly grasp of -a situation, and his keen, incisive reasoning, which made it a -pleasure to me to study his system of work, and to follow the -quick, subtle methods by which he disentangled the most -inextricable mysteries. So accustomed was I to his invariable -success that the very possibility of his failing had ceased to -enter into my head. - -It was close upon four before the door opened, and a -drunken-looking groom, ill-kempt and side-whiskered, with an -inflamed face and disreputable clothes, walked into the room. -Accustomed as I was to my friend's amazing powers in the use of -disguises, I had to look three times before I was certain that it -was indeed he. With a nod he vanished into the bedroom, whence he -emerged in five minutes tweed-suited and respectable, as of old. -Putting his hands into his pockets, he stretched out his legs in -front of the fire and laughed heartily for some minutes. - -"Well, really!" he cried, and then he choked and laughed again -until he was obliged to lie back, limp and helpless, in the -chair. - -"What is it?" - -"It's quite too funny. I am sure you could never guess how I -employed my morning, or what I ended by doing." - -"I can't imagine. I suppose that you have been watching the -habits, and perhaps the house, of Miss Irene Adler." - -"Quite so; but the sequel was rather unusual. I will tell you, -however. I left the house a little after eight o'clock this -morning in the character of a groom out of work. There is a -wonderful sympathy and freemasonry among horsey men. Be one of -them, and you will know all that there is to know. I soon found -Briony Lodge. It is a bijou villa, with a garden at the back, but -built out in front right up to the road, two stories. Chubb lock -to the door. Large sitting-room on the right side, well -furnished, with long windows almost to the floor, and those -preposterous English window fasteners which a child could open. -Behind there was nothing remarkable, save that the passage window -could be reached from the top of the coach-house. I walked round -it and examined it closely from every point of view, but without -noting anything else of interest. - -"I then lounged down the street and found, as I expected, that -there was a mews in a lane which runs down by one wall of the -garden. I lent the ostlers a hand in rubbing down their horses, -and received in exchange twopence, a glass of half and half, two -fills of shag tobacco, and as much information as I could desire -about Miss Adler, to say nothing of half a dozen other people in -the neighbourhood in whom I was not in the least interested, but -whose biographies I was compelled to listen to." - -"And what of Irene Adler?" I asked. - -"Oh, she has turned all the men's heads down in that part. She is -the daintiest thing under a bonnet on this planet. So say the -Serpentine-mews, to a man. She lives quietly, sings at concerts, -drives out at five every day, and returns at seven sharp for -dinner. Seldom goes out at other times, except when she sings. -Has only one male visitor, but a good deal of him. He is dark, -handsome, and dashing, never calls less than once a day, and -often twice. He is a Mr. Godfrey Norton, of the Inner Temple. See -the advantages of a cabman as a confidant. They had driven him -home a dozen times from Serpentine-mews, and knew all about him. -When I had listened to all they had to tell, I began to walk up -and down near Briony Lodge once more, and to think over my plan -of campaign. - -"This Godfrey Norton was evidently an important factor in the -matter. He was a lawyer. That sounded ominous. What was the -relation between them, and what the object of his repeated -visits? Was she his client, his friend, or his mistress? If the -former, she had probably transferred the photograph to his -keeping. If the latter, it was less likely. On the issue of this -question depended whether I should continue my work at Briony -Lodge, or turn my attention to the gentleman's chambers in the -Temple. It was a delicate point, and it widened the field of my -inquiry. I fear that I bore you with these details, but I have to -let you see my little difficulties, if you are to understand the -situation." - -"I am following you closely," I answered. - -"I was still balancing the matter in my mind when a hansom cab -drove up to Briony Lodge, and a gentleman sprang out. He was a -remarkably handsome man, dark, aquiline, and moustached--evidently -the man of whom I had heard. He appeared to be in a -great hurry, shouted to the cabman to wait, and brushed past the -maid who opened the door with the air of a man who was thoroughly -at home. - -"He was in the house about half an hour, and I could catch -glimpses of him in the windows of the sitting-room, pacing up and -down, talking excitedly, and waving his arms. Of her I could see -nothing. Presently he emerged, looking even more flurried than -before. As he stepped up to the cab, he pulled a gold watch from -his pocket and looked at it earnestly, 'Drive like the devil,' he -shouted, 'first to Gross & Hankey's in Regent Street, and then to -the Church of St. Monica in the Edgeware Road. Half a guinea if -you do it in twenty minutes!' - -"Away they went, and I was just wondering whether I should not do -well to follow them when up the lane came a neat little landau, -the coachman with his coat only half-buttoned, and his tie under -his ear, while all the tags of his harness were sticking out of -the buckles. It hadn't pulled up before she shot out of the hall -door and into it. I only caught a glimpse of her at the moment, -but she was a lovely woman, with a face that a man might die for. - -"'The Church of St. Monica, John,' she cried, 'and half a -sovereign if you reach it in twenty minutes.' - -"This was quite too good to lose, Watson. I was just balancing -whether I should run for it, or whether I should perch behind her -landau when a cab came through the street. The driver looked -twice at such a shabby fare, but I jumped in before he could -object. 'The Church of St. Monica,' said I, 'and half a sovereign -if you reach it in twenty minutes.' It was twenty-five minutes to -twelve, and of course it was clear enough what was in the wind. - -"My cabby drove fast. I don't think I ever drove faster, but the -others were there before us. The cab and the landau with their -steaming horses were in front of the door when I arrived. I paid -the man and hurried into the church. There was not a soul there -save the two whom I had followed and a surpliced clergyman, who -seemed to be expostulating with them. They were all three -standing in a knot in front of the altar. I lounged up the side -aisle like any other idler who has dropped into a church. -Suddenly, to my surprise, the three at the altar faced round to -me, and Godfrey Norton came running as hard as he could towards -me. - -"'Thank God,' he cried. 'You'll do. Come! Come!' - -"'What then?' I asked. - -"'Come, man, come, only three minutes, or it won't be legal.' - -"I was half-dragged up to the altar, and before I knew where I was -I found myself mumbling responses which were whispered in my ear, -and vouching for things of which I knew nothing, and generally -assisting in the secure tying up of Irene Adler, spinster, to -Godfrey Norton, bachelor. It was all done in an instant, and -there was the gentleman thanking me on the one side and the lady -on the other, while the clergyman beamed on me in front. It was -the most preposterous position in which I ever found myself in my -life, and it was the thought of it that started me laughing just -now. It seems that there had been some informality about their -license, that the clergyman absolutely refused to marry them -without a witness of some sort, and that my lucky appearance -saved the bridegroom from having to sally out into the streets in -search of a best man. The bride gave me a sovereign, and I mean -to wear it on my watch-chain in memory of the occasion." - -"This is a very unexpected turn of affairs," said I; "and what -then?" - -"Well, I found my plans very seriously menaced. It looked as if -the pair might take an immediate departure, and so necessitate -very prompt and energetic measures on my part. At the church -door, however, they separated, he driving back to the Temple, and -she to her own house. 'I shall drive out in the park at five as -usual,' she said as she left him. I heard no more. They drove -away in different directions, and I went off to make my own -arrangements." - -"Which are?" - -"Some cold beef and a glass of beer," he answered, ringing the -bell. "I have been too busy to think of food, and I am likely to -be busier still this evening. By the way, Doctor, I shall want -your co-operation." - -"I shall be delighted." - -"You don't mind breaking the law?" - -"Not in the least." - -"Nor running a chance of arrest?" - -"Not in a good cause." - -"Oh, the cause is excellent!" - -"Then I am your man." - -"I was sure that I might rely on you." - -"But what is it you wish?" - -"When Mrs. Turner has brought in the tray I will make it clear to -you. Now," he said as he turned hungrily on the simple fare that -our landlady had provided, "I must discuss it while I eat, for I -have not much time. It is nearly five now. In two hours we must -be on the scene of action. Miss Irene, or Madame, rather, returns -from her drive at seven. We must be at Briony Lodge to meet her." - -"And what then?" - -"You must leave that to me. I have already arranged what is to -occur. There is only one point on which I must insist. You must -not interfere, come what may. You understand?" - -"I am to be neutral?" - -"To do nothing whatever. There will probably be some small -unpleasantness. Do not join in it. It will end in my being -conveyed into the house. Four or five minutes afterwards the -sitting-room window will open. You are to station yourself close -to that open window." - -"Yes." - -"You are to watch me, for I will be visible to you." - -"Yes." - -"And when I raise my hand--so--you will throw into the room what -I give you to throw, and will, at the same time, raise the cry of -fire. You quite follow me?" - -"Entirely." - -"It is nothing very formidable," he said, taking a long cigar-shaped -roll from his pocket. "It is an ordinary plumber's smoke-rocket, -fitted with a cap at either end to make it self-lighting. -Your task is confined to that. When you raise your cry of fire, -it will be taken up by quite a number of people. You may then -walk to the end of the street, and I will rejoin you in ten -minutes. I hope that I have made myself clear?" - -"I am to remain neutral, to get near the window, to watch you, -and at the signal to throw in this object, then to raise the cry -of fire, and to wait you at the corner of the street." - -"Precisely." - -"Then you may entirely rely on me." - -"That is excellent. I think, perhaps, it is almost time that I -prepare for the new role I have to play." - -He disappeared into his bedroom and returned in a few minutes in -the character of an amiable and simple-minded Nonconformist -clergyman. His broad black hat, his baggy trousers, his white -tie, his sympathetic smile, and general look of peering and -benevolent curiosity were such as Mr. John Hare alone could have -equalled. It was not merely that Holmes changed his costume. His -expression, his manner, his very soul seemed to vary with every -fresh part that he assumed. The stage lost a fine actor, even as -science lost an acute reasoner, when he became a specialist in -crime. - -It was a quarter past six when we left Baker Street, and it still -wanted ten minutes to the hour when we found ourselves in -Serpentine Avenue. It was already dusk, and the lamps were just -being lighted as we paced up and down in front of Briony Lodge, -waiting for the coming of its occupant. The house was just such -as I had pictured it from Sherlock Holmes' succinct description, -but the locality appeared to be less private than I expected. On -the contrary, for a small street in a quiet neighbourhood, it was -remarkably animated. There was a group of shabbily dressed men -smoking and laughing in a corner, a scissors-grinder with his -wheel, two guardsmen who were flirting with a nurse-girl, and -several well-dressed young men who were lounging up and down with -cigars in their mouths. - -"You see," remarked Holmes, as we paced to and fro in front of -the house, "this marriage rather simplifies matters. The -photograph becomes a double-edged weapon now. The chances are -that she would be as averse to its being seen by Mr. Godfrey -Norton, as our client is to its coming to the eyes of his -princess. Now the question is, Where are we to find the -photograph?" - -"Where, indeed?" - -"It is most unlikely that she carries it about with her. It is -cabinet size. Too large for easy concealment about a woman's -dress. She knows that the King is capable of having her waylaid -and searched. Two attempts of the sort have already been made. We -may take it, then, that she does not carry it about with her." - -"Where, then?" - -"Her banker or her lawyer. There is that double possibility. But -I am inclined to think neither. Women are naturally secretive, -and they like to do their own secreting. Why should she hand it -over to anyone else? She could trust her own guardianship, but -she could not tell what indirect or political influence might be -brought to bear upon a business man. Besides, remember that she -had resolved to use it within a few days. It must be where she -can lay her hands upon it. It must be in her own house." - -"But it has twice been burgled." - -"Pshaw! They did not know how to look." - -"But how will you look?" - -"I will not look." - -"What then?" - -"I will get her to show me." - -"But she will refuse." - -"She will not be able to. But I hear the rumble of wheels. It is -her carriage. Now carry out my orders to the letter." - -As he spoke the gleam of the side-lights of a carriage came round -the curve of the avenue. It was a smart little landau which -rattled up to the door of Briony Lodge. As it pulled up, one of -the loafing men at the corner dashed forward to open the door in -the hope of earning a copper, but was elbowed away by another -loafer, who had rushed up with the same intention. A fierce -quarrel broke out, which was increased by the two guardsmen, who -took sides with one of the loungers, and by the scissors-grinder, -who was equally hot upon the other side. A blow was struck, and -in an instant the lady, who had stepped from her carriage, was -the centre of a little knot of flushed and struggling men, who -struck savagely at each other with their fists and sticks. Holmes -dashed into the crowd to protect the lady; but just as he reached -her he gave a cry and dropped to the ground, with the blood -running freely down his face. At his fall the guardsmen took to -their heels in one direction and the loungers in the other, while -a number of better-dressed people, who had watched the scuffle -without taking part in it, crowded in to help the lady and to -attend to the injured man. Irene Adler, as I will still call her, -had hurried up the steps; but she stood at the top with her -superb figure outlined against the lights of the hall, looking -back into the street. - -"Is the poor gentleman much hurt?" she asked. - -"He is dead," cried several voices. - -"No, no, there's life in him!" shouted another. "But he'll be -gone before you can get him to hospital." - -"He's a brave fellow," said a woman. "They would have had the -lady's purse and watch if it hadn't been for him. They were a -gang, and a rough one, too. Ah, he's breathing now." - -"He can't lie in the street. May we bring him in, marm?" - -"Surely. Bring him into the sitting-room. There is a comfortable -sofa. This way, please!" - -Slowly and solemnly he was borne into Briony Lodge and laid out -in the principal room, while I still observed the proceedings -from my post by the window. The lamps had been lit, but the -blinds had not been drawn, so that I could see Holmes as he lay -upon the couch. I do not know whether he was seized with -compunction at that moment for the part he was playing, but I -know that I never felt more heartily ashamed of myself in my life -than when I saw the beautiful creature against whom I was -conspiring, or the grace and kindliness with which she waited -upon the injured man. And yet it would be the blackest treachery -to Holmes to draw back now from the part which he had intrusted -to me. I hardened my heart, and took the smoke-rocket from under -my ulster. After all, I thought, we are not injuring her. We are -but preventing her from injuring another. - -Holmes had sat up upon the couch, and I saw him motion like a man -who is in need of air. A maid rushed across and threw open the -window. At the same instant I saw him raise his hand and at the -signal I tossed my rocket into the room with a cry of "Fire!" The -word was no sooner out of my mouth than the whole crowd of -spectators, well dressed and ill--gentlemen, ostlers, and -servant-maids--joined in a general shriek of "Fire!" Thick clouds -of smoke curled through the room and out at the open window. I -caught a glimpse of rushing figures, and a moment later the voice -of Holmes from within assuring them that it was a false alarm. -Slipping through the shouting crowd I made my way to the corner -of the street, and in ten minutes was rejoiced to find my -friend's arm in mine, and to get away from the scene of uproar. -He walked swiftly and in silence for some few minutes until we -had turned down one of the quiet streets which lead towards the -Edgeware Road. - -"You did it very nicely, Doctor," he remarked. "Nothing could -have been better. It is all right." - -"You have the photograph?" - -"I know where it is." - -"And how did you find out?" - -"She showed me, as I told you she would." - -"I am still in the dark." - -"I do not wish to make a mystery," said he, laughing. "The matter -was perfectly simple. You, of course, saw that everyone in the -street was an accomplice. They were all engaged for the evening." - -"I guessed as much." - -"Then, when the row broke out, I had a little moist red paint in -the palm of my hand. I rushed forward, fell down, clapped my hand -to my face, and became a piteous spectacle. It is an old trick." - -"That also I could fathom." - -"Then they carried me in. She was bound to have me in. What else -could she do? And into her sitting-room, which was the very room -which I suspected. It lay between that and her bedroom, and I was -determined to see which. They laid me on a couch, I motioned for -air, they were compelled to open the window, and you had your -chance." - -"How did that help you?" - -"It was all-important. When a woman thinks that her house is on -fire, her instinct is at once to rush to the thing which she -values most. It is a perfectly overpowering impulse, and I have -more than once taken advantage of it. In the case of the -Darlington substitution scandal it was of use to me, and also in -the Arnsworth Castle business. A married woman grabs at her baby; -an unmarried one reaches for her jewel-box. Now it was clear to -me that our lady of to-day had nothing in the house more precious -to her than what we are in quest of. She would rush to secure it. -The alarm of fire was admirably done. The smoke and shouting were -enough to shake nerves of steel. She responded beautifully. The -photograph is in a recess behind a sliding panel just above the -right bell-pull. She was there in an instant, and I caught a -glimpse of it as she half-drew it out. When I cried out that it -was a false alarm, she replaced it, glanced at the rocket, rushed -from the room, and I have not seen her since. I rose, and, making -my excuses, escaped from the house. I hesitated whether to -attempt to secure the photograph at once; but the coachman had -come in, and as he was watching me narrowly it seemed safer to -wait. A little over-precipitance may ruin all." - -"And now?" I asked. - -"Our quest is practically finished. I shall call with the King -to-morrow, and with you, if you care to come with us. We will be -shown into the sitting-room to wait for the lady, but it is -probable that when she comes she may find neither us nor the -photograph. It might be a satisfaction to his Majesty to regain -it with his own hands." - -"And when will you call?" - -"At eight in the morning. She will not be up, so that we shall -have a clear field. Besides, we must be prompt, for this marriage -may mean a complete change in her life and habits. I must wire to -the King without delay." - -We had reached Baker Street and had stopped at the door. He was -searching his pockets for the key when someone passing said: - -"Good-night, Mister Sherlock Holmes." - -There were several people on the pavement at the time, but the -greeting appeared to come from a slim youth in an ulster who had -hurried by. - -"I've heard that voice before," said Holmes, staring down the -dimly lit street. "Now, I wonder who the deuce that could have -been." - - -III. - -I slept at Baker Street that night, and we were engaged upon our -toast and coffee in the morning when the King of Bohemia rushed -into the room. - -"You have really got it!" he cried, grasping Sherlock Holmes by -either shoulder and looking eagerly into his face. - -"Not yet." - -"But you have hopes?" - -"I have hopes." - -"Then, come. I am all impatience to be gone." - -"We must have a cab." - -"No, my brougham is waiting." - -"Then that will simplify matters." We descended and started off -once more for Briony Lodge. - -"Irene Adler is married," remarked Holmes. - -"Married! When?" - -"Yesterday." - -"But to whom?" - -"To an English lawyer named Norton." - -"But she could not love him." - -"I am in hopes that she does." - -"And why in hopes?" - -"Because it would spare your Majesty all fear of future -annoyance. If the lady loves her husband, she does not love your -Majesty. If she does not love your Majesty, there is no reason -why she should interfere with your Majesty's plan." - -"It is true. And yet--Well! I wish she had been of my own -station! What a queen she would have made!" He relapsed into a -moody silence, which was not broken until we drew up in -Serpentine Avenue. - -The door of Briony Lodge was open, and an elderly woman stood -upon the steps. She watched us with a sardonic eye as we stepped -from the brougham. - -"Mr. Sherlock Holmes, I believe?" said she. - -"I am Mr. Holmes," answered my companion, looking at her with a -questioning and rather startled gaze. - -"Indeed! My mistress told me that you were likely to call. She -left this morning with her husband by the 5:15 train from Charing -Cross for the Continent." - -"What!" Sherlock Holmes staggered back, white with chagrin and -surprise. "Do you mean that she has left England?" - -"Never to return." - -"And the papers?" asked the King hoarsely. "All is lost." - -"We shall see." He pushed past the servant and rushed into the -drawing-room, followed by the King and myself. The furniture was -scattered about in every direction, with dismantled shelves and -open drawers, as if the lady had hurriedly ransacked them before -her flight. Holmes rushed at the bell-pull, tore back a small -sliding shutter, and, plunging in his hand, pulled out a -photograph and a letter. The photograph was of Irene Adler -herself in evening dress, the letter was superscribed to -"Sherlock Holmes, Esq. To be left till called for." My friend -tore it open and we all three read it together. It was dated at -midnight of the preceding night and ran in this way: - -"MY DEAR MR. SHERLOCK HOLMES,--You really did it very well. You -took me in completely. Until after the alarm of fire, I had not a -suspicion. But then, when I found how I had betrayed myself, I -began to think. I had been warned against you months ago. I had -been told that if the King employed an agent it would certainly -be you. And your address had been given me. Yet, with all this, -you made me reveal what you wanted to know. Even after I became -suspicious, I found it hard to think evil of such a dear, kind -old clergyman. But, you know, I have been trained as an actress -myself. Male costume is nothing new to me. I often take advantage -of the freedom which it gives. I sent John, the coachman, to -watch you, ran up stairs, got into my walking-clothes, as I call -them, and came down just as you departed. - -"Well, I followed you to your door, and so made sure that I was -really an object of interest to the celebrated Mr. Sherlock -Holmes. Then I, rather imprudently, wished you good-night, and -started for the Temple to see my husband. - -"We both thought the best resource was flight, when pursued by -so formidable an antagonist; so you will find the nest empty when -you call to-morrow. As to the photograph, your client may rest in -peace. I love and am loved by a better man than he. The King may -do what he will without hindrance from one whom he has cruelly -wronged. I keep it only to safeguard myself, and to preserve a -weapon which will always secure me from any steps which he might -take in the future. I leave a photograph which he might care to -possess; and I remain, dear Mr. Sherlock Holmes, - - "Very truly yours, - "IRENE NORTON, née ADLER." - -"What a woman--oh, what a woman!" cried the King of Bohemia, when -we had all three read this epistle. "Did I not tell you how quick -and resolute she was? Would she not have made an admirable queen? -Is it not a pity that she was not on my level?" - -"From what I have seen of the lady she seems indeed to be on a -very different level to your Majesty," said Holmes coldly. "I am -sorry that I have not been able to bring your Majesty's business -to a more successful conclusion." - -"On the contrary, my dear sir," cried the King; "nothing could be -more successful. I know that her word is inviolate. The -photograph is now as safe as if it were in the fire." - -"I am glad to hear your Majesty say so." - -"I am immensely indebted to you. Pray tell me in what way I can -reward you. This ring--" He slipped an emerald snake ring from -his finger and held it out upon the palm of his hand. - -"Your Majesty has something which I should value even more -highly," said Holmes. - -"You have but to name it." - -"This photograph!" - -The King stared at him in amazement. - -"Irene's photograph!" he cried. "Certainly, if you wish it." - -"I thank your Majesty. Then there is no more to be done in the -matter. I have the honour to wish you a very good-morning." He -bowed, and, turning away without observing the hand which the -King had stretched out to him, he set off in my company for his -chambers. - -And that was how a great scandal threatened to affect the kingdom -of Bohemia, and how the best plans of Mr. Sherlock Holmes were -beaten by a woman's wit. He used to make merry over the -cleverness of women, but I have not heard him do it of late. And -when he speaks of Irene Adler, or when he refers to her -photograph, it is always under the honourable title of the woman. - - - -ADVENTURE II. THE RED-HEADED LEAGUE - -I had called upon my friend, Mr. Sherlock Holmes, one day in the -autumn of last year and found him in deep conversation with a -very stout, florid-faced, elderly gentleman with fiery red hair. -With an apology for my intrusion, I was about to withdraw when -Holmes pulled me abruptly into the room and closed the door -behind me. - -"You could not possibly have come at a better time, my dear -Watson," he said cordially. - -"I was afraid that you were engaged." - -"So I am. Very much so." - -"Then I can wait in the next room." - -"Not at all. This gentleman, Mr. Wilson, has been my partner and -helper in many of my most successful cases, and I have no -doubt that he will be of the utmost use to me in yours also." - -The stout gentleman half rose from his chair and gave a bob of -greeting, with a quick little questioning glance from his small -fat-encircled eyes. - -"Try the settee," said Holmes, relapsing into his armchair and -putting his fingertips together, as was his custom when in -judicial moods. "I know, my dear Watson, that you share my love -of all that is bizarre and outside the conventions and humdrum -routine of everyday life. You have shown your relish for it by -the enthusiasm which has prompted you to chronicle, and, if you -will excuse my saying so, somewhat to embellish so many of my own -little adventures." - -"Your cases have indeed been of the greatest interest to me," I -observed. - -"You will remember that I remarked the other day, just before we -went into the very simple problem presented by Miss Mary -Sutherland, that for strange effects and extraordinary -combinations we must go to life itself, which is always far more -daring than any effort of the imagination." - -"A proposition which I took the liberty of doubting." - -"You did, Doctor, but none the less you must come round to my -view, for otherwise I shall keep on piling fact upon fact on you -until your reason breaks down under them and acknowledges me to -be right. Now, Mr. Jabez Wilson here has been good enough to call -upon me this morning, and to begin a narrative which promises to -be one of the most singular which I have listened to for some -time. You have heard me remark that the strangest and most unique -things are very often connected not with the larger but with the -smaller crimes, and occasionally, indeed, where there is room for -doubt whether any positive crime has been committed. As far as I -have heard it is impossible for me to say whether the present -case is an instance of crime or not, but the course of events is -certainly among the most singular that I have ever listened to. -Perhaps, Mr. Wilson, you would have the great kindness to -recommence your narrative. I ask you not merely because my friend -Dr. Watson has not heard the opening part but also because the -peculiar nature of the story makes me anxious to have every -possible detail from your lips. As a rule, when I have heard some -slight indication of the course of events, I am able to guide -myself by the thousands of other similar cases which occur to my -memory. In the present instance I am forced to admit that the -facts are, to the best of my belief, unique." - -The portly client puffed out his chest with an appearance of some -little pride and pulled a dirty and wrinkled newspaper from the -inside pocket of his greatcoat. As he glanced down the -advertisement column, with his head thrust forward and the paper -flattened out upon his knee, I took a good look at the man and -endeavoured, after the fashion of my companion, to read the -indications which might be presented by his dress or appearance. - -I did not gain very much, however, by my inspection. Our visitor -bore every mark of being an average commonplace British -tradesman, obese, pompous, and slow. He wore rather baggy grey -shepherd's check trousers, a not over-clean black frock-coat, -unbuttoned in the front, and a drab waistcoat with a heavy brassy -Albert chain, and a square pierced bit of metal dangling down as -an ornament. A frayed top-hat and a faded brown overcoat with a -wrinkled velvet collar lay upon a chair beside him. Altogether, -look as I would, there was nothing remarkable about the man save -his blazing red head, and the expression of extreme chagrin and -discontent upon his features. - -Sherlock Holmes' quick eye took in my occupation, and he shook -his head with a smile as he noticed my questioning glances. -"Beyond the obvious facts that he has at some time done manual -labour, that he takes snuff, that he is a Freemason, that he has -been in China, and that he has done a considerable amount of -writing lately, I can deduce nothing else." - -Mr. Jabez Wilson started up in his chair, with his forefinger -upon the paper, but his eyes upon my companion. - -"How, in the name of good-fortune, did you know all that, Mr. -Holmes?" he asked. "How did you know, for example, that I did -manual labour. It's as true as gospel, for I began as a ship's -carpenter." - -"Your hands, my dear sir. Your right hand is quite a size larger -than your left. You have worked with it, and the muscles are more -developed." - -"Well, the snuff, then, and the Freemasonry?" - -"I won't insult your intelligence by telling you how I read that, -especially as, rather against the strict rules of your order, you -use an arc-and-compass breastpin." - -"Ah, of course, I forgot that. But the writing?" - -"What else can be indicated by that right cuff so very shiny for -five inches, and the left one with the smooth patch near the -elbow where you rest it upon the desk?" - -"Well, but China?" - -"The fish that you have tattooed immediately above your right -wrist could only have been done in China. I have made a small -study of tattoo marks and have even contributed to the literature -of the subject. That trick of staining the fishes' scales of a -delicate pink is quite peculiar to China. When, in addition, I -see a Chinese coin hanging from your watch-chain, the matter -becomes even more simple." - -Mr. Jabez Wilson laughed heavily. "Well, I never!" said he. "I -thought at first that you had done something clever, but I see -that there was nothing in it, after all." - -"I begin to think, Watson," said Holmes, "that I make a mistake -in explaining. 'Omne ignotum pro magnifico,' you know, and my -poor little reputation, such as it is, will suffer shipwreck if I -am so candid. Can you not find the advertisement, Mr. Wilson?" - -"Yes, I have got it now," he answered with his thick red finger -planted halfway down the column. "Here it is. This is what began -it all. You just read it for yourself, sir." - -I took the paper from him and read as follows: - -"TO THE RED-HEADED LEAGUE: On account of the bequest of the late -Ezekiah Hopkins, of Lebanon, Pennsylvania, U. S. A., there is now -another vacancy open which entitles a member of the League to a -salary of 4 pounds a week for purely nominal services. All -red-headed men who are sound in body and mind and above the age -of twenty-one years, are eligible. Apply in person on Monday, at -eleven o'clock, to Duncan Ross, at the offices of the League, 7 -Pope's Court, Fleet Street." - -"What on earth does this mean?" I ejaculated after I had twice -read over the extraordinary announcement. - -Holmes chuckled and wriggled in his chair, as was his habit when -in high spirits. "It is a little off the beaten track, isn't it?" -said he. "And now, Mr. Wilson, off you go at scratch and tell us -all about yourself, your household, and the effect which this -advertisement had upon your fortunes. You will first make a note, -Doctor, of the paper and the date." - -"It is The Morning Chronicle of April 27, 1890. Just two months -ago." - -"Very good. Now, Mr. Wilson?" - -"Well, it is just as I have been telling you, Mr. Sherlock -Holmes," said Jabez Wilson, mopping his forehead; "I have a small -pawnbroker's business at Coburg Square, near the City. It's not a -very large affair, and of late years it has not done more than -just give me a living. I used to be able to keep two assistants, -but now I only keep one; and I would have a job to pay him but -that he is willing to come for half wages so as to learn the -business." - -"What is the name of this obliging youth?" asked Sherlock Holmes. - -"His name is Vincent Spaulding, and he's not such a youth, -either. It's hard to say his age. I should not wish a smarter -assistant, Mr. Holmes; and I know very well that he could better -himself and earn twice what I am able to give him. But, after -all, if he is satisfied, why should I put ideas in his head?" - -"Why, indeed? You seem most fortunate in having an employé who -comes under the full market price. It is not a common experience -among employers in this age. I don't know that your assistant is -not as remarkable as your advertisement." - -"Oh, he has his faults, too," said Mr. Wilson. "Never was such a -fellow for photography. Snapping away with a camera when he ought -to be improving his mind, and then diving down into the cellar -like a rabbit into its hole to develop his pictures. That is his -main fault, but on the whole he's a good worker. There's no vice -in him." - -"He is still with you, I presume?" - -"Yes, sir. He and a girl of fourteen, who does a bit of simple -cooking and keeps the place clean--that's all I have in the -house, for I am a widower and never had any family. We live very -quietly, sir, the three of us; and we keep a roof over our heads -and pay our debts, if we do nothing more. - -"The first thing that put us out was that advertisement. -Spaulding, he came down into the office just this day eight -weeks, with this very paper in his hand, and he says: - -"'I wish to the Lord, Mr. Wilson, that I was a red-headed man.' - -"'Why that?' I asks. - -"'Why,' says he, 'here's another vacancy on the League of the -Red-headed Men. It's worth quite a little fortune to any man who -gets it, and I understand that there are more vacancies than -there are men, so that the trustees are at their wits' end what -to do with the money. If my hair would only change colour, here's -a nice little crib all ready for me to step into.' - -"'Why, what is it, then?' I asked. You see, Mr. Holmes, I am a -very stay-at-home man, and as my business came to me instead of -my having to go to it, I was often weeks on end without putting -my foot over the door-mat. In that way I didn't know much of what -was going on outside, and I was always glad of a bit of news. - -"'Have you never heard of the League of the Red-headed Men?' he -asked with his eyes open. - -"'Never.' - -"'Why, I wonder at that, for you are eligible yourself for one -of the vacancies.' - -"'And what are they worth?' I asked. - -"'Oh, merely a couple of hundred a year, but the work is slight, -and it need not interfere very much with one's other -occupations.' - -"Well, you can easily think that that made me prick up my ears, -for the business has not been over-good for some years, and an -extra couple of hundred would have been very handy. - -"'Tell me all about it,' said I. - -"'Well,' said he, showing me the advertisement, 'you can see for -yourself that the League has a vacancy, and there is the address -where you should apply for particulars. As far as I can make out, -the League was founded by an American millionaire, Ezekiah -Hopkins, who was very peculiar in his ways. He was himself -red-headed, and he had a great sympathy for all red-headed men; -so when he died it was found that he had left his enormous -fortune in the hands of trustees, with instructions to apply the -interest to the providing of easy berths to men whose hair is of -that colour. From all I hear it is splendid pay and very little to -do.' - -"'But,' said I, 'there would be millions of red-headed men who -would apply.' - -"'Not so many as you might think,' he answered. 'You see it is -really confined to Londoners, and to grown men. This American had -started from London when he was young, and he wanted to do the -old town a good turn. Then, again, I have heard it is no use your -applying if your hair is light red, or dark red, or anything but -real bright, blazing, fiery red. Now, if you cared to apply, Mr. -Wilson, you would just walk in; but perhaps it would hardly be -worth your while to put yourself out of the way for the sake of a -few hundred pounds.' - -"Now, it is a fact, gentlemen, as you may see for yourselves, -that my hair is of a very full and rich tint, so that it seemed -to me that if there was to be any competition in the matter I -stood as good a chance as any man that I had ever met. Vincent -Spaulding seemed to know so much about it that I thought he might -prove useful, so I just ordered him to put up the shutters for -the day and to come right away with me. He was very willing to -have a holiday, so we shut the business up and started off for -the address that was given us in the advertisement. - -"I never hope to see such a sight as that again, Mr. Holmes. From -north, south, east, and west every man who had a shade of red in -his hair had tramped into the city to answer the advertisement. -Fleet Street was choked with red-headed folk, and Pope's Court -looked like a coster's orange barrow. I should not have thought -there were so many in the whole country as were brought together -by that single advertisement. Every shade of colour they -were--straw, lemon, orange, brick, Irish-setter, liver, clay; -but, as Spaulding said, there were not many who had the real -vivid flame-coloured tint. When I saw how many were waiting, I -would have given it up in despair; but Spaulding would not hear -of it. How he did it I could not imagine, but he pushed and -pulled and butted until he got me through the crowd, and right up -to the steps which led to the office. There was a double stream -upon the stair, some going up in hope, and some coming back -dejected; but we wedged in as well as we could and soon found -ourselves in the office." - -"Your experience has been a most entertaining one," remarked -Holmes as his client paused and refreshed his memory with a huge -pinch of snuff. "Pray continue your very interesting statement." - -"There was nothing in the office but a couple of wooden chairs -and a deal table, behind which sat a small man with a head that -was even redder than mine. He said a few words to each candidate -as he came up, and then he always managed to find some fault in -them which would disqualify them. Getting a vacancy did not seem -to be such a very easy matter, after all. However, when our turn -came the little man was much more favourable to me than to any of -the others, and he closed the door as we entered, so that he -might have a private word with us. - -"'This is Mr. Jabez Wilson,' said my assistant, 'and he is -willing to fill a vacancy in the League.' - -"'And he is admirably suited for it,' the other answered. 'He has -every requirement. I cannot recall when I have seen anything so -fine.' He took a step backward, cocked his head on one side, and -gazed at my hair until I felt quite bashful. Then suddenly he -plunged forward, wrung my hand, and congratulated me warmly on my -success. - -"'It would be injustice to hesitate,' said he. 'You will, -however, I am sure, excuse me for taking an obvious precaution.' -With that he seized my hair in both his hands, and tugged until I -yelled with the pain. 'There is water in your eyes,' said he as -he released me. 'I perceive that all is as it should be. But we -have to be careful, for we have twice been deceived by wigs and -once by paint. I could tell you tales of cobbler's wax which -would disgust you with human nature.' He stepped over to the -window and shouted through it at the top of his voice that the -vacancy was filled. A groan of disappointment came up from below, -and the folk all trooped away in different directions until there -was not a red-head to be seen except my own and that of the -manager. - -"'My name,' said he, 'is Mr. Duncan Ross, and I am myself one of -the pensioners upon the fund left by our noble benefactor. Are -you a married man, Mr. Wilson? Have you a family?' - -"I answered that I had not. - -"His face fell immediately. - -"'Dear me!' he said gravely, 'that is very serious indeed! I am -sorry to hear you say that. The fund was, of course, for the -propagation and spread of the red-heads as well as for their -maintenance. It is exceedingly unfortunate that you should be a -bachelor.' - -"My face lengthened at this, Mr. Holmes, for I thought that I was -not to have the vacancy after all; but after thinking it over for -a few minutes he said that it would be all right. - -"'In the case of another,' said he, 'the objection might be -fatal, but we must stretch a point in favour of a man with such a -head of hair as yours. When shall you be able to enter upon your -new duties?' - -"'Well, it is a little awkward, for I have a business already,' -said I. - -"'Oh, never mind about that, Mr. Wilson!' said Vincent Spaulding. -'I should be able to look after that for you.' - -"'What would be the hours?' I asked. - -"'Ten to two.' - -"Now a pawnbroker's business is mostly done of an evening, Mr. -Holmes, especially Thursday and Friday evening, which is just -before pay-day; so it would suit me very well to earn a little in -the mornings. Besides, I knew that my assistant was a good man, -and that he would see to anything that turned up. - -"'That would suit me very well,' said I. 'And the pay?' - -"'Is 4 pounds a week.' - -"'And the work?' - -"'Is purely nominal.' - -"'What do you call purely nominal?' - -"'Well, you have to be in the office, or at least in the -building, the whole time. If you leave, you forfeit your whole -position forever. The will is very clear upon that point. You -don't comply with the conditions if you budge from the office -during that time.' - -"'It's only four hours a day, and I should not think of leaving,' -said I. - -"'No excuse will avail,' said Mr. Duncan Ross; 'neither sickness -nor business nor anything else. There you must stay, or you lose -your billet.' - -"'And the work?' - -"'Is to copy out the "Encyclopaedia Britannica." There is the first -volume of it in that press. You must find your own ink, pens, and -blotting-paper, but we provide this table and chair. Will you be -ready to-morrow?' - -"'Certainly,' I answered. - -"'Then, good-bye, Mr. Jabez Wilson, and let me congratulate you -once more on the important position which you have been fortunate -enough to gain.' He bowed me out of the room and I went home with -my assistant, hardly knowing what to say or do, I was so pleased -at my own good fortune. - -"Well, I thought over the matter all day, and by evening I was in -low spirits again; for I had quite persuaded myself that the -whole affair must be some great hoax or fraud, though what its -object might be I could not imagine. It seemed altogether past -belief that anyone could make such a will, or that they would pay -such a sum for doing anything so simple as copying out the -'Encyclopaedia Britannica.' Vincent Spaulding did what he could to -cheer me up, but by bedtime I had reasoned myself out of the -whole thing. However, in the morning I determined to have a look -at it anyhow, so I bought a penny bottle of ink, and with a -quill-pen, and seven sheets of foolscap paper, I started off for -Pope's Court. - -"Well, to my surprise and delight, everything was as right as -possible. The table was set out ready for me, and Mr. Duncan Ross -was there to see that I got fairly to work. He started me off -upon the letter A, and then he left me; but he would drop in from -time to time to see that all was right with me. At two o'clock he -bade me good-day, complimented me upon the amount that I had -written, and locked the door of the office after me. - -"This went on day after day, Mr. Holmes, and on Saturday the -manager came in and planked down four golden sovereigns for my -week's work. It was the same next week, and the same the week -after. Every morning I was there at ten, and every afternoon I -left at two. By degrees Mr. Duncan Ross took to coming in only -once of a morning, and then, after a time, he did not come in at -all. Still, of course, I never dared to leave the room for an -instant, for I was not sure when he might come, and the billet -was such a good one, and suited me so well, that I would not risk -the loss of it. - -"Eight weeks passed away like this, and I had written about -Abbots and Archery and Armour and Architecture and Attica, and -hoped with diligence that I might get on to the B's before very -long. It cost me something in foolscap, and I had pretty nearly -filled a shelf with my writings. And then suddenly the whole -business came to an end." - -"To an end?" - -"Yes, sir. And no later than this morning. I went to my work as -usual at ten o'clock, but the door was shut and locked, with a -little square of cardboard hammered on to the middle of the -panel with a tack. Here it is, and you can read for yourself." - -He held up a piece of white cardboard about the size of a sheet -of note-paper. It read in this fashion: - - THE RED-HEADED LEAGUE - - IS - - DISSOLVED. - - October 9, 1890. - -Sherlock Holmes and I surveyed this curt announcement and the -rueful face behind it, until the comical side of the affair so -completely overtopped every other consideration that we both -burst out into a roar of laughter. - -"I cannot see that there is anything very funny," cried our -client, flushing up to the roots of his flaming head. "If you can -do nothing better than laugh at me, I can go elsewhere." - -"No, no," cried Holmes, shoving him back into the chair from -which he had half risen. "I really wouldn't miss your case for -the world. It is most refreshingly unusual. But there is, if you -will excuse my saying so, something just a little funny about it. -Pray what steps did you take when you found the card upon the -door?" - -"I was staggered, sir. I did not know what to do. Then I called -at the offices round, but none of them seemed to know anything -about it. Finally, I went to the landlord, who is an accountant -living on the ground-floor, and I asked him if he could tell me -what had become of the Red-headed League. He said that he had -never heard of any such body. Then I asked him who Mr. Duncan -Ross was. He answered that the name was new to him. - -"'Well,' said I, 'the gentleman at No. 4.' - -"'What, the red-headed man?' - -"'Yes.' - -"'Oh,' said he, 'his name was William Morris. He was a solicitor -and was using my room as a temporary convenience until his new -premises were ready. He moved out yesterday.' - -"'Where could I find him?' - -"'Oh, at his new offices. He did tell me the address. Yes, 17 -King Edward Street, near St. Paul's.' - -"I started off, Mr. Holmes, but when I got to that address it was -a manufactory of artificial knee-caps, and no one in it had ever -heard of either Mr. William Morris or Mr. Duncan Ross." - -"And what did you do then?" asked Holmes. - -"I went home to Saxe-Coburg Square, and I took the advice of my -assistant. But he could not help me in any way. He could only say -that if I waited I should hear by post. But that was not quite -good enough, Mr. Holmes. I did not wish to lose such a place -without a struggle, so, as I had heard that you were good enough -to give advice to poor folk who were in need of it, I came right -away to you." - -"And you did very wisely," said Holmes. "Your case is an -exceedingly remarkable one, and I shall be happy to look into it. -From what you have told me I think that it is possible that -graver issues hang from it than might at first sight appear." - -"Grave enough!" said Mr. Jabez Wilson. "Why, I have lost four -pound a week." - -"As far as you are personally concerned," remarked Holmes, "I do -not see that you have any grievance against this extraordinary -league. On the contrary, you are, as I understand, richer by some -30 pounds, to say nothing of the minute knowledge which you have -gained on every subject which comes under the letter A. You have -lost nothing by them." - -"No, sir. But I want to find out about them, and who they are, -and what their object was in playing this prank--if it was a -prank--upon me. It was a pretty expensive joke for them, for it -cost them two and thirty pounds." - -"We shall endeavour to clear up these points for you. And, first, -one or two questions, Mr. Wilson. This assistant of yours who -first called your attention to the advertisement--how long had he -been with you?" - -"About a month then." - -"How did he come?" - -"In answer to an advertisement." - -"Was he the only applicant?" - -"No, I had a dozen." - -"Why did you pick him?" - -"Because he was handy and would come cheap." - -"At half-wages, in fact." - -"Yes." - -"What is he like, this Vincent Spaulding?" - -"Small, stout-built, very quick in his ways, no hair on his face, -though he's not short of thirty. Has a white splash of acid upon -his forehead." - -Holmes sat up in his chair in considerable excitement. "I thought -as much," said he. "Have you ever observed that his ears are -pierced for earrings?" - -"Yes, sir. He told me that a gipsy had done it for him when he -was a lad." - -"Hum!" said Holmes, sinking back in deep thought. "He is still -with you?" - -"Oh, yes, sir; I have only just left him." - -"And has your business been attended to in your absence?" - -"Nothing to complain of, sir. There's never very much to do of a -morning." - -"That will do, Mr. Wilson. I shall be happy to give you an -opinion upon the subject in the course of a day or two. To-day is -Saturday, and I hope that by Monday we may come to a conclusion." - -"Well, Watson," said Holmes when our visitor had left us, "what -do you make of it all?" - -"I make nothing of it," I answered frankly. "It is a most -mysterious business." - -"As a rule," said Holmes, "the more bizarre a thing is the less -mysterious it proves to be. It is your commonplace, featureless -crimes which are really puzzling, just as a commonplace face is -the most difficult to identify. But I must be prompt over this -matter." - -"What are you going to do, then?" I asked. - -"To smoke," he answered. "It is quite a three pipe problem, and I -beg that you won't speak to me for fifty minutes." He curled -himself up in his chair, with his thin knees drawn up to his -hawk-like nose, and there he sat with his eyes closed and his -black clay pipe thrusting out like the bill of some strange bird. -I had come to the conclusion that he had dropped asleep, and -indeed was nodding myself, when he suddenly sprang out of his -chair with the gesture of a man who has made up his mind and put -his pipe down upon the mantelpiece. - -"Sarasate plays at the St. James's Hall this afternoon," he -remarked. "What do you think, Watson? Could your patients spare -you for a few hours?" - -"I have nothing to do to-day. My practice is never very -absorbing." - -"Then put on your hat and come. I am going through the City -first, and we can have some lunch on the way. I observe that -there is a good deal of German music on the programme, which is -rather more to my taste than Italian or French. It is -introspective, and I want to introspect. Come along!" - -We travelled by the Underground as far as Aldersgate; and a short -walk took us to Saxe-Coburg Square, the scene of the singular -story which we had listened to in the morning. It was a poky, -little, shabby-genteel place, where four lines of dingy -two-storied brick houses looked out into a small railed-in -enclosure, where a lawn of weedy grass and a few clumps of faded -laurel-bushes made a hard fight against a smoke-laden and -uncongenial atmosphere. Three gilt balls and a brown board with -"JABEZ WILSON" in white letters, upon a corner house, announced -the place where our red-headed client carried on his business. -Sherlock Holmes stopped in front of it with his head on one side -and looked it all over, with his eyes shining brightly between -puckered lids. Then he walked slowly up the street, and then down -again to the corner, still looking keenly at the houses. Finally -he returned to the pawnbroker's, and, having thumped vigorously -upon the pavement with his stick two or three times, he went up -to the door and knocked. It was instantly opened by a -bright-looking, clean-shaven young fellow, who asked him to step -in. - -"Thank you," said Holmes, "I only wished to ask you how you would -go from here to the Strand." - -"Third right, fourth left," answered the assistant promptly, -closing the door. - -"Smart fellow, that," observed Holmes as we walked away. "He is, -in my judgment, the fourth smartest man in London, and for daring -I am not sure that he has not a claim to be third. I have known -something of him before." - -"Evidently," said I, "Mr. Wilson's assistant counts for a good -deal in this mystery of the Red-headed League. I am sure that you -inquired your way merely in order that you might see him." - -"Not him." - -"What then?" - -"The knees of his trousers." - -"And what did you see?" - -"What I expected to see." - -"Why did you beat the pavement?" - -"My dear doctor, this is a time for observation, not for talk. We -are spies in an enemy's country. We know something of Saxe-Coburg -Square. Let us now explore the parts which lie behind it." - -The road in which we found ourselves as we turned round the -corner from the retired Saxe-Coburg Square presented as great a -contrast to it as the front of a picture does to the back. It was -one of the main arteries which conveyed the traffic of the City -to the north and west. The roadway was blocked with the immense -stream of commerce flowing in a double tide inward and outward, -while the footpaths were black with the hurrying swarm of -pedestrians. It was difficult to realise as we looked at the line -of fine shops and stately business premises that they really -abutted on the other side upon the faded and stagnant square -which we had just quitted. - -"Let me see," said Holmes, standing at the corner and glancing -along the line, "I should like just to remember the order of the -houses here. It is a hobby of mine to have an exact knowledge of -London. There is Mortimer's, the tobacconist, the little -newspaper shop, the Coburg branch of the City and Suburban Bank, -the Vegetarian Restaurant, and McFarlane's carriage-building -depot. That carries us right on to the other block. And now, -Doctor, we've done our work, so it's time we had some play. A -sandwich and a cup of coffee, and then off to violin-land, where -all is sweetness and delicacy and harmony, and there are no -red-headed clients to vex us with their conundrums." - -My friend was an enthusiastic musician, being himself not only a -very capable performer but a composer of no ordinary merit. All -the afternoon he sat in the stalls wrapped in the most perfect -happiness, gently waving his long, thin fingers in time to the -music, while his gently smiling face and his languid, dreamy eyes -were as unlike those of Holmes the sleuth-hound, Holmes the -relentless, keen-witted, ready-handed criminal agent, as it was -possible to conceive. In his singular character the dual nature -alternately asserted itself, and his extreme exactness and -astuteness represented, as I have often thought, the reaction -against the poetic and contemplative mood which occasionally -predominated in him. The swing of his nature took him from -extreme languor to devouring energy; and, as I knew well, he was -never so truly formidable as when, for days on end, he had been -lounging in his armchair amid his improvisations and his -black-letter editions. Then it was that the lust of the chase -would suddenly come upon him, and that his brilliant reasoning -power would rise to the level of intuition, until those who were -unacquainted with his methods would look askance at him as on a -man whose knowledge was not that of other mortals. When I saw him -that afternoon so enwrapped in the music at St. James's Hall I -felt that an evil time might be coming upon those whom he had set -himself to hunt down. - -"You want to go home, no doubt, Doctor," he remarked as we -emerged. - -"Yes, it would be as well." - -"And I have some business to do which will take some hours. This -business at Coburg Square is serious." - -"Why serious?" - -"A considerable crime is in contemplation. I have every reason to -believe that we shall be in time to stop it. But to-day being -Saturday rather complicates matters. I shall want your help -to-night." - -"At what time?" - -"Ten will be early enough." - -"I shall be at Baker Street at ten." - -"Very well. And, I say, Doctor, there may be some little danger, -so kindly put your army revolver in your pocket." He waved his -hand, turned on his heel, and disappeared in an instant among the -crowd. - -I trust that I am not more dense than my neighbours, but I was -always oppressed with a sense of my own stupidity in my dealings -with Sherlock Holmes. Here I had heard what he had heard, I had -seen what he had seen, and yet from his words it was evident that -he saw clearly not only what had happened but what was about to -happen, while to me the whole business was still confused and -grotesque. As I drove home to my house in Kensington I thought -over it all, from the extraordinary story of the red-headed -copier of the "Encyclopaedia" down to the visit to Saxe-Coburg -Square, and the ominous words with which he had parted from me. -What was this nocturnal expedition, and why should I go armed? -Where were we going, and what were we to do? I had the hint from -Holmes that this smooth-faced pawnbroker's assistant was a -formidable man--a man who might play a deep game. I tried to -puzzle it out, but gave it up in despair and set the matter aside -until night should bring an explanation. - -It was a quarter-past nine when I started from home and made my -way across the Park, and so through Oxford Street to Baker -Street. Two hansoms were standing at the door, and as I entered -the passage I heard the sound of voices from above. On entering -his room I found Holmes in animated conversation with two men, -one of whom I recognised as Peter Jones, the official police -agent, while the other was a long, thin, sad-faced man, with a -very shiny hat and oppressively respectable frock-coat. - -"Ha! Our party is complete," said Holmes, buttoning up his -pea-jacket and taking his heavy hunting crop from the rack. -"Watson, I think you know Mr. Jones, of Scotland Yard? Let me -introduce you to Mr. Merryweather, who is to be our companion in -to-night's adventure." - -"We're hunting in couples again, Doctor, you see," said Jones in -his consequential way. "Our friend here is a wonderful man for -starting a chase. All he wants is an old dog to help him to do -the running down." - -"I hope a wild goose may not prove to be the end of our chase," -observed Mr. Merryweather gloomily. - -"You may place considerable confidence in Mr. Holmes, sir," said -the police agent loftily. "He has his own little methods, which -are, if he won't mind my saying so, just a little too theoretical -and fantastic, but he has the makings of a detective in him. It -is not too much to say that once or twice, as in that business of -the Sholto murder and the Agra treasure, he has been more nearly -correct than the official force." - -"Oh, if you say so, Mr. Jones, it is all right," said the -stranger with deference. "Still, I confess that I miss my rubber. -It is the first Saturday night for seven-and-twenty years that I -have not had my rubber." - -"I think you will find," said Sherlock Holmes, "that you will -play for a higher stake to-night than you have ever done yet, and -that the play will be more exciting. For you, Mr. Merryweather, -the stake will be some 30,000 pounds; and for you, Jones, it will -be the man upon whom you wish to lay your hands." - -"John Clay, the murderer, thief, smasher, and forger. He's a -young man, Mr. Merryweather, but he is at the head of his -profession, and I would rather have my bracelets on him than on -any criminal in London. He's a remarkable man, is young John -Clay. His grandfather was a royal duke, and he himself has been -to Eton and Oxford. His brain is as cunning as his fingers, and -though we meet signs of him at every turn, we never know where to -find the man himself. He'll crack a crib in Scotland one week, -and be raising money to build an orphanage in Cornwall the next. -I've been on his track for years and have never set eyes on him -yet." - -"I hope that I may have the pleasure of introducing you to-night. -I've had one or two little turns also with Mr. John Clay, and I -agree with you that he is at the head of his profession. It is -past ten, however, and quite time that we started. If you two -will take the first hansom, Watson and I will follow in the -second." - -Sherlock Holmes was not very communicative during the long drive -and lay back in the cab humming the tunes which he had heard in -the afternoon. We rattled through an endless labyrinth of gas-lit -streets until we emerged into Farrington Street. - -"We are close there now," my friend remarked. "This fellow -Merryweather is a bank director, and personally interested in the -matter. I thought it as well to have Jones with us also. He is -not a bad fellow, though an absolute imbecile in his profession. -He has one positive virtue. He is as brave as a bulldog and as -tenacious as a lobster if he gets his claws upon anyone. Here we -are, and they are waiting for us." - -We had reached the same crowded thoroughfare in which we had -found ourselves in the morning. Our cabs were dismissed, and, -following the guidance of Mr. Merryweather, we passed down a -narrow passage and through a side door, which he opened for us. -Within there was a small corridor, which ended in a very massive -iron gate. This also was opened, and led down a flight of winding -stone steps, which terminated at another formidable gate. Mr. -Merryweather stopped to light a lantern, and then conducted us -down a dark, earth-smelling passage, and so, after opening a -third door, into a huge vault or cellar, which was piled all -round with crates and massive boxes. - -"You are not very vulnerable from above," Holmes remarked as he -held up the lantern and gazed about him. - -"Nor from below," said Mr. Merryweather, striking his stick upon -the flags which lined the floor. "Why, dear me, it sounds quite -hollow!" he remarked, looking up in surprise. - -"I must really ask you to be a little more quiet!" said Holmes -severely. "You have already imperilled the whole success of our -expedition. Might I beg that you would have the goodness to sit -down upon one of those boxes, and not to interfere?" - -The solemn Mr. Merryweather perched himself upon a crate, with a -very injured expression upon his face, while Holmes fell upon his -knees upon the floor and, with the lantern and a magnifying lens, -began to examine minutely the cracks between the stones. A few -seconds sufficed to satisfy him, for he sprang to his feet again -and put his glass in his pocket. - -"We have at least an hour before us," he remarked, "for they can -hardly take any steps until the good pawnbroker is safely in bed. -Then they will not lose a minute, for the sooner they do their -work the longer time they will have for their escape. We are at -present, Doctor--as no doubt you have divined--in the cellar of -the City branch of one of the principal London banks. Mr. -Merryweather is the chairman of directors, and he will explain to -you that there are reasons why the more daring criminals of -London should take a considerable interest in this cellar at -present." - -"It is our French gold," whispered the director. "We have had -several warnings that an attempt might be made upon it." - -"Your French gold?" - -"Yes. We had occasion some months ago to strengthen our resources -and borrowed for that purpose 30,000 napoleons from the Bank of -France. It has become known that we have never had occasion to -unpack the money, and that it is still lying in our cellar. The -crate upon which I sit contains 2,000 napoleons packed between -layers of lead foil. Our reserve of bullion is much larger at -present than is usually kept in a single branch office, and the -directors have had misgivings upon the subject." - -"Which were very well justified," observed Holmes. "And now it is -time that we arranged our little plans. I expect that within an -hour matters will come to a head. In the meantime Mr. -Merryweather, we must put the screen over that dark lantern." - -"And sit in the dark?" - -"I am afraid so. I had brought a pack of cards in my pocket, and -I thought that, as we were a partie carrée, you might have your -rubber after all. But I see that the enemy's preparations have -gone so far that we cannot risk the presence of a light. And, -first of all, we must choose our positions. These are daring men, -and though we shall take them at a disadvantage, they may do us -some harm unless we are careful. I shall stand behind this crate, -and do you conceal yourselves behind those. Then, when I flash a -light upon them, close in swiftly. If they fire, Watson, have no -compunction about shooting them down." - -I placed my revolver, cocked, upon the top of the wooden case -behind which I crouched. Holmes shot the slide across the front -of his lantern and left us in pitch darkness--such an absolute -darkness as I have never before experienced. The smell of hot -metal remained to assure us that the light was still there, ready -to flash out at a moment's notice. To me, with my nerves worked -up to a pitch of expectancy, there was something depressing and -subduing in the sudden gloom, and in the cold dank air of the -vault. - -"They have but one retreat," whispered Holmes. "That is back -through the house into Saxe-Coburg Square. I hope that you have -done what I asked you, Jones?" - -"I have an inspector and two officers waiting at the front door." - -"Then we have stopped all the holes. And now we must be silent -and wait." - -What a time it seemed! From comparing notes afterwards it was but -an hour and a quarter, yet it appeared to me that the night must -have almost gone and the dawn be breaking above us. My limbs -were weary and stiff, for I feared to change my position; yet my -nerves were worked up to the highest pitch of tension, and my -hearing was so acute that I could not only hear the gentle -breathing of my companions, but I could distinguish the deeper, -heavier in-breath of the bulky Jones from the thin, sighing note -of the bank director. From my position I could look over the case -in the direction of the floor. Suddenly my eyes caught the glint -of a light. - -At first it was but a lurid spark upon the stone pavement. Then -it lengthened out until it became a yellow line, and then, -without any warning or sound, a gash seemed to open and a hand -appeared, a white, almost womanly hand, which felt about in the -centre of the little area of light. For a minute or more the -hand, with its writhing fingers, protruded out of the floor. Then -it was withdrawn as suddenly as it appeared, and all was dark -again save the single lurid spark which marked a chink between -the stones. - -Its disappearance, however, was but momentary. With a rending, -tearing sound, one of the broad, white stones turned over upon -its side and left a square, gaping hole, through which streamed -the light of a lantern. Over the edge there peeped a clean-cut, -boyish face, which looked keenly about it, and then, with a hand -on either side of the aperture, drew itself shoulder-high and -waist-high, until one knee rested upon the edge. In another -instant he stood at the side of the hole and was hauling after -him a companion, lithe and small like himself, with a pale face -and a shock of very red hair. - -"It's all clear," he whispered. "Have you the chisel and the -bags? Great Scott! Jump, Archie, jump, and I'll swing for it!" - -Sherlock Holmes had sprung out and seized the intruder by the -collar. The other dived down the hole, and I heard the sound of -rending cloth as Jones clutched at his skirts. The light flashed -upon the barrel of a revolver, but Holmes' hunting crop came -down on the man's wrist, and the pistol clinked upon the stone -floor. - -"It's no use, John Clay," said Holmes blandly. "You have no -chance at all." - -"So I see," the other answered with the utmost coolness. "I fancy -that my pal is all right, though I see you have got his -coat-tails." - -"There are three men waiting for him at the door," said Holmes. - -"Oh, indeed! You seem to have done the thing very completely. I -must compliment you." - -"And I you," Holmes answered. "Your red-headed idea was very new -and effective." - -"You'll see your pal again presently," said Jones. "He's quicker -at climbing down holes than I am. Just hold out while I fix the -derbies." - -"I beg that you will not touch me with your filthy hands," -remarked our prisoner as the handcuffs clattered upon his wrists. -"You may not be aware that I have royal blood in my veins. Have -the goodness, also, when you address me always to say 'sir' and -'please.'" - -"All right," said Jones with a stare and a snigger. "Well, would -you please, sir, march upstairs, where we can get a cab to carry -your Highness to the police-station?" - -"That is better," said John Clay serenely. He made a sweeping bow -to the three of us and walked quietly off in the custody of the -detective. - -"Really, Mr. Holmes," said Mr. Merryweather as we followed them -from the cellar, "I do not know how the bank can thank you or -repay you. There is no doubt that you have detected and defeated -in the most complete manner one of the most determined attempts -at bank robbery that have ever come within my experience." - -"I have had one or two little scores of my own to settle with Mr. -John Clay," said Holmes. "I have been at some small expense over -this matter, which I shall expect the bank to refund, but beyond -that I am amply repaid by having had an experience which is in -many ways unique, and by hearing the very remarkable narrative of -the Red-headed League." - - -"You see, Watson," he explained in the early hours of the morning -as we sat over a glass of whisky and soda in Baker Street, "it -was perfectly obvious from the first that the only possible -object of this rather fantastic business of the advertisement of -the League, and the copying of the 'Encyclopaedia,' must be to get -this not over-bright pawnbroker out of the way for a number of -hours every day. It was a curious way of managing it, but, -really, it would be difficult to suggest a better. The method was -no doubt suggested to Clay's ingenious mind by the colour of his -accomplice's hair. The 4 pounds a week was a lure which must draw -him, and what was it to them, who were playing for thousands? -They put in the advertisement, one rogue has the temporary -office, the other rogue incites the man to apply for it, and -together they manage to secure his absence every morning in the -week. From the time that I heard of the assistant having come for -half wages, it was obvious to me that he had some strong motive -for securing the situation." - -"But how could you guess what the motive was?" - -"Had there been women in the house, I should have suspected a -mere vulgar intrigue. That, however, was out of the question. The -man's business was a small one, and there was nothing in his -house which could account for such elaborate preparations, and -such an expenditure as they were at. It must, then, be something -out of the house. What could it be? I thought of the assistant's -fondness for photography, and his trick of vanishing into the -cellar. The cellar! There was the end of this tangled clue. Then -I made inquiries as to this mysterious assistant and found that I -had to deal with one of the coolest and most daring criminals in -London. He was doing something in the cellar--something which -took many hours a day for months on end. What could it be, once -more? I could think of nothing save that he was running a tunnel -to some other building. - -"So far I had got when we went to visit the scene of action. I -surprised you by beating upon the pavement with my stick. I was -ascertaining whether the cellar stretched out in front or behind. -It was not in front. Then I rang the bell, and, as I hoped, the -assistant answered it. We have had some skirmishes, but we had -never set eyes upon each other before. I hardly looked at his -face. His knees were what I wished to see. You must yourself have -remarked how worn, wrinkled, and stained they were. They spoke of -those hours of burrowing. The only remaining point was what they -were burrowing for. I walked round the corner, saw the City and -Suburban Bank abutted on our friend's premises, and felt that I -had solved my problem. When you drove home after the concert I -called upon Scotland Yard and upon the chairman of the bank -directors, with the result that you have seen." - -"And how could you tell that they would make their attempt -to-night?" I asked. - -"Well, when they closed their League offices that was a sign that -they cared no longer about Mr. Jabez Wilson's presence--in other -words, that they had completed their tunnel. But it was essential -that they should use it soon, as it might be discovered, or the -bullion might be removed. Saturday would suit them better than -any other day, as it would give them two days for their escape. -For all these reasons I expected them to come to-night." - -"You reasoned it out beautifully," I exclaimed in unfeigned -admiration. "It is so long a chain, and yet every link rings -true." - -"It saved me from ennui," he answered, yawning. "Alas! I already -feel it closing in upon me. My life is spent in one long effort -to escape from the commonplaces of existence. These little -problems help me to do so." - -"And you are a benefactor of the race," said I. - -He shrugged his shoulders. "Well, perhaps, after all, it is of -some little use," he remarked. "'L'homme c'est rien--l'oeuvre -c'est tout,' as Gustave Flaubert wrote to George Sand." - - - -ADVENTURE III. A CASE OF IDENTITY - -"My dear fellow," said Sherlock Holmes as we sat on either side -of the fire in his lodgings at Baker Street, "life is infinitely -stranger than anything which the mind of man could invent. We -would not dare to conceive the things which are really mere -commonplaces of existence. If we could fly out of that window -hand in hand, hover over this great city, gently remove the -roofs, and peep in at the queer things which are going on, the -strange coincidences, the plannings, the cross-purposes, the -wonderful chains of events, working through generations, and -leading to the most outré results, it would make all fiction with -its conventionalities and foreseen conclusions most stale and -unprofitable." - -"And yet I am not convinced of it," I answered. "The cases which -come to light in the papers are, as a rule, bald enough, and -vulgar enough. We have in our police reports realism pushed to -its extreme limits, and yet the result is, it must be confessed, -neither fascinating nor artistic." - -"A certain selection and discretion must be used in producing a -realistic effect," remarked Holmes. "This is wanting in the -police report, where more stress is laid, perhaps, upon the -platitudes of the magistrate than upon the details, which to an -observer contain the vital essence of the whole matter. Depend -upon it, there is nothing so unnatural as the commonplace." - -I smiled and shook my head. "I can quite understand your thinking -so," I said. "Of course, in your position of unofficial adviser -and helper to everybody who is absolutely puzzled, throughout -three continents, you are brought in contact with all that is -strange and bizarre. But here"--I picked up the morning paper -from the ground--"let us put it to a practical test. Here is the -first heading upon which I come. 'A husband's cruelty to his -wife.' There is half a column of print, but I know without -reading it that it is all perfectly familiar to me. There is, of -course, the other woman, the drink, the push, the blow, the -bruise, the sympathetic sister or landlady. The crudest of -writers could invent nothing more crude." - -"Indeed, your example is an unfortunate one for your argument," -said Holmes, taking the paper and glancing his eye down it. "This -is the Dundas separation case, and, as it happens, I was engaged -in clearing up some small points in connection with it. The -husband was a teetotaler, there was no other woman, and the -conduct complained of was that he had drifted into the habit of -winding up every meal by taking out his false teeth and hurling -them at his wife, which, you will allow, is not an action likely -to occur to the imagination of the average story-teller. Take a -pinch of snuff, Doctor, and acknowledge that I have scored over -you in your example." - -He held out his snuffbox of old gold, with a great amethyst in -the centre of the lid. Its splendour was in such contrast to his -homely ways and simple life that I could not help commenting upon -it. - -"Ah," said he, "I forgot that I had not seen you for some weeks. -It is a little souvenir from the King of Bohemia in return for my -assistance in the case of the Irene Adler papers." - -"And the ring?" I asked, glancing at a remarkable brilliant which -sparkled upon his finger. - -"It was from the reigning family of Holland, though the matter in -which I served them was of such delicacy that I cannot confide it -even to you, who have been good enough to chronicle one or two of -my little problems." - -"And have you any on hand just now?" I asked with interest. - -"Some ten or twelve, but none which present any feature of -interest. They are important, you understand, without being -interesting. Indeed, I have found that it is usually in -unimportant matters that there is a field for the observation, -and for the quick analysis of cause and effect which gives the -charm to an investigation. The larger crimes are apt to be the -simpler, for the bigger the crime the more obvious, as a rule, is -the motive. In these cases, save for one rather intricate matter -which has been referred to me from Marseilles, there is nothing -which presents any features of interest. It is possible, however, -that I may have something better before very many minutes are -over, for this is one of my clients, or I am much mistaken." - -He had risen from his chair and was standing between the parted -blinds gazing down into the dull neutral-tinted London street. -Looking over his shoulder, I saw that on the pavement opposite -there stood a large woman with a heavy fur boa round her neck, -and a large curling red feather in a broad-brimmed hat which was -tilted in a coquettish Duchess of Devonshire fashion over her -ear. From under this great panoply she peeped up in a nervous, -hesitating fashion at our windows, while her body oscillated -backward and forward, and her fingers fidgeted with her glove -buttons. Suddenly, with a plunge, as of the swimmer who leaves -the bank, she hurried across the road, and we heard the sharp -clang of the bell. - -"I have seen those symptoms before," said Holmes, throwing his -cigarette into the fire. "Oscillation upon the pavement always -means an affaire de coeur. She would like advice, but is not sure -that the matter is not too delicate for communication. And yet -even here we may discriminate. When a woman has been seriously -wronged by a man she no longer oscillates, and the usual symptom -is a broken bell wire. Here we may take it that there is a love -matter, but that the maiden is not so much angry as perplexed, or -grieved. But here she comes in person to resolve our doubts." - -As he spoke there was a tap at the door, and the boy in buttons -entered to announce Miss Mary Sutherland, while the lady herself -loomed behind his small black figure like a full-sailed -merchant-man behind a tiny pilot boat. Sherlock Holmes welcomed -her with the easy courtesy for which he was remarkable, and, -having closed the door and bowed her into an armchair, he looked -her over in the minute and yet abstracted fashion which was -peculiar to him. - -"Do you not find," he said, "that with your short sight it is a -little trying to do so much typewriting?" - -"I did at first," she answered, "but now I know where the letters -are without looking." Then, suddenly realising the full purport -of his words, she gave a violent start and looked up, with fear -and astonishment upon her broad, good-humoured face. "You've -heard about me, Mr. Holmes," she cried, "else how could you know -all that?" - -"Never mind," said Holmes, laughing; "it is my business to know -things. Perhaps I have trained myself to see what others -overlook. If not, why should you come to consult me?" - -"I came to you, sir, because I heard of you from Mrs. Etherege, -whose husband you found so easy when the police and everyone had -given him up for dead. Oh, Mr. Holmes, I wish you would do as -much for me. I'm not rich, but still I have a hundred a year in -my own right, besides the little that I make by the machine, and -I would give it all to know what has become of Mr. Hosmer Angel." - -"Why did you come away to consult me in such a hurry?" asked -Sherlock Holmes, with his finger-tips together and his eyes to -the ceiling. - -Again a startled look came over the somewhat vacuous face of Miss -Mary Sutherland. "Yes, I did bang out of the house," she said, -"for it made me angry to see the easy way in which Mr. -Windibank--that is, my father--took it all. He would not go to -the police, and he would not go to you, and so at last, as he -would do nothing and kept on saying that there was no harm done, -it made me mad, and I just on with my things and came right away -to you." - -"Your father," said Holmes, "your stepfather, surely, since the -name is different." - -"Yes, my stepfather. I call him father, though it sounds funny, -too, for he is only five years and two months older than myself." - -"And your mother is alive?" - -"Oh, yes, mother is alive and well. I wasn't best pleased, Mr. -Holmes, when she married again so soon after father's death, and -a man who was nearly fifteen years younger than herself. Father -was a plumber in the Tottenham Court Road, and he left a tidy -business behind him, which mother carried on with Mr. Hardy, the -foreman; but when Mr. Windibank came he made her sell the -business, for he was very superior, being a traveller in wines. -They got 4700 pounds for the goodwill and interest, which wasn't -near as much as father could have got if he had been alive." - -I had expected to see Sherlock Holmes impatient under this -rambling and inconsequential narrative, but, on the contrary, he -had listened with the greatest concentration of attention. - -"Your own little income," he asked, "does it come out of the -business?" - -"Oh, no, sir. It is quite separate and was left me by my uncle -Ned in Auckland. It is in New Zealand stock, paying 4 1/2 per -cent. Two thousand five hundred pounds was the amount, but I can -only touch the interest." - -"You interest me extremely," said Holmes. "And since you draw so -large a sum as a hundred a year, with what you earn into the -bargain, you no doubt travel a little and indulge yourself in -every way. I believe that a single lady can get on very nicely -upon an income of about 60 pounds." - -"I could do with much less than that, Mr. Holmes, but you -understand that as long as I live at home I don't wish to be a -burden to them, and so they have the use of the money just while -I am staying with them. Of course, that is only just for the -time. Mr. Windibank draws my interest every quarter and pays it -over to mother, and I find that I can do pretty well with what I -earn at typewriting. It brings me twopence a sheet, and I can -often do from fifteen to twenty sheets in a day." - -"You have made your position very clear to me," said Holmes. -"This is my friend, Dr. Watson, before whom you can speak as -freely as before myself. Kindly tell us now all about your -connection with Mr. Hosmer Angel." - -A flush stole over Miss Sutherland's face, and she picked -nervously at the fringe of her jacket. "I met him first at the -gasfitters' ball," she said. "They used to send father tickets -when he was alive, and then afterwards they remembered us, and -sent them to mother. Mr. Windibank did not wish us to go. He -never did wish us to go anywhere. He would get quite mad if I -wanted so much as to join a Sunday-school treat. But this time I -was set on going, and I would go; for what right had he to -prevent? He said the folk were not fit for us to know, when all -father's friends were to be there. And he said that I had nothing -fit to wear, when I had my purple plush that I had never so much -as taken out of the drawer. At last, when nothing else would do, -he went off to France upon the business of the firm, but we went, -mother and I, with Mr. Hardy, who used to be our foreman, and it -was there I met Mr. Hosmer Angel." - -"I suppose," said Holmes, "that when Mr. Windibank came back from -France he was very annoyed at your having gone to the ball." - -"Oh, well, he was very good about it. He laughed, I remember, and -shrugged his shoulders, and said there was no use denying -anything to a woman, for she would have her way." - -"I see. Then at the gasfitters' ball you met, as I understand, a -gentleman called Mr. Hosmer Angel." - -"Yes, sir. I met him that night, and he called next day to ask if -we had got home all safe, and after that we met him--that is to -say, Mr. Holmes, I met him twice for walks, but after that father -came back again, and Mr. Hosmer Angel could not come to the house -any more." - -"No?" - -"Well, you know father didn't like anything of the sort. He -wouldn't have any visitors if he could help it, and he used to -say that a woman should be happy in her own family circle. But -then, as I used to say to mother, a woman wants her own circle to -begin with, and I had not got mine yet." - -"But how about Mr. Hosmer Angel? Did he make no attempt to see -you?" - -"Well, father was going off to France again in a week, and Hosmer -wrote and said that it would be safer and better not to see each -other until he had gone. We could write in the meantime, and he -used to write every day. I took the letters in in the morning, so -there was no need for father to know." - -"Were you engaged to the gentleman at this time?" - -"Oh, yes, Mr. Holmes. We were engaged after the first walk that -we took. Hosmer--Mr. Angel--was a cashier in an office in -Leadenhall Street--and--" - -"What office?" - -"That's the worst of it, Mr. Holmes, I don't know." - -"Where did he live, then?" - -"He slept on the premises." - -"And you don't know his address?" - -"No--except that it was Leadenhall Street." - -"Where did you address your letters, then?" - -"To the Leadenhall Street Post Office, to be left till called -for. He said that if they were sent to the office he would be -chaffed by all the other clerks about having letters from a lady, -so I offered to typewrite them, like he did his, but he wouldn't -have that, for he said that when I wrote them they seemed to come -from me, but when they were typewritten he always felt that the -machine had come between us. That will just show you how fond he -was of me, Mr. Holmes, and the little things that he would think -of." - -"It was most suggestive," said Holmes. "It has long been an axiom -of mine that the little things are infinitely the most important. -Can you remember any other little things about Mr. Hosmer Angel?" - -"He was a very shy man, Mr. Holmes. He would rather walk with me -in the evening than in the daylight, for he said that he hated to -be conspicuous. Very retiring and gentlemanly he was. Even his -voice was gentle. He'd had the quinsy and swollen glands when he -was young, he told me, and it had left him with a weak throat, -and a hesitating, whispering fashion of speech. He was always -well dressed, very neat and plain, but his eyes were weak, just -as mine are, and he wore tinted glasses against the glare." - -"Well, and what happened when Mr. Windibank, your stepfather, -returned to France?" - -"Mr. Hosmer Angel came to the house again and proposed that we -should marry before father came back. He was in dreadful earnest -and made me swear, with my hands on the Testament, that whatever -happened I would always be true to him. Mother said he was quite -right to make me swear, and that it was a sign of his passion. -Mother was all in his favour from the first and was even fonder -of him than I was. Then, when they talked of marrying within the -week, I began to ask about father; but they both said never to -mind about father, but just to tell him afterwards, and mother -said she would make it all right with him. I didn't quite like -that, Mr. Holmes. It seemed funny that I should ask his leave, as -he was only a few years older than me; but I didn't want to do -anything on the sly, so I wrote to father at Bordeaux, where the -company has its French offices, but the letter came back to me on -the very morning of the wedding." - -"It missed him, then?" - -"Yes, sir; for he had started to England just before it arrived." - -"Ha! that was unfortunate. Your wedding was arranged, then, for -the Friday. Was it to be in church?" - -"Yes, sir, but very quietly. It was to be at St. Saviour's, near -King's Cross, and we were to have breakfast afterwards at the St. -Pancras Hotel. Hosmer came for us in a hansom, but as there were -two of us he put us both into it and stepped himself into a -four-wheeler, which happened to be the only other cab in the -street. We got to the church first, and when the four-wheeler -drove up we waited for him to step out, but he never did, and -when the cabman got down from the box and looked there was no one -there! The cabman said that he could not imagine what had become -of him, for he had seen him get in with his own eyes. That was -last Friday, Mr. Holmes, and I have never seen or heard anything -since then to throw any light upon what became of him." - -"It seems to me that you have been very shamefully treated," said -Holmes. - -"Oh, no, sir! He was too good and kind to leave me so. Why, all -the morning he was saying to me that, whatever happened, I was to -be true; and that even if something quite unforeseen occurred to -separate us, I was always to remember that I was pledged to him, -and that he would claim his pledge sooner or later. It seemed -strange talk for a wedding-morning, but what has happened since -gives a meaning to it." - -"Most certainly it does. Your own opinion is, then, that some -unforeseen catastrophe has occurred to him?" - -"Yes, sir. I believe that he foresaw some danger, or else he -would not have talked so. And then I think that what he foresaw -happened." - -"But you have no notion as to what it could have been?" - -"None." - -"One more question. How did your mother take the matter?" - -"She was angry, and said that I was never to speak of the matter -again." - -"And your father? Did you tell him?" - -"Yes; and he seemed to think, with me, that something had -happened, and that I should hear of Hosmer again. As he said, -what interest could anyone have in bringing me to the doors of -the church, and then leaving me? Now, if he had borrowed my -money, or if he had married me and got my money settled on him, -there might be some reason, but Hosmer was very independent about -money and never would look at a shilling of mine. And yet, what -could have happened? And why could he not write? Oh, it drives me -half-mad to think of it, and I can't sleep a wink at night." She -pulled a little handkerchief out of her muff and began to sob -heavily into it. - -"I shall glance into the case for you," said Holmes, rising, "and -I have no doubt that we shall reach some definite result. Let the -weight of the matter rest upon me now, and do not let your mind -dwell upon it further. Above all, try to let Mr. Hosmer Angel -vanish from your memory, as he has done from your life." - -"Then you don't think I'll see him again?" - -"I fear not." - -"Then what has happened to him?" - -"You will leave that question in my hands. I should like an -accurate description of him and any letters of his which you can -spare." - -"I advertised for him in last Saturday's Chronicle," said she. -"Here is the slip and here are four letters from him." - -"Thank you. And your address?" - -"No. 31 Lyon Place, Camberwell." - -"Mr. Angel's address you never had, I understand. Where is your -father's place of business?" - -"He travels for Westhouse & Marbank, the great claret importers -of Fenchurch Street." - -"Thank you. You have made your statement very clearly. You will -leave the papers here, and remember the advice which I have given -you. Let the whole incident be a sealed book, and do not allow it -to affect your life." - -"You are very kind, Mr. Holmes, but I cannot do that. I shall be -true to Hosmer. He shall find me ready when he comes back." - -For all the preposterous hat and the vacuous face, there was -something noble in the simple faith of our visitor which -compelled our respect. She laid her little bundle of papers upon -the table and went her way, with a promise to come again whenever -she might be summoned. - -Sherlock Holmes sat silent for a few minutes with his fingertips -still pressed together, his legs stretched out in front of him, -and his gaze directed upward to the ceiling. Then he took down -from the rack the old and oily clay pipe, which was to him as a -counsellor, and, having lit it, he leaned back in his chair, with -the thick blue cloud-wreaths spinning up from him, and a look of -infinite languor in his face. - -"Quite an interesting study, that maiden," he observed. "I found -her more interesting than her little problem, which, by the way, -is rather a trite one. You will find parallel cases, if you -consult my index, in Andover in '77, and there was something of -the sort at The Hague last year. Old as is the idea, however, -there were one or two details which were new to me. But the -maiden herself was most instructive." - -"You appeared to read a good deal upon her which was quite -invisible to me," I remarked. - -"Not invisible but unnoticed, Watson. You did not know where to -look, and so you missed all that was important. I can never bring -you to realise the importance of sleeves, the suggestiveness of -thumb-nails, or the great issues that may hang from a boot-lace. -Now, what did you gather from that woman's appearance? Describe -it." - -"Well, she had a slate-coloured, broad-brimmed straw hat, with a -feather of a brickish red. Her jacket was black, with black beads -sewn upon it, and a fringe of little black jet ornaments. Her -dress was brown, rather darker than coffee colour, with a little -purple plush at the neck and sleeves. Her gloves were greyish and -were worn through at the right forefinger. Her boots I didn't -observe. She had small round, hanging gold earrings, and a -general air of being fairly well-to-do in a vulgar, comfortable, -easy-going way." - -Sherlock Holmes clapped his hands softly together and chuckled. - -"'Pon my word, Watson, you are coming along wonderfully. You have -really done very well indeed. It is true that you have missed -everything of importance, but you have hit upon the method, and -you have a quick eye for colour. Never trust to general -impressions, my boy, but concentrate yourself upon details. My -first glance is always at a woman's sleeve. In a man it is -perhaps better first to take the knee of the trouser. As you -observe, this woman had plush upon her sleeves, which is a most -useful material for showing traces. The double line a little -above the wrist, where the typewritist presses against the table, -was beautifully defined. The sewing-machine, of the hand type, -leaves a similar mark, but only on the left arm, and on the side -of it farthest from the thumb, instead of being right across the -broadest part, as this was. I then glanced at her face, and, -observing the dint of a pince-nez at either side of her nose, I -ventured a remark upon short sight and typewriting, which seemed -to surprise her." - -"It surprised me." - -"But, surely, it was obvious. I was then much surprised and -interested on glancing down to observe that, though the boots -which she was wearing were not unlike each other, they were -really odd ones; the one having a slightly decorated toe-cap, and -the other a plain one. One was buttoned only in the two lower -buttons out of five, and the other at the first, third, and -fifth. Now, when you see that a young lady, otherwise neatly -dressed, has come away from home with odd boots, half-buttoned, -it is no great deduction to say that she came away in a hurry." - -"And what else?" I asked, keenly interested, as I always was, by -my friend's incisive reasoning. - -"I noted, in passing, that she had written a note before leaving -home but after being fully dressed. You observed that her right -glove was torn at the forefinger, but you did not apparently see -that both glove and finger were stained with violet ink. She had -written in a hurry and dipped her pen too deep. It must have been -this morning, or the mark would not remain clear upon the finger. -All this is amusing, though rather elementary, but I must go back -to business, Watson. Would you mind reading me the advertised -description of Mr. Hosmer Angel?" - -I held the little printed slip to the light. - -"Missing," it said, "on the morning of the fourteenth, a gentleman -named Hosmer Angel. About five ft. seven in. in height; -strongly built, sallow complexion, black hair, a little bald in -the centre, bushy, black side-whiskers and moustache; tinted -glasses, slight infirmity of speech. Was dressed, when last seen, -in black frock-coat faced with silk, black waistcoat, gold Albert -chain, and grey Harris tweed trousers, with brown gaiters over -elastic-sided boots. Known to have been employed in an office in -Leadenhall Street. Anybody bringing--" - -"That will do," said Holmes. "As to the letters," he continued, -glancing over them, "they are very commonplace. Absolutely no -clue in them to Mr. Angel, save that he quotes Balzac once. There -is one remarkable point, however, which will no doubt strike -you." - -"They are typewritten," I remarked. - -"Not only that, but the signature is typewritten. Look at the -neat little 'Hosmer Angel' at the bottom. There is a date, you -see, but no superscription except Leadenhall Street, which is -rather vague. The point about the signature is very suggestive--in -fact, we may call it conclusive." - -"Of what?" - -"My dear fellow, is it possible you do not see how strongly it -bears upon the case?" - -"I cannot say that I do unless it were that he wished to be able -to deny his signature if an action for breach of promise were -instituted." - -"No, that was not the point. However, I shall write two letters, -which should settle the matter. One is to a firm in the City, the -other is to the young lady's stepfather, Mr. Windibank, asking -him whether he could meet us here at six o'clock tomorrow -evening. It is just as well that we should do business with the -male relatives. And now, Doctor, we can do nothing until the -answers to those letters come, so we may put our little problem -upon the shelf for the interim." - -I had had so many reasons to believe in my friend's subtle powers -of reasoning and extraordinary energy in action that I felt that -he must have some solid grounds for the assured and easy -demeanour with which he treated the singular mystery which he had -been called upon to fathom. Once only had I known him to fail, in -the case of the King of Bohemia and of the Irene Adler -photograph; but when I looked back to the weird business of the -Sign of Four, and the extraordinary circumstances connected with -the Study in Scarlet, I felt that it would be a strange tangle -indeed which he could not unravel. - -I left him then, still puffing at his black clay pipe, with the -conviction that when I came again on the next evening I would -find that he held in his hands all the clues which would lead up -to the identity of the disappearing bridegroom of Miss Mary -Sutherland. - -A professional case of great gravity was engaging my own -attention at the time, and the whole of next day I was busy at -the bedside of the sufferer. It was not until close upon six -o'clock that I found myself free and was able to spring into a -hansom and drive to Baker Street, half afraid that I might be too -late to assist at the dénouement of the little mystery. I found -Sherlock Holmes alone, however, half asleep, with his long, thin -form curled up in the recesses of his armchair. A formidable -array of bottles and test-tubes, with the pungent cleanly smell -of hydrochloric acid, told me that he had spent his day in the -chemical work which was so dear to him. - -"Well, have you solved it?" I asked as I entered. - -"Yes. It was the bisulphate of baryta." - -"No, no, the mystery!" I cried. - -"Oh, that! I thought of the salt that I have been working upon. -There was never any mystery in the matter, though, as I said -yesterday, some of the details are of interest. The only drawback -is that there is no law, I fear, that can touch the scoundrel." - -"Who was he, then, and what was his object in deserting Miss -Sutherland?" - -The question was hardly out of my mouth, and Holmes had not yet -opened his lips to reply, when we heard a heavy footfall in the -passage and a tap at the door. - -"This is the girl's stepfather, Mr. James Windibank," said -Holmes. "He has written to me to say that he would be here at -six. Come in!" - -The man who entered was a sturdy, middle-sized fellow, some -thirty years of age, clean-shaven, and sallow-skinned, with a -bland, insinuating manner, and a pair of wonderfully sharp and -penetrating grey eyes. He shot a questioning glance at each of -us, placed his shiny top-hat upon the sideboard, and with a -slight bow sidled down into the nearest chair. - -"Good-evening, Mr. James Windibank," said Holmes. "I think that -this typewritten letter is from you, in which you made an -appointment with me for six o'clock?" - -"Yes, sir. I am afraid that I am a little late, but I am not -quite my own master, you know. I am sorry that Miss Sutherland -has troubled you about this little matter, for I think it is far -better not to wash linen of the sort in public. It was quite -against my wishes that she came, but she is a very excitable, -impulsive girl, as you may have noticed, and she is not easily -controlled when she has made up her mind on a point. Of course, I -did not mind you so much, as you are not connected with the -official police, but it is not pleasant to have a family -misfortune like this noised abroad. Besides, it is a useless -expense, for how could you possibly find this Hosmer Angel?" - -"On the contrary," said Holmes quietly; "I have every reason to -believe that I will succeed in discovering Mr. Hosmer Angel." - -Mr. Windibank gave a violent start and dropped his gloves. "I am -delighted to hear it," he said. - -"It is a curious thing," remarked Holmes, "that a typewriter has -really quite as much individuality as a man's handwriting. Unless -they are quite new, no two of them write exactly alike. Some -letters get more worn than others, and some wear only on one -side. Now, you remark in this note of yours, Mr. Windibank, that -in every case there is some little slurring over of the 'e,' and -a slight defect in the tail of the 'r.' There are fourteen other -characteristics, but those are the more obvious." - -"We do all our correspondence with this machine at the office, -and no doubt it is a little worn," our visitor answered, glancing -keenly at Holmes with his bright little eyes. - -"And now I will show you what is really a very interesting study, -Mr. Windibank," Holmes continued. "I think of writing another -little monograph some of these days on the typewriter and its -relation to crime. It is a subject to which I have devoted some -little attention. I have here four letters which purport to come -from the missing man. They are all typewritten. In each case, not -only are the 'e's' slurred and the 'r's' tailless, but you will -observe, if you care to use my magnifying lens, that the fourteen -other characteristics to which I have alluded are there as well." - -Mr. Windibank sprang out of his chair and picked up his hat. "I -cannot waste time over this sort of fantastic talk, Mr. Holmes," -he said. "If you can catch the man, catch him, and let me know -when you have done it." - -"Certainly," said Holmes, stepping over and turning the key in -the door. "I let you know, then, that I have caught him!" - -"What! where?" shouted Mr. Windibank, turning white to his lips -and glancing about him like a rat in a trap. - -"Oh, it won't do--really it won't," said Holmes suavely. "There -is no possible getting out of it, Mr. Windibank. It is quite too -transparent, and it was a very bad compliment when you said that -it was impossible for me to solve so simple a question. That's -right! Sit down and let us talk it over." - -Our visitor collapsed into a chair, with a ghastly face and a -glitter of moisture on his brow. "It--it's not actionable," he -stammered. - -"I am very much afraid that it is not. But between ourselves, -Windibank, it was as cruel and selfish and heartless a trick in a -petty way as ever came before me. Now, let me just run over the -course of events, and you will contradict me if I go wrong." - -The man sat huddled up in his chair, with his head sunk upon his -breast, like one who is utterly crushed. Holmes stuck his feet up -on the corner of the mantelpiece and, leaning back with his hands -in his pockets, began talking, rather to himself, as it seemed, -than to us. - -"The man married a woman very much older than himself for her -money," said he, "and he enjoyed the use of the money of the -daughter as long as she lived with them. It was a considerable -sum, for people in their position, and the loss of it would have -made a serious difference. It was worth an effort to preserve it. -The daughter was of a good, amiable disposition, but affectionate -and warm-hearted in her ways, so that it was evident that with -her fair personal advantages, and her little income, she would -not be allowed to remain single long. Now her marriage would -mean, of course, the loss of a hundred a year, so what does her -stepfather do to prevent it? He takes the obvious course of -keeping her at home and forbidding her to seek the company of -people of her own age. But soon he found that that would not -answer forever. She became restive, insisted upon her rights, and -finally announced her positive intention of going to a certain -ball. What does her clever stepfather do then? He conceives an -idea more creditable to his head than to his heart. With the -connivance and assistance of his wife he disguised himself, -covered those keen eyes with tinted glasses, masked the face with -a moustache and a pair of bushy whiskers, sunk that clear voice -into an insinuating whisper, and doubly secure on account of the -girl's short sight, he appears as Mr. Hosmer Angel, and keeps off -other lovers by making love himself." - -"It was only a joke at first," groaned our visitor. "We never -thought that she would have been so carried away." - -"Very likely not. However that may be, the young lady was very -decidedly carried away, and, having quite made up her mind that -her stepfather was in France, the suspicion of treachery never -for an instant entered her mind. She was flattered by the -gentleman's attentions, and the effect was increased by the -loudly expressed admiration of her mother. Then Mr. Angel began -to call, for it was obvious that the matter should be pushed as -far as it would go if a real effect were to be produced. There -were meetings, and an engagement, which would finally secure the -girl's affections from turning towards anyone else. But the -deception could not be kept up forever. These pretended journeys -to France were rather cumbrous. The thing to do was clearly to -bring the business to an end in such a dramatic manner that it -would leave a permanent impression upon the young lady's mind and -prevent her from looking upon any other suitor for some time to -come. Hence those vows of fidelity exacted upon a Testament, and -hence also the allusions to a possibility of something happening -on the very morning of the wedding. James Windibank wished Miss -Sutherland to be so bound to Hosmer Angel, and so uncertain as to -his fate, that for ten years to come, at any rate, she would not -listen to another man. As far as the church door he brought her, -and then, as he could go no farther, he conveniently vanished -away by the old trick of stepping in at one door of a -four-wheeler and out at the other. I think that was the chain of -events, Mr. Windibank!" - -Our visitor had recovered something of his assurance while Holmes -had been talking, and he rose from his chair now with a cold -sneer upon his pale face. - -"It may be so, or it may not, Mr. Holmes," said he, "but if you -are so very sharp you ought to be sharp enough to know that it is -you who are breaking the law now, and not me. I have done nothing -actionable from the first, but as long as you keep that door -locked you lay yourself open to an action for assault and illegal -constraint." - -"The law cannot, as you say, touch you," said Holmes, unlocking -and throwing open the door, "yet there never was a man who -deserved punishment more. If the young lady has a brother or a -friend, he ought to lay a whip across your shoulders. By Jove!" -he continued, flushing up at the sight of the bitter sneer upon -the man's face, "it is not part of my duties to my client, but -here's a hunting crop handy, and I think I shall just treat -myself to--" He took two swift steps to the whip, but before he -could grasp it there was a wild clatter of steps upon the stairs, -the heavy hall door banged, and from the window we could see Mr. -James Windibank running at the top of his speed down the road. - -"There's a cold-blooded scoundrel!" said Holmes, laughing, as he -threw himself down into his chair once more. "That fellow will -rise from crime to crime until he does something very bad, and -ends on a gallows. The case has, in some respects, been not -entirely devoid of interest." - -"I cannot now entirely see all the steps of your reasoning," I -remarked. - -"Well, of course it was obvious from the first that this Mr. -Hosmer Angel must have some strong object for his curious -conduct, and it was equally clear that the only man who really -profited by the incident, as far as we could see, was the -stepfather. Then the fact that the two men were never together, -but that the one always appeared when the other was away, was -suggestive. So were the tinted spectacles and the curious voice, -which both hinted at a disguise, as did the bushy whiskers. My -suspicions were all confirmed by his peculiar action in -typewriting his signature, which, of course, inferred that his -handwriting was so familiar to her that she would recognise even -the smallest sample of it. You see all these isolated facts, -together with many minor ones, all pointed in the same -direction." - -"And how did you verify them?" - -"Having once spotted my man, it was easy to get corroboration. I -knew the firm for which this man worked. Having taken the printed -description. I eliminated everything from it which could be the -result of a disguise--the whiskers, the glasses, the voice, and I -sent it to the firm, with a request that they would inform me -whether it answered to the description of any of their -travellers. I had already noticed the peculiarities of the -typewriter, and I wrote to the man himself at his business -address asking him if he would come here. As I expected, his -reply was typewritten and revealed the same trivial but -characteristic defects. The same post brought me a letter from -Westhouse & Marbank, of Fenchurch Street, to say that the -description tallied in every respect with that of their employé, -James Windibank. Voilà tout!" - -"And Miss Sutherland?" - -"If I tell her she will not believe me. You may remember the old -Persian saying, 'There is danger for him who taketh the tiger -cub, and danger also for whoso snatches a delusion from a woman.' -There is as much sense in Hafiz as in Horace, and as much -knowledge of the world." - - - -ADVENTURE IV. THE BOSCOMBE VALLEY MYSTERY - -We were seated at breakfast one morning, my wife and I, when the -maid brought in a telegram. It was from Sherlock Holmes and ran -in this way: - -"Have you a couple of days to spare? Have just been wired for from -the west of England in connection with Boscombe Valley tragedy. -Shall be glad if you will come with me. Air and scenery perfect. -Leave Paddington by the 11:15." - -"What do you say, dear?" said my wife, looking across at me. -"Will you go?" - -"I really don't know what to say. I have a fairly long list at -present." - -"Oh, Anstruther would do your work for you. You have been looking -a little pale lately. I think that the change would do you good, -and you are always so interested in Mr. Sherlock Holmes' cases." - -"I should be ungrateful if I were not, seeing what I gained -through one of them," I answered. "But if I am to go, I must pack -at once, for I have only half an hour." - -My experience of camp life in Afghanistan had at least had the -effect of making me a prompt and ready traveller. My wants were -few and simple, so that in less than the time stated I was in a -cab with my valise, rattling away to Paddington Station. Sherlock -Holmes was pacing up and down the platform, his tall, gaunt -figure made even gaunter and taller by his long grey -travelling-cloak and close-fitting cloth cap. - -"It is really very good of you to come, Watson," said he. "It -makes a considerable difference to me, having someone with me on -whom I can thoroughly rely. Local aid is always either worthless -or else biassed. If you will keep the two corner seats I shall -get the tickets." - -We had the carriage to ourselves save for an immense litter of -papers which Holmes had brought with him. Among these he rummaged -and read, with intervals of note-taking and of meditation, until -we were past Reading. Then he suddenly rolled them all into a -gigantic ball and tossed them up onto the rack. - -"Have you heard anything of the case?" he asked. - -"Not a word. I have not seen a paper for some days." - -"The London press has not had very full accounts. I have just -been looking through all the recent papers in order to master the -particulars. It seems, from what I gather, to be one of those -simple cases which are so extremely difficult." - -"That sounds a little paradoxical." - -"But it is profoundly true. Singularity is almost invariably a -clue. The more featureless and commonplace a crime is, the more -difficult it is to bring it home. In this case, however, they -have established a very serious case against the son of the -murdered man." - -"It is a murder, then?" - -"Well, it is conjectured to be so. I shall take nothing for -granted until I have the opportunity of looking personally into -it. I will explain the state of things to you, as far as I have -been able to understand it, in a very few words. - -"Boscombe Valley is a country district not very far from Ross, in -Herefordshire. The largest landed proprietor in that part is a -Mr. John Turner, who made his money in Australia and returned -some years ago to the old country. One of the farms which he -held, that of Hatherley, was let to Mr. Charles McCarthy, who was -also an ex-Australian. The men had known each other in the -colonies, so that it was not unnatural that when they came to -settle down they should do so as near each other as possible. -Turner was apparently the richer man, so McCarthy became his -tenant but still remained, it seems, upon terms of perfect -equality, as they were frequently together. McCarthy had one son, -a lad of eighteen, and Turner had an only daughter of the same -age, but neither of them had wives living. They appear to have -avoided the society of the neighbouring English families and to -have led retired lives, though both the McCarthys were fond of -sport and were frequently seen at the race-meetings of the -neighbourhood. McCarthy kept two servants--a man and a girl. -Turner had a considerable household, some half-dozen at the -least. That is as much as I have been able to gather about the -families. Now for the facts. - -"On June 3rd, that is, on Monday last, McCarthy left his house at -Hatherley about three in the afternoon and walked down to the -Boscombe Pool, which is a small lake formed by the spreading out -of the stream which runs down the Boscombe Valley. He had been -out with his serving-man in the morning at Ross, and he had told -the man that he must hurry, as he had an appointment of -importance to keep at three. From that appointment he never came -back alive. - -"From Hatherley Farm-house to the Boscombe Pool is a quarter of a -mile, and two people saw him as he passed over this ground. One -was an old woman, whose name is not mentioned, and the other was -William Crowder, a game-keeper in the employ of Mr. Turner. Both -these witnesses depose that Mr. McCarthy was walking alone. The -game-keeper adds that within a few minutes of his seeing Mr. -McCarthy pass he had seen his son, Mr. James McCarthy, going the -same way with a gun under his arm. To the best of his belief, the -father was actually in sight at the time, and the son was -following him. He thought no more of the matter until he heard in -the evening of the tragedy that had occurred. - -"The two McCarthys were seen after the time when William Crowder, -the game-keeper, lost sight of them. The Boscombe Pool is thickly -wooded round, with just a fringe of grass and of reeds round the -edge. A girl of fourteen, Patience Moran, who is the daughter of -the lodge-keeper of the Boscombe Valley estate, was in one of the -woods picking flowers. She states that while she was there she -saw, at the border of the wood and close by the lake, Mr. -McCarthy and his son, and that they appeared to be having a -violent quarrel. She heard Mr. McCarthy the elder using very -strong language to his son, and she saw the latter raise up his -hand as if to strike his father. She was so frightened by their -violence that she ran away and told her mother when she reached -home that she had left the two McCarthys quarrelling near -Boscombe Pool, and that she was afraid that they were going to -fight. She had hardly said the words when young Mr. McCarthy came -running up to the lodge to say that he had found his father dead -in the wood, and to ask for the help of the lodge-keeper. He was -much excited, without either his gun or his hat, and his right -hand and sleeve were observed to be stained with fresh blood. On -following him they found the dead body stretched out upon the -grass beside the pool. The head had been beaten in by repeated -blows of some heavy and blunt weapon. The injuries were such as -might very well have been inflicted by the butt-end of his son's -gun, which was found lying on the grass within a few paces of the -body. Under these circumstances the young man was instantly -arrested, and a verdict of 'wilful murder' having been returned -at the inquest on Tuesday, he was on Wednesday brought before the -magistrates at Ross, who have referred the case to the next -Assizes. Those are the main facts of the case as they came out -before the coroner and the police-court." - -"I could hardly imagine a more damning case," I remarked. "If -ever circumstantial evidence pointed to a criminal it does so -here." - -"Circumstantial evidence is a very tricky thing," answered Holmes -thoughtfully. "It may seem to point very straight to one thing, -but if you shift your own point of view a little, you may find it -pointing in an equally uncompromising manner to something -entirely different. It must be confessed, however, that the case -looks exceedingly grave against the young man, and it is very -possible that he is indeed the culprit. There are several people -in the neighbourhood, however, and among them Miss Turner, the -daughter of the neighbouring landowner, who believe in his -innocence, and who have retained Lestrade, whom you may recollect -in connection with the Study in Scarlet, to work out the case in -his interest. Lestrade, being rather puzzled, has referred the -case to me, and hence it is that two middle-aged gentlemen are -flying westward at fifty miles an hour instead of quietly -digesting their breakfasts at home." - -"I am afraid," said I, "that the facts are so obvious that you -will find little credit to be gained out of this case." - -"There is nothing more deceptive than an obvious fact," he -answered, laughing. "Besides, we may chance to hit upon some -other obvious facts which may have been by no means obvious to -Mr. Lestrade. You know me too well to think that I am boasting -when I say that I shall either confirm or destroy his theory by -means which he is quite incapable of employing, or even of -understanding. To take the first example to hand, I very clearly -perceive that in your bedroom the window is upon the right-hand -side, and yet I question whether Mr. Lestrade would have noted -even so self-evident a thing as that." - -"How on earth--" - -"My dear fellow, I know you well. I know the military neatness -which characterises you. You shave every morning, and in this -season you shave by the sunlight; but since your shaving is less -and less complete as we get farther back on the left side, until -it becomes positively slovenly as we get round the angle of the -jaw, it is surely very clear that that side is less illuminated -than the other. I could not imagine a man of your habits looking -at himself in an equal light and being satisfied with such a -result. I only quote this as a trivial example of observation and -inference. Therein lies my métier, and it is just possible that -it may be of some service in the investigation which lies before -us. There are one or two minor points which were brought out in -the inquest, and which are worth considering." - -"What are they?" - -"It appears that his arrest did not take place at once, but after -the return to Hatherley Farm. On the inspector of constabulary -informing him that he was a prisoner, he remarked that he was not -surprised to hear it, and that it was no more than his deserts. -This observation of his had the natural effect of removing any -traces of doubt which might have remained in the minds of the -coroner's jury." - -"It was a confession," I ejaculated. - -"No, for it was followed by a protestation of innocence." - -"Coming on the top of such a damning series of events, it was at -least a most suspicious remark." - -"On the contrary," said Holmes, "it is the brightest rift which I -can at present see in the clouds. However innocent he might be, -he could not be such an absolute imbecile as not to see that the -circumstances were very black against him. Had he appeared -surprised at his own arrest, or feigned indignation at it, I -should have looked upon it as highly suspicious, because such -surprise or anger would not be natural under the circumstances, -and yet might appear to be the best policy to a scheming man. His -frank acceptance of the situation marks him as either an innocent -man, or else as a man of considerable self-restraint and -firmness. As to his remark about his deserts, it was also not -unnatural if you consider that he stood beside the dead body of -his father, and that there is no doubt that he had that very day -so far forgotten his filial duty as to bandy words with him, and -even, according to the little girl whose evidence is so -important, to raise his hand as if to strike him. The -self-reproach and contrition which are displayed in his remark -appear to me to be the signs of a healthy mind rather than of a -guilty one." - -I shook my head. "Many men have been hanged on far slighter -evidence," I remarked. - -"So they have. And many men have been wrongfully hanged." - -"What is the young man's own account of the matter?" - -"It is, I am afraid, not very encouraging to his supporters, -though there are one or two points in it which are suggestive. -You will find it here, and may read it for yourself." - -He picked out from his bundle a copy of the local Herefordshire -paper, and having turned down the sheet he pointed out the -paragraph in which the unfortunate young man had given his own -statement of what had occurred. I settled myself down in the -corner of the carriage and read it very carefully. It ran in this -way: - -"Mr. James McCarthy, the only son of the deceased, was then called -and gave evidence as follows: 'I had been away from home for -three days at Bristol, and had only just returned upon the -morning of last Monday, the 3rd. My father was absent from home at -the time of my arrival, and I was informed by the maid that he -had driven over to Ross with John Cobb, the groom. Shortly after -my return I heard the wheels of his trap in the yard, and, -looking out of my window, I saw him get out and walk rapidly out -of the yard, though I was not aware in which direction he was -going. I then took my gun and strolled out in the direction of -the Boscombe Pool, with the intention of visiting the rabbit -warren which is upon the other side. On my way I saw William -Crowder, the game-keeper, as he had stated in his evidence; but -he is mistaken in thinking that I was following my father. I had -no idea that he was in front of me. When about a hundred yards -from the pool I heard a cry of "Cooee!" which was a usual signal -between my father and myself. I then hurried forward, and found -him standing by the pool. He appeared to be much surprised at -seeing me and asked me rather roughly what I was doing there. A -conversation ensued which led to high words and almost to blows, -for my father was a man of a very violent temper. Seeing that his -passion was becoming ungovernable, I left him and returned -towards Hatherley Farm. I had not gone more than 150 yards, -however, when I heard a hideous outcry behind me, which caused me -to run back again. I found my father expiring upon the ground, -with his head terribly injured. I dropped my gun and held him in -my arms, but he almost instantly expired. I knelt beside him for -some minutes, and then made my way to Mr. Turner's lodge-keeper, -his house being the nearest, to ask for assistance. I saw no one -near my father when I returned, and I have no idea how he came by -his injuries. He was not a popular man, being somewhat cold and -forbidding in his manners, but he had, as far as I know, no -active enemies. I know nothing further of the matter.' - -"The Coroner: Did your father make any statement to you before -he died? - -"Witness: He mumbled a few words, but I could only catch some -allusion to a rat. - -"The Coroner: What did you understand by that? - -"Witness: It conveyed no meaning to me. I thought that he was -delirious. - -"The Coroner: What was the point upon which you and your father -had this final quarrel? - -"Witness: I should prefer not to answer. - -"The Coroner: I am afraid that I must press it. - -"Witness: It is really impossible for me to tell you. I can -assure you that it has nothing to do with the sad tragedy which -followed. - -"The Coroner: That is for the court to decide. I need not point -out to you that your refusal to answer will prejudice your case -considerably in any future proceedings which may arise. - -"Witness: I must still refuse. - -"The Coroner: I understand that the cry of 'Cooee' was a common -signal between you and your father? - -"Witness: It was. - -"The Coroner: How was it, then, that he uttered it before he saw -you, and before he even knew that you had returned from Bristol? - -"Witness (with considerable confusion): I do not know. - -"A Juryman: Did you see nothing which aroused your suspicions -when you returned on hearing the cry and found your father -fatally injured? - -"Witness: Nothing definite. - -"The Coroner: What do you mean? - -"Witness: I was so disturbed and excited as I rushed out into -the open, that I could think of nothing except of my father. Yet -I have a vague impression that as I ran forward something lay -upon the ground to the left of me. It seemed to me to be -something grey in colour, a coat of some sort, or a plaid perhaps. -When I rose from my father I looked round for it, but it was -gone. - -"'Do you mean that it disappeared before you went for help?' - -"'Yes, it was gone.' - -"'You cannot say what it was?' - -"'No, I had a feeling something was there.' - -"'How far from the body?' - -"'A dozen yards or so.' - -"'And how far from the edge of the wood?' - -"'About the same.' - -"'Then if it was removed it was while you were within a dozen -yards of it?' - -"'Yes, but with my back towards it.' - -"This concluded the examination of the witness." - -"I see," said I as I glanced down the column, "that the coroner -in his concluding remarks was rather severe upon young McCarthy. -He calls attention, and with reason, to the discrepancy about his -father having signalled to him before seeing him, also to his -refusal to give details of his conversation with his father, and -his singular account of his father's dying words. They are all, -as he remarks, very much against the son." - -Holmes laughed softly to himself and stretched himself out upon -the cushioned seat. "Both you and the coroner have been at some -pains," said he, "to single out the very strongest points in the -young man's favour. Don't you see that you alternately give him -credit for having too much imagination and too little? Too -little, if he could not invent a cause of quarrel which would -give him the sympathy of the jury; too much, if he evolved from -his own inner consciousness anything so outré as a dying -reference to a rat, and the incident of the vanishing cloth. No, -sir, I shall approach this case from the point of view that what -this young man says is true, and we shall see whither that -hypothesis will lead us. And now here is my pocket Petrarch, and -not another word shall I say of this case until we are on the -scene of action. We lunch at Swindon, and I see that we shall be -there in twenty minutes." - -It was nearly four o'clock when we at last, after passing through -the beautiful Stroud Valley, and over the broad gleaming Severn, -found ourselves at the pretty little country-town of Ross. A -lean, ferret-like man, furtive and sly-looking, was waiting for -us upon the platform. In spite of the light brown dustcoat and -leather-leggings which he wore in deference to his rustic -surroundings, I had no difficulty in recognising Lestrade, of -Scotland Yard. With him we drove to the Hereford Arms where a -room had already been engaged for us. - -"I have ordered a carriage," said Lestrade as we sat over a cup -of tea. "I knew your energetic nature, and that you would not be -happy until you had been on the scene of the crime." - -"It was very nice and complimentary of you," Holmes answered. "It -is entirely a question of barometric pressure." - -Lestrade looked startled. "I do not quite follow," he said. - -"How is the glass? Twenty-nine, I see. No wind, and not a cloud -in the sky. I have a caseful of cigarettes here which need -smoking, and the sofa is very much superior to the usual country -hotel abomination. I do not think that it is probable that I -shall use the carriage to-night." - -Lestrade laughed indulgently. "You have, no doubt, already formed -your conclusions from the newspapers," he said. "The case is as -plain as a pikestaff, and the more one goes into it the plainer -it becomes. Still, of course, one can't refuse a lady, and such a -very positive one, too. She has heard of you, and would have your -opinion, though I repeatedly told her that there was nothing -which you could do which I had not already done. Why, bless my -soul! here is her carriage at the door." - -He had hardly spoken before there rushed into the room one of the -most lovely young women that I have ever seen in my life. Her -violet eyes shining, her lips parted, a pink flush upon her -cheeks, all thought of her natural reserve lost in her -overpowering excitement and concern. - -"Oh, Mr. Sherlock Holmes!" she cried, glancing from one to the -other of us, and finally, with a woman's quick intuition, -fastening upon my companion, "I am so glad that you have come. I -have driven down to tell you so. I know that James didn't do it. -I know it, and I want you to start upon your work knowing it, -too. Never let yourself doubt upon that point. We have known each -other since we were little children, and I know his faults as no -one else does; but he is too tender-hearted to hurt a fly. Such a -charge is absurd to anyone who really knows him." - -"I hope we may clear him, Miss Turner," said Sherlock Holmes. -"You may rely upon my doing all that I can." - -"But you have read the evidence. You have formed some conclusion? -Do you not see some loophole, some flaw? Do you not yourself -think that he is innocent?" - -"I think that it is very probable." - -"There, now!" she cried, throwing back her head and looking -defiantly at Lestrade. "You hear! He gives me hopes." - -Lestrade shrugged his shoulders. "I am afraid that my colleague -has been a little quick in forming his conclusions," he said. - -"But he is right. Oh! I know that he is right. James never did -it. And about his quarrel with his father, I am sure that the -reason why he would not speak about it to the coroner was because -I was concerned in it." - -"In what way?" asked Holmes. - -"It is no time for me to hide anything. James and his father had -many disagreements about me. Mr. McCarthy was very anxious that -there should be a marriage between us. James and I have always -loved each other as brother and sister; but of course he is young -and has seen very little of life yet, and--and--well, he -naturally did not wish to do anything like that yet. So there -were quarrels, and this, I am sure, was one of them." - -"And your father?" asked Holmes. "Was he in favour of such a -union?" - -"No, he was averse to it also. No one but Mr. McCarthy was in -favour of it." A quick blush passed over her fresh young face as -Holmes shot one of his keen, questioning glances at her. - -"Thank you for this information," said he. "May I see your father -if I call to-morrow?" - -"I am afraid the doctor won't allow it." - -"The doctor?" - -"Yes, have you not heard? Poor father has never been strong for -years back, but this has broken him down completely. He has taken -to his bed, and Dr. Willows says that he is a wreck and that his -nervous system is shattered. Mr. McCarthy was the only man alive -who had known dad in the old days in Victoria." - -"Ha! In Victoria! That is important." - -"Yes, at the mines." - -"Quite so; at the gold-mines, where, as I understand, Mr. Turner -made his money." - -"Yes, certainly." - -"Thank you, Miss Turner. You have been of material assistance to -me." - -"You will tell me if you have any news to-morrow. No doubt you -will go to the prison to see James. Oh, if you do, Mr. Holmes, do -tell him that I know him to be innocent." - -"I will, Miss Turner." - -"I must go home now, for dad is very ill, and he misses me so if -I leave him. Good-bye, and God help you in your undertaking." She -hurried from the room as impulsively as she had entered, and we -heard the wheels of her carriage rattle off down the street. - -"I am ashamed of you, Holmes," said Lestrade with dignity after a -few minutes' silence. "Why should you raise up hopes which you -are bound to disappoint? I am not over-tender of heart, but I -call it cruel." - -"I think that I see my way to clearing James McCarthy," said -Holmes. "Have you an order to see him in prison?" - -"Yes, but only for you and me." - -"Then I shall reconsider my resolution about going out. We have -still time to take a train to Hereford and see him to-night?" - -"Ample." - -"Then let us do so. Watson, I fear that you will find it very -slow, but I shall only be away a couple of hours." - -I walked down to the station with them, and then wandered through -the streets of the little town, finally returning to the hotel, -where I lay upon the sofa and tried to interest myself in a -yellow-backed novel. The puny plot of the story was so thin, -however, when compared to the deep mystery through which we were -groping, and I found my attention wander so continually from the -action to the fact, that I at last flung it across the room and -gave myself up entirely to a consideration of the events of the -day. Supposing that this unhappy young man's story were -absolutely true, then what hellish thing, what absolutely -unforeseen and extraordinary calamity could have occurred between -the time when he parted from his father, and the moment when, -drawn back by his screams, he rushed into the glade? It was -something terrible and deadly. What could it be? Might not the -nature of the injuries reveal something to my medical instincts? -I rang the bell and called for the weekly county paper, which -contained a verbatim account of the inquest. In the surgeon's -deposition it was stated that the posterior third of the left -parietal bone and the left half of the occipital bone had been -shattered by a heavy blow from a blunt weapon. I marked the spot -upon my own head. Clearly such a blow must have been struck from -behind. That was to some extent in favour of the accused, as when -seen quarrelling he was face to face with his father. Still, it -did not go for very much, for the older man might have turned his -back before the blow fell. Still, it might be worth while to call -Holmes' attention to it. Then there was the peculiar dying -reference to a rat. What could that mean? It could not be -delirium. A man dying from a sudden blow does not commonly become -delirious. No, it was more likely to be an attempt to explain how -he met his fate. But what could it indicate? I cudgelled my -brains to find some possible explanation. And then the incident -of the grey cloth seen by young McCarthy. If that were true the -murderer must have dropped some part of his dress, presumably his -overcoat, in his flight, and must have had the hardihood to -return and to carry it away at the instant when the son was -kneeling with his back turned not a dozen paces off. What a -tissue of mysteries and improbabilities the whole thing was! I -did not wonder at Lestrade's opinion, and yet I had so much faith -in Sherlock Holmes' insight that I could not lose hope as long -as every fresh fact seemed to strengthen his conviction of young -McCarthy's innocence. - -It was late before Sherlock Holmes returned. He came back alone, -for Lestrade was staying in lodgings in the town. - -"The glass still keeps very high," he remarked as he sat down. -"It is of importance that it should not rain before we are able -to go over the ground. On the other hand, a man should be at his -very best and keenest for such nice work as that, and I did not -wish to do it when fagged by a long journey. I have seen young -McCarthy." - -"And what did you learn from him?" - -"Nothing." - -"Could he throw no light?" - -"None at all. I was inclined to think at one time that he knew -who had done it and was screening him or her, but I am convinced -now that he is as puzzled as everyone else. He is not a very -quick-witted youth, though comely to look at and, I should think, -sound at heart." - -"I cannot admire his taste," I remarked, "if it is indeed a fact -that he was averse to a marriage with so charming a young lady as -this Miss Turner." - -"Ah, thereby hangs a rather painful tale. This fellow is madly, -insanely, in love with her, but some two years ago, when he was -only a lad, and before he really knew her, for she had been away -five years at a boarding-school, what does the idiot do but get -into the clutches of a barmaid in Bristol and marry her at a -registry office? No one knows a word of the matter, but you can -imagine how maddening it must be to him to be upbraided for not -doing what he would give his very eyes to do, but what he knows -to be absolutely impossible. It was sheer frenzy of this sort -which made him throw his hands up into the air when his father, -at their last interview, was goading him on to propose to Miss -Turner. On the other hand, he had no means of supporting himself, -and his father, who was by all accounts a very hard man, would -have thrown him over utterly had he known the truth. It was with -his barmaid wife that he had spent the last three days in -Bristol, and his father did not know where he was. Mark that -point. It is of importance. Good has come out of evil, however, -for the barmaid, finding from the papers that he is in serious -trouble and likely to be hanged, has thrown him over utterly and -has written to him to say that she has a husband already in the -Bermuda Dockyard, so that there is really no tie between them. I -think that that bit of news has consoled young McCarthy for all -that he has suffered." - -"But if he is innocent, who has done it?" - -"Ah! who? I would call your attention very particularly to two -points. One is that the murdered man had an appointment with -someone at the pool, and that the someone could not have been his -son, for his son was away, and he did not know when he would -return. The second is that the murdered man was heard to cry -'Cooee!' before he knew that his son had returned. Those are the -crucial points upon which the case depends. And now let us talk -about George Meredith, if you please, and we shall leave all -minor matters until to-morrow." - -There was no rain, as Holmes had foretold, and the morning broke -bright and cloudless. At nine o'clock Lestrade called for us with -the carriage, and we set off for Hatherley Farm and the Boscombe -Pool. - -"There is serious news this morning," Lestrade observed. "It is -said that Mr. Turner, of the Hall, is so ill that his life is -despaired of." - -"An elderly man, I presume?" said Holmes. - -"About sixty; but his constitution has been shattered by his life -abroad, and he has been in failing health for some time. This -business has had a very bad effect upon him. He was an old friend -of McCarthy's, and, I may add, a great benefactor to him, for I -have learned that he gave him Hatherley Farm rent free." - -"Indeed! That is interesting," said Holmes. - -"Oh, yes! In a hundred other ways he has helped him. Everybody -about here speaks of his kindness to him." - -"Really! Does it not strike you as a little singular that this -McCarthy, who appears to have had little of his own, and to have -been under such obligations to Turner, should still talk of -marrying his son to Turner's daughter, who is, presumably, -heiress to the estate, and that in such a very cocksure manner, -as if it were merely a case of a proposal and all else would -follow? It is the more strange, since we know that Turner himself -was averse to the idea. The daughter told us as much. Do you not -deduce something from that?" - -"We have got to the deductions and the inferences," said -Lestrade, winking at me. "I find it hard enough to tackle facts, -Holmes, without flying away after theories and fancies." - -"You are right," said Holmes demurely; "you do find it very hard -to tackle the facts." - -"Anyhow, I have grasped one fact which you seem to find it -difficult to get hold of," replied Lestrade with some warmth. - -"And that is--" - -"That McCarthy senior met his death from McCarthy junior and that -all theories to the contrary are the merest moonshine." - -"Well, moonshine is a brighter thing than fog," said Holmes, -laughing. "But I am very much mistaken if this is not Hatherley -Farm upon the left." - -"Yes, that is it." It was a widespread, comfortable-looking -building, two-storied, slate-roofed, with great yellow blotches -of lichen upon the grey walls. The drawn blinds and the smokeless -chimneys, however, gave it a stricken look, as though the weight -of this horror still lay heavy upon it. We called at the door, -when the maid, at Holmes' request, showed us the boots which her -master wore at the time of his death, and also a pair of the -son's, though not the pair which he had then had. Having measured -these very carefully from seven or eight different points, Holmes -desired to be led to the court-yard, from which we all followed -the winding track which led to Boscombe Pool. - -Sherlock Holmes was transformed when he was hot upon such a scent -as this. Men who had only known the quiet thinker and logician of -Baker Street would have failed to recognise him. His face flushed -and darkened. His brows were drawn into two hard black lines, -while his eyes shone out from beneath them with a steely glitter. -His face was bent downward, his shoulders bowed, his lips -compressed, and the veins stood out like whipcord in his long, -sinewy neck. His nostrils seemed to dilate with a purely animal -lust for the chase, and his mind was so absolutely concentrated -upon the matter before him that a question or remark fell -unheeded upon his ears, or, at the most, only provoked a quick, -impatient snarl in reply. Swiftly and silently he made his way -along the track which ran through the meadows, and so by way of -the woods to the Boscombe Pool. It was damp, marshy ground, as is -all that district, and there were marks of many feet, both upon -the path and amid the short grass which bounded it on either -side. Sometimes Holmes would hurry on, sometimes stop dead, and -once he made quite a little detour into the meadow. Lestrade and -I walked behind him, the detective indifferent and contemptuous, -while I watched my friend with the interest which sprang from the -conviction that every one of his actions was directed towards a -definite end. - -The Boscombe Pool, which is a little reed-girt sheet of water -some fifty yards across, is situated at the boundary between the -Hatherley Farm and the private park of the wealthy Mr. Turner. -Above the woods which lined it upon the farther side we could see -the red, jutting pinnacles which marked the site of the rich -landowner's dwelling. On the Hatherley side of the pool the woods -grew very thick, and there was a narrow belt of sodden grass -twenty paces across between the edge of the trees and the reeds -which lined the lake. Lestrade showed us the exact spot at which -the body had been found, and, indeed, so moist was the ground, -that I could plainly see the traces which had been left by the -fall of the stricken man. To Holmes, as I could see by his eager -face and peering eyes, very many other things were to be read -upon the trampled grass. He ran round, like a dog who is picking -up a scent, and then turned upon my companion. - -"What did you go into the pool for?" he asked. - -"I fished about with a rake. I thought there might be some weapon -or other trace. But how on earth--" - -"Oh, tut, tut! I have no time! That left foot of yours with its -inward twist is all over the place. A mole could trace it, and -there it vanishes among the reeds. Oh, how simple it would all -have been had I been here before they came like a herd of buffalo -and wallowed all over it. Here is where the party with the -lodge-keeper came, and they have covered all tracks for six or -eight feet round the body. But here are three separate tracks of -the same feet." He drew out a lens and lay down upon his -waterproof to have a better view, talking all the time rather to -himself than to us. "These are young McCarthy's feet. Twice he -was walking, and once he ran swiftly, so that the soles are -deeply marked and the heels hardly visible. That bears out his -story. He ran when he saw his father on the ground. Then here are -the father's feet as he paced up and down. What is this, then? It -is the butt-end of the gun as the son stood listening. And this? -Ha, ha! What have we here? Tiptoes! tiptoes! Square, too, quite -unusual boots! They come, they go, they come again--of course -that was for the cloak. Now where did they come from?" He ran up -and down, sometimes losing, sometimes finding the track until we -were well within the edge of the wood and under the shadow of a -great beech, the largest tree in the neighbourhood. Holmes traced -his way to the farther side of this and lay down once more upon -his face with a little cry of satisfaction. For a long time he -remained there, turning over the leaves and dried sticks, -gathering up what seemed to me to be dust into an envelope and -examining with his lens not only the ground but even the bark of -the tree as far as he could reach. A jagged stone was lying among -the moss, and this also he carefully examined and retained. Then -he followed a pathway through the wood until he came to the -highroad, where all traces were lost. - -"It has been a case of considerable interest," he remarked, -returning to his natural manner. "I fancy that this grey house on -the right must be the lodge. I think that I will go in and have a -word with Moran, and perhaps write a little note. Having done -that, we may drive back to our luncheon. You may walk to the cab, -and I shall be with you presently." - -It was about ten minutes before we regained our cab and drove -back into Ross, Holmes still carrying with him the stone which he -had picked up in the wood. - -"This may interest you, Lestrade," he remarked, holding it out. -"The murder was done with it." - -"I see no marks." - -"There are none." - -"How do you know, then?" - -"The grass was growing under it. It had only lain there a few -days. There was no sign of a place whence it had been taken. It -corresponds with the injuries. There is no sign of any other -weapon." - -"And the murderer?" - -"Is a tall man, left-handed, limps with the right leg, wears -thick-soled shooting-boots and a grey cloak, smokes Indian -cigars, uses a cigar-holder, and carries a blunt pen-knife in his -pocket. There are several other indications, but these may be -enough to aid us in our search." - -Lestrade laughed. "I am afraid that I am still a sceptic," he -said. "Theories are all very well, but we have to deal with a -hard-headed British jury." - -"Nous verrons," answered Holmes calmly. "You work your own -method, and I shall work mine. I shall be busy this afternoon, -and shall probably return to London by the evening train." - -"And leave your case unfinished?" - -"No, finished." - -"But the mystery?" - -"It is solved." - -"Who was the criminal, then?" - -"The gentleman I describe." - -"But who is he?" - -"Surely it would not be difficult to find out. This is not such a -populous neighbourhood." - -Lestrade shrugged his shoulders. "I am a practical man," he said, -"and I really cannot undertake to go about the country looking -for a left-handed gentleman with a game leg. I should become the -laughing-stock of Scotland Yard." - -"All right," said Holmes quietly. "I have given you the chance. -Here are your lodgings. Good-bye. I shall drop you a line before -I leave." - -Having left Lestrade at his rooms, we drove to our hotel, where -we found lunch upon the table. Holmes was silent and buried in -thought with a pained expression upon his face, as one who finds -himself in a perplexing position. - -"Look here, Watson," he said when the cloth was cleared "just sit -down in this chair and let me preach to you for a little. I don't -know quite what to do, and I should value your advice. Light a -cigar and let me expound." - - "Pray do so." - -"Well, now, in considering this case there are two points about -young McCarthy's narrative which struck us both instantly, -although they impressed me in his favour and you against him. One -was the fact that his father should, according to his account, -cry 'Cooee!' before seeing him. The other was his singular dying -reference to a rat. He mumbled several words, you understand, but -that was all that caught the son's ear. Now from this double -point our research must commence, and we will begin it by -presuming that what the lad says is absolutely true." - -"What of this 'Cooee!' then?" - -"Well, obviously it could not have been meant for the son. The -son, as far as he knew, was in Bristol. It was mere chance that -he was within earshot. The 'Cooee!' was meant to attract the -attention of whoever it was that he had the appointment with. But -'Cooee' is a distinctly Australian cry, and one which is used -between Australians. There is a strong presumption that the -person whom McCarthy expected to meet him at Boscombe Pool was -someone who had been in Australia." - -"What of the rat, then?" - -Sherlock Holmes took a folded paper from his pocket and flattened -it out on the table. "This is a map of the Colony of Victoria," -he said. "I wired to Bristol for it last night." He put his hand -over part of the map. "What do you read?" - -"ARAT," I read. - -"And now?" He raised his hand. - -"BALLARAT." - -"Quite so. That was the word the man uttered, and of which his -son only caught the last two syllables. He was trying to utter -the name of his murderer. So and so, of Ballarat." - -"It is wonderful!" I exclaimed. - -"It is obvious. And now, you see, I had narrowed the field down -considerably. The possession of a grey garment was a third point -which, granting the son's statement to be correct, was a -certainty. We have come now out of mere vagueness to the definite -conception of an Australian from Ballarat with a grey cloak." - -"Certainly." - -"And one who was at home in the district, for the pool can only -be approached by the farm or by the estate, where strangers could -hardly wander." - -"Quite so." - -"Then comes our expedition of to-day. By an examination of the -ground I gained the trifling details which I gave to that -imbecile Lestrade, as to the personality of the criminal." - -"But how did you gain them?" - -"You know my method. It is founded upon the observation of -trifles." - -"His height I know that you might roughly judge from the length -of his stride. His boots, too, might be told from their traces." - -"Yes, they were peculiar boots." - -"But his lameness?" - -"The impression of his right foot was always less distinct than -his left. He put less weight upon it. Why? Because he limped--he -was lame." - -"But his left-handedness." - -"You were yourself struck by the nature of the injury as recorded -by the surgeon at the inquest. The blow was struck from -immediately behind, and yet was upon the left side. Now, how can -that be unless it were by a left-handed man? He had stood behind -that tree during the interview between the father and son. He had -even smoked there. I found the ash of a cigar, which my special -knowledge of tobacco ashes enables me to pronounce as an Indian -cigar. I have, as you know, devoted some attention to this, and -written a little monograph on the ashes of 140 different -varieties of pipe, cigar, and cigarette tobacco. Having found the -ash, I then looked round and discovered the stump among the moss -where he had tossed it. It was an Indian cigar, of the variety -which are rolled in Rotterdam." - -"And the cigar-holder?" - -"I could see that the end had not been in his mouth. Therefore he -used a holder. The tip had been cut off, not bitten off, but the -cut was not a clean one, so I deduced a blunt pen-knife." - -"Holmes," I said, "you have drawn a net round this man from which -he cannot escape, and you have saved an innocent human life as -truly as if you had cut the cord which was hanging him. I see the -direction in which all this points. The culprit is--" - -"Mr. John Turner," cried the hotel waiter, opening the door of -our sitting-room, and ushering in a visitor. - -The man who entered was a strange and impressive figure. His -slow, limping step and bowed shoulders gave the appearance of -decrepitude, and yet his hard, deep-lined, craggy features, and -his enormous limbs showed that he was possessed of unusual -strength of body and of character. His tangled beard, grizzled -hair, and outstanding, drooping eyebrows combined to give an air -of dignity and power to his appearance, but his face was of an -ashen white, while his lips and the corners of his nostrils were -tinged with a shade of blue. It was clear to me at a glance that -he was in the grip of some deadly and chronic disease. - -"Pray sit down on the sofa," said Holmes gently. "You had my -note?" - -"Yes, the lodge-keeper brought it up. You said that you wished to -see me here to avoid scandal." - -"I thought people would talk if I went to the Hall." - -"And why did you wish to see me?" He looked across at my -companion with despair in his weary eyes, as though his question -was already answered. - -"Yes," said Holmes, answering the look rather than the words. "It -is so. I know all about McCarthy." - -The old man sank his face in his hands. "God help me!" he cried. -"But I would not have let the young man come to harm. I give you -my word that I would have spoken out if it went against him at -the Assizes." - -"I am glad to hear you say so," said Holmes gravely. - -"I would have spoken now had it not been for my dear girl. It -would break her heart--it will break her heart when she hears -that I am arrested." - -"It may not come to that," said Holmes. - -"What?" - -"I am no official agent. I understand that it was your daughter -who required my presence here, and I am acting in her interests. -Young McCarthy must be got off, however." - -"I am a dying man," said old Turner. "I have had diabetes for -years. My doctor says it is a question whether I shall live a -month. Yet I would rather die under my own roof than in a gaol." - -Holmes rose and sat down at the table with his pen in his hand -and a bundle of paper before him. "Just tell us the truth," he -said. "I shall jot down the facts. You will sign it, and Watson -here can witness it. Then I could produce your confession at the -last extremity to save young McCarthy. I promise you that I shall -not use it unless it is absolutely needed." - -"It's as well," said the old man; "it's a question whether I -shall live to the Assizes, so it matters little to me, but I -should wish to spare Alice the shock. And now I will make the -thing clear to you; it has been a long time in the acting, but -will not take me long to tell. - -"You didn't know this dead man, McCarthy. He was a devil -incarnate. I tell you that. God keep you out of the clutches of -such a man as he. His grip has been upon me these twenty years, -and he has blasted my life. I'll tell you first how I came to be -in his power. - -"It was in the early '60's at the diggings. I was a young chap -then, hot-blooded and reckless, ready to turn my hand at -anything; I got among bad companions, took to drink, had no luck -with my claim, took to the bush, and in a word became what you -would call over here a highway robber. There were six of us, and -we had a wild, free life of it, sticking up a station from time -to time, or stopping the wagons on the road to the diggings. -Black Jack of Ballarat was the name I went under, and our party -is still remembered in the colony as the Ballarat Gang. - -"One day a gold convoy came down from Ballarat to Melbourne, and -we lay in wait for it and attacked it. There were six troopers -and six of us, so it was a close thing, but we emptied four of -their saddles at the first volley. Three of our boys were killed, -however, before we got the swag. I put my pistol to the head of -the wagon-driver, who was this very man McCarthy. I wish to the -Lord that I had shot him then, but I spared him, though I saw his -wicked little eyes fixed on my face, as though to remember every -feature. We got away with the gold, became wealthy men, and made -our way over to England without being suspected. There I parted -from my old pals and determined to settle down to a quiet and -respectable life. I bought this estate, which chanced to be in -the market, and I set myself to do a little good with my money, -to make up for the way in which I had earned it. I married, too, -and though my wife died young she left me my dear little Alice. -Even when she was just a baby her wee hand seemed to lead me down -the right path as nothing else had ever done. In a word, I turned -over a new leaf and did my best to make up for the past. All was -going well when McCarthy laid his grip upon me. - -"I had gone up to town about an investment, and I met him in -Regent Street with hardly a coat to his back or a boot to his -foot. - -"'Here we are, Jack,' says he, touching me on the arm; 'we'll be -as good as a family to you. There's two of us, me and my son, and -you can have the keeping of us. If you don't--it's a fine, -law-abiding country is England, and there's always a policeman -within hail.' - -"Well, down they came to the west country, there was no shaking -them off, and there they have lived rent free on my best land -ever since. There was no rest for me, no peace, no forgetfulness; -turn where I would, there was his cunning, grinning face at my -elbow. It grew worse as Alice grew up, for he soon saw I was more -afraid of her knowing my past than of the police. Whatever he -wanted he must have, and whatever it was I gave him without -question, land, money, houses, until at last he asked a thing -which I could not give. He asked for Alice. - -"His son, you see, had grown up, and so had my girl, and as I was -known to be in weak health, it seemed a fine stroke to him that -his lad should step into the whole property. But there I was -firm. I would not have his cursed stock mixed with mine; not that -I had any dislike to the lad, but his blood was in him, and that -was enough. I stood firm. McCarthy threatened. I braved him to do -his worst. We were to meet at the pool midway between our houses -to talk it over. - -"When I went down there I found him talking with his son, so I -smoked a cigar and waited behind a tree until he should be alone. -But as I listened to his talk all that was black and bitter in -me seemed to come uppermost. He was urging his son to marry my -daughter with as little regard for what she might think as if she -were a slut from off the streets. It drove me mad to think that I -and all that I held most dear should be in the power of such a -man as this. Could I not snap the bond? I was already a dying and -a desperate man. Though clear of mind and fairly strong of limb, -I knew that my own fate was sealed. But my memory and my girl! -Both could be saved if I could but silence that foul tongue. I -did it, Mr. Holmes. I would do it again. Deeply as I have sinned, -I have led a life of martyrdom to atone for it. But that my girl -should be entangled in the same meshes which held me was more -than I could suffer. I struck him down with no more compunction -than if he had been some foul and venomous beast. His cry brought -back his son; but I had gained the cover of the wood, though I -was forced to go back to fetch the cloak which I had dropped in -my flight. That is the true story, gentlemen, of all that -occurred." - -"Well, it is not for me to judge you," said Holmes as the old man -signed the statement which had been drawn out. "I pray that we -may never be exposed to such a temptation." - -"I pray not, sir. And what do you intend to do?" - -"In view of your health, nothing. You are yourself aware that you -will soon have to answer for your deed at a higher court than the -Assizes. I will keep your confession, and if McCarthy is -condemned I shall be forced to use it. If not, it shall never be -seen by mortal eye; and your secret, whether you be alive or -dead, shall be safe with us." - -"Farewell, then," said the old man solemnly. "Your own deathbeds, -when they come, will be the easier for the thought of the peace -which you have given to mine." Tottering and shaking in all his -giant frame, he stumbled slowly from the room. - -"God help us!" said Holmes after a long silence. "Why does fate -play such tricks with poor, helpless worms? I never hear of such -a case as this that I do not think of Baxter's words, and say, -'There, but for the grace of God, goes Sherlock Holmes.'" - -James McCarthy was acquitted at the Assizes on the strength of a -number of objections which had been drawn out by Holmes and -submitted to the defending counsel. Old Turner lived for seven -months after our interview, but he is now dead; and there is -every prospect that the son and daughter may come to live happily -together in ignorance of the black cloud which rests upon their -past. - - - -ADVENTURE V. THE FIVE ORANGE PIPS - -When I glance over my notes and records of the Sherlock Holmes -cases between the years '82 and '90, I am faced by so many which -present strange and interesting features that it is no easy -matter to know which to choose and which to leave. Some, however, -have already gained publicity through the papers, and others have -not offered a field for those peculiar qualities which my friend -possessed in so high a degree, and which it is the object of -these papers to illustrate. Some, too, have baffled his -analytical skill, and would be, as narratives, beginnings without -an ending, while others have been but partially cleared up, and -have their explanations founded rather upon conjecture and -surmise than on that absolute logical proof which was so dear to -him. There is, however, one of these last which was so remarkable -in its details and so startling in its results that I am tempted -to give some account of it in spite of the fact that there are -points in connection with it which never have been, and probably -never will be, entirely cleared up. - -The year '87 furnished us with a long series of cases of greater -or less interest, of which I retain the records. Among my -headings under this one twelve months I find an account of the -adventure of the Paradol Chamber, of the Amateur Mendicant -Society, who held a luxurious club in the lower vault of a -furniture warehouse, of the facts connected with the loss of the -British barque "Sophy Anderson", of the singular adventures of the -Grice Patersons in the island of Uffa, and finally of the -Camberwell poisoning case. In the latter, as may be remembered, -Sherlock Holmes was able, by winding up the dead man's watch, to -prove that it had been wound up two hours before, and that -therefore the deceased had gone to bed within that time--a -deduction which was of the greatest importance in clearing up the -case. All these I may sketch out at some future date, but none of -them present such singular features as the strange train of -circumstances which I have now taken up my pen to describe. - -It was in the latter days of September, and the equinoctial gales -had set in with exceptional violence. All day the wind had -screamed and the rain had beaten against the windows, so that -even here in the heart of great, hand-made London we were forced -to raise our minds for the instant from the routine of life and -to recognise the presence of those great elemental forces which -shriek at mankind through the bars of his civilisation, like -untamed beasts in a cage. As evening drew in, the storm grew -higher and louder, and the wind cried and sobbed like a child in -the chimney. Sherlock Holmes sat moodily at one side of the -fireplace cross-indexing his records of crime, while I at the -other was deep in one of Clark Russell's fine sea-stories until -the howl of the gale from without seemed to blend with the text, -and the splash of the rain to lengthen out into the long swash of -the sea waves. My wife was on a visit to her mother's, and for a -few days I was a dweller once more in my old quarters at Baker -Street. - -"Why," said I, glancing up at my companion, "that was surely the -bell. Who could come to-night? Some friend of yours, perhaps?" - -"Except yourself I have none," he answered. "I do not encourage -visitors." - -"A client, then?" - -"If so, it is a serious case. Nothing less would bring a man out -on such a day and at such an hour. But I take it that it is more -likely to be some crony of the landlady's." - -Sherlock Holmes was wrong in his conjecture, however, for there -came a step in the passage and a tapping at the door. He -stretched out his long arm to turn the lamp away from himself and -towards the vacant chair upon which a newcomer must sit. - -"Come in!" said he. - -The man who entered was young, some two-and-twenty at the -outside, well-groomed and trimly clad, with something of -refinement and delicacy in his bearing. The streaming umbrella -which he held in his hand, and his long shining waterproof told -of the fierce weather through which he had come. He looked about -him anxiously in the glare of the lamp, and I could see that his -face was pale and his eyes heavy, like those of a man who is -weighed down with some great anxiety. - -"I owe you an apology," he said, raising his golden pince-nez to -his eyes. "I trust that I am not intruding. I fear that I have -brought some traces of the storm and rain into your snug -chamber." - -"Give me your coat and umbrella," said Holmes. "They may rest -here on the hook and will be dry presently. You have come up from -the south-west, I see." - -"Yes, from Horsham." - -"That clay and chalk mixture which I see upon your toe caps is -quite distinctive." - -"I have come for advice." - -"That is easily got." - -"And help." - -"That is not always so easy." - -"I have heard of you, Mr. Holmes. I heard from Major Prendergast -how you saved him in the Tankerville Club scandal." - -"Ah, of course. He was wrongfully accused of cheating at cards." - -"He said that you could solve anything." - -"He said too much." - -"That you are never beaten." - -"I have been beaten four times--three times by men, and once by a -woman." - -"But what is that compared with the number of your successes?" - -"It is true that I have been generally successful." - -"Then you may be so with me." - -"I beg that you will draw your chair up to the fire and favour me -with some details as to your case." - -"It is no ordinary one." - -"None of those which come to me are. I am the last court of -appeal." - -"And yet I question, sir, whether, in all your experience, you -have ever listened to a more mysterious and inexplicable chain of -events than those which have happened in my own family." - -"You fill me with interest," said Holmes. "Pray give us the -essential facts from the commencement, and I can afterwards -question you as to those details which seem to me to be most -important." - -The young man pulled his chair up and pushed his wet feet out -towards the blaze. - -"My name," said he, "is John Openshaw, but my own affairs have, -as far as I can understand, little to do with this awful -business. It is a hereditary matter; so in order to give you an -idea of the facts, I must go back to the commencement of the -affair. - -"You must know that my grandfather had two sons--my uncle Elias -and my father Joseph. My father had a small factory at Coventry, -which he enlarged at the time of the invention of bicycling. He -was a patentee of the Openshaw unbreakable tire, and his business -met with such success that he was able to sell it and to retire -upon a handsome competence. - -"My uncle Elias emigrated to America when he was a young man and -became a planter in Florida, where he was reported to have done -very well. At the time of the war he fought in Jackson's army, -and afterwards under Hood, where he rose to be a colonel. When -Lee laid down his arms my uncle returned to his plantation, where -he remained for three or four years. About 1869 or 1870 he came -back to Europe and took a small estate in Sussex, near Horsham. -He had made a very considerable fortune in the States, and his -reason for leaving them was his aversion to the negroes, and his -dislike of the Republican policy in extending the franchise to -them. He was a singular man, fierce and quick-tempered, very -foul-mouthed when he was angry, and of a most retiring -disposition. During all the years that he lived at Horsham, I -doubt if ever he set foot in the town. He had a garden and two or -three fields round his house, and there he would take his -exercise, though very often for weeks on end he would never leave -his room. He drank a great deal of brandy and smoked very -heavily, but he would see no society and did not want any -friends, not even his own brother. - -"He didn't mind me; in fact, he took a fancy to me, for at the -time when he saw me first I was a youngster of twelve or so. This -would be in the year 1878, after he had been eight or nine years -in England. He begged my father to let me live with him and he -was very kind to me in his way. When he was sober he used to be -fond of playing backgammon and draughts with me, and he would -make me his representative both with the servants and with the -tradespeople, so that by the time that I was sixteen I was quite -master of the house. I kept all the keys and could go where I -liked and do what I liked, so long as I did not disturb him in -his privacy. There was one singular exception, however, for he -had a single room, a lumber-room up among the attics, which was -invariably locked, and which he would never permit either me or -anyone else to enter. With a boy's curiosity I have peeped -through the keyhole, but I was never able to see more than such a -collection of old trunks and bundles as would be expected in such -a room. - -"One day--it was in March, 1883--a letter with a foreign stamp -lay upon the table in front of the colonel's plate. It was not a -common thing for him to receive letters, for his bills were all -paid in ready money, and he had no friends of any sort. 'From -India!' said he as he took it up, 'Pondicherry postmark! What can -this be?' Opening it hurriedly, out there jumped five little -dried orange pips, which pattered down upon his plate. I began to -laugh at this, but the laugh was struck from my lips at the sight -of his face. His lip had fallen, his eyes were protruding, his -skin the colour of putty, and he glared at the envelope which he -still held in his trembling hand, 'K. K. K.!' he shrieked, and -then, 'My God, my God, my sins have overtaken me!' - -"'What is it, uncle?' I cried. - -"'Death,' said he, and rising from the table he retired to his -room, leaving me palpitating with horror. I took up the envelope -and saw scrawled in red ink upon the inner flap, just above the -gum, the letter K three times repeated. There was nothing else -save the five dried pips. What could be the reason of his -overpowering terror? I left the breakfast-table, and as I -ascended the stair I met him coming down with an old rusty key, -which must have belonged to the attic, in one hand, and a small -brass box, like a cashbox, in the other. - -"'They may do what they like, but I'll checkmate them still,' -said he with an oath. 'Tell Mary that I shall want a fire in my -room to-day, and send down to Fordham, the Horsham lawyer.' - -"I did as he ordered, and when the lawyer arrived I was asked to -step up to the room. The fire was burning brightly, and in the -grate there was a mass of black, fluffy ashes, as of burned -paper, while the brass box stood open and empty beside it. As I -glanced at the box I noticed, with a start, that upon the lid was -printed the treble K which I had read in the morning upon the -envelope. - -"'I wish you, John,' said my uncle, 'to witness my will. I leave -my estate, with all its advantages and all its disadvantages, to -my brother, your father, whence it will, no doubt, descend to -you. If you can enjoy it in peace, well and good! If you find you -cannot, take my advice, my boy, and leave it to your deadliest -enemy. I am sorry to give you such a two-edged thing, but I can't -say what turn things are going to take. Kindly sign the paper -where Mr. Fordham shows you.' - -"I signed the paper as directed, and the lawyer took it away with -him. The singular incident made, as you may think, the deepest -impression upon me, and I pondered over it and turned it every -way in my mind without being able to make anything of it. Yet I -could not shake off the vague feeling of dread which it left -behind, though the sensation grew less keen as the weeks passed -and nothing happened to disturb the usual routine of our lives. I -could see a change in my uncle, however. He drank more than ever, -and he was less inclined for any sort of society. Most of his -time he would spend in his room, with the door locked upon the -inside, but sometimes he would emerge in a sort of drunken frenzy -and would burst out of the house and tear about the garden with a -revolver in his hand, screaming out that he was afraid of no man, -and that he was not to be cooped up, like a sheep in a pen, by -man or devil. When these hot fits were over, however, he would -rush tumultuously in at the door and lock and bar it behind him, -like a man who can brazen it out no longer against the terror -which lies at the roots of his soul. At such times I have seen -his face, even on a cold day, glisten with moisture, as though it -were new raised from a basin. - -"Well, to come to an end of the matter, Mr. Holmes, and not to -abuse your patience, there came a night when he made one of those -drunken sallies from which he never came back. We found him, when -we went to search for him, face downward in a little -green-scummed pool, which lay at the foot of the garden. There -was no sign of any violence, and the water was but two feet deep, -so that the jury, having regard to his known eccentricity, -brought in a verdict of 'suicide.' But I, who knew how he winced -from the very thought of death, had much ado to persuade myself -that he had gone out of his way to meet it. The matter passed, -however, and my father entered into possession of the estate, and -of some 14,000 pounds, which lay to his credit at the bank." - -"One moment," Holmes interposed, "your statement is, I foresee, -one of the most remarkable to which I have ever listened. Let me -have the date of the reception by your uncle of the letter, and -the date of his supposed suicide." - -"The letter arrived on March 10, 1883. His death was seven weeks -later, upon the night of May 2nd." - -"Thank you. Pray proceed." - -"When my father took over the Horsham property, he, at my -request, made a careful examination of the attic, which had been -always locked up. We found the brass box there, although its -contents had been destroyed. On the inside of the cover was a -paper label, with the initials of K. K. K. repeated upon it, and -'Letters, memoranda, receipts, and a register' written beneath. -These, we presume, indicated the nature of the papers which had -been destroyed by Colonel Openshaw. For the rest, there was -nothing of much importance in the attic save a great many -scattered papers and note-books bearing upon my uncle's life in -America. Some of them were of the war time and showed that he had -done his duty well and had borne the repute of a brave soldier. -Others were of a date during the reconstruction of the Southern -states, and were mostly concerned with politics, for he had -evidently taken a strong part in opposing the carpet-bag -politicians who had been sent down from the North. - -"Well, it was the beginning of '84 when my father came to live at -Horsham, and all went as well as possible with us until the -January of '85. On the fourth day after the new year I heard my -father give a sharp cry of surprise as we sat together at the -breakfast-table. There he was, sitting with a newly opened -envelope in one hand and five dried orange pips in the -outstretched palm of the other one. He had always laughed at what -he called my cock-and-bull story about the colonel, but he looked -very scared and puzzled now that the same thing had come upon -himself. - -"'Why, what on earth does this mean, John?' he stammered. - -"My heart had turned to lead. 'It is K. K. K.,' said I. - -"He looked inside the envelope. 'So it is,' he cried. 'Here are -the very letters. But what is this written above them?' - -"'Put the papers on the sundial,' I read, peeping over his -shoulder. - -"'What papers? What sundial?' he asked. - -"'The sundial in the garden. There is no other,' said I; 'but the -papers must be those that are destroyed.' - -"'Pooh!' said he, gripping hard at his courage. 'We are in a -civilised land here, and we can't have tomfoolery of this kind. -Where does the thing come from?' - -"'From Dundee,' I answered, glancing at the postmark. - -"'Some preposterous practical joke,' said he. 'What have I to do -with sundials and papers? I shall take no notice of such -nonsense.' - -"'I should certainly speak to the police,' I said. - -"'And be laughed at for my pains. Nothing of the sort.' - -"'Then let me do so?' - -"'No, I forbid you. I won't have a fuss made about such -nonsense.' - -"It was in vain to argue with him, for he was a very obstinate -man. I went about, however, with a heart which was full of -forebodings. - -"On the third day after the coming of the letter my father went -from home to visit an old friend of his, Major Freebody, who is -in command of one of the forts upon Portsdown Hill. I was glad -that he should go, for it seemed to me that he was farther from -danger when he was away from home. In that, however, I was in -error. Upon the second day of his absence I received a telegram -from the major, imploring me to come at once. My father had -fallen over one of the deep chalk-pits which abound in the -neighbourhood, and was lying senseless, with a shattered skull. I -hurried to him, but he passed away without having ever recovered -his consciousness. He had, as it appears, been returning from -Fareham in the twilight, and as the country was unknown to him, -and the chalk-pit unfenced, the jury had no hesitation in -bringing in a verdict of 'death from accidental causes.' -Carefully as I examined every fact connected with his death, I -was unable to find anything which could suggest the idea of -murder. There were no signs of violence, no footmarks, no -robbery, no record of strangers having been seen upon the roads. -And yet I need not tell you that my mind was far from at ease, -and that I was well-nigh certain that some foul plot had been -woven round him. - -"In this sinister way I came into my inheritance. You will ask me -why I did not dispose of it? I answer, because I was well -convinced that our troubles were in some way dependent upon an -incident in my uncle's life, and that the danger would be as -pressing in one house as in another. - -"It was in January, '85, that my poor father met his end, and two -years and eight months have elapsed since then. During that time -I have lived happily at Horsham, and I had begun to hope that -this curse had passed away from the family, and that it had ended -with the last generation. I had begun to take comfort too soon, -however; yesterday morning the blow fell in the very shape in -which it had come upon my father." - -The young man took from his waistcoat a crumpled envelope, and -turning to the table he shook out upon it five little dried -orange pips. - -"This is the envelope," he continued. "The postmark is -London--eastern division. Within are the very words which were -upon my father's last message: 'K. K. K.'; and then 'Put the -papers on the sundial.'" - -"What have you done?" asked Holmes. - -"Nothing." - -"Nothing?" - -"To tell the truth"--he sank his face into his thin, white -hands--"I have felt helpless. I have felt like one of those poor -rabbits when the snake is writhing towards it. I seem to be in -the grasp of some resistless, inexorable evil, which no foresight -and no precautions can guard against." - -"Tut! tut!" cried Sherlock Holmes. "You must act, man, or you are -lost. Nothing but energy can save you. This is no time for -despair." - -"I have seen the police." - -"Ah!" - -"But they listened to my story with a smile. I am convinced that -the inspector has formed the opinion that the letters are all -practical jokes, and that the deaths of my relations were really -accidents, as the jury stated, and were not to be connected with -the warnings." - -Holmes shook his clenched hands in the air. "Incredible -imbecility!" he cried. - -"They have, however, allowed me a policeman, who may remain in -the house with me." - -"Has he come with you to-night?" - -"No. His orders were to stay in the house." - -Again Holmes raved in the air. - -"Why did you come to me," he cried, "and, above all, why did you -not come at once?" - -"I did not know. It was only to-day that I spoke to Major -Prendergast about my troubles and was advised by him to come to -you." - -"It is really two days since you had the letter. We should have -acted before this. You have no further evidence, I suppose, than -that which you have placed before us--no suggestive detail which -might help us?" - -"There is one thing," said John Openshaw. He rummaged in his coat -pocket, and, drawing out a piece of discoloured, blue-tinted -paper, he laid it out upon the table. "I have some remembrance," -said he, "that on the day when my uncle burned the papers I -observed that the small, unburned margins which lay amid the -ashes were of this particular colour. I found this single sheet -upon the floor of his room, and I am inclined to think that it -may be one of the papers which has, perhaps, fluttered out from -among the others, and in that way has escaped destruction. Beyond -the mention of pips, I do not see that it helps us much. I think -myself that it is a page from some private diary. The writing is -undoubtedly my uncle's." - -Holmes moved the lamp, and we both bent over the sheet of paper, -which showed by its ragged edge that it had indeed been torn from -a book. It was headed, "March, 1869," and beneath were the -following enigmatical notices: - -"4th. Hudson came. Same old platform. - -"7th. Set the pips on McCauley, Paramore, and - John Swain, of St. Augustine. - -"9th. McCauley cleared. - -"10th. John Swain cleared. - -"12th. Visited Paramore. All well." - -"Thank you!" said Holmes, folding up the paper and returning it -to our visitor. "And now you must on no account lose another -instant. We cannot spare time even to discuss what you have told -me. You must get home instantly and act." - -"What shall I do?" - -"There is but one thing to do. It must be done at once. You must -put this piece of paper which you have shown us into the brass -box which you have described. You must also put in a note to say -that all the other papers were burned by your uncle, and that -this is the only one which remains. You must assert that in such -words as will carry conviction with them. Having done this, you -must at once put the box out upon the sundial, as directed. Do -you understand?" - -"Entirely." - -"Do not think of revenge, or anything of the sort, at present. I -think that we may gain that by means of the law; but we have our -web to weave, while theirs is already woven. The first -consideration is to remove the pressing danger which threatens -you. The second is to clear up the mystery and to punish the -guilty parties." - -"I thank you," said the young man, rising and pulling on his -overcoat. "You have given me fresh life and hope. I shall -certainly do as you advise." - -"Do not lose an instant. And, above all, take care of yourself in -the meanwhile, for I do not think that there can be a doubt that -you are threatened by a very real and imminent danger. How do you -go back?" - -"By train from Waterloo." - -"It is not yet nine. The streets will be crowded, so I trust that -you may be in safety. And yet you cannot guard yourself too -closely." - -"I am armed." - -"That is well. To-morrow I shall set to work upon your case." - -"I shall see you at Horsham, then?" - -"No, your secret lies in London. It is there that I shall seek -it." - -"Then I shall call upon you in a day, or in two days, with news -as to the box and the papers. I shall take your advice in every -particular." He shook hands with us and took his leave. Outside -the wind still screamed and the rain splashed and pattered -against the windows. This strange, wild story seemed to have come -to us from amid the mad elements--blown in upon us like a sheet -of sea-weed in a gale--and now to have been reabsorbed by them -once more. - -Sherlock Holmes sat for some time in silence, with his head sunk -forward and his eyes bent upon the red glow of the fire. Then he -lit his pipe, and leaning back in his chair he watched the blue -smoke-rings as they chased each other up to the ceiling. - -"I think, Watson," he remarked at last, "that of all our cases we -have had none more fantastic than this." - -"Save, perhaps, the Sign of Four." - -"Well, yes. Save, perhaps, that. And yet this John Openshaw seems -to me to be walking amid even greater perils than did the -Sholtos." - -"But have you," I asked, "formed any definite conception as to -what these perils are?" - -"There can be no question as to their nature," he answered. - -"Then what are they? Who is this K. K. K., and why does he pursue -this unhappy family?" - -Sherlock Holmes closed his eyes and placed his elbows upon the -arms of his chair, with his finger-tips together. "The ideal -reasoner," he remarked, "would, when he had once been shown a -single fact in all its bearings, deduce from it not only all the -chain of events which led up to it but also all the results which -would follow from it. As Cuvier could correctly describe a whole -animal by the contemplation of a single bone, so the observer who -has thoroughly understood one link in a series of incidents -should be able to accurately state all the other ones, both -before and after. We have not yet grasped the results which the -reason alone can attain to. Problems may be solved in the study -which have baffled all those who have sought a solution by the -aid of their senses. To carry the art, however, to its highest -pitch, it is necessary that the reasoner should be able to -utilise all the facts which have come to his knowledge; and this -in itself implies, as you will readily see, a possession of all -knowledge, which, even in these days of free education and -encyclopaedias, is a somewhat rare accomplishment. It is not so -impossible, however, that a man should possess all knowledge -which is likely to be useful to him in his work, and this I have -endeavoured in my case to do. If I remember rightly, you on one -occasion, in the early days of our friendship, defined my limits -in a very precise fashion." - -"Yes," I answered, laughing. "It was a singular document. -Philosophy, astronomy, and politics were marked at zero, I -remember. Botany variable, geology profound as regards the -mud-stains from any region within fifty miles of town, chemistry -eccentric, anatomy unsystematic, sensational literature and crime -records unique, violin-player, boxer, swordsman, lawyer, and -self-poisoner by cocaine and tobacco. Those, I think, were the -main points of my analysis." - -Holmes grinned at the last item. "Well," he said, "I say now, as -I said then, that a man should keep his little brain-attic -stocked with all the furniture that he is likely to use, and the -rest he can put away in the lumber-room of his library, where he -can get it if he wants it. Now, for such a case as the one which -has been submitted to us to-night, we need certainly to muster -all our resources. Kindly hand me down the letter K of the -'American Encyclopaedia' which stands upon the shelf beside you. -Thank you. Now let us consider the situation and see what may be -deduced from it. In the first place, we may start with a strong -presumption that Colonel Openshaw had some very strong reason for -leaving America. Men at his time of life do not change all their -habits and exchange willingly the charming climate of Florida for -the lonely life of an English provincial town. His extreme love -of solitude in England suggests the idea that he was in fear of -someone or something, so we may assume as a working hypothesis -that it was fear of someone or something which drove him from -America. As to what it was he feared, we can only deduce that by -considering the formidable letters which were received by himself -and his successors. Did you remark the postmarks of those -letters?" - -"The first was from Pondicherry, the second from Dundee, and the -third from London." - -"From East London. What do you deduce from that?" - -"They are all seaports. That the writer was on board of a ship." - -"Excellent. We have already a clue. There can be no doubt that -the probability--the strong probability--is that the writer was -on board of a ship. And now let us consider another point. In the -case of Pondicherry, seven weeks elapsed between the threat and -its fulfilment, in Dundee it was only some three or four days. -Does that suggest anything?" - -"A greater distance to travel." - -"But the letter had also a greater distance to come." - -"Then I do not see the point." - -"There is at least a presumption that the vessel in which the man -or men are is a sailing-ship. It looks as if they always send -their singular warning or token before them when starting upon -their mission. You see how quickly the deed followed the sign -when it came from Dundee. If they had come from Pondicherry in a -steamer they would have arrived almost as soon as their letter. -But, as a matter of fact, seven weeks elapsed. I think that those -seven weeks represented the difference between the mail-boat which -brought the letter and the sailing vessel which brought the -writer." - -"It is possible." - -"More than that. It is probable. And now you see the deadly -urgency of this new case, and why I urged young Openshaw to -caution. The blow has always fallen at the end of the time which -it would take the senders to travel the distance. But this one -comes from London, and therefore we cannot count upon delay." - -"Good God!" I cried. "What can it mean, this relentless -persecution?" - -"The papers which Openshaw carried are obviously of vital -importance to the person or persons in the sailing-ship. I think -that it is quite clear that there must be more than one of them. -A single man could not have carried out two deaths in such a way -as to deceive a coroner's jury. There must have been several in -it, and they must have been men of resource and determination. -Their papers they mean to have, be the holder of them who it may. -In this way you see K. K. K. ceases to be the initials of an -individual and becomes the badge of a society." - -"But of what society?" - -"Have you never--" said Sherlock Holmes, bending forward and -sinking his voice--"have you never heard of the Ku Klux Klan?" - -"I never have." - -Holmes turned over the leaves of the book upon his knee. "Here it -is," said he presently: - -"'Ku Klux Klan. A name derived from the fanciful resemblance to -the sound produced by cocking a rifle. This terrible secret -society was formed by some ex-Confederate soldiers in the -Southern states after the Civil War, and it rapidly formed local -branches in different parts of the country, notably in Tennessee, -Louisiana, the Carolinas, Georgia, and Florida. Its power was -used for political purposes, principally for the terrorising of -the negro voters and the murdering and driving from the country -of those who were opposed to its views. Its outrages were usually -preceded by a warning sent to the marked man in some fantastic -but generally recognised shape--a sprig of oak-leaves in some -parts, melon seeds or orange pips in others. On receiving this -the victim might either openly abjure his former ways, or might -fly from the country. If he braved the matter out, death would -unfailingly come upon him, and usually in some strange and -unforeseen manner. So perfect was the organisation of the -society, and so systematic its methods, that there is hardly a -case upon record where any man succeeded in braving it with -impunity, or in which any of its outrages were traced home to the -perpetrators. For some years the organisation flourished in spite -of the efforts of the United States government and of the better -classes of the community in the South. Eventually, in the year -1869, the movement rather suddenly collapsed, although there have -been sporadic outbreaks of the same sort since that date.' - -"You will observe," said Holmes, laying down the volume, "that -the sudden breaking up of the society was coincident with the -disappearance of Openshaw from America with their papers. It may -well have been cause and effect. It is no wonder that he and his -family have some of the more implacable spirits upon their track. -You can understand that this register and diary may implicate -some of the first men in the South, and that there may be many -who will not sleep easy at night until it is recovered." - -"Then the page we have seen--" - -"Is such as we might expect. It ran, if I remember right, 'sent -the pips to A, B, and C'--that is, sent the society's warning to -them. Then there are successive entries that A and B cleared, or -left the country, and finally that C was visited, with, I fear, a -sinister result for C. Well, I think, Doctor, that we may let -some light into this dark place, and I believe that the only -chance young Openshaw has in the meantime is to do what I have -told him. There is nothing more to be said or to be done -to-night, so hand me over my violin and let us try to forget for -half an hour the miserable weather and the still more miserable -ways of our fellow-men." - - -It had cleared in the morning, and the sun was shining with a -subdued brightness through the dim veil which hangs over the -great city. Sherlock Holmes was already at breakfast when I came -down. - -"You will excuse me for not waiting for you," said he; "I have, I -foresee, a very busy day before me in looking into this case of -young Openshaw's." - -"What steps will you take?" I asked. - -"It will very much depend upon the results of my first inquiries. -I may have to go down to Horsham, after all." - -"You will not go there first?" - -"No, I shall commence with the City. Just ring the bell and the -maid will bring up your coffee." - -As I waited, I lifted the unopened newspaper from the table and -glanced my eye over it. It rested upon a heading which sent a -chill to my heart. - -"Holmes," I cried, "you are too late." - -"Ah!" said he, laying down his cup, "I feared as much. How was it -done?" He spoke calmly, but I could see that he was deeply moved. - -"My eye caught the name of Openshaw, and the heading 'Tragedy -Near Waterloo Bridge.' Here is the account: - -"Between nine and ten last night Police-Constable Cook, of the H -Division, on duty near Waterloo Bridge, heard a cry for help and -a splash in the water. The night, however, was extremely dark and -stormy, so that, in spite of the help of several passers-by, it -was quite impossible to effect a rescue. The alarm, however, was -given, and, by the aid of the water-police, the body was -eventually recovered. It proved to be that of a young gentleman -whose name, as it appears from an envelope which was found in his -pocket, was John Openshaw, and whose residence is near Horsham. -It is conjectured that he may have been hurrying down to catch -the last train from Waterloo Station, and that in his haste and -the extreme darkness he missed his path and walked over the edge -of one of the small landing-places for river steamboats. The body -exhibited no traces of violence, and there can be no doubt that -the deceased had been the victim of an unfortunate accident, -which should have the effect of calling the attention of the -authorities to the condition of the riverside landing-stages." - -We sat in silence for some minutes, Holmes more depressed and -shaken than I had ever seen him. - -"That hurts my pride, Watson," he said at last. "It is a petty -feeling, no doubt, but it hurts my pride. It becomes a personal -matter with me now, and, if God sends me health, I shall set my -hand upon this gang. That he should come to me for help, and that -I should send him away to his death--!" He sprang from his chair -and paced about the room in uncontrollable agitation, with a -flush upon his sallow cheeks and a nervous clasping and -unclasping of his long thin hands. - -"They must be cunning devils," he exclaimed at last. "How could -they have decoyed him down there? The Embankment is not on the -direct line to the station. The bridge, no doubt, was too -crowded, even on such a night, for their purpose. Well, Watson, -we shall see who will win in the long run. I am going out now!" - -"To the police?" - -"No; I shall be my own police. When I have spun the web they may -take the flies, but not before." - -All day I was engaged in my professional work, and it was late in -the evening before I returned to Baker Street. Sherlock Holmes -had not come back yet. It was nearly ten o'clock before he -entered, looking pale and worn. He walked up to the sideboard, -and tearing a piece from the loaf he devoured it voraciously, -washing it down with a long draught of water. - -"You are hungry," I remarked. - -"Starving. It had escaped my memory. I have had nothing since -breakfast." - -"Nothing?" - -"Not a bite. I had no time to think of it." - -"And how have you succeeded?" - -"Well." - -"You have a clue?" - -"I have them in the hollow of my hand. Young Openshaw shall not -long remain unavenged. Why, Watson, let us put their own devilish -trade-mark upon them. It is well thought of!" - -"What do you mean?" - -He took an orange from the cupboard, and tearing it to pieces he -squeezed out the pips upon the table. Of these he took five and -thrust them into an envelope. On the inside of the flap he wrote -"S. H. for J. O." Then he sealed it and addressed it to "Captain -James Calhoun, Barque 'Lone Star,' Savannah, Georgia." - -"That will await him when he enters port," said he, chuckling. -"It may give him a sleepless night. He will find it as sure a -precursor of his fate as Openshaw did before him." - -"And who is this Captain Calhoun?" - -"The leader of the gang. I shall have the others, but he first." - -"How did you trace it, then?" - -He took a large sheet of paper from his pocket, all covered with -dates and names. - -"I have spent the whole day," said he, "over Lloyd's registers -and files of the old papers, following the future career of every -vessel which touched at Pondicherry in January and February in -'83. There were thirty-six ships of fair tonnage which were -reported there during those months. Of these, one, the 'Lone Star,' -instantly attracted my attention, since, although it was reported -as having cleared from London, the name is that which is given to -one of the states of the Union." - -"Texas, I think." - -"I was not and am not sure which; but I knew that the ship must -have an American origin." - -"What then?" - -"I searched the Dundee records, and when I found that the barque -'Lone Star' was there in January, '85, my suspicion became a -certainty. I then inquired as to the vessels which lay at present -in the port of London." - -"Yes?" - -"The 'Lone Star' had arrived here last week. I went down to the -Albert Dock and found that she had been taken down the river by -the early tide this morning, homeward bound to Savannah. I wired -to Gravesend and learned that she had passed some time ago, and -as the wind is easterly I have no doubt that she is now past the -Goodwins and not very far from the Isle of Wight." - -"What will you do, then?" - -"Oh, I have my hand upon him. He and the two mates, are as I -learn, the only native-born Americans in the ship. The others are -Finns and Germans. I know, also, that they were all three away -from the ship last night. I had it from the stevedore who has -been loading their cargo. By the time that their sailing-ship -reaches Savannah the mail-boat will have carried this letter, and -the cable will have informed the police of Savannah that these -three gentlemen are badly wanted here upon a charge of murder." - -There is ever a flaw, however, in the best laid of human plans, -and the murderers of John Openshaw were never to receive the -orange pips which would show them that another, as cunning and as -resolute as themselves, was upon their track. Very long and very -severe were the equinoctial gales that year. We waited long for -news of the "Lone Star" of Savannah, but none ever reached us. We -did at last hear that somewhere far out in the Atlantic a -shattered stern-post of a boat was seen swinging in the trough -of a wave, with the letters "L. S." carved upon it, and that is -all which we shall ever know of the fate of the "Lone Star." - - - -ADVENTURE VI. THE MAN WITH THE TWISTED LIP - -Isa Whitney, brother of the late Elias Whitney, D.D., Principal -of the Theological College of St. George's, was much addicted to -opium. The habit grew upon him, as I understand, from some -foolish freak when he was at college; for having read De -Quincey's description of his dreams and sensations, he had -drenched his tobacco with laudanum in an attempt to produce the -same effects. He found, as so many more have done, that the -practice is easier to attain than to get rid of, and for many -years he continued to be a slave to the drug, an object of -mingled horror and pity to his friends and relatives. I can see -him now, with yellow, pasty face, drooping lids, and pin-point -pupils, all huddled in a chair, the wreck and ruin of a noble -man. - -One night--it was in June, '89--there came a ring to my bell, -about the hour when a man gives his first yawn and glances at the -clock. I sat up in my chair, and my wife laid her needle-work -down in her lap and made a little face of disappointment. - -"A patient!" said she. "You'll have to go out." - -I groaned, for I was newly come back from a weary day. - -We heard the door open, a few hurried words, and then quick steps -upon the linoleum. Our own door flew open, and a lady, clad in -some dark-coloured stuff, with a black veil, entered the room. - -"You will excuse my calling so late," she began, and then, -suddenly losing her self-control, she ran forward, threw her arms -about my wife's neck, and sobbed upon her shoulder. "Oh, I'm in -such trouble!" she cried; "I do so want a little help." - -"Why," said my wife, pulling up her veil, "it is Kate Whitney. -How you startled me, Kate! I had not an idea who you were when -you came in." - -"I didn't know what to do, so I came straight to you." That was -always the way. Folk who were in grief came to my wife like birds -to a light-house. - -"It was very sweet of you to come. Now, you must have some wine -and water, and sit here comfortably and tell us all about it. Or -should you rather that I sent James off to bed?" - -"Oh, no, no! I want the doctor's advice and help, too. It's about -Isa. He has not been home for two days. I am so frightened about -him!" - -It was not the first time that she had spoken to us of her -husband's trouble, to me as a doctor, to my wife as an old friend -and school companion. We soothed and comforted her by such words -as we could find. Did she know where her husband was? Was it -possible that we could bring him back to her? - -It seems that it was. She had the surest information that of late -he had, when the fit was on him, made use of an opium den in the -farthest east of the City. Hitherto his orgies had always been -confined to one day, and he had come back, twitching and -shattered, in the evening. But now the spell had been upon him -eight-and-forty hours, and he lay there, doubtless among the -dregs of the docks, breathing in the poison or sleeping off the -effects. There he was to be found, she was sure of it, at the Bar -of Gold, in Upper Swandam Lane. But what was she to do? How could -she, a young and timid woman, make her way into such a place and -pluck her husband out from among the ruffians who surrounded him? - -There was the case, and of course there was but one way out of -it. Might I not escort her to this place? And then, as a second -thought, why should she come at all? I was Isa Whitney's medical -adviser, and as such I had influence over him. I could manage it -better if I were alone. I promised her on my word that I would -send him home in a cab within two hours if he were indeed at the -address which she had given me. And so in ten minutes I had left -my armchair and cheery sitting-room behind me, and was speeding -eastward in a hansom on a strange errand, as it seemed to me at -the time, though the future only could show how strange it was to -be. - -But there was no great difficulty in the first stage of my -adventure. Upper Swandam Lane is a vile alley lurking behind the -high wharves which line the north side of the river to the east -of London Bridge. Between a slop-shop and a gin-shop, approached -by a steep flight of steps leading down to a black gap like the -mouth of a cave, I found the den of which I was in search. -Ordering my cab to wait, I passed down the steps, worn hollow in -the centre by the ceaseless tread of drunken feet; and by the -light of a flickering oil-lamp above the door I found the latch -and made my way into a long, low room, thick and heavy with the -brown opium smoke, and terraced with wooden berths, like the -forecastle of an emigrant ship. - -Through the gloom one could dimly catch a glimpse of bodies lying -in strange fantastic poses, bowed shoulders, bent knees, heads -thrown back, and chins pointing upward, with here and there a -dark, lack-lustre eye turned upon the newcomer. Out of the black -shadows there glimmered little red circles of light, now bright, -now faint, as the burning poison waxed or waned in the bowls of -the metal pipes. The most lay silent, but some muttered to -themselves, and others talked together in a strange, low, -monotonous voice, their conversation coming in gushes, and then -suddenly tailing off into silence, each mumbling out his own -thoughts and paying little heed to the words of his neighbour. At -the farther end was a small brazier of burning charcoal, beside -which on a three-legged wooden stool there sat a tall, thin old -man, with his jaw resting upon his two fists, and his elbows upon -his knees, staring into the fire. - -As I entered, a sallow Malay attendant had hurried up with a pipe -for me and a supply of the drug, beckoning me to an empty berth. - -"Thank you. I have not come to stay," said I. "There is a friend -of mine here, Mr. Isa Whitney, and I wish to speak with him." - -There was a movement and an exclamation from my right, and -peering through the gloom, I saw Whitney, pale, haggard, and -unkempt, staring out at me. - -"My God! It's Watson," said he. He was in a pitiable state of -reaction, with every nerve in a twitter. "I say, Watson, what -o'clock is it?" - -"Nearly eleven." - -"Of what day?" - -"Of Friday, June 19th." - -"Good heavens! I thought it was Wednesday. It is Wednesday. What -d'you want to frighten a chap for?" He sank his face onto his -arms and began to sob in a high treble key. - -"I tell you that it is Friday, man. Your wife has been waiting -this two days for you. You should be ashamed of yourself!" - -"So I am. But you've got mixed, Watson, for I have only been here -a few hours, three pipes, four pipes--I forget how many. But I'll -go home with you. I wouldn't frighten Kate--poor little Kate. -Give me your hand! Have you a cab?" - -"Yes, I have one waiting." - -"Then I shall go in it. But I must owe something. Find what I -owe, Watson. I am all off colour. I can do nothing for myself." - -I walked down the narrow passage between the double row of -sleepers, holding my breath to keep out the vile, stupefying -fumes of the drug, and looking about for the manager. As I passed -the tall man who sat by the brazier I felt a sudden pluck at my -skirt, and a low voice whispered, "Walk past me, and then look -back at me." The words fell quite distinctly upon my ear. I -glanced down. They could only have come from the old man at my -side, and yet he sat now as absorbed as ever, very thin, very -wrinkled, bent with age, an opium pipe dangling down from between -his knees, as though it had dropped in sheer lassitude from his -fingers. I took two steps forward and looked back. It took all my -self-control to prevent me from breaking out into a cry of -astonishment. He had turned his back so that none could see him -but I. His form had filled out, his wrinkles were gone, the dull -eyes had regained their fire, and there, sitting by the fire and -grinning at my surprise, was none other than Sherlock Holmes. He -made a slight motion to me to approach him, and instantly, as he -turned his face half round to the company once more, subsided -into a doddering, loose-lipped senility. - -"Holmes!" I whispered, "what on earth are you doing in this den?" - -"As low as you can," he answered; "I have excellent ears. If you -would have the great kindness to get rid of that sottish friend -of yours I should be exceedingly glad to have a little talk with -you." - -"I have a cab outside." - -"Then pray send him home in it. You may safely trust him, for he -appears to be too limp to get into any mischief. I should -recommend you also to send a note by the cabman to your wife to -say that you have thrown in your lot with me. If you will wait -outside, I shall be with you in five minutes." - -It was difficult to refuse any of Sherlock Holmes' requests, for -they were always so exceedingly definite, and put forward with -such a quiet air of mastery. I felt, however, that when Whitney -was once confined in the cab my mission was practically -accomplished; and for the rest, I could not wish anything better -than to be associated with my friend in one of those singular -adventures which were the normal condition of his existence. In a -few minutes I had written my note, paid Whitney's bill, led him -out to the cab, and seen him driven through the darkness. In a -very short time a decrepit figure had emerged from the opium den, -and I was walking down the street with Sherlock Holmes. For two -streets he shuffled along with a bent back and an uncertain foot. -Then, glancing quickly round, he straightened himself out and -burst into a hearty fit of laughter. - -"I suppose, Watson," said he, "that you imagine that I have added -opium-smoking to cocaine injections, and all the other little -weaknesses on which you have favoured me with your medical -views." - -"I was certainly surprised to find you there." - -"But not more so than I to find you." - -"I came to find a friend." - -"And I to find an enemy." - -"An enemy?" - -"Yes; one of my natural enemies, or, shall I say, my natural -prey. Briefly, Watson, I am in the midst of a very remarkable -inquiry, and I have hoped to find a clue in the incoherent -ramblings of these sots, as I have done before now. Had I been -recognised in that den my life would not have been worth an -hour's purchase; for I have used it before now for my own -purposes, and the rascally Lascar who runs it has sworn to have -vengeance upon me. There is a trap-door at the back of that -building, near the corner of Paul's Wharf, which could tell some -strange tales of what has passed through it upon the moonless -nights." - -"What! You do not mean bodies?" - -"Ay, bodies, Watson. We should be rich men if we had 1000 pounds -for every poor devil who has been done to death in that den. It -is the vilest murder-trap on the whole riverside, and I fear that -Neville St. Clair has entered it never to leave it more. But our -trap should be here." He put his two forefingers between his -teeth and whistled shrilly--a signal which was answered by a -similar whistle from the distance, followed shortly by the rattle -of wheels and the clink of horses' hoofs. - -"Now, Watson," said Holmes, as a tall dog-cart dashed up through -the gloom, throwing out two golden tunnels of yellow light from -its side lanterns. "You'll come with me, won't you?" - -"If I can be of use." - -"Oh, a trusty comrade is always of use; and a chronicler still -more so. My room at The Cedars is a double-bedded one." - -"The Cedars?" - -"Yes; that is Mr. St. Clair's house. I am staying there while I -conduct the inquiry." - -"Where is it, then?" - -"Near Lee, in Kent. We have a seven-mile drive before us." - -"But I am all in the dark." - -"Of course you are. You'll know all about it presently. Jump up -here. All right, John; we shall not need you. Here's half a -crown. Look out for me to-morrow, about eleven. Give her her -head. So long, then!" - -He flicked the horse with his whip, and we dashed away through -the endless succession of sombre and deserted streets, which -widened gradually, until we were flying across a broad -balustraded bridge, with the murky river flowing sluggishly -beneath us. Beyond lay another dull wilderness of bricks and -mortar, its silence broken only by the heavy, regular footfall of -the policeman, or the songs and shouts of some belated party of -revellers. A dull wrack was drifting slowly across the sky, and a -star or two twinkled dimly here and there through the rifts of -the clouds. Holmes drove in silence, with his head sunk upon his -breast, and the air of a man who is lost in thought, while I sat -beside him, curious to learn what this new quest might be which -seemed to tax his powers so sorely, and yet afraid to break in -upon the current of his thoughts. We had driven several miles, -and were beginning to get to the fringe of the belt of suburban -villas, when he shook himself, shrugged his shoulders, and lit up -his pipe with the air of a man who has satisfied himself that he -is acting for the best. - -"You have a grand gift of silence, Watson," said he. "It makes -you quite invaluable as a companion. 'Pon my word, it is a great -thing for me to have someone to talk to, for my own thoughts are -not over-pleasant. I was wondering what I should say to this dear -little woman to-night when she meets me at the door." - -"You forget that I know nothing about it." - -"I shall just have time to tell you the facts of the case before -we get to Lee. It seems absurdly simple, and yet, somehow I can -get nothing to go upon. There's plenty of thread, no doubt, but I -can't get the end of it into my hand. Now, I'll state the case -clearly and concisely to you, Watson, and maybe you can see a -spark where all is dark to me." - -"Proceed, then." - -"Some years ago--to be definite, in May, 1884--there came to Lee -a gentleman, Neville St. Clair by name, who appeared to have -plenty of money. He took a large villa, laid out the grounds very -nicely, and lived generally in good style. By degrees he made -friends in the neighbourhood, and in 1887 he married the daughter -of a local brewer, by whom he now has two children. He had no -occupation, but was interested in several companies and went into -town as a rule in the morning, returning by the 5:14 from Cannon -Street every night. Mr. St. Clair is now thirty-seven years of -age, is a man of temperate habits, a good husband, a very -affectionate father, and a man who is popular with all who know -him. I may add that his whole debts at the present moment, as far -as we have been able to ascertain, amount to 88 pounds 10s., while -he has 220 pounds standing to his credit in the Capital and -Counties Bank. There is no reason, therefore, to think that money -troubles have been weighing upon his mind. - -"Last Monday Mr. Neville St. Clair went into town rather earlier -than usual, remarking before he started that he had two important -commissions to perform, and that he would bring his little boy -home a box of bricks. Now, by the merest chance, his wife -received a telegram upon this same Monday, very shortly after his -departure, to the effect that a small parcel of considerable -value which she had been expecting was waiting for her at the -offices of the Aberdeen Shipping Company. Now, if you are well up -in your London, you will know that the office of the company is -in Fresno Street, which branches out of Upper Swandam Lane, where -you found me to-night. Mrs. St. Clair had her lunch, started for -the City, did some shopping, proceeded to the company's office, -got her packet, and found herself at exactly 4:35 walking through -Swandam Lane on her way back to the station. Have you followed me -so far?" - -"It is very clear." - -"If you remember, Monday was an exceedingly hot day, and Mrs. St. -Clair walked slowly, glancing about in the hope of seeing a cab, -as she did not like the neighbourhood in which she found herself. -While she was walking in this way down Swandam Lane, she suddenly -heard an ejaculation or cry, and was struck cold to see her -husband looking down at her and, as it seemed to her, beckoning -to her from a second-floor window. The window was open, and she -distinctly saw his face, which she describes as being terribly -agitated. He waved his hands frantically to her, and then -vanished from the window so suddenly that it seemed to her that -he had been plucked back by some irresistible force from behind. -One singular point which struck her quick feminine eye was that -although he wore some dark coat, such as he had started to town -in, he had on neither collar nor necktie. - -"Convinced that something was amiss with him, she rushed down the -steps--for the house was none other than the opium den in which -you found me to-night--and running through the front room she -attempted to ascend the stairs which led to the first floor. At -the foot of the stairs, however, she met this Lascar scoundrel of -whom I have spoken, who thrust her back and, aided by a Dane, who -acts as assistant there, pushed her out into the street. Filled -with the most maddening doubts and fears, she rushed down the -lane and, by rare good-fortune, met in Fresno Street a number of -constables with an inspector, all on their way to their beat. The -inspector and two men accompanied her back, and in spite of the -continued resistance of the proprietor, they made their way to -the room in which Mr. St. Clair had last been seen. There was no -sign of him there. In fact, in the whole of that floor there was -no one to be found save a crippled wretch of hideous aspect, who, -it seems, made his home there. Both he and the Lascar stoutly -swore that no one else had been in the front room during the -afternoon. So determined was their denial that the inspector was -staggered, and had almost come to believe that Mrs. St. Clair had -been deluded when, with a cry, she sprang at a small deal box -which lay upon the table and tore the lid from it. Out there fell -a cascade of children's bricks. It was the toy which he had -promised to bring home. - -"This discovery, and the evident confusion which the cripple -showed, made the inspector realise that the matter was serious. -The rooms were carefully examined, and results all pointed to an -abominable crime. The front room was plainly furnished as a -sitting-room and led into a small bedroom, which looked out upon -the back of one of the wharves. Between the wharf and the bedroom -window is a narrow strip, which is dry at low tide but is covered -at high tide with at least four and a half feet of water. The -bedroom window was a broad one and opened from below. On -examination traces of blood were to be seen upon the windowsill, -and several scattered drops were visible upon the wooden floor of -the bedroom. Thrust away behind a curtain in the front room were -all the clothes of Mr. Neville St. Clair, with the exception of -his coat. His boots, his socks, his hat, and his watch--all were -there. There were no signs of violence upon any of these -garments, and there were no other traces of Mr. Neville St. -Clair. Out of the window he must apparently have gone for no -other exit could be discovered, and the ominous bloodstains upon -the sill gave little promise that he could save himself by -swimming, for the tide was at its very highest at the moment of -the tragedy. - -"And now as to the villains who seemed to be immediately -implicated in the matter. The Lascar was known to be a man of the -vilest antecedents, but as, by Mrs. St. Clair's story, he was -known to have been at the foot of the stair within a very few -seconds of her husband's appearance at the window, he could -hardly have been more than an accessory to the crime. His defence -was one of absolute ignorance, and he protested that he had no -knowledge as to the doings of Hugh Boone, his lodger, and that he -could not account in any way for the presence of the missing -gentleman's clothes. - -"So much for the Lascar manager. Now for the sinister cripple who -lives upon the second floor of the opium den, and who was -certainly the last human being whose eyes rested upon Neville St. -Clair. His name is Hugh Boone, and his hideous face is one which -is familiar to every man who goes much to the City. He is a -professional beggar, though in order to avoid the police -regulations he pretends to a small trade in wax vestas. Some -little distance down Threadneedle Street, upon the left-hand -side, there is, as you may have remarked, a small angle in the -wall. Here it is that this creature takes his daily seat, -cross-legged with his tiny stock of matches on his lap, and as he -is a piteous spectacle a small rain of charity descends into the -greasy leather cap which lies upon the pavement beside him. I -have watched the fellow more than once before ever I thought of -making his professional acquaintance, and I have been surprised -at the harvest which he has reaped in a short time. His -appearance, you see, is so remarkable that no one can pass him -without observing him. A shock of orange hair, a pale face -disfigured by a horrible scar, which, by its contraction, has -turned up the outer edge of his upper lip, a bulldog chin, and a -pair of very penetrating dark eyes, which present a singular -contrast to the colour of his hair, all mark him out from amid -the common crowd of mendicants and so, too, does his wit, for he -is ever ready with a reply to any piece of chaff which may be -thrown at him by the passers-by. This is the man whom we now -learn to have been the lodger at the opium den, and to have been -the last man to see the gentleman of whom we are in quest." - -"But a cripple!" said I. "What could he have done single-handed -against a man in the prime of life?" - -"He is a cripple in the sense that he walks with a limp; but in -other respects he appears to be a powerful and well-nurtured man. -Surely your medical experience would tell you, Watson, that -weakness in one limb is often compensated for by exceptional -strength in the others." - -"Pray continue your narrative." - -"Mrs. St. Clair had fainted at the sight of the blood upon the -window, and she was escorted home in a cab by the police, as her -presence could be of no help to them in their investigations. -Inspector Barton, who had charge of the case, made a very careful -examination of the premises, but without finding anything which -threw any light upon the matter. One mistake had been made in not -arresting Boone instantly, as he was allowed some few minutes -during which he might have communicated with his friend the -Lascar, but this fault was soon remedied, and he was seized and -searched, without anything being found which could incriminate -him. There were, it is true, some blood-stains upon his right -shirt-sleeve, but he pointed to his ring-finger, which had been -cut near the nail, and explained that the bleeding came from -there, adding that he had been to the window not long before, and -that the stains which had been observed there came doubtless from -the same source. He denied strenuously having ever seen Mr. -Neville St. Clair and swore that the presence of the clothes in -his room was as much a mystery to him as to the police. As to -Mrs. St. Clair's assertion that she had actually seen her husband -at the window, he declared that she must have been either mad or -dreaming. He was removed, loudly protesting, to the -police-station, while the inspector remained upon the premises in -the hope that the ebbing tide might afford some fresh clue. - -"And it did, though they hardly found upon the mud-bank what they -had feared to find. It was Neville St. Clair's coat, and not -Neville St. Clair, which lay uncovered as the tide receded. And -what do you think they found in the pockets?" - -"I cannot imagine." - -"No, I don't think you would guess. Every pocket stuffed with -pennies and half-pennies--421 pennies and 270 half-pennies. It -was no wonder that it had not been swept away by the tide. But a -human body is a different matter. There is a fierce eddy between -the wharf and the house. It seemed likely enough that the -weighted coat had remained when the stripped body had been sucked -away into the river." - -"But I understand that all the other clothes were found in the -room. Would the body be dressed in a coat alone?" - -"No, sir, but the facts might be met speciously enough. Suppose -that this man Boone had thrust Neville St. Clair through the -window, there is no human eye which could have seen the deed. -What would he do then? It would of course instantly strike him -that he must get rid of the tell-tale garments. He would seize -the coat, then, and be in the act of throwing it out, when it -would occur to him that it would swim and not sink. He has little -time, for he has heard the scuffle downstairs when the wife tried -to force her way up, and perhaps he has already heard from his -Lascar confederate that the police are hurrying up the street. -There is not an instant to be lost. He rushes to some secret -hoard, where he has accumulated the fruits of his beggary, and he -stuffs all the coins upon which he can lay his hands into the -pockets to make sure of the coat's sinking. He throws it out, and -would have done the same with the other garments had not he heard -the rush of steps below, and only just had time to close the -window when the police appeared." - -"It certainly sounds feasible." - -"Well, we will take it as a working hypothesis for want of a -better. Boone, as I have told you, was arrested and taken to the -station, but it could not be shown that there had ever before -been anything against him. He had for years been known as a -professional beggar, but his life appeared to have been a very -quiet and innocent one. There the matter stands at present, and -the questions which have to be solved--what Neville St. Clair was -doing in the opium den, what happened to him when there, where is -he now, and what Hugh Boone had to do with his disappearance--are -all as far from a solution as ever. I confess that I cannot -recall any case within my experience which looked at the first -glance so simple and yet which presented such difficulties." - -While Sherlock Holmes had been detailing this singular series of -events, we had been whirling through the outskirts of the great -town until the last straggling houses had been left behind, and -we rattled along with a country hedge upon either side of us. -Just as he finished, however, we drove through two scattered -villages, where a few lights still glimmered in the windows. - -"We are on the outskirts of Lee," said my companion. "We have -touched on three English counties in our short drive, starting in -Middlesex, passing over an angle of Surrey, and ending in Kent. -See that light among the trees? That is The Cedars, and beside -that lamp sits a woman whose anxious ears have already, I have -little doubt, caught the clink of our horse's feet." - -"But why are you not conducting the case from Baker Street?" I -asked. - -"Because there are many inquiries which must be made out here. -Mrs. St. Clair has most kindly put two rooms at my disposal, and -you may rest assured that she will have nothing but a welcome for -my friend and colleague. I hate to meet her, Watson, when I have -no news of her husband. Here we are. Whoa, there, whoa!" - -We had pulled up in front of a large villa which stood within its -own grounds. A stable-boy had run out to the horse's head, and -springing down, I followed Holmes up the small, winding -gravel-drive which led to the house. As we approached, the door -flew open, and a little blonde woman stood in the opening, clad -in some sort of light mousseline de soie, with a touch of fluffy -pink chiffon at her neck and wrists. She stood with her figure -outlined against the flood of light, one hand upon the door, one -half-raised in her eagerness, her body slightly bent, her head -and face protruded, with eager eyes and parted lips, a standing -question. - -"Well?" she cried, "well?" And then, seeing that there were two -of us, she gave a cry of hope which sank into a groan as she saw -that my companion shook his head and shrugged his shoulders. - -"No good news?" - -"None." - -"No bad?" - -"No." - -"Thank God for that. But come in. You must be weary, for you have -had a long day." - -"This is my friend, Dr. Watson. He has been of most vital use to -me in several of my cases, and a lucky chance has made it -possible for me to bring him out and associate him with this -investigation." - -"I am delighted to see you," said she, pressing my hand warmly. -"You will, I am sure, forgive anything that may be wanting in our -arrangements, when you consider the blow which has come so -suddenly upon us." - -"My dear madam," said I, "I am an old campaigner, and if I were -not I can very well see that no apology is needed. If I can be of -any assistance, either to you or to my friend here, I shall be -indeed happy." - -"Now, Mr. Sherlock Holmes," said the lady as we entered a -well-lit dining-room, upon the table of which a cold supper had -been laid out, "I should very much like to ask you one or two -plain questions, to which I beg that you will give a plain -answer." - -"Certainly, madam." - -"Do not trouble about my feelings. I am not hysterical, nor given -to fainting. I simply wish to hear your real, real opinion." - -"Upon what point?" - -"In your heart of hearts, do you think that Neville is alive?" - -Sherlock Holmes seemed to be embarrassed by the question. -"Frankly, now!" she repeated, standing upon the rug and looking -keenly down at him as he leaned back in a basket-chair. - -"Frankly, then, madam, I do not." - -"You think that he is dead?" - -"I do." - -"Murdered?" - -"I don't say that. Perhaps." - -"And on what day did he meet his death?" - -"On Monday." - -"Then perhaps, Mr. Holmes, you will be good enough to explain how -it is that I have received a letter from him to-day." - -Sherlock Holmes sprang out of his chair as if he had been -galvanised. - -"What!" he roared. - -"Yes, to-day." She stood smiling, holding up a little slip of -paper in the air. - -"May I see it?" - -"Certainly." - -He snatched it from her in his eagerness, and smoothing it out -upon the table he drew over the lamp and examined it intently. I -had left my chair and was gazing at it over his shoulder. The -envelope was a very coarse one and was stamped with the Gravesend -postmark and with the date of that very day, or rather of the day -before, for it was considerably after midnight. - -"Coarse writing," murmured Holmes. "Surely this is not your -husband's writing, madam." - -"No, but the enclosure is." - -"I perceive also that whoever addressed the envelope had to go -and inquire as to the address." - -"How can you tell that?" - -"The name, you see, is in perfectly black ink, which has dried -itself. The rest is of the greyish colour, which shows that -blotting-paper has been used. If it had been written straight -off, and then blotted, none would be of a deep black shade. This -man has written the name, and there has then been a pause before -he wrote the address, which can only mean that he was not -familiar with it. It is, of course, a trifle, but there is -nothing so important as trifles. Let us now see the letter. Ha! -there has been an enclosure here!" - -"Yes, there was a ring. His signet-ring." - -"And you are sure that this is your husband's hand?" - -"One of his hands." - -"One?" - -"His hand when he wrote hurriedly. It is very unlike his usual -writing, and yet I know it well." - -"'Dearest do not be frightened. All will come well. There is a -huge error which it may take some little time to rectify. -Wait in patience.--NEVILLE.' Written in pencil upon the fly-leaf -of a book, octavo size, no water-mark. Hum! Posted to-day in -Gravesend by a man with a dirty thumb. Ha! And the flap has been -gummed, if I am not very much in error, by a person who had been -chewing tobacco. And you have no doubt that it is your husband's -hand, madam?" - -"None. Neville wrote those words." - -"And they were posted to-day at Gravesend. Well, Mrs. St. Clair, -the clouds lighten, though I should not venture to say that the -danger is over." - -"But he must be alive, Mr. Holmes." - -"Unless this is a clever forgery to put us on the wrong scent. -The ring, after all, proves nothing. It may have been taken from -him." - -"No, no; it is, it is his very own writing!" - -"Very well. It may, however, have been written on Monday and only -posted to-day." - -"That is possible." - -"If so, much may have happened between." - -"Oh, you must not discourage me, Mr. Holmes. I know that all is -well with him. There is so keen a sympathy between us that I -should know if evil came upon him. On the very day that I saw him -last he cut himself in the bedroom, and yet I in the dining-room -rushed upstairs instantly with the utmost certainty that -something had happened. Do you think that I would respond to such -a trifle and yet be ignorant of his death?" - -"I have seen too much not to know that the impression of a woman -may be more valuable than the conclusion of an analytical -reasoner. And in this letter you certainly have a very strong -piece of evidence to corroborate your view. But if your husband -is alive and able to write letters, why should he remain away -from you?" - -"I cannot imagine. It is unthinkable." - -"And on Monday he made no remarks before leaving you?" - -"No." - -"And you were surprised to see him in Swandam Lane?" - -"Very much so." - -"Was the window open?" - -"Yes." - -"Then he might have called to you?" - -"He might." - -"He only, as I understand, gave an inarticulate cry?" - -"Yes." - -"A call for help, you thought?" - -"Yes. He waved his hands." - -"But it might have been a cry of surprise. Astonishment at the -unexpected sight of you might cause him to throw up his hands?" - -"It is possible." - -"And you thought he was pulled back?" - -"He disappeared so suddenly." - -"He might have leaped back. You did not see anyone else in the -room?" - -"No, but this horrible man confessed to having been there, and -the Lascar was at the foot of the stairs." - -"Quite so. Your husband, as far as you could see, had his -ordinary clothes on?" - -"But without his collar or tie. I distinctly saw his bare -throat." - -"Had he ever spoken of Swandam Lane?" - -"Never." - -"Had he ever showed any signs of having taken opium?" - -"Never." - -"Thank you, Mrs. St. Clair. Those are the principal points about -which I wished to be absolutely clear. We shall now have a little -supper and then retire, for we may have a very busy day -to-morrow." - -A large and comfortable double-bedded room had been placed at our -disposal, and I was quickly between the sheets, for I was weary -after my night of adventure. Sherlock Holmes was a man, however, -who, when he had an unsolved problem upon his mind, would go for -days, and even for a week, without rest, turning it over, -rearranging his facts, looking at it from every point of view -until he had either fathomed it or convinced himself that his -data were insufficient. It was soon evident to me that he was now -preparing for an all-night sitting. He took off his coat and -waistcoat, put on a large blue dressing-gown, and then wandered -about the room collecting pillows from his bed and cushions from -the sofa and armchairs. With these he constructed a sort of -Eastern divan, upon which he perched himself cross-legged, with -an ounce of shag tobacco and a box of matches laid out in front -of him. In the dim light of the lamp I saw him sitting there, an -old briar pipe between his lips, his eyes fixed vacantly upon the -corner of the ceiling, the blue smoke curling up from him, -silent, motionless, with the light shining upon his strong-set -aquiline features. So he sat as I dropped off to sleep, and so he -sat when a sudden ejaculation caused me to wake up, and I found -the summer sun shining into the apartment. The pipe was still -between his lips, the smoke still curled upward, and the room was -full of a dense tobacco haze, but nothing remained of the heap of -shag which I had seen upon the previous night. - -"Awake, Watson?" he asked. - -"Yes." - -"Game for a morning drive?" - -"Certainly." - -"Then dress. No one is stirring yet, but I know where the -stable-boy sleeps, and we shall soon have the trap out." He -chuckled to himself as he spoke, his eyes twinkled, and he seemed -a different man to the sombre thinker of the previous night. - -As I dressed I glanced at my watch. It was no wonder that no one -was stirring. It was twenty-five minutes past four. I had hardly -finished when Holmes returned with the news that the boy was -putting in the horse. - -"I want to test a little theory of mine," said he, pulling on his -boots. "I think, Watson, that you are now standing in the -presence of one of the most absolute fools in Europe. I deserve -to be kicked from here to Charing Cross. But I think I have the -key of the affair now." - -"And where is it?" I asked, smiling. - -"In the bathroom," he answered. "Oh, yes, I am not joking," he -continued, seeing my look of incredulity. "I have just been -there, and I have taken it out, and I have got it in this -Gladstone bag. Come on, my boy, and we shall see whether it will -not fit the lock." - -We made our way downstairs as quietly as possible, and out into -the bright morning sunshine. In the road stood our horse and -trap, with the half-clad stable-boy waiting at the head. We both -sprang in, and away we dashed down the London Road. A few country -carts were stirring, bearing in vegetables to the metropolis, but -the lines of villas on either side were as silent and lifeless as -some city in a dream. - -"It has been in some points a singular case," said Holmes, -flicking the horse on into a gallop. "I confess that I have been -as blind as a mole, but it is better to learn wisdom late than -never to learn it at all." - -In town the earliest risers were just beginning to look sleepily -from their windows as we drove through the streets of the Surrey -side. Passing down the Waterloo Bridge Road we crossed over the -river, and dashing up Wellington Street wheeled sharply to the -right and found ourselves in Bow Street. Sherlock Holmes was well -known to the force, and the two constables at the door saluted -him. One of them held the horse's head while the other led us in. - -"Who is on duty?" asked Holmes. - -"Inspector Bradstreet, sir." - -"Ah, Bradstreet, how are you?" A tall, stout official had come -down the stone-flagged passage, in a peaked cap and frogged -jacket. "I wish to have a quiet word with you, Bradstreet." -"Certainly, Mr. Holmes. Step into my room here." It was a small, -office-like room, with a huge ledger upon the table, and a -telephone projecting from the wall. The inspector sat down at his -desk. - -"What can I do for you, Mr. Holmes?" - -"I called about that beggarman, Boone--the one who was charged -with being concerned in the disappearance of Mr. Neville St. -Clair, of Lee." - -"Yes. He was brought up and remanded for further inquiries." - -"So I heard. You have him here?" - -"In the cells." - -"Is he quiet?" - -"Oh, he gives no trouble. But he is a dirty scoundrel." - -"Dirty?" - -"Yes, it is all we can do to make him wash his hands, and his -face is as black as a tinker's. Well, when once his case has been -settled, he will have a regular prison bath; and I think, if you -saw him, you would agree with me that he needed it." - -"I should like to see him very much." - -"Would you? That is easily done. Come this way. You can leave -your bag." - -"No, I think that I'll take it." - -"Very good. Come this way, if you please." He led us down a -passage, opened a barred door, passed down a winding stair, and -brought us to a whitewashed corridor with a line of doors on each -side. - -"The third on the right is his," said the inspector. "Here it -is!" He quietly shot back a panel in the upper part of the door -and glanced through. - -"He is asleep," said he. "You can see him very well." - -We both put our eyes to the grating. The prisoner lay with his -face towards us, in a very deep sleep, breathing slowly and -heavily. He was a middle-sized man, coarsely clad as became his -calling, with a coloured shirt protruding through the rent in his -tattered coat. He was, as the inspector had said, extremely -dirty, but the grime which covered his face could not conceal its -repulsive ugliness. A broad wheal from an old scar ran right -across it from eye to chin, and by its contraction had turned up -one side of the upper lip, so that three teeth were exposed in a -perpetual snarl. A shock of very bright red hair grew low over -his eyes and forehead. - -"He's a beauty, isn't he?" said the inspector. - -"He certainly needs a wash," remarked Holmes. "I had an idea that -he might, and I took the liberty of bringing the tools with me." -He opened the Gladstone bag as he spoke, and took out, to my -astonishment, a very large bath-sponge. - -"He! he! You are a funny one," chuckled the inspector. - -"Now, if you will have the great goodness to open that door very -quietly, we will soon make him cut a much more respectable -figure." - -"Well, I don't know why not," said the inspector. "He doesn't -look a credit to the Bow Street cells, does he?" He slipped his -key into the lock, and we all very quietly entered the cell. The -sleeper half turned, and then settled down once more into a deep -slumber. Holmes stooped to the water-jug, moistened his sponge, -and then rubbed it twice vigorously across and down the -prisoner's face. - -"Let me introduce you," he shouted, "to Mr. Neville St. Clair, of -Lee, in the county of Kent." - -Never in my life have I seen such a sight. The man's face peeled -off under the sponge like the bark from a tree. Gone was the -coarse brown tint! Gone, too, was the horrid scar which had -seamed it across, and the twisted lip which had given the -repulsive sneer to the face! A twitch brought away the tangled -red hair, and there, sitting up in his bed, was a pale, -sad-faced, refined-looking man, black-haired and smooth-skinned, -rubbing his eyes and staring about him with sleepy bewilderment. -Then suddenly realising the exposure, he broke into a scream and -threw himself down with his face to the pillow. - -"Great heavens!" cried the inspector, "it is, indeed, the missing -man. I know him from the photograph." - -The prisoner turned with the reckless air of a man who abandons -himself to his destiny. "Be it so," said he. "And pray what am I -charged with?" - -"With making away with Mr. Neville St.-- Oh, come, you can't be -charged with that unless they make a case of attempted suicide of -it," said the inspector with a grin. "Well, I have been -twenty-seven years in the force, but this really takes the cake." - -"If I am Mr. Neville St. Clair, then it is obvious that no crime -has been committed, and that, therefore, I am illegally -detained." - -"No crime, but a very great error has been committed," said -Holmes. "You would have done better to have trusted your wife." - -"It was not the wife; it was the children," groaned the prisoner. -"God help me, I would not have them ashamed of their father. My -God! What an exposure! What can I do?" - -Sherlock Holmes sat down beside him on the couch and patted him -kindly on the shoulder. - -"If you leave it to a court of law to clear the matter up," said -he, "of course you can hardly avoid publicity. On the other hand, -if you convince the police authorities that there is no possible -case against you, I do not know that there is any reason that the -details should find their way into the papers. Inspector -Bradstreet would, I am sure, make notes upon anything which you -might tell us and submit it to the proper authorities. The case -would then never go into court at all." - -"God bless you!" cried the prisoner passionately. "I would have -endured imprisonment, ay, even execution, rather than have left -my miserable secret as a family blot to my children. - -"You are the first who have ever heard my story. My father was a -schoolmaster in Chesterfield, where I received an excellent -education. I travelled in my youth, took to the stage, and -finally became a reporter on an evening paper in London. One day -my editor wished to have a series of articles upon begging in the -metropolis, and I volunteered to supply them. There was the point -from which all my adventures started. It was only by trying -begging as an amateur that I could get the facts upon which to -base my articles. When an actor I had, of course, learned all the -secrets of making up, and had been famous in the green-room for -my skill. I took advantage now of my attainments. I painted my -face, and to make myself as pitiable as possible I made a good -scar and fixed one side of my lip in a twist by the aid of a -small slip of flesh-coloured plaster. Then with a red head of -hair, and an appropriate dress, I took my station in the business -part of the city, ostensibly as a match-seller but really as a -beggar. For seven hours I plied my trade, and when I returned -home in the evening I found to my surprise that I had received no -less than 26s. 4d. - -"I wrote my articles and thought little more of the matter until, -some time later, I backed a bill for a friend and had a writ -served upon me for 25 pounds. I was at my wit's end where to get -the money, but a sudden idea came to me. I begged a fortnight's -grace from the creditor, asked for a holiday from my employers, -and spent the time in begging in the City under my disguise. In -ten days I had the money and had paid the debt. - -"Well, you can imagine how hard it was to settle down to arduous -work at 2 pounds a week when I knew that I could earn as much in -a day by smearing my face with a little paint, laying my cap on -the ground, and sitting still. It was a long fight between my -pride and the money, but the dollars won at last, and I threw up -reporting and sat day after day in the corner which I had first -chosen, inspiring pity by my ghastly face and filling my pockets -with coppers. Only one man knew my secret. He was the keeper of a -low den in which I used to lodge in Swandam Lane, where I could -every morning emerge as a squalid beggar and in the evenings -transform myself into a well-dressed man about town. This fellow, -a Lascar, was well paid by me for his rooms, so that I knew that -my secret was safe in his possession. - -"Well, very soon I found that I was saving considerable sums of -money. I do not mean that any beggar in the streets of London -could earn 700 pounds a year--which is less than my average -takings--but I had exceptional advantages in my power of making -up, and also in a facility of repartee, which improved by -practice and made me quite a recognised character in the City. -All day a stream of pennies, varied by silver, poured in upon me, -and it was a very bad day in which I failed to take 2 pounds. - -"As I grew richer I grew more ambitious, took a house in the -country, and eventually married, without anyone having a -suspicion as to my real occupation. My dear wife knew that I had -business in the City. She little knew what. - -"Last Monday I had finished for the day and was dressing in my -room above the opium den when I looked out of my window and saw, -to my horror and astonishment, that my wife was standing in the -street, with her eyes fixed full upon me. I gave a cry of -surprise, threw up my arms to cover my face, and, rushing to my -confidant, the Lascar, entreated him to prevent anyone from -coming up to me. I heard her voice downstairs, but I knew that -she could not ascend. Swiftly I threw off my clothes, pulled on -those of a beggar, and put on my pigments and wig. Even a wife's -eyes could not pierce so complete a disguise. But then it -occurred to me that there might be a search in the room, and that -the clothes might betray me. I threw open the window, reopening -by my violence a small cut which I had inflicted upon myself in -the bedroom that morning. Then I seized my coat, which was -weighted by the coppers which I had just transferred to it from -the leather bag in which I carried my takings. I hurled it out of -the window, and it disappeared into the Thames. The other clothes -would have followed, but at that moment there was a rush of -constables up the stair, and a few minutes after I found, rather, -I confess, to my relief, that instead of being identified as Mr. -Neville St. Clair, I was arrested as his murderer. - -"I do not know that there is anything else for me to explain. I -was determined to preserve my disguise as long as possible, and -hence my preference for a dirty face. Knowing that my wife would -be terribly anxious, I slipped off my ring and confided it to the -Lascar at a moment when no constable was watching me, together -with a hurried scrawl, telling her that she had no cause to -fear." - -"That note only reached her yesterday," said Holmes. - -"Good God! What a week she must have spent!" - -"The police have watched this Lascar," said Inspector Bradstreet, -"and I can quite understand that he might find it difficult to -post a letter unobserved. Probably he handed it to some sailor -customer of his, who forgot all about it for some days." - -"That was it," said Holmes, nodding approvingly; "I have no doubt -of it. But have you never been prosecuted for begging?" - -"Many times; but what was a fine to me?" - -"It must stop here, however," said Bradstreet. "If the police are -to hush this thing up, there must be no more of Hugh Boone." - -"I have sworn it by the most solemn oaths which a man can take." - -"In that case I think that it is probable that no further steps -may be taken. But if you are found again, then all must come out. -I am sure, Mr. Holmes, that we are very much indebted to you for -having cleared the matter up. I wish I knew how you reach your -results." - -"I reached this one," said my friend, "by sitting upon five -pillows and consuming an ounce of shag. I think, Watson, that if -we drive to Baker Street we shall just be in time for breakfast." - - - -VII. THE ADVENTURE OF THE BLUE CARBUNCLE - -I had called upon my friend Sherlock Holmes upon the second -morning after Christmas, with the intention of wishing him the -compliments of the season. He was lounging upon the sofa in a -purple dressing-gown, a pipe-rack within his reach upon the -right, and a pile of crumpled morning papers, evidently newly -studied, near at hand. Beside the couch was a wooden chair, and -on the angle of the back hung a very seedy and disreputable -hard-felt hat, much the worse for wear, and cracked in several -places. A lens and a forceps lying upon the seat of the chair -suggested that the hat had been suspended in this manner for the -purpose of examination. - -"You are engaged," said I; "perhaps I interrupt you." - -"Not at all. I am glad to have a friend with whom I can discuss -my results. The matter is a perfectly trivial one"--he jerked his -thumb in the direction of the old hat--"but there are points in -connection with it which are not entirely devoid of interest and -even of instruction." - -I seated myself in his armchair and warmed my hands before his -crackling fire, for a sharp frost had set in, and the windows -were thick with the ice crystals. "I suppose," I remarked, "that, -homely as it looks, this thing has some deadly story linked on to -it--that it is the clue which will guide you in the solution of -some mystery and the punishment of some crime." - -"No, no. No crime," said Sherlock Holmes, laughing. "Only one of -those whimsical little incidents which will happen when you have -four million human beings all jostling each other within the -space of a few square miles. Amid the action and reaction of so -dense a swarm of humanity, every possible combination of events -may be expected to take place, and many a little problem will be -presented which may be striking and bizarre without being -criminal. We have already had experience of such." - -"So much so," I remarked, "that of the last six cases which I -have added to my notes, three have been entirely free of any -legal crime." - -"Precisely. You allude to my attempt to recover the Irene Adler -papers, to the singular case of Miss Mary Sutherland, and to the -adventure of the man with the twisted lip. Well, I have no doubt -that this small matter will fall into the same innocent category. -You know Peterson, the commissionaire?" - -"Yes." - -"It is to him that this trophy belongs." - -"It is his hat." - -"No, no, he found it. Its owner is unknown. I beg that you will -look upon it not as a battered billycock but as an intellectual -problem. And, first, as to how it came here. It arrived upon -Christmas morning, in company with a good fat goose, which is, I -have no doubt, roasting at this moment in front of Peterson's -fire. The facts are these: about four o'clock on Christmas -morning, Peterson, who, as you know, is a very honest fellow, was -returning from some small jollification and was making his way -homeward down Tottenham Court Road. In front of him he saw, in -the gaslight, a tallish man, walking with a slight stagger, and -carrying a white goose slung over his shoulder. As he reached the -corner of Goodge Street, a row broke out between this stranger -and a little knot of roughs. One of the latter knocked off the -man's hat, on which he raised his stick to defend himself and, -swinging it over his head, smashed the shop window behind him. -Peterson had rushed forward to protect the stranger from his -assailants; but the man, shocked at having broken the window, and -seeing an official-looking person in uniform rushing towards him, -dropped his goose, took to his heels, and vanished amid the -labyrinth of small streets which lie at the back of Tottenham -Court Road. The roughs had also fled at the appearance of -Peterson, so that he was left in possession of the field of -battle, and also of the spoils of victory in the shape of this -battered hat and a most unimpeachable Christmas goose." - -"Which surely he restored to their owner?" - -"My dear fellow, there lies the problem. It is true that 'For -Mrs. Henry Baker' was printed upon a small card which was tied to -the bird's left leg, and it is also true that the initials 'H. -B.' are legible upon the lining of this hat, but as there are -some thousands of Bakers, and some hundreds of Henry Bakers in -this city of ours, it is not easy to restore lost property to any -one of them." - -"What, then, did Peterson do?" - -"He brought round both hat and goose to me on Christmas morning, -knowing that even the smallest problems are of interest to me. -The goose we retained until this morning, when there were signs -that, in spite of the slight frost, it would be well that it -should be eaten without unnecessary delay. Its finder has carried -it off, therefore, to fulfil the ultimate destiny of a goose, -while I continue to retain the hat of the unknown gentleman who -lost his Christmas dinner." - -"Did he not advertise?" - -"No." - -"Then, what clue could you have as to his identity?" - -"Only as much as we can deduce." - -"From his hat?" - -"Precisely." - -"But you are joking. What can you gather from this old battered -felt?" - -"Here is my lens. You know my methods. What can you gather -yourself as to the individuality of the man who has worn this -article?" - -I took the tattered object in my hands and turned it over rather -ruefully. It was a very ordinary black hat of the usual round -shape, hard and much the worse for wear. The lining had been of -red silk, but was a good deal discoloured. There was no maker's -name; but, as Holmes had remarked, the initials "H. B." were -scrawled upon one side. It was pierced in the brim for a -hat-securer, but the elastic was missing. For the rest, it was -cracked, exceedingly dusty, and spotted in several places, -although there seemed to have been some attempt to hide the -discoloured patches by smearing them with ink. - -"I can see nothing," said I, handing it back to my friend. - -"On the contrary, Watson, you can see everything. You fail, -however, to reason from what you see. You are too timid in -drawing your inferences." - -"Then, pray tell me what it is that you can infer from this hat?" - -He picked it up and gazed at it in the peculiar introspective -fashion which was characteristic of him. "It is perhaps less -suggestive than it might have been," he remarked, "and yet there -are a few inferences which are very distinct, and a few others -which represent at least a strong balance of probability. That -the man was highly intellectual is of course obvious upon the -face of it, and also that he was fairly well-to-do within the -last three years, although he has now fallen upon evil days. He -had foresight, but has less now than formerly, pointing to a -moral retrogression, which, when taken with the decline of his -fortunes, seems to indicate some evil influence, probably drink, -at work upon him. This may account also for the obvious fact that -his wife has ceased to love him." - -"My dear Holmes!" - -"He has, however, retained some degree of self-respect," he -continued, disregarding my remonstrance. "He is a man who leads a -sedentary life, goes out little, is out of training entirely, is -middle-aged, has grizzled hair which he has had cut within the -last few days, and which he anoints with lime-cream. These are -the more patent facts which are to be deduced from his hat. Also, -by the way, that it is extremely improbable that he has gas laid -on in his house." - -"You are certainly joking, Holmes." - -"Not in the least. Is it possible that even now, when I give you -these results, you are unable to see how they are attained?" - -"I have no doubt that I am very stupid, but I must confess that I -am unable to follow you. For example, how did you deduce that -this man was intellectual?" - -For answer Holmes clapped the hat upon his head. It came right -over the forehead and settled upon the bridge of his nose. "It is -a question of cubic capacity," said he; "a man with so large a -brain must have something in it." - -"The decline of his fortunes, then?" - -"This hat is three years old. These flat brims curled at the edge -came in then. It is a hat of the very best quality. Look at the -band of ribbed silk and the excellent lining. If this man could -afford to buy so expensive a hat three years ago, and has had no -hat since, then he has assuredly gone down in the world." - -"Well, that is clear enough, certainly. But how about the -foresight and the moral retrogression?" - -Sherlock Holmes laughed. "Here is the foresight," said he putting -his finger upon the little disc and loop of the hat-securer. -"They are never sold upon hats. If this man ordered one, it is a -sign of a certain amount of foresight, since he went out of his -way to take this precaution against the wind. But since we see -that he has broken the elastic and has not troubled to replace -it, it is obvious that he has less foresight now than formerly, -which is a distinct proof of a weakening nature. On the other -hand, he has endeavoured to conceal some of these stains upon the -felt by daubing them with ink, which is a sign that he has not -entirely lost his self-respect." - -"Your reasoning is certainly plausible." - -"The further points, that he is middle-aged, that his hair is -grizzled, that it has been recently cut, and that he uses -lime-cream, are all to be gathered from a close examination of the -lower part of the lining. The lens discloses a large number of -hair-ends, clean cut by the scissors of the barber. They all -appear to be adhesive, and there is a distinct odour of -lime-cream. This dust, you will observe, is not the gritty, grey -dust of the street but the fluffy brown dust of the house, -showing that it has been hung up indoors most of the time, while -the marks of moisture upon the inside are proof positive that the -wearer perspired very freely, and could therefore, hardly be in -the best of training." - -"But his wife--you said that she had ceased to love him." - -"This hat has not been brushed for weeks. When I see you, my dear -Watson, with a week's accumulation of dust upon your hat, and -when your wife allows you to go out in such a state, I shall fear -that you also have been unfortunate enough to lose your wife's -affection." - -"But he might be a bachelor." - -"Nay, he was bringing home the goose as a peace-offering to his -wife. Remember the card upon the bird's leg." - -"You have an answer to everything. But how on earth do you deduce -that the gas is not laid on in his house?" - -"One tallow stain, or even two, might come by chance; but when I -see no less than five, I think that there can be little doubt -that the individual must be brought into frequent contact with -burning tallow--walks upstairs at night probably with his hat in -one hand and a guttering candle in the other. Anyhow, he never -got tallow-stains from a gas-jet. Are you satisfied?" - -"Well, it is very ingenious," said I, laughing; "but since, as -you said just now, there has been no crime committed, and no harm -done save the loss of a goose, all this seems to be rather a -waste of energy." - -Sherlock Holmes had opened his mouth to reply, when the door flew -open, and Peterson, the commissionaire, rushed into the apartment -with flushed cheeks and the face of a man who is dazed with -astonishment. - -"The goose, Mr. Holmes! The goose, sir!" he gasped. - -"Eh? What of it, then? Has it returned to life and flapped off -through the kitchen window?" Holmes twisted himself round upon -the sofa to get a fairer view of the man's excited face. - -"See here, sir! See what my wife found in its crop!" He held out -his hand and displayed upon the centre of the palm a brilliantly -scintillating blue stone, rather smaller than a bean in size, but -of such purity and radiance that it twinkled like an electric -point in the dark hollow of his hand. - -Sherlock Holmes sat up with a whistle. "By Jove, Peterson!" said -he, "this is treasure trove indeed. I suppose you know what you -have got?" - -"A diamond, sir? A precious stone. It cuts into glass as though -it were putty." - -"It's more than a precious stone. It is the precious stone." - -"Not the Countess of Morcar's blue carbuncle!" I ejaculated. - -"Precisely so. I ought to know its size and shape, seeing that I -have read the advertisement about it in The Times every day -lately. It is absolutely unique, and its value can only be -conjectured, but the reward offered of 1000 pounds is certainly -not within a twentieth part of the market price." - -"A thousand pounds! Great Lord of mercy!" The commissionaire -plumped down into a chair and stared from one to the other of us. - -"That is the reward, and I have reason to know that there are -sentimental considerations in the background which would induce -the Countess to part with half her fortune if she could but -recover the gem." - -"It was lost, if I remember aright, at the Hotel Cosmopolitan," I -remarked. - -"Precisely so, on December 22nd, just five days ago. John Horner, -a plumber, was accused of having abstracted it from the lady's -jewel-case. The evidence against him was so strong that the case -has been referred to the Assizes. I have some account of the -matter here, I believe." He rummaged amid his newspapers, -glancing over the dates, until at last he smoothed one out, -doubled it over, and read the following paragraph: - -"Hotel Cosmopolitan Jewel Robbery. John Horner, 26, plumber, was -brought up upon the charge of having upon the 22nd inst., -abstracted from the jewel-case of the Countess of Morcar the -valuable gem known as the blue carbuncle. James Ryder, -upper-attendant at the hotel, gave his evidence to the effect -that he had shown Horner up to the dressing-room of the Countess -of Morcar upon the day of the robbery in order that he might -solder the second bar of the grate, which was loose. He had -remained with Horner some little time, but had finally been -called away. On returning, he found that Horner had disappeared, -that the bureau had been forced open, and that the small morocco -casket in which, as it afterwards transpired, the Countess was -accustomed to keep her jewel, was lying empty upon the -dressing-table. Ryder instantly gave the alarm, and Horner was -arrested the same evening; but the stone could not be found -either upon his person or in his rooms. Catherine Cusack, maid to -the Countess, deposed to having heard Ryder's cry of dismay on -discovering the robbery, and to having rushed into the room, -where she found matters as described by the last witness. -Inspector Bradstreet, B division, gave evidence as to the arrest -of Horner, who struggled frantically, and protested his innocence -in the strongest terms. Evidence of a previous conviction for -robbery having been given against the prisoner, the magistrate -refused to deal summarily with the offence, but referred it to -the Assizes. Horner, who had shown signs of intense emotion -during the proceedings, fainted away at the conclusion and was -carried out of court." - -"Hum! So much for the police-court," said Holmes thoughtfully, -tossing aside the paper. "The question for us now to solve is the -sequence of events leading from a rifled jewel-case at one end to -the crop of a goose in Tottenham Court Road at the other. You -see, Watson, our little deductions have suddenly assumed a much -more important and less innocent aspect. Here is the stone; the -stone came from the goose, and the goose came from Mr. Henry -Baker, the gentleman with the bad hat and all the other -characteristics with which I have bored you. So now we must set -ourselves very seriously to finding this gentleman and -ascertaining what part he has played in this little mystery. To -do this, we must try the simplest means first, and these lie -undoubtedly in an advertisement in all the evening papers. If -this fail, I shall have recourse to other methods." - -"What will you say?" - -"Give me a pencil and that slip of paper. Now, then: 'Found at -the corner of Goodge Street, a goose and a black felt hat. Mr. -Henry Baker can have the same by applying at 6:30 this evening at -221B, Baker Street.' That is clear and concise." - -"Very. But will he see it?" - -"Well, he is sure to keep an eye on the papers, since, to a poor -man, the loss was a heavy one. He was clearly so scared by his -mischance in breaking the window and by the approach of Peterson -that he thought of nothing but flight, but since then he must -have bitterly regretted the impulse which caused him to drop his -bird. Then, again, the introduction of his name will cause him to -see it, for everyone who knows him will direct his attention to -it. Here you are, Peterson, run down to the advertising agency -and have this put in the evening papers." - -"In which, sir?" - -"Oh, in the Globe, Star, Pall Mall, St. James's, Evening News, -Standard, Echo, and any others that occur to you." - -"Very well, sir. And this stone?" - -"Ah, yes, I shall keep the stone. Thank you. And, I say, -Peterson, just buy a goose on your way back and leave it here -with me, for we must have one to give to this gentleman in place -of the one which your family is now devouring." - -When the commissionaire had gone, Holmes took up the stone and -held it against the light. "It's a bonny thing," said he. "Just -see how it glints and sparkles. Of course it is a nucleus and -focus of crime. Every good stone is. They are the devil's pet -baits. In the larger and older jewels every facet may stand for a -bloody deed. This stone is not yet twenty years old. It was found -in the banks of the Amoy River in southern China and is remarkable -in having every characteristic of the carbuncle, save that it is -blue in shade instead of ruby red. In spite of its youth, it has -already a sinister history. There have been two murders, a -vitriol-throwing, a suicide, and several robberies brought about -for the sake of this forty-grain weight of crystallised charcoal. -Who would think that so pretty a toy would be a purveyor to the -gallows and the prison? I'll lock it up in my strong box now and -drop a line to the Countess to say that we have it." - -"Do you think that this man Horner is innocent?" - -"I cannot tell." - -"Well, then, do you imagine that this other one, Henry Baker, had -anything to do with the matter?" - -"It is, I think, much more likely that Henry Baker is an -absolutely innocent man, who had no idea that the bird which he -was carrying was of considerably more value than if it were made -of solid gold. That, however, I shall determine by a very simple -test if we have an answer to our advertisement." - -"And you can do nothing until then?" - -"Nothing." - -"In that case I shall continue my professional round. But I shall -come back in the evening at the hour you have mentioned, for I -should like to see the solution of so tangled a business." - -"Very glad to see you. I dine at seven. There is a woodcock, I -believe. By the way, in view of recent occurrences, perhaps I -ought to ask Mrs. Hudson to examine its crop." - -I had been delayed at a case, and it was a little after half-past -six when I found myself in Baker Street once more. As I -approached the house I saw a tall man in a Scotch bonnet with a -coat which was buttoned up to his chin waiting outside in the -bright semicircle which was thrown from the fanlight. Just as I -arrived the door was opened, and we were shown up together to -Holmes' room. - -"Mr. Henry Baker, I believe," said he, rising from his armchair -and greeting his visitor with the easy air of geniality which he -could so readily assume. "Pray take this chair by the fire, Mr. -Baker. It is a cold night, and I observe that your circulation is -more adapted for summer than for winter. Ah, Watson, you have -just come at the right time. Is that your hat, Mr. Baker?" - -"Yes, sir, that is undoubtedly my hat." - -He was a large man with rounded shoulders, a massive head, and a -broad, intelligent face, sloping down to a pointed beard of -grizzled brown. A touch of red in nose and cheeks, with a slight -tremor of his extended hand, recalled Holmes' surmise as to his -habits. His rusty black frock-coat was buttoned right up in -front, with the collar turned up, and his lank wrists protruded -from his sleeves without a sign of cuff or shirt. He spoke in a -slow staccato fashion, choosing his words with care, and gave the -impression generally of a man of learning and letters who had had -ill-usage at the hands of fortune. - -"We have retained these things for some days," said Holmes, -"because we expected to see an advertisement from you giving your -address. I am at a loss to know now why you did not advertise." - -Our visitor gave a rather shamefaced laugh. "Shillings have not -been so plentiful with me as they once were," he remarked. "I had -no doubt that the gang of roughs who assaulted me had carried off -both my hat and the bird. I did not care to spend more money in a -hopeless attempt at recovering them." - -"Very naturally. By the way, about the bird, we were compelled to -eat it." - -"To eat it!" Our visitor half rose from his chair in his -excitement. - -"Yes, it would have been of no use to anyone had we not done so. -But I presume that this other goose upon the sideboard, which is -about the same weight and perfectly fresh, will answer your -purpose equally well?" - -"Oh, certainly, certainly," answered Mr. Baker with a sigh of -relief. - -"Of course, we still have the feathers, legs, crop, and so on of -your own bird, so if you wish--" - -The man burst into a hearty laugh. "They might be useful to me as -relics of my adventure," said he, "but beyond that I can hardly -see what use the disjecta membra of my late acquaintance are -going to be to me. No, sir, I think that, with your permission, I -will confine my attentions to the excellent bird which I perceive -upon the sideboard." - -Sherlock Holmes glanced sharply across at me with a slight shrug -of his shoulders. - -"There is your hat, then, and there your bird," said he. "By the -way, would it bore you to tell me where you got the other one -from? I am somewhat of a fowl fancier, and I have seldom seen a -better grown goose." - -"Certainly, sir," said Baker, who had risen and tucked his newly -gained property under his arm. "There are a few of us who -frequent the Alpha Inn, near the Museum--we are to be found in -the Museum itself during the day, you understand. This year our -good host, Windigate by name, instituted a goose club, by which, -on consideration of some few pence every week, we were each to -receive a bird at Christmas. My pence were duly paid, and the -rest is familiar to you. I am much indebted to you, sir, for a -Scotch bonnet is fitted neither to my years nor my gravity." With -a comical pomposity of manner he bowed solemnly to both of us and -strode off upon his way. - -"So much for Mr. Henry Baker," said Holmes when he had closed the -door behind him. "It is quite certain that he knows nothing -whatever about the matter. Are you hungry, Watson?" - -"Not particularly." - -"Then I suggest that we turn our dinner into a supper and follow -up this clue while it is still hot." - -"By all means." - -It was a bitter night, so we drew on our ulsters and wrapped -cravats about our throats. Outside, the stars were shining coldly -in a cloudless sky, and the breath of the passers-by blew out -into smoke like so many pistol shots. Our footfalls rang out -crisply and loudly as we swung through the doctors' quarter, -Wimpole Street, Harley Street, and so through Wigmore Street into -Oxford Street. In a quarter of an hour we were in Bloomsbury at -the Alpha Inn, which is a small public-house at the corner of one -of the streets which runs down into Holborn. Holmes pushed open -the door of the private bar and ordered two glasses of beer from -the ruddy-faced, white-aproned landlord. - -"Your beer should be excellent if it is as good as your geese," -said he. - -"My geese!" The man seemed surprised. - -"Yes. I was speaking only half an hour ago to Mr. Henry Baker, -who was a member of your goose club." - -"Ah! yes, I see. But you see, sir, them's not our geese." - -"Indeed! Whose, then?" - -"Well, I got the two dozen from a salesman in Covent Garden." - -"Indeed? I know some of them. Which was it?" - -"Breckinridge is his name." - -"Ah! I don't know him. Well, here's your good health landlord, -and prosperity to your house. Good-night." - -"Now for Mr. Breckinridge," he continued, buttoning up his coat -as we came out into the frosty air. "Remember, Watson that though -we have so homely a thing as a goose at one end of this chain, we -have at the other a man who will certainly get seven years' penal -servitude unless we can establish his innocence. It is possible -that our inquiry may but confirm his guilt; but, in any case, we -have a line of investigation which has been missed by the police, -and which a singular chance has placed in our hands. Let us -follow it out to the bitter end. Faces to the south, then, and -quick march!" - -We passed across Holborn, down Endell Street, and so through a -zigzag of slums to Covent Garden Market. One of the largest -stalls bore the name of Breckinridge upon it, and the proprietor -a horsey-looking man, with a sharp face and trim side-whiskers was -helping a boy to put up the shutters. - -"Good-evening. It's a cold night," said Holmes. - -The salesman nodded and shot a questioning glance at my -companion. - -"Sold out of geese, I see," continued Holmes, pointing at the -bare slabs of marble. - -"Let you have five hundred to-morrow morning." - -"That's no good." - -"Well, there are some on the stall with the gas-flare." - -"Ah, but I was recommended to you." - -"Who by?" - -"The landlord of the Alpha." - -"Oh, yes; I sent him a couple of dozen." - -"Fine birds they were, too. Now where did you get them from?" - -To my surprise the question provoked a burst of anger from the -salesman. - -"Now, then, mister," said he, with his head cocked and his arms -akimbo, "what are you driving at? Let's have it straight, now." - -"It is straight enough. I should like to know who sold you the -geese which you supplied to the Alpha." - -"Well then, I shan't tell you. So now!" - -"Oh, it is a matter of no importance; but I don't know why you -should be so warm over such a trifle." - -"Warm! You'd be as warm, maybe, if you were as pestered as I am. -When I pay good money for a good article there should be an end -of the business; but it's 'Where are the geese?' and 'Who did you -sell the geese to?' and 'What will you take for the geese?' One -would think they were the only geese in the world, to hear the -fuss that is made over them." - -"Well, I have no connection with any other people who have been -making inquiries," said Holmes carelessly. "If you won't tell us -the bet is off, that is all. But I'm always ready to back my -opinion on a matter of fowls, and I have a fiver on it that the -bird I ate is country bred." - -"Well, then, you've lost your fiver, for it's town bred," snapped -the salesman. - -"It's nothing of the kind." - -"I say it is." - -"I don't believe it." - -"D'you think you know more about fowls than I, who have handled -them ever since I was a nipper? I tell you, all those birds that -went to the Alpha were town bred." - -"You'll never persuade me to believe that." - -"Will you bet, then?" - -"It's merely taking your money, for I know that I am right. But -I'll have a sovereign on with you, just to teach you not to be -obstinate." - -The salesman chuckled grimly. "Bring me the books, Bill," said -he. - -The small boy brought round a small thin volume and a great -greasy-backed one, laying them out together beneath the hanging -lamp. - -"Now then, Mr. Cocksure," said the salesman, "I thought that I -was out of geese, but before I finish you'll find that there is -still one left in my shop. You see this little book?" - -"Well?" - -"That's the list of the folk from whom I buy. D'you see? Well, -then, here on this page are the country folk, and the numbers -after their names are where their accounts are in the big ledger. -Now, then! You see this other page in red ink? Well, that is a -list of my town suppliers. Now, look at that third name. Just -read it out to me." - -"Mrs. Oakshott, 117, Brixton Road--249," read Holmes. - -"Quite so. Now turn that up in the ledger." - -Holmes turned to the page indicated. "Here you are, 'Mrs. -Oakshott, 117, Brixton Road, egg and poultry supplier.'" - -"Now, then, what's the last entry?" - -"'December 22nd. Twenty-four geese at 7s. 6d.'" - -"Quite so. There you are. And underneath?" - -"'Sold to Mr. Windigate of the Alpha, at 12s.'" - -"What have you to say now?" - -Sherlock Holmes looked deeply chagrined. He drew a sovereign from -his pocket and threw it down upon the slab, turning away with the -air of a man whose disgust is too deep for words. A few yards off -he stopped under a lamp-post and laughed in the hearty, noiseless -fashion which was peculiar to him. - -"When you see a man with whiskers of that cut and the 'Pink 'un' -protruding out of his pocket, you can always draw him by a bet," -said he. "I daresay that if I had put 100 pounds down in front of -him, that man would not have given me such complete information -as was drawn from him by the idea that he was doing me on a -wager. Well, Watson, we are, I fancy, nearing the end of our -quest, and the only point which remains to be determined is -whether we should go on to this Mrs. Oakshott to-night, or -whether we should reserve it for to-morrow. It is clear from what -that surly fellow said that there are others besides ourselves -who are anxious about the matter, and I should--" - -His remarks were suddenly cut short by a loud hubbub which broke -out from the stall which we had just left. Turning round we saw a -little rat-faced fellow standing in the centre of the circle of -yellow light which was thrown by the swinging lamp, while -Breckinridge, the salesman, framed in the door of his stall, was -shaking his fists fiercely at the cringing figure. - -"I've had enough of you and your geese," he shouted. "I wish you -were all at the devil together. If you come pestering me any more -with your silly talk I'll set the dog at you. You bring Mrs. -Oakshott here and I'll answer her, but what have you to do with -it? Did I buy the geese off you?" - -"No; but one of them was mine all the same," whined the little -man. - -"Well, then, ask Mrs. Oakshott for it." - -"She told me to ask you." - -"Well, you can ask the King of Proosia, for all I care. I've had -enough of it. Get out of this!" He rushed fiercely forward, and -the inquirer flitted away into the darkness. - -"Ha! this may save us a visit to Brixton Road," whispered Holmes. -"Come with me, and we will see what is to be made of this -fellow." Striding through the scattered knots of people who -lounged round the flaring stalls, my companion speedily overtook -the little man and touched him upon the shoulder. He sprang -round, and I could see in the gas-light that every vestige of -colour had been driven from his face. - -"Who are you, then? What do you want?" he asked in a quavering -voice. - -"You will excuse me," said Holmes blandly, "but I could not help -overhearing the questions which you put to the salesman just now. -I think that I could be of assistance to you." - -"You? Who are you? How could you know anything of the matter?" - -"My name is Sherlock Holmes. It is my business to know what other -people don't know." - -"But you can know nothing of this?" - -"Excuse me, I know everything of it. You are endeavouring to -trace some geese which were sold by Mrs. Oakshott, of Brixton -Road, to a salesman named Breckinridge, by him in turn to Mr. -Windigate, of the Alpha, and by him to his club, of which Mr. -Henry Baker is a member." - -"Oh, sir, you are the very man whom I have longed to meet," cried -the little fellow with outstretched hands and quivering fingers. -"I can hardly explain to you how interested I am in this matter." - -Sherlock Holmes hailed a four-wheeler which was passing. "In that -case we had better discuss it in a cosy room rather than in this -wind-swept market-place," said he. "But pray tell me, before we -go farther, who it is that I have the pleasure of assisting." - -The man hesitated for an instant. "My name is John Robinson," he -answered with a sidelong glance. - -"No, no; the real name," said Holmes sweetly. "It is always -awkward doing business with an alias." - -A flush sprang to the white cheeks of the stranger. "Well then," -said he, "my real name is James Ryder." - -"Precisely so. Head attendant at the Hotel Cosmopolitan. Pray -step into the cab, and I shall soon be able to tell you -everything which you would wish to know." - -The little man stood glancing from one to the other of us with -half-frightened, half-hopeful eyes, as one who is not sure -whether he is on the verge of a windfall or of a catastrophe. -Then he stepped into the cab, and in half an hour we were back in -the sitting-room at Baker Street. Nothing had been said during -our drive, but the high, thin breathing of our new companion, and -the claspings and unclaspings of his hands, spoke of the nervous -tension within him. - -"Here we are!" said Holmes cheerily as we filed into the room. -"The fire looks very seasonable in this weather. You look cold, -Mr. Ryder. Pray take the basket-chair. I will just put on my -slippers before we settle this little matter of yours. Now, then! -You want to know what became of those geese?" - -"Yes, sir." - -"Or rather, I fancy, of that goose. It was one bird, I imagine in -which you were interested--white, with a black bar across the -tail." - -Ryder quivered with emotion. "Oh, sir," he cried, "can you tell -me where it went to?" - -"It came here." - -"Here?" - -"Yes, and a most remarkable bird it proved. I don't wonder that -you should take an interest in it. It laid an egg after it was -dead--the bonniest, brightest little blue egg that ever was seen. -I have it here in my museum." - -Our visitor staggered to his feet and clutched the mantelpiece -with his right hand. Holmes unlocked his strong-box and held up -the blue carbuncle, which shone out like a star, with a cold, -brilliant, many-pointed radiance. Ryder stood glaring with a -drawn face, uncertain whether to claim or to disown it. - -"The game's up, Ryder," said Holmes quietly. "Hold up, man, or -you'll be into the fire! Give him an arm back into his chair, -Watson. He's not got blood enough to go in for felony with -impunity. Give him a dash of brandy. So! Now he looks a little -more human. What a shrimp it is, to be sure!" - -For a moment he had staggered and nearly fallen, but the brandy -brought a tinge of colour into his cheeks, and he sat staring -with frightened eyes at his accuser. - -"I have almost every link in my hands, and all the proofs which I -could possibly need, so there is little which you need tell me. -Still, that little may as well be cleared up to make the case -complete. You had heard, Ryder, of this blue stone of the -Countess of Morcar's?" - -"It was Catherine Cusack who told me of it," said he in a -crackling voice. - -"I see--her ladyship's waiting-maid. Well, the temptation of -sudden wealth so easily acquired was too much for you, as it has -been for better men before you; but you were not very scrupulous -in the means you used. It seems to me, Ryder, that there is the -making of a very pretty villain in you. You knew that this man -Horner, the plumber, had been concerned in some such matter -before, and that suspicion would rest the more readily upon him. -What did you do, then? You made some small job in my lady's -room--you and your confederate Cusack--and you managed that he -should be the man sent for. Then, when he had left, you rifled -the jewel-case, raised the alarm, and had this unfortunate man -arrested. You then--" - -Ryder threw himself down suddenly upon the rug and clutched at my -companion's knees. "For God's sake, have mercy!" he shrieked. -"Think of my father! Of my mother! It would break their hearts. I -never went wrong before! I never will again. I swear it. I'll -swear it on a Bible. Oh, don't bring it into court! For Christ's -sake, don't!" - -"Get back into your chair!" said Holmes sternly. "It is very well -to cringe and crawl now, but you thought little enough of this -poor Horner in the dock for a crime of which he knew nothing." - -"I will fly, Mr. Holmes. I will leave the country, sir. Then the -charge against him will break down." - -"Hum! We will talk about that. And now let us hear a true account -of the next act. How came the stone into the goose, and how came -the goose into the open market? Tell us the truth, for there lies -your only hope of safety." - -Ryder passed his tongue over his parched lips. "I will tell you -it just as it happened, sir," said he. "When Horner had been -arrested, it seemed to me that it would be best for me to get -away with the stone at once, for I did not know at what moment -the police might not take it into their heads to search me and my -room. There was no place about the hotel where it would be safe. -I went out, as if on some commission, and I made for my sister's -house. She had married a man named Oakshott, and lived in Brixton -Road, where she fattened fowls for the market. All the way there -every man I met seemed to me to be a policeman or a detective; -and, for all that it was a cold night, the sweat was pouring down -my face before I came to the Brixton Road. My sister asked me -what was the matter, and why I was so pale; but I told her that I -had been upset by the jewel robbery at the hotel. Then I went -into the back yard and smoked a pipe and wondered what it would -be best to do. - -"I had a friend once called Maudsley, who went to the bad, and -has just been serving his time in Pentonville. One day he had met -me, and fell into talk about the ways of thieves, and how they -could get rid of what they stole. I knew that he would be true to -me, for I knew one or two things about him; so I made up my mind -to go right on to Kilburn, where he lived, and take him into my -confidence. He would show me how to turn the stone into money. -But how to get to him in safety? I thought of the agonies I had -gone through in coming from the hotel. I might at any moment be -seized and searched, and there would be the stone in my waistcoat -pocket. I was leaning against the wall at the time and looking at -the geese which were waddling about round my feet, and suddenly -an idea came into my head which showed me how I could beat the -best detective that ever lived. - -"My sister had told me some weeks before that I might have the -pick of her geese for a Christmas present, and I knew that she -was always as good as her word. I would take my goose now, and in -it I would carry my stone to Kilburn. There was a little shed in -the yard, and behind this I drove one of the birds--a fine big -one, white, with a barred tail. I caught it, and prying its bill -open, I thrust the stone down its throat as far as my finger -could reach. The bird gave a gulp, and I felt the stone pass -along its gullet and down into its crop. But the creature flapped -and struggled, and out came my sister to know what was the -matter. As I turned to speak to her the brute broke loose and -fluttered off among the others. - -"'Whatever were you doing with that bird, Jem?' says she. - -"'Well,' said I, 'you said you'd give me one for Christmas, and I -was feeling which was the fattest.' - -"'Oh,' says she, 'we've set yours aside for you--Jem's bird, we -call it. It's the big white one over yonder. There's twenty-six -of them, which makes one for you, and one for us, and two dozen -for the market.' - -"'Thank you, Maggie,' says I; 'but if it is all the same to you, -I'd rather have that one I was handling just now.' - -"'The other is a good three pound heavier,' said she, 'and we -fattened it expressly for you.' - -"'Never mind. I'll have the other, and I'll take it now,' said I. - -"'Oh, just as you like,' said she, a little huffed. 'Which is it -you want, then?' - -"'That white one with the barred tail, right in the middle of the -flock.' - -"'Oh, very well. Kill it and take it with you.' - -"Well, I did what she said, Mr. Holmes, and I carried the bird -all the way to Kilburn. I told my pal what I had done, for he was -a man that it was easy to tell a thing like that to. He laughed -until he choked, and we got a knife and opened the goose. My -heart turned to water, for there was no sign of the stone, and I -knew that some terrible mistake had occurred. I left the bird, -rushed back to my sister's, and hurried into the back yard. There -was not a bird to be seen there. - -"'Where are they all, Maggie?' I cried. - -"'Gone to the dealer's, Jem.' - -"'Which dealer's?' - -"'Breckinridge, of Covent Garden.' - -"'But was there another with a barred tail?' I asked, 'the same -as the one I chose?' - -"'Yes, Jem; there were two barred-tailed ones, and I could never -tell them apart.' - -"Well, then, of course I saw it all, and I ran off as hard as my -feet would carry me to this man Breckinridge; but he had sold the -lot at once, and not one word would he tell me as to where they -had gone. You heard him yourselves to-night. Well, he has always -answered me like that. My sister thinks that I am going mad. -Sometimes I think that I am myself. And now--and now I am myself -a branded thief, without ever having touched the wealth for which -I sold my character. God help me! God help me!" He burst into -convulsive sobbing, with his face buried in his hands. - -There was a long silence, broken only by his heavy breathing and -by the measured tapping of Sherlock Holmes' finger-tips upon the -edge of the table. Then my friend rose and threw open the door. - -"Get out!" said he. - -"What, sir! Oh, Heaven bless you!" - -"No more words. Get out!" - -And no more words were needed. There was a rush, a clatter upon -the stairs, the bang of a door, and the crisp rattle of running -footfalls from the street. - -"After all, Watson," said Holmes, reaching up his hand for his -clay pipe, "I am not retained by the police to supply their -deficiencies. If Horner were in danger it would be another thing; -but this fellow will not appear against him, and the case must -collapse. I suppose that I am commuting a felony, but it is just -possible that I am saving a soul. This fellow will not go wrong -again; he is too terribly frightened. Send him to gaol now, and -you make him a gaol-bird for life. Besides, it is the season of -forgiveness. Chance has put in our way a most singular and -whimsical problem, and its solution is its own reward. If you -will have the goodness to touch the bell, Doctor, we will begin -another investigation, in which, also a bird will be the chief -feature." - - - -VIII. THE ADVENTURE OF THE SPECKLED BAND - -On glancing over my notes of the seventy odd cases in which I -have during the last eight years studied the methods of my friend -Sherlock Holmes, I find many tragic, some comic, a large number -merely strange, but none commonplace; for, working as he did -rather for the love of his art than for the acquirement of -wealth, he refused to associate himself with any investigation -which did not tend towards the unusual, and even the fantastic. -Of all these varied cases, however, I cannot recall any which -presented more singular features than that which was associated -with the well-known Surrey family of the Roylotts of Stoke Moran. -The events in question occurred in the early days of my -association with Holmes, when we were sharing rooms as bachelors -in Baker Street. It is possible that I might have placed them -upon record before, but a promise of secrecy was made at the -time, from which I have only been freed during the last month by -the untimely death of the lady to whom the pledge was given. It -is perhaps as well that the facts should now come to light, for I -have reasons to know that there are widespread rumours as to the -death of Dr. Grimesby Roylott which tend to make the matter even -more terrible than the truth. - -It was early in April in the year '83 that I woke one morning to -find Sherlock Holmes standing, fully dressed, by the side of my -bed. He was a late riser, as a rule, and as the clock on the -mantelpiece showed me that it was only a quarter-past seven, I -blinked up at him in some surprise, and perhaps just a little -resentment, for I was myself regular in my habits. - -"Very sorry to knock you up, Watson," said he, "but it's the -common lot this morning. Mrs. Hudson has been knocked up, she -retorted upon me, and I on you." - -"What is it, then--a fire?" - -"No; a client. It seems that a young lady has arrived in a -considerable state of excitement, who insists upon seeing me. She -is waiting now in the sitting-room. Now, when young ladies wander -about the metropolis at this hour of the morning, and knock -sleepy people up out of their beds, I presume that it is -something very pressing which they have to communicate. Should it -prove to be an interesting case, you would, I am sure, wish to -follow it from the outset. I thought, at any rate, that I should -call you and give you the chance." - -"My dear fellow, I would not miss it for anything." - -I had no keener pleasure than in following Holmes in his -professional investigations, and in admiring the rapid -deductions, as swift as intuitions, and yet always founded on a -logical basis with which he unravelled the problems which were -submitted to him. I rapidly threw on my clothes and was ready in -a few minutes to accompany my friend down to the sitting-room. A -lady dressed in black and heavily veiled, who had been sitting in -the window, rose as we entered. - -"Good-morning, madam," said Holmes cheerily. "My name is Sherlock -Holmes. This is my intimate friend and associate, Dr. Watson, -before whom you can speak as freely as before myself. Ha! I am -glad to see that Mrs. Hudson has had the good sense to light the -fire. Pray draw up to it, and I shall order you a cup of hot -coffee, for I observe that you are shivering." - -"It is not cold which makes me shiver," said the woman in a low -voice, changing her seat as requested. - -"What, then?" - -"It is fear, Mr. Holmes. It is terror." She raised her veil as -she spoke, and we could see that she was indeed in a pitiable -state of agitation, her face all drawn and grey, with restless -frightened eyes, like those of some hunted animal. Her features -and figure were those of a woman of thirty, but her hair was shot -with premature grey, and her expression was weary and haggard. -Sherlock Holmes ran her over with one of his quick, -all-comprehensive glances. - -"You must not fear," said he soothingly, bending forward and -patting her forearm. "We shall soon set matters right, I have no -doubt. You have come in by train this morning, I see." - -"You know me, then?" - -"No, but I observe the second half of a return ticket in the palm -of your left glove. You must have started early, and yet you had -a good drive in a dog-cart, along heavy roads, before you reached -the station." - -The lady gave a violent start and stared in bewilderment at my -companion. - -"There is no mystery, my dear madam," said he, smiling. "The left -arm of your jacket is spattered with mud in no less than seven -places. The marks are perfectly fresh. There is no vehicle save a -dog-cart which throws up mud in that way, and then only when you -sit on the left-hand side of the driver." - -"Whatever your reasons may be, you are perfectly correct," said -she. "I started from home before six, reached Leatherhead at -twenty past, and came in by the first train to Waterloo. Sir, I -can stand this strain no longer; I shall go mad if it continues. -I have no one to turn to--none, save only one, who cares for me, -and he, poor fellow, can be of little aid. I have heard of you, -Mr. Holmes; I have heard of you from Mrs. Farintosh, whom you -helped in the hour of her sore need. It was from her that I had -your address. Oh, sir, do you not think that you could help me, -too, and at least throw a little light through the dense darkness -which surrounds me? At present it is out of my power to reward -you for your services, but in a month or six weeks I shall be -married, with the control of my own income, and then at least you -shall not find me ungrateful." - -Holmes turned to his desk and, unlocking it, drew out a small -case-book, which he consulted. - -"Farintosh," said he. "Ah yes, I recall the case; it was -concerned with an opal tiara. I think it was before your time, -Watson. I can only say, madam, that I shall be happy to devote -the same care to your case as I did to that of your friend. As to -reward, my profession is its own reward; but you are at liberty -to defray whatever expenses I may be put to, at the time which -suits you best. And now I beg that you will lay before us -everything that may help us in forming an opinion upon the -matter." - -"Alas!" replied our visitor, "the very horror of my situation -lies in the fact that my fears are so vague, and my suspicions -depend so entirely upon small points, which might seem trivial to -another, that even he to whom of all others I have a right to -look for help and advice looks upon all that I tell him about it -as the fancies of a nervous woman. He does not say so, but I can -read it from his soothing answers and averted eyes. But I have -heard, Mr. Holmes, that you can see deeply into the manifold -wickedness of the human heart. You may advise me how to walk amid -the dangers which encompass me." - -"I am all attention, madam." - -"My name is Helen Stoner, and I am living with my stepfather, who -is the last survivor of one of the oldest Saxon families in -England, the Roylotts of Stoke Moran, on the western border of -Surrey." - -Holmes nodded his head. "The name is familiar to me," said he. - -"The family was at one time among the richest in England, and the -estates extended over the borders into Berkshire in the north, -and Hampshire in the west. In the last century, however, four -successive heirs were of a dissolute and wasteful disposition, -and the family ruin was eventually completed by a gambler in the -days of the Regency. Nothing was left save a few acres of ground, -and the two-hundred-year-old house, which is itself crushed under -a heavy mortgage. The last squire dragged out his existence -there, living the horrible life of an aristocratic pauper; but -his only son, my stepfather, seeing that he must adapt himself to -the new conditions, obtained an advance from a relative, which -enabled him to take a medical degree and went out to Calcutta, -where, by his professional skill and his force of character, he -established a large practice. In a fit of anger, however, caused -by some robberies which had been perpetrated in the house, he -beat his native butler to death and narrowly escaped a capital -sentence. As it was, he suffered a long term of imprisonment and -afterwards returned to England a morose and disappointed man. - -"When Dr. Roylott was in India he married my mother, Mrs. Stoner, -the young widow of Major-General Stoner, of the Bengal Artillery. -My sister Julia and I were twins, and we were only two years old -at the time of my mother's re-marriage. She had a considerable -sum of money--not less than 1000 pounds a year--and this she -bequeathed to Dr. Roylott entirely while we resided with him, -with a provision that a certain annual sum should be allowed to -each of us in the event of our marriage. Shortly after our return -to England my mother died--she was killed eight years ago in a -railway accident near Crewe. Dr. Roylott then abandoned his -attempts to establish himself in practice in London and took us -to live with him in the old ancestral house at Stoke Moran. The -money which my mother had left was enough for all our wants, and -there seemed to be no obstacle to our happiness. - -"But a terrible change came over our stepfather about this time. -Instead of making friends and exchanging visits with our -neighbours, who had at first been overjoyed to see a Roylott of -Stoke Moran back in the old family seat, he shut himself up in -his house and seldom came out save to indulge in ferocious -quarrels with whoever might cross his path. Violence of temper -approaching to mania has been hereditary in the men of the -family, and in my stepfather's case it had, I believe, been -intensified by his long residence in the tropics. A series of -disgraceful brawls took place, two of which ended in the -police-court, until at last he became the terror of the village, -and the folks would fly at his approach, for he is a man of -immense strength, and absolutely uncontrollable in his anger. - -"Last week he hurled the local blacksmith over a parapet into a -stream, and it was only by paying over all the money which I -could gather together that I was able to avert another public -exposure. He had no friends at all save the wandering gipsies, -and he would give these vagabonds leave to encamp upon the few -acres of bramble-covered land which represent the family estate, -and would accept in return the hospitality of their tents, -wandering away with them sometimes for weeks on end. He has a -passion also for Indian animals, which are sent over to him by a -correspondent, and he has at this moment a cheetah and a baboon, -which wander freely over his grounds and are feared by the -villagers almost as much as their master. - -"You can imagine from what I say that my poor sister Julia and I -had no great pleasure in our lives. No servant would stay with -us, and for a long time we did all the work of the house. She was -but thirty at the time of her death, and yet her hair had already -begun to whiten, even as mine has." - -"Your sister is dead, then?" - -"She died just two years ago, and it is of her death that I wish -to speak to you. You can understand that, living the life which I -have described, we were little likely to see anyone of our own -age and position. We had, however, an aunt, my mother's maiden -sister, Miss Honoria Westphail, who lives near Harrow, and we -were occasionally allowed to pay short visits at this lady's -house. Julia went there at Christmas two years ago, and met there -a half-pay major of marines, to whom she became engaged. My -stepfather learned of the engagement when my sister returned and -offered no objection to the marriage; but within a fortnight of -the day which had been fixed for the wedding, the terrible event -occurred which has deprived me of my only companion." - -Sherlock Holmes had been leaning back in his chair with his eyes -closed and his head sunk in a cushion, but he half opened his -lids now and glanced across at his visitor. - -"Pray be precise as to details," said he. - -"It is easy for me to be so, for every event of that dreadful -time is seared into my memory. The manor-house is, as I have -already said, very old, and only one wing is now inhabited. The -bedrooms in this wing are on the ground floor, the sitting-rooms -being in the central block of the buildings. Of these bedrooms -the first is Dr. Roylott's, the second my sister's, and the third -my own. There is no communication between them, but they all open -out into the same corridor. Do I make myself plain?" - -"Perfectly so." - -"The windows of the three rooms open out upon the lawn. That -fatal night Dr. Roylott had gone to his room early, though we -knew that he had not retired to rest, for my sister was troubled -by the smell of the strong Indian cigars which it was his custom -to smoke. She left her room, therefore, and came into mine, where -she sat for some time, chatting about her approaching wedding. At -eleven o'clock she rose to leave me, but she paused at the door -and looked back. - -"'Tell me, Helen,' said she, 'have you ever heard anyone whistle -in the dead of the night?' - -"'Never,' said I. - -"'I suppose that you could not possibly whistle, yourself, in -your sleep?' - -"'Certainly not. But why?' - -"'Because during the last few nights I have always, about three -in the morning, heard a low, clear whistle. I am a light sleeper, -and it has awakened me. I cannot tell where it came from--perhaps -from the next room, perhaps from the lawn. I thought that I would -just ask you whether you had heard it.' - -"'No, I have not. It must be those wretched gipsies in the -plantation.' - -"'Very likely. And yet if it were on the lawn, I wonder that you -did not hear it also.' - -"'Ah, but I sleep more heavily than you.' - -"'Well, it is of no great consequence, at any rate.' She smiled -back at me, closed my door, and a few moments later I heard her -key turn in the lock." - -"Indeed," said Holmes. "Was it your custom always to lock -yourselves in at night?" - -"Always." - -"And why?" - -"I think that I mentioned to you that the doctor kept a cheetah -and a baboon. We had no feeling of security unless our doors were -locked." - -"Quite so. Pray proceed with your statement." - -"I could not sleep that night. A vague feeling of impending -misfortune impressed me. My sister and I, you will recollect, -were twins, and you know how subtle are the links which bind two -souls which are so closely allied. It was a wild night. The wind -was howling outside, and the rain was beating and splashing -against the windows. Suddenly, amid all the hubbub of the gale, -there burst forth the wild scream of a terrified woman. I knew -that it was my sister's voice. I sprang from my bed, wrapped a -shawl round me, and rushed into the corridor. As I opened my door -I seemed to hear a low whistle, such as my sister described, and -a few moments later a clanging sound, as if a mass of metal had -fallen. As I ran down the passage, my sister's door was unlocked, -and revolved slowly upon its hinges. I stared at it -horror-stricken, not knowing what was about to issue from it. By -the light of the corridor-lamp I saw my sister appear at the -opening, her face blanched with terror, her hands groping for -help, her whole figure swaying to and fro like that of a -drunkard. I ran to her and threw my arms round her, but at that -moment her knees seemed to give way and she fell to the ground. -She writhed as one who is in terrible pain, and her limbs were -dreadfully convulsed. At first I thought that she had not -recognised me, but as I bent over her she suddenly shrieked out -in a voice which I shall never forget, 'Oh, my God! Helen! It was -the band! The speckled band!' There was something else which she -would fain have said, and she stabbed with her finger into the -air in the direction of the doctor's room, but a fresh convulsion -seized her and choked her words. I rushed out, calling loudly for -my stepfather, and I met him hastening from his room in his -dressing-gown. When he reached my sister's side she was -unconscious, and though he poured brandy down her throat and sent -for medical aid from the village, all efforts were in vain, for -she slowly sank and died without having recovered her -consciousness. Such was the dreadful end of my beloved sister." - -"One moment," said Holmes, "are you sure about this whistle and -metallic sound? Could you swear to it?" - -"That was what the county coroner asked me at the inquiry. It is -my strong impression that I heard it, and yet, among the crash of -the gale and the creaking of an old house, I may possibly have -been deceived." - -"Was your sister dressed?" - -"No, she was in her night-dress. In her right hand was found the -charred stump of a match, and in her left a match-box." - -"Showing that she had struck a light and looked about her when -the alarm took place. That is important. And what conclusions did -the coroner come to?" - -"He investigated the case with great care, for Dr. Roylott's -conduct had long been notorious in the county, but he was unable -to find any satisfactory cause of death. My evidence showed that -the door had been fastened upon the inner side, and the windows -were blocked by old-fashioned shutters with broad iron bars, -which were secured every night. The walls were carefully sounded, -and were shown to be quite solid all round, and the flooring was -also thoroughly examined, with the same result. The chimney is -wide, but is barred up by four large staples. It is certain, -therefore, that my sister was quite alone when she met her end. -Besides, there were no marks of any violence upon her." - -"How about poison?" - -"The doctors examined her for it, but without success." - -"What do you think that this unfortunate lady died of, then?" - -"It is my belief that she died of pure fear and nervous shock, -though what it was that frightened her I cannot imagine." - -"Were there gipsies in the plantation at the time?" - -"Yes, there are nearly always some there." - -"Ah, and what did you gather from this allusion to a band--a -speckled band?" - -"Sometimes I have thought that it was merely the wild talk of -delirium, sometimes that it may have referred to some band of -people, perhaps to these very gipsies in the plantation. I do not -know whether the spotted handkerchiefs which so many of them wear -over their heads might have suggested the strange adjective which -she used." - -Holmes shook his head like a man who is far from being satisfied. - -"These are very deep waters," said he; "pray go on with your -narrative." - -"Two years have passed since then, and my life has been until -lately lonelier than ever. A month ago, however, a dear friend, -whom I have known for many years, has done me the honour to ask -my hand in marriage. His name is Armitage--Percy Armitage--the -second son of Mr. Armitage, of Crane Water, near Reading. My -stepfather has offered no opposition to the match, and we are to -be married in the course of the spring. Two days ago some repairs -were started in the west wing of the building, and my bedroom -wall has been pierced, so that I have had to move into the -chamber in which my sister died, and to sleep in the very bed in -which she slept. Imagine, then, my thrill of terror when last -night, as I lay awake, thinking over her terrible fate, I -suddenly heard in the silence of the night the low whistle which -had been the herald of her own death. I sprang up and lit the -lamp, but nothing was to be seen in the room. I was too shaken to -go to bed again, however, so I dressed, and as soon as it was -daylight I slipped down, got a dog-cart at the Crown Inn, which -is opposite, and drove to Leatherhead, from whence I have come on -this morning with the one object of seeing you and asking your -advice." - -"You have done wisely," said my friend. "But have you told me -all?" - -"Yes, all." - -"Miss Roylott, you have not. You are screening your stepfather." - -"Why, what do you mean?" - -For answer Holmes pushed back the frill of black lace which -fringed the hand that lay upon our visitor's knee. Five little -livid spots, the marks of four fingers and a thumb, were printed -upon the white wrist. - -"You have been cruelly used," said Holmes. - -The lady coloured deeply and covered over her injured wrist. "He -is a hard man," she said, "and perhaps he hardly knows his own -strength." - -There was a long silence, during which Holmes leaned his chin -upon his hands and stared into the crackling fire. - -"This is a very deep business," he said at last. "There are a -thousand details which I should desire to know before I decide -upon our course of action. Yet we have not a moment to lose. If -we were to come to Stoke Moran to-day, would it be possible for -us to see over these rooms without the knowledge of your -stepfather?" - -"As it happens, he spoke of coming into town to-day upon some -most important business. It is probable that he will be away all -day, and that there would be nothing to disturb you. We have a -housekeeper now, but she is old and foolish, and I could easily -get her out of the way." - -"Excellent. You are not averse to this trip, Watson?" - -"By no means." - -"Then we shall both come. What are you going to do yourself?" - -"I have one or two things which I would wish to do now that I am -in town. But I shall return by the twelve o'clock train, so as to -be there in time for your coming." - -"And you may expect us early in the afternoon. I have myself some -small business matters to attend to. Will you not wait and -breakfast?" - -"No, I must go. My heart is lightened already since I have -confided my trouble to you. I shall look forward to seeing you -again this afternoon." She dropped her thick black veil over her -face and glided from the room. - -"And what do you think of it all, Watson?" asked Sherlock Holmes, -leaning back in his chair. - -"It seems to me to be a most dark and sinister business." - -"Dark enough and sinister enough." - -"Yet if the lady is correct in saying that the flooring and walls -are sound, and that the door, window, and chimney are impassable, -then her sister must have been undoubtedly alone when she met her -mysterious end." - -"What becomes, then, of these nocturnal whistles, and what of the -very peculiar words of the dying woman?" - -"I cannot think." - -"When you combine the ideas of whistles at night, the presence of -a band of gipsies who are on intimate terms with this old doctor, -the fact that we have every reason to believe that the doctor has -an interest in preventing his stepdaughter's marriage, the dying -allusion to a band, and, finally, the fact that Miss Helen Stoner -heard a metallic clang, which might have been caused by one of -those metal bars that secured the shutters falling back into its -place, I think that there is good ground to think that the -mystery may be cleared along those lines." - -"But what, then, did the gipsies do?" - -"I cannot imagine." - -"I see many objections to any such theory." - -"And so do I. It is precisely for that reason that we are going -to Stoke Moran this day. I want to see whether the objections are -fatal, or if they may be explained away. But what in the name of -the devil!" - -The ejaculation had been drawn from my companion by the fact that -our door had been suddenly dashed open, and that a huge man had -framed himself in the aperture. His costume was a peculiar -mixture of the professional and of the agricultural, having a -black top-hat, a long frock-coat, and a pair of high gaiters, -with a hunting-crop swinging in his hand. So tall was he that his -hat actually brushed the cross bar of the doorway, and his -breadth seemed to span it across from side to side. A large face, -seared with a thousand wrinkles, burned yellow with the sun, and -marked with every evil passion, was turned from one to the other -of us, while his deep-set, bile-shot eyes, and his high, thin, -fleshless nose, gave him somewhat the resemblance to a fierce old -bird of prey. - -"Which of you is Holmes?" asked this apparition. - -"My name, sir; but you have the advantage of me," said my -companion quietly. - -"I am Dr. Grimesby Roylott, of Stoke Moran." - -"Indeed, Doctor," said Holmes blandly. "Pray take a seat." - -"I will do nothing of the kind. My stepdaughter has been here. I -have traced her. What has she been saying to you?" - -"It is a little cold for the time of the year," said Holmes. - -"What has she been saying to you?" screamed the old man -furiously. - -"But I have heard that the crocuses promise well," continued my -companion imperturbably. - -"Ha! You put me off, do you?" said our new visitor, taking a step -forward and shaking his hunting-crop. "I know you, you scoundrel! -I have heard of you before. You are Holmes, the meddler." - -My friend smiled. - -"Holmes, the busybody!" - -His smile broadened. - -"Holmes, the Scotland Yard Jack-in-office!" - -Holmes chuckled heartily. "Your conversation is most -entertaining," said he. "When you go out close the door, for -there is a decided draught." - -"I will go when I have said my say. Don't you dare to meddle with -my affairs. I know that Miss Stoner has been here. I traced her! -I am a dangerous man to fall foul of! See here." He stepped -swiftly forward, seized the poker, and bent it into a curve with -his huge brown hands. - -"See that you keep yourself out of my grip," he snarled, and -hurling the twisted poker into the fireplace he strode out of the -room. - -"He seems a very amiable person," said Holmes, laughing. "I am -not quite so bulky, but if he had remained I might have shown him -that my grip was not much more feeble than his own." As he spoke -he picked up the steel poker and, with a sudden effort, -straightened it out again. - -"Fancy his having the insolence to confound me with the official -detective force! This incident gives zest to our investigation, -however, and I only trust that our little friend will not suffer -from her imprudence in allowing this brute to trace her. And now, -Watson, we shall order breakfast, and afterwards I shall walk -down to Doctors' Commons, where I hope to get some data which may -help us in this matter." - - -It was nearly one o'clock when Sherlock Holmes returned from his -excursion. He held in his hand a sheet of blue paper, scrawled -over with notes and figures. - -"I have seen the will of the deceased wife," said he. "To -determine its exact meaning I have been obliged to work out the -present prices of the investments with which it is concerned. The -total income, which at the time of the wife's death was little -short of 1100 pounds, is now, through the fall in agricultural -prices, not more than 750 pounds. Each daughter can claim an -income of 250 pounds, in case of marriage. It is evident, -therefore, that if both girls had married, this beauty would have -had a mere pittance, while even one of them would cripple him to -a very serious extent. My morning's work has not been wasted, -since it has proved that he has the very strongest motives for -standing in the way of anything of the sort. And now, Watson, -this is too serious for dawdling, especially as the old man is -aware that we are interesting ourselves in his affairs; so if you -are ready, we shall call a cab and drive to Waterloo. I should be -very much obliged if you would slip your revolver into your -pocket. An Eley's No. 2 is an excellent argument with gentlemen -who can twist steel pokers into knots. That and a tooth-brush -are, I think, all that we need." - -At Waterloo we were fortunate in catching a train for -Leatherhead, where we hired a trap at the station inn and drove -for four or five miles through the lovely Surrey lanes. It was a -perfect day, with a bright sun and a few fleecy clouds in the -heavens. The trees and wayside hedges were just throwing out -their first green shoots, and the air was full of the pleasant -smell of the moist earth. To me at least there was a strange -contrast between the sweet promise of the spring and this -sinister quest upon which we were engaged. My companion sat in -the front of the trap, his arms folded, his hat pulled down over -his eyes, and his chin sunk upon his breast, buried in the -deepest thought. Suddenly, however, he started, tapped me on the -shoulder, and pointed over the meadows. - -"Look there!" said he. - -A heavily timbered park stretched up in a gentle slope, -thickening into a grove at the highest point. From amid the -branches there jutted out the grey gables and high roof-tree of a -very old mansion. - -"Stoke Moran?" said he. - -"Yes, sir, that be the house of Dr. Grimesby Roylott," remarked -the driver. - -"There is some building going on there," said Holmes; "that is -where we are going." - -"There's the village," said the driver, pointing to a cluster of -roofs some distance to the left; "but if you want to get to the -house, you'll find it shorter to get over this stile, and so by -the foot-path over the fields. There it is, where the lady is -walking." - -"And the lady, I fancy, is Miss Stoner," observed Holmes, shading -his eyes. "Yes, I think we had better do as you suggest." - -We got off, paid our fare, and the trap rattled back on its way -to Leatherhead. - -"I thought it as well," said Holmes as we climbed the stile, -"that this fellow should think we had come here as architects, or -on some definite business. It may stop his gossip. -Good-afternoon, Miss Stoner. You see that we have been as good as -our word." - -Our client of the morning had hurried forward to meet us with a -face which spoke her joy. "I have been waiting so eagerly for -you," she cried, shaking hands with us warmly. "All has turned -out splendidly. Dr. Roylott has gone to town, and it is unlikely -that he will be back before evening." - -"We have had the pleasure of making the doctor's acquaintance," -said Holmes, and in a few words he sketched out what had -occurred. Miss Stoner turned white to the lips as she listened. - -"Good heavens!" she cried, "he has followed me, then." - -"So it appears." - -"He is so cunning that I never know when I am safe from him. What -will he say when he returns?" - -"He must guard himself, for he may find that there is someone -more cunning than himself upon his track. You must lock yourself -up from him to-night. If he is violent, we shall take you away to -your aunt's at Harrow. Now, we must make the best use of our -time, so kindly take us at once to the rooms which we are to -examine." - -The building was of grey, lichen-blotched stone, with a high -central portion and two curving wings, like the claws of a crab, -thrown out on each side. In one of these wings the windows were -broken and blocked with wooden boards, while the roof was partly -caved in, a picture of ruin. The central portion was in little -better repair, but the right-hand block was comparatively modern, -and the blinds in the windows, with the blue smoke curling up -from the chimneys, showed that this was where the family resided. -Some scaffolding had been erected against the end wall, and the -stone-work had been broken into, but there were no signs of any -workmen at the moment of our visit. Holmes walked slowly up and -down the ill-trimmed lawn and examined with deep attention the -outsides of the windows. - -"This, I take it, belongs to the room in which you used to sleep, -the centre one to your sister's, and the one next to the main -building to Dr. Roylott's chamber?" - -"Exactly so. But I am now sleeping in the middle one." - -"Pending the alterations, as I understand. By the way, there does -not seem to be any very pressing need for repairs at that end -wall." - -"There were none. I believe that it was an excuse to move me from -my room." - -"Ah! that is suggestive. Now, on the other side of this narrow -wing runs the corridor from which these three rooms open. There -are windows in it, of course?" - -"Yes, but very small ones. Too narrow for anyone to pass -through." - -"As you both locked your doors at night, your rooms were -unapproachable from that side. Now, would you have the kindness -to go into your room and bar your shutters?" - -Miss Stoner did so, and Holmes, after a careful examination -through the open window, endeavoured in every way to force the -shutter open, but without success. There was no slit through -which a knife could be passed to raise the bar. Then with his -lens he tested the hinges, but they were of solid iron, built -firmly into the massive masonry. "Hum!" said he, scratching his -chin in some perplexity, "my theory certainly presents some -difficulties. No one could pass these shutters if they were -bolted. Well, we shall see if the inside throws any light upon -the matter." - -A small side door led into the whitewashed corridor from which -the three bedrooms opened. Holmes refused to examine the third -chamber, so we passed at once to the second, that in which Miss -Stoner was now sleeping, and in which her sister had met with her -fate. It was a homely little room, with a low ceiling and a -gaping fireplace, after the fashion of old country-houses. A -brown chest of drawers stood in one corner, a narrow -white-counterpaned bed in another, and a dressing-table on the -left-hand side of the window. These articles, with two small -wicker-work chairs, made up all the furniture in the room save -for a square of Wilton carpet in the centre. The boards round and -the panelling of the walls were of brown, worm-eaten oak, so old -and discoloured that it may have dated from the original building -of the house. Holmes drew one of the chairs into a corner and sat -silent, while his eyes travelled round and round and up and down, -taking in every detail of the apartment. - -"Where does that bell communicate with?" he asked at last -pointing to a thick bell-rope which hung down beside the bed, the -tassel actually lying upon the pillow. - -"It goes to the housekeeper's room." - -"It looks newer than the other things?" - -"Yes, it was only put there a couple of years ago." - -"Your sister asked for it, I suppose?" - -"No, I never heard of her using it. We used always to get what we -wanted for ourselves." - -"Indeed, it seemed unnecessary to put so nice a bell-pull there. -You will excuse me for a few minutes while I satisfy myself as to -this floor." He threw himself down upon his face with his lens in -his hand and crawled swiftly backward and forward, examining -minutely the cracks between the boards. Then he did the same with -the wood-work with which the chamber was panelled. Finally he -walked over to the bed and spent some time in staring at it and -in running his eye up and down the wall. Finally he took the -bell-rope in his hand and gave it a brisk tug. - -"Why, it's a dummy," said he. - -"Won't it ring?" - -"No, it is not even attached to a wire. This is very interesting. -You can see now that it is fastened to a hook just above where -the little opening for the ventilator is." - -"How very absurd! I never noticed that before." - -"Very strange!" muttered Holmes, pulling at the rope. "There are -one or two very singular points about this room. For example, -what a fool a builder must be to open a ventilator into another -room, when, with the same trouble, he might have communicated -with the outside air!" - -"That is also quite modern," said the lady. - -"Done about the same time as the bell-rope?" remarked Holmes. - -"Yes, there were several little changes carried out about that -time." - -"They seem to have been of a most interesting character--dummy -bell-ropes, and ventilators which do not ventilate. With your -permission, Miss Stoner, we shall now carry our researches into -the inner apartment." - -Dr. Grimesby Roylott's chamber was larger than that of his -step-daughter, but was as plainly furnished. A camp-bed, a small -wooden shelf full of books, mostly of a technical character, an -armchair beside the bed, a plain wooden chair against the wall, a -round table, and a large iron safe were the principal things -which met the eye. Holmes walked slowly round and examined each -and all of them with the keenest interest. - -"What's in here?" he asked, tapping the safe. - -"My stepfather's business papers." - -"Oh! you have seen inside, then?" - -"Only once, some years ago. I remember that it was full of -papers." - -"There isn't a cat in it, for example?" - -"No. What a strange idea!" - -"Well, look at this!" He took up a small saucer of milk which -stood on the top of it. - -"No; we don't keep a cat. But there is a cheetah and a baboon." - -"Ah, yes, of course! Well, a cheetah is just a big cat, and yet a -saucer of milk does not go very far in satisfying its wants, I -daresay. There is one point which I should wish to determine." He -squatted down in front of the wooden chair and examined the seat -of it with the greatest attention. - -"Thank you. That is quite settled," said he, rising and putting -his lens in his pocket. "Hullo! Here is something interesting!" - -The object which had caught his eye was a small dog lash hung on -one corner of the bed. The lash, however, was curled upon itself -and tied so as to make a loop of whipcord. - -"What do you make of that, Watson?" - -"It's a common enough lash. But I don't know why it should be -tied." - -"That is not quite so common, is it? Ah, me! it's a wicked world, -and when a clever man turns his brains to crime it is the worst -of all. I think that I have seen enough now, Miss Stoner, and -with your permission we shall walk out upon the lawn." - -I had never seen my friend's face so grim or his brow so dark as -it was when we turned from the scene of this investigation. We -had walked several times up and down the lawn, neither Miss -Stoner nor myself liking to break in upon his thoughts before he -roused himself from his reverie. - -"It is very essential, Miss Stoner," said he, "that you should -absolutely follow my advice in every respect." - -"I shall most certainly do so." - -"The matter is too serious for any hesitation. Your life may -depend upon your compliance." - -"I assure you that I am in your hands." - -"In the first place, both my friend and I must spend the night in -your room." - -Both Miss Stoner and I gazed at him in astonishment. - -"Yes, it must be so. Let me explain. I believe that that is the -village inn over there?" - -"Yes, that is the Crown." - -"Very good. Your windows would be visible from there?" - -"Certainly." - -"You must confine yourself to your room, on pretence of a -headache, when your stepfather comes back. Then when you hear him -retire for the night, you must open the shutters of your window, -undo the hasp, put your lamp there as a signal to us, and then -withdraw quietly with everything which you are likely to want -into the room which you used to occupy. I have no doubt that, in -spite of the repairs, you could manage there for one night." - -"Oh, yes, easily." - -"The rest you will leave in our hands." - -"But what will you do?" - -"We shall spend the night in your room, and we shall investigate -the cause of this noise which has disturbed you." - -"I believe, Mr. Holmes, that you have already made up your mind," -said Miss Stoner, laying her hand upon my companion's sleeve. - -"Perhaps I have." - -"Then, for pity's sake, tell me what was the cause of my sister's -death." - -"I should prefer to have clearer proofs before I speak." - -"You can at least tell me whether my own thought is correct, and -if she died from some sudden fright." - -"No, I do not think so. I think that there was probably some more -tangible cause. And now, Miss Stoner, we must leave you for if -Dr. Roylott returned and saw us our journey would be in vain. -Good-bye, and be brave, for if you will do what I have told you, -you may rest assured that we shall soon drive away the dangers -that threaten you." - -Sherlock Holmes and I had no difficulty in engaging a bedroom and -sitting-room at the Crown Inn. They were on the upper floor, and -from our window we could command a view of the avenue gate, and -of the inhabited wing of Stoke Moran Manor House. At dusk we saw -Dr. Grimesby Roylott drive past, his huge form looming up beside -the little figure of the lad who drove him. The boy had some -slight difficulty in undoing the heavy iron gates, and we heard -the hoarse roar of the doctor's voice and saw the fury with which -he shook his clinched fists at him. The trap drove on, and a few -minutes later we saw a sudden light spring up among the trees as -the lamp was lit in one of the sitting-rooms. - -"Do you know, Watson," said Holmes as we sat together in the -gathering darkness, "I have really some scruples as to taking you -to-night. There is a distinct element of danger." - -"Can I be of assistance?" - -"Your presence might be invaluable." - -"Then I shall certainly come." - -"It is very kind of you." - -"You speak of danger. You have evidently seen more in these rooms -than was visible to me." - -"No, but I fancy that I may have deduced a little more. I imagine -that you saw all that I did." - -"I saw nothing remarkable save the bell-rope, and what purpose -that could answer I confess is more than I can imagine." - -"You saw the ventilator, too?" - -"Yes, but I do not think that it is such a very unusual thing to -have a small opening between two rooms. It was so small that a -rat could hardly pass through." - -"I knew that we should find a ventilator before ever we came to -Stoke Moran." - -"My dear Holmes!" - -"Oh, yes, I did. You remember in her statement she said that her -sister could smell Dr. Roylott's cigar. Now, of course that -suggested at once that there must be a communication between the -two rooms. It could only be a small one, or it would have been -remarked upon at the coroner's inquiry. I deduced a ventilator." - -"But what harm can there be in that?" - -"Well, there is at least a curious coincidence of dates. A -ventilator is made, a cord is hung, and a lady who sleeps in the -bed dies. Does not that strike you?" - -"I cannot as yet see any connection." - -"Did you observe anything very peculiar about that bed?" - -"No." - -"It was clamped to the floor. Did you ever see a bed fastened -like that before?" - -"I cannot say that I have." - -"The lady could not move her bed. It must always be in the same -relative position to the ventilator and to the rope--or so we may -call it, since it was clearly never meant for a bell-pull." - -"Holmes," I cried, "I seem to see dimly what you are hinting at. -We are only just in time to prevent some subtle and horrible -crime." - -"Subtle enough and horrible enough. When a doctor does go wrong -he is the first of criminals. He has nerve and he has knowledge. -Palmer and Pritchard were among the heads of their profession. -This man strikes even deeper, but I think, Watson, that we shall -be able to strike deeper still. But we shall have horrors enough -before the night is over; for goodness' sake let us have a quiet -pipe and turn our minds for a few hours to something more -cheerful." - - -About nine o'clock the light among the trees was extinguished, -and all was dark in the direction of the Manor House. Two hours -passed slowly away, and then, suddenly, just at the stroke of -eleven, a single bright light shone out right in front of us. - -"That is our signal," said Holmes, springing to his feet; "it -comes from the middle window." - -As we passed out he exchanged a few words with the landlord, -explaining that we were going on a late visit to an acquaintance, -and that it was possible that we might spend the night there. A -moment later we were out on the dark road, a chill wind blowing -in our faces, and one yellow light twinkling in front of us -through the gloom to guide us on our sombre errand. - -There was little difficulty in entering the grounds, for -unrepaired breaches gaped in the old park wall. Making our way -among the trees, we reached the lawn, crossed it, and were about -to enter through the window when out from a clump of laurel -bushes there darted what seemed to be a hideous and distorted -child, who threw itself upon the grass with writhing limbs and -then ran swiftly across the lawn into the darkness. - -"My God!" I whispered; "did you see it?" - -Holmes was for the moment as startled as I. His hand closed like -a vice upon my wrist in his agitation. Then he broke into a low -laugh and put his lips to my ear. - -"It is a nice household," he murmured. "That is the baboon." - -I had forgotten the strange pets which the doctor affected. There -was a cheetah, too; perhaps we might find it upon our shoulders -at any moment. I confess that I felt easier in my mind when, -after following Holmes' example and slipping off my shoes, I -found myself inside the bedroom. My companion noiselessly closed -the shutters, moved the lamp onto the table, and cast his eyes -round the room. All was as we had seen it in the daytime. Then -creeping up to me and making a trumpet of his hand, he whispered -into my ear again so gently that it was all that I could do to -distinguish the words: - -"The least sound would be fatal to our plans." - -I nodded to show that I had heard. - -"We must sit without light. He would see it through the -ventilator." - -I nodded again. - -"Do not go asleep; your very life may depend upon it. Have your -pistol ready in case we should need it. I will sit on the side of -the bed, and you in that chair." - -I took out my revolver and laid it on the corner of the table. - -Holmes had brought up a long thin cane, and this he placed upon -the bed beside him. By it he laid the box of matches and the -stump of a candle. Then he turned down the lamp, and we were left -in darkness. - -How shall I ever forget that dreadful vigil? I could not hear a -sound, not even the drawing of a breath, and yet I knew that my -companion sat open-eyed, within a few feet of me, in the same -state of nervous tension in which I was myself. The shutters cut -off the least ray of light, and we waited in absolute darkness. - -From outside came the occasional cry of a night-bird, and once at -our very window a long drawn catlike whine, which told us that -the cheetah was indeed at liberty. Far away we could hear the -deep tones of the parish clock, which boomed out every quarter of -an hour. How long they seemed, those quarters! Twelve struck, and -one and two and three, and still we sat waiting silently for -whatever might befall. - -Suddenly there was the momentary gleam of a light up in the -direction of the ventilator, which vanished immediately, but was -succeeded by a strong smell of burning oil and heated metal. -Someone in the next room had lit a dark-lantern. I heard a gentle -sound of movement, and then all was silent once more, though the -smell grew stronger. For half an hour I sat with straining ears. -Then suddenly another sound became audible--a very gentle, -soothing sound, like that of a small jet of steam escaping -continually from a kettle. The instant that we heard it, Holmes -sprang from the bed, struck a match, and lashed furiously with -his cane at the bell-pull. - -"You see it, Watson?" he yelled. "You see it?" - -But I saw nothing. At the moment when Holmes struck the light I -heard a low, clear whistle, but the sudden glare flashing into my -weary eyes made it impossible for me to tell what it was at which -my friend lashed so savagely. I could, however, see that his face -was deadly pale and filled with horror and loathing. He had -ceased to strike and was gazing up at the ventilator when -suddenly there broke from the silence of the night the most -horrible cry to which I have ever listened. It swelled up louder -and louder, a hoarse yell of pain and fear and anger all mingled -in the one dreadful shriek. They say that away down in the -village, and even in the distant parsonage, that cry raised the -sleepers from their beds. It struck cold to our hearts, and I -stood gazing at Holmes, and he at me, until the last echoes of it -had died away into the silence from which it rose. - -"What can it mean?" I gasped. - -"It means that it is all over," Holmes answered. "And perhaps, -after all, it is for the best. Take your pistol, and we will -enter Dr. Roylott's room." - -With a grave face he lit the lamp and led the way down the -corridor. Twice he struck at the chamber door without any reply -from within. Then he turned the handle and entered, I at his -heels, with the cocked pistol in my hand. - -It was a singular sight which met our eyes. On the table stood a -dark-lantern with the shutter half open, throwing a brilliant -beam of light upon the iron safe, the door of which was ajar. -Beside this table, on the wooden chair, sat Dr. Grimesby Roylott -clad in a long grey dressing-gown, his bare ankles protruding -beneath, and his feet thrust into red heelless Turkish slippers. -Across his lap lay the short stock with the long lash which we -had noticed during the day. His chin was cocked upward and his -eyes were fixed in a dreadful, rigid stare at the corner of the -ceiling. Round his brow he had a peculiar yellow band, with -brownish speckles, which seemed to be bound tightly round his -head. As we entered he made neither sound nor motion. - -"The band! the speckled band!" whispered Holmes. - -I took a step forward. In an instant his strange headgear began -to move, and there reared itself from among his hair the squat -diamond-shaped head and puffed neck of a loathsome serpent. - -"It is a swamp adder!" cried Holmes; "the deadliest snake in -India. He has died within ten seconds of being bitten. Violence -does, in truth, recoil upon the violent, and the schemer falls -into the pit which he digs for another. Let us thrust this -creature back into its den, and we can then remove Miss Stoner to -some place of shelter and let the county police know what has -happened." - -As he spoke he drew the dog-whip swiftly from the dead man's lap, -and throwing the noose round the reptile's neck he drew it from -its horrid perch and, carrying it at arm's length, threw it into -the iron safe, which he closed upon it. - -Such are the true facts of the death of Dr. Grimesby Roylott, of -Stoke Moran. It is not necessary that I should prolong a -narrative which has already run to too great a length by telling -how we broke the sad news to the terrified girl, how we conveyed -her by the morning train to the care of her good aunt at Harrow, -of how the slow process of official inquiry came to the -conclusion that the doctor met his fate while indiscreetly -playing with a dangerous pet. The little which I had yet to learn -of the case was told me by Sherlock Holmes as we travelled back -next day. - -"I had," said he, "come to an entirely erroneous conclusion which -shows, my dear Watson, how dangerous it always is to reason from -insufficient data. The presence of the gipsies, and the use of -the word 'band,' which was used by the poor girl, no doubt, to -explain the appearance which she had caught a hurried glimpse of -by the light of her match, were sufficient to put me upon an -entirely wrong scent. I can only claim the merit that I instantly -reconsidered my position when, however, it became clear to me -that whatever danger threatened an occupant of the room could not -come either from the window or the door. My attention was -speedily drawn, as I have already remarked to you, to this -ventilator, and to the bell-rope which hung down to the bed. The -discovery that this was a dummy, and that the bed was clamped to -the floor, instantly gave rise to the suspicion that the rope was -there as a bridge for something passing through the hole and -coming to the bed. The idea of a snake instantly occurred to me, -and when I coupled it with my knowledge that the doctor was -furnished with a supply of creatures from India, I felt that I -was probably on the right track. The idea of using a form of -poison which could not possibly be discovered by any chemical -test was just such a one as would occur to a clever and ruthless -man who had had an Eastern training. The rapidity with which such -a poison would take effect would also, from his point of view, be -an advantage. It would be a sharp-eyed coroner, indeed, who could -distinguish the two little dark punctures which would show where -the poison fangs had done their work. Then I thought of the -whistle. Of course he must recall the snake before the morning -light revealed it to the victim. He had trained it, probably by -the use of the milk which we saw, to return to him when summoned. -He would put it through this ventilator at the hour that he -thought best, with the certainty that it would crawl down the -rope and land on the bed. It might or might not bite the -occupant, perhaps she might escape every night for a week, but -sooner or later she must fall a victim. - -"I had come to these conclusions before ever I had entered his -room. An inspection of his chair showed me that he had been in -the habit of standing on it, which of course would be necessary -in order that he should reach the ventilator. The sight of the -safe, the saucer of milk, and the loop of whipcord were enough to -finally dispel any doubts which may have remained. The metallic -clang heard by Miss Stoner was obviously caused by her stepfather -hastily closing the door of his safe upon its terrible occupant. -Having once made up my mind, you know the steps which I took in -order to put the matter to the proof. I heard the creature hiss -as I have no doubt that you did also, and I instantly lit the -light and attacked it." - -"With the result of driving it through the ventilator." - -"And also with the result of causing it to turn upon its master -at the other side. Some of the blows of my cane came home and -roused its snakish temper, so that it flew upon the first person -it saw. In this way I am no doubt indirectly responsible for Dr. -Grimesby Roylott's death, and I cannot say that it is likely to -weigh very heavily upon my conscience." - - - -IX. THE ADVENTURE OF THE ENGINEER'S THUMB - -Of all the problems which have been submitted to my friend, Mr. -Sherlock Holmes, for solution during the years of our intimacy, -there were only two which I was the means of introducing to his -notice--that of Mr. Hatherley's thumb, and that of Colonel -Warburton's madness. Of these the latter may have afforded a -finer field for an acute and original observer, but the other was -so strange in its inception and so dramatic in its details that -it may be the more worthy of being placed upon record, even if it -gave my friend fewer openings for those deductive methods of -reasoning by which he achieved such remarkable results. The story -has, I believe, been told more than once in the newspapers, but, -like all such narratives, its effect is much less striking when -set forth en bloc in a single half-column of print than when the -facts slowly evolve before your own eyes, and the mystery clears -gradually away as each new discovery furnishes a step which leads -on to the complete truth. At the time the circumstances made a -deep impression upon me, and the lapse of two years has hardly -served to weaken the effect. - -It was in the summer of '89, not long after my marriage, that the -events occurred which I am now about to summarise. I had returned -to civil practice and had finally abandoned Holmes in his Baker -Street rooms, although I continually visited him and occasionally -even persuaded him to forgo his Bohemian habits so far as to come -and visit us. My practice had steadily increased, and as I -happened to live at no very great distance from Paddington -Station, I got a few patients from among the officials. One of -these, whom I had cured of a painful and lingering disease, was -never weary of advertising my virtues and of endeavouring to send -me on every sufferer over whom he might have any influence. - -One morning, at a little before seven o'clock, I was awakened by -the maid tapping at the door to announce that two men had come -from Paddington and were waiting in the consulting-room. I -dressed hurriedly, for I knew by experience that railway cases -were seldom trivial, and hastened downstairs. As I descended, my -old ally, the guard, came out of the room and closed the door -tightly behind him. - -"I've got him here," he whispered, jerking his thumb over his -shoulder; "he's all right." - -"What is it, then?" I asked, for his manner suggested that it was -some strange creature which he had caged up in my room. - -"It's a new patient," he whispered. "I thought I'd bring him -round myself; then he couldn't slip away. There he is, all safe -and sound. I must go now, Doctor; I have my dooties, just the -same as you." And off he went, this trusty tout, without even -giving me time to thank him. - -I entered my consulting-room and found a gentleman seated by the -table. He was quietly dressed in a suit of heather tweed with a -soft cloth cap which he had laid down upon my books. Round one of -his hands he had a handkerchief wrapped, which was mottled all -over with bloodstains. He was young, not more than -five-and-twenty, I should say, with a strong, masculine face; but -he was exceedingly pale and gave me the impression of a man who -was suffering from some strong agitation, which it took all his -strength of mind to control. - -"I am sorry to knock you up so early, Doctor," said he, "but I -have had a very serious accident during the night. I came in by -train this morning, and on inquiring at Paddington as to where I -might find a doctor, a worthy fellow very kindly escorted me -here. I gave the maid a card, but I see that she has left it upon -the side-table." - -I took it up and glanced at it. "Mr. Victor Hatherley, hydraulic -engineer, 16A, Victoria Street (3rd floor)." That was the name, -style, and abode of my morning visitor. "I regret that I have -kept you waiting," said I, sitting down in my library-chair. "You -are fresh from a night journey, I understand, which is in itself -a monotonous occupation." - -"Oh, my night could not be called monotonous," said he, and -laughed. He laughed very heartily, with a high, ringing note, -leaning back in his chair and shaking his sides. All my medical -instincts rose up against that laugh. - -"Stop it!" I cried; "pull yourself together!" and I poured out -some water from a caraffe. - -It was useless, however. He was off in one of those hysterical -outbursts which come upon a strong nature when some great crisis -is over and gone. Presently he came to himself once more, very -weary and pale-looking. - -"I have been making a fool of myself," he gasped. - -"Not at all. Drink this." I dashed some brandy into the water, -and the colour began to come back to his bloodless cheeks. - -"That's better!" said he. "And now, Doctor, perhaps you would -kindly attend to my thumb, or rather to the place where my thumb -used to be." - -He unwound the handkerchief and held out his hand. It gave even -my hardened nerves a shudder to look at it. There were four -protruding fingers and a horrid red, spongy surface where the -thumb should have been. It had been hacked or torn right out from -the roots. - -"Good heavens!" I cried, "this is a terrible injury. It must have -bled considerably." - -"Yes, it did. I fainted when it was done, and I think that I must -have been senseless for a long time. When I came to I found that -it was still bleeding, so I tied one end of my handkerchief very -tightly round the wrist and braced it up with a twig." - -"Excellent! You should have been a surgeon." - -"It is a question of hydraulics, you see, and came within my own -province." - -"This has been done," said I, examining the wound, "by a very -heavy and sharp instrument." - -"A thing like a cleaver," said he. - -"An accident, I presume?" - -"By no means." - -"What! a murderous attack?" - -"Very murderous indeed." - -"You horrify me." - -I sponged the wound, cleaned it, dressed it, and finally covered -it over with cotton wadding and carbolised bandages. He lay back -without wincing, though he bit his lip from time to time. - -"How is that?" I asked when I had finished. - -"Capital! Between your brandy and your bandage, I feel a new man. -I was very weak, but I have had a good deal to go through." - -"Perhaps you had better not speak of the matter. It is evidently -trying to your nerves." - -"Oh, no, not now. I shall have to tell my tale to the police; -but, between ourselves, if it were not for the convincing -evidence of this wound of mine, I should be surprised if they -believed my statement, for it is a very extraordinary one, and I -have not much in the way of proof with which to back it up; and, -even if they believe me, the clues which I can give them are so -vague that it is a question whether justice will be done." - -"Ha!" cried I, "if it is anything in the nature of a problem -which you desire to see solved, I should strongly recommend you -to come to my friend, Mr. Sherlock Holmes, before you go to the -official police." - -"Oh, I have heard of that fellow," answered my visitor, "and I -should be very glad if he would take the matter up, though of -course I must use the official police as well. Would you give me -an introduction to him?" - -"I'll do better. I'll take you round to him myself." - -"I should be immensely obliged to you." - -"We'll call a cab and go together. We shall just be in time to -have a little breakfast with him. Do you feel equal to it?" - -"Yes; I shall not feel easy until I have told my story." - -"Then my servant will call a cab, and I shall be with you in an -instant." I rushed upstairs, explained the matter shortly to my -wife, and in five minutes was inside a hansom, driving with my -new acquaintance to Baker Street. - -Sherlock Holmes was, as I expected, lounging about his -sitting-room in his dressing-gown, reading the agony column of The -Times and smoking his before-breakfast pipe, which was composed -of all the plugs and dottles left from his smokes of the day -before, all carefully dried and collected on the corner of the -mantelpiece. He received us in his quietly genial fashion, -ordered fresh rashers and eggs, and joined us in a hearty meal. -When it was concluded he settled our new acquaintance upon the -sofa, placed a pillow beneath his head, and laid a glass of -brandy and water within his reach. - -"It is easy to see that your experience has been no common one, -Mr. Hatherley," said he. "Pray, lie down there and make yourself -absolutely at home. Tell us what you can, but stop when you are -tired and keep up your strength with a little stimulant." - -"Thank you," said my patient, "but I have felt another man since -the doctor bandaged me, and I think that your breakfast has -completed the cure. I shall take up as little of your valuable -time as possible, so I shall start at once upon my peculiar -experiences." - -Holmes sat in his big armchair with the weary, heavy-lidded -expression which veiled his keen and eager nature, while I sat -opposite to him, and we listened in silence to the strange story -which our visitor detailed to us. - -"You must know," said he, "that I am an orphan and a bachelor, -residing alone in lodgings in London. By profession I am a -hydraulic engineer, and I have had considerable experience of my -work during the seven years that I was apprenticed to Venner & -Matheson, the well-known firm, of Greenwich. Two years ago, -having served my time, and having also come into a fair sum of -money through my poor father's death, I determined to start in -business for myself and took professional chambers in Victoria -Street. - -"I suppose that everyone finds his first independent start in -business a dreary experience. To me it has been exceptionally so. -During two years I have had three consultations and one small -job, and that is absolutely all that my profession has brought -me. My gross takings amount to 27 pounds 10s. Every day, from -nine in the morning until four in the afternoon, I waited in my -little den, until at last my heart began to sink, and I came to -believe that I should never have any practice at all. - -"Yesterday, however, just as I was thinking of leaving the -office, my clerk entered to say there was a gentleman waiting who -wished to see me upon business. He brought up a card, too, with -the name of 'Colonel Lysander Stark' engraved upon it. Close at -his heels came the colonel himself, a man rather over the middle -size, but of an exceeding thinness. I do not think that I have -ever seen so thin a man. His whole face sharpened away into nose -and chin, and the skin of his cheeks was drawn quite tense over -his outstanding bones. Yet this emaciation seemed to be his -natural habit, and due to no disease, for his eye was bright, his -step brisk, and his bearing assured. He was plainly but neatly -dressed, and his age, I should judge, would be nearer forty than -thirty. - -"'Mr. Hatherley?' said he, with something of a German accent. -'You have been recommended to me, Mr. Hatherley, as being a man -who is not only proficient in his profession but is also discreet -and capable of preserving a secret.' - -"I bowed, feeling as flattered as any young man would at such an -address. 'May I ask who it was who gave me so good a character?' - -"'Well, perhaps it is better that I should not tell you that just -at this moment. I have it from the same source that you are both -an orphan and a bachelor and are residing alone in London.' - -"'That is quite correct,' I answered; 'but you will excuse me if -I say that I cannot see how all this bears upon my professional -qualifications. I understand that it was on a professional matter -that you wished to speak to me?' - -"'Undoubtedly so. But you will find that all I say is really to -the point. I have a professional commission for you, but absolute -secrecy is quite essential--absolute secrecy, you understand, and -of course we may expect that more from a man who is alone than -from one who lives in the bosom of his family.' - -"'If I promise to keep a secret,' said I, 'you may absolutely -depend upon my doing so.' - -"He looked very hard at me as I spoke, and it seemed to me that I -had never seen so suspicious and questioning an eye. - -"'Do you promise, then?' said he at last. - -"'Yes, I promise.' - -"'Absolute and complete silence before, during, and after? No -reference to the matter at all, either in word or writing?' - -"'I have already given you my word.' - -"'Very good.' He suddenly sprang up, and darting like lightning -across the room he flung open the door. The passage outside was -empty. - -"'That's all right,' said he, coming back. 'I know that clerks are -sometimes curious as to their master's affairs. Now we can talk -in safety.' He drew up his chair very close to mine and began to -stare at me again with the same questioning and thoughtful look. - -"A feeling of repulsion, and of something akin to fear had begun -to rise within me at the strange antics of this fleshless man. -Even my dread of losing a client could not restrain me from -showing my impatience. - -"'I beg that you will state your business, sir,' said I; 'my time -is of value.' Heaven forgive me for that last sentence, but the -words came to my lips. - -"'How would fifty guineas for a night's work suit you?' he asked. - -"'Most admirably.' - -"'I say a night's work, but an hour's would be nearer the mark. I -simply want your opinion about a hydraulic stamping machine which -has got out of gear. If you show us what is wrong we shall soon -set it right ourselves. What do you think of such a commission as -that?' - -"'The work appears to be light and the pay munificent.' - -"'Precisely so. We shall want you to come to-night by the last -train.' - -"'Where to?' - -"'To Eyford, in Berkshire. It is a little place near the borders -of Oxfordshire, and within seven miles of Reading. There is a -train from Paddington which would bring you there at about -11:15.' - -"'Very good.' - -"'I shall come down in a carriage to meet you.' - -"'There is a drive, then?' - -"'Yes, our little place is quite out in the country. It is a good -seven miles from Eyford Station.' - -"'Then we can hardly get there before midnight. I suppose there -would be no chance of a train back. I should be compelled to stop -the night.' - -"'Yes, we could easily give you a shake-down.' - -"'That is very awkward. Could I not come at some more convenient -hour?' - -"'We have judged it best that you should come late. It is to -recompense you for any inconvenience that we are paying to you, a -young and unknown man, a fee which would buy an opinion from the -very heads of your profession. Still, of course, if you would -like to draw out of the business, there is plenty of time to do -so.' - -"I thought of the fifty guineas, and of how very useful they -would be to me. 'Not at all,' said I, 'I shall be very happy to -accommodate myself to your wishes. I should like, however, to -understand a little more clearly what it is that you wish me to -do.' - -"'Quite so. It is very natural that the pledge of secrecy which -we have exacted from you should have aroused your curiosity. I -have no wish to commit you to anything without your having it all -laid before you. I suppose that we are absolutely safe from -eavesdroppers?' - -"'Entirely.' - -"'Then the matter stands thus. You are probably aware that -fuller's-earth is a valuable product, and that it is only found -in one or two places in England?' - -"'I have heard so.' - -"'Some little time ago I bought a small place--a very small -place--within ten miles of Reading. I was fortunate enough to -discover that there was a deposit of fuller's-earth in one of my -fields. On examining it, however, I found that this deposit was a -comparatively small one, and that it formed a link between two -very much larger ones upon the right and left--both of them, -however, in the grounds of my neighbours. These good people were -absolutely ignorant that their land contained that which was -quite as valuable as a gold-mine. Naturally, it was to my -interest to buy their land before they discovered its true value, -but unfortunately I had no capital by which I could do this. I -took a few of my friends into the secret, however, and they -suggested that we should quietly and secretly work our own little -deposit and that in this way we should earn the money which would -enable us to buy the neighbouring fields. This we have now been -doing for some time, and in order to help us in our operations we -erected a hydraulic press. This press, as I have already -explained, has got out of order, and we wish your advice upon the -subject. We guard our secret very jealously, however, and if it -once became known that we had hydraulic engineers coming to our -little house, it would soon rouse inquiry, and then, if the facts -came out, it would be good-bye to any chance of getting these -fields and carrying out our plans. That is why I have made you -promise me that you will not tell a human being that you are -going to Eyford to-night. I hope that I make it all plain?' - -"'I quite follow you,' said I. 'The only point which I could not -quite understand was what use you could make of a hydraulic press -in excavating fuller's-earth, which, as I understand, is dug out -like gravel from a pit.' - -"'Ah!' said he carelessly, 'we have our own process. We compress -the earth into bricks, so as to remove them without revealing -what they are. But that is a mere detail. I have taken you fully -into my confidence now, Mr. Hatherley, and I have shown you how I -trust you.' He rose as he spoke. 'I shall expect you, then, at -Eyford at 11:15.' - -"'I shall certainly be there.' - -"'And not a word to a soul.' He looked at me with a last long, -questioning gaze, and then, pressing my hand in a cold, dank -grasp, he hurried from the room. - -"Well, when I came to think it all over in cool blood I was very -much astonished, as you may both think, at this sudden commission -which had been intrusted to me. On the one hand, of course, I was -glad, for the fee was at least tenfold what I should have asked -had I set a price upon my own services, and it was possible that -this order might lead to other ones. On the other hand, the face -and manner of my patron had made an unpleasant impression upon -me, and I could not think that his explanation of the -fuller's-earth was sufficient to explain the necessity for my -coming at midnight, and his extreme anxiety lest I should tell -anyone of my errand. However, I threw all fears to the winds, ate -a hearty supper, drove to Paddington, and started off, having -obeyed to the letter the injunction as to holding my tongue. - -"At Reading I had to change not only my carriage but my station. -However, I was in time for the last train to Eyford, and I -reached the little dim-lit station after eleven o'clock. I was the -only passenger who got out there, and there was no one upon the -platform save a single sleepy porter with a lantern. As I passed -out through the wicket gate, however, I found my acquaintance of -the morning waiting in the shadow upon the other side. Without a -word he grasped my arm and hurried me into a carriage, the door -of which was standing open. He drew up the windows on either -side, tapped on the wood-work, and away we went as fast as the -horse could go." - -"One horse?" interjected Holmes. - -"Yes, only one." - -"Did you observe the colour?" - -"Yes, I saw it by the side-lights when I was stepping into the -carriage. It was a chestnut." - -"Tired-looking or fresh?" - -"Oh, fresh and glossy." - -"Thank you. I am sorry to have interrupted you. Pray continue -your most interesting statement." - -"Away we went then, and we drove for at least an hour. Colonel -Lysander Stark had said that it was only seven miles, but I -should think, from the rate that we seemed to go, and from the -time that we took, that it must have been nearer twelve. He sat -at my side in silence all the time, and I was aware, more than -once when I glanced in his direction, that he was looking at me -with great intensity. The country roads seem to be not very good -in that part of the world, for we lurched and jolted terribly. I -tried to look out of the windows to see something of where we -were, but they were made of frosted glass, and I could make out -nothing save the occasional bright blur of a passing light. Now -and then I hazarded some remark to break the monotony of the -journey, but the colonel answered only in monosyllables, and the -conversation soon flagged. At last, however, the bumping of the -road was exchanged for the crisp smoothness of a gravel-drive, -and the carriage came to a stand. Colonel Lysander Stark sprang -out, and, as I followed after him, pulled me swiftly into a porch -which gaped in front of us. We stepped, as it were, right out of -the carriage and into the hall, so that I failed to catch the -most fleeting glance of the front of the house. The instant that -I had crossed the threshold the door slammed heavily behind us, -and I heard faintly the rattle of the wheels as the carriage -drove away. - -"It was pitch dark inside the house, and the colonel fumbled -about looking for matches and muttering under his breath. -Suddenly a door opened at the other end of the passage, and a -long, golden bar of light shot out in our direction. It grew -broader, and a woman appeared with a lamp in her hand, which she -held above her head, pushing her face forward and peering at us. -I could see that she was pretty, and from the gloss with which -the light shone upon her dark dress I knew that it was a rich -material. She spoke a few words in a foreign tongue in a tone as -though asking a question, and when my companion answered in a -gruff monosyllable she gave such a start that the lamp nearly -fell from her hand. Colonel Stark went up to her, whispered -something in her ear, and then, pushing her back into the room -from whence she had come, he walked towards me again with the -lamp in his hand. - -"'Perhaps you will have the kindness to wait in this room for a -few minutes,' said he, throwing open another door. It was a -quiet, little, plainly furnished room, with a round table in the -centre, on which several German books were scattered. Colonel -Stark laid down the lamp on the top of a harmonium beside the -door. 'I shall not keep you waiting an instant,' said he, and -vanished into the darkness. - -"I glanced at the books upon the table, and in spite of my -ignorance of German I could see that two of them were treatises -on science, the others being volumes of poetry. Then I walked -across to the window, hoping that I might catch some glimpse of -the country-side, but an oak shutter, heavily barred, was folded -across it. It was a wonderfully silent house. There was an old -clock ticking loudly somewhere in the passage, but otherwise -everything was deadly still. A vague feeling of uneasiness began -to steal over me. Who were these German people, and what were -they doing living in this strange, out-of-the-way place? And -where was the place? I was ten miles or so from Eyford, that was -all I knew, but whether north, south, east, or west I had no -idea. For that matter, Reading, and possibly other large towns, -were within that radius, so the place might not be so secluded, -after all. Yet it was quite certain, from the absolute stillness, -that we were in the country. I paced up and down the room, -humming a tune under my breath to keep up my spirits and feeling -that I was thoroughly earning my fifty-guinea fee. - -"Suddenly, without any preliminary sound in the midst of the -utter stillness, the door of my room swung slowly open. The woman -was standing in the aperture, the darkness of the hall behind -her, the yellow light from my lamp beating upon her eager and -beautiful face. I could see at a glance that she was sick with -fear, and the sight sent a chill to my own heart. She held up one -shaking finger to warn me to be silent, and she shot a few -whispered words of broken English at me, her eyes glancing back, -like those of a frightened horse, into the gloom behind her. - -"'I would go,' said she, trying hard, as it seemed to me, to -speak calmly; 'I would go. I should not stay here. There is no -good for you to do.' - -"'But, madam,' said I, 'I have not yet done what I came for. I -cannot possibly leave until I have seen the machine.' - -"'It is not worth your while to wait,' she went on. 'You can pass -through the door; no one hinders.' And then, seeing that I smiled -and shook my head, she suddenly threw aside her constraint and -made a step forward, with her hands wrung together. 'For the love -of Heaven!' she whispered, 'get away from here before it is too -late!' - -"But I am somewhat headstrong by nature, and the more ready to -engage in an affair when there is some obstacle in the way. I -thought of my fifty-guinea fee, of my wearisome journey, and of -the unpleasant night which seemed to be before me. Was it all to -go for nothing? Why should I slink away without having carried -out my commission, and without the payment which was my due? This -woman might, for all I knew, be a monomaniac. With a stout -bearing, therefore, though her manner had shaken me more than I -cared to confess, I still shook my head and declared my intention -of remaining where I was. She was about to renew her entreaties -when a door slammed overhead, and the sound of several footsteps -was heard upon the stairs. She listened for an instant, threw up -her hands with a despairing gesture, and vanished as suddenly and -as noiselessly as she had come. - -"The newcomers were Colonel Lysander Stark and a short thick man -with a chinchilla beard growing out of the creases of his double -chin, who was introduced to me as Mr. Ferguson. - -"'This is my secretary and manager,' said the colonel. 'By the -way, I was under the impression that I left this door shut just -now. I fear that you have felt the draught.' - -"'On the contrary,' said I, 'I opened the door myself because I -felt the room to be a little close.' - -"He shot one of his suspicious looks at me. 'Perhaps we had -better proceed to business, then,' said he. 'Mr. Ferguson and I -will take you up to see the machine.' - -"'I had better put my hat on, I suppose.' - -"'Oh, no, it is in the house.' - -"'What, you dig fuller's-earth in the house?' - -"'No, no. This is only where we compress it. But never mind that. -All we wish you to do is to examine the machine and to let us -know what is wrong with it.' - -"We went upstairs together, the colonel first with the lamp, the -fat manager and I behind him. It was a labyrinth of an old house, -with corridors, passages, narrow winding staircases, and little -low doors, the thresholds of which were hollowed out by the -generations who had crossed them. There were no carpets and no -signs of any furniture above the ground floor, while the plaster -was peeling off the walls, and the damp was breaking through in -green, unhealthy blotches. I tried to put on as unconcerned an -air as possible, but I had not forgotten the warnings of the -lady, even though I disregarded them, and I kept a keen eye upon -my two companions. Ferguson appeared to be a morose and silent -man, but I could see from the little that he said that he was at -least a fellow-countryman. - -"Colonel Lysander Stark stopped at last before a low door, which -he unlocked. Within was a small, square room, in which the three -of us could hardly get at one time. Ferguson remained outside, -and the colonel ushered me in. - -"'We are now,' said he, 'actually within the hydraulic press, and -it would be a particularly unpleasant thing for us if anyone were -to turn it on. The ceiling of this small chamber is really the -end of the descending piston, and it comes down with the force of -many tons upon this metal floor. There are small lateral columns -of water outside which receive the force, and which transmit and -multiply it in the manner which is familiar to you. The machine -goes readily enough, but there is some stiffness in the working -of it, and it has lost a little of its force. Perhaps you will -have the goodness to look it over and to show us how we can set -it right.' - -"I took the lamp from him, and I examined the machine very -thoroughly. It was indeed a gigantic one, and capable of -exercising enormous pressure. When I passed outside, however, and -pressed down the levers which controlled it, I knew at once by -the whishing sound that there was a slight leakage, which allowed -a regurgitation of water through one of the side cylinders. An -examination showed that one of the india-rubber bands which was -round the head of a driving-rod had shrunk so as not quite to -fill the socket along which it worked. This was clearly the cause -of the loss of power, and I pointed it out to my companions, who -followed my remarks very carefully and asked several practical -questions as to how they should proceed to set it right. When I -had made it clear to them, I returned to the main chamber of the -machine and took a good look at it to satisfy my own curiosity. -It was obvious at a glance that the story of the fuller's-earth -was the merest fabrication, for it would be absurd to suppose -that so powerful an engine could be designed for so inadequate a -purpose. The walls were of wood, but the floor consisted of a -large iron trough, and when I came to examine it I could see a -crust of metallic deposit all over it. I had stooped and was -scraping at this to see exactly what it was when I heard a -muttered exclamation in German and saw the cadaverous face of the -colonel looking down at me. - -"'What are you doing there?' he asked. - -"I felt angry at having been tricked by so elaborate a story as -that which he had told me. 'I was admiring your fuller's-earth,' -said I; 'I think that I should be better able to advise you as to -your machine if I knew what the exact purpose was for which it -was used.' - -"The instant that I uttered the words I regretted the rashness of -my speech. His face set hard, and a baleful light sprang up in -his grey eyes. - -"'Very well,' said he, 'you shall know all about the machine.' He -took a step backward, slammed the little door, and turned the key -in the lock. I rushed towards it and pulled at the handle, but it -was quite secure, and did not give in the least to my kicks and -shoves. 'Hullo!' I yelled. 'Hullo! Colonel! Let me out!' - -"And then suddenly in the silence I heard a sound which sent my -heart into my mouth. It was the clank of the levers and the swish -of the leaking cylinder. He had set the engine at work. The lamp -still stood upon the floor where I had placed it when examining -the trough. By its light I saw that the black ceiling was coming -down upon me, slowly, jerkily, but, as none knew better than -myself, with a force which must within a minute grind me to a -shapeless pulp. I threw myself, screaming, against the door, and -dragged with my nails at the lock. I implored the colonel to let -me out, but the remorseless clanking of the levers drowned my -cries. The ceiling was only a foot or two above my head, and with -my hand upraised I could feel its hard, rough surface. Then it -flashed through my mind that the pain of my death would depend -very much upon the position in which I met it. If I lay on my -face the weight would come upon my spine, and I shuddered to -think of that dreadful snap. Easier the other way, perhaps; and -yet, had I the nerve to lie and look up at that deadly black -shadow wavering down upon me? Already I was unable to stand -erect, when my eye caught something which brought a gush of hope -back to my heart. - -"I have said that though the floor and ceiling were of iron, the -walls were of wood. As I gave a last hurried glance around, I saw -a thin line of yellow light between two of the boards, which -broadened and broadened as a small panel was pushed backward. For -an instant I could hardly believe that here was indeed a door -which led away from death. The next instant I threw myself -through, and lay half-fainting upon the other side. The panel had -closed again behind me, but the crash of the lamp, and a few -moments afterwards the clang of the two slabs of metal, told me -how narrow had been my escape. - -"I was recalled to myself by a frantic plucking at my wrist, and -I found myself lying upon the stone floor of a narrow corridor, -while a woman bent over me and tugged at me with her left hand, -while she held a candle in her right. It was the same good friend -whose warning I had so foolishly rejected. - -"'Come! come!' she cried breathlessly. 'They will be here in a -moment. They will see that you are not there. Oh, do not waste -the so-precious time, but come!' - -"This time, at least, I did not scorn her advice. I staggered to -my feet and ran with her along the corridor and down a winding -stair. The latter led to another broad passage, and just as we -reached it we heard the sound of running feet and the shouting of -two voices, one answering the other from the floor on which we -were and from the one beneath. My guide stopped and looked about -her like one who is at her wit's end. Then she threw open a door -which led into a bedroom, through the window of which the moon -was shining brightly. - -"'It is your only chance,' said she. 'It is high, but it may be -that you can jump it.' - -"As she spoke a light sprang into view at the further end of the -passage, and I saw the lean figure of Colonel Lysander Stark -rushing forward with a lantern in one hand and a weapon like a -butcher's cleaver in the other. I rushed across the bedroom, -flung open the window, and looked out. How quiet and sweet and -wholesome the garden looked in the moonlight, and it could not be -more than thirty feet down. I clambered out upon the sill, but I -hesitated to jump until I should have heard what passed between -my saviour and the ruffian who pursued me. If she were ill-used, -then at any risks I was determined to go back to her assistance. -The thought had hardly flashed through my mind before he was at -the door, pushing his way past her; but she threw her arms round -him and tried to hold him back. - -"'Fritz! Fritz!' she cried in English, 'remember your promise -after the last time. You said it should not be again. He will be -silent! Oh, he will be silent!' - -"'You are mad, Elise!' he shouted, struggling to break away from -her. 'You will be the ruin of us. He has seen too much. Let me -pass, I say!' He dashed her to one side, and, rushing to the -window, cut at me with his heavy weapon. I had let myself go, and -was hanging by the hands to the sill, when his blow fell. I was -conscious of a dull pain, my grip loosened, and I fell into the -garden below. - -"I was shaken but not hurt by the fall; so I picked myself up and -rushed off among the bushes as hard as I could run, for I -understood that I was far from being out of danger yet. Suddenly, -however, as I ran, a deadly dizziness and sickness came over me. -I glanced down at my hand, which was throbbing painfully, and -then, for the first time, saw that my thumb had been cut off and -that the blood was pouring from my wound. I endeavoured to tie my -handkerchief round it, but there came a sudden buzzing in my -ears, and next moment I fell in a dead faint among the -rose-bushes. - -"How long I remained unconscious I cannot tell. It must have been -a very long time, for the moon had sunk, and a bright morning was -breaking when I came to myself. My clothes were all sodden with -dew, and my coat-sleeve was drenched with blood from my wounded -thumb. The smarting of it recalled in an instant all the -particulars of my night's adventure, and I sprang to my feet with -the feeling that I might hardly yet be safe from my pursuers. But -to my astonishment, when I came to look round me, neither house -nor garden were to be seen. I had been lying in an angle of the -hedge close by the highroad, and just a little lower down was a -long building, which proved, upon my approaching it, to be the -very station at which I had arrived upon the previous night. Were -it not for the ugly wound upon my hand, all that had passed -during those dreadful hours might have been an evil dream. - -"Half dazed, I went into the station and asked about the morning -train. There would be one to Reading in less than an hour. The -same porter was on duty, I found, as had been there when I -arrived. I inquired of him whether he had ever heard of Colonel -Lysander Stark. The name was strange to him. Had he observed a -carriage the night before waiting for me? No, he had not. Was -there a police-station anywhere near? There was one about three -miles off. - -"It was too far for me to go, weak and ill as I was. I determined -to wait until I got back to town before telling my story to the -police. It was a little past six when I arrived, so I went first -to have my wound dressed, and then the doctor was kind enough to -bring me along here. I put the case into your hands and shall do -exactly what you advise." - -We both sat in silence for some little time after listening to -this extraordinary narrative. Then Sherlock Holmes pulled down -from the shelf one of the ponderous commonplace books in which he -placed his cuttings. - -"Here is an advertisement which will interest you," said he. "It -appeared in all the papers about a year ago. Listen to this: -'Lost, on the 9th inst., Mr. Jeremiah Hayling, aged -twenty-six, a hydraulic engineer. Left his lodgings at ten -o'clock at night, and has not been heard of since. Was -dressed in,' etc., etc. Ha! That represents the last time that -the colonel needed to have his machine overhauled, I fancy." - -"Good heavens!" cried my patient. "Then that explains what the -girl said." - -"Undoubtedly. It is quite clear that the colonel was a cool and -desperate man, who was absolutely determined that nothing should -stand in the way of his little game, like those out-and-out -pirates who will leave no survivor from a captured ship. Well, -every moment now is precious, so if you feel equal to it we shall -go down to Scotland Yard at once as a preliminary to starting for -Eyford." - -Some three hours or so afterwards we were all in the train -together, bound from Reading to the little Berkshire village. -There were Sherlock Holmes, the hydraulic engineer, Inspector -Bradstreet, of Scotland Yard, a plain-clothes man, and myself. -Bradstreet had spread an ordnance map of the county out upon the -seat and was busy with his compasses drawing a circle with Eyford -for its centre. - -"There you are," said he. "That circle is drawn at a radius of -ten miles from the village. The place we want must be somewhere -near that line. You said ten miles, I think, sir." - -"It was an hour's good drive." - -"And you think that they brought you back all that way when you -were unconscious?" - -"They must have done so. I have a confused memory, too, of having -been lifted and conveyed somewhere." - -"What I cannot understand," said I, "is why they should have -spared you when they found you lying fainting in the garden. -Perhaps the villain was softened by the woman's entreaties." - -"I hardly think that likely. I never saw a more inexorable face -in my life." - -"Oh, we shall soon clear up all that," said Bradstreet. "Well, I -have drawn my circle, and I only wish I knew at what point upon -it the folk that we are in search of are to be found." - -"I think I could lay my finger on it," said Holmes quietly. - -"Really, now!" cried the inspector, "you have formed your -opinion! Come, now, we shall see who agrees with you. I say it is -south, for the country is more deserted there." - -"And I say east," said my patient. - -"I am for west," remarked the plain-clothes man. "There are -several quiet little villages up there." - -"And I am for north," said I, "because there are no hills there, -and our friend says that he did not notice the carriage go up -any." - -"Come," cried the inspector, laughing; "it's a very pretty -diversity of opinion. We have boxed the compass among us. Who do -you give your casting vote to?" - -"You are all wrong." - -"But we can't all be." - -"Oh, yes, you can. This is my point." He placed his finger in the -centre of the circle. "This is where we shall find them." - -"But the twelve-mile drive?" gasped Hatherley. - -"Six out and six back. Nothing simpler. You say yourself that the -horse was fresh and glossy when you got in. How could it be that -if it had gone twelve miles over heavy roads?" - -"Indeed, it is a likely ruse enough," observed Bradstreet -thoughtfully. "Of course there can be no doubt as to the nature -of this gang." - -"None at all," said Holmes. "They are coiners on a large scale, -and have used the machine to form the amalgam which has taken the -place of silver." - -"We have known for some time that a clever gang was at work," -said the inspector. "They have been turning out half-crowns by -the thousand. We even traced them as far as Reading, but could -get no farther, for they had covered their traces in a way that -showed that they were very old hands. But now, thanks to this -lucky chance, I think that we have got them right enough." - -But the inspector was mistaken, for those criminals were not -destined to fall into the hands of justice. As we rolled into -Eyford Station we saw a gigantic column of smoke which streamed -up from behind a small clump of trees in the neighbourhood and -hung like an immense ostrich feather over the landscape. - -"A house on fire?" asked Bradstreet as the train steamed off -again on its way. - -"Yes, sir!" said the station-master. - -"When did it break out?" - -"I hear that it was during the night, sir, but it has got worse, -and the whole place is in a blaze." - -"Whose house is it?" - -"Dr. Becher's." - -"Tell me," broke in the engineer, "is Dr. Becher a German, very -thin, with a long, sharp nose?" - -The station-master laughed heartily. "No, sir, Dr. Becher is an -Englishman, and there isn't a man in the parish who has a -better-lined waistcoat. But he has a gentleman staying with him, -a patient, as I understand, who is a foreigner, and he looks as -if a little good Berkshire beef would do him no harm." - -The station-master had not finished his speech before we were all -hastening in the direction of the fire. The road topped a low -hill, and there was a great widespread whitewashed building in -front of us, spouting fire at every chink and window, while in -the garden in front three fire-engines were vainly striving to -keep the flames under. - -"That's it!" cried Hatherley, in intense excitement. "There is -the gravel-drive, and there are the rose-bushes where I lay. That -second window is the one that I jumped from." - -"Well, at least," said Holmes, "you have had your revenge upon -them. There can be no question that it was your oil-lamp which, -when it was crushed in the press, set fire to the wooden walls, -though no doubt they were too excited in the chase after you to -observe it at the time. Now keep your eyes open in this crowd for -your friends of last night, though I very much fear that they are -a good hundred miles off by now." - -And Holmes' fears came to be realised, for from that day to this -no word has ever been heard either of the beautiful woman, the -sinister German, or the morose Englishman. Early that morning a -peasant had met a cart containing several people and some very -bulky boxes driving rapidly in the direction of Reading, but -there all traces of the fugitives disappeared, and even Holmes' -ingenuity failed ever to discover the least clue as to their -whereabouts. - -The firemen had been much perturbed at the strange arrangements -which they had found within, and still more so by discovering a -newly severed human thumb upon a window-sill of the second floor. -About sunset, however, their efforts were at last successful, and -they subdued the flames, but not before the roof had fallen in, -and the whole place been reduced to such absolute ruin that, save -some twisted cylinders and iron piping, not a trace remained of -the machinery which had cost our unfortunate acquaintance so -dearly. Large masses of nickel and of tin were discovered stored -in an out-house, but no coins were to be found, which may have -explained the presence of those bulky boxes which have been -already referred to. - -How our hydraulic engineer had been conveyed from the garden to -the spot where he recovered his senses might have remained -forever a mystery were it not for the soft mould, which told us a -very plain tale. He had evidently been carried down by two -persons, one of whom had remarkably small feet and the other -unusually large ones. On the whole, it was most probable that the -silent Englishman, being less bold or less murderous than his -companion, had assisted the woman to bear the unconscious man out -of the way of danger. - -"Well," said our engineer ruefully as we took our seats to return -once more to London, "it has been a pretty business for me! I -have lost my thumb and I have lost a fifty-guinea fee, and what -have I gained?" - -"Experience," said Holmes, laughing. "Indirectly it may be of -value, you know; you have only to put it into words to gain the -reputation of being excellent company for the remainder of your -existence." - - - -X. THE ADVENTURE OF THE NOBLE BACHELOR - -The Lord St. Simon marriage, and its curious termination, have -long ceased to be a subject of interest in those exalted circles -in which the unfortunate bridegroom moves. Fresh scandals have -eclipsed it, and their more piquant details have drawn the -gossips away from this four-year-old drama. As I have reason to -believe, however, that the full facts have never been revealed to -the general public, and as my friend Sherlock Holmes had a -considerable share in clearing the matter up, I feel that no -memoir of him would be complete without some little sketch of -this remarkable episode. - -It was a few weeks before my own marriage, during the days when I -was still sharing rooms with Holmes in Baker Street, that he came -home from an afternoon stroll to find a letter on the table -waiting for him. I had remained indoors all day, for the weather -had taken a sudden turn to rain, with high autumnal winds, and -the Jezail bullet which I had brought back in one of my limbs as -a relic of my Afghan campaign throbbed with dull persistence. -With my body in one easy-chair and my legs upon another, I had -surrounded myself with a cloud of newspapers until at last, -saturated with the news of the day, I tossed them all aside and -lay listless, watching the huge crest and monogram upon the -envelope upon the table and wondering lazily who my friend's -noble correspondent could be. - -"Here is a very fashionable epistle," I remarked as he entered. -"Your morning letters, if I remember right, were from a -fish-monger and a tide-waiter." - -"Yes, my correspondence has certainly the charm of variety," he -answered, smiling, "and the humbler are usually the more -interesting. This looks like one of those unwelcome social -summonses which call upon a man either to be bored or to lie." - -He broke the seal and glanced over the contents. - -"Oh, come, it may prove to be something of interest, after all." - -"Not social, then?" - -"No, distinctly professional." - -"And from a noble client?" - -"One of the highest in England." - -"My dear fellow, I congratulate you." - -"I assure you, Watson, without affectation, that the status of my -client is a matter of less moment to me than the interest of his -case. It is just possible, however, that that also may not be -wanting in this new investigation. You have been reading the -papers diligently of late, have you not?" - -"It looks like it," said I ruefully, pointing to a huge bundle in -the corner. "I have had nothing else to do." - -"It is fortunate, for you will perhaps be able to post me up. I -read nothing except the criminal news and the agony column. The -latter is always instructive. But if you have followed recent -events so closely you must have read about Lord St. Simon and his -wedding?" - -"Oh, yes, with the deepest interest." - -"That is well. The letter which I hold in my hand is from Lord -St. Simon. I will read it to you, and in return you must turn -over these papers and let me have whatever bears upon the matter. -This is what he says: - -"'MY DEAR MR. SHERLOCK HOLMES:--Lord Backwater tells me that I -may place implicit reliance upon your judgment and discretion. I -have determined, therefore, to call upon you and to consult you -in reference to the very painful event which has occurred in -connection with my wedding. Mr. Lestrade, of Scotland Yard, is -acting already in the matter, but he assures me that he sees no -objection to your co-operation, and that he even thinks that -it might be of some assistance. I will call at four o'clock in -the afternoon, and, should you have any other engagement at that -time, I hope that you will postpone it, as this matter is of -paramount importance. Yours faithfully, ST. SIMON.' - -"It is dated from Grosvenor Mansions, written with a quill pen, -and the noble lord has had the misfortune to get a smear of ink -upon the outer side of his right little finger," remarked Holmes -as he folded up the epistle. - -"He says four o'clock. It is three now. He will be here in an -hour." - -"Then I have just time, with your assistance, to get clear upon -the subject. Turn over those papers and arrange the extracts in -their order of time, while I take a glance as to who our client -is." He picked a red-covered volume from a line of books of -reference beside the mantelpiece. "Here he is," said he, sitting -down and flattening it out upon his knee. "'Lord Robert Walsingham -de Vere St. Simon, second son of the Duke of Balmoral.' Hum! 'Arms: -Azure, three caltrops in chief over a fess sable. Born in 1846.' -He's forty-one years of age, which is mature for marriage. Was -Under-Secretary for the colonies in a late administration. The -Duke, his father, was at one time Secretary for Foreign Affairs. -They inherit Plantagenet blood by direct descent, and Tudor on -the distaff side. Ha! Well, there is nothing very instructive in -all this. I think that I must turn to you Watson, for something -more solid." - -"I have very little difficulty in finding what I want," said I, -"for the facts are quite recent, and the matter struck me as -remarkable. I feared to refer them to you, however, as I knew -that you had an inquiry on hand and that you disliked the -intrusion of other matters." - -"Oh, you mean the little problem of the Grosvenor Square -furniture van. That is quite cleared up now--though, indeed, it -was obvious from the first. Pray give me the results of your -newspaper selections." - -"Here is the first notice which I can find. It is in the personal -column of the Morning Post, and dates, as you see, some weeks -back: 'A marriage has been arranged,' it says, 'and will, if -rumour is correct, very shortly take place, between Lord Robert -St. Simon, second son of the Duke of Balmoral, and Miss Hatty -Doran, the only daughter of Aloysius Doran. Esq., of San -Francisco, Cal., U.S.A.' That is all." - -"Terse and to the point," remarked Holmes, stretching his long, -thin legs towards the fire. - -"There was a paragraph amplifying this in one of the society -papers of the same week. Ah, here it is: 'There will soon be a -call for protection in the marriage market, for the present -free-trade principle appears to tell heavily against our home -product. One by one the management of the noble houses of Great -Britain is passing into the hands of our fair cousins from across -the Atlantic. An important addition has been made during the last -week to the list of the prizes which have been borne away by -these charming invaders. Lord St. Simon, who has shown himself -for over twenty years proof against the little god's arrows, has -now definitely announced his approaching marriage with Miss Hatty -Doran, the fascinating daughter of a California millionaire. Miss -Doran, whose graceful figure and striking face attracted much -attention at the Westbury House festivities, is an only child, -and it is currently reported that her dowry will run to -considerably over the six figures, with expectancies for the -future. As it is an open secret that the Duke of Balmoral has -been compelled to sell his pictures within the last few years, -and as Lord St. Simon has no property of his own save the small -estate of Birchmoor, it is obvious that the Californian heiress -is not the only gainer by an alliance which will enable her to -make the easy and common transition from a Republican lady to a -British peeress.'" - -"Anything else?" asked Holmes, yawning. - -"Oh, yes; plenty. Then there is another note in the Morning Post -to say that the marriage would be an absolutely quiet one, that it -would be at St. George's, Hanover Square, that only half a dozen -intimate friends would be invited, and that the party would -return to the furnished house at Lancaster Gate which has been -taken by Mr. Aloysius Doran. Two days later--that is, on -Wednesday last--there is a curt announcement that the wedding had -taken place, and that the honeymoon would be passed at Lord -Backwater's place, near Petersfield. Those are all the notices -which appeared before the disappearance of the bride." - -"Before the what?" asked Holmes with a start. - -"The vanishing of the lady." - -"When did she vanish, then?" - -"At the wedding breakfast." - -"Indeed. This is more interesting than it promised to be; quite -dramatic, in fact." - -"Yes; it struck me as being a little out of the common." - -"They often vanish before the ceremony, and occasionally during -the honeymoon; but I cannot call to mind anything quite so prompt -as this. Pray let me have the details." - -"I warn you that they are very incomplete." - -"Perhaps we may make them less so." - -"Such as they are, they are set forth in a single article of a -morning paper of yesterday, which I will read to you. It is -headed, 'Singular Occurrence at a Fashionable Wedding': - -"'The family of Lord Robert St. Simon has been thrown into the -greatest consternation by the strange and painful episodes which -have taken place in connection with his wedding. The ceremony, as -shortly announced in the papers of yesterday, occurred on the -previous morning; but it is only now that it has been possible to -confirm the strange rumours which have been so persistently -floating about. In spite of the attempts of the friends to hush -the matter up, so much public attention has now been drawn to it -that no good purpose can be served by affecting to disregard what -is a common subject for conversation. - -"'The ceremony, which was performed at St. George's, Hanover -Square, was a very quiet one, no one being present save the -father of the bride, Mr. Aloysius Doran, the Duchess of Balmoral, -Lord Backwater, Lord Eustace and Lady Clara St. Simon (the -younger brother and sister of the bridegroom), and Lady Alicia -Whittington. The whole party proceeded afterwards to the house of -Mr. Aloysius Doran, at Lancaster Gate, where breakfast had been -prepared. It appears that some little trouble was caused by a -woman, whose name has not been ascertained, who endeavoured to -force her way into the house after the bridal party, alleging -that she had some claim upon Lord St. Simon. It was only after a -painful and prolonged scene that she was ejected by the butler -and the footman. The bride, who had fortunately entered the house -before this unpleasant interruption, had sat down to breakfast -with the rest, when she complained of a sudden indisposition and -retired to her room. Her prolonged absence having caused some -comment, her father followed her, but learned from her maid that -she had only come up to her chamber for an instant, caught up an -ulster and bonnet, and hurried down to the passage. One of the -footmen declared that he had seen a lady leave the house thus -apparelled, but had refused to credit that it was his mistress, -believing her to be with the company. On ascertaining that his -daughter had disappeared, Mr. Aloysius Doran, in conjunction with -the bridegroom, instantly put themselves in communication with -the police, and very energetic inquiries are being made, which -will probably result in a speedy clearing up of this very -singular business. Up to a late hour last night, however, nothing -had transpired as to the whereabouts of the missing lady. There -are rumours of foul play in the matter, and it is said that the -police have caused the arrest of the woman who had caused the -original disturbance, in the belief that, from jealousy or some -other motive, she may have been concerned in the strange -disappearance of the bride.'" - -"And is that all?" - -"Only one little item in another of the morning papers, but it is -a suggestive one." - -"And it is--" - -"That Miss Flora Millar, the lady who had caused the disturbance, -has actually been arrested. It appears that she was formerly a -danseuse at the Allegro, and that she has known the bridegroom -for some years. There are no further particulars, and the whole -case is in your hands now--so far as it has been set forth in the -public press." - -"And an exceedingly interesting case it appears to be. I would -not have missed it for worlds. But there is a ring at the bell, -Watson, and as the clock makes it a few minutes after four, I -have no doubt that this will prove to be our noble client. Do not -dream of going, Watson, for I very much prefer having a witness, -if only as a check to my own memory." - -"Lord Robert St. Simon," announced our page-boy, throwing open -the door. A gentleman entered, with a pleasant, cultured face, -high-nosed and pale, with something perhaps of petulance about -the mouth, and with the steady, well-opened eye of a man whose -pleasant lot it had ever been to command and to be obeyed. His -manner was brisk, and yet his general appearance gave an undue -impression of age, for he had a slight forward stoop and a little -bend of the knees as he walked. His hair, too, as he swept off -his very curly-brimmed hat, was grizzled round the edges and thin -upon the top. As to his dress, it was careful to the verge of -foppishness, with high collar, black frock-coat, white waistcoat, -yellow gloves, patent-leather shoes, and light-coloured gaiters. -He advanced slowly into the room, turning his head from left to -right, and swinging in his right hand the cord which held his -golden eyeglasses. - -"Good-day, Lord St. Simon," said Holmes, rising and bowing. "Pray -take the basket-chair. This is my friend and colleague, Dr. -Watson. Draw up a little to the fire, and we will talk this -matter over." - -"A most painful matter to me, as you can most readily imagine, -Mr. Holmes. I have been cut to the quick. I understand that you -have already managed several delicate cases of this sort, sir, -though I presume that they were hardly from the same class of -society." - -"No, I am descending." - -"I beg pardon." - -"My last client of the sort was a king." - -"Oh, really! I had no idea. And which king?" - -"The King of Scandinavia." - -"What! Had he lost his wife?" - -"You can understand," said Holmes suavely, "that I extend to the -affairs of my other clients the same secrecy which I promise to -you in yours." - -"Of course! Very right! very right! I'm sure I beg pardon. As to -my own case, I am ready to give you any information which may -assist you in forming an opinion." - -"Thank you. I have already learned all that is in the public -prints, nothing more. I presume that I may take it as correct--this -article, for example, as to the disappearance of the bride." - -Lord St. Simon glanced over it. "Yes, it is correct, as far as it -goes." - -"But it needs a great deal of supplementing before anyone could -offer an opinion. I think that I may arrive at my facts most -directly by questioning you." - -"Pray do so." - -"When did you first meet Miss Hatty Doran?" - -"In San Francisco, a year ago." - -"You were travelling in the States?" - -"Yes." - -"Did you become engaged then?" - -"No." - -"But you were on a friendly footing?" - -"I was amused by her society, and she could see that I was -amused." - -"Her father is very rich?" - -"He is said to be the richest man on the Pacific slope." - -"And how did he make his money?" - -"In mining. He had nothing a few years ago. Then he struck gold, -invested it, and came up by leaps and bounds." - -"Now, what is your own impression as to the young lady's--your -wife's character?" - -The nobleman swung his glasses a little faster and stared down -into the fire. "You see, Mr. Holmes," said he, "my wife was -twenty before her father became a rich man. During that time she -ran free in a mining camp and wandered through woods or -mountains, so that her education has come from Nature rather than -from the schoolmaster. She is what we call in England a tomboy, -with a strong nature, wild and free, unfettered by any sort of -traditions. She is impetuous--volcanic, I was about to say. She -is swift in making up her mind and fearless in carrying out her -resolutions. On the other hand, I would not have given her the -name which I have the honour to bear"--he gave a little stately -cough--"had not I thought her to be at bottom a noble woman. I -believe that she is capable of heroic self-sacrifice and that -anything dishonourable would be repugnant to her." - -"Have you her photograph?" - -"I brought this with me." He opened a locket and showed us the -full face of a very lovely woman. It was not a photograph but an -ivory miniature, and the artist had brought out the full effect -of the lustrous black hair, the large dark eyes, and the -exquisite mouth. Holmes gazed long and earnestly at it. Then he -closed the locket and handed it back to Lord St. Simon. - -"The young lady came to London, then, and you renewed your -acquaintance?" - -"Yes, her father brought her over for this last London season. I -met her several times, became engaged to her, and have now -married her." - -"She brought, I understand, a considerable dowry?" - -"A fair dowry. Not more than is usual in my family." - -"And this, of course, remains to you, since the marriage is a -fait accompli?" - -"I really have made no inquiries on the subject." - -"Very naturally not. Did you see Miss Doran on the day before the -wedding?" - -"Yes." - -"Was she in good spirits?" - -"Never better. She kept talking of what we should do in our -future lives." - -"Indeed! That is very interesting. And on the morning of the -wedding?" - -"She was as bright as possible--at least until after the -ceremony." - -"And did you observe any change in her then?" - -"Well, to tell the truth, I saw then the first signs that I had -ever seen that her temper was just a little sharp. The incident -however, was too trivial to relate and can have no possible -bearing upon the case." - -"Pray let us have it, for all that." - -"Oh, it is childish. She dropped her bouquet as we went towards -the vestry. She was passing the front pew at the time, and it -fell over into the pew. There was a moment's delay, but the -gentleman in the pew handed it up to her again, and it did not -appear to be the worse for the fall. Yet when I spoke to her of -the matter, she answered me abruptly; and in the carriage, on our -way home, she seemed absurdly agitated over this trifling cause." - -"Indeed! You say that there was a gentleman in the pew. Some of -the general public were present, then?" - -"Oh, yes. It is impossible to exclude them when the church is -open." - -"This gentleman was not one of your wife's friends?" - -"No, no; I call him a gentleman by courtesy, but he was quite a -common-looking person. I hardly noticed his appearance. But -really I think that we are wandering rather far from the point." - -"Lady St. Simon, then, returned from the wedding in a less -cheerful frame of mind than she had gone to it. What did she do -on re-entering her father's house?" - -"I saw her in conversation with her maid." - -"And who is her maid?" - -"Alice is her name. She is an American and came from California -with her." - -"A confidential servant?" - -"A little too much so. It seemed to me that her mistress allowed -her to take great liberties. Still, of course, in America they -look upon these things in a different way." - -"How long did she speak to this Alice?" - -"Oh, a few minutes. I had something else to think of." - -"You did not overhear what they said?" - -"Lady St. Simon said something about 'jumping a claim.' She was -accustomed to use slang of the kind. I have no idea what she -meant." - -"American slang is very expressive sometimes. And what did your -wife do when she finished speaking to her maid?" - -"She walked into the breakfast-room." - -"On your arm?" - -"No, alone. She was very independent in little matters like that. -Then, after we had sat down for ten minutes or so, she rose -hurriedly, muttered some words of apology, and left the room. She -never came back." - -"But this maid, Alice, as I understand, deposes that she went to -her room, covered her bride's dress with a long ulster, put on a -bonnet, and went out." - -"Quite so. And she was afterwards seen walking into Hyde Park in -company with Flora Millar, a woman who is now in custody, and who -had already made a disturbance at Mr. Doran's house that -morning." - -"Ah, yes. I should like a few particulars as to this young lady, -and your relations to her." - -Lord St. Simon shrugged his shoulders and raised his eyebrows. -"We have been on a friendly footing for some years--I may say on -a very friendly footing. She used to be at the Allegro. I have -not treated her ungenerously, and she had no just cause of -complaint against me, but you know what women are, Mr. Holmes. -Flora was a dear little thing, but exceedingly hot-headed and -devotedly attached to me. She wrote me dreadful letters when she -heard that I was about to be married, and, to tell the truth, the -reason why I had the marriage celebrated so quietly was that I -feared lest there might be a scandal in the church. She came to -Mr. Doran's door just after we returned, and she endeavoured to -push her way in, uttering very abusive expressions towards my -wife, and even threatening her, but I had foreseen the -possibility of something of the sort, and I had two police -fellows there in private clothes, who soon pushed her out again. -She was quiet when she saw that there was no good in making a -row." - -"Did your wife hear all this?" - -"No, thank goodness, she did not." - -"And she was seen walking with this very woman afterwards?" - -"Yes. That is what Mr. Lestrade, of Scotland Yard, looks upon as -so serious. It is thought that Flora decoyed my wife out and laid -some terrible trap for her." - -"Well, it is a possible supposition." - -"You think so, too?" - -"I did not say a probable one. But you do not yourself look upon -this as likely?" - -"I do not think Flora would hurt a fly." - -"Still, jealousy is a strange transformer of characters. Pray -what is your own theory as to what took place?" - -"Well, really, I came to seek a theory, not to propound one. I -have given you all the facts. Since you ask me, however, I may -say that it has occurred to me as possible that the excitement of -this affair, the consciousness that she had made so immense a -social stride, had the effect of causing some little nervous -disturbance in my wife." - -"In short, that she had become suddenly deranged?" - -"Well, really, when I consider that she has turned her back--I -will not say upon me, but upon so much that many have aspired to -without success--I can hardly explain it in any other fashion." - -"Well, certainly that is also a conceivable hypothesis," said -Holmes, smiling. "And now, Lord St. Simon, I think that I have -nearly all my data. May I ask whether you were seated at the -breakfast-table so that you could see out of the window?" - -"We could see the other side of the road and the Park." - -"Quite so. Then I do not think that I need to detain you longer. -I shall communicate with you." - -"Should you be fortunate enough to solve this problem," said our -client, rising. - -"I have solved it." - -"Eh? What was that?" - -"I say that I have solved it." - -"Where, then, is my wife?" - -"That is a detail which I shall speedily supply." - -Lord St. Simon shook his head. "I am afraid that it will take -wiser heads than yours or mine," he remarked, and bowing in a -stately, old-fashioned manner he departed. - -"It is very good of Lord St. Simon to honour my head by putting -it on a level with his own," said Sherlock Holmes, laughing. "I -think that I shall have a whisky and soda and a cigar after all -this cross-questioning. I had formed my conclusions as to the -case before our client came into the room." - -"My dear Holmes!" - -"I have notes of several similar cases, though none, as I -remarked before, which were quite as prompt. My whole examination -served to turn my conjecture into a certainty. Circumstantial -evidence is occasionally very convincing, as when you find a -trout in the milk, to quote Thoreau's example." - -"But I have heard all that you have heard." - -"Without, however, the knowledge of pre-existing cases which -serves me so well. There was a parallel instance in Aberdeen some -years back, and something on very much the same lines at Munich -the year after the Franco-Prussian War. It is one of these -cases--but, hullo, here is Lestrade! Good-afternoon, Lestrade! -You will find an extra tumbler upon the sideboard, and there are -cigars in the box." - -The official detective was attired in a pea-jacket and cravat, -which gave him a decidedly nautical appearance, and he carried a -black canvas bag in his hand. With a short greeting he seated -himself and lit the cigar which had been offered to him. - -"What's up, then?" asked Holmes with a twinkle in his eye. "You -look dissatisfied." - -"And I feel dissatisfied. It is this infernal St. Simon marriage -case. I can make neither head nor tail of the business." - -"Really! You surprise me." - -"Who ever heard of such a mixed affair? Every clue seems to slip -through my fingers. I have been at work upon it all day." - -"And very wet it seems to have made you," said Holmes laying his -hand upon the arm of the pea-jacket. - -"Yes, I have been dragging the Serpentine." - -"In heaven's name, what for?" - -"In search of the body of Lady St. Simon." - -Sherlock Holmes leaned back in his chair and laughed heartily. - -"Have you dragged the basin of Trafalgar Square fountain?" he -asked. - -"Why? What do you mean?" - -"Because you have just as good a chance of finding this lady in -the one as in the other." - -Lestrade shot an angry glance at my companion. "I suppose you -know all about it," he snarled. - -"Well, I have only just heard the facts, but my mind is made up." - -"Oh, indeed! Then you think that the Serpentine plays no part in -the matter?" - -"I think it very unlikely." - -"Then perhaps you will kindly explain how it is that we found -this in it?" He opened his bag as he spoke, and tumbled onto the -floor a wedding-dress of watered silk, a pair of white satin -shoes and a bride's wreath and veil, all discoloured and soaked -in water. "There," said he, putting a new wedding-ring upon the -top of the pile. "There is a little nut for you to crack, Master -Holmes." - -"Oh, indeed!" said my friend, blowing blue rings into the air. -"You dragged them from the Serpentine?" - -"No. They were found floating near the margin by a park-keeper. -They have been identified as her clothes, and it seemed to me -that if the clothes were there the body would not be far off." - -"By the same brilliant reasoning, every man's body is to be found -in the neighbourhood of his wardrobe. And pray what did you hope -to arrive at through this?" - -"At some evidence implicating Flora Millar in the disappearance." - -"I am afraid that you will find it difficult." - -"Are you, indeed, now?" cried Lestrade with some bitterness. "I -am afraid, Holmes, that you are not very practical with your -deductions and your inferences. You have made two blunders in as -many minutes. This dress does implicate Miss Flora Millar." - -"And how?" - -"In the dress is a pocket. In the pocket is a card-case. In the -card-case is a note. And here is the very note." He slapped it -down upon the table in front of him. "Listen to this: 'You will -see me when all is ready. Come at once. F.H.M.' Now my theory all -along has been that Lady St. Simon was decoyed away by Flora -Millar, and that she, with confederates, no doubt, was -responsible for her disappearance. Here, signed with her -initials, is the very note which was no doubt quietly slipped -into her hand at the door and which lured her within their -reach." - -"Very good, Lestrade," said Holmes, laughing. "You really are -very fine indeed. Let me see it." He took up the paper in a -listless way, but his attention instantly became riveted, and he -gave a little cry of satisfaction. "This is indeed important," -said he. - -"Ha! you find it so?" - -"Extremely so. I congratulate you warmly." - -Lestrade rose in his triumph and bent his head to look. "Why," he -shrieked, "you're looking at the wrong side!" - -"On the contrary, this is the right side." - -"The right side? You're mad! Here is the note written in pencil -over here." - -"And over here is what appears to be the fragment of a hotel -bill, which interests me deeply." - -"There's nothing in it. I looked at it before," said Lestrade. -"'Oct. 4th, rooms 8s., breakfast 2s. 6d., cocktail 1s., lunch 2s. -6d., glass sherry, 8d.' I see nothing in that." - -"Very likely not. It is most important, all the same. As to the -note, it is important also, or at least the initials are, so I -congratulate you again." - -"I've wasted time enough," said Lestrade, rising. "I believe in -hard work and not in sitting by the fire spinning fine theories. -Good-day, Mr. Holmes, and we shall see which gets to the bottom -of the matter first." He gathered up the garments, thrust them -into the bag, and made for the door. - -"Just one hint to you, Lestrade," drawled Holmes before his rival -vanished; "I will tell you the true solution of the matter. Lady -St. Simon is a myth. There is not, and there never has been, any -such person." - -Lestrade looked sadly at my companion. Then he turned to me, -tapped his forehead three times, shook his head solemnly, and -hurried away. - -He had hardly shut the door behind him when Holmes rose to put on -his overcoat. "There is something in what the fellow says about -outdoor work," he remarked, "so I think, Watson, that I must -leave you to your papers for a little." - -It was after five o'clock when Sherlock Holmes left me, but I had -no time to be lonely, for within an hour there arrived a -confectioner's man with a very large flat box. This he unpacked -with the help of a youth whom he had brought with him, and -presently, to my very great astonishment, a quite epicurean -little cold supper began to be laid out upon our humble -lodging-house mahogany. There were a couple of brace of cold -woodcock, a pheasant, a pâté de foie gras pie with a group of -ancient and cobwebby bottles. Having laid out all these luxuries, -my two visitors vanished away, like the genii of the Arabian -Nights, with no explanation save that the things had been paid -for and were ordered to this address. - -Just before nine o'clock Sherlock Holmes stepped briskly into the -room. His features were gravely set, but there was a light in his -eye which made me think that he had not been disappointed in his -conclusions. - -"They have laid the supper, then," he said, rubbing his hands. - -"You seem to expect company. They have laid for five." - -"Yes, I fancy we may have some company dropping in," said he. "I -am surprised that Lord St. Simon has not already arrived. Ha! I -fancy that I hear his step now upon the stairs." - -It was indeed our visitor of the afternoon who came bustling in, -dangling his glasses more vigorously than ever, and with a very -perturbed expression upon his aristocratic features. - -"My messenger reached you, then?" asked Holmes. - -"Yes, and I confess that the contents startled me beyond measure. -Have you good authority for what you say?" - -"The best possible." - -Lord St. Simon sank into a chair and passed his hand over his -forehead. - -"What will the Duke say," he murmured, "when he hears that one of -the family has been subjected to such humiliation?" - -"It is the purest accident. I cannot allow that there is any -humiliation." - -"Ah, you look on these things from another standpoint." - -"I fail to see that anyone is to blame. I can hardly see how the -lady could have acted otherwise, though her abrupt method of -doing it was undoubtedly to be regretted. Having no mother, she -had no one to advise her at such a crisis." - -"It was a slight, sir, a public slight," said Lord St. Simon, -tapping his fingers upon the table. - -"You must make allowance for this poor girl, placed in so -unprecedented a position." - -"I will make no allowance. I am very angry indeed, and I have -been shamefully used." - -"I think that I heard a ring," said Holmes. "Yes, there are steps -on the landing. If I cannot persuade you to take a lenient view -of the matter, Lord St. Simon, I have brought an advocate here -who may be more successful." He opened the door and ushered in a -lady and gentleman. "Lord St. Simon," said he "allow me to -introduce you to Mr. and Mrs. Francis Hay Moulton. The lady, I -think, you have already met." - -At the sight of these newcomers our client had sprung from his -seat and stood very erect, with his eyes cast down and his hand -thrust into the breast of his frock-coat, a picture of offended -dignity. The lady had taken a quick step forward and had held out -her hand to him, but he still refused to raise his eyes. It was -as well for his resolution, perhaps, for her pleading face was -one which it was hard to resist. - -"You're angry, Robert," said she. "Well, I guess you have every -cause to be." - -"Pray make no apology to me," said Lord St. Simon bitterly. - -"Oh, yes, I know that I have treated you real bad and that I -should have spoken to you before I went; but I was kind of -rattled, and from the time when I saw Frank here again I just -didn't know what I was doing or saying. I only wonder I didn't -fall down and do a faint right there before the altar." - -"Perhaps, Mrs. Moulton, you would like my friend and me to leave -the room while you explain this matter?" - -"If I may give an opinion," remarked the strange gentleman, -"we've had just a little too much secrecy over this business -already. For my part, I should like all Europe and America to -hear the rights of it." He was a small, wiry, sunburnt man, -clean-shaven, with a sharp face and alert manner. - -"Then I'll tell our story right away," said the lady. "Frank here -and I met in '84, in McQuire's camp, near the Rockies, where pa -was working a claim. We were engaged to each other, Frank and I; -but then one day father struck a rich pocket and made a pile, -while poor Frank here had a claim that petered out and came to -nothing. The richer pa grew the poorer was Frank; so at last pa -wouldn't hear of our engagement lasting any longer, and he took -me away to 'Frisco. Frank wouldn't throw up his hand, though; so -he followed me there, and he saw me without pa knowing anything -about it. It would only have made him mad to know, so we just -fixed it all up for ourselves. Frank said that he would go and -make his pile, too, and never come back to claim me until he had -as much as pa. So then I promised to wait for him to the end of -time and pledged myself not to marry anyone else while he lived. -'Why shouldn't we be married right away, then,' said he, 'and -then I will feel sure of you; and I won't claim to be your -husband until I come back?' Well, we talked it over, and he had -fixed it all up so nicely, with a clergyman all ready in waiting, -that we just did it right there; and then Frank went off to seek -his fortune, and I went back to pa. - -"The next I heard of Frank was that he was in Montana, and then -he went prospecting in Arizona, and then I heard of him from New -Mexico. After that came a long newspaper story about how a -miners' camp had been attacked by Apache Indians, and there was -my Frank's name among the killed. I fainted dead away, and I was -very sick for months after. Pa thought I had a decline and took -me to half the doctors in 'Frisco. Not a word of news came for a -year and more, so that I never doubted that Frank was really -dead. Then Lord St. Simon came to 'Frisco, and we came to London, -and a marriage was arranged, and pa was very pleased, but I felt -all the time that no man on this earth would ever take the place -in my heart that had been given to my poor Frank. - -"Still, if I had married Lord St. Simon, of course I'd have done -my duty by him. We can't command our love, but we can our -actions. I went to the altar with him with the intention to make -him just as good a wife as it was in me to be. But you may -imagine what I felt when, just as I came to the altar rails, I -glanced back and saw Frank standing and looking at me out of the -first pew. I thought it was his ghost at first; but when I looked -again there he was still, with a kind of question in his eyes, as -if to ask me whether I were glad or sorry to see him. I wonder I -didn't drop. I know that everything was turning round, and the -words of the clergyman were just like the buzz of a bee in my -ear. I didn't know what to do. Should I stop the service and make -a scene in the church? I glanced at him again, and he seemed to -know what I was thinking, for he raised his finger to his lips to -tell me to be still. Then I saw him scribble on a piece of paper, -and I knew that he was writing me a note. As I passed his pew on -the way out I dropped my bouquet over to him, and he slipped the -note into my hand when he returned me the flowers. It was only a -line asking me to join him when he made the sign to me to do so. -Of course I never doubted for a moment that my first duty was now -to him, and I determined to do just whatever he might direct. - -"When I got back I told my maid, who had known him in California, -and had always been his friend. I ordered her to say nothing, but -to get a few things packed and my ulster ready. I know I ought to -have spoken to Lord St. Simon, but it was dreadful hard before -his mother and all those great people. I just made up my mind to -run away and explain afterwards. I hadn't been at the table ten -minutes before I saw Frank out of the window at the other side of -the road. He beckoned to me and then began walking into the Park. -I slipped out, put on my things, and followed him. Some woman -came talking something or other about Lord St. Simon to -me--seemed to me from the little I heard as if he had a little -secret of his own before marriage also--but I managed to get away -from her and soon overtook Frank. We got into a cab together, and -away we drove to some lodgings he had taken in Gordon Square, and -that was my true wedding after all those years of waiting. Frank -had been a prisoner among the Apaches, had escaped, came on to -'Frisco, found that I had given him up for dead and had gone to -England, followed me there, and had come upon me at last on the -very morning of my second wedding." - -"I saw it in a paper," explained the American. "It gave the name -and the church but not where the lady lived." - -"Then we had a talk as to what we should do, and Frank was all -for openness, but I was so ashamed of it all that I felt as if I -should like to vanish away and never see any of them again--just -sending a line to pa, perhaps, to show him that I was alive. It -was awful to me to think of all those lords and ladies sitting -round that breakfast-table and waiting for me to come back. So -Frank took my wedding-clothes and things and made a bundle of -them, so that I should not be traced, and dropped them away -somewhere where no one could find them. It is likely that we -should have gone on to Paris to-morrow, only that this good -gentleman, Mr. Holmes, came round to us this evening, though how -he found us is more than I can think, and he showed us very -clearly and kindly that I was wrong and that Frank was right, and -that we should be putting ourselves in the wrong if we were so -secret. Then he offered to give us a chance of talking to Lord -St. Simon alone, and so we came right away round to his rooms at -once. Now, Robert, you have heard it all, and I am very sorry if -I have given you pain, and I hope that you do not think very -meanly of me." - -Lord St. Simon had by no means relaxed his rigid attitude, but -had listened with a frowning brow and a compressed lip to this -long narrative. - -"Excuse me," he said, "but it is not my custom to discuss my most -intimate personal affairs in this public manner." - -"Then you won't forgive me? You won't shake hands before I go?" - -"Oh, certainly, if it would give you any pleasure." He put out -his hand and coldly grasped that which she extended to him. - -"I had hoped," suggested Holmes, "that you would have joined us -in a friendly supper." - -"I think that there you ask a little too much," responded his -Lordship. "I may be forced to acquiesce in these recent -developments, but I can hardly be expected to make merry over -them. I think that with your permission I will now wish you all a -very good-night." He included us all in a sweeping bow and -stalked out of the room. - -"Then I trust that you at least will honour me with your -company," said Sherlock Holmes. "It is always a joy to meet an -American, Mr. Moulton, for I am one of those who believe that the -folly of a monarch and the blundering of a minister in far-gone -years will not prevent our children from being some day citizens -of the same world-wide country under a flag which shall be a -quartering of the Union Jack with the Stars and Stripes." - -"The case has been an interesting one," remarked Holmes when our -visitors had left us, "because it serves to show very clearly how -simple the explanation may be of an affair which at first sight -seems to be almost inexplicable. Nothing could be more natural -than the sequence of events as narrated by this lady, and nothing -stranger than the result when viewed, for instance, by Mr. -Lestrade of Scotland Yard." - -"You were not yourself at fault at all, then?" - -"From the first, two facts were very obvious to me, the one that -the lady had been quite willing to undergo the wedding ceremony, -the other that she had repented of it within a few minutes of -returning home. Obviously something had occurred during the -morning, then, to cause her to change her mind. What could that -something be? She could not have spoken to anyone when she was -out, for she had been in the company of the bridegroom. Had she -seen someone, then? If she had, it must be someone from America -because she had spent so short a time in this country that she -could hardly have allowed anyone to acquire so deep an influence -over her that the mere sight of him would induce her to change -her plans so completely. You see we have already arrived, by a -process of exclusion, at the idea that she might have seen an -American. Then who could this American be, and why should he -possess so much influence over her? It might be a lover; it might -be a husband. Her young womanhood had, I knew, been spent in -rough scenes and under strange conditions. So far I had got -before I ever heard Lord St. Simon's narrative. When he told us -of a man in a pew, of the change in the bride's manner, of so -transparent a device for obtaining a note as the dropping of a -bouquet, of her resort to her confidential maid, and of her very -significant allusion to claim-jumping--which in miners' parlance -means taking possession of that which another person has a prior -claim to--the whole situation became absolutely clear. She had -gone off with a man, and the man was either a lover or was a -previous husband--the chances being in favour of the latter." - -"And how in the world did you find them?" - -"It might have been difficult, but friend Lestrade held -information in his hands the value of which he did not himself -know. The initials were, of course, of the highest importance, -but more valuable still was it to know that within a week he had -settled his bill at one of the most select London hotels." - -"How did you deduce the select?" - -"By the select prices. Eight shillings for a bed and eightpence -for a glass of sherry pointed to one of the most expensive -hotels. There are not many in London which charge at that rate. -In the second one which I visited in Northumberland Avenue, I -learned by an inspection of the book that Francis H. Moulton, an -American gentleman, had left only the day before, and on looking -over the entries against him, I came upon the very items which I -had seen in the duplicate bill. His letters were to be forwarded -to 226 Gordon Square; so thither I travelled, and being fortunate -enough to find the loving couple at home, I ventured to give them -some paternal advice and to point out to them that it would be -better in every way that they should make their position a little -clearer both to the general public and to Lord St. Simon in -particular. I invited them to meet him here, and, as you see, I -made him keep the appointment." - -"But with no very good result," I remarked. "His conduct was -certainly not very gracious." - -"Ah, Watson," said Holmes, smiling, "perhaps you would not be -very gracious either, if, after all the trouble of wooing and -wedding, you found yourself deprived in an instant of wife and of -fortune. I think that we may judge Lord St. Simon very mercifully -and thank our stars that we are never likely to find ourselves in -the same position. Draw your chair up and hand me my violin, for -the only problem we have still to solve is how to while away -these bleak autumnal evenings." - - - -XI. THE ADVENTURE OF THE BERYL CORONET - -"Holmes," said I as I stood one morning in our bow-window looking -down the street, "here is a madman coming along. It seems rather -sad that his relatives should allow him to come out alone." - -My friend rose lazily from his armchair and stood with his hands -in the pockets of his dressing-gown, looking over my shoulder. It -was a bright, crisp February morning, and the snow of the day -before still lay deep upon the ground, shimmering brightly in the -wintry sun. Down the centre of Baker Street it had been ploughed -into a brown crumbly band by the traffic, but at either side and -on the heaped-up edges of the foot-paths it still lay as white as -when it fell. The grey pavement had been cleaned and scraped, but -was still dangerously slippery, so that there were fewer -passengers than usual. Indeed, from the direction of the -Metropolitan Station no one was coming save the single gentleman -whose eccentric conduct had drawn my attention. - -He was a man of about fifty, tall, portly, and imposing, with a -massive, strongly marked face and a commanding figure. He was -dressed in a sombre yet rich style, in black frock-coat, shining -hat, neat brown gaiters, and well-cut pearl-grey trousers. Yet -his actions were in absurd contrast to the dignity of his dress -and features, for he was running hard, with occasional little -springs, such as a weary man gives who is little accustomed to -set any tax upon his legs. As he ran he jerked his hands up and -down, waggled his head, and writhed his face into the most -extraordinary contortions. - -"What on earth can be the matter with him?" I asked. "He is -looking up at the numbers of the houses." - -"I believe that he is coming here," said Holmes, rubbing his -hands. - -"Here?" - -"Yes; I rather think he is coming to consult me professionally. I -think that I recognise the symptoms. Ha! did I not tell you?" As -he spoke, the man, puffing and blowing, rushed at our door and -pulled at our bell until the whole house resounded with the -clanging. - -A few moments later he was in our room, still puffing, still -gesticulating, but with so fixed a look of grief and despair in -his eyes that our smiles were turned in an instant to horror and -pity. For a while he could not get his words out, but swayed his -body and plucked at his hair like one who has been driven to the -extreme limits of his reason. Then, suddenly springing to his -feet, he beat his head against the wall with such force that we -both rushed upon him and tore him away to the centre of the room. -Sherlock Holmes pushed him down into the easy-chair and, sitting -beside him, patted his hand and chatted with him in the easy, -soothing tones which he knew so well how to employ. - -"You have come to me to tell your story, have you not?" said he. -"You are fatigued with your haste. Pray wait until you have -recovered yourself, and then I shall be most happy to look into -any little problem which you may submit to me." - -The man sat for a minute or more with a heaving chest, fighting -against his emotion. Then he passed his handkerchief over his -brow, set his lips tight, and turned his face towards us. - -"No doubt you think me mad?" said he. - -"I see that you have had some great trouble," responded Holmes. - -"God knows I have!--a trouble which is enough to unseat my -reason, so sudden and so terrible is it. Public disgrace I might -have faced, although I am a man whose character has never yet -borne a stain. Private affliction also is the lot of every man; -but the two coming together, and in so frightful a form, have -been enough to shake my very soul. Besides, it is not I alone. -The very noblest in the land may suffer unless some way be found -out of this horrible affair." - -"Pray compose yourself, sir," said Holmes, "and let me have a -clear account of who you are and what it is that has befallen -you." - -"My name," answered our visitor, "is probably familiar to your -ears. I am Alexander Holder, of the banking firm of Holder & -Stevenson, of Threadneedle Street." - -The name was indeed well known to us as belonging to the senior -partner in the second largest private banking concern in the City -of London. What could have happened, then, to bring one of the -foremost citizens of London to this most pitiable pass? We -waited, all curiosity, until with another effort he braced -himself to tell his story. - -"I feel that time is of value," said he; "that is why I hastened -here when the police inspector suggested that I should secure -your co-operation. I came to Baker Street by the Underground and -hurried from there on foot, for the cabs go slowly through this -snow. That is why I was so out of breath, for I am a man who -takes very little exercise. I feel better now, and I will put the -facts before you as shortly and yet as clearly as I can. - -"It is, of course, well known to you that in a successful banking -business as much depends upon our being able to find remunerative -investments for our funds as upon our increasing our connection -and the number of our depositors. One of our most lucrative means -of laying out money is in the shape of loans, where the security -is unimpeachable. We have done a good deal in this direction -during the last few years, and there are many noble families to -whom we have advanced large sums upon the security of their -pictures, libraries, or plate. - -"Yesterday morning I was seated in my office at the bank when a -card was brought in to me by one of the clerks. I started when I -saw the name, for it was that of none other than--well, perhaps -even to you I had better say no more than that it was a name -which is a household word all over the earth--one of the highest, -noblest, most exalted names in England. I was overwhelmed by the -honour and attempted, when he entered, to say so, but he plunged -at once into business with the air of a man who wishes to hurry -quickly through a disagreeable task. - -"'Mr. Holder,' said he, 'I have been informed that you are in the -habit of advancing money.' - -"'The firm does so when the security is good.' I answered. - -"'It is absolutely essential to me,' said he, 'that I should have -50,000 pounds at once. I could, of course, borrow so trifling a -sum ten times over from my friends, but I much prefer to make it -a matter of business and to carry out that business myself. In my -position you can readily understand that it is unwise to place -one's self under obligations.' - -"'For how long, may I ask, do you want this sum?' I asked. - -"'Next Monday I have a large sum due to me, and I shall then most -certainly repay what you advance, with whatever interest you -think it right to charge. But it is very essential to me that the -money should be paid at once.' - -"'I should be happy to advance it without further parley from my -own private purse,' said I, 'were it not that the strain would be -rather more than it could bear. If, on the other hand, I am to do -it in the name of the firm, then in justice to my partner I must -insist that, even in your case, every businesslike precaution -should be taken.' - -"'I should much prefer to have it so,' said he, raising up a -square, black morocco case which he had laid beside his chair. -'You have doubtless heard of the Beryl Coronet?' - -"'One of the most precious public possessions of the empire,' -said I. - -"'Precisely.' He opened the case, and there, imbedded in soft, -flesh-coloured velvet, lay the magnificent piece of jewellery -which he had named. 'There are thirty-nine enormous beryls,' said -he, 'and the price of the gold chasing is incalculable. The -lowest estimate would put the worth of the coronet at double the -sum which I have asked. I am prepared to leave it with you as my -security.' - -"I took the precious case into my hands and looked in some -perplexity from it to my illustrious client. - -"'You doubt its value?' he asked. - -"'Not at all. I only doubt--' - -"'The propriety of my leaving it. You may set your mind at rest -about that. I should not dream of doing so were it not absolutely -certain that I should be able in four days to reclaim it. It is a -pure matter of form. Is the security sufficient?' - -"'Ample.' - -"'You understand, Mr. Holder, that I am giving you a strong proof -of the confidence which I have in you, founded upon all that I -have heard of you. I rely upon you not only to be discreet and to -refrain from all gossip upon the matter but, above all, to -preserve this coronet with every possible precaution because I -need not say that a great public scandal would be caused if any -harm were to befall it. Any injury to it would be almost as -serious as its complete loss, for there are no beryls in the -world to match these, and it would be impossible to replace them. -I leave it with you, however, with every confidence, and I shall -call for it in person on Monday morning.' - -"Seeing that my client was anxious to leave, I said no more but, -calling for my cashier, I ordered him to pay over fifty 1000 -pound notes. When I was alone once more, however, with the -precious case lying upon the table in front of me, I could not -but think with some misgivings of the immense responsibility -which it entailed upon me. There could be no doubt that, as it -was a national possession, a horrible scandal would ensue if any -misfortune should occur to it. I already regretted having ever -consented to take charge of it. However, it was too late to alter -the matter now, so I locked it up in my private safe and turned -once more to my work. - -"When evening came I felt that it would be an imprudence to leave -so precious a thing in the office behind me. Bankers' safes had -been forced before now, and why should not mine be? If so, how -terrible would be the position in which I should find myself! I -determined, therefore, that for the next few days I would always -carry the case backward and forward with me, so that it might -never be really out of my reach. With this intention, I called a -cab and drove out to my house at Streatham, carrying the jewel -with me. I did not breathe freely until I had taken it upstairs -and locked it in the bureau of my dressing-room. - -"And now a word as to my household, Mr. Holmes, for I wish you to -thoroughly understand the situation. My groom and my page sleep -out of the house, and may be set aside altogether. I have three -maid-servants who have been with me a number of years and whose -absolute reliability is quite above suspicion. Another, Lucy -Parr, the second waiting-maid, has only been in my service a few -months. She came with an excellent character, however, and has -always given me satisfaction. She is a very pretty girl and has -attracted admirers who have occasionally hung about the place. -That is the only drawback which we have found to her, but we -believe her to be a thoroughly good girl in every way. - -"So much for the servants. My family itself is so small that it -will not take me long to describe it. I am a widower and have an -only son, Arthur. He has been a disappointment to me, Mr. -Holmes--a grievous disappointment. I have no doubt that I am -myself to blame. People tell me that I have spoiled him. Very -likely I have. When my dear wife died I felt that he was all I -had to love. I could not bear to see the smile fade even for a -moment from his face. I have never denied him a wish. Perhaps it -would have been better for both of us had I been sterner, but I -meant it for the best. - -"It was naturally my intention that he should succeed me in my -business, but he was not of a business turn. He was wild, -wayward, and, to speak the truth, I could not trust him in the -handling of large sums of money. When he was young he became a -member of an aristocratic club, and there, having charming -manners, he was soon the intimate of a number of men with long -purses and expensive habits. He learned to play heavily at cards -and to squander money on the turf, until he had again and again -to come to me and implore me to give him an advance upon his -allowance, that he might settle his debts of honour. He tried -more than once to break away from the dangerous company which he -was keeping, but each time the influence of his friend, Sir -George Burnwell, was enough to draw him back again. - -"And, indeed, I could not wonder that such a man as Sir George -Burnwell should gain an influence over him, for he has frequently -brought him to my house, and I have found myself that I could -hardly resist the fascination of his manner. He is older than -Arthur, a man of the world to his finger-tips, one who had been -everywhere, seen everything, a brilliant talker, and a man of -great personal beauty. Yet when I think of him in cold blood, far -away from the glamour of his presence, I am convinced from his -cynical speech and the look which I have caught in his eyes that -he is one who should be deeply distrusted. So I think, and so, -too, thinks my little Mary, who has a woman's quick insight into -character. - -"And now there is only she to be described. She is my niece; but -when my brother died five years ago and left her alone in the -world I adopted her, and have looked upon her ever since as my -daughter. She is a sunbeam in my house--sweet, loving, beautiful, -a wonderful manager and housekeeper, yet as tender and quiet and -gentle as a woman could be. She is my right hand. I do not know -what I could do without her. In only one matter has she ever gone -against my wishes. Twice my boy has asked her to marry him, for -he loves her devotedly, but each time she has refused him. I -think that if anyone could have drawn him into the right path it -would have been she, and that his marriage might have changed his -whole life; but now, alas! it is too late--forever too late! - -"Now, Mr. Holmes, you know the people who live under my roof, and -I shall continue with my miserable story. - -"When we were taking coffee in the drawing-room that night after -dinner, I told Arthur and Mary my experience, and of the precious -treasure which we had under our roof, suppressing only the name -of my client. Lucy Parr, who had brought in the coffee, had, I am -sure, left the room; but I cannot swear that the door was closed. -Mary and Arthur were much interested and wished to see the famous -coronet, but I thought it better not to disturb it. - -"'Where have you put it?' asked Arthur. - -"'In my own bureau.' - -"'Well, I hope to goodness the house won't be burgled during the -night.' said he. - -"'It is locked up,' I answered. - -"'Oh, any old key will fit that bureau. When I was a youngster I -have opened it myself with the key of the box-room cupboard.' - -"He often had a wild way of talking, so that I thought little of -what he said. He followed me to my room, however, that night with -a very grave face. - -"'Look here, dad,' said he with his eyes cast down, 'can you let -me have 200 pounds?' - -"'No, I cannot!' I answered sharply. 'I have been far too -generous with you in money matters.' - -"'You have been very kind,' said he, 'but I must have this money, -or else I can never show my face inside the club again.' - -"'And a very good thing, too!' I cried. - -"'Yes, but you would not have me leave it a dishonoured man,' -said he. 'I could not bear the disgrace. I must raise the money -in some way, and if you will not let me have it, then I must try -other means.' - -"I was very angry, for this was the third demand during the -month. 'You shall not have a farthing from me,' I cried, on which -he bowed and left the room without another word. - -"When he was gone I unlocked my bureau, made sure that my -treasure was safe, and locked it again. Then I started to go -round the house to see that all was secure--a duty which I -usually leave to Mary but which I thought it well to perform -myself that night. As I came down the stairs I saw Mary herself -at the side window of the hall, which she closed and fastened as -I approached. - -"'Tell me, dad,' said she, looking, I thought, a little -disturbed, 'did you give Lucy, the maid, leave to go out -to-night?' - -"'Certainly not.' - -"'She came in just now by the back door. I have no doubt that she -has only been to the side gate to see someone, but I think that -it is hardly safe and should be stopped.' - -"'You must speak to her in the morning, or I will if you prefer -it. Are you sure that everything is fastened?' - -"'Quite sure, dad.' - -"'Then, good-night.' I kissed her and went up to my bedroom -again, where I was soon asleep. - -"I am endeavouring to tell you everything, Mr. Holmes, which may -have any bearing upon the case, but I beg that you will question -me upon any point which I do not make clear." - -"On the contrary, your statement is singularly lucid." - -"I come to a part of my story now in which I should wish to be -particularly so. I am not a very heavy sleeper, and the anxiety -in my mind tended, no doubt, to make me even less so than usual. -About two in the morning, then, I was awakened by some sound in -the house. It had ceased ere I was wide awake, but it had left an -impression behind it as though a window had gently closed -somewhere. I lay listening with all my ears. Suddenly, to my -horror, there was a distinct sound of footsteps moving softly in -the next room. I slipped out of bed, all palpitating with fear, -and peeped round the corner of my dressing-room door. - -"'Arthur!' I screamed, 'you villain! you thief! How dare you -touch that coronet?' - -"The gas was half up, as I had left it, and my unhappy boy, -dressed only in his shirt and trousers, was standing beside the -light, holding the coronet in his hands. He appeared to be -wrenching at it, or bending it with all his strength. At my cry -he dropped it from his grasp and turned as pale as death. I -snatched it up and examined it. One of the gold corners, with -three of the beryls in it, was missing. - -"'You blackguard!' I shouted, beside myself with rage. 'You have -destroyed it! You have dishonoured me forever! Where are the -jewels which you have stolen?' - -"'Stolen!' he cried. - -"'Yes, thief!' I roared, shaking him by the shoulder. - -"'There are none missing. There cannot be any missing,' said he. - -"'There are three missing. And you know where they are. Must I -call you a liar as well as a thief? Did I not see you trying to -tear off another piece?' - -"'You have called me names enough,' said he, 'I will not stand it -any longer. I shall not say another word about this business, -since you have chosen to insult me. I will leave your house in -the morning and make my own way in the world.' - -"'You shall leave it in the hands of the police!' I cried -half-mad with grief and rage. 'I shall have this matter probed to -the bottom.' - -"'You shall learn nothing from me,' said he with a passion such -as I should not have thought was in his nature. 'If you choose to -call the police, let the police find what they can.' - -"By this time the whole house was astir, for I had raised my -voice in my anger. Mary was the first to rush into my room, and, -at the sight of the coronet and of Arthur's face, she read the -whole story and, with a scream, fell down senseless on the -ground. I sent the house-maid for the police and put the -investigation into their hands at once. When the inspector and a -constable entered the house, Arthur, who had stood sullenly with -his arms folded, asked me whether it was my intention to charge -him with theft. I answered that it had ceased to be a private -matter, but had become a public one, since the ruined coronet was -national property. I was determined that the law should have its -way in everything. - -"'At least,' said he, 'you will not have me arrested at once. It -would be to your advantage as well as mine if I might leave the -house for five minutes.' - -"'That you may get away, or perhaps that you may conceal what you -have stolen,' said I. And then, realising the dreadful position -in which I was placed, I implored him to remember that not only -my honour but that of one who was far greater than I was at -stake; and that he threatened to raise a scandal which would -convulse the nation. He might avert it all if he would but tell -me what he had done with the three missing stones. - -"'You may as well face the matter,' said I; 'you have been caught -in the act, and no confession could make your guilt more heinous. -If you but make such reparation as is in your power, by telling -us where the beryls are, all shall be forgiven and forgotten.' - -"'Keep your forgiveness for those who ask for it,' he answered, -turning away from me with a sneer. I saw that he was too hardened -for any words of mine to influence him. There was but one way for -it. I called in the inspector and gave him into custody. A search -was made at once not only of his person but of his room and of -every portion of the house where he could possibly have concealed -the gems; but no trace of them could be found, nor would the -wretched boy open his mouth for all our persuasions and our -threats. This morning he was removed to a cell, and I, after -going through all the police formalities, have hurried round to -you to implore you to use your skill in unravelling the matter. -The police have openly confessed that they can at present make -nothing of it. You may go to any expense which you think -necessary. I have already offered a reward of 1000 pounds. My -God, what shall I do! I have lost my honour, my gems, and my son -in one night. Oh, what shall I do!" - -He put a hand on either side of his head and rocked himself to -and fro, droning to himself like a child whose grief has got -beyond words. - -Sherlock Holmes sat silent for some few minutes, with his brows -knitted and his eyes fixed upon the fire. - -"Do you receive much company?" he asked. - -"None save my partner with his family and an occasional friend of -Arthur's. Sir George Burnwell has been several times lately. No -one else, I think." - -"Do you go out much in society?" - -"Arthur does. Mary and I stay at home. We neither of us care for -it." - -"That is unusual in a young girl." - -"She is of a quiet nature. Besides, she is not so very young. She -is four-and-twenty." - -"This matter, from what you say, seems to have been a shock to -her also." - -"Terrible! She is even more affected than I." - -"You have neither of you any doubt as to your son's guilt?" - -"How can we have when I saw him with my own eyes with the coronet -in his hands." - -"I hardly consider that a conclusive proof. Was the remainder of -the coronet at all injured?" - -"Yes, it was twisted." - -"Do you not think, then, that he might have been trying to -straighten it?" - -"God bless you! You are doing what you can for him and for me. -But it is too heavy a task. What was he doing there at all? If -his purpose were innocent, why did he not say so?" - -"Precisely. And if it were guilty, why did he not invent a lie? -His silence appears to me to cut both ways. There are several -singular points about the case. What did the police think of the -noise which awoke you from your sleep?" - -"They considered that it might be caused by Arthur's closing his -bedroom door." - -"A likely story! As if a man bent on felony would slam his door -so as to wake a household. What did they say, then, of the -disappearance of these gems?" - -"They are still sounding the planking and probing the furniture -in the hope of finding them." - -"Have they thought of looking outside the house?" - -"Yes, they have shown extraordinary energy. The whole garden has -already been minutely examined." - -"Now, my dear sir," said Holmes, "is it not obvious to you now -that this matter really strikes very much deeper than either you -or the police were at first inclined to think? It appeared to you -to be a simple case; to me it seems exceedingly complex. Consider -what is involved by your theory. You suppose that your son came -down from his bed, went, at great risk, to your dressing-room, -opened your bureau, took out your coronet, broke off by main -force a small portion of it, went off to some other place, -concealed three gems out of the thirty-nine, with such skill that -nobody can find them, and then returned with the other thirty-six -into the room in which he exposed himself to the greatest danger -of being discovered. I ask you now, is such a theory tenable?" - -"But what other is there?" cried the banker with a gesture of -despair. "If his motives were innocent, why does he not explain -them?" - -"It is our task to find that out," replied Holmes; "so now, if -you please, Mr. Holder, we will set off for Streatham together, -and devote an hour to glancing a little more closely into -details." - -My friend insisted upon my accompanying them in their expedition, -which I was eager enough to do, for my curiosity and sympathy -were deeply stirred by the story to which we had listened. I -confess that the guilt of the banker's son appeared to me to be -as obvious as it did to his unhappy father, but still I had such -faith in Holmes' judgment that I felt that there must be some -grounds for hope as long as he was dissatisfied with the accepted -explanation. He hardly spoke a word the whole way out to the -southern suburb, but sat with his chin upon his breast and his -hat drawn over his eyes, sunk in the deepest thought. Our client -appeared to have taken fresh heart at the little glimpse of hope -which had been presented to him, and he even broke into a -desultory chat with me over his business affairs. A short railway -journey and a shorter walk brought us to Fairbank, the modest -residence of the great financier. - -Fairbank was a good-sized square house of white stone, standing -back a little from the road. A double carriage-sweep, with a -snow-clad lawn, stretched down in front to two large iron gates -which closed the entrance. On the right side was a small wooden -thicket, which led into a narrow path between two neat hedges -stretching from the road to the kitchen door, and forming the -tradesmen's entrance. On the left ran a lane which led to the -stables, and was not itself within the grounds at all, being a -public, though little used, thoroughfare. Holmes left us standing -at the door and walked slowly all round the house, across the -front, down the tradesmen's path, and so round by the garden -behind into the stable lane. So long was he that Mr. Holder and I -went into the dining-room and waited by the fire until he should -return. We were sitting there in silence when the door opened and -a young lady came in. She was rather above the middle height, -slim, with dark hair and eyes, which seemed the darker against -the absolute pallor of her skin. I do not think that I have ever -seen such deadly paleness in a woman's face. Her lips, too, were -bloodless, but her eyes were flushed with crying. As she swept -silently into the room she impressed me with a greater sense of -grief than the banker had done in the morning, and it was the -more striking in her as she was evidently a woman of strong -character, with immense capacity for self-restraint. Disregarding -my presence, she went straight to her uncle and passed her hand -over his head with a sweet womanly caress. - -"You have given orders that Arthur should be liberated, have you -not, dad?" she asked. - -"No, no, my girl, the matter must be probed to the bottom." - -"But I am so sure that he is innocent. You know what woman's -instincts are. I know that he has done no harm and that you will -be sorry for having acted so harshly." - -"Why is he silent, then, if he is innocent?" - -"Who knows? Perhaps because he was so angry that you should -suspect him." - -"How could I help suspecting him, when I actually saw him with -the coronet in his hand?" - -"Oh, but he had only picked it up to look at it. Oh, do, do take -my word for it that he is innocent. Let the matter drop and say -no more. It is so dreadful to think of our dear Arthur in -prison!" - -"I shall never let it drop until the gems are found--never, Mary! -Your affection for Arthur blinds you as to the awful consequences -to me. Far from hushing the thing up, I have brought a gentleman -down from London to inquire more deeply into it." - -"This gentleman?" she asked, facing round to me. - -"No, his friend. He wished us to leave him alone. He is round in -the stable lane now." - -"The stable lane?" She raised her dark eyebrows. "What can he -hope to find there? Ah! this, I suppose, is he. I trust, sir, -that you will succeed in proving, what I feel sure is the truth, -that my cousin Arthur is innocent of this crime." - -"I fully share your opinion, and I trust, with you, that we may -prove it," returned Holmes, going back to the mat to knock the -snow from his shoes. "I believe I have the honour of addressing -Miss Mary Holder. Might I ask you a question or two?" - -"Pray do, sir, if it may help to clear this horrible affair up." - -"You heard nothing yourself last night?" - -"Nothing, until my uncle here began to speak loudly. I heard -that, and I came down." - -"You shut up the windows and doors the night before. Did you -fasten all the windows?" - -"Yes." - -"Were they all fastened this morning?" - -"Yes." - -"You have a maid who has a sweetheart? I think that you remarked -to your uncle last night that she had been out to see him?" - -"Yes, and she was the girl who waited in the drawing-room, and -who may have heard uncle's remarks about the coronet." - -"I see. You infer that she may have gone out to tell her -sweetheart, and that the two may have planned the robbery." - -"But what is the good of all these vague theories," cried the -banker impatiently, "when I have told you that I saw Arthur with -the coronet in his hands?" - -"Wait a little, Mr. Holder. We must come back to that. About this -girl, Miss Holder. You saw her return by the kitchen door, I -presume?" - -"Yes; when I went to see if the door was fastened for the night I -met her slipping in. I saw the man, too, in the gloom." - -"Do you know him?" - -"Oh, yes! he is the green-grocer who brings our vegetables round. -His name is Francis Prosper." - -"He stood," said Holmes, "to the left of the door--that is to -say, farther up the path than is necessary to reach the door?" - -"Yes, he did." - -"And he is a man with a wooden leg?" - -Something like fear sprang up in the young lady's expressive -black eyes. "Why, you are like a magician," said she. "How do you -know that?" She smiled, but there was no answering smile in -Holmes' thin, eager face. - -"I should be very glad now to go upstairs," said he. "I shall -probably wish to go over the outside of the house again. Perhaps -I had better take a look at the lower windows before I go up." - -He walked swiftly round from one to the other, pausing only at -the large one which looked from the hall onto the stable lane. -This he opened and made a very careful examination of the sill -with his powerful magnifying lens. "Now we shall go upstairs," -said he at last. - -The banker's dressing-room was a plainly furnished little -chamber, with a grey carpet, a large bureau, and a long mirror. -Holmes went to the bureau first and looked hard at the lock. - -"Which key was used to open it?" he asked. - -"That which my son himself indicated--that of the cupboard of the -lumber-room." - -"Have you it here?" - -"That is it on the dressing-table." - -Sherlock Holmes took it up and opened the bureau. - -"It is a noiseless lock," said he. "It is no wonder that it did -not wake you. This case, I presume, contains the coronet. We must -have a look at it." He opened the case, and taking out the diadem -he laid it upon the table. It was a magnificent specimen of the -jeweller's art, and the thirty-six stones were the finest that I -have ever seen. At one side of the coronet was a cracked edge, -where a corner holding three gems had been torn away. - -"Now, Mr. Holder," said Holmes, "here is the corner which -corresponds to that which has been so unfortunately lost. Might I -beg that you will break it off." - -The banker recoiled in horror. "I should not dream of trying," -said he. - -"Then I will." Holmes suddenly bent his strength upon it, but -without result. "I feel it give a little," said he; "but, though -I am exceptionally strong in the fingers, it would take me all my -time to break it. An ordinary man could not do it. Now, what do -you think would happen if I did break it, Mr. Holder? There would -be a noise like a pistol shot. Do you tell me that all this -happened within a few yards of your bed and that you heard -nothing of it?" - -"I do not know what to think. It is all dark to me." - -"But perhaps it may grow lighter as we go. What do you think, -Miss Holder?" - -"I confess that I still share my uncle's perplexity." - -"Your son had no shoes or slippers on when you saw him?" - -"He had nothing on save only his trousers and shirt." - -"Thank you. We have certainly been favoured with extraordinary -luck during this inquiry, and it will be entirely our own fault -if we do not succeed in clearing the matter up. With your -permission, Mr. Holder, I shall now continue my investigations -outside." - -He went alone, at his own request, for he explained that any -unnecessary footmarks might make his task more difficult. For an -hour or more he was at work, returning at last with his feet -heavy with snow and his features as inscrutable as ever. - -"I think that I have seen now all that there is to see, Mr. -Holder," said he; "I can serve you best by returning to my -rooms." - -"But the gems, Mr. Holmes. Where are they?" - -"I cannot tell." - -The banker wrung his hands. "I shall never see them again!" he -cried. "And my son? You give me hopes?" - -"My opinion is in no way altered." - -"Then, for God's sake, what was this dark business which was -acted in my house last night?" - -"If you can call upon me at my Baker Street rooms to-morrow -morning between nine and ten I shall be happy to do what I can to -make it clearer. I understand that you give me carte blanche to -act for you, provided only that I get back the gems, and that you -place no limit on the sum I may draw." - -"I would give my fortune to have them back." - -"Very good. I shall look into the matter between this and then. -Good-bye; it is just possible that I may have to come over here -again before evening." - -It was obvious to me that my companion's mind was now made up -about the case, although what his conclusions were was more than -I could even dimly imagine. Several times during our homeward -journey I endeavoured to sound him upon the point, but he always -glided away to some other topic, until at last I gave it over in -despair. It was not yet three when we found ourselves in our -rooms once more. He hurried to his chamber and was down again in -a few minutes dressed as a common loafer. With his collar turned -up, his shiny, seedy coat, his red cravat, and his worn boots, he -was a perfect sample of the class. - -"I think that this should do," said he, glancing into the glass -above the fireplace. "I only wish that you could come with me, -Watson, but I fear that it won't do. I may be on the trail in -this matter, or I may be following a will-o'-the-wisp, but I -shall soon know which it is. I hope that I may be back in a few -hours." He cut a slice of beef from the joint upon the sideboard, -sandwiched it between two rounds of bread, and thrusting this -rude meal into his pocket he started off upon his expedition. - -I had just finished my tea when he returned, evidently in -excellent spirits, swinging an old elastic-sided boot in his -hand. He chucked it down into a corner and helped himself to a -cup of tea. - -"I only looked in as I passed," said he. "I am going right on." - -"Where to?" - -"Oh, to the other side of the West End. It may be some time -before I get back. Don't wait up for me in case I should be -late." - -"How are you getting on?" - -"Oh, so so. Nothing to complain of. I have been out to Streatham -since I saw you last, but I did not call at the house. It is a -very sweet little problem, and I would not have missed it for a -good deal. However, I must not sit gossiping here, but must get -these disreputable clothes off and return to my highly -respectable self." - -I could see by his manner that he had stronger reasons for -satisfaction than his words alone would imply. His eyes twinkled, -and there was even a touch of colour upon his sallow cheeks. He -hastened upstairs, and a few minutes later I heard the slam of -the hall door, which told me that he was off once more upon his -congenial hunt. - -I waited until midnight, but there was no sign of his return, so -I retired to my room. It was no uncommon thing for him to be away -for days and nights on end when he was hot upon a scent, so that -his lateness caused me no surprise. I do not know at what hour he -came in, but when I came down to breakfast in the morning there -he was with a cup of coffee in one hand and the paper in the -other, as fresh and trim as possible. - -"You will excuse my beginning without you, Watson," said he, "but -you remember that our client has rather an early appointment this -morning." - -"Why, it is after nine now," I answered. "I should not be -surprised if that were he. I thought I heard a ring." - -It was, indeed, our friend the financier. I was shocked by the -change which had come over him, for his face which was naturally -of a broad and massive mould, was now pinched and fallen in, -while his hair seemed to me at least a shade whiter. He entered -with a weariness and lethargy which was even more painful than -his violence of the morning before, and he dropped heavily into -the armchair which I pushed forward for him. - -"I do not know what I have done to be so severely tried," said -he. "Only two days ago I was a happy and prosperous man, without -a care in the world. Now I am left to a lonely and dishonoured -age. One sorrow comes close upon the heels of another. My niece, -Mary, has deserted me." - -"Deserted you?" - -"Yes. Her bed this morning had not been slept in, her room was -empty, and a note for me lay upon the hall table. I had said to -her last night, in sorrow and not in anger, that if she had -married my boy all might have been well with him. Perhaps it was -thoughtless of me to say so. It is to that remark that she refers -in this note: - -"'MY DEAREST UNCLE:--I feel that I have brought trouble upon you, -and that if I had acted differently this terrible misfortune -might never have occurred. I cannot, with this thought in my -mind, ever again be happy under your roof, and I feel that I must -leave you forever. Do not worry about my future, for that is -provided for; and, above all, do not search for me, for it will -be fruitless labour and an ill-service to me. In life or in -death, I am ever your loving,--MARY.' - -"What could she mean by that note, Mr. Holmes? Do you think it -points to suicide?" - -"No, no, nothing of the kind. It is perhaps the best possible -solution. I trust, Mr. Holder, that you are nearing the end of -your troubles." - -"Ha! You say so! You have heard something, Mr. Holmes; you have -learned something! Where are the gems?" - -"You would not think 1000 pounds apiece an excessive sum for -them?" - -"I would pay ten." - -"That would be unnecessary. Three thousand will cover the matter. -And there is a little reward, I fancy. Have you your check-book? -Here is a pen. Better make it out for 4000 pounds." - -With a dazed face the banker made out the required check. Holmes -walked over to his desk, took out a little triangular piece of -gold with three gems in it, and threw it down upon the table. - -With a shriek of joy our client clutched it up. - -"You have it!" he gasped. "I am saved! I am saved!" - -The reaction of joy was as passionate as his grief had been, and -he hugged his recovered gems to his bosom. - -"There is one other thing you owe, Mr. Holder," said Sherlock -Holmes rather sternly. - -"Owe!" He caught up a pen. "Name the sum, and I will pay it." - -"No, the debt is not to me. You owe a very humble apology to that -noble lad, your son, who has carried himself in this matter as I -should be proud to see my own son do, should I ever chance to -have one." - -"Then it was not Arthur who took them?" - -"I told you yesterday, and I repeat to-day, that it was not." - -"You are sure of it! Then let us hurry to him at once to let him -know that the truth is known." - -"He knows it already. When I had cleared it all up I had an -interview with him, and finding that he would not tell me the -story, I told it to him, on which he had to confess that I was -right and to add the very few details which were not yet quite -clear to me. Your news of this morning, however, may open his -lips." - -"For heaven's sake, tell me, then, what is this extraordinary -mystery!" - -"I will do so, and I will show you the steps by which I reached -it. And let me say to you, first, that which it is hardest for me -to say and for you to hear: there has been an understanding -between Sir George Burnwell and your niece Mary. They have now -fled together." - -"My Mary? Impossible!" - -"It is unfortunately more than possible; it is certain. Neither -you nor your son knew the true character of this man when you -admitted him into your family circle. He is one of the most -dangerous men in England--a ruined gambler, an absolutely -desperate villain, a man without heart or conscience. Your niece -knew nothing of such men. When he breathed his vows to her, as he -had done to a hundred before her, she flattered herself that she -alone had touched his heart. The devil knows best what he said, -but at least she became his tool and was in the habit of seeing -him nearly every evening." - -"I cannot, and I will not, believe it!" cried the banker with an -ashen face. - -"I will tell you, then, what occurred in your house last night. -Your niece, when you had, as she thought, gone to your room, -slipped down and talked to her lover through the window which -leads into the stable lane. His footmarks had pressed right -through the snow, so long had he stood there. She told him of the -coronet. His wicked lust for gold kindled at the news, and he -bent her to his will. I have no doubt that she loved you, but -there are women in whom the love of a lover extinguishes all -other loves, and I think that she must have been one. She had -hardly listened to his instructions when she saw you coming -downstairs, on which she closed the window rapidly and told you -about one of the servants' escapade with her wooden-legged lover, -which was all perfectly true. - -"Your boy, Arthur, went to bed after his interview with you but -he slept badly on account of his uneasiness about his club debts. -In the middle of the night he heard a soft tread pass his door, -so he rose and, looking out, was surprised to see his cousin -walking very stealthily along the passage until she disappeared -into your dressing-room. Petrified with astonishment, the lad -slipped on some clothes and waited there in the dark to see what -would come of this strange affair. Presently she emerged from the -room again, and in the light of the passage-lamp your son saw -that she carried the precious coronet in her hands. She passed -down the stairs, and he, thrilling with horror, ran along and -slipped behind the curtain near your door, whence he could see -what passed in the hall beneath. He saw her stealthily open the -window, hand out the coronet to someone in the gloom, and then -closing it once more hurry back to her room, passing quite close -to where he stood hid behind the curtain. - -"As long as she was on the scene he could not take any action -without a horrible exposure of the woman whom he loved. But the -instant that she was gone he realised how crushing a misfortune -this would be for you, and how all-important it was to set it -right. He rushed down, just as he was, in his bare feet, opened -the window, sprang out into the snow, and ran down the lane, -where he could see a dark figure in the moonlight. Sir George -Burnwell tried to get away, but Arthur caught him, and there was -a struggle between them, your lad tugging at one side of the -coronet, and his opponent at the other. In the scuffle, your son -struck Sir George and cut him over the eye. Then something -suddenly snapped, and your son, finding that he had the coronet -in his hands, rushed back, closed the window, ascended to your -room, and had just observed that the coronet had been twisted in -the struggle and was endeavouring to straighten it when you -appeared upon the scene." - -"Is it possible?" gasped the banker. - -"You then roused his anger by calling him names at a moment when -he felt that he had deserved your warmest thanks. He could not -explain the true state of affairs without betraying one who -certainly deserved little enough consideration at his hands. He -took the more chivalrous view, however, and preserved her -secret." - -"And that was why she shrieked and fainted when she saw the -coronet," cried Mr. Holder. "Oh, my God! what a blind fool I have -been! And his asking to be allowed to go out for five minutes! -The dear fellow wanted to see if the missing piece were at the -scene of the struggle. How cruelly I have misjudged him!" - -"When I arrived at the house," continued Holmes, "I at once went -very carefully round it to observe if there were any traces in -the snow which might help me. I knew that none had fallen since -the evening before, and also that there had been a strong frost -to preserve impressions. I passed along the tradesmen's path, but -found it all trampled down and indistinguishable. Just beyond it, -however, at the far side of the kitchen door, a woman had stood -and talked with a man, whose round impressions on one side showed -that he had a wooden leg. I could even tell that they had been -disturbed, for the woman had run back swiftly to the door, as was -shown by the deep toe and light heel marks, while Wooden-leg had -waited a little, and then had gone away. I thought at the time -that this might be the maid and her sweetheart, of whom you had -already spoken to me, and inquiry showed it was so. I passed -round the garden without seeing anything more than random tracks, -which I took to be the police; but when I got into the stable -lane a very long and complex story was written in the snow in -front of me. - -"There was a double line of tracks of a booted man, and a second -double line which I saw with delight belonged to a man with naked -feet. I was at once convinced from what you had told me that the -latter was your son. The first had walked both ways, but the -other had run swiftly, and as his tread was marked in places over -the depression of the boot, it was obvious that he had passed -after the other. I followed them up and found they led to the -hall window, where Boots had worn all the snow away while -waiting. Then I walked to the other end, which was a hundred -yards or more down the lane. I saw where Boots had faced round, -where the snow was cut up as though there had been a struggle, -and, finally, where a few drops of blood had fallen, to show me -that I was not mistaken. Boots had then run down the lane, and -another little smudge of blood showed that it was he who had been -hurt. When he came to the highroad at the other end, I found that -the pavement had been cleared, so there was an end to that clue. - -"On entering the house, however, I examined, as you remember, the -sill and framework of the hall window with my lens, and I could -at once see that someone had passed out. I could distinguish the -outline of an instep where the wet foot had been placed in coming -in. I was then beginning to be able to form an opinion as to what -had occurred. A man had waited outside the window; someone had -brought the gems; the deed had been overseen by your son; he had -pursued the thief; had struggled with him; they had each tugged -at the coronet, their united strength causing injuries which -neither alone could have effected. He had returned with the -prize, but had left a fragment in the grasp of his opponent. So -far I was clear. The question now was, who was the man and who -was it brought him the coronet? - -"It is an old maxim of mine that when you have excluded the -impossible, whatever remains, however improbable, must be the -truth. Now, I knew that it was not you who had brought it down, -so there only remained your niece and the maids. But if it were -the maids, why should your son allow himself to be accused in -their place? There could be no possible reason. As he loved his -cousin, however, there was an excellent explanation why he should -retain her secret--the more so as the secret was a disgraceful -one. When I remembered that you had seen her at that window, and -how she had fainted on seeing the coronet again, my conjecture -became a certainty. - -"And who could it be who was her confederate? A lover evidently, -for who else could outweigh the love and gratitude which she must -feel to you? I knew that you went out little, and that your -circle of friends was a very limited one. But among them was Sir -George Burnwell. I had heard of him before as being a man of evil -reputation among women. It must have been he who wore those boots -and retained the missing gems. Even though he knew that Arthur -had discovered him, he might still flatter himself that he was -safe, for the lad could not say a word without compromising his -own family. - -"Well, your own good sense will suggest what measures I took -next. I went in the shape of a loafer to Sir George's house, -managed to pick up an acquaintance with his valet, learned that -his master had cut his head the night before, and, finally, at -the expense of six shillings, made all sure by buying a pair of -his cast-off shoes. With these I journeyed down to Streatham and -saw that they exactly fitted the tracks." - -"I saw an ill-dressed vagabond in the lane yesterday evening," -said Mr. Holder. - -"Precisely. It was I. I found that I had my man, so I came home -and changed my clothes. It was a delicate part which I had to -play then, for I saw that a prosecution must be avoided to avert -scandal, and I knew that so astute a villain would see that our -hands were tied in the matter. I went and saw him. At first, of -course, he denied everything. But when I gave him every -particular that had occurred, he tried to bluster and took down a -life-preserver from the wall. I knew my man, however, and I -clapped a pistol to his head before he could strike. Then he -became a little more reasonable. I told him that we would give -him a price for the stones he held--1000 pounds apiece. That -brought out the first signs of grief that he had shown. 'Why, -dash it all!' said he, 'I've let them go at six hundred for the -three!' I soon managed to get the address of the receiver who had -them, on promising him that there would be no prosecution. Off I -set to him, and after much chaffering I got our stones at 1000 -pounds apiece. Then I looked in upon your son, told him that all -was right, and eventually got to my bed about two o'clock, after -what I may call a really hard day's work." - -"A day which has saved England from a great public scandal," said -the banker, rising. "Sir, I cannot find words to thank you, but -you shall not find me ungrateful for what you have done. Your -skill has indeed exceeded all that I have heard of it. And now I -must fly to my dear boy to apologise to him for the wrong which I -have done him. As to what you tell me of poor Mary, it goes to my -very heart. Not even your skill can inform me where she is now." - -"I think that we may safely say," returned Holmes, "that she is -wherever Sir George Burnwell is. It is equally certain, too, that -whatever her sins are, they will soon receive a more than -sufficient punishment." - - - -XII. THE ADVENTURE OF THE COPPER BEECHES - -"To the man who loves art for its own sake," remarked Sherlock -Holmes, tossing aside the advertisement sheet of the Daily -Telegraph, "it is frequently in its least important and lowliest -manifestations that the keenest pleasure is to be derived. It is -pleasant to me to observe, Watson, that you have so far grasped -this truth that in these little records of our cases which you -have been good enough to draw up, and, I am bound to say, -occasionally to embellish, you have given prominence not so much -to the many causes célèbres and sensational trials in which I -have figured but rather to those incidents which may have been -trivial in themselves, but which have given room for those -faculties of deduction and of logical synthesis which I have made -my special province." - -"And yet," said I, smiling, "I cannot quite hold myself absolved -from the charge of sensationalism which has been urged against my -records." - -"You have erred, perhaps," he observed, taking up a glowing -cinder with the tongs and lighting with it the long cherry-wood -pipe which was wont to replace his clay when he was in a -disputatious rather than a meditative mood--"you have erred -perhaps in attempting to put colour and life into each of your -statements instead of confining yourself to the task of placing -upon record that severe reasoning from cause to effect which is -really the only notable feature about the thing." - -"It seems to me that I have done you full justice in the matter," -I remarked with some coldness, for I was repelled by the egotism -which I had more than once observed to be a strong factor in my -friend's singular character. - -"No, it is not selfishness or conceit," said he, answering, as -was his wont, my thoughts rather than my words. "If I claim full -justice for my art, it is because it is an impersonal thing--a -thing beyond myself. Crime is common. Logic is rare. Therefore it -is upon the logic rather than upon the crime that you should -dwell. You have degraded what should have been a course of -lectures into a series of tales." - -It was a cold morning of the early spring, and we sat after -breakfast on either side of a cheery fire in the old room at -Baker Street. A thick fog rolled down between the lines of -dun-coloured houses, and the opposing windows loomed like dark, -shapeless blurs through the heavy yellow wreaths. Our gas was lit -and shone on the white cloth and glimmer of china and metal, for -the table had not been cleared yet. Sherlock Holmes had been -silent all the morning, dipping continuously into the -advertisement columns of a succession of papers until at last, -having apparently given up his search, he had emerged in no very -sweet temper to lecture me upon my literary shortcomings. - -"At the same time," he remarked after a pause, during which he -had sat puffing at his long pipe and gazing down into the fire, -"you can hardly be open to a charge of sensationalism, for out of -these cases which you have been so kind as to interest yourself -in, a fair proportion do not treat of crime, in its legal sense, -at all. The small matter in which I endeavoured to help the King -of Bohemia, the singular experience of Miss Mary Sutherland, the -problem connected with the man with the twisted lip, and the -incident of the noble bachelor, were all matters which are -outside the pale of the law. But in avoiding the sensational, I -fear that you may have bordered on the trivial." - -"The end may have been so," I answered, "but the methods I hold -to have been novel and of interest." - -"Pshaw, my dear fellow, what do the public, the great unobservant -public, who could hardly tell a weaver by his tooth or a -compositor by his left thumb, care about the finer shades of -analysis and deduction! But, indeed, if you are trivial, I cannot -blame you, for the days of the great cases are past. Man, or at -least criminal man, has lost all enterprise and originality. As -to my own little practice, it seems to be degenerating into an -agency for recovering lost lead pencils and giving advice to -young ladies from boarding-schools. I think that I have touched -bottom at last, however. This note I had this morning marks my -zero-point, I fancy. Read it!" He tossed a crumpled letter across -to me. - -It was dated from Montague Place upon the preceding evening, and -ran thus: - -"DEAR MR. HOLMES:--I am very anxious to consult you as to whether -I should or should not accept a situation which has been offered -to me as governess. I shall call at half-past ten to-morrow if I -do not inconvenience you. Yours faithfully, - "VIOLET HUNTER." - -"Do you know the young lady?" I asked. - -"Not I." - -"It is half-past ten now." - -"Yes, and I have no doubt that is her ring." - -"It may turn out to be of more interest than you think. You -remember that the affair of the blue carbuncle, which appeared to -be a mere whim at first, developed into a serious investigation. -It may be so in this case, also." - -"Well, let us hope so. But our doubts will very soon be solved, -for here, unless I am much mistaken, is the person in question." - -As he spoke the door opened and a young lady entered the room. -She was plainly but neatly dressed, with a bright, quick face, -freckled like a plover's egg, and with the brisk manner of a -woman who has had her own way to make in the world. - -"You will excuse my troubling you, I am sure," said she, as my -companion rose to greet her, "but I have had a very strange -experience, and as I have no parents or relations of any sort -from whom I could ask advice, I thought that perhaps you would be -kind enough to tell me what I should do." - -"Pray take a seat, Miss Hunter. I shall be happy to do anything -that I can to serve you." - -I could see that Holmes was favourably impressed by the manner -and speech of his new client. He looked her over in his searching -fashion, and then composed himself, with his lids drooping and -his finger-tips together, to listen to her story. - -"I have been a governess for five years," said she, "in the -family of Colonel Spence Munro, but two months ago the colonel -received an appointment at Halifax, in Nova Scotia, and took his -children over to America with him, so that I found myself without -a situation. I advertised, and I answered advertisements, but -without success. At last the little money which I had saved began -to run short, and I was at my wit's end as to what I should do. - -"There is a well-known agency for governesses in the West End -called Westaway's, and there I used to call about once a week in -order to see whether anything had turned up which might suit me. -Westaway was the name of the founder of the business, but it is -really managed by Miss Stoper. She sits in her own little office, -and the ladies who are seeking employment wait in an anteroom, -and are then shown in one by one, when she consults her ledgers -and sees whether she has anything which would suit them. - -"Well, when I called last week I was shown into the little office -as usual, but I found that Miss Stoper was not alone. A -prodigiously stout man with a very smiling face and a great heavy -chin which rolled down in fold upon fold over his throat sat at -her elbow with a pair of glasses on his nose, looking very -earnestly at the ladies who entered. As I came in he gave quite a -jump in his chair and turned quickly to Miss Stoper. - -"'That will do,' said he; 'I could not ask for anything better. -Capital! capital!' He seemed quite enthusiastic and rubbed his -hands together in the most genial fashion. He was such a -comfortable-looking man that it was quite a pleasure to look at -him. - -"'You are looking for a situation, miss?' he asked. - -"'Yes, sir.' - -"'As governess?' - -"'Yes, sir.' - -"'And what salary do you ask?' - -"'I had 4 pounds a month in my last place with Colonel Spence -Munro.' - -"'Oh, tut, tut! sweating--rank sweating!' he cried, throwing his -fat hands out into the air like a man who is in a boiling -passion. 'How could anyone offer so pitiful a sum to a lady with -such attractions and accomplishments?' - -"'My accomplishments, sir, may be less than you imagine,' said I. -'A little French, a little German, music, and drawing--' - -"'Tut, tut!' he cried. 'This is all quite beside the question. -The point is, have you or have you not the bearing and deportment -of a lady? There it is in a nutshell. If you have not, you are -not fitted for the rearing of a child who may some day play a -considerable part in the history of the country. But if you have -why, then, how could any gentleman ask you to condescend to -accept anything under the three figures? Your salary with me, -madam, would commence at 100 pounds a year.' - -"You may imagine, Mr. Holmes, that to me, destitute as I was, -such an offer seemed almost too good to be true. The gentleman, -however, seeing perhaps the look of incredulity upon my face, -opened a pocket-book and took out a note. - -"'It is also my custom,' said he, smiling in the most pleasant -fashion until his eyes were just two little shining slits amid -the white creases of his face, 'to advance to my young ladies -half their salary beforehand, so that they may meet any little -expenses of their journey and their wardrobe.' - -"It seemed to me that I had never met so fascinating and so -thoughtful a man. As I was already in debt to my tradesmen, the -advance was a great convenience, and yet there was something -unnatural about the whole transaction which made me wish to know -a little more before I quite committed myself. - -"'May I ask where you live, sir?' said I. - -"'Hampshire. Charming rural place. The Copper Beeches, five miles -on the far side of Winchester. It is the most lovely country, my -dear young lady, and the dearest old country-house.' - -"'And my duties, sir? I should be glad to know what they would -be.' - -"'One child--one dear little romper just six years old. Oh, if -you could see him killing cockroaches with a slipper! Smack! -smack! smack! Three gone before you could wink!' He leaned back -in his chair and laughed his eyes into his head again. - -"I was a little startled at the nature of the child's amusement, -but the father's laughter made me think that perhaps he was -joking. - -"'My sole duties, then,' I asked, 'are to take charge of a single -child?' - -"'No, no, not the sole, not the sole, my dear young lady,' he -cried. 'Your duty would be, as I am sure your good sense would -suggest, to obey any little commands my wife might give, provided -always that they were such commands as a lady might with -propriety obey. You see no difficulty, heh?' - -"'I should be happy to make myself useful.' - -"'Quite so. In dress now, for example. We are faddy people, you -know--faddy but kind-hearted. If you were asked to wear any dress -which we might give you, you would not object to our little whim. -Heh?' - -"'No,' said I, considerably astonished at his words. - -"'Or to sit here, or sit there, that would not be offensive to -you?' - -"'Oh, no.' - -"'Or to cut your hair quite short before you come to us?' - -"I could hardly believe my ears. As you may observe, Mr. Holmes, -my hair is somewhat luxuriant, and of a rather peculiar tint of -chestnut. It has been considered artistic. I could not dream of -sacrificing it in this offhand fashion. - -"'I am afraid that that is quite impossible,' said I. He had been -watching me eagerly out of his small eyes, and I could see a -shadow pass over his face as I spoke. - -"'I am afraid that it is quite essential,' said he. 'It is a -little fancy of my wife's, and ladies' fancies, you know, madam, -ladies' fancies must be consulted. And so you won't cut your -hair?' - -"'No, sir, I really could not,' I answered firmly. - -"'Ah, very well; then that quite settles the matter. It is a -pity, because in other respects you would really have done very -nicely. In that case, Miss Stoper, I had best inspect a few more -of your young ladies.' - -"The manageress had sat all this while busy with her papers -without a word to either of us, but she glanced at me now with so -much annoyance upon her face that I could not help suspecting -that she had lost a handsome commission through my refusal. - -"'Do you desire your name to be kept upon the books?' she asked. - -"'If you please, Miss Stoper.' - -"'Well, really, it seems rather useless, since you refuse the -most excellent offers in this fashion,' said she sharply. 'You -can hardly expect us to exert ourselves to find another such -opening for you. Good-day to you, Miss Hunter.' She struck a gong -upon the table, and I was shown out by the page. - -"Well, Mr. Holmes, when I got back to my lodgings and found -little enough in the cupboard, and two or three bills upon the -table, I began to ask myself whether I had not done a very -foolish thing. After all, if these people had strange fads and -expected obedience on the most extraordinary matters, they were -at least ready to pay for their eccentricity. Very few -governesses in England are getting 100 pounds a year. Besides, -what use was my hair to me? Many people are improved by wearing -it short and perhaps I should be among the number. Next day I was -inclined to think that I had made a mistake, and by the day after -I was sure of it. I had almost overcome my pride so far as to go -back to the agency and inquire whether the place was still open -when I received this letter from the gentleman himself. I have it -here and I will read it to you: - - "'The Copper Beeches, near Winchester. -"'DEAR MISS HUNTER:--Miss Stoper has very kindly given me your -address, and I write from here to ask you whether you have -reconsidered your decision. My wife is very anxious that you -should come, for she has been much attracted by my description of -you. We are willing to give 30 pounds a quarter, or 120 pounds a -year, so as to recompense you for any little inconvenience which -our fads may cause you. They are not very exacting, after all. My -wife is fond of a particular shade of electric blue and would -like you to wear such a dress indoors in the morning. You need -not, however, go to the expense of purchasing one, as we have one -belonging to my dear daughter Alice (now in Philadelphia), which -would, I should think, fit you very well. Then, as to sitting -here or there, or amusing yourself in any manner indicated, that -need cause you no inconvenience. As regards your hair, it is no -doubt a pity, especially as I could not help remarking its beauty -during our short interview, but I am afraid that I must remain -firm upon this point, and I only hope that the increased salary -may recompense you for the loss. Your duties, as far as the child -is concerned, are very light. Now do try to come, and I shall -meet you with the dog-cart at Winchester. Let me know your train. -Yours faithfully, JEPHRO RUCASTLE.' - -"That is the letter which I have just received, Mr. Holmes, and -my mind is made up that I will accept it. I thought, however, -that before taking the final step I should like to submit the -whole matter to your consideration." - -"Well, Miss Hunter, if your mind is made up, that settles the -question," said Holmes, smiling. - -"But you would not advise me to refuse?" - -"I confess that it is not the situation which I should like to -see a sister of mine apply for." - -"What is the meaning of it all, Mr. Holmes?" - -"Ah, I have no data. I cannot tell. Perhaps you have yourself -formed some opinion?" - -"Well, there seems to me to be only one possible solution. Mr. -Rucastle seemed to be a very kind, good-natured man. Is it not -possible that his wife is a lunatic, that he desires to keep the -matter quiet for fear she should be taken to an asylum, and that -he humours her fancies in every way in order to prevent an -outbreak?" - -"That is a possible solution--in fact, as matters stand, it is -the most probable one. But in any case it does not seem to be a -nice household for a young lady." - -"But the money, Mr. Holmes, the money!" - -"Well, yes, of course the pay is good--too good. That is what -makes me uneasy. Why should they give you 120 pounds a year, when -they could have their pick for 40 pounds? There must be some -strong reason behind." - -"I thought that if I told you the circumstances you would -understand afterwards if I wanted your help. I should feel so -much stronger if I felt that you were at the back of me." - -"Oh, you may carry that feeling away with you. I assure you that -your little problem promises to be the most interesting which has -come my way for some months. There is something distinctly novel -about some of the features. If you should find yourself in doubt -or in danger--" - -"Danger! What danger do you foresee?" - -Holmes shook his head gravely. "It would cease to be a danger if -we could define it," said he. "But at any time, day or night, a -telegram would bring me down to your help." - -"That is enough." She rose briskly from her chair with the -anxiety all swept from her face. "I shall go down to Hampshire -quite easy in my mind now. I shall write to Mr. Rucastle at once, -sacrifice my poor hair to-night, and start for Winchester -to-morrow." With a few grateful words to Holmes she bade us both -good-night and bustled off upon her way. - -"At least," said I as we heard her quick, firm steps descending -the stairs, "she seems to be a young lady who is very well able -to take care of herself." - -"And she would need to be," said Holmes gravely. "I am much -mistaken if we do not hear from her before many days are past." - -It was not very long before my friend's prediction was fulfilled. -A fortnight went by, during which I frequently found my thoughts -turning in her direction and wondering what strange side-alley of -human experience this lonely woman had strayed into. The unusual -salary, the curious conditions, the light duties, all pointed to -something abnormal, though whether a fad or a plot, or whether -the man were a philanthropist or a villain, it was quite beyond -my powers to determine. As to Holmes, I observed that he sat -frequently for half an hour on end, with knitted brows and an -abstracted air, but he swept the matter away with a wave of his -hand when I mentioned it. "Data! data! data!" he cried -impatiently. "I can't make bricks without clay." And yet he would -always wind up by muttering that no sister of his should ever -have accepted such a situation. - -The telegram which we eventually received came late one night -just as I was thinking of turning in and Holmes was settling down -to one of those all-night chemical researches which he frequently -indulged in, when I would leave him stooping over a retort and a -test-tube at night and find him in the same position when I came -down to breakfast in the morning. He opened the yellow envelope, -and then, glancing at the message, threw it across to me. - -"Just look up the trains in Bradshaw," said he, and turned back -to his chemical studies. - -The summons was a brief and urgent one. - -"Please be at the Black Swan Hotel at Winchester at midday -to-morrow," it said. "Do come! I am at my wit's end. HUNTER." - -"Will you come with me?" asked Holmes, glancing up. - -"I should wish to." - -"Just look it up, then." - -"There is a train at half-past nine," said I, glancing over my -Bradshaw. "It is due at Winchester at 11:30." - -"That will do very nicely. Then perhaps I had better postpone my -analysis of the acetones, as we may need to be at our best in the -morning." - -By eleven o'clock the next day we were well upon our way to the -old English capital. Holmes had been buried in the morning papers -all the way down, but after we had passed the Hampshire border he -threw them down and began to admire the scenery. It was an ideal -spring day, a light blue sky, flecked with little fleecy white -clouds drifting across from west to east. The sun was shining -very brightly, and yet there was an exhilarating nip in the air, -which set an edge to a man's energy. All over the countryside, -away to the rolling hills around Aldershot, the little red and -grey roofs of the farm-steadings peeped out from amid the light -green of the new foliage. - -"Are they not fresh and beautiful?" I cried with all the -enthusiasm of a man fresh from the fogs of Baker Street. - -But Holmes shook his head gravely. - -"Do you know, Watson," said he, "that it is one of the curses of -a mind with a turn like mine that I must look at everything with -reference to my own special subject. You look at these scattered -houses, and you are impressed by their beauty. I look at them, -and the only thought which comes to me is a feeling of their -isolation and of the impunity with which crime may be committed -there." - -"Good heavens!" I cried. "Who would associate crime with these -dear old homesteads?" - -"They always fill me with a certain horror. It is my belief, -Watson, founded upon my experience, that the lowest and vilest -alleys in London do not present a more dreadful record of sin -than does the smiling and beautiful countryside." - -"You horrify me!" - -"But the reason is very obvious. The pressure of public opinion -can do in the town what the law cannot accomplish. There is no -lane so vile that the scream of a tortured child, or the thud of -a drunkard's blow, does not beget sympathy and indignation among -the neighbours, and then the whole machinery of justice is ever -so close that a word of complaint can set it going, and there is -but a step between the crime and the dock. But look at these -lonely houses, each in its own fields, filled for the most part -with poor ignorant folk who know little of the law. Think of the -deeds of hellish cruelty, the hidden wickedness which may go on, -year in, year out, in such places, and none the wiser. Had this -lady who appeals to us for help gone to live in Winchester, I -should never have had a fear for her. It is the five miles of -country which makes the danger. Still, it is clear that she is -not personally threatened." - -"No. If she can come to Winchester to meet us she can get away." - -"Quite so. She has her freedom." - -"What CAN be the matter, then? Can you suggest no explanation?" - -"I have devised seven separate explanations, each of which would -cover the facts as far as we know them. But which of these is -correct can only be determined by the fresh information which we -shall no doubt find waiting for us. Well, there is the tower of -the cathedral, and we shall soon learn all that Miss Hunter has -to tell." - -The Black Swan is an inn of repute in the High Street, at no -distance from the station, and there we found the young lady -waiting for us. She had engaged a sitting-room, and our lunch -awaited us upon the table. - -"I am so delighted that you have come," she said earnestly. "It -is so very kind of you both; but indeed I do not know what I -should do. Your advice will be altogether invaluable to me." - -"Pray tell us what has happened to you." - -"I will do so, and I must be quick, for I have promised Mr. -Rucastle to be back before three. I got his leave to come into -town this morning, though he little knew for what purpose." - -"Let us have everything in its due order." Holmes thrust his long -thin legs out towards the fire and composed himself to listen. - -"In the first place, I may say that I have met, on the whole, -with no actual ill-treatment from Mr. and Mrs. Rucastle. It is -only fair to them to say that. But I cannot understand them, and -I am not easy in my mind about them." - -"What can you not understand?" - -"Their reasons for their conduct. But you shall have it all just -as it occurred. When I came down, Mr. Rucastle met me here and -drove me in his dog-cart to the Copper Beeches. It is, as he -said, beautifully situated, but it is not beautiful in itself, -for it is a large square block of a house, whitewashed, but all -stained and streaked with damp and bad weather. There are grounds -round it, woods on three sides, and on the fourth a field which -slopes down to the Southampton highroad, which curves past about -a hundred yards from the front door. This ground in front belongs -to the house, but the woods all round are part of Lord -Southerton's preserves. A clump of copper beeches immediately in -front of the hall door has given its name to the place. - -"I was driven over by my employer, who was as amiable as ever, -and was introduced by him that evening to his wife and the child. -There was no truth, Mr. Holmes, in the conjecture which seemed to -us to be probable in your rooms at Baker Street. Mrs. Rucastle is -not mad. I found her to be a silent, pale-faced woman, much -younger than her husband, not more than thirty, I should think, -while he can hardly be less than forty-five. From their -conversation I have gathered that they have been married about -seven years, that he was a widower, and that his only child by -the first wife was the daughter who has gone to Philadelphia. Mr. -Rucastle told me in private that the reason why she had left them -was that she had an unreasoning aversion to her stepmother. As -the daughter could not have been less than twenty, I can quite -imagine that her position must have been uncomfortable with her -father's young wife. - -"Mrs. Rucastle seemed to me to be colourless in mind as well as -in feature. She impressed me neither favourably nor the reverse. -She was a nonentity. It was easy to see that she was passionately -devoted both to her husband and to her little son. Her light grey -eyes wandered continually from one to the other, noting every -little want and forestalling it if possible. He was kind to her -also in his bluff, boisterous fashion, and on the whole they -seemed to be a happy couple. And yet she had some secret sorrow, -this woman. She would often be lost in deep thought, with the -saddest look upon her face. More than once I have surprised her -in tears. I have thought sometimes that it was the disposition of -her child which weighed upon her mind, for I have never met so -utterly spoiled and so ill-natured a little creature. He is small -for his age, with a head which is quite disproportionately large. -His whole life appears to be spent in an alternation between -savage fits of passion and gloomy intervals of sulking. Giving -pain to any creature weaker than himself seems to be his one idea -of amusement, and he shows quite remarkable talent in planning -the capture of mice, little birds, and insects. But I would -rather not talk about the creature, Mr. Holmes, and, indeed, he -has little to do with my story." - -"I am glad of all details," remarked my friend, "whether they -seem to you to be relevant or not." - -"I shall try not to miss anything of importance. The one -unpleasant thing about the house, which struck me at once, was -the appearance and conduct of the servants. There are only two, a -man and his wife. Toller, for that is his name, is a rough, -uncouth man, with grizzled hair and whiskers, and a perpetual -smell of drink. Twice since I have been with them he has been -quite drunk, and yet Mr. Rucastle seemed to take no notice of it. -His wife is a very tall and strong woman with a sour face, as -silent as Mrs. Rucastle and much less amiable. They are a most -unpleasant couple, but fortunately I spend most of my time in the -nursery and my own room, which are next to each other in one -corner of the building. - -"For two days after my arrival at the Copper Beeches my life was -very quiet; on the third, Mrs. Rucastle came down just after -breakfast and whispered something to her husband. - -"'Oh, yes,' said he, turning to me, 'we are very much obliged to -you, Miss Hunter, for falling in with our whims so far as to cut -your hair. I assure you that it has not detracted in the tiniest -iota from your appearance. We shall now see how the electric-blue -dress will become you. You will find it laid out upon the bed in -your room, and if you would be so good as to put it on we should -both be extremely obliged.' - -"The dress which I found waiting for me was of a peculiar shade -of blue. It was of excellent material, a sort of beige, but it -bore unmistakable signs of having been worn before. It could not -have been a better fit if I had been measured for it. Both Mr. -and Mrs. Rucastle expressed a delight at the look of it, which -seemed quite exaggerated in its vehemence. They were waiting for -me in the drawing-room, which is a very large room, stretching -along the entire front of the house, with three long windows -reaching down to the floor. A chair had been placed close to the -central window, with its back turned towards it. In this I was -asked to sit, and then Mr. Rucastle, walking up and down on the -other side of the room, began to tell me a series of the funniest -stories that I have ever listened to. You cannot imagine how -comical he was, and I laughed until I was quite weary. Mrs. -Rucastle, however, who has evidently no sense of humour, never so -much as smiled, but sat with her hands in her lap, and a sad, -anxious look upon her face. After an hour or so, Mr. Rucastle -suddenly remarked that it was time to commence the duties of the -day, and that I might change my dress and go to little Edward in -the nursery. - -"Two days later this same performance was gone through under -exactly similar circumstances. Again I changed my dress, again I -sat in the window, and again I laughed very heartily at the funny -stories of which my employer had an immense répertoire, and which -he told inimitably. Then he handed me a yellow-backed novel, and -moving my chair a little sideways, that my own shadow might not -fall upon the page, he begged me to read aloud to him. I read for -about ten minutes, beginning in the heart of a chapter, and then -suddenly, in the middle of a sentence, he ordered me to cease and -to change my dress. - -"You can easily imagine, Mr. Holmes, how curious I became as to -what the meaning of this extraordinary performance could possibly -be. They were always very careful, I observed, to turn my face -away from the window, so that I became consumed with the desire -to see what was going on behind my back. At first it seemed to be -impossible, but I soon devised a means. My hand-mirror had been -broken, so a happy thought seized me, and I concealed a piece of -the glass in my handkerchief. On the next occasion, in the midst -of my laughter, I put my handkerchief up to my eyes, and was able -with a little management to see all that there was behind me. I -confess that I was disappointed. There was nothing. At least that -was my first impression. At the second glance, however, I -perceived that there was a man standing in the Southampton Road, -a small bearded man in a grey suit, who seemed to be looking in -my direction. The road is an important highway, and there are -usually people there. This man, however, was leaning against the -railings which bordered our field and was looking earnestly up. I -lowered my handkerchief and glanced at Mrs. Rucastle to find her -eyes fixed upon me with a most searching gaze. She said nothing, -but I am convinced that she had divined that I had a mirror in my -hand and had seen what was behind me. She rose at once. - -"'Jephro,' said she, 'there is an impertinent fellow upon the -road there who stares up at Miss Hunter.' - -"'No friend of yours, Miss Hunter?' he asked. - -"'No, I know no one in these parts.' - -"'Dear me! How very impertinent! Kindly turn round and motion to -him to go away.' - -"'Surely it would be better to take no notice.' - -"'No, no, we should have him loitering here always. Kindly turn -round and wave him away like that.' - -"I did as I was told, and at the same instant Mrs. Rucastle drew -down the blind. That was a week ago, and from that time I have -not sat again in the window, nor have I worn the blue dress, nor -seen the man in the road." - -"Pray continue," said Holmes. "Your narrative promises to be a -most interesting one." - -"You will find it rather disconnected, I fear, and there may -prove to be little relation between the different incidents of -which I speak. On the very first day that I was at the Copper -Beeches, Mr. Rucastle took me to a small outhouse which stands -near the kitchen door. As we approached it I heard the sharp -rattling of a chain, and the sound as of a large animal moving -about. - -"'Look in here!' said Mr. Rucastle, showing me a slit between two -planks. 'Is he not a beauty?' - -"I looked through and was conscious of two glowing eyes, and of a -vague figure huddled up in the darkness. - -"'Don't be frightened,' said my employer, laughing at the start -which I had given. 'It's only Carlo, my mastiff. I call him mine, -but really old Toller, my groom, is the only man who can do -anything with him. We feed him once a day, and not too much then, -so that he is always as keen as mustard. Toller lets him loose -every night, and God help the trespasser whom he lays his fangs -upon. For goodness' sake don't you ever on any pretext set your -foot over the threshold at night, for it's as much as your life -is worth.' - -"The warning was no idle one, for two nights later I happened to -look out of my bedroom window about two o'clock in the morning. -It was a beautiful moonlight night, and the lawn in front of the -house was silvered over and almost as bright as day. I was -standing, rapt in the peaceful beauty of the scene, when I was -aware that something was moving under the shadow of the copper -beeches. As it emerged into the moonshine I saw what it was. It -was a giant dog, as large as a calf, tawny tinted, with hanging -jowl, black muzzle, and huge projecting bones. It walked slowly -across the lawn and vanished into the shadow upon the other side. -That dreadful sentinel sent a chill to my heart which I do not -think that any burglar could have done. - -"And now I have a very strange experience to tell you. I had, as -you know, cut off my hair in London, and I had placed it in a -great coil at the bottom of my trunk. One evening, after the -child was in bed, I began to amuse myself by examining the -furniture of my room and by rearranging my own little things. -There was an old chest of drawers in the room, the two upper ones -empty and open, the lower one locked. I had filled the first two -with my linen, and as I had still much to pack away I was -naturally annoyed at not having the use of the third drawer. It -struck me that it might have been fastened by a mere oversight, -so I took out my bunch of keys and tried to open it. The very -first key fitted to perfection, and I drew the drawer open. There -was only one thing in it, but I am sure that you would never -guess what it was. It was my coil of hair. - -"I took it up and examined it. It was of the same peculiar tint, -and the same thickness. But then the impossibility of the thing -obtruded itself upon me. How could my hair have been locked in -the drawer? With trembling hands I undid my trunk, turned out the -contents, and drew from the bottom my own hair. I laid the two -tresses together, and I assure you that they were identical. Was -it not extraordinary? Puzzle as I would, I could make nothing at -all of what it meant. I returned the strange hair to the drawer, -and I said nothing of the matter to the Rucastles as I felt that -I had put myself in the wrong by opening a drawer which they had -locked. - -"I am naturally observant, as you may have remarked, Mr. Holmes, -and I soon had a pretty good plan of the whole house in my head. -There was one wing, however, which appeared not to be inhabited -at all. A door which faced that which led into the quarters of -the Tollers opened into this suite, but it was invariably locked. -One day, however, as I ascended the stair, I met Mr. Rucastle -coming out through this door, his keys in his hand, and a look on -his face which made him a very different person to the round, -jovial man to whom I was accustomed. His cheeks were red, his -brow was all crinkled with anger, and the veins stood out at his -temples with passion. He locked the door and hurried past me -without a word or a look. - -"This aroused my curiosity, so when I went out for a walk in the -grounds with my charge, I strolled round to the side from which I -could see the windows of this part of the house. There were four -of them in a row, three of which were simply dirty, while the -fourth was shuttered up. They were evidently all deserted. As I -strolled up and down, glancing at them occasionally, Mr. Rucastle -came out to me, looking as merry and jovial as ever. - -"'Ah!' said he, 'you must not think me rude if I passed you -without a word, my dear young lady. I was preoccupied with -business matters.' - -"I assured him that I was not offended. 'By the way,' said I, -'you seem to have quite a suite of spare rooms up there, and one -of them has the shutters up.' - -"He looked surprised and, as it seemed to me, a little startled -at my remark. - -"'Photography is one of my hobbies,' said he. 'I have made my -dark room up there. But, dear me! what an observant young lady we -have come upon. Who would have believed it? Who would have ever -believed it?' He spoke in a jesting tone, but there was no jest -in his eyes as he looked at me. I read suspicion there and -annoyance, but no jest. - -"Well, Mr. Holmes, from the moment that I understood that there -was something about that suite of rooms which I was not to know, -I was all on fire to go over them. It was not mere curiosity, -though I have my share of that. It was more a feeling of duty--a -feeling that some good might come from my penetrating to this -place. They talk of woman's instinct; perhaps it was woman's -instinct which gave me that feeling. At any rate, it was there, -and I was keenly on the lookout for any chance to pass the -forbidden door. - -"It was only yesterday that the chance came. I may tell you that, -besides Mr. Rucastle, both Toller and his wife find something to -do in these deserted rooms, and I once saw him carrying a large -black linen bag with him through the door. Recently he has been -drinking hard, and yesterday evening he was very drunk; and when -I came upstairs there was the key in the door. I have no doubt at -all that he had left it there. Mr. and Mrs. Rucastle were both -downstairs, and the child was with them, so that I had an -admirable opportunity. I turned the key gently in the lock, -opened the door, and slipped through. - -"There was a little passage in front of me, unpapered and -uncarpeted, which turned at a right angle at the farther end. -Round this corner were three doors in a line, the first and third -of which were open. They each led into an empty room, dusty and -cheerless, with two windows in the one and one in the other, so -thick with dirt that the evening light glimmered dimly through -them. The centre door was closed, and across the outside of it -had been fastened one of the broad bars of an iron bed, padlocked -at one end to a ring in the wall, and fastened at the other with -stout cord. The door itself was locked as well, and the key was -not there. This barricaded door corresponded clearly with the -shuttered window outside, and yet I could see by the glimmer from -beneath it that the room was not in darkness. Evidently there was -a skylight which let in light from above. As I stood in the -passage gazing at the sinister door and wondering what secret it -might veil, I suddenly heard the sound of steps within the room -and saw a shadow pass backward and forward against the little -slit of dim light which shone out from under the door. A mad, -unreasoning terror rose up in me at the sight, Mr. Holmes. My -overstrung nerves failed me suddenly, and I turned and ran--ran -as though some dreadful hand were behind me clutching at the -skirt of my dress. I rushed down the passage, through the door, -and straight into the arms of Mr. Rucastle, who was waiting -outside. - -"'So,' said he, smiling, 'it was you, then. I thought that it -must be when I saw the door open.' - -"'Oh, I am so frightened!' I panted. - -"'My dear young lady! my dear young lady!'--you cannot think how -caressing and soothing his manner was--'and what has frightened -you, my dear young lady?' - -"But his voice was just a little too coaxing. He overdid it. I -was keenly on my guard against him. - -"'I was foolish enough to go into the empty wing,' I answered. -'But it is so lonely and eerie in this dim light that I was -frightened and ran out again. Oh, it is so dreadfully still in -there!' - -"'Only that?' said he, looking at me keenly. - -"'Why, what did you think?' I asked. - -"'Why do you think that I lock this door?' - -"'I am sure that I do not know.' - -"'It is to keep people out who have no business there. Do you -see?' He was still smiling in the most amiable manner. - -"'I am sure if I had known--' - -"'Well, then, you know now. And if you ever put your foot over -that threshold again'--here in an instant the smile hardened into -a grin of rage, and he glared down at me with the face of a -demon--'I'll throw you to the mastiff.' - -"I was so terrified that I do not know what I did. I suppose that -I must have rushed past him into my room. I remember nothing -until I found myself lying on my bed trembling all over. Then I -thought of you, Mr. Holmes. I could not live there longer without -some advice. I was frightened of the house, of the man, of the -woman, of the servants, even of the child. They were all horrible -to me. If I could only bring you down all would be well. Of -course I might have fled from the house, but my curiosity was -almost as strong as my fears. My mind was soon made up. I would -send you a wire. I put on my hat and cloak, went down to the -office, which is about half a mile from the house, and then -returned, feeling very much easier. A horrible doubt came into my -mind as I approached the door lest the dog might be loose, but I -remembered that Toller had drunk himself into a state of -insensibility that evening, and I knew that he was the only one -in the household who had any influence with the savage creature, -or who would venture to set him free. I slipped in in safety and -lay awake half the night in my joy at the thought of seeing you. -I had no difficulty in getting leave to come into Winchester this -morning, but I must be back before three o'clock, for Mr. and -Mrs. Rucastle are going on a visit, and will be away all the -evening, so that I must look after the child. Now I have told you -all my adventures, Mr. Holmes, and I should be very glad if you -could tell me what it all means, and, above all, what I should -do." - -Holmes and I had listened spellbound to this extraordinary story. -My friend rose now and paced up and down the room, his hands in -his pockets, and an expression of the most profound gravity upon -his face. - -"Is Toller still drunk?" he asked. - -"Yes. I heard his wife tell Mrs. Rucastle that she could do -nothing with him." - -"That is well. And the Rucastles go out to-night?" - -"Yes." - -"Is there a cellar with a good strong lock?" - -"Yes, the wine-cellar." - -"You seem to me to have acted all through this matter like a very -brave and sensible girl, Miss Hunter. Do you think that you could -perform one more feat? I should not ask it of you if I did not -think you a quite exceptional woman." - -"I will try. What is it?" - -"We shall be at the Copper Beeches by seven o'clock, my friend -and I. The Rucastles will be gone by that time, and Toller will, -we hope, be incapable. There only remains Mrs. Toller, who might -give the alarm. If you could send her into the cellar on some -errand, and then turn the key upon her, you would facilitate -matters immensely." - -"I will do it." - -"Excellent! We shall then look thoroughly into the affair. Of -course there is only one feasible explanation. You have been -brought there to personate someone, and the real person is -imprisoned in this chamber. That is obvious. As to who this -prisoner is, I have no doubt that it is the daughter, Miss Alice -Rucastle, if I remember right, who was said to have gone to -America. You were chosen, doubtless, as resembling her in height, -figure, and the colour of your hair. Hers had been cut off, very -possibly in some illness through which she has passed, and so, of -course, yours had to be sacrificed also. By a curious chance you -came upon her tresses. The man in the road was undoubtedly some -friend of hers--possibly her fiancé--and no doubt, as you wore -the girl's dress and were so like her, he was convinced from your -laughter, whenever he saw you, and afterwards from your gesture, -that Miss Rucastle was perfectly happy, and that she no longer -desired his attentions. The dog is let loose at night to prevent -him from endeavouring to communicate with her. So much is fairly -clear. The most serious point in the case is the disposition of -the child." - -"What on earth has that to do with it?" I ejaculated. - -"My dear Watson, you as a medical man are continually gaining -light as to the tendencies of a child by the study of the -parents. Don't you see that the converse is equally valid. I have -frequently gained my first real insight into the character of -parents by studying their children. This child's disposition is -abnormally cruel, merely for cruelty's sake, and whether he -derives this from his smiling father, as I should suspect, or -from his mother, it bodes evil for the poor girl who is in their -power." - -"I am sure that you are right, Mr. Holmes," cried our client. "A -thousand things come back to me which make me certain that you -have hit it. Oh, let us lose not an instant in bringing help to -this poor creature." - -"We must be circumspect, for we are dealing with a very cunning -man. We can do nothing until seven o'clock. At that hour we shall -be with you, and it will not be long before we solve the -mystery." - -We were as good as our word, for it was just seven when we -reached the Copper Beeches, having put up our trap at a wayside -public-house. The group of trees, with their dark leaves shining -like burnished metal in the light of the setting sun, were -sufficient to mark the house even had Miss Hunter not been -standing smiling on the door-step. - -"Have you managed it?" asked Holmes. - -A loud thudding noise came from somewhere downstairs. "That is -Mrs. Toller in the cellar," said she. "Her husband lies snoring -on the kitchen rug. Here are his keys, which are the duplicates -of Mr. Rucastle's." - -"You have done well indeed!" cried Holmes with enthusiasm. "Now -lead the way, and we shall soon see the end of this black -business." - -We passed up the stair, unlocked the door, followed on down a -passage, and found ourselves in front of the barricade which Miss -Hunter had described. Holmes cut the cord and removed the -transverse bar. Then he tried the various keys in the lock, but -without success. No sound came from within, and at the silence -Holmes' face clouded over. - -"I trust that we are not too late," said he. "I think, Miss -Hunter, that we had better go in without you. Now, Watson, put -your shoulder to it, and we shall see whether we cannot make our -way in." - -It was an old rickety door and gave at once before our united -strength. Together we rushed into the room. It was empty. There -was no furniture save a little pallet bed, a small table, and a -basketful of linen. The skylight above was open, and the prisoner -gone. - -"There has been some villainy here," said Holmes; "this beauty -has guessed Miss Hunter's intentions and has carried his victim -off." - -"But how?" - -"Through the skylight. We shall soon see how he managed it." He -swung himself up onto the roof. "Ah, yes," he cried, "here's the -end of a long light ladder against the eaves. That is how he did -it." - -"But it is impossible," said Miss Hunter; "the ladder was not -there when the Rucastles went away." - -"He has come back and done it. I tell you that he is a clever and -dangerous man. I should not be very much surprised if this were -he whose step I hear now upon the stair. I think, Watson, that it -would be as well for you to have your pistol ready." - -The words were hardly out of his mouth before a man appeared at -the door of the room, a very fat and burly man, with a heavy -stick in his hand. Miss Hunter screamed and shrunk against the -wall at the sight of him, but Sherlock Holmes sprang forward and -confronted him. - -"You villain!" said he, "where's your daughter?" - -The fat man cast his eyes round, and then up at the open -skylight. - -"It is for me to ask you that," he shrieked, "you thieves! Spies -and thieves! I have caught you, have I? You are in my power. I'll -serve you!" He turned and clattered down the stairs as hard as he -could go. - -"He's gone for the dog!" cried Miss Hunter. - -"I have my revolver," said I. - -"Better close the front door," cried Holmes, and we all rushed -down the stairs together. We had hardly reached the hall when we -heard the baying of a hound, and then a scream of agony, with a -horrible worrying sound which it was dreadful to listen to. An -elderly man with a red face and shaking limbs came staggering out -at a side door. - -"My God!" he cried. "Someone has loosed the dog. It's not been -fed for two days. Quick, quick, or it'll be too late!" - -Holmes and I rushed out and round the angle of the house, with -Toller hurrying behind us. There was the huge famished brute, its -black muzzle buried in Rucastle's throat, while he writhed and -screamed upon the ground. Running up, I blew its brains out, and -it fell over with its keen white teeth still meeting in the great -creases of his neck. With much labour we separated them and -carried him, living but horribly mangled, into the house. We laid -him upon the drawing-room sofa, and having dispatched the sobered -Toller to bear the news to his wife, I did what I could to -relieve his pain. We were all assembled round him when the door -opened, and a tall, gaunt woman entered the room. - -"Mrs. Toller!" cried Miss Hunter. - -"Yes, miss. Mr. Rucastle let me out when he came back before he -went up to you. Ah, miss, it is a pity you didn't let me know -what you were planning, for I would have told you that your pains -were wasted." - -"Ha!" said Holmes, looking keenly at her. "It is clear that Mrs. -Toller knows more about this matter than anyone else." - -"Yes, sir, I do, and I am ready enough to tell what I know." - -"Then, pray, sit down, and let us hear it for there are several -points on which I must confess that I am still in the dark." - -"I will soon make it clear to you," said she; "and I'd have done -so before now if I could ha' got out from the cellar. If there's -police-court business over this, you'll remember that I was the -one that stood your friend, and that I was Miss Alice's friend -too. - -"She was never happy at home, Miss Alice wasn't, from the time -that her father married again. She was slighted like and had no -say in anything, but it never really became bad for her until -after she met Mr. Fowler at a friend's house. As well as I could -learn, Miss Alice had rights of her own by will, but she was so -quiet and patient, she was, that she never said a word about them -but just left everything in Mr. Rucastle's hands. He knew he was -safe with her; but when there was a chance of a husband coming -forward, who would ask for all that the law would give him, then -her father thought it time to put a stop on it. He wanted her to -sign a paper, so that whether she married or not, he could use -her money. When she wouldn't do it, he kept on worrying her until -she got brain-fever, and for six weeks was at death's door. Then -she got better at last, all worn to a shadow, and with her -beautiful hair cut off; but that didn't make no change in her -young man, and he stuck to her as true as man could be." - -"Ah," said Holmes, "I think that what you have been good enough -to tell us makes the matter fairly clear, and that I can deduce -all that remains. Mr. Rucastle then, I presume, took to this -system of imprisonment?" - -"Yes, sir." - -"And brought Miss Hunter down from London in order to get rid of -the disagreeable persistence of Mr. Fowler." - -"That was it, sir." - -"But Mr. Fowler being a persevering man, as a good seaman should -be, blockaded the house, and having met you succeeded by certain -arguments, metallic or otherwise, in convincing you that your -interests were the same as his." - -"Mr. Fowler was a very kind-spoken, free-handed gentleman," said -Mrs. Toller serenely. - -"And in this way he managed that your good man should have no -want of drink, and that a ladder should be ready at the moment -when your master had gone out." - -"You have it, sir, just as it happened." - -"I am sure we owe you an apology, Mrs. Toller," said Holmes, "for -you have certainly cleared up everything which puzzled us. And -here comes the country surgeon and Mrs. Rucastle, so I think, -Watson, that we had best escort Miss Hunter back to Winchester, -as it seems to me that our locus standi now is rather a -questionable one." - -And thus was solved the mystery of the sinister house with the -copper beeches in front of the door. Mr. Rucastle survived, but -was always a broken man, kept alive solely through the care of -his devoted wife. They still live with their old servants, who -probably know so much of Rucastle's past life that he finds it -difficult to part from them. Mr. Fowler and Miss Rucastle were -married, by special license, in Southampton the day after their -flight, and he is now the holder of a government appointment in -the island of Mauritius. As to Miss Violet Hunter, my friend -Holmes, rather to my disappointment, manifested no further -interest in her when once she had ceased to be the centre of one -of his problems, and she is now the head of a private school at -Walsall, where I believe that she has met with considerable success. - - - - - - - - - -End of the Project Gutenberg EBook of The Adventures of Sherlock Holmes, by -Arthur Conan Doyle - -*** END OF THIS PROJECT GUTENBERG EBOOK THE ADVENTURES OF SHERLOCK HOLMES *** - -***** This file should be named 1661-8.txt or 1661-8.zip ***** -This and all associated files of various formats will be found in: - http://www.gutenberg.org/1/6/6/1661/ - -Produced by an anonymous Project Gutenberg volunteer and Jose Menendez - -Updated editions will replace the previous one--the old editions -will be renamed. - -Creating the works from public domain print editions means that no -one owns a United States copyright in these works, so the Foundation -(and you!) can copy and distribute it in the United States without -permission and without paying copyright royalties. Special rules, -set forth in the General Terms of Use part of this license, apply to -copying and distributing Project Gutenberg-tm electronic works to -protect the PROJECT GUTENBERG-tm concept and trademark. Project -Gutenberg is a registered trademark, and may not be used if you -charge for the eBooks, unless you receive specific permission. If you -do not charge anything for copies of this eBook, complying with the -rules is very easy. You may use this eBook for nearly any purpose -such as creation of derivative works, reports, performances and -research. They may be modified and printed and given away--you may do -practically ANYTHING with public domain eBooks. Redistribution is -subject to the trademark license, especially commercial -redistribution. - - - -*** START: FULL LICENSE *** - -THE FULL PROJECT GUTENBERG LICENSE -PLEASE READ THIS BEFORE YOU DISTRIBUTE OR USE THIS WORK - -To protect the Project Gutenberg-tm mission of promoting the free -distribution of electronic works, by using or distributing this work -(or any other work associated in any way with the phrase "Project -Gutenberg"), you agree to comply with all the terms of the Full Project -Gutenberg-tm License (available with this file or online at -http://gutenberg.net/license). - - -Section 1. General Terms of Use and Redistributing Project Gutenberg-tm -electronic works - -1.A. By reading or using any part of this Project Gutenberg-tm -electronic work, you indicate that you have read, understand, agree to -and accept all the terms of this license and intellectual property -(trademark/copyright) agreement. If you do not agree to abide by all -the terms of this agreement, you must cease using and return or destroy -all copies of Project Gutenberg-tm electronic works in your possession. -If you paid a fee for obtaining a copy of or access to a Project -Gutenberg-tm electronic work and you do not agree to be bound by the -terms of this agreement, you may obtain a refund from the person or -entity to whom you paid the fee as set forth in paragraph 1.E.8. - -1.B. "Project Gutenberg" is a registered trademark. It may only be -used on or associated in any way with an electronic work by people who -agree to be bound by the terms of this agreement. There are a few -things that you can do with most Project Gutenberg-tm electronic works -even without complying with the full terms of this agreement. See -paragraph 1.C below. There are a lot of things you can do with Project -Gutenberg-tm electronic works if you follow the terms of this agreement -and help preserve free future access to Project Gutenberg-tm electronic -works. See paragraph 1.E below. - -1.C. The Project Gutenberg Literary Archive Foundation ("the Foundation" -or PGLAF), owns a compilation copyright in the collection of Project -Gutenberg-tm electronic works. Nearly all the individual works in the -collection are in the public domain in the United States. If an -individual work is in the public domain in the United States and you are -located in the United States, we do not claim a right to prevent you from -copying, distributing, performing, displaying or creating derivative -works based on the work as long as all references to Project Gutenberg -are removed. Of course, we hope that you will support the Project -Gutenberg-tm mission of promoting free access to electronic works by -freely sharing Project Gutenberg-tm works in compliance with the terms of -this agreement for keeping the Project Gutenberg-tm name associated with -the work. You can easily comply with the terms of this agreement by -keeping this work in the same format with its attached full Project -Gutenberg-tm License when you share it without charge with others. - -1.D. The copyright laws of the place where you are located also govern -what you can do with this work. Copyright laws in most countries are in -a constant state of change. If you are outside the United States, check -the laws of your country in addition to the terms of this agreement -before downloading, copying, displaying, performing, distributing or -creating derivative works based on this work or any other Project -Gutenberg-tm work. The Foundation makes no representations concerning -the copyright status of any work in any country outside the United -States. - -1.E. Unless you have removed all references to Project Gutenberg: - -1.E.1. The following sentence, with active links to, or other immediate -access to, the full Project Gutenberg-tm License must appear prominently -whenever any copy of a Project Gutenberg-tm work (any work on which the -phrase "Project Gutenberg" appears, or with which the phrase "Project -Gutenberg" is associated) is accessed, displayed, performed, viewed, -copied or distributed: - -This eBook is for the use of anyone anywhere at no cost and with -almost no restrictions whatsoever. You may copy it, give it away or -re-use it under the terms of the Project Gutenberg License included -with this eBook or online at www.gutenberg.net - -1.E.2. If an individual Project Gutenberg-tm electronic work is derived -from the public domain (does not contain a notice indicating that it is -posted with permission of the copyright holder), the work can be copied -and distributed to anyone in the United States without paying any fees -or charges. If you are redistributing or providing access to a work -with the phrase "Project Gutenberg" associated with or appearing on the -work, you must comply either with the requirements of paragraphs 1.E.1 -through 1.E.7 or obtain permission for the use of the work and the -Project Gutenberg-tm trademark as set forth in paragraphs 1.E.8 or -1.E.9. - -1.E.3. If an individual Project Gutenberg-tm electronic work is posted -with the permission of the copyright holder, your use and distribution -must comply with both paragraphs 1.E.1 through 1.E.7 and any additional -terms imposed by the copyright holder. Additional terms will be linked -to the Project Gutenberg-tm License for all works posted with the -permission of the copyright holder found at the beginning of this work. - -1.E.4. Do not unlink or detach or remove the full Project Gutenberg-tm -License terms from this work, or any files containing a part of this -work or any other work associated with Project Gutenberg-tm. - -1.E.5. Do not copy, display, perform, distribute or redistribute this -electronic work, or any part of this electronic work, without -prominently displaying the sentence set forth in paragraph 1.E.1 with -active links or immediate access to the full terms of the Project -Gutenberg-tm License. - -1.E.6. You may convert to and distribute this work in any binary, -compressed, marked up, nonproprietary or proprietary form, including any -word processing or hypertext form. However, if you provide access to or -distribute copies of a Project Gutenberg-tm work in a format other than -"Plain Vanilla ASCII" or other format used in the official version -posted on the official Project Gutenberg-tm web site (www.gutenberg.net), -you must, at no additional cost, fee or expense to the user, provide a -copy, a means of exporting a copy, or a means of obtaining a copy upon -request, of the work in its original "Plain Vanilla ASCII" or other -form. Any alternate format must include the full Project Gutenberg-tm -License as specified in paragraph 1.E.1. - -1.E.7. Do not charge a fee for access to, viewing, displaying, -performing, copying or distributing any Project Gutenberg-tm works -unless you comply with paragraph 1.E.8 or 1.E.9. - -1.E.8. You may charge a reasonable fee for copies of or providing -access to or distributing Project Gutenberg-tm electronic works provided -that - -- You pay a royalty fee of 20% of the gross profits you derive from - the use of Project Gutenberg-tm works calculated using the method - you already use to calculate your applicable taxes. The fee is - owed to the owner of the Project Gutenberg-tm trademark, but he - has agreed to donate royalties under this paragraph to the - Project Gutenberg Literary Archive Foundation. Royalty payments - must be paid within 60 days following each date on which you - prepare (or are legally required to prepare) your periodic tax - returns. Royalty payments should be clearly marked as such and - sent to the Project Gutenberg Literary Archive Foundation at the - address specified in Section 4, "Information about donations to - the Project Gutenberg Literary Archive Foundation." - -- You provide a full refund of any money paid by a user who notifies - you in writing (or by e-mail) within 30 days of receipt that s/he - does not agree to the terms of the full Project Gutenberg-tm - License. You must require such a user to return or - destroy all copies of the works possessed in a physical medium - and discontinue all use of and all access to other copies of - Project Gutenberg-tm works. - -- You provide, in accordance with paragraph 1.F.3, a full refund of any - money paid for a work or a replacement copy, if a defect in the - electronic work is discovered and reported to you within 90 days - of receipt of the work. - -- You comply with all other terms of this agreement for free - distribution of Project Gutenberg-tm works. - -1.E.9. If you wish to charge a fee or distribute a Project Gutenberg-tm -electronic work or group of works on different terms than are set -forth in this agreement, you must obtain permission in writing from -both the Project Gutenberg Literary Archive Foundation and Michael -Hart, the owner of the Project Gutenberg-tm trademark. Contact the -Foundation as set forth in Section 3 below. - -1.F. - -1.F.1. Project Gutenberg volunteers and employees expend considerable -effort to identify, do copyright research on, transcribe and proofread -public domain works in creating the Project Gutenberg-tm -collection. Despite these efforts, Project Gutenberg-tm electronic -works, and the medium on which they may be stored, may contain -"Defects," such as, but not limited to, incomplete, inaccurate or -corrupt data, transcription errors, a copyright or other intellectual -property infringement, a defective or damaged disk or other medium, a -computer virus, or computer codes that damage or cannot be read by -your equipment. - -1.F.2. LIMITED WARRANTY, DISCLAIMER OF DAMAGES - Except for the "Right -of Replacement or Refund" described in paragraph 1.F.3, the Project -Gutenberg Literary Archive Foundation, the owner of the Project -Gutenberg-tm trademark, and any other party distributing a Project -Gutenberg-tm electronic work under this agreement, disclaim all -liability to you for damages, costs and expenses, including legal -fees. YOU AGREE THAT YOU HAVE NO REMEDIES FOR NEGLIGENCE, STRICT -LIABILITY, BREACH OF WARRANTY OR BREACH OF CONTRACT EXCEPT THOSE -PROVIDED IN PARAGRAPH 1.F.3. YOU AGREE THAT THE FOUNDATION, THE -TRADEMARK OWNER, AND ANY DISTRIBUTOR UNDER THIS AGREEMENT WILL NOT BE -LIABLE TO YOU FOR ACTUAL, DIRECT, INDIRECT, CONSEQUENTIAL, PUNITIVE OR -INCIDENTAL DAMAGES EVEN IF YOU GIVE NOTICE OF THE POSSIBILITY OF SUCH -DAMAGE. - -1.F.3. LIMITED RIGHT OF REPLACEMENT OR REFUND - If you discover a -defect in this electronic work within 90 days of receiving it, you can -receive a refund of the money (if any) you paid for it by sending a -written explanation to the person you received the work from. If you -received the work on a physical medium, you must return the medium with -your written explanation. The person or entity that provided you with -the defective work may elect to provide a replacement copy in lieu of a -refund. If you received the work electronically, the person or entity -providing it to you may choose to give you a second opportunity to -receive the work electronically in lieu of a refund. If the second copy -is also defective, you may demand a refund in writing without further -opportunities to fix the problem. - -1.F.4. Except for the limited right of replacement or refund set forth -in paragraph 1.F.3, this work is provided to you 'AS-IS' WITH NO OTHER -WARRANTIES OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO -WARRANTIES OF MERCHANTIBILITY OR FITNESS FOR ANY PURPOSE. - -1.F.5. Some states do not allow disclaimers of certain implied -warranties or the exclusion or limitation of certain types of damages. -If any disclaimer or limitation set forth in this agreement violates the -law of the state applicable to this agreement, the agreement shall be -interpreted to make the maximum disclaimer or limitation permitted by -the applicable state law. The invalidity or unenforceability of any -provision of this agreement shall not void the remaining provisions. - -1.F.6. INDEMNITY - You agree to indemnify and hold the Foundation, the -trademark owner, any agent or employee of the Foundation, anyone -providing copies of Project Gutenberg-tm electronic works in accordance -with this agreement, and any volunteers associated with the production, -promotion and distribution of Project Gutenberg-tm electronic works, -harmless from all liability, costs and expenses, including legal fees, -that arise directly or indirectly from any of the following which you do -or cause to occur: (a) distribution of this or any Project Gutenberg-tm -work, (b) alteration, modification, or additions or deletions to any -Project Gutenberg-tm work, and (c) any Defect you cause. - - -Section 2. Information about the Mission of Project Gutenberg-tm - -Project Gutenberg-tm is synonymous with the free distribution of -electronic works in formats readable by the widest variety of computers -including obsolete, old, middle-aged and new computers. It exists -because of the efforts of hundreds of volunteers and donations from -people in all walks of life. - -Volunteers and financial support to provide volunteers with the -assistance they need are critical to reaching Project Gutenberg-tm's -goals and ensuring that the Project Gutenberg-tm collection will -remain freely available for generations to come. In 2001, the Project -Gutenberg Literary Archive Foundation was created to provide a secure -and permanent future for Project Gutenberg-tm and future generations. -To learn more about the Project Gutenberg Literary Archive Foundation -and how your efforts and donations can help, see Sections 3 and 4 -and the Foundation web page at http://www.pglaf.org. - - -Section 3. Information about the Project Gutenberg Literary Archive -Foundation - -The Project Gutenberg Literary Archive Foundation is a non profit -501(c)(3) educational corporation organized under the laws of the -state of Mississippi and granted tax exempt status by the Internal -Revenue Service. The Foundation's EIN or federal tax identification -number is 64-6221541. Its 501(c)(3) letter is posted at -http://pglaf.org/fundraising. Contributions to the Project Gutenberg -Literary Archive Foundation are tax deductible to the full extent -permitted by U.S. federal laws and your state's laws. - -The Foundation's principal office is located at 4557 Melan Dr. S. -Fairbanks, AK, 99712., but its volunteers and employees are scattered -throughout numerous locations. Its business office is located at -809 North 1500 West, Salt Lake City, UT 84116, (801) 596-1887, email -business@pglaf.org. Email contact links and up to date contact -information can be found at the Foundation's web site and official -page at http://pglaf.org - -For additional contact information: - Dr. Gregory B. Newby - Chief Executive and Director - gbnewby@pglaf.org - - -Section 4. Information about Donations to the Project Gutenberg -Literary Archive Foundation - -Project Gutenberg-tm depends upon and cannot survive without wide -spread public support and donations to carry out its mission of -increasing the number of public domain and licensed works that can be -freely distributed in machine readable form accessible by the widest -array of equipment including outdated equipment. Many small donations -($1 to $5,000) are particularly important to maintaining tax exempt -status with the IRS. - -The Foundation is committed to complying with the laws regulating -charities and charitable donations in all 50 states of the United -States. Compliance requirements are not uniform and it takes a -considerable effort, much paperwork and many fees to meet and keep up -with these requirements. We do not solicit donations in locations -where we have not received written confirmation of compliance. To -SEND DONATIONS or determine the status of compliance for any -particular state visit http://pglaf.org - -While we cannot and do not solicit contributions from states where we -have not met the solicitation requirements, we know of no prohibition -against accepting unsolicited donations from donors in such states who -approach us with offers to donate. - -International donations are gratefully accepted, but we cannot make -any statements concerning tax treatment of donations received from -outside the United States. U.S. laws alone swamp our small staff. - -Please check the Project Gutenberg Web pages for current donation -methods and addresses. Donations are accepted in a number of other -ways including including checks, online payments and credit card -donations. To donate, please visit: http://pglaf.org/donate - - -Section 5. General Information About Project Gutenberg-tm electronic -works. - -Professor Michael S. Hart is the originator of the Project Gutenberg-tm -concept of a library of electronic works that could be freely shared -with anyone. For thirty years, he produced and distributed Project -Gutenberg-tm eBooks with only a loose network of volunteer support. - - -Project Gutenberg-tm eBooks are often created from several printed -editions, all of which are confirmed as Public Domain in the U.S. -unless a copyright notice is included. Thus, we do not necessarily -keep eBooks in compliance with any particular paper edition. - - -Most people start at our Web site which has the main PG search facility: - - http://www.gutenberg.net - -This Web site includes information about Project Gutenberg-tm, -including how to make donations to the Project Gutenberg Literary -Archive Foundation, how to help produce our new eBooks, and how to -subscribe to our email newsletter to hear about new eBooks. diff --git a/vendor/github.com/ClickHouse/clickhouse-go/lib/types/uuid_test.go b/vendor/github.com/ClickHouse/clickhouse-go/lib/types/uuid_test.go deleted file mode 100644 index bdbd573168..0000000000 --- a/vendor/github.com/ClickHouse/clickhouse-go/lib/types/uuid_test.go +++ /dev/null @@ -1,37 +0,0 @@ -package types - -import ( - "github.com/stretchr/testify/assert" - - "encoding/hex" - "testing" -) - -func Test_UUID2Bytes(t *testing.T) { - bytes2uuid := func(src []byte) string { - var uuid [36]byte - hex.Encode(uuid[:], src[:4]) - uuid[8] = '-' - hex.Encode(uuid[9:13], src[4:6]) - uuid[13] = '-' - hex.Encode(uuid[14:18], src[6:8]) - uuid[18] = '-' - hex.Encode(uuid[19:23], src[8:10]) - uuid[23] = '-' - hex.Encode(uuid[24:], src[10:]) - return string(uuid[:]) - } - origin := "00000000-0000-0000-0000-000000000000" - if uuid, err := uuid2bytes(origin); assert.NoError(t, err) { - assert.Equal(t, origin, bytes2uuid(uuid)) - } -} - -func Benchmark_UUID2Bytes(b *testing.B) { - b.ReportAllocs() - for i := 0; i < b.N; i++ { - if _, err := uuid2bytes("00000000-0000-0000-0000-000000000000"); err != nil { - b.Fatal(err) - } - } -} diff --git a/vendor/github.com/ClickHouse/clickhouse-go/word_matcher_test.go b/vendor/github.com/ClickHouse/clickhouse-go/word_matcher_test.go deleted file mode 100644 index 2a1a340c32..0000000000 --- a/vendor/github.com/ClickHouse/clickhouse-go/word_matcher_test.go +++ /dev/null @@ -1,39 +0,0 @@ -package clickhouse - -import ( - "testing" - - "github.com/stretchr/testify/assert" -) - -type wmTest struct { - haystack string - needle string - expect bool -} - -func checkMatch(haystack, needle string) bool { - m := newMatcher(needle) - for _, r := range []rune(haystack) { - if m.matchRune(r) { - return true - } - } - return false -} - -func TestWordMatcher(t *testing.T) { - - table := []wmTest{ - wmTest{"select * from test", "select", true}, - wmTest{"select * from test", "*", true}, - wmTest{"select * from test", "elect", true}, - wmTest{"select * from test", "zelect", false}, - wmTest{"select * from test", "sElEct", true}, - } - - for _, test := range table { - assert.Equal(t, checkMatch(test.haystack, test.needle), test.expect, test.haystack) - } - -} diff --git a/vendor/github.com/cloudflare/golz4/.gitignore b/vendor/github.com/cloudflare/golz4/.gitignore new file mode 100644 index 0000000000..00268614f0 --- /dev/null +++ b/vendor/github.com/cloudflare/golz4/.gitignore @@ -0,0 +1,22 @@ +# Compiled Object files, Static and Dynamic libs (Shared Objects) +*.o +*.a +*.so + +# Folders +_obj +_test + +# Architecture specific extensions/prefixes +*.[568vq] +[568vq].out + +*.cgo1.go +*.cgo2.c +_cgo_defun.c +_cgo_gotypes.go +_cgo_export.* + +_testmain.go + +*.exe diff --git a/vendor/github.com/cloudflare/golz4/LICENSE b/vendor/github.com/cloudflare/golz4/LICENSE new file mode 100644 index 0000000000..1579e81a9a --- /dev/null +++ b/vendor/github.com/cloudflare/golz4/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) 2013 CloudFlare, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, this + list of conditions and the following disclaimer in the documentation and/or + other materials provided with the distribution. + +* Neither the name of the CloudFlare, Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/cloudflare/golz4/Makefile b/vendor/github.com/cloudflare/golz4/Makefile new file mode 100644 index 0000000000..2296d80e06 --- /dev/null +++ b/vendor/github.com/cloudflare/golz4/Makefile @@ -0,0 +1,14 @@ +GCFLAGS := +LDFLAGS := + +.PHONY: install +install: + @go install -v . + +.PHONY: test +test: + @go test -gcflags='$(GCFLAGS)' -ldflags='$(LDFLAGS)' . + +.PHONY: bench +bench: + @go test -gcflags='$(GCFLAGS)' -ldflags='$(LDFLAGS)' -bench . diff --git a/vendor/github.com/cloudflare/golz4/README.md b/vendor/github.com/cloudflare/golz4/README.md new file mode 100644 index 0000000000..e1bdb26e82 --- /dev/null +++ b/vendor/github.com/cloudflare/golz4/README.md @@ -0,0 +1,4 @@ +golz4 +===== + +Golang interface to LZ4 compression diff --git a/vendor/github.com/cloudflare/golz4/doc.go b/vendor/github.com/cloudflare/golz4/doc.go new file mode 100644 index 0000000000..4876be870f --- /dev/null +++ b/vendor/github.com/cloudflare/golz4/doc.go @@ -0,0 +1,4 @@ +// Package lz4 implements compression using lz4.c and lz4hc.c +// +// Copyright (c) 2013 CloudFlare, Inc. +package lz4 diff --git a/vendor/github.com/cloudflare/golz4/lz4.go b/vendor/github.com/cloudflare/golz4/lz4.go new file mode 100644 index 0000000000..f9abcb2dbc --- /dev/null +++ b/vendor/github.com/cloudflare/golz4/lz4.go @@ -0,0 +1,55 @@ +package lz4 + +// #cgo CFLAGS: -O3 +// #include "src/lz4.h" +// #include "src/lz4.c" +import "C" + +import ( + "errors" + "fmt" + "unsafe" +) + +// p gets a char pointer to the first byte of a []byte slice +func p(in []byte) *C.char { + if len(in) == 0 { + return (*C.char)(unsafe.Pointer(nil)) + } + return (*C.char)(unsafe.Pointer(&in[0])) +} + +// clen gets the length of a []byte slice as a char * +func clen(s []byte) C.int { + return C.int(len(s)) +} + +// Uncompress with a known output size. len(out) should be equal to +// the length of the uncompressed out. +func Uncompress(in, out []byte) (error) { + if int(C.LZ4_decompress_safe(p(in), p(out), clen(in), clen(out))) < 0 { + return errors.New("Malformed compression stream") + } + + return nil +} + +// CompressBound calculates the size of the output buffer needed by +// Compress. This is based on the following macro: +// +// #define LZ4_COMPRESSBOUND(isize) +// ((unsigned int)(isize) > (unsigned int)LZ4_MAX_INPUT_SIZE ? 0 : (isize) + ((isize)/255) + 16) +func CompressBound(in []byte) int { + return len(in) + ((len(in) / 255) + 16) +} + +// Compress compresses in and puts the content in out. len(out) +// should have enough space for the compressed data (use CompressBound +// to calculate). Returns the number of bytes in the out slice. +func Compress(in, out []byte) (outSize int, err error) { + outSize = int(C.LZ4_compress_limitedOutput(p(in), p(out), clen(in), clen(out))) + if outSize == 0 { + err = fmt.Errorf("insufficient space for compression") + } + return +} diff --git a/vendor/github.com/cloudflare/golz4/lz4_hc.go b/vendor/github.com/cloudflare/golz4/lz4_hc.go new file mode 100644 index 0000000000..9779352c46 --- /dev/null +++ b/vendor/github.com/cloudflare/golz4/lz4_hc.go @@ -0,0 +1,38 @@ +package lz4 + +// #cgo CFLAGS: -O3 +// #include "src/lz4hc.h" +// #include "src/lz4hc.c" +import "C" + +import ( + "fmt" +) + +// CompressHC compresses in and puts the content in out. len(out) +// should have enough space for the compressed data (use CompressBound +// to calculate). Returns the number of bytes in the out slice. Determines +// the compression level automatically. +func CompressHC(in, out []byte) (int, error) { + // 0 automatically sets the compression level. + return CompressHCLevel(in, out, 0) +} + +// CompressHCLevel compresses in at the given compression level and puts the +// content in out. len(out) should have enough space for the compressed data +// (use CompressBound to calculate). Returns the number of bytes in the out +// slice. To automatically choose the compression level, use 0. Otherwise, use +// any value in the inclusive range 1 (worst) through 16 (best). Most +// applications will prefer CompressHC. +func CompressHCLevel(in, out []byte, level int) (outSize int, err error) { + // LZ4HC does not handle empty buffers. Pass through to Compress. + if len(in) == 0 || len(out) == 0 { + return Compress(in, out) + } + + outSize = int(C.LZ4_compressHC2_limitedOutput(p(in), p(out), clen(in), clen(out), C.int(level))) + if outSize == 0 { + err = fmt.Errorf("insufficient space for compression") + } + return +} diff --git a/vendor/github.com/cloudflare/golz4/sample.txt b/vendor/github.com/cloudflare/golz4/sample.txt new file mode 100644 index 0000000000..3bb27fb76d --- /dev/null +++ b/vendor/github.com/cloudflare/golz4/sample.txt @@ -0,0 +1,143 @@ +CANTO I + + +IN the midway of this our mortal life, +I found me in a gloomy wood, astray +Gone from the path direct: and e'en to tell +It were no easy task, how savage wild +That forest, how robust and rough its growth, +Which to remember only, my dismay +Renews, in bitterness not far from death. +Yet to discourse of what there good befell, +All else will I relate discover'd there. +How first I enter'd it I scarce can say, +Such sleepy dullness in that instant weigh'd +My senses down, when the true path I left, +But when a mountain's foot I reach'd, where clos'd +The valley, that had pierc'd my heart with dread, +I look'd aloft, and saw his shoulders broad +Already vested with that planet's beam, +Who leads all wanderers safe through every way. + +Then was a little respite to the fear, +That in my heart's recesses deep had lain, +All of that night, so pitifully pass'd: +And as a man, with difficult short breath, +Forespent with toiling, 'scap'd from sea to shore, +Turns to the perilous wide waste, and stands +At gaze; e'en so my spirit, that yet fail'd +Struggling with terror, turn'd to view the straits, +That none hath pass'd and liv'd. My weary frame +After short pause recomforted, again +I journey'd on over that lonely steep, + +The hinder foot still firmer. Scarce the ascent +Began, when, lo! a panther, nimble, light, +And cover'd with a speckled skin, appear'd, +Nor, when it saw me, vanish'd, rather strove +To check my onward going; that ofttimes +With purpose to retrace my steps I turn'd. + +The hour was morning's prime, and on his way +Aloft the sun ascended with those stars, +That with him rose, when Love divine first mov'd +Those its fair works: so that with joyous hope +All things conspir'd to fill me, the gay skin +Of that swift animal, the matin dawn +And the sweet season. Soon that joy was chas'd, +And by new dread succeeded, when in view +A lion came, 'gainst me, as it appear'd, + +With his head held aloft and hunger-mad, +That e'en the air was fear-struck. A she-wolf +Was at his heels, who in her leanness seem'd +Full of all wants, and many a land hath made +Disconsolate ere now. She with such fear +O'erwhelmed me, at the sight of her appall'd, +That of the height all hope I lost. As one, +Who with his gain elated, sees the time +When all unwares is gone, he inwardly +Mourns with heart-griping anguish; such was I, +Haunted by that fell beast, never at peace, +Who coming o'er against me, by degrees +Impell'd me where the sun in silence rests. + +While to the lower space with backward step +I fell, my ken discern'd the form one of one, +Whose voice seem'd faint through long disuse of speech. +When him in that great desert I espied, +"Have mercy on me!" cried I out aloud, +"Spirit! or living man! what e'er thou be!" + +He answer'd: "Now not man, man once I was, +And born of Lombard parents, Mantuana both +By country, when the power of Julius yet +Was scarcely firm. At Rome my life was past +Beneath the mild Augustus, in the time +Of fabled deities and false. A bard +Was I, and made Anchises' upright son +The subject of my song, who came from Troy, +When the flames prey'd on Ilium's haughty towers. +But thou, say wherefore to such perils past +Return'st thou? wherefore not this pleasant mount +Ascendest, cause and source of all delight?" +"And art thou then that Virgil, that well-spring, +From which such copious floods of eloquence +Have issued?" I with front abash'd replied. +"Glory and light of all the tuneful train! +May it avail me that I long with zeal +Have sought thy volume, and with love immense +Have conn'd it o'er. My master thou and guide! +Thou he from whom alone I have deriv'd +That style, which for its beauty into fame +Exalts me. See the beast, from whom I fled. +O save me from her, thou illustrious sage!" + +"For every vein and pulse throughout my frame +She hath made tremble." He, soon as he saw +That I was weeping, answer'd, "Thou must needs +Another way pursue, if thou wouldst 'scape +From out that savage wilderness. This beast, +At whom thou criest, her way will suffer none +To pass, and no less hindrance makes than death: +So bad and so accursed in her kind, +That never sated is her ravenous will, +Still after food more craving than before. +To many an animal in wedlock vile +She fastens, and shall yet to many more, +Until that greyhound come, who shall destroy +Her with sharp pain. He will not life support +By earth nor its base metals, but by love, +Wisdom, and virtue, and his land shall be +The land 'twixt either Feltro. In his might +Shall safety to Italia's plains arise, +For whose fair realm, Camilla, virgin pure, +Nisus, Euryalus, and Turnus fell. +He with incessant chase through every town +Shall worry, until he to hell at length +Restore her, thence by envy first let loose. +I for thy profit pond'ring now devise, +That thou mayst follow me, and I thy guide +Will lead thee hence through an eternal space, +Where thou shalt hear despairing shrieks, and see +Spirits of old tormented, who invoke +A second death; and those next view, who dwell +Content in fire, for that they hope to come, +Whene'er the time may be, among the blest, +Into whose regions if thou then desire +T' ascend, a spirit worthier then I +Must lead thee, in whose charge, when I depart, +Thou shalt be left: for that Almighty King, +Who reigns above, a rebel to his law, +Adjudges me, and therefore hath decreed, +That to his city none through me should come. +He in all parts hath sway; there rules, there holds +His citadel and throne. O happy those, +Whom there he chooses!" I to him in few: +"Bard! by that God, whom thou didst not adore, +I do beseech thee (that this ill and worse +I may escape) to lead me, where thou saidst, +That I Saint Peter's gate may view, and those +Who as thou tell'st, are in such dismal plight." + +Onward he mov'd, I close his steps pursu'd. diff --git a/vendor/modules.txt b/vendor/modules.txt index 2355beb21e..8bfaec87fb 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -34,6 +34,15 @@ github.com/Azure/go-autorest/logger github.com/Azure/go-autorest/tracing # github.com/BurntSushi/toml v0.3.1 github.com/BurntSushi/toml +# github.com/ClickHouse/clickhouse-go v1.4.7 +github.com/ClickHouse/clickhouse-go +github.com/ClickHouse/clickhouse-go/lib/binary +github.com/ClickHouse/clickhouse-go/lib/cityhash102 +github.com/ClickHouse/clickhouse-go/lib/column +github.com/ClickHouse/clickhouse-go/lib/data +github.com/ClickHouse/clickhouse-go/lib/lz4 +github.com/ClickHouse/clickhouse-go/lib/protocol +github.com/ClickHouse/clickhouse-go/lib/types # github.com/DataDog/dd-trace-go v0.6.1 github.com/DataDog/dd-trace-go/opentracing github.com/DataDog/dd-trace-go/tracer @@ -211,6 +220,8 @@ github.com/c-bata/go-prompt # github.com/cheggaaa/pb/v3 v3.0.8 github.com/cheggaaa/pb/v3 github.com/cheggaaa/pb/v3/termutil +# github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58 +github.com/cloudflare/golz4 # github.com/coredns/coredns v1.3.0 github.com/coredns/coredns/core/dnsserver github.com/coredns/coredns/coremain @@ -1178,7 +1189,7 @@ yunion.io/x/log/hooks yunion.io/x/ovsdb/cli_util yunion.io/x/ovsdb/schema/ovn_nb yunion.io/x/ovsdb/types -# yunion.io/x/pkg v0.0.0-20210918114143-ce839f862c5f +# yunion.io/x/pkg v0.0.0-20211116020154-6a76ba2f7e97 yunion.io/x/pkg/errors yunion.io/x/pkg/gotypes yunion.io/x/pkg/prettytable @@ -1212,7 +1223,11 @@ yunion.io/x/pkg/util/workqueue yunion.io/x/pkg/utils # yunion.io/x/s3cli v0.0.0-20190917004522-13ac36d8687e yunion.io/x/s3cli -# yunion.io/x/sqlchemy v0.0.0-20210827024030-22a1e669b4f8 +# yunion.io/x/sqlchemy v0.0.0-20211116231750-5ec40db49db1 yunion.io/x/sqlchemy +yunion.io/x/sqlchemy/backends +yunion.io/x/sqlchemy/backends/clickhouse +yunion.io/x/sqlchemy/backends/mysql +yunion.io/x/sqlchemy/backends/sqlite # yunion.io/x/structarg v0.0.0-20200720093445-9f850fa222ce yunion.io/x/structarg diff --git a/vendor/yunion.io/x/pkg/util/regutils/regutils.go b/vendor/yunion.io/x/pkg/util/regutils/regutils.go index 8d9ea9d259..06be8fb77d 100644 --- a/vendor/yunion.io/x/pkg/util/regutils/regutils.go +++ b/vendor/yunion.io/x/pkg/util/regutils/regutils.go @@ -38,6 +38,9 @@ var DATE_COMPACT_REG *regexp.Regexp var ISO_TIME_REG *regexp.Regexp var ISO_NO_SECOND_TIME_REG *regexp.Regexp var FULLISO_TIME_REG *regexp.Regexp +var ISO_TIME_REG2 *regexp.Regexp +var ISO_NO_SECOND_TIME_REG2 *regexp.Regexp +var FULLISO_TIME_REG2 *regexp.Regexp var ZSTACK_TIME_REG *regexp.Regexp var COMPACT_TIME_REG *regexp.Regexp var MYSQL_TIME_REG *regexp.Regexp @@ -68,6 +71,9 @@ func init() { ISO_TIME_REG = regexp.MustCompile(`^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(Z|[+-]\d{2}:\d{2})$`) ISO_NO_SECOND_TIME_REG = regexp.MustCompile(`^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}(Z|[+-]\d{2}:\d{2})$`) FULLISO_TIME_REG = regexp.MustCompile(`^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3,9}(Z|[+-]\d{2}:\d{2})$`) + ISO_TIME_REG2 = regexp.MustCompile(`^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}(Z|[+-]\d{2}:\d{2})$`) + ISO_NO_SECOND_TIME_REG2 = regexp.MustCompile(`^\d{4}-\d{2}-\d{2} \d{2}:\d{2}(Z|[+-]\d{2}:\d{2})$`) + FULLISO_TIME_REG2 = regexp.MustCompile(`^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d{3,9}(Z|[+-]\d{2}:\d{2})$`) COMPACT_TIME_REG = regexp.MustCompile(`^\d{14}$`) ZSTACK_TIME_REG = regexp.MustCompile(`^\w+ \d{1,2}, \d{4} \d{1,2}:\d{1,2}:\d{1,2} (AM|PM)$`) //ZStack time format "Apr 1, 2019 3:23:17 PM" MYSQL_TIME_REG = regexp.MustCompile(`^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$`) @@ -202,6 +208,18 @@ func MatchFullISOTime(str string) bool { return FULLISO_TIME_REG.MatchString(str) } +func MatchISOTime2(str string) bool { + return ISO_TIME_REG2.MatchString(str) +} + +func MatchISONoSecondTime2(str string) bool { + return ISO_NO_SECOND_TIME_REG2.MatchString(str) +} + +func MatchFullISOTime2(str string) bool { + return FULLISO_TIME_REG2.MatchString(str) +} + func MatchCompactTime(str string) bool { return COMPACT_TIME_REG.MatchString(str) } diff --git a/vendor/yunion.io/x/pkg/util/timeutils/timeutils.go b/vendor/yunion.io/x/pkg/util/timeutils/timeutils.go index 3dbd23eb18..c96393292c 100644 --- a/vendor/yunion.io/x/pkg/util/timeutils/timeutils.go +++ b/vendor/yunion.io/x/pkg/util/timeutils/timeutils.go @@ -58,6 +58,10 @@ const ( ShortMonthFormat = "200601" ZStackTimeFormat = "Jan 2, 2006 15:04:05 PM" + IsoTimeFormat2 = "2006-01-02 15:04:05Z07:00" + IsoNoSecondTimeFormat2 = "2006-01-02 15:04Z07:00" + FullIsoNanoTimeFormat2 = "2006-01-02 15:04:05.000000000Z07:00" + RFC2882Format = time.RFC1123 ) @@ -113,10 +117,18 @@ func ParseIsoTime(str string) (time.Time, error) { return time.Parse(IsoTimeFormat, str) } +func ParseIsoTime2(str string) (time.Time, error) { + return time.Parse(IsoTimeFormat2, str) +} + func ParseIsoNoSecondTime(str string) (time.Time, error) { return time.Parse(IsoNoSecondTimeFormat, str) } +func ParseIsoNoSecondTime2(str string) (time.Time, error) { + return time.Parse(IsoNoSecondTimeFormat2, str) +} + func toFullIsoNanoTimeFormat(str string) string { // 2019-09-17T20:50:17.66667134+08:00 // 2019-11-19T18:54:48.084-08:00 @@ -143,6 +155,10 @@ func ParseFullIsoTime(str string) (time.Time, error) { return time.Parse(FullIsoNanoTimeFormat, toFullIsoNanoTimeFormat(str)) } +func ParseFullIsoTime2(str string) (time.Time, error) { + return time.Parse(FullIsoNanoTimeFormat2, toFullIsoNanoTimeFormat(str)) +} + func ParseMysqlTime(str string) (time.Time, error) { return time.Parse(MysqlTimeFormat, str) } @@ -183,6 +199,12 @@ func ParseTimeStr(str string) (time.Time, error) { return ParseIsoTime(str) } else if regutils.MatchISONoSecondTime(str) { return ParseIsoNoSecondTime(str) + } else if regutils.MatchFullISOTime2(str) { + return ParseFullIsoTime2(str) + } else if regutils.MatchISOTime2(str) { + return ParseIsoTime2(str) + } else if regutils.MatchISONoSecondTime2(str) { + return ParseIsoNoSecondTime2(str) } else if regutils.MatchMySQLTime(str) { return ParseMysqlTime(str) } else if regutils.MatchNormalTime(str) { diff --git a/vendor/yunion.io/x/sqlchemy/.circleci/config.yml b/vendor/yunion.io/x/sqlchemy/.circleci/config.yml deleted file mode 100644 index e3cc9df57c..0000000000 --- a/vendor/yunion.io/x/sqlchemy/.circleci/config.yml +++ /dev/null @@ -1,22 +0,0 @@ -# Golang CircleCI 2.0 configuration file -# -# Check https://circleci.com/docs/2.0/language-go/ for more details -version: 2 -jobs: - build: - docker: - - image: circleci/golang:1.14 - - working_directory: /go/src/yunion.io/x/sqlchemy - steps: - - checkout - - run: go get -v -t -d ./... - - run: - command: | - go test -v ./... - -workflows: - version: 2 - build_and_test: - jobs: - - build diff --git a/vendor/yunion.io/x/sqlchemy/.github/ISSUE_TEMPLATE/bug_report.md b/vendor/yunion.io/x/sqlchemy/.github/ISSUE_TEMPLATE/bug_report.md deleted file mode 100644 index b8e29f506e..0000000000 --- a/vendor/yunion.io/x/sqlchemy/.github/ISSUE_TEMPLATE/bug_report.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -name: Bug report -about: Create a report to help us improve -title: '' -labels: bug -assignees: '' - ---- - -**What happened**: - -**What you expected to happen**: - -**How to reproduce it**: - -**Anything else we need to know?**: - -**Environment**: -- OS (e.g: `cat /etc/os-release`): -- Kernel (e.g. `uname -a`): -- Others: diff --git a/vendor/yunion.io/x/sqlchemy/.github/ISSUE_TEMPLATE/feature_request.md b/vendor/yunion.io/x/sqlchemy/.github/ISSUE_TEMPLATE/feature_request.md deleted file mode 100644 index dedc7279f2..0000000000 --- a/vendor/yunion.io/x/sqlchemy/.github/ISSUE_TEMPLATE/feature_request.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -name: Feature request -about: Suggest an idea for this project -title: '' -labels: feature -assignees: '' - ---- - - - -**What would you like to be added**: - -**Why is this needed**: diff --git a/vendor/yunion.io/x/sqlchemy/.github/ISSUE_TEMPLATE/support-request.md b/vendor/yunion.io/x/sqlchemy/.github/ISSUE_TEMPLATE/support-request.md deleted file mode 100644 index 4b8e6a9c84..0000000000 --- a/vendor/yunion.io/x/sqlchemy/.github/ISSUE_TEMPLATE/support-request.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -name: Support Request -about: Support request or question relating to this project -title: '' -labels: question -assignees: '' - ---- - - diff --git a/vendor/yunion.io/x/sqlchemy/.github/pull_request_template.md b/vendor/yunion.io/x/sqlchemy/.github/pull_request_template.md deleted file mode 100644 index 6a27e66477..0000000000 --- a/vendor/yunion.io/x/sqlchemy/.github/pull_request_template.md +++ /dev/null @@ -1 +0,0 @@ -**这个 PR 实现什么功能/修复什么问题**: diff --git a/vendor/yunion.io/x/sqlchemy/.github/workflows/codecov.yml b/vendor/yunion.io/x/sqlchemy/.github/workflows/codecov.yml deleted file mode 100644 index 774a8c329b..0000000000 --- a/vendor/yunion.io/x/sqlchemy/.github/workflows/codecov.yml +++ /dev/null @@ -1,41 +0,0 @@ -# This is a basic workflow to help you get started with Actions - -name: CI - -# Controls when the workflow will run -on: - # Triggers the workflow on push or pull request events but only for the master branch - push: - branches: [ master ] - pull_request: - branches: [ master ] - - # Allows you to run this workflow manually from the Actions tab - workflow_dispatch: - -# A workflow run is made up of one or more jobs that can run sequentially or in parallel -jobs: - # This workflow contains a single job called "build" - build: - # The type of runner that the job will run on - runs-on: ubuntu-latest - - # Steps represent a sequence of tasks that will be executed as part of the job - steps: - # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it - - uses: actions/checkout@v2 - - - uses: actions/setup-go@v2 - with: - go-version: '1.14' - - - name: Run coverage - run: | - echo $GITHUB_WORKSPACE - mkdir -p $(dirname $GITHUB_WORKSPACE)/go/src/yunion.io/x - cp -r $GITHUB_WORKSPACE $(dirname $GITHUB_WORKSPACE)/go/src/yunion.io/x/ - cd $(dirname $GITHUB_WORKSPACE)/go/src/yunion.io/x/sqlchemy - GOPATH=$(dirname $GITHUB_WORKSPACE)/go GO111MODULE=off go get - GOPATH=$(dirname $GITHUB_WORKSPACE)/go GO111MODULE=off go test -race -coverprofile=coverage.out -covermode=atomic - dir - bash <(curl -s https://codecov.io/bash) diff --git a/vendor/yunion.io/x/sqlchemy/README.md b/vendor/yunion.io/x/sqlchemy/README.md index 2561351a95..2f786b23e8 100644 --- a/vendor/yunion.io/x/sqlchemy/README.md +++ b/vendor/yunion.io/x/sqlchemy/README.md @@ -11,12 +11,47 @@ Features * Automatic creation and synchronization of table schema based on golang struct * Query syntax inpired by sqlalchemy -* Support MySQL/MariaDB with InnoDB engine ONLY +* Support: MySQL/MariaDB with InnoDB engine/SQLITE(Exprimental)/ClickHouse(Exprimental) * Support select, insert, update and insert or update Quick Examples ---------------- +## Database initialization + +Before using sqlchemy, database connection should be setup first. + +### Setup database with default backend(MySQL with InnoDB) + +```go +dbconn := sql.Open("mysql", "testgo:openstack@tcp(127.0.0.1:3306)/testgo?charset=utf8&parseTime") + +sqlchemy.SetDefaultDB(dbconn) +``` + +### Setup database with MySQL with InnoDB + +```go +dbconn := sql.Open("mysql", "testgo:openstack@tcp(127.0.0.1:3306)/testgo?charset=utf8&parseTime") + +sqlchemy.SetDBWithNameBackend(dbconn, sqlchemy.DBName("mysqldb"), sqlchemy.MySQLBackend) +``` +### Setup database with SQLite backend + +```go +dbconn := sql.Open("sqlite3", "file:mydb.s3db?cache=shared&mode=rwc") + +sqlchemy.SetDBWithNameBackend(dbconn, sqlchemy.DBName("sqlitedb"), sqlchemy.SQLiteBackend) +``` + +### Setup database with clickhosue + +```go +dbconn := sql.Open("clickhouse", "tcp://host1:9000?username=user&password=qwerty&database=clicks") + +sqlchemy.SetDBWithNameBackend(dbconn, sqlchemy.DBName("clickhousedb"), sqlchemy.ClickhouseBackend) +``` + ## Table Schema Table schema is defined by struct field tags @@ -46,6 +81,10 @@ Create a table from a struct schema tablespec := sqlchemy.NewTableSpecFromStruct(TestTable{}, "testtable") ``` +```go +tablespec := sqlchemy.NewTableSpecFromStructWithDBName(TestTable{}, "testtable", sqlchemy.DBName("mydb")) +``` + Check whether table schema definition is consistent with schema in database. ```go diff --git a/vendor/yunion.io/x/sqlchemy/backends.go b/vendor/yunion.io/x/sqlchemy/backends.go index 56d5263971..56de9ca278 100644 --- a/vendor/yunion.io/x/sqlchemy/backends.go +++ b/vendor/yunion.io/x/sqlchemy/backends.go @@ -38,16 +38,19 @@ type IBackend interface { GetTableSQL() string // GetCreateSQL returns the SQL for create a table GetCreateSQLs(ts ITableSpec) []string - // + // IsSupportIndexAndContraints returns whether the backend supports index and contraints such as foreigh keys + // MySQL: true + // Sqlite: true + // Clickhouse: false IsSupportIndexAndContraints() bool - // + // FetchTableColumnSpecs parse the table definition in database to extract columns' specification of a table FetchTableColumnSpecs(ts ITableSpec) ([]IColumnSpec, error) - // + // FetchIndexesAndConstraints parse the table defintion in database to extract index and constraints information of a table FetchIndexesAndConstraints(ts ITableSpec) ([]STableIndex, []STableConstraint, error) - // + // GetColumnSpecByFieldType parse the field of model struct to extract column specifiction of a field GetColumnSpecByFieldType(table *STableSpec, fieldType reflect.Type, fieldname string, tagmap map[string]string, isPointer bool) IColumnSpec // - CurrentUTCTimeStampString() string + // CurrentUTCTimeStampString() string // Capability @@ -58,8 +61,17 @@ type IBackend interface { // CanInsertOrUpdate returns weather the backend supports InsertOrUpdate CanInsertOrUpdate() bool + // DropIndexSQLTemplate returns the template of drop index SQL DropIndexSQLTemplate() string + // InsertSQLTemplate returns the template of insert SQL + InsertSQLTemplate() string + // InsertOrUpdateSQLTemplate returns the template of insert or update SQL + InsertOrUpdateSQLTemplate() string + // CanSupportRowAffected returns wether the backend support RowAffected method after update + // MySQL: true + // Sqlite: false + // Clickhouse: false CanSupportRowAffected() bool } diff --git a/vendor/yunion.io/x/sqlchemy/backends/clickhouse/clickhouse.go b/vendor/yunion.io/x/sqlchemy/backends/clickhouse/clickhouse.go index 2c05a8b1db..0cb4c7e18b 100644 --- a/vendor/yunion.io/x/sqlchemy/backends/clickhouse/clickhouse.go +++ b/vendor/yunion.io/x/sqlchemy/backends/clickhouse/clickhouse.go @@ -1,8 +1,31 @@ +// Copyright 2019 Yunion +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package clickhouse import ( + "fmt" + "reflect" + "strings" + _ "github.com/ClickHouse/clickhouse-go" + "yunion.io/x/pkg/errors" + "yunion.io/x/pkg/gotypes" + "yunion.io/x/pkg/tristate" + "yunion.io/x/pkg/utils" + "yunion.io/x/sqlchemy" ) @@ -18,11 +41,168 @@ func (click *SClickhouseBackend) Name() sqlchemy.DBBackendName { return sqlchemy.ClickhouseBackend } +// CanUpdate returns wether the backend supports update +func (click *SClickhouseBackend) CanUpdate() bool { + return false +} + +// CanInsert returns wether the backend supports Insert +func (click *SClickhouseBackend) CanInsert() bool { + return true +} + +// CanInsertOrUpdate returns weather the backend supports InsertOrUpdate +func (click *SClickhouseBackend) CanInsertOrUpdate() bool { + return false +} + func (click *SClickhouseBackend) IsSupportIndexAndContraints() bool { return false } +func (click *SClickhouseBackend) CanSupportRowAffected() bool { + return false +} + +func (click *SClickhouseBackend) GetCreateSQLs(ts sqlchemy.ITableSpec) []string { + cols := make([]string, 0) + primaries := make([]string, 0) + orderbys := make([]string, 0) + partitions := make([]string, 0) + for _, c := range ts.Columns() { + cols = append(cols, c.DefinitionString()) + if c.IsPrimary() { + primaries = append(primaries, fmt.Sprintf("`%s`", c.Name())) + } + if cc, ok := c.(IClickhouseColumnSpec); ok { + if cc.IsOrderBy() { + orderbys = append(orderbys, fmt.Sprintf("`%s`", c.Name())) + } + partition := cc.PartitionBy() + if len(partition) > 0 && !utils.IsInStringArray(partition, partitions) { + partitions = append(partitions, partition) + } + } + } + createSql := fmt.Sprintf("CREATE TABLE IF NOT EXISTS `%s` (\n%s\n) ENGINE MergeTree", ts.Name(), strings.Join(cols, ",\n")) + if len(orderbys) == 0 { + orderbys = primaries + } + if len(orderbys) > 0 { + createSql += fmt.Sprintf("\nORDER BY (%s)", strings.Join(orderbys, ", ")) + } else { + createSql += fmt.Sprintf("\nORDER BY tuple()") + } + if len(partitions) > 0 { + createSql += fmt.Sprintf("\nPARTITION BY (%s)", strings.Join(partitions, ", ")) + } + if len(primaries) > 0 { + createSql += fmt.Sprintf("\nPRIMARY KEY (%s)", strings.Join(primaries, ", ")) + } + createSql += "\nSETTINGS index_granularity=8192" + return []string{ + createSql, + } +} + func (click *SClickhouseBackend) FetchTableColumnSpecs(ts sqlchemy.ITableSpec) ([]sqlchemy.IColumnSpec, error) { - // XXX: TO DO - return ts.Columns(), nil + sql := fmt.Sprintf("DESCRIBE `%s`", ts.Name()) + query := ts.Database().NewRawQuery(sql, "name", "type", "default_type", "default_expression", "comment", "codec_expression", "ttl_expression") + infos := make([]sSqlColumnInfo, 0) + err := query.All(&infos) + if err != nil { + return nil, errors.Wrap(err, "describe table") + } + specs := make([]sqlchemy.IColumnSpec, 0) + for _, info := range infos { + spec := info.toColumnSpec() + specs = append(specs, spec) + } + + sql = fmt.Sprintf("SHOW CREATE TABLE `%s`", ts.Name()) + query = ts.Database().NewRawQuery(sql, "statement") + row := query.Row() + var defStr string + err = row.Scan(&defStr) + if err != nil { + return nil, errors.Wrap(err, "show create table") + } + primaries, orderbys, partition := parseCreateTable(defStr) + for _, spec := range specs { + if utils.IsInStringArray(spec.Name(), primaries) { + spec.SetPrimary(true) + } + if clickSpec, ok := spec.(IClickhouseColumnSpec); ok { + if utils.IsInStringArray(clickSpec.Name(), orderbys) { + clickSpec.SetOrderBy(true) + } + if strings.Contains(partition, clickSpec.Name()) { + clickSpec.SetPartitionBy(partition) + } + } + } + + return specs, nil +} + +func (click *SClickhouseBackend) GetColumnSpecByFieldType(table *sqlchemy.STableSpec, fieldType reflect.Type, fieldname string, tagmap map[string]string, isPointer bool) sqlchemy.IColumnSpec { + switch fieldType { + case tristate.TriStateType: + col := NewTristateColumn(fieldname, tagmap, isPointer) + return &col + case gotypes.TimeType: + col := NewDateTimeColumn(fieldname, tagmap, isPointer) + return &col + } + switch fieldType.Kind() { + case reflect.String: + col := NewTextColumn(fieldname, "String", tagmap, isPointer) + return &col + case reflect.Int, reflect.Int32: + col := NewIntegerColumn(fieldname, "Int32", tagmap, isPointer) + return &col + case reflect.Int8: + col := NewIntegerColumn(fieldname, "Int8", tagmap, isPointer) + return &col + case reflect.Int16: + col := NewIntegerColumn(fieldname, "Int16", tagmap, isPointer) + return &col + case reflect.Int64: + col := NewIntegerColumn(fieldname, "Int64", tagmap, isPointer) + return &col + case reflect.Uint, reflect.Uint32: + col := NewIntegerColumn(fieldname, "UInt32", tagmap, isPointer) + return &col + case reflect.Uint8: + col := NewIntegerColumn(fieldname, "UInt8", tagmap, isPointer) + return &col + case reflect.Uint16: + col := NewIntegerColumn(fieldname, "UInt16", tagmap, isPointer) + return &col + case reflect.Uint64: + col := NewIntegerColumn(fieldname, "UInt64", tagmap, isPointer) + return &col + case reflect.Bool: + col := NewBooleanColumn(fieldname, tagmap, isPointer) + return &col + case reflect.Float32: + if _, ok := tagmap[sqlchemy.TAG_WIDTH]; ok { + col := NewDecimalColumn(fieldname, tagmap, isPointer) + return &col + } + col := NewFloatColumn(fieldname, "Float32", tagmap, isPointer) + return &col + case reflect.Float64: + if _, ok := tagmap[sqlchemy.TAG_WIDTH]; ok { + col := NewDecimalColumn(fieldname, tagmap, isPointer) + return &col + } + col := NewFloatColumn(fieldname, "Float64", tagmap, isPointer) + return &col + } + if fieldType.Implements(gotypes.ISerializableType) { + col := NewCompoundColumn(fieldname, tagmap, isPointer) + return &col + } + return nil } diff --git a/vendor/yunion.io/x/sqlchemy/backends/clickhouse/column.go b/vendor/yunion.io/x/sqlchemy/backends/clickhouse/column.go new file mode 100644 index 0000000000..e2279f8f23 --- /dev/null +++ b/vendor/yunion.io/x/sqlchemy/backends/clickhouse/column.go @@ -0,0 +1,646 @@ +// Copyright 2019 Yunion +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package clickhouse + +import ( + "bytes" + "database/sql" + "fmt" + "reflect" + "strconv" + "strings" + "time" + + "yunion.io/x/jsonutils" + + "yunion.io/x/log" + "yunion.io/x/pkg/gotypes" + "yunion.io/x/pkg/tristate" + "yunion.io/x/pkg/util/timeutils" + "yunion.io/x/pkg/utils" + + "yunion.io/x/sqlchemy" +) + +type IClickhouseColumnSpec interface { + sqlchemy.IColumnSpec + + // IsOrderBy defines whether the column appears in order by clause + IsOrderBy() bool + + // PartitionBy defines expression that the column appaers in Partition by clause + PartitionBy() string + + // SetOrderBy set isOrderBy field + SetOrderBy(on bool) + + // SetPartitionBy set partitonby field + SetPartitionBy(expr string) +} + +func columnDefinitionBuffer(c sqlchemy.IColumnSpec) bytes.Buffer { + var buf bytes.Buffer + buf.WriteByte('`') + buf.WriteString(c.Name()) + buf.WriteByte('`') + buf.WriteByte(' ') + + if c.IsNullable() { + buf.WriteString("Nullable(") + } + + buf.WriteString(c.ColType()) + + if c.IsNullable() { + buf.WriteString(")") + } + + def := c.Default() + defOk := c.IsSupportDefault() + if def != "" { + if !defOk { + panic(fmt.Errorf("column %q type %q does not support having default value: %q", + c.Name(), c.ColType(), def, + )) + } + def = sqlchemy.GetStringValue(c.ConvertFromString(def)) + buf.WriteString(" DEFAULT ") + if c.IsText() { + buf.WriteByte('\'') + } + buf.WriteString(def) + if c.IsText() { + buf.WriteByte('\'') + } + } + + return buf +} + +type SClickhouseBaseColumn struct { + sqlchemy.SBaseColumn + + partionBy string + isOrderBy bool +} + +func (c *SClickhouseBaseColumn) IsOrderBy() bool { + return c.isOrderBy +} + +func (c *SClickhouseBaseColumn) SetOrderBy(on bool) { + c.isOrderBy = on +} + +func (c *SClickhouseBaseColumn) PartitionBy() string { + return c.partionBy +} + +func (c *SClickhouseBaseColumn) SetPartitionBy(expr string) { + c.partionBy = expr +} + +func NewClickhouseBaseColumn(name string, sqltype string, tagmap map[string]string, isPointer bool) SClickhouseBaseColumn { + var ok bool + var val string + partition := "" + tagmap, val, ok = utils.TagPop(tagmap, TAG_PARTITION) + if ok { + partition = val + } + orderBy := false + tagmap, val, ok = utils.TagPop(tagmap, TAG_ORDER) + if ok { + orderBy = utils.ToBool(val) + } + return SClickhouseBaseColumn{ + SBaseColumn: sqlchemy.NewBaseColumn(name, sqltype, tagmap, isPointer), + partionBy: partition, + isOrderBy: orderBy, + } +} + +// SBooleanColumn represents a boolean type column, which is a int(1) for mysql, with value of true or false +type SBooleanColumn struct { + SClickhouseBaseColumn +} + +// DefinitionString implementation of SBooleanColumn for IColumnSpec +func (c *SBooleanColumn) DefinitionString() string { + buf := columnDefinitionBuffer(c) + return buf.String() +} + +// ConvertFromString implementation of SBooleanColumn for IColumnSpec +func (c *SBooleanColumn) ConvertFromString(str string) interface{} { + switch strings.ToLower(str) { + case "true", "yes", "on", "ok", "1": + return uint8(1) + default: + return uint8(0) + } +} + +// ConvertFromValue implementation of STristateColumn for IColumnSpec +func (c *SBooleanColumn) ConvertFromValue(val interface{}) interface{} { + bVal := val.(bool) + if bVal { + return uint8(1) + } + return uint8(0) +} + +// IsZero implementation of SBooleanColumn for IColumnSpec +func (c *SBooleanColumn) IsZero(val interface{}) bool { + if c.IsPointer() { + bVal := val.(*bool) + return bVal == nil + } + bVal := val.(bool) + return bVal == false +} + +// NewBooleanColumn return an instance of SBooleanColumn +func NewBooleanColumn(name string, tagmap map[string]string, isPointer bool) SBooleanColumn { + bc := SBooleanColumn{SClickhouseBaseColumn: NewClickhouseBaseColumn(name, "UInt8", tagmap, isPointer)} + if !bc.IsPointer() && len(bc.Default()) > 0 && bc.ConvertFromString(bc.Default()) == uint8(1) { + msg := fmt.Sprintf("Non-pointer boolean column should not default true: %s(%s)", name, tagmap) + panic(msg) + } + return bc +} + +// STristateColumn represents a tristate type column, with value of true, false or none +type STristateColumn struct { + SClickhouseBaseColumn +} + +// DefinitionString implementation of STristateColumn for IColumnSpec +func (c *STristateColumn) DefinitionString() string { + buf := columnDefinitionBuffer(c) + return buf.String() +} + +// ConvertFromString implementation of STristateColumn for IColumnSpec +func (c *STristateColumn) ConvertFromString(str string) interface{} { + switch strings.ToLower(str) { + case "true", "yes", "on", "ok", "1": + return uint8(1) + case "none", "null", "unknown": + return sql.NullInt32{} + default: + return uint8(0) + } +} + +// ConvertFromValue implementation of STristateColumn for IColumnSpec +func (c *STristateColumn) ConvertFromValue(val interface{}) interface{} { + bVal := val.(tristate.TriState) + if bVal == tristate.True { + return uint8(1) + } else if bVal == tristate.False { + return uint8(0) + } else { + return sql.NullInt32{} + } +} + +// IsZero implementation of STristateColumn for IColumnSpec +func (c *STristateColumn) IsZero(val interface{}) bool { + if c.IsPointer() { + bVal := val.(*tristate.TriState) + return bVal == nil + } + bVal := val.(tristate.TriState) + return bVal == tristate.None +} + +// NewTristateColumn return an instance of STristateColumn +func NewTristateColumn(name string, tagmap map[string]string, isPointer bool) STristateColumn { + if _, ok := tagmap[sqlchemy.TAG_NULLABLE]; ok { + // tristate always nullable + delete(tagmap, sqlchemy.TAG_NULLABLE) + } + bc := STristateColumn{SClickhouseBaseColumn: NewClickhouseBaseColumn(name, "UInt8", tagmap, isPointer)} + return bc +} + +// SIntegerColumn represents an integer type of column, with value of integer +type SIntegerColumn struct { + SClickhouseBaseColumn + + // Is this column is a version column for this records + isAutoVersion bool +} + +// IsNumeric implementation of SIntegerColumn for IColumnSpec +func (c *SIntegerColumn) IsNumeric() bool { + return true +} + +// DefinitionString implementation of SIntegerColumn for IColumnSpec +func (c *SIntegerColumn) DefinitionString() string { + buf := columnDefinitionBuffer(c) + return buf.String() +} + +// IsZero implementation of SIntegerColumn for IColumnSpec +func (c *SIntegerColumn) IsZero(val interface{}) bool { + if val == nil || (c.IsPointer() && reflect.ValueOf(val).IsNil()) { + return true + } + switch intVal := val.(type) { + case int8, int16, int32, int64, int, uint, uint8, uint16, uint32, uint64: + return intVal == 0 + } + return true +} + +// ConvertFromString implementation of STristateColumn for IColumnSpec +func (c *SIntegerColumn) ConvertFromString(str string) interface{} { + ctype := c.SBaseColumn.ColType() + if ctype[0] == 'U' { + // unsigned + val, _ := strconv.ParseUint(str, 10, 64) + switch ctype { + case "UInt8": + return uint8(val) + case "UInt16": + return uint16(val) + case "UInt32": + return uint32(val) + case "UInt64": + return val + default: + panic(fmt.Sprintf("unsupported type %s", ctype)) + } + return val + } else { + val, _ := strconv.ParseInt(str, 10, 64) + switch ctype { + case "Int8": + return int8(val) + case "Int16": + return int16(val) + case "Int32": + return int32(val) + case "Int64": + return val + default: + panic(fmt.Sprintf("unsupported type %s", ctype)) + } + return val + } +} + +// IsAutoVersion implements IsAutoVersion for IColumnSpec +func (c *SIntegerColumn) IsAutoVersion() bool { + return c.isAutoVersion +} + +// NewIntegerColumn return an instance of SIntegerColumn +func NewIntegerColumn(name string, sqltype string, tagmap map[string]string, isPointer bool) SIntegerColumn { + if _, ok := tagmap[sqlchemy.TAG_AUTOVERSION]; ok { + log.Warningf("auto_version field %s not supported by ClickHouse", name) + } + if _, ok := tagmap[sqlchemy.TAG_AUTOINCREMENT]; ok { + log.Warningf("auto_increment field %s not supported by ClickHouse", name) + } + c := SIntegerColumn{ + SClickhouseBaseColumn: NewClickhouseBaseColumn(name, sqltype, tagmap, isPointer), + } + return c +} + +// SFloatColumn represents a float type column, e.g. float32 or float64 +type SFloatColumn struct { + SClickhouseBaseColumn +} + +// IsNumeric implementation of SFloatColumn for IColumnSpec +func (c *SFloatColumn) IsNumeric() bool { + return true +} + +// DefinitionString implementation of SFloatColumn for IColumnSpec +func (c *SFloatColumn) DefinitionString() string { + buf := columnDefinitionBuffer(c) + return buf.String() +} + +// IsZero implementation of SFloatColumn for IColumnSpec +func (c *SFloatColumn) IsZero(val interface{}) bool { + if c.IsPointer() { + switch val.(type) { + case *float32: + return val.(*float32) == nil + case *float64: + return val.(*float64) == nil + } + } else { + switch val.(type) { + case float32: + return val.(float32) == 0.0 + case float64: + return val.(float64) == 0.0 + } + } + return true +} + +// ConvertFromString implementation of STristateColumn for IColumnSpec +func (c *SFloatColumn) ConvertFromString(str string) interface{} { + ctype := c.SBaseColumn.ColType() + val, _ := strconv.ParseFloat(str, 64) + switch ctype { + case "Float32": + return float32(val) + case "Float64": + return val + default: + panic(fmt.Sprintf("unsupported type %s", ctype)) + } + return val +} + +// NewFloatColumn returns an instance of SFloatColumn +func NewFloatColumn(name string, sqlType string, tagmap map[string]string, isPointer bool) SFloatColumn { + return SFloatColumn{ + SClickhouseBaseColumn: NewClickhouseBaseColumn(name, sqlType, tagmap, isPointer), + } +} + +// SDecimalColumn represents a DECIMAL type of column, i.e. a float with fixed width of digits +type SDecimalColumn struct { + SClickhouseBaseColumn + width int + Precision int +} + +// ColType implementation of SDecimalColumn for IColumnSpec +func (c *SDecimalColumn) ColType() string { + str := c.SClickhouseBaseColumn.ColType() + return fmt.Sprintf("%s(%d, %d)", str, c.width, c.Precision) +} + +// IsNumeric implementation of SDecimalColumn for IColumnSpec +func (c *SDecimalColumn) IsNumeric() bool { + return true +} + +// DefinitionString implementation of SDecimalColumn for IColumnSpec +func (c *SDecimalColumn) DefinitionString() string { + buf := columnDefinitionBuffer(c) + return buf.String() +} + +// IsZero implementation of SDecimalColumn for IColumnSpec +func (c *SDecimalColumn) IsZero(val interface{}) bool { + if c.IsPointer() { + switch val.(type) { + case *float32: + return val.(*float32) == nil + case *float64: + return val.(*float64) == nil + } + } else { + switch val.(type) { + case float32: + return val.(float32) == 0.0 + case float64: + return val.(float64) == 0.0 + } + } + return true +} + +// ConvertFromString implementation of STristateColumn for IColumnSpec +func (c *SDecimalColumn) ConvertFromString(str string) interface{} { + val, _ := strconv.ParseFloat(str, 64) + return val +} + +// NewDecimalColumn returns an instance of SDecimalColumn +func NewDecimalColumn(name string, tagmap map[string]string, isPointer bool) SDecimalColumn { + tagmap, v, ok := utils.TagPop(tagmap, sqlchemy.TAG_PRECISION) + if !ok { + panic(fmt.Sprintf("Field %q of float misses precision tag", name)) + } + prec, err := strconv.Atoi(v) + if err != nil { + panic(fmt.Sprintf("Field precision of %q shoud be integer (%q)", name, v)) + } + tagmap, v, ok = utils.TagPop(tagmap, sqlchemy.TAG_WIDTH) + if !ok { + panic(fmt.Sprintf("Field %q of float misses width tag", name)) + } + width, err := strconv.Atoi(v) + if err != nil { + panic(fmt.Sprintf("Field width of %q shoud be integer (%q)", name, v)) + } + var sqlType string + if width <= 9 { + sqlType = "Decimal32" + } else if width <= 18 { + sqlType = "Decimal64" + } else if width <= 38 { + sqlType = "Decimal128" + } else if width <= 76 { + sqlType = "Decimal256" + } else { + panic(fmt.Sprintf("unsupported decimal width %d", width)) + } + c := SDecimalColumn{ + SClickhouseBaseColumn: NewClickhouseBaseColumn(name, sqlType, tagmap, isPointer), + width: width, + Precision: prec, + } + return c +} + +// STextColumn represents a text type of column +type STextColumn struct { + SClickhouseBaseColumn +} + +// IsText implementation of STextColumn for IColumnSpec +func (c *STextColumn) IsText() bool { + return true +} + +// IsSearchable implementation of STextColumn for IColumnSpec +func (c *STextColumn) IsSearchable() bool { + return true +} + +// IsAscii implementation of STextColumn for IColumnSpec +func (c *STextColumn) IsAscii() bool { + return false +} + +// DefinitionString implementation of STextColumn for IColumnSpec +func (c *STextColumn) DefinitionString() string { + buf := columnDefinitionBuffer(c) + return buf.String() +} + +// IsZero implementation of STextColumn for IColumnSpec +func (c *STextColumn) IsZero(val interface{}) bool { + if c.IsPointer() { + return gotypes.IsNil(val) + } + return reflect.ValueOf(val).Len() == 0 +} + +func (c *STextColumn) IsString() bool { + return true +} + +// ConvertFromString implementation of STristateColumn for IColumnSpec +func (c *STextColumn) ConvertFromString(str string) interface{} { + return str +} + +// NewTextColumn return an instance of STextColumn +func NewTextColumn(name string, sqlType string, tagmap map[string]string, isPointer bool) STextColumn { + return STextColumn{ + SClickhouseBaseColumn: NewClickhouseBaseColumn(name, sqlType, tagmap, isPointer), + } +} + +// STimeTypeColumn represents a Detetime type of column, e.g. DateTime +type STimeTypeColumn struct { + SClickhouseBaseColumn +} + +// IsText implementation of STimeTypeColumn for IColumnSpec +func (c *STimeTypeColumn) IsText() bool { + return true +} + +// DefinitionString implementation of STimeTypeColumn for IColumnSpec +func (c *STimeTypeColumn) DefinitionString() string { + buf := columnDefinitionBuffer(c) + return buf.String() +} + +// IsZero implementation of STimeTypeColumn for IColumnSpec +func (c *STimeTypeColumn) IsZero(val interface{}) bool { + if c.IsPointer() { + bVal := val.(*time.Time) + return bVal == nil + } + bVal := val.(time.Time) + return bVal.IsZero() +} + +// ConvertFromString implementation of STristateColumn for IColumnSpec +func (c *STimeTypeColumn) ConvertFromString(str string) interface{} { + tm, _ := timeutils.ParseTimeStr(str) + return tm +} + +// NewTimeTypeColumn return an instance of STimeTypeColumn +func NewTimeTypeColumn(name string, typeStr string, tagmap map[string]string, isPointer bool) STimeTypeColumn { + dc := STimeTypeColumn{ + SClickhouseBaseColumn: NewClickhouseBaseColumn(name, typeStr, tagmap, isPointer), + } + return dc +} + +// SDateTimeColumn represents a DateTime type of column +type SDateTimeColumn struct { + STimeTypeColumn + + // Is this column a 'created_at' field, whichi records the time of create this record + isCreatedAt bool + + // Is this column a 'updated_at' field, whichi records the time when this record was updated + isUpdatedAt bool +} + +func (c *SDateTimeColumn) IsCreatedAt() bool { + return c.isCreatedAt +} + +func (c *SDateTimeColumn) IsUpdatedAt() bool { + return c.isUpdatedAt +} + +func (c *SDateTimeColumn) IsDateTime() bool { + return true +} + +// NewDateTimeColumn returns an instance of DateTime column +func NewDateTimeColumn(name string, tagmap map[string]string, isPointer bool) SDateTimeColumn { + createdAt := false + updatedAt := false + tagmap, v, ok := utils.TagPop(tagmap, sqlchemy.TAG_CREATE_TIMESTAMP) + if ok { + createdAt = utils.ToBool(v) + } + tagmap, v, ok = utils.TagPop(tagmap, sqlchemy.TAG_UPDATE_TIMESTAMP) + if ok { + updatedAt = utils.ToBool(v) + } + dtc := SDateTimeColumn{ + NewTimeTypeColumn(name, "DateTime", tagmap, isPointer), + createdAt, updatedAt, + } + return dtc +} + +// CompoundColumn represents a column of compound tye, e.g. a JSON, an Array, or a struct +type CompoundColumn struct { + STextColumn +} + +// DefinitionString implementation of CompoundColumn for IColumnSpec +func (c *CompoundColumn) DefinitionString() string { + buf := columnDefinitionBuffer(c) + return buf.String() +} + +// IsZero implementation of CompoundColumn for IColumnSpec +func (c *CompoundColumn) IsZero(val interface{}) bool { + if val == nil { + return true + } + if c.IsPointer() && reflect.ValueOf(val).IsNil() { + return true + } + return false +} + +// ConvertFromString implementation of CompoundColumn for IColumnSpec +func (c *CompoundColumn) ConvertFromString(str string) interface{} { + json, err := jsonutils.ParseString(str) + if err != nil { + log.Errorf("ParseString fail %s", err) + json = jsonutils.JSONNull + } + return json.String() +} + +// ConvertFromValue implementation of CompoundColumn for IColumnSpec +func (c *CompoundColumn) ConvertFromValue(val interface{}) interface{} { + return jsonutils.Marshal(val).String() +} + +// NewCompoundColumn returns an instance of CompoundColumn +func NewCompoundColumn(name string, tagmap map[string]string, isPointer bool) CompoundColumn { + dtc := CompoundColumn{NewTextColumn(name, "String", tagmap, isPointer)} + return dtc +} diff --git a/vendor/yunion.io/x/sqlchemy/backends/clickhouse/columninfo.go b/vendor/yunion.io/x/sqlchemy/backends/clickhouse/columninfo.go new file mode 100644 index 0000000000..b70e4d3731 --- /dev/null +++ b/vendor/yunion.io/x/sqlchemy/backends/clickhouse/columninfo.go @@ -0,0 +1,168 @@ +// Copyright 2019 Yunion +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package clickhouse + +import ( + "regexp" + "strings" + + "yunion.io/x/log" + + "yunion.io/x/sqlchemy" +) + +// name type default_type default_expression comment codec_expression ttl_expression + +type sSqlColumnInfo struct { + Name string `json:"name"` + Type string `json:"type"` + DefaultType string `json:"default_type"` + DefaultExpression string `json:"default_expression"` + Comment string `json:"comment"` + CodecExpression string `json:"codec_expression"` + TtlExpression string `json:"ttl_expression"` +} + +func (info *sSqlColumnInfo) isNullable() bool { + if strings.HasPrefix(info.Type, "Nullable(") { + return true + } else { + return false + } +} + +func (info *sSqlColumnInfo) getType() string { + if strings.HasPrefix(info.Type, "Nullable(") { + return info.Type[len("Nullable(") : len(info.Type)-1] + } else { + return info.Type + } +} + +func (info *sSqlColumnInfo) getDefault() string { + if len(info.DefaultExpression) > 0 { + if strings.HasPrefix(info.DefaultExpression, "CAST(") { + defaultVals := strings.Split(info.DefaultExpression[len("CAST("):len(info.DefaultExpression)-1], ",") + defaultVal := defaultVals[0] + typeStr := info.getType() + if typeStr == "String" || strings.HasPrefix(typeStr, "FixString") { + defaultVal = defaultVal[1 : len(defaultVal)-1] + } + return defaultVal + } else { + return info.DefaultExpression + } + } + return "" +} + +func (info *sSqlColumnInfo) getTagmap() map[string]string { + tagmap := make(map[string]string) + if info.isNullable() { + tagmap[sqlchemy.TAG_NULLABLE] = "true" + } else { + tagmap[sqlchemy.TAG_NULLABLE] = "false" + } + defVal := info.getDefault() + if len(defVal) > 0 { + tagmap[sqlchemy.TAG_DEFAULT] = defVal + } + return tagmap +} + +func (info *sSqlColumnInfo) toColumnSpec() sqlchemy.IColumnSpec { + sqlType := info.getType() + switch sqlType { + case "String": + c := NewTextColumn(info.Name, sqlType, info.getTagmap(), false) + return &c + case "Int8", "Int16", "Int32", "Int64", "UInt8", "UInt16", "UInt32", "UInt64": + c := NewIntegerColumn(info.Name, sqlType, info.getTagmap(), false) + return &c + case "Float32", "Float64": + c := NewFloatColumn(info.Name, sqlType, info.getTagmap(), false) + return &c + case "DateTime": + c := NewDateTimeColumn(info.Name, info.getTagmap(), false) + return &c + default: + if strings.HasPrefix(sqlType, "Decimal") { + c := NewDecimalColumn(info.Name, info.getTagmap(), false) + return &c + } else if strings.HasPrefix(sqlType, "FixString") { + c := NewTextColumn(info.Name, "FixString", info.getTagmap(), false) + return &c + } + log.Errorf("unsupported type %s", info.Type) + } + return nil +} + +const ( + primaryKeyPrefix = "PRIMARY KEY " + orderByPrefix = "ORDER BY " + partitionByPrefix = "PARTITION BY " + setttingsPrefix = "SETTINGS" + + paramPattern = `(\w+|\([\w,\s]+\))` + primaryKeyPattern = primaryKeyPrefix + paramPattern + orderByPattern = orderByPrefix + paramPattern +) + +var ( + primaryKeyRegexp = regexp.MustCompile(primaryKeyPattern) + orderByRegexp = regexp.MustCompile(orderByPattern) +) + +func parseKeys(keyStr string) []string { + keyStr = strings.TrimSpace(keyStr) + if keyStr[0] == '(' { + keyStr = keyStr[1 : len(keyStr)-1] + } + ret := make([]string, 0) + for _, key := range strings.Split(keyStr, ",") { + key = strings.TrimSpace(key) + ret = append(ret, key) + } + return ret +} + +func parseCreateTable(sqlStr string) (primaries []string, orderbys []string, partition string) { + matches := primaryKeyRegexp.FindAllStringSubmatch(sqlStr, -1) + if len(matches) > 0 { + primaries = parseKeys(matches[0][1]) + } + matches = orderByRegexp.FindAllStringSubmatch(sqlStr, -1) + if len(matches) > 0 { + orderbys = parseKeys(matches[0][1]) + } + partIdx := strings.Index(sqlStr, partitionByPrefix) + if partIdx > 0 { + partIdx += len(partitionByPrefix) + nextIdx := -1 + for _, pattern := range []string{primaryKeyPrefix, orderByPrefix, setttingsPrefix} { + idx := strings.Index(sqlStr[partIdx:], pattern) + if nextIdx < 0 || nextIdx > idx { + nextIdx = idx + } + } + if nextIdx < 0 { + partition = strings.TrimSpace(sqlStr[partIdx:]) + } else { + partition = strings.TrimSpace(sqlStr[partIdx:][:nextIdx]) + } + } + return +} diff --git a/vendor/yunion.io/x/sqlchemy/backends/clickhouse/consts.go b/vendor/yunion.io/x/sqlchemy/backends/clickhouse/consts.go new file mode 100644 index 0000000000..7ee7be5aab --- /dev/null +++ b/vendor/yunion.io/x/sqlchemy/backends/clickhouse/consts.go @@ -0,0 +1,23 @@ +// Copyright 2019 Yunion +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package clickhouse + +const ( + // TAG_PARTITION defines expression of PARTITION BY + TAG_PARTITION = "clickhouse_partition_by" + + // TAG_ORDER defines fields of ORDER BY + TAG_ORDER = "clickhouse_order_by" +) diff --git a/vendor/yunion.io/x/sqlchemy/backends/clickhouse/doc.go b/vendor/yunion.io/x/sqlchemy/backends/clickhouse/doc.go new file mode 100644 index 0000000000..3c9a83a35e --- /dev/null +++ b/vendor/yunion.io/x/sqlchemy/backends/clickhouse/doc.go @@ -0,0 +1,15 @@ +// Copyright 2019 Yunion +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package clickhouse // import "yunion.io/x/sqlchemy/backends/clickhouse" diff --git a/vendor/yunion.io/x/sqlchemy/constraint_test.go b/vendor/yunion.io/x/sqlchemy/backends/doc.go similarity index 90% rename from vendor/yunion.io/x/sqlchemy/constraint_test.go rename to vendor/yunion.io/x/sqlchemy/backends/doc.go index 1f16dae113..e1a7ef3251 100644 --- a/vendor/yunion.io/x/sqlchemy/constraint_test.go +++ b/vendor/yunion.io/x/sqlchemy/backends/doc.go @@ -12,4 +12,4 @@ // See the License for the specific language governing permissions and // limitations under the License. -package sqlchemy +package backends // import "yunion.io/x/sqlchemy/backends" diff --git a/vendor/yunion.io/x/sqlchemy/backends/loader.go b/vendor/yunion.io/x/sqlchemy/backends/loader.go index 26835d661b..ccc7b385a2 100644 --- a/vendor/yunion.io/x/sqlchemy/backends/loader.go +++ b/vendor/yunion.io/x/sqlchemy/backends/loader.go @@ -1,3 +1,17 @@ +// Copyright 2019 Yunion +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package backends import ( diff --git a/vendor/yunion.io/x/sqlchemy/backends/mysql/column.go b/vendor/yunion.io/x/sqlchemy/backends/mysql/column.go new file mode 100644 index 0000000000..4e59e886c7 --- /dev/null +++ b/vendor/yunion.io/x/sqlchemy/backends/mysql/column.go @@ -0,0 +1,631 @@ +// Copyright 2019 Yunion +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package mysql + +import ( + "bytes" + "database/sql" + "fmt" + "reflect" + "strconv" + "strings" + "time" + + "yunion.io/x/jsonutils" + "yunion.io/x/log" + + "yunion.io/x/pkg/gotypes" + "yunion.io/x/pkg/tristate" + "yunion.io/x/pkg/util/timeutils" + "yunion.io/x/pkg/utils" + + "yunion.io/x/sqlchemy" +) + +func columnDefinitionBuffer(c sqlchemy.IColumnSpec) bytes.Buffer { + var buf bytes.Buffer + buf.WriteByte('`') + buf.WriteString(c.Name()) + buf.WriteByte('`') + buf.WriteByte(' ') + buf.WriteString(c.ColType()) + + extra := c.ExtraDefs() + if len(extra) > 0 { + buf.WriteString(" ") + buf.WriteString(extra) + } + + if !c.IsNullable() { + buf.WriteString(" NOT NULL") + } + + def := c.Default() + defOk := c.IsSupportDefault() + if def != "" { + if !defOk { + panic(fmt.Errorf("column %q type %q does not support having default value: %q", + c.Name(), c.ColType(), def, + )) + } + def = sqlchemy.GetStringValue(c.ConvertFromString(def)) + buf.WriteString(" DEFAULT ") + if c.IsText() { + buf.WriteByte('\'') + } + buf.WriteString(def) + if c.IsText() { + buf.WriteByte('\'') + } + } + + return buf +} + +// SBooleanColumn represents a boolean type column, which is a int(1) for mysql, with value of true or false +type SBooleanColumn struct { + sqlchemy.SBaseWidthColumn +} + +// DefinitionString implementation of SBooleanColumn for IColumnSpec +func (c *SBooleanColumn) DefinitionString() string { + buf := columnDefinitionBuffer(c) + return buf.String() +} + +// ConvertFromString implementation of SBooleanColumn for IColumnSpec +func (c *SBooleanColumn) ConvertFromString(str string) interface{} { + switch strings.ToLower(str) { + case "true", "yes", "on", "ok", "1": + return 1 + default: + return 0 + } +} + +// ConvertFromValue implementation of STristateColumn for IColumnSpec +func (c *SBooleanColumn) ConvertFromValue(val interface{}) interface{} { + bVal := val.(bool) + if bVal { + return 1 + } + return 0 +} + +// IsZero implementation of SBooleanColumn for IColumnSpec +func (c *SBooleanColumn) IsZero(val interface{}) bool { + if c.IsPointer() { + bVal := val.(*bool) + return bVal == nil + } + bVal := val.(bool) + return bVal == false +} + +// NewBooleanColumn return an instance of SBooleanColumn +func NewBooleanColumn(name string, tagmap map[string]string, isPointer bool) SBooleanColumn { + bc := SBooleanColumn{SBaseWidthColumn: sqlchemy.NewBaseWidthColumn(name, "TINYINT", tagmap, isPointer)} + if !bc.IsPointer() && len(bc.Default()) > 0 && bc.ConvertFromString(bc.Default()) == 1 { + msg := fmt.Sprintf("Non-pointer boolean column should not default true: %s(%s)", name, tagmap) + panic(msg) + } + return bc +} + +// STristateColumn represents a tristate type column, with value of true, false or none +type STristateColumn struct { + sqlchemy.SBaseWidthColumn +} + +// DefinitionString implementation of STristateColumn for IColumnSpec +func (c *STristateColumn) DefinitionString() string { + buf := columnDefinitionBuffer(c) + return buf.String() +} + +// ConvertFromString implementation of STristateColumn for IColumnSpec +func (c *STristateColumn) ConvertFromString(str string) interface{} { + switch strings.ToLower(str) { + case "true", "yes", "on", "ok", "1": + return 1 + case "none", "null", "unknown": + return sql.NullInt32{} + default: + return 0 + } +} + +// ConvertFromValue implementation of STristateColumn for IColumnSpec +func (c *STristateColumn) ConvertFromValue(val interface{}) interface{} { + bVal := val.(tristate.TriState) + if bVal == tristate.True { + return 1 + } else if bVal == tristate.False { + return 0 + } else { + return sql.NullInt32{} + } +} + +// IsZero implementation of STristateColumn for IColumnSpec +func (c *STristateColumn) IsZero(val interface{}) bool { + if c.IsPointer() { + bVal := val.(*tristate.TriState) + return bVal == nil + } + bVal := val.(tristate.TriState) + return bVal == tristate.None +} + +// NewTristateColumn return an instance of STristateColumn +func NewTristateColumn(name string, tagmap map[string]string, isPointer bool) STristateColumn { + if _, ok := tagmap[sqlchemy.TAG_NULLABLE]; ok { + // tristate always nullable + delete(tagmap, sqlchemy.TAG_NULLABLE) + } + bc := STristateColumn{SBaseWidthColumn: sqlchemy.NewBaseWidthColumn(name, "TINYINT", tagmap, isPointer)} + return bc +} + +// SIntegerColumn represents an integer type of column, with value of integer +type SIntegerColumn struct { + sqlchemy.SBaseWidthColumn + + // Is this column an autoincrement colmn + isAutoIncrement bool + + // Is this column is a version column for this records + isAutoVersion bool + + // Is this column a unsigned integer? + isUnsigned bool + + // If this column is an autoincrement column, AutoIncrementOffset records the initial offset + autoIncrementOffset int64 +} + +// IsNumeric implementation of SIntegerColumn for IColumnSpec +func (c *SIntegerColumn) IsNumeric() bool { + return true +} + +// ExtraDefs implementation of SIntegerColumn for IColumnSpec +func (c *SIntegerColumn) ExtraDefs() string { + if c.isAutoIncrement { + return "AUTO_INCREMENT" + } + return "" +} + +// DefinitionString implementation of SIntegerColumn for IColumnSpec +func (c *SIntegerColumn) DefinitionString() string { + buf := columnDefinitionBuffer(c) + return buf.String() +} + +// IsZero implementation of SIntegerColumn for IColumnSpec +func (c *SIntegerColumn) IsZero(val interface{}) bool { + if val == nil || (c.IsPointer() && reflect.ValueOf(val).IsNil()) { + return true + } + switch intVal := val.(type) { + case int8, int16, int32, int64, int, uint, uint8, uint16, uint32, uint64: + return intVal == 0 + } + return true +} + +// ConvertFromString implementation of SBooleanColumn for IColumnSpec +func (c *SIntegerColumn) ConvertFromString(str string) interface{} { + if c.isUnsigned { + val, _ := strconv.ParseUint(str, 10, 64) + return val + } else { + val, _ := strconv.ParseInt(str, 10, 64) + return val + } +} + +// ColType implementation of SIntegerColumn for IColumnSpec +func (c *SIntegerColumn) ColType() string { + str := (&c.SBaseWidthColumn).ColType() + if c.isUnsigned { + str += " UNSIGNED" + } + return str +} + +func (c *SIntegerColumn) IsAutoVersion() bool { + return c.isAutoVersion +} + +func (c *SIntegerColumn) IsAutoIncrement() bool { + return c.isAutoIncrement +} + +func (c *SIntegerColumn) AutoIncrementOffset() int64 { + return c.autoIncrementOffset +} + +func (c *SIntegerColumn) SetAutoIncrement(on bool) { + c.isAutoIncrement = on +} + +func (c *SIntegerColumn) SetAutoIncrementOffset(offset int64) { + c.autoIncrementOffset = offset +} + +// NewIntegerColumn return an instance of SIntegerColumn +func NewIntegerColumn(name string, sqltype string, unsigned bool, tagmap map[string]string, isPointer bool) SIntegerColumn { + autoinc := false + autoincBase := int64(0) + tagmap, v, ok := utils.TagPop(tagmap, sqlchemy.TAG_AUTOINCREMENT) + if ok { + base, err := strconv.ParseInt(v, 10, 64) + if err == nil && base > 0 { + autoinc = true + autoincBase = base + } else { + autoinc = utils.ToBool(v) + } + } + autover := false + tagmap, v, ok = utils.TagPop(tagmap, sqlchemy.TAG_AUTOVERSION) + if ok { + autover = utils.ToBool(v) + } + c := SIntegerColumn{ + SBaseWidthColumn: sqlchemy.NewBaseWidthColumn(name, sqltype, tagmap, isPointer), + isAutoIncrement: autoinc, + autoIncrementOffset: autoincBase, + isAutoVersion: autover, + isUnsigned: unsigned, + } + if autoinc { + c.SetPrimary(true) // autoincrement column must be primary key + c.SetNullable(false) + c.isAutoVersion = false + } else if autover { + c.SetPrimary(false) + c.SetNullable(false) + if len(c.Default()) == 0 { + c.SetDefault("0") + } + } + return c +} + +// SFloatColumn represents a float type column, e.g. float32 or float64 +type SFloatColumn struct { + sqlchemy.SBaseColumn +} + +// IsNumeric implementation of SFloatColumn for IColumnSpec +func (c *SFloatColumn) IsNumeric() bool { + return true +} + +// DefinitionString implementation of SFloatColumn for IColumnSpec +func (c *SFloatColumn) DefinitionString() string { + buf := columnDefinitionBuffer(c) + return buf.String() +} + +// IsZero implementation of SFloatColumn for IColumnSpec +func (c *SFloatColumn) IsZero(val interface{}) bool { + if c.IsPointer() { + switch val.(type) { + case *float32: + return val.(*float32) == nil + case *float64: + return val.(*float64) == nil + } + } else { + switch val.(type) { + case float32: + return val.(float32) == 0.0 + case float64: + return val.(float64) == 0.0 + } + } + return true +} + +// ConvertFromString implementation of SBooleanColumn for IColumnSpec +func (c *SFloatColumn) ConvertFromString(str string) interface{} { + val, _ := strconv.ParseFloat(str, 64) + return val +} + +// NewFloatColumn returns an instance of SFloatColumn +func NewFloatColumn(name string, sqlType string, tagmap map[string]string, isPointer bool) SFloatColumn { + return SFloatColumn{SBaseColumn: sqlchemy.NewBaseColumn(name, sqlType, tagmap, isPointer)} +} + +// SDecimalColumn represents a DECIMAL type of column, i.e. a float with fixed width of digits +type SDecimalColumn struct { + sqlchemy.SBaseWidthColumn + Precision int +} + +// ColType implementation of SDecimalColumn for IColumnSpec +func (c *SDecimalColumn) ColType() string { + str := c.SBaseWidthColumn.ColType() + return fmt.Sprintf("%s, %d)", str[:len(str)-1], c.Precision) +} + +// IsNumeric implementation of SDecimalColumn for IColumnSpec +func (c *SDecimalColumn) IsNumeric() bool { + return true +} + +// DefinitionString implementation of SDecimalColumn for IColumnSpec +func (c *SDecimalColumn) DefinitionString() string { + buf := columnDefinitionBuffer(c) + return buf.String() +} + +// IsZero implementation of SDecimalColumn for IColumnSpec +func (c *SDecimalColumn) IsZero(val interface{}) bool { + if c.IsPointer() { + switch val.(type) { + case *float32: + return val.(*float32) == nil + case *float64: + return val.(*float64) == nil + } + } else { + switch val.(type) { + case float32: + return val.(float32) == 0.0 + case float64: + return val.(float64) == 0.0 + } + } + return true +} + +// ConvertFromString implementation of SBooleanColumn for IColumnSpec +func (c *SDecimalColumn) ConvertFromString(str string) interface{} { + val, _ := strconv.ParseFloat(str, 64) + return val +} + +// NewDecimalColumn returns an instance of SDecimalColumn +func NewDecimalColumn(name string, tagmap map[string]string, isPointer bool) SDecimalColumn { + tagmap, v, ok := utils.TagPop(tagmap, sqlchemy.TAG_PRECISION) + if !ok { + panic(fmt.Sprintf("Field %q of float misses precision tag", name)) + } + prec, err := strconv.Atoi(v) + if err != nil { + panic(fmt.Sprintf("Field precision of %q shoud be integer (%q)", name, v)) + } + return SDecimalColumn{ + SBaseWidthColumn: sqlchemy.NewBaseWidthColumn(name, "DECIMAL", tagmap, isPointer), + Precision: prec, + } +} + +// STextColumn represents a text type of column +type STextColumn struct { + sqlchemy.SBaseWidthColumn + Charset string +} + +// IsSupportDefault implementation of STextColumn for IColumnSpec +func (c *STextColumn) IsSupportDefault() bool { + // https://stackoverflow.com/questions/3466872/why-cant-a-text-column-have-a-default-value-in-mysql + // MySQL does not support default for TEXT/BLOB + if c.SBaseColumn.ColType() == "VARCHAR" { + return true + } + return false +} + +// ColType implementation of STextColumn for IColumnSpec +func (c *STextColumn) ColType() string { + var charset string + var collate string + switch c.Charset { + case "ascii": + charset = "ascii" + collate = "ascii_general_ci" + case "utf8": + charset = "utf8mb4" + collate = "utf8mb4_unicode_ci" + } + return fmt.Sprintf("%s CHARACTER SET '%s' COLLATE '%s'", c.SBaseWidthColumn.ColType(), charset, collate) +} + +// IsText implementation of STextColumn for IColumnSpec +func (c *STextColumn) IsText() bool { + return true +} + +// IsSearchable implementation of STextColumn for IColumnSpec +func (c *STextColumn) IsSearchable() bool { + return true +} + +// IsAscii implementation of STextColumn for IColumnSpec +func (c *STextColumn) IsAscii() bool { + if c.Charset == "ascii" { + return true + } + return false +} + +// DefinitionString implementation of STextColumn for IColumnSpec +func (c *STextColumn) DefinitionString() string { + buf := columnDefinitionBuffer(c) + return buf.String() +} + +// IsZero implementation of STextColumn for IColumnSpec +func (c *STextColumn) IsZero(val interface{}) bool { + if c.IsPointer() { + return gotypes.IsNil(val) + } + return reflect.ValueOf(val).Len() == 0 +} + +// ConvertFromString implementation of SBooleanColumn for IColumnSpec +func (c *STextColumn) ConvertFromString(str string) interface{} { + return str +} + +func (c *STextColumn) IsString() bool { + return true +} + +// NewTextColumn return an instance of STextColumn +func NewTextColumn(name string, sqlType string, tagmap map[string]string, isPointer bool) STextColumn { + tagmap, charset, _ := utils.TagPop(tagmap, sqlchemy.TAG_CHARSET) + if len(charset) == 0 { + charset = "utf8" + } else if charset != "utf8" && charset != "ascii" { + panic(fmt.Sprintf("Unsupported charset %s for %s", charset, name)) + } + return STextColumn{ + SBaseWidthColumn: sqlchemy.NewBaseWidthColumn(name, sqlType, tagmap, isPointer), + Charset: charset, + } +} + +// STimeTypeColumn represents a Detetime type of column, e.g. DateTime +type STimeTypeColumn struct { + sqlchemy.SBaseColumn +} + +// IsText implementation of STimeTypeColumn for IColumnSpec +func (c *STimeTypeColumn) IsText() bool { + return true +} + +// DefinitionString implementation of STimeTypeColumn for IColumnSpec +func (c *STimeTypeColumn) DefinitionString() string { + buf := columnDefinitionBuffer(c) + return buf.String() +} + +// IsZero implementation of STimeTypeColumn for IColumnSpec +func (c *STimeTypeColumn) IsZero(val interface{}) bool { + if c.IsPointer() { + bVal := val.(*time.Time) + return bVal == nil + } + bVal := val.(time.Time) + return bVal.IsZero() +} + +// ConvertFromString implementation of SBooleanColumn for IColumnSpec +func (c *STimeTypeColumn) ConvertFromString(str string) interface{} { + tm, _ := timeutils.ParseTimeStr(str) + return tm +} + +// NewTimeTypeColumn return an instance of STimeTypeColumn +func NewTimeTypeColumn(name string, typeStr string, tagmap map[string]string, isPointer bool) STimeTypeColumn { + dc := STimeTypeColumn{ + sqlchemy.NewBaseColumn(name, typeStr, tagmap, isPointer), + } + return dc +} + +// SDateTimeColumn represents a DateTime type of column +type SDateTimeColumn struct { + STimeTypeColumn + + // Is this column a 'created_at' field, whichi records the time of create this record + isCreatedAt bool + + // Is this column a 'updated_at' field, whichi records the time when this record was updated + isUpdatedAt bool +} + +func (c *SDateTimeColumn) IsCreatedAt() bool { + return c.isCreatedAt +} + +func (c *SDateTimeColumn) IsUpdatedAt() bool { + return c.isUpdatedAt +} + +func (c *SDateTimeColumn) IsDateTime() bool { + return true +} + +// NewDateTimeColumn returns an instance of DateTime column +func NewDateTimeColumn(name string, tagmap map[string]string, isPointer bool) SDateTimeColumn { + createdAt := false + updatedAt := false + tagmap, v, ok := utils.TagPop(tagmap, sqlchemy.TAG_CREATE_TIMESTAMP) + if ok { + createdAt = utils.ToBool(v) + } + tagmap, v, ok = utils.TagPop(tagmap, sqlchemy.TAG_UPDATE_TIMESTAMP) + if ok { + updatedAt = utils.ToBool(v) + } + dtc := SDateTimeColumn{ + NewTimeTypeColumn(name, "DATETIME", tagmap, isPointer), + createdAt, updatedAt, + } + return dtc +} + +// CompoundColumn represents a column of compound tye, e.g. a JSON, an Array, or a struct +type CompoundColumn struct { + STextColumn +} + +// DefinitionString implementation of CompoundColumn for IColumnSpec +func (c *CompoundColumn) DefinitionString() string { + buf := columnDefinitionBuffer(c) + return buf.String() +} + +// IsZero implementation of CompoundColumn for IColumnSpec +func (c *CompoundColumn) IsZero(val interface{}) bool { + if val == nil { + return true + } + if c.IsPointer() && reflect.ValueOf(val).IsNil() { + return true + } + return false +} + +// ConvertFromString implementation of CompoundColumn for IColumnSpec +func (c *CompoundColumn) ConvertFromString(str string) interface{} { + json, err := jsonutils.ParseString(str) + if err != nil { + log.Errorf("ParseString fail %s", err) + json = jsonutils.JSONNull + } + return json.String() +} + +// ConvertFromValue implementation of CompoundColumn for IColumnSpec +func (c *CompoundColumn) ConvertFromValue(val interface{}) interface{} { + return jsonutils.Marshal(val).String() +} + +// NewCompoundColumn returns an instance of CompoundColumn +func NewCompoundColumn(name string, sqlType string, tagmap map[string]string, isPointer bool) CompoundColumn { + dtc := CompoundColumn{NewTextColumn(name, sqlType, tagmap, isPointer)} + return dtc +} diff --git a/vendor/yunion.io/x/sqlchemy/backends/mysql/columninfo.go b/vendor/yunion.io/x/sqlchemy/backends/mysql/columninfo.go index 7410bffd07..49e199e38e 100644 --- a/vendor/yunion.io/x/sqlchemy/backends/mysql/columninfo.go +++ b/vendor/yunion.io/x/sqlchemy/backends/mysql/columninfo.go @@ -1,3 +1,17 @@ +// Copyright 2019 Yunion +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package mysql import ( @@ -9,6 +23,7 @@ import ( "yunion.io/x/log" "yunion.io/x/pkg/utils" + "yunion.io/x/sqlchemy" ) @@ -71,11 +86,11 @@ func (info *sSqlColumnInfo) toColumnSpec() sqlchemy.IColumnSpec { tagmap[sqlchemy.TAG_DEFAULT] = info.Default } if strings.HasSuffix(typeStr, "CHAR") { - c := sqlchemy.NewTextColumn(info.Field, tagmap, false) + c := NewTextColumn(info.Field, typeStr, tagmap, false) return &c } else if strings.HasSuffix(typeStr, "TEXT") { tagmap[sqlchemy.TAG_TEXT_LENGTH] = typeStr[:len(typeStr)-4] - c := sqlchemy.NewTextColumn(info.Field, tagmap, false) + c := NewTextColumn(info.Field, typeStr, tagmap, false) return &c } else if strings.HasSuffix(typeStr, "INT") { if info.Extra == "auto_increment" { @@ -92,10 +107,10 @@ func (info *sSqlColumnInfo) toColumnSpec() sqlchemy.IColumnSpec { tagmap[sqlchemy.TAG_WIDTH] = intWidthString(typeStr) } } - c := sqlchemy.NewIntegerColumn(info.Field, typeStr, unsigned, tagmap, false) + c := NewIntegerColumn(info.Field, typeStr, unsigned, tagmap, false) return &c } else if typeStr == "FLOAT" || typeStr == "DOUBLE" { - c := sqlchemy.NewFloatColumn(info.Field, typeStr, tagmap, false) + c := NewFloatColumn(info.Field, typeStr, tagmap, false) return &c } else if typeStr == "DECIMAL" { if len(matches) > 3 { @@ -104,13 +119,13 @@ func (info *sSqlColumnInfo) toColumnSpec() sqlchemy.IColumnSpec { tagmap[sqlchemy.TAG_PRECISION] = fmt.Sprintf("%d", precision) } } - c := sqlchemy.NewDecimalColumn(info.Field, tagmap, false) + c := NewDecimalColumn(info.Field, tagmap, false) return &c } else if typeStr == "DATETIME" { - c := sqlchemy.NewDateTimeColumn(info.Field, tagmap, false) + c := NewDateTimeColumn(info.Field, tagmap, false) return &c } else if typeStr == "DATE" || typeStr == "TIMESTAMP" { - c := sqlchemy.NewTimeTypeColumn(info.Field, typeStr, tagmap, false) + c := NewTimeTypeColumn(info.Field, typeStr, tagmap, false) return &c } else if strings.HasPrefix(typeStr, "ENUM(") { // enum type, force convert to text @@ -124,18 +139,10 @@ func (info *sSqlColumnInfo) toColumnSpec() sqlchemy.IColumnSpec { } } tagmap[sqlchemy.TAG_WIDTH] = fmt.Sprintf("%d", 1< 0 { - autoInc = fmt.Sprintf(" AUTO_INCREMENT=%d", intC.AutoIncrementOffset) + if intC, ok := c.(*SIntegerColumn); ok && intC.autoIncrementOffset > 0 { + autoInc = fmt.Sprintf(" AUTO_INCREMENT=%d", intC.autoIncrementOffset) } } if c.IsIndex() { @@ -44,7 +83,9 @@ func (mysql *SMySQLBackend) GetCreateSQL(ts sqlchemy.ITableSpec) string { if len(indexes) > 0 { cols = append(cols, indexes...) } - return fmt.Sprintf("CREATE TABLE IF NOT EXISTS `%s` (\n%s\n) ENGINE=InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci%s", ts.Name(), strings.Join(cols, ",\n"), autoInc) + return []string{ + fmt.Sprintf("CREATE TABLE IF NOT EXISTS `%s` (\n%s\n) ENGINE=InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci%s", ts.Name(), strings.Join(cols, ",\n"), autoInc), + } } func (msyql *SMySQLBackend) IsSupportIndexAndContraints() bool { @@ -65,3 +106,112 @@ func (mysql *SMySQLBackend) FetchTableColumnSpecs(ts sqlchemy.ITableSpec) ([]sql } return specs, nil } + +func (mysql *SMySQLBackend) FetchIndexesAndConstraints(ts sqlchemy.ITableSpec) ([]sqlchemy.STableIndex, []sqlchemy.STableConstraint, error) { + sql := fmt.Sprintf("SHOW CREATE TABLE `%s`", ts.Name()) + query := ts.Database().NewRawQuery(sql, "table", "create table") + row := query.Row() + var name, defStr string + err := row.Scan(&name, &defStr) + if err != nil { + if isMysqlError(err, mysqlErrorTableNotExist) { + err = sqlchemy.ErrTableNotExists + } + return nil, nil, err + } + indexes := parseIndexes(defStr) + constraints := parseConstraints(defStr) + return indexes, constraints, nil +} + +func getTextSqlType(tagmap map[string]string) string { + var width int + var sqltype string + widthStr, _ := tagmap[sqlchemy.TAG_WIDTH] + if len(widthStr) > 0 && regutils.MatchInteger(widthStr) { + width, _ = strconv.Atoi(widthStr) + } + txtLen, _ := tagmap[sqlchemy.TAG_TEXT_LENGTH] + if width == 0 { + switch strings.ToLower(txtLen) { + case "medium": + sqltype = "MEDIUMTEXT" + case "long": + sqltype = "LONGTEXT" + default: + sqltype = "TEXT" + } + } else { + sqltype = "VARCHAR" + } + return sqltype +} + +func (mysql *SMySQLBackend) GetColumnSpecByFieldType(table *sqlchemy.STableSpec, fieldType reflect.Type, fieldname string, tagmap map[string]string, isPointer bool) sqlchemy.IColumnSpec { + switch fieldType { + case tristate.TriStateType: + tagmap[sqlchemy.TAG_WIDTH] = "1" + col := NewTristateColumn(fieldname, tagmap, isPointer) + return &col + case gotypes.TimeType: + col := NewDateTimeColumn(fieldname, tagmap, isPointer) + return &col + } + switch fieldType.Kind() { + case reflect.String: + col := NewTextColumn(fieldname, getTextSqlType(tagmap), tagmap, isPointer) + return &col + case reflect.Int, reflect.Int32: + tagmap[sqlchemy.TAG_WIDTH] = intWidthString("INT") + col := NewIntegerColumn(fieldname, "INT", false, tagmap, isPointer) + return &col + case reflect.Int8: + tagmap[sqlchemy.TAG_WIDTH] = intWidthString("TINYINT") + col := NewIntegerColumn(fieldname, "TINYINT", false, tagmap, isPointer) + return &col + case reflect.Int16: + tagmap[sqlchemy.TAG_WIDTH] = intWidthString("SMALLINT") + col := NewIntegerColumn(fieldname, "SMALLINT", false, tagmap, isPointer) + return &col + case reflect.Int64: + tagmap[sqlchemy.TAG_WIDTH] = intWidthString("BIGINT") + col := NewIntegerColumn(fieldname, "BIGINT", false, tagmap, isPointer) + return &col + case reflect.Uint, reflect.Uint32: + tagmap[sqlchemy.TAG_WIDTH] = uintWidthString("INT") + col := NewIntegerColumn(fieldname, "INT", true, tagmap, isPointer) + return &col + case reflect.Uint8: + tagmap[sqlchemy.TAG_WIDTH] = uintWidthString("TINYINT") + col := NewIntegerColumn(fieldname, "TINYINT", true, tagmap, isPointer) + return &col + case reflect.Uint16: + tagmap[sqlchemy.TAG_WIDTH] = uintWidthString("SMALLINT") + col := NewIntegerColumn(fieldname, "SMALLINT", true, tagmap, isPointer) + return &col + case reflect.Uint64: + tagmap[sqlchemy.TAG_WIDTH] = uintWidthString("BIGINT") + col := NewIntegerColumn(fieldname, "BIGINT", true, tagmap, isPointer) + return &col + case reflect.Bool: + tagmap[sqlchemy.TAG_WIDTH] = "1" + col := NewBooleanColumn(fieldname, tagmap, isPointer) + return &col + case reflect.Float32, reflect.Float64: + if _, ok := tagmap[sqlchemy.TAG_WIDTH]; ok { + col := NewDecimalColumn(fieldname, tagmap, isPointer) + return &col + } + colType := "FLOAT" + if fieldType == gotypes.Float64Type { + colType = "DOUBLE" + } + col := NewFloatColumn(fieldname, colType, tagmap, isPointer) + return &col + } + if fieldType.Implements(gotypes.ISerializableType) { + col := NewCompoundColumn(fieldname, getTextSqlType(tagmap), tagmap, isPointer) + return &col + } + return nil +} diff --git a/vendor/yunion.io/x/sqlchemy/backends/mysql/parse.go b/vendor/yunion.io/x/sqlchemy/backends/mysql/parse.go new file mode 100644 index 0000000000..7be358cbdb --- /dev/null +++ b/vendor/yunion.io/x/sqlchemy/backends/mysql/parse.go @@ -0,0 +1,62 @@ +// Copyright 2019 Yunion +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package mysql + +import ( + "regexp" + + "yunion.io/x/sqlchemy" +) + +const ( + indexPattern = `(?PUNIQUE\s+)?KEY ` + "`" + `(?P\w+)` + "`" + ` \((?P` + "`" + `\w+` + "`" + `(\(\d+\))?(,\s*` + "`" + `\w+` + "`" + `(\(\d+\))?)*)\)` + constraintPattern = `CONSTRAINT ` + "`" + `(?P\w+)` + "`" + ` FOREIGN KEY \((?P` + "`" + `\w+` + "`" + `(,\s*` + "`" + `\w+` + "`" + `)*)\) REFERENCES ` + "`" + `(?P\w+)` + "`" + ` \((?P` + "`" + `\w+` + "`" + `(,\s*` + "`" + `\w+` + "`" + `)*)\)` +) + +var ( + indexRegexp = regexp.MustCompile(indexPattern) + constraintRegexp = regexp.MustCompile(constraintPattern) +) + +func fetchColumns(match string) []string { + return sqlchemy.FetchColumns(match) +} + +func parseConstraints(defStr string) []sqlchemy.STableConstraint { + matches := constraintRegexp.FindAllStringSubmatch(defStr, -1) + tcs := make([]sqlchemy.STableConstraint, len(matches)) + for i := range matches { + tcs[i] = sqlchemy.NewTableConstraint( + matches[i][1], + fetchColumns(matches[i][2]), + matches[i][4], + fetchColumns(matches[i][5]), + ) + } + return tcs +} + +func parseIndexes(defStr string) []sqlchemy.STableIndex { + matches := indexRegexp.FindAllStringSubmatch(defStr, -1) + tcs := make([]sqlchemy.STableIndex, len(matches)) + for i := range matches { + tcs[i] = sqlchemy.NewTableIndex( + matches[i][2], + fetchColumns(matches[i][3]), + len(matches[i][1]) > 0, + ) + } + return tcs +} diff --git a/vendor/yunion.io/x/sqlchemy/backends/sqlite/column.go b/vendor/yunion.io/x/sqlchemy/backends/sqlite/column.go new file mode 100644 index 0000000000..d62a2aaa71 --- /dev/null +++ b/vendor/yunion.io/x/sqlchemy/backends/sqlite/column.go @@ -0,0 +1,506 @@ +// Copyright 2019 Yunion +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package sqlite + +import ( + "bytes" + "database/sql" + "fmt" + "reflect" + "strconv" + "strings" + "time" + + "yunion.io/x/log" + + "yunion.io/x/jsonutils" + + "yunion.io/x/pkg/gotypes" + "yunion.io/x/pkg/tristate" + "yunion.io/x/pkg/util/timeutils" + "yunion.io/x/pkg/utils" + + "yunion.io/x/sqlchemy" +) + +func columnDefinitionBuffer(c sqlchemy.IColumnSpec) bytes.Buffer { + var buf bytes.Buffer + buf.WriteByte('`') + buf.WriteString(c.Name()) + buf.WriteByte('`') + buf.WriteByte(' ') + + if c.IsAutoIncrement() { + // https://www.sqlite.org/autoinc.html + buf.WriteString("INTEGER PRIMARY KEY") + } else { + buf.WriteString(c.ColType()) + } + + if !c.IsNullable() { + buf.WriteString(" NOT NULL") + } + + def := c.Default() + defOk := c.IsSupportDefault() + if def != "" { + if !defOk { + panic(fmt.Errorf("column %q type %q does not support having default value: %q", + c.Name(), c.ColType(), def, + )) + } + def = sqlchemy.GetStringValue(c.ConvertFromString(def)) + buf.WriteString(" DEFAULT ") + if c.IsText() { + buf.WriteByte('\'') + } + buf.WriteString(def) + if c.IsText() { + buf.WriteByte('\'') + } + } + + if c.IsText() { + buf.WriteString(" COLLATE NOCASE") + } + + return buf +} + +// SBooleanColumn represents a boolean type column, which is a int(1) for mysql, with value of true or false +type SBooleanColumn struct { + sqlchemy.SBaseColumn +} + +// DefinitionString implementation of SBooleanColumn for IColumnSpec +func (c *SBooleanColumn) DefinitionString() string { + buf := columnDefinitionBuffer(c) + return buf.String() +} + +// ConvertFromString implementation of SBooleanColumn for IColumnSpec +func (c *SBooleanColumn) ConvertFromString(str string) interface{} { + switch strings.ToLower(str) { + case "true", "yes", "on", "ok", "1": + return 1 + default: + return 0 + } +} + +// ConvertFromValue implementation of STristateColumn for IColumnSpec +func (c *SBooleanColumn) ConvertFromValue(val interface{}) interface{} { + bVal := val.(bool) + if bVal { + return 1 + } + return 0 +} + +// IsZero implementation of SBooleanColumn for IColumnSpec +func (c *SBooleanColumn) IsZero(val interface{}) bool { + if c.IsPointer() { + bVal := val.(*bool) + return bVal == nil + } + bVal := val.(bool) + return bVal == false +} + +// NewBooleanColumn return an instance of SBooleanColumn +func NewBooleanColumn(name string, tagmap map[string]string, isPointer bool) SBooleanColumn { + bc := SBooleanColumn{SBaseColumn: sqlchemy.NewBaseColumn(name, "INTEGER", tagmap, isPointer)} + if !bc.IsPointer() && len(bc.Default()) > 0 && bc.ConvertFromString(bc.Default()) == "1" { + msg := fmt.Sprintf("Non-pointer boolean column should not default true: %s(%s)", name, tagmap) + panic(msg) + } + return bc +} + +// STristateColumn represents a tristate type column, with value of true, false or none +type STristateColumn struct { + sqlchemy.SBaseColumn +} + +// DefinitionString implementation of STristateColumn for IColumnSpec +func (c *STristateColumn) DefinitionString() string { + buf := columnDefinitionBuffer(c) + return buf.String() +} + +// ConvertFromString implementation of STristateColumn for IColumnSpec +func (c *STristateColumn) ConvertFromString(str string) interface{} { + switch strings.ToLower(str) { + case "true", "yes", "on", "ok", "1": + return 1 + case "none", "null", "unknown": + return sql.NullInt32{} + default: + return 0 + } +} + +// ConvertFromValue implementation of STristateColumn for IColumnSpec +func (c *STristateColumn) ConvertFromValue(val interface{}) interface{} { + bVal := val.(tristate.TriState) + if bVal == tristate.True { + return 1 + } else if bVal == tristate.None { + return sql.NullInt32{} + } else { + return 0 + } +} + +// IsZero implementation of STristateColumn for IColumnSpec +func (c *STristateColumn) IsZero(val interface{}) bool { + if c.IsPointer() { + bVal := val.(*tristate.TriState) + return bVal == nil + } + bVal := val.(tristate.TriState) + return bVal == tristate.None +} + +// NewTristateColumn return an instance of STristateColumn +func NewTristateColumn(name string, tagmap map[string]string, isPointer bool) STristateColumn { + if _, ok := tagmap[sqlchemy.TAG_NULLABLE]; ok { + // tristate always nullable + delete(tagmap, sqlchemy.TAG_NULLABLE) + } + bc := STristateColumn{SBaseColumn: sqlchemy.NewBaseColumn(name, "INTEGER", tagmap, isPointer)} + return bc +} + +// SIntegerColumn represents an integer type of column, with value of integer +type SIntegerColumn struct { + sqlchemy.SBaseColumn + + // Is this column an autoincrement colmn + isAutoIncrement bool + + // Is this column is a version column for this records + isAutoVersion bool + + // If this column is an autoincrement column, AutoIncrementOffset records the initial offset + autoIncrementOffset int64 +} + +// IsNumeric implementation of SIntegerColumn for IColumnSpec +func (c *SIntegerColumn) IsNumeric() bool { + return true +} + +// DefinitionString implementation of SIntegerColumn for IColumnSpec +func (c *SIntegerColumn) DefinitionString() string { + buf := columnDefinitionBuffer(c) + return buf.String() +} + +// IsZero implementation of SIntegerColumn for IColumnSpec +func (c *SIntegerColumn) IsZero(val interface{}) bool { + if val == nil || (c.IsPointer() && reflect.ValueOf(val).IsNil()) { + return true + } + switch intVal := val.(type) { + case int8, int16, int32, int64, int, uint, uint8, uint16, uint32, uint64: + return intVal == 0 + } + return true +} + +// ConvertFromString implementation of SBooleanColumn for IColumnSpec +func (c *SIntegerColumn) ConvertFromString(str string) interface{} { + val, _ := strconv.ParseInt(str, 10, 64) + return val +} + +func (c *SIntegerColumn) IsAutoVersion() bool { + return c.isAutoVersion +} + +func (c *SIntegerColumn) IsAutoIncrement() bool { + return c.isAutoIncrement +} + +func (c *SIntegerColumn) SetAutoIncrement(on bool) { + c.isAutoIncrement = on +} + +func (c *SIntegerColumn) SetAutoIncrementOffset(offset int64) { + c.autoIncrementOffset = offset +} + +// NewIntegerColumn return an instance of SIntegerColumn +func NewIntegerColumn(name string, tagmap map[string]string, isPointer bool) SIntegerColumn { + autoinc := false + autoincBase := int64(0) + tagmap, v, ok := utils.TagPop(tagmap, sqlchemy.TAG_AUTOINCREMENT) + if ok { + base, err := strconv.ParseInt(v, 10, 64) + if err == nil && base > 0 { + autoinc = true + autoincBase = base + } else { + autoinc = utils.ToBool(v) + } + } + autover := false + tagmap, v, ok = utils.TagPop(tagmap, sqlchemy.TAG_AUTOVERSION) + if ok { + autover = utils.ToBool(v) + } + c := SIntegerColumn{ + SBaseColumn: sqlchemy.NewBaseColumn(name, "INTEGER", tagmap, isPointer), + isAutoIncrement: autoinc, + autoIncrementOffset: autoincBase, + isAutoVersion: autover, + } + if autoinc { + c.SetPrimary(true) // autoincrement column must be primary key + c.SetNullable(false) + c.isAutoVersion = false + } else if autover { + c.SetPrimary(false) + c.SetNullable(false) + if len(c.Default()) == 0 { + c.SetDefault("0") + } + } + return c +} + +// SFloatColumn represents a float type column, e.g. float32 or float64 +type SFloatColumn struct { + sqlchemy.SBaseColumn +} + +// IsNumeric implementation of SFloatColumn for IColumnSpec +func (c *SFloatColumn) IsNumeric() bool { + return true +} + +// DefinitionString implementation of SFloatColumn for IColumnSpec +func (c *SFloatColumn) DefinitionString() string { + buf := columnDefinitionBuffer(c) + return buf.String() +} + +// IsZero implementation of SFloatColumn for IColumnSpec +func (c *SFloatColumn) IsZero(val interface{}) bool { + if c.IsPointer() { + switch val.(type) { + case *float32: + return val.(*float32) == nil + case *float64: + return val.(*float64) == nil + } + } else { + switch val.(type) { + case float32: + return val.(float32) == 0.0 + case float64: + return val.(float64) == 0.0 + } + } + return true +} + +// ConvertFromString implementation of SBooleanColumn for IColumnSpec +func (c *SFloatColumn) ConvertFromString(str string) interface{} { + val, _ := strconv.ParseFloat(str, 64) + return val +} + +// NewFloatColumn returns an instance of SFloatColumn +func NewFloatColumn(name string, tagmap map[string]string, isPointer bool) SFloatColumn { + return SFloatColumn{SBaseColumn: sqlchemy.NewBaseColumn(name, "REAL", tagmap, isPointer)} +} + +// STextColumn represents a text type of column +type STextColumn struct { + sqlchemy.SBaseColumn +} + +// IsText implementation of STextColumn for IColumnSpec +func (c *STextColumn) IsText() bool { + return true +} + +// IsSearchable implementation of STextColumn for IColumnSpec +func (c *STextColumn) IsSearchable() bool { + return true +} + +// IsAscii implementation of STextColumn for IColumnSpec +func (c *STextColumn) IsAscii() bool { + return false +} + +// DefinitionString implementation of STextColumn for IColumnSpec +func (c *STextColumn) DefinitionString() string { + buf := columnDefinitionBuffer(c) + return buf.String() +} + +// IsZero implementation of STextColumn for IColumnSpec +func (c *STextColumn) IsZero(val interface{}) bool { + if c.IsPointer() { + return gotypes.IsNil(val) + } + return reflect.ValueOf(val).Len() == 0 +} + +// ConvertFromString implementation of SBooleanColumn for IColumnSpec +func (c *STextColumn) ConvertFromString(str string) interface{} { + return str +} + +func (c *STextColumn) IsString() bool { + return true +} + +// NewTextColumn return an instance of STextColumn +func NewTextColumn(name string, tagmap map[string]string, isPointer bool) STextColumn { + return STextColumn{ + SBaseColumn: sqlchemy.NewBaseColumn(name, "TEXT", tagmap, isPointer), + } +} + +// STimeTypeColumn represents a Detetime type of column, e.g. DateTime +type STimeTypeColumn struct { + sqlchemy.SBaseColumn +} + +// IsText implementation of STimeTypeColumn for IColumnSpec +func (c *STimeTypeColumn) IsText() bool { + return true +} + +// DefinitionString implementation of STimeTypeColumn for IColumnSpec +func (c *STimeTypeColumn) DefinitionString() string { + buf := columnDefinitionBuffer(c) + return buf.String() +} + +// IsZero implementation of STimeTypeColumn for IColumnSpec +func (c *STimeTypeColumn) IsZero(val interface{}) bool { + if c.IsPointer() { + bVal := val.(*time.Time) + return bVal == nil + } + bVal := val.(time.Time) + return bVal.IsZero() +} + +// ConvertFromString implementation of SBooleanColumn for IColumnSpec +func (c *STimeTypeColumn) ConvertFromString(str string) interface{} { + tm, _ := timeutils.ParseTimeStr(str) + return tm +} + +// NewTimeTypeColumn return an instance of STimeTypeColumn +func NewTimeTypeColumn(name string, tagmap map[string]string, isPointer bool) STimeTypeColumn { + dc := STimeTypeColumn{ + SBaseColumn: sqlchemy.NewBaseColumn(name, "TEXT", tagmap, isPointer), + } + return dc +} + +// SDateTimeColumn represents a DateTime type of column +type SDateTimeColumn struct { + STimeTypeColumn + + // Is this column a 'created_at' field, whichi records the time of create this record + isCreatedAt bool + + // Is this column a 'updated_at' field, whichi records the time when this record was updated + isUpdatedAt bool +} + +func (c *SDateTimeColumn) IsCreatedAt() bool { + return c.isCreatedAt +} + +func (c *SDateTimeColumn) IsUpdatedAt() bool { + return c.isUpdatedAt +} + +func (c *SDateTimeColumn) IsDateTime() bool { + return true +} + +// NewDateTimeColumn returns an instance of DateTime column +func NewDateTimeColumn(name string, tagmap map[string]string, isPointer bool) SDateTimeColumn { + createdAt := false + updatedAt := false + tagmap, v, ok := utils.TagPop(tagmap, sqlchemy.TAG_CREATE_TIMESTAMP) + if ok { + createdAt = utils.ToBool(v) + } + tagmap, v, ok = utils.TagPop(tagmap, sqlchemy.TAG_UPDATE_TIMESTAMP) + if ok { + updatedAt = utils.ToBool(v) + } + dtc := SDateTimeColumn{ + STimeTypeColumn: NewTimeTypeColumn(name, tagmap, isPointer), + isCreatedAt: createdAt, + isUpdatedAt: updatedAt, + } + return dtc +} + +// CompoundColumn represents a column of compound tye, e.g. a JSON, an Array, or a struct +type CompoundColumn struct { + STextColumn +} + +// DefinitionString implementation of CompoundColumn for IColumnSpec +func (c *CompoundColumn) DefinitionString() string { + buf := columnDefinitionBuffer(c) + return buf.String() +} + +// IsZero implementation of CompoundColumn for IColumnSpec +func (c *CompoundColumn) IsZero(val interface{}) bool { + if val == nil { + return true + } + if c.IsPointer() && reflect.ValueOf(val).IsNil() { + return true + } + return false +} + +// ConvertFromString implementation of CompoundColumn for IColumnSpec +func (c *CompoundColumn) ConvertFromString(str string) interface{} { + json, err := jsonutils.ParseString(str) + if err != nil { + log.Errorf("ParseString fail %s", err) + json = jsonutils.JSONNull + } + return json.String() +} + +// ConvertFromValue implementation of CompoundColumn for IColumnSpec +func (c *CompoundColumn) ConvertFromValue(val interface{}) interface{} { + return jsonutils.Marshal(val).String() +} + +// NewCompoundColumn returns an instance of CompoundColumn +func NewCompoundColumn(name string, tagmap map[string]string, isPointer bool) CompoundColumn { + dtc := CompoundColumn{NewTextColumn(name, tagmap, isPointer)} + return dtc +} diff --git a/vendor/yunion.io/x/sqlchemy/backends/sqlite/columninfo.go b/vendor/yunion.io/x/sqlchemy/backends/sqlite/columninfo.go new file mode 100644 index 0000000000..5bce7cb28e --- /dev/null +++ b/vendor/yunion.io/x/sqlchemy/backends/sqlite/columninfo.go @@ -0,0 +1,71 @@ +// Copyright 2019 Yunion +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package sqlite + +import ( + "yunion.io/x/log" + + "yunion.io/x/sqlchemy" +) + +type sSqlColumnInfo struct { + Cid int `json:"cid"` + Name string `json:"name"` + Type string `json:"type"` + Notnull bool `json:"notnull"` + DfltValue string `json:"dflt_value"` + Pk bool `json:"pk"` +} + +func (info *sSqlColumnInfo) getTagmap() map[string]string { + tagmap := make(map[string]string) + if info.Notnull { + tagmap[sqlchemy.TAG_NULLABLE] = "false" + } else { + tagmap[sqlchemy.TAG_NULLABLE] = "true" + } + if len(info.DfltValue) > 0 { + tagmap[sqlchemy.TAG_DEFAULT] = info.DfltValue + if info.Type == "TEXT" { + tagmap[sqlchemy.TAG_DEFAULT] = info.DfltValue[1 : len(info.DfltValue)-1] + } + } + if info.Pk { + tagmap[sqlchemy.TAG_PRIMARY] = "true" + } + return tagmap +} + +func (info *sSqlColumnInfo) toColumnSpec() sqlchemy.IColumnSpec { + switch info.Type { + case "TEXT", "BLOB": + c := NewTextColumn(info.Name, info.getTagmap(), false) + return &c + case "INTEGER": + c := NewIntegerColumn(info.Name, info.getTagmap(), false) + return &c + case "INTEGER AUTO_INCREMENT": + tagmap := info.getTagmap() + tagmap[sqlchemy.TAG_AUTOINCREMENT] = "true" + c := NewIntegerColumn(info.Name, tagmap, false) + return &c + case "REAL": + c := NewFloatColumn(info.Name, info.getTagmap(), false) + return &c + default: + log.Errorf("unsupported type %s", info.Type) + } + return nil +} diff --git a/vendor/yunion.io/x/sqlchemy/backends/sqlite/doc.go b/vendor/yunion.io/x/sqlchemy/backends/sqlite/doc.go new file mode 100644 index 0000000000..0f1b29d23f --- /dev/null +++ b/vendor/yunion.io/x/sqlchemy/backends/sqlite/doc.go @@ -0,0 +1,15 @@ +// Copyright 2019 Yunion +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package sqlite // import "yunion.io/x/sqlchemy/backends/sqlite" diff --git a/vendor/yunion.io/x/sqlchemy/backends/sqlite/parse.go b/vendor/yunion.io/x/sqlchemy/backends/sqlite/parse.go new file mode 100644 index 0000000000..748cd3664e --- /dev/null +++ b/vendor/yunion.io/x/sqlchemy/backends/sqlite/parse.go @@ -0,0 +1,45 @@ +// Copyright 2019 Yunion +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package sqlite + +import ( + "regexp" + + "yunion.io/x/pkg/errors" + + "yunion.io/x/sqlchemy" +) + +const ( + indexPattern = `\((?P` + "`" + `\w+` + "`" + `(,\s*` + "`" + `\w+` + "`" + `)*)\)` +) + +var ( + indexRegexp = regexp.MustCompile(indexPattern) +) + +type sSqliteTableInfo struct { + Type string + Name string + Sql string +} + +func (ti *sSqliteTableInfo) parseTableIndex() (sqlchemy.STableIndex, error) { + matches := indexRegexp.FindAllStringSubmatch(ti.Sql, -1) + if len(matches) > 0 { + return sqlchemy.NewTableIndex(ti.Name, sqlchemy.FetchColumns(matches[0][1]), false), nil + } + return sqlchemy.STableIndex{}, errors.ErrNotFound +} diff --git a/vendor/yunion.io/x/sqlchemy/backends/sqlite/sqlite.go b/vendor/yunion.io/x/sqlchemy/backends/sqlite/sqlite.go index a639abd990..483f3ffb7a 100644 --- a/vendor/yunion.io/x/sqlchemy/backends/sqlite/sqlite.go +++ b/vendor/yunion.io/x/sqlchemy/backends/sqlite/sqlite.go @@ -1,8 +1,30 @@ +// Copyright 2019 Yunion +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package sqlite import ( + "fmt" + "reflect" + "strings" + _ "github.com/mattn/go-sqlite3" + "yunion.io/x/pkg/errors" + "yunion.io/x/pkg/gotypes" + "yunion.io/x/pkg/tristate" + "yunion.io/x/sqlchemy" ) @@ -18,15 +40,136 @@ func (sqlite *SSqliteBackend) Name() sqlchemy.DBBackendName { return sqlchemy.SQLiteBackend } +// CanUpdate returns wether the backend supports update +func (sqlite *SSqliteBackend) CanUpdate() bool { + return true +} + +// CanInsert returns wether the backend supports Insert +func (sqlite *SSqliteBackend) CanInsert() bool { + return true +} + +// CanInsertOrUpdate returns weather the backend supports InsertOrUpdate +func (sqlite *SSqliteBackend) CanInsertOrUpdate() bool { + return true +} + +func (sqlite *SSqliteBackend) DropIndexSQLTemplate() string { + return "DROP INDEX IF EXISTS `{{ .Table }}`.`{{ .Index }}`" +} + +func (sqlite *SSqliteBackend) InsertOrUpdateSQLTemplate() string { + return "INSERT INTO `{{ .Table }}` ({{ .Columns }}) VALUES ({{ .Values }}) ON CONFLICT({{ .PrimaryKeys }}) DO UPDATE SET {{ .SetValues }}" +} + func (sqlite *SSqliteBackend) GetTableSQL() string { return "SELECT name FROM sqlite_master WHERE type='table'" } func (sqlite *SSqliteBackend) IsSupportIndexAndContraints() bool { - return false + return true +} + +func (sqlite *SSqliteBackend) GetCreateSQLs(ts sqlchemy.ITableSpec) []string { + cols := make([]string, 0) + primaries := make([]string, 0) + indexes := make([]string, 0) + for _, c := range ts.Columns() { + cols = append(cols, c.DefinitionString()) + if c.IsPrimary() && !c.IsAutoIncrement() { + primaries = append(primaries, fmt.Sprintf("`%s`", c.Name())) + } + if c.IsIndex() { + indexes = append(indexes, fmt.Sprintf("CREATE INDEX `ix_%s_%s` ON `%s`(`%s`)", ts.Name(), c.Name(), ts.Name(), c.Name())) + } + } + if len(primaries) > 0 { + cols = append(cols, fmt.Sprintf("PRIMARY KEY (%s)", strings.Join(primaries, ", "))) + } + ret := []string{ + "PRAGMA encoding=\"UTF-8\"", + fmt.Sprintf("CREATE TABLE IF NOT EXISTS `%s` (\n%s\n)", ts.Name(), strings.Join(cols, ",\n")), + } + if len(indexes) > 0 { + ret = append(ret, indexes...) + } + return ret +} + +func (sqlite *SSqliteBackend) FetchIndexesAndConstraints(ts sqlchemy.ITableSpec) ([]sqlchemy.STableIndex, []sqlchemy.STableConstraint, error) { + sql := fmt.Sprintf("SELECT `name`, `sql` FROM `sqlite_master` WHERE `tbl_name`='%s' AND `type`='index' AND `sql`!=''", ts.Name()) + query := ts.Database().NewRawQuery(sql, "name", "sql") + results := make([]sSqliteTableInfo, 0) + err := query.All(&results) + if err != nil { + return nil, nil, errors.Wrapf(err, "Raw Query Scan %s", sql) + } + indexes := make([]sqlchemy.STableIndex, 0) + for i := range results { + ti, err := results[i].parseTableIndex() + if err != nil { + return nil, nil, errors.Wrapf(err, "parseTableIndex fail %s", results[i].Sql) + } + indexes = append(indexes, ti) + } + return indexes, nil, nil } func (sqlite *SSqliteBackend) FetchTableColumnSpecs(ts sqlchemy.ITableSpec) ([]sqlchemy.IColumnSpec, error) { - // XXX: TO DO - return ts.Columns(), nil + sql := fmt.Sprintf("PRAGMA table_info(`%s`);", ts.Name()) + query := ts.Database().NewRawQuery(sql, "cid", "name", "type", "notnull", "dflt_value", "pk") + infos := make([]sSqlColumnInfo, 0) + err := query.All(&infos) + if err != nil { + return nil, err + } + specs := make([]sqlchemy.IColumnSpec, 0) + // find out integer primary key + var primaryCol sqlchemy.IColumnSpec + var primaryCount int + for _, info := range infos { + spec := info.toColumnSpec() + if spec.IsPrimary() { + primaryCol = spec + primaryCount++ + } + specs = append(specs, spec) + } + if primaryCount == 1 { + if intc, ok := primaryCol.(*SIntegerColumn); ok { + intc.isAutoIncrement = true + } + } + return specs, nil +} + +func (sqlite *SSqliteBackend) GetColumnSpecByFieldType(table *sqlchemy.STableSpec, fieldType reflect.Type, fieldname string, tagmap map[string]string, isPointer bool) sqlchemy.IColumnSpec { + switch fieldType { + case tristate.TriStateType: + col := NewTristateColumn(fieldname, tagmap, isPointer) + return &col + case gotypes.TimeType: + col := NewDateTimeColumn(fieldname, tagmap, isPointer) + return &col + } + switch fieldType.Kind() { + case reflect.String: + col := NewTextColumn(fieldname, tagmap, isPointer) + return &col + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: + col := NewIntegerColumn(fieldname, tagmap, isPointer) + return &col + case reflect.Bool: + col := NewBooleanColumn(fieldname, tagmap, isPointer) + return &col + case reflect.Float32, reflect.Float64: + col := NewFloatColumn(fieldname, tagmap, isPointer) + return &col + } + if fieldType.Implements(gotypes.ISerializableType) { + col := NewCompoundColumn(fieldname, tagmap, isPointer) + return &col + } + return nil } diff --git a/vendor/yunion.io/x/sqlchemy/backends_base.go b/vendor/yunion.io/x/sqlchemy/backends_base.go index ef8ec270ac..86ecf564bb 100644 --- a/vendor/yunion.io/x/sqlchemy/backends_base.go +++ b/vendor/yunion.io/x/sqlchemy/backends_base.go @@ -32,3 +32,11 @@ func (bb *SBaseBackend) DropIndexSQLTemplate() string { func (bb *SBaseBackend) CanSupportRowAffected() bool { return true } + +func (bb *SBaseBackend) InsertSQLTemplate() string { + return "INSERT INTO `{{ .Table }}` ({{ .Columns }}) VALUES ({{ .Values }})" +} + +func (bb *SBaseBackend) InsertOrUpdateSQLTemplate() string { + return "" +} diff --git a/vendor/yunion.io/x/sqlchemy/backends_mock.go b/vendor/yunion.io/x/sqlchemy/backends_mock.go new file mode 100644 index 0000000000..fb83d6c3d5 --- /dev/null +++ b/vendor/yunion.io/x/sqlchemy/backends_mock.go @@ -0,0 +1,150 @@ +package sqlchemy + +import ( + "database/sql" + "fmt" + "reflect" + + "yunion.io/x/pkg/utils" +) + +const ( + mockBackendName = DBBackendName("mock") +) + +type sMockColumn struct { + SBaseColumn + isCreatedAt bool + isUpdatedAt bool + isAutoVersion bool +} + +func (c *sMockColumn) DefinitionString() string { + return fmt.Sprintf("%s %s", c.name, c.sqlType) +} + +func (c *sMockColumn) ConvertFromString(str string) interface{} { + return str +} + +func (c *sMockColumn) ConvertFromValue(v interface{}) interface{} { + return v +} + +func (c *sMockColumn) IsAutoVersion() bool { + return c.isAutoVersion +} + +func (c *sMockColumn) IsUpdatedAt() bool { + return c.isUpdatedAt +} + +func (c *sMockColumn) IsCreatedAt() bool { + return c.isCreatedAt +} + +func (c *sMockColumn) IsNumeric() bool { + switch c.sqlType { + case "int", "uint", "int8", "int16", "int32", "int64", "uin8", "uint16", "uint32", "uint64", "float32", "float64": + return true + } + return false +} + +func (c *sMockColumn) IsZero(val interface{}) bool { + return reflect.ValueOf(val).IsZero() +} + +func newMockColumn(name string, sqlType string, tagMap map[string]string, isPointer bool) sMockColumn { + var ( + isCreatedAt = false + isUpdatedAt = false + isAutoVersion = false + val string + ok bool + ) + tagMap, val, ok = utils.TagPop(tagMap, TAG_CREATE_TIMESTAMP) + if ok { + isCreatedAt = utils.ToBool(val) + } + tagMap, val, ok = utils.TagPop(tagMap, TAG_UPDATE_TIMESTAMP) + if ok { + isUpdatedAt = utils.ToBool(val) + } + tagMap, val, ok = utils.TagPop(tagMap, TAG_AUTOVERSION) + if ok { + isAutoVersion = utils.ToBool(val) + } + return sMockColumn{ + SBaseColumn: NewBaseColumn(name, sqlType, tagMap, isPointer), + isCreatedAt: isCreatedAt, + isUpdatedAt: isUpdatedAt, + isAutoVersion: isAutoVersion, + } +} + +type sMockBackend struct { + SBaseBackend +} + +func SetupMockDatabaseBackend() { + RegisterBackend(&sMockBackend{}) + + SetDBWithNameBackend(&sql.DB{}, DefaultDB, mockBackendName) +} + +func (mock *sMockBackend) Name() DBBackendName { + return mockBackendName +} + +// CanUpdate returns wether the backend supports update +func (mock *sMockBackend) CanUpdate() bool { + return true +} + +// CanInsert returns wether the backend supports Insert +func (mock *sMockBackend) CanInsert() bool { + return true +} + +// CanInsertOrUpdate returns weather the backend supports InsertOrUpdate +func (mock *sMockBackend) CanInsertOrUpdate() bool { + return true +} + +func (mock *sMockBackend) DropIndexSQLTemplate() string { + return "" +} + +func (mock *sMockBackend) InsertOrUpdateSQLTemplate() string { + return "" +} + +func (mock *sMockBackend) GetTableSQL() string { + return "" +} + +func (mock *sMockBackend) IsSupportIndexAndContraints() bool { + return true +} + +func (mock *sMockBackend) GetCreateSQLs(ts ITableSpec) []string { + return nil +} + +func (mock *sMockBackend) FetchIndexesAndConstraints(ts ITableSpec) ([]STableIndex, []STableConstraint, error) { + return nil, nil, nil +} + +func (mock *sMockBackend) FetchTableColumnSpecs(ts ITableSpec) ([]IColumnSpec, error) { + return nil, nil +} + +func (mock *sMockBackend) GetColumnSpecByFieldType(table *STableSpec, fieldType reflect.Type, fieldname string, tagmap map[string]string, isPointer bool) IColumnSpec { + col := newMockColumn(fieldname, fieldType.String(), tagmap, isPointer) + return &col +} + +func (mock *sMockBackend) CurrentUTCTimeStampString() string { + return "" +} diff --git a/vendor/yunion.io/x/sqlchemy/case.go b/vendor/yunion.io/x/sqlchemy/case.go index a40cd05d9e..063d0adc8c 100644 --- a/vendor/yunion.io/x/sqlchemy/case.go +++ b/vendor/yunion.io/x/sqlchemy/case.go @@ -68,7 +68,7 @@ func (cf *SCaseFunction) expression() string { buf.WriteString(cf.branches[i].thenField.Reference()) } buf.WriteString(" ELSE ") - buf.WriteString(cf.elseField.Reference()) + buf.WriteString(cf.elseField.Expression()) buf.WriteString(" END") return buf.String() } diff --git a/vendor/yunion.io/x/sqlchemy/column.go b/vendor/yunion.io/x/sqlchemy/column.go index c5582fe81c..d8256d5668 100644 --- a/vendor/yunion.io/x/sqlchemy/column.go +++ b/vendor/yunion.io/x/sqlchemy/column.go @@ -65,7 +65,7 @@ type IColumnSpec interface { IsSearchable() bool // IsAscii returns whether this column is an ASCII type text, if true, the column should be compared with a UTF8 string - // IsAscii() bool + IsAscii() bool // IsNumeric returns whether this column is a numeric type column, e.g. integer or float IsNumeric() bool @@ -109,11 +109,15 @@ type IColumnSpec interface { // IsAutoIncrement IsAutoIncrement() bool + AutoIncrementOffset() int64 + SetAutoIncrement(val bool) SetAutoIncrementOffset(offset int64) IsString() bool + + IsDateTime() bool } // SBaseColumn is the base structure represents a column @@ -254,6 +258,10 @@ func (c *SBaseColumn) IsAutoIncrement() bool { return false } +func (c *SBaseColumn) AutoIncrementOffset() int64 { + return 0 +} + func (c *SBaseColumn) SetAutoIncrement(val bool) { } @@ -264,6 +272,10 @@ func (c *SBaseColumn) IsString() bool { return false } +func (c *SBaseColumn) IsDateTime() bool { + return false +} + // NewBaseColumn returns an instance of SBaseColumn func NewBaseColumn(name string, sqltype string, tagmap map[string]string, isPointer bool) SBaseColumn { var val string diff --git a/vendor/yunion.io/x/sqlchemy/column_test.go b/vendor/yunion.io/x/sqlchemy/column_test.go deleted file mode 100644 index f949d465cf..0000000000 --- a/vendor/yunion.io/x/sqlchemy/column_test.go +++ /dev/null @@ -1,8 +0,0 @@ -package sqlchemy - -import ( - "testing" -) - -func TestBadColumns(t *testing.T) { -} diff --git a/vendor/yunion.io/x/sqlchemy/conditions_test.go b/vendor/yunion.io/x/sqlchemy/conditions_test.go deleted file mode 100644 index 86cf82ad22..0000000000 --- a/vendor/yunion.io/x/sqlchemy/conditions_test.go +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright 2019 Yunion -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package sqlchemy - -import ( - "testing" -) - -func TestConditions(t *testing.T) { - field := &SRawQueryField{"name"} - cond1 := Equals(field, "zone1") - t.Logf("%s %s", cond1.WhereClause(), cond1.Variables()) - cond2 := Equals(field, "zone2") - t.Logf("%s %s", cond2.WhereClause(), cond2.Variables()) - cond3 := OR(cond1, cond2) - t.Logf("%s %s", cond3.WhereClause(), cond3.Variables()) - cond4 := Equals(field, "zone3") - cond5 := AND(cond4, cond3) - t.Logf("%s %s", cond5.WhereClause(), cond5.Variables()) - cond6 := IsFalse(field) - cond7 := AND(cond6, cond5) - t.Logf("%s %s", cond7.WhereClause(), cond7.Variables()) - cond8 := AND(cond5, cond7) - t.Logf("%s %s", cond8.WhereClause(), cond8.Variables()) -} - -func Test_likeEscape(t *testing.T) { - type args struct { - s string - } - tests := []struct { - name string - args args - want string - }{ - { - name: "test Like escape", - args: args{ - "test%%%", - }, - want: "test\\%\\%\\%", - }, - { - name: "test Like escape2", - args: args{ - "test_%_%", - }, - want: "test\\_\\%\\_\\%", - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - if got := likeEscape(tt.args.s); got != tt.want { - println(len(got), len(tt.want)) - t.Errorf("likeEscape() = %v, want %v", got, tt.want) - } - }) - } -} diff --git a/vendor/yunion.io/x/sqlchemy/constraint.go b/vendor/yunion.io/x/sqlchemy/constraint.go index db2b315fb9..7eef68b5e4 100644 --- a/vendor/yunion.io/x/sqlchemy/constraint.go +++ b/vendor/yunion.io/x/sqlchemy/constraint.go @@ -47,6 +47,5 @@ func FetchColumns(match string) []string { } } } - // log.Debugf("%s", ret) return ret } diff --git a/vendor/yunion.io/x/sqlchemy/debug.go b/vendor/yunion.io/x/sqlchemy/debug.go index a1c767bf15..c9d159c839 100644 --- a/vendor/yunion.io/x/sqlchemy/debug.go +++ b/vendor/yunion.io/x/sqlchemy/debug.go @@ -28,6 +28,11 @@ var ( ) func sqlDebug(sqlstr string, variables []interface{}) { + sqlstr = _sqlDebug(sqlstr, variables) + log.Debugln("SQuery ", sqlstr) +} + +func _sqlDebug(sqlstr string, variables []interface{}) string { for _, v := range variables { switch v.(type) { case bool, int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64, float32, float64: @@ -38,7 +43,7 @@ func sqlDebug(sqlstr string, variables []interface{}) { sqlstr = strings.Replace(sqlstr, "?", fmt.Sprintf(`'%v'`, v), 1) } } - log.Debugln("SQuery ", sqlstr) + return sqlstr } // DebugQuery show the full query string for debug diff --git a/vendor/yunion.io/x/sqlchemy/fetch.go b/vendor/yunion.io/x/sqlchemy/fetch.go index 63c9492c1e..27ad01c5dd 100644 --- a/vendor/yunion.io/x/sqlchemy/fetch.go +++ b/vendor/yunion.io/x/sqlchemy/fetch.go @@ -29,7 +29,7 @@ func (ts *STableSpec) Fetch(dt interface{}) error { q := ts.Query() dataValue := reflect.ValueOf(dt).Elem() fields := reflectutils.FetchStructFieldValueSet(dataValue) - for _, c := range ts.columns { + for _, c := range ts.Columns() { priVal, _ := fields.GetInterface(c.Name()) if c.IsPrimary() && !gotypes.IsNil(priVal) { // skip update primary key q = q.Equals(c.Name(), priVal) diff --git a/vendor/yunion.io/x/sqlchemy/field_update.go b/vendor/yunion.io/x/sqlchemy/field_update.go index a0d16ab072..3ec63f2773 100644 --- a/vendor/yunion.io/x/sqlchemy/field_update.go +++ b/vendor/yunion.io/x/sqlchemy/field_update.go @@ -19,38 +19,14 @@ import ( "fmt" "reflect" + "yunion.io/x/pkg/util/timeutils" + "yunion.io/x/log" "yunion.io/x/pkg/errors" + "yunion.io/x/pkg/gotypes" "yunion.io/x/pkg/util/reflectutils" ) -/* -func (ts *STableSpec) GetUpdateColumnValue(dataType reflect.Type, dataValue reflect.Value, cv map[string]interface{}, fields map[string]interface{}) error { - for i := 0; i < dataType.NumField(); i++ { - fieldType := dataType.Field(i) - if gotypes.IsFieldExportable(fieldType.Name) { - fieldValue := dataValue.Field(i) - newValue, ok := fields[fieldType.Name] - if ok && fieldType.Anonymous { - return errors.New("Unsupported update anonymous field") - } - if ok { - columnName := reflectutils.GetStructFieldName(&fieldType) - cv[columnName] = newValue - continue - } - if fieldType.Anonymous { - err := ts.GetUpdateColumnValue(fieldType.Type, fieldValue, cv, fields) - if err != nil { - return err - } - } - } - } - return nil -} -*/ - // UpdateFields update a record with the values provided by fields stringmap // params dt: model struct, fileds: {struct-field-name-string: update-value} func (ts *STableSpec) UpdateFields(dt interface{}, fields map[string]interface{}) error { @@ -61,17 +37,14 @@ func (ts *STableSpec) UpdateFields(dt interface{}, fields map[string]interface{} // find primary key and index key // find fields correlatively columns // joint sql and executed -func (ts *STableSpec) updateFields(dt interface{}, fields map[string]interface{}, debug bool) error { +func (ts *STableSpec) updateFieldSql(dt interface{}, fields map[string]interface{}, debug bool) (*sUpdateSQLResult, error) { dataValue := reflect.Indirect(reflect.ValueOf(dt)) - // cv: {"column name": "update value"} cv := make(map[string]interface{}) - // dataType := dataValue.Type() - // ts.GetUpdateColumnValue(dataType, dataValue, cv, fields) - // if len(cv) == 0 { - // log.Infof("Nothing update") - // return nil - // } + // use field to store field order + cnames := make([]string, 0) + + now := timeutils.UtcNow() fullFields := reflectutils.FetchStructFieldValueSet(dataValue) versionFields := make([]string, 0) @@ -83,8 +56,14 @@ func (ts *STableSpec) updateFields(dt interface{}, fields map[string]interface{} if !ok { continue } - if col.IsPrimary() && !col.IsZero(colValue) { - primaryCols[name] = colValue + if col.IsPrimary() { + if !gotypes.IsNil(colValue) && !col.IsZero(colValue) { + primaryCols[name] = colValue + } else if col.IsText() { + primaryCols[name] = "" + } else { + return nil, ErrEmptyPrimaryKey + } continue } if col.IsAutoVersion() { @@ -97,17 +76,20 @@ func (ts *STableSpec) updateFields(dt interface{}, fields map[string]interface{} } if _, exist := fields[name]; exist { cv[name] = col.ConvertFromValue(fields[name]) + cnames = append(cnames, name) } } + if len(primaryCols) == 0 { + return nil, ErrEmptyPrimaryKey + } + vars := make([]interface{}, 0) var buf bytes.Buffer buf.WriteString(fmt.Sprintf("UPDATE `%s` SET ", ts.name)) - first := true - for k, v := range cv { - if first { - first = false - } else { + for i, k := range cnames { + v := cv[k] + if i > 0 { buf.WriteString(", ") } buf.WriteString(fmt.Sprintf("`%s` = ?", k)) @@ -117,14 +99,11 @@ func (ts *STableSpec) updateFields(dt interface{}, fields map[string]interface{} buf.WriteString(fmt.Sprintf(", `%s` = `%s` + 1", versionField, versionField)) } for _, updatedField := range updatedFields { - buf.WriteString(fmt.Sprintf(", `%s` = UTC_TIMESTAMP()", updatedField)) + buf.WriteString(fmt.Sprintf(", `%s` = ?", updatedField)) + vars = append(vars, now) } buf.WriteString(" WHERE ") - first = true - if len(primaryCols) == 0 { - return ErrEmptyPrimaryKey - } - + first := true for k, v := range primaryCols { if first { first = false @@ -138,16 +117,24 @@ func (ts *STableSpec) updateFields(dt interface{}, fields map[string]interface{} if DEBUG_SQLCHEMY || debug { log.Infof("Update: %s", buf.String()) } - results, err := ts.Database().Exec(buf.String(), vars...) + + return &sUpdateSQLResult{ + sql: buf.String(), + vars: vars, + primaries: primaryCols, + }, nil +} + +func (ts *STableSpec) updateFields(dt interface{}, fields map[string]interface{}, debug bool) error { + results, err := ts.updateFieldSql(dt, fields, debug) if err != nil { - return err + return errors.Wrap(err, "updateFieldSql") } - aCnt, err := results.RowsAffected() + + err = ts.execUpdateSql(dt, results) if err != nil { - return err - } - if aCnt > 1 { - return errors.Wrapf(ErrUnexpectRowCount, "affected rows %d != 1", aCnt) + return errors.Wrap(err, "execUpdateSql") } + return nil } diff --git a/vendor/yunion.io/x/sqlchemy/functions.go b/vendor/yunion.io/x/sqlchemy/functions.go index d2b8e4ebef..0cbe64b307 100644 --- a/vendor/yunion.io/x/sqlchemy/functions.go +++ b/vendor/yunion.io/x/sqlchemy/functions.go @@ -82,7 +82,7 @@ type sExprFunction struct { func (ff *sExprFunction) expression() string { fieldRefs := make([]interface{}, 0) for _, f := range ff.fields { - fieldRefs = append(fieldRefs, f.Reference()) + fieldRefs = append(fieldRefs, f.Expression()) } return fmt.Sprintf(ff.function, fieldRefs...) } @@ -237,7 +237,12 @@ func CONCAT(name string, fields ...IQueryField) IQueryField { } // SubStr represents a SQL function SUBSTR +// Deprecated func SubStr(name string, field IQueryField, pos, length int) IQueryField { + return SUBSTR(name, field, pos, length) +} + +func SUBSTR(name string, field IQueryField, pos, length int) IQueryField { var rightStr string if length <= 0 { rightStr = fmt.Sprintf("%d)", pos) @@ -268,3 +273,7 @@ func INET_ATON(field IQueryField) IQueryField { func TimestampAdd(name string, field IQueryField, offsetSeconds int) IQueryField { return NewFunctionField(name, `TIMESTAMPADD(SECOND, `+fmt.Sprintf("%d", offsetSeconds)+`, %s)`, field) } + +func CAST(field IQueryField, typeStr string, fieldname string) IQueryField { + return NewFunctionField(fieldname, `CAST(%s AS `+typeStr+`)`, field) +} diff --git a/vendor/yunion.io/x/sqlchemy/inc.go b/vendor/yunion.io/x/sqlchemy/inc.go index 43cd49f446..30acb8da9b 100644 --- a/vendor/yunion.io/x/sqlchemy/inc.go +++ b/vendor/yunion.io/x/sqlchemy/inc.go @@ -16,7 +16,6 @@ package sqlchemy import ( "bytes" - "database/sql" "fmt" "reflect" @@ -24,6 +23,7 @@ import ( "yunion.io/x/pkg/errors" "yunion.io/x/pkg/gotypes" "yunion.io/x/pkg/util/reflectutils" + "yunion.io/x/pkg/util/timeutils" ) // Increment perform an incremental update on a record, the primary key of the record is specified in diff, @@ -46,17 +46,13 @@ func (t *STableSpec) Decrement(diff interface{}, target interface{}) error { return t.incrementInternal(diff, "-", target) } -func (t *STableSpec) incrementInternal(diff interface{}, opcode string, target interface{}) error { - if target == nil { - if reflect.ValueOf(diff).Kind() != reflect.Ptr { - return errors.Wrap(ErrNeedsPointer, "Incremental input must be a Pointer") - } - } else { - if reflect.ValueOf(target).Kind() != reflect.Ptr { - return errors.Wrap(ErrNeedsPointer, "Incremental update target must be a Pointer") - } - } +type incrementSqlResult struct { + sql string + vars []interface{} + primaries map[string]interface{} +} +func (t *STableSpec) incrementInternalSql(diff interface{}, opcode string, target interface{}) (*sUpdateSQLResult, error) { dataValue := reflect.Indirect(reflect.ValueOf(diff)) fields := reflectutils.FetchStructFieldValueSet(dataValue) var targetFields reflectutils.SStructFieldValueSet @@ -65,13 +61,15 @@ func (t *STableSpec) incrementInternal(diff interface{}, opcode string, target i targetFields = reflectutils.FetchStructFieldValueSet(targetValue) } + now := timeutils.UtcNow() + primaries := make(map[string]interface{}) vars := make([]interface{}, 0) versionFields := make([]string, 0) updatedFields := make([]string, 0) incFields := make([]string, 0) - for _, c := range t.columns { + for _, c := range t.Columns() { k := c.Name() v, _ := fields.GetInterface(k) if c.IsPrimary() { @@ -83,7 +81,7 @@ func (t *STableSpec) incrementInternal(diff interface{}, opcode string, target i } else if c.IsText() { primaries[k] = "" } else { - return ErrEmptyPrimaryKey + return nil, ErrEmptyPrimaryKey } continue } @@ -103,10 +101,10 @@ func (t *STableSpec) incrementInternal(diff interface{}, opcode string, target i } if len(vars) == 0 { - return ErrNoDataToUpdate + return nil, ErrNoDataToUpdate } if len(primaries) == 0 { - return ErrEmptyPrimaryKey + return nil, ErrEmptyPrimaryKey } var buf bytes.Buffer @@ -124,7 +122,8 @@ func (t *STableSpec) incrementInternal(diff interface{}, opcode string, target i buf.WriteString(fmt.Sprintf(", `%s` = `%s` + 1", versionField, versionField)) } for _, updatedField := range updatedFields { - buf.WriteString(fmt.Sprintf(", `%s` = %s", updatedField, t.Database().backend.CurrentUTCTimeStampString())) + buf.WriteString(fmt.Sprintf(", `%s` = ?", updatedField)) + vars = append(vars, now) } buf.WriteString(" WHERE ") @@ -143,31 +142,34 @@ func (t *STableSpec) incrementInternal(diff interface{}, opcode string, target i log.Infof("Update: %s %s", buf.String(), vars) } - results, err := t.Database().Exec(buf.String(), vars...) - if err != nil { - return errors.Wrapf(err, "_db.Exec %s %#v", buf.String(), vars) - } - aCnt, err := results.RowsAffected() - if err != nil { - return errors.Wrap(err, "results.RowsAffected") - } - if aCnt != 1 { - if aCnt == 0 { - return sql.ErrNoRows + return &sUpdateSQLResult{ + sql: buf.String(), + vars: vars, + primaries: primaries, + }, nil +} + +func (t *STableSpec) incrementInternal(diff interface{}, opcode string, target interface{}) error { + if target == nil { + if reflect.ValueOf(diff).Kind() != reflect.Ptr { + return errors.Wrap(ErrNeedsPointer, "Incremental input must be a Pointer") } - return errors.Wrapf(ErrUnexpectRowCount, "affected rows %d != 1", aCnt) - } - q := t.Query() - for k, v := range primaries { - q = q.Equals(k, v) - } - if target != nil { - err = q.First(target) } else { - err = q.First(diff) + if reflect.ValueOf(target).Kind() != reflect.Ptr { + return errors.Wrap(ErrNeedsPointer, "Incremental update target must be a Pointer") + } + } + + intResult, err := t.incrementInternalSql(diff, opcode, target) + + if target != nil { + err = t.execUpdateSql(target, intResult) + } else { + err = t.execUpdateSql(diff, intResult) } if err != nil { return errors.Wrap(err, "query after update failed") } + return nil } diff --git a/vendor/yunion.io/x/sqlchemy/index.go b/vendor/yunion.io/x/sqlchemy/index.go index 12fafb2755..cbf5245c21 100644 --- a/vendor/yunion.io/x/sqlchemy/index.go +++ b/vendor/yunion.io/x/sqlchemy/index.go @@ -16,6 +16,7 @@ package sqlchemy import ( "fmt" + "sort" "strings" ) @@ -26,6 +27,7 @@ type STableIndex struct { } func NewTableIndex(name string, cols []string, unique bool) STableIndex { + sort.Sort(TColumnNames(cols)) return STableIndex{ name: name, columns: cols, @@ -33,7 +35,7 @@ func NewTableIndex(name string, cols []string, unique bool) STableIndex { } } -/*type TColumnNames []string +type TColumnNames []string func (cols TColumnNames) Len() int { return len(cols) @@ -49,12 +51,13 @@ func (cols TColumnNames) Less(i, j int) bool { } else { return false } -}*/ +} func (index *STableIndex) IsIdentical(cols ...string) bool { if len(index.columns) != len(cols) { return false } + sort.Sort(TColumnNames(cols)) for i := 0; i < len(index.columns); i++ { if index.columns[i] != cols[i] { return false @@ -74,13 +77,13 @@ func (index *STableIndex) QuotedColumns() []string { // AddIndex adds a SQL index over multiple columns for a Table // param unique: indicates a unique index cols: name of columns func (ts *STableSpec) AddIndex(unique bool, cols ...string) bool { - for i := 0; i < len(ts.indexes); i++ { - if ts.indexes[i].IsIdentical(cols...) { + for i := 0; i < len(ts._indexes); i++ { + if ts._indexes[i].IsIdentical(cols...) { return false } } name := fmt.Sprintf("ix_%s_%s", ts.name, strings.Join(cols, "_")) idx := STableIndex{name: name, columns: cols, isUnique: unique} - ts.indexes = append(ts.indexes, idx) + ts._indexes = append(ts._indexes, idx) return true } diff --git a/vendor/yunion.io/x/sqlchemy/insert.go b/vendor/yunion.io/x/sqlchemy/insert.go index a9d8e273f9..e91377a5e6 100644 --- a/vendor/yunion.io/x/sqlchemy/insert.go +++ b/vendor/yunion.io/x/sqlchemy/insert.go @@ -19,12 +19,11 @@ import ( "reflect" "strings" - "yunion.io/x/pkg/util/timeutils" - "yunion.io/x/log" "yunion.io/x/pkg/errors" "yunion.io/x/pkg/gotypes" "yunion.io/x/pkg/util/reflectutils" + "yunion.io/x/pkg/util/timeutils" ) // Insert perform a insert operation, the value of the record is store in dt @@ -45,7 +44,18 @@ func (t *STableSpec) InsertOrUpdate(dt interface{}) error { return t.insert(dt, true, false) } -func (t *STableSpec) InsertSqlPrep(dataFields reflectutils.SStructFieldValueSet, update bool) (string, []interface{}, error) { +type InsertSqlResult struct { + Sql string + Values []interface{} + Primaries map[string]interface{} +} + +func (t *STableSpec) InsertSqlPrep(data interface{}, update bool) (*InsertSqlResult, error) { + beforeInsert(reflect.ValueOf(data)) + + dataValue := reflect.ValueOf(data).Elem() + dataFields := reflectutils.FetchStructFieldValueSet(dataValue) + var autoIncField string createdAtFields := make([]string, 0) @@ -56,9 +66,12 @@ func (t *STableSpec) InsertSqlPrep(dataFields reflectutils.SStructFieldValueSet, updates := make([]string, 0) updateValues := make([]interface{}, 0) + primaryKeys := make([]string, 0) + primaries := make(map[string]interface{}) + now := timeutils.UtcNow() - for _, c := range t.columns { + for _, c := range t.Columns() { isAutoInc := false if c.IsAutoIncrement() { isAutoInc = true @@ -72,6 +85,11 @@ func (t *STableSpec) InsertSqlPrep(dataFields reflectutils.SStructFieldValueSet, continue } + if c.IsPrimary() { + primaryKeys = append(primaryKeys, fmt.Sprintf("`%s`", k)) + } + + // created_at or updated_at but must not be a primary key if c.IsCreatedAt() || c.IsUpdatedAt() { createdAtFields = append(createdAtFields, k) names = append(names, fmt.Sprintf("`%s`", k)) @@ -84,7 +102,7 @@ func (t *STableSpec) InsertSqlPrep(dataFields reflectutils.SStructFieldValueSet, format = append(format, "?") } - if update && c.IsUpdatedAt() { + if update && c.IsUpdatedAt() && !c.IsPrimary() { if c.IsZero(ov) { updates = append(updates, fmt.Sprintf("`%s` = ?", k)) updateValues = append(updateValues, now) @@ -94,40 +112,59 @@ func (t *STableSpec) InsertSqlPrep(dataFields reflectutils.SStructFieldValueSet, } } + if c.IsPrimary() { + if c.IsZero(ov) { + primaries[k] = now + } else { + primaries[k] = ov + } + } continue } + // auto_version and must not be a primary key if update && c.IsAutoVersion() { updates = append(updates, fmt.Sprintf("`%s` = `%s` + 1", k, k)) continue } + // empty but with default if c.IsSupportDefault() && (len(c.Default()) > 0 || c.IsString()) && !gotypes.IsNil(ov) && c.IsZero(ov) && !c.AllowZero() { // empty text value val := c.ConvertFromString(c.Default()) values = append(values, val) names = append(names, fmt.Sprintf("`%s`", k)) format = append(format, "?") - if update { + if update && !c.IsPrimary() { updates = append(updates, fmt.Sprintf("`%s` = ?", k)) updateValues = append(updateValues, val) } + + if c.IsPrimary() { + primaries[k] = val + } continue } + // not empty if !gotypes.IsNil(ov) && (!c.IsZero(ov) || (!c.IsPointer() && !c.IsText())) && !isAutoInc { v := c.ConvertFromValue(ov) values = append(values, v) names = append(names, fmt.Sprintf("`%s`", k)) format = append(format, "?") - if update { + if update && !c.IsPrimary() { updates = append(updates, fmt.Sprintf("`%s` = ?", k)) updateValues = append(updateValues, v) } + + if c.IsPrimary() { + primaries[k] = v + } continue } + // empty primary but is autoinc or text if c.IsPrimary() { if isAutoInc { if len(autoIncField) > 0 { @@ -138,24 +175,48 @@ func (t *STableSpec) InsertSqlPrep(dataFields reflectutils.SStructFieldValueSet, values = append(values, "") names = append(names, fmt.Sprintf("`%s`", k)) format = append(format, "?") + primaries[k] = "" } else { - return "", nil, errors.Wrapf(ErrEmptyPrimaryKey, "cannot insert for null primary key %q", k) + return nil, errors.Wrapf(ErrEmptyPrimaryKey, "cannot insert for null primary key %q", k) } continue } } - insertSql := fmt.Sprintf("INSERT INTO `%s` (%s) VALUES(%s)", - t.name, - strings.Join(names, ", "), - strings.Join(format, ", ")) - - if update { - insertSql += " ON DUPLICATE KEY UPDATE " + strings.Join(updates, ", ") + var insertSql string + if !update { + insertSql = templateEval(t.Database().backend.InsertSQLTemplate(), struct { + Table string + Columns string + Values string + }{ + Table: t.name, + Columns: strings.Join(names, ", "), + Values: strings.Join(format, ", "), + }) + } else { + insertSql = templateEval(t.Database().backend.InsertOrUpdateSQLTemplate(), struct { + Table string + Columns string + Values string + PrimaryKeys string + SetValues string + }{ + Table: t.name, + Columns: strings.Join(names, ", "), + Values: strings.Join(format, ", "), + PrimaryKeys: strings.Join(primaryKeys, ", "), + SetValues: strings.Join(updates, ", "), + }) values = append(values, updateValues...) } - return insertSql, values, nil + + return &InsertSqlResult{ + Sql: insertSql, + Values: values, + Primaries: primaries, + }, nil } func beforeInsert(val reflect.Value) { @@ -179,38 +240,18 @@ func beforeInsert(val reflect.Value) { } func (t *STableSpec) insert(data interface{}, update bool, debug bool) error { - beforeInsert(reflect.ValueOf(data)) - - dataValue := reflect.ValueOf(data).Elem() - dataFields := reflectutils.FetchStructFieldValueSet(dataValue) - insertSql, values, err := t.InsertSqlPrep(dataFields, update) + insertResult, err := t.InsertSqlPrep(data, update) if err != nil { return errors.Wrap(err, "insertSqlPrep") } if DEBUG_SQLCHEMY || debug { - log.Debugf("%s values: %#v", insertSql, values) - } - log.Debugf("sql: %s values: %#v", insertSql, values) - - tx, err := t.Database().db.Begin() - if err != nil { - return errors.Wrap(err, "Begin transaction") - } - stmt, err := tx.Prepare(insertSql) - if err != nil { - return errors.Wrapf(err, "Prepare sql %s", insertSql) - } - defer stmt.Close() - - results, err := stmt.Exec(values...) - if err != nil { - return errors.Wrap(err, "Exec") + log.Debugf("%s values: %#v", insertResult.Sql, insertResult.Values) } - err = tx.Commit() + results, err := t.Database().TxExec(insertResult.Sql, insertResult.Values...) if err != nil { - return errors.Wrap(err, "Commit transaction") + return errors.Wrap(err, "TxExec") } if t.Database().backend.CanSupportRowAffected() { @@ -243,7 +284,7 @@ func (t *STableSpec) insert(data interface{}, update bool, debug bool) error { // query the value, so default value can be feedback into the object // fields = reflectutils.FetchStructFieldNameValueInterfaces(dataValue) q := t.Query() - for _, c := range t.columns { + for _, c := range t.Columns() { if c.IsPrimary() { if c.IsAutoIncrement() { lastId, err := results.LastInsertId() @@ -252,7 +293,7 @@ func (t *STableSpec) insert(data interface{}, update bool, debug bool) error { } q = q.Equals(c.Name(), lastId) } else { - priVal, _ := dataFields.GetInterface(c.Name()) + priVal, _ := insertResult.Primaries[c.Name()] if !gotypes.IsNil(priVal) { q = q.Equals(c.Name(), priVal) } diff --git a/vendor/yunion.io/x/sqlchemy/insert_test.go b/vendor/yunion.io/x/sqlchemy/insert_test.go deleted file mode 100644 index 8193497121..0000000000 --- a/vendor/yunion.io/x/sqlchemy/insert_test.go +++ /dev/null @@ -1,80 +0,0 @@ -// Copyright 2019 Yunion -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package sqlchemy - -import ( - "reflect" - "testing" - - "yunion.io/x/pkg/util/reflectutils" -) - -func insertSqlPrep(v interface{}) (string, []interface{}, error) { - vvvalue := reflect.ValueOf(v).Elem() - vv := vvvalue.Interface() - vvFields := reflectutils.FetchStructFieldValueSet(vvvalue) - SetDefaultDB(nil) - ts := NewTableSpecFromStruct(vv, "vv") - sql, vals, err := ts.insertSqlPrep(vvFields, false) - return sql, vals, err -} - -func TestInsertAutoIncrement(t *testing.T) { - sql, vals, err := insertSqlPrep(&struct { - RowId int `auto_increment:"true"` - }{}) - if err != nil { - t.Errorf("prepare sql failed: %s", err) - return - } - wantSql := "INSERT INTO `vv` () VALUES()" - if sql != wantSql { - t.Errorf("sql want: %s\ngot: %s", wantSql, sql) - return - } - if len(vals) != 0 { - t.Errorf("vals want %d, got %d", 0, len(vals)) - return - } -} - -func TestInsertMultiAutoIncrement(t *testing.T) { - defer func() { - v := recover() - if v == nil { - t.Errorf("should panic with multiple auto_increment fields") - } - }() - _, _, err := insertSqlPrep(&struct { - RowId int `auto_increment:"true"` - RowId2 int `auto_increment:"true"` - }{}) - t.Errorf("should panic but it continues: err: %s", err) -} - -func TestInsertWithPointerValue(t *testing.T) { - sql, vals, err := insertSqlPrep(&struct { - RowId int `auto_increment:"true"` - ColT1 *int - ColT2 int - ColT3 string - ColT4 *string - }{}) - if err != nil { - t.Errorf("prepare sql failed: %s", err) - return - } - t.Logf("%s values: %v", sql, vals) -} diff --git a/vendor/yunion.io/x/sqlchemy/locales/doc.go b/vendor/yunion.io/x/sqlchemy/locales/doc.go deleted file mode 100644 index a5b0ceb0bc..0000000000 --- a/vendor/yunion.io/x/sqlchemy/locales/doc.go +++ /dev/null @@ -1 +0,0 @@ -package locales diff --git a/vendor/yunion.io/x/sqlchemy/locales/locales.go b/vendor/yunion.io/x/sqlchemy/locales/locales.go deleted file mode 100644 index c8f3eb0bd7..0000000000 --- a/vendor/yunion.io/x/sqlchemy/locales/locales.go +++ /dev/null @@ -1,80 +0,0 @@ -// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. - -package locales - -import ( - "golang.org/x/text/language" - - "golang.org/x/text/message/catalog" -) - -type dictionary struct { - index []uint32 - data string -} - -func (d *dictionary) Lookup(key string) (data string, ok bool) { - p, ok := messageKeyToIndex[key] - if !ok { - return "", false - } - start, end := d.index[p], d.index[p+1] - if start == end { - return "", false - } - return d.data[start:end], true -} - -var Catalog catalog.Catalog - -func init() { - dict := map[string]catalog.Dictionary{ - "en_US": &dictionary{index: en_USIndex, data: en_USData}, - "zh_CN": &dictionary{index: zh_CNIndex, data: zh_CNData}, - } - fallback := language.MustParse("en-US") - cat, err := catalog.NewFromMap(dict, catalog.Fallback(fallback)) - if err != nil { - panic(err) - } - - Catalog = cat - -} - -var messageKeyToIndex = map[string]int{ - "No data to update": 0, - "NotSupportedError": 8, - "TableNotExists": 9, - "duplicate entry": 1, - "empty primary keys": 3, - "empty query": 2, - "input needs pointer input": 5, - "input needs slice or array": 6, - "read only input": 7, - "unexpected row count": 4, -} - -var en_USIndex = []uint32{ // 11 elements - 0x00000000, 0x00000012, 0x00000022, 0x0000002e, - 0x00000041, 0x00000056, 0x00000070, 0x0000008b, - 0x0000009b, 0x000000ad, 0x000000bc, -} // Size: 68 bytes - -const en_USData string = "" + // Size: 188 bytes - "\x02No data to update\x02duplicate entry\x02empty query\x02empty primary" + - " keys\x02unexpected row count\x02input needs pointer input\x02input need" + - "s slice or array\x02read only input\x02NotSupportedError\x02TableNotExis" + - "ts" - -var zh_CNIndex = []uint32{ // 11 elements - 0x00000000, 0x0000001c, 0x00000029, 0x00000033, - 0x00000043, 0x00000059, 0x00000072, 0x00000095, - 0x000000a8, 0x000000b2, 0x000000bf, -} // Size: 68 bytes - -const zh_CNData string = "" + // Size: 191 bytes - "\x02没有需要UPDATE的数据\x02重复条目\x02空查询\x02未指定主键\x02行数不符合预期\x02输入应为指针类型\x02输入应为" + - "slice或者array类型\x02输入参数只读\x02不支持\x02表不存在" - - // Total table size 515 bytes (0KiB); checksum: 11D0C27C diff --git a/vendor/yunion.io/x/sqlchemy/locales/zh-CN/messages.gotext.json b/vendor/yunion.io/x/sqlchemy/locales/zh-CN/messages.gotext.json deleted file mode 100644 index 5f543ac8e6..0000000000 --- a/vendor/yunion.io/x/sqlchemy/locales/zh-CN/messages.gotext.json +++ /dev/null @@ -1,65 +0,0 @@ -{ - "language": "zh-CN", - "messages": [ - { - "id": "No data to update", - "message": "No data to update", - "translation": "没有需要UPDATE的数据", - "position": "errors.go:24:2" - }, - { - "id": "duplicate entry", - "message": "duplicate entry", - "translation": "重复条目", - "position": "errors.go:25:2" - }, - { - "id": "empty query", - "message": "empty query", - "translation": "空查询", - "position": "errors.go:26:2" - }, - { - "id": "empty primary keys", - "message": "empty primary keys", - "translation": "未指定主键", - "position": "errors.go:27:2" - }, - { - "id": "unexpected row count", - "message": "unexpected row count", - "translation": "行数不符合预期", - "position": "errors.go:28:2" - }, - { - "id": "input needs pointer input", - "message": "input needs pointer input", - "translation": "输入应为指针类型", - "position": "errors.go:30:2" - }, - { - "id": "input needs slice or array", - "message": "input needs slice or array", - "translation": "输入应为slice或者array类型", - "position": "errors.go:31:2" - }, - { - "id": "read only input", - "message": "read only input", - "translation": "输入参数只读", - "position": "errors.go:32:2" - }, - { - "id": "NotSupportedError", - "message": "NotSupportedError", - "translation": "不支持", - "position": "errors.go:34:2" - }, - { - "id": "TableNotExists", - "message": "TableNotExists", - "translation": "表不存在", - "position": "errors.go:36:2" - } - ] -} diff --git a/vendor/yunion.io/x/sqlchemy/main_test.go b/vendor/yunion.io/x/sqlchemy/main_test.go deleted file mode 100644 index 584cc12b61..0000000000 --- a/vendor/yunion.io/x/sqlchemy/main_test.go +++ /dev/null @@ -1,30 +0,0 @@ -package sqlchemy - -import ( - "testing" -) - -type testQueryTable struct { - Col0 string - Col1 int -} - -var ( - testTableSpec = NewTableSpecFromStruct(testQueryTable{}, "test") - testTable = testTableSpec.Instance() -) - -func testReset() { - tableIDLock.Lock() - defer tableIDLock.Unlock() - - // next alias index must be 2 because 1 has already been taken by - // testTable - tableID = 1 -} - -func testGotWant(t *testing.T, got, want string) { - if got != want { - t.Fatalf("\ngot:\n%s\nwant:\n%s\n", got, want) - } -} diff --git a/vendor/yunion.io/x/sqlchemy/parser.go b/vendor/yunion.io/x/sqlchemy/parser.go index bef03591f6..d021274ca1 100644 --- a/vendor/yunion.io/x/sqlchemy/parser.go +++ b/vendor/yunion.io/x/sqlchemy/parser.go @@ -60,7 +60,7 @@ func (table *STableSpec) struct2TableSpec(sv reflect.Value) { if column.IsIndex() { table.AddIndex(column.IsUnique(), column.Name()) } - table.columns = append(table.columns, column) + table._columns = append(table._columns, column) } } } diff --git a/vendor/yunion.io/x/sqlchemy/query_test.go b/vendor/yunion.io/x/sqlchemy/query_test.go deleted file mode 100644 index 11532b5dca..0000000000 --- a/vendor/yunion.io/x/sqlchemy/query_test.go +++ /dev/null @@ -1,58 +0,0 @@ -package sqlchemy - -import ( - "testing" -) - -func TestQuery(t *testing.T) { - t.Run("query all fields", func(t *testing.T) { - testReset() - q := testTable.Query() - want := "SELECT `t1`.`col0`, `t1`.`col1` FROM `test` AS `t1`" - testGotWant(t, q.String(), want) - }) - - t.Run("query selected fields", func(t *testing.T) { - testReset() - q := testTable.Query(testTable.Field("col0")).Equals("col1", 100) - want := "SELECT `t1`.`col0` FROM `test` AS `t1` WHERE `t1`.`col1` = ( ? )" - testGotWant(t, q.String(), want) - }) - - t.Run("query selected fields from subquery", func(t *testing.T) { - testReset() - q := testTable.Query().SubQuery().Query(testTable.Field("col0")).Equals("col1", 100) - want := "SELECT `t1`.`col0` FROM (SELECT `t1`.`col1` FROM `test` AS `t1`) AS `t2` WHERE `t2`.`col1` = ( ? )" - testGotWant(t, q.String(), want) - }) - - t.Run("query union", func(t *testing.T) { - testReset() - q1 := testTable.Query(testTable.Field("col0")).Equals("col1", 100) - q2 := testTable.Query(testTable.Field("col0")).Equals("col1", 200) - uq := Union(q1, q2) - q := uq.Query() - want := "SELECT `t2`.`col0` FROM ((SELECT `t1`.`col0` FROM `test` AS `t1` WHERE `t1`.`col1` = ( ? )) UNION (SELECT `t1`.`col0` FROM `test` AS `t1` WHERE `t1`.`col1` = ( ? ))) AS `t2`" - testGotWant(t, q.String(), want) - }) - - t.Run("query order by SUM func", func(t *testing.T) { - testReset() - q := testTable.Query(SUM("total", testTable.Field("col1")), testTable.Field("col0")).GroupBy(testTable.Field("col0")) - q = q.Asc(q.Field("total")) - want := "SELECT SUM(`t1`.`col1`) AS `total`, `t1`.`col0` FROM `test` AS `t1` GROUP BY `t1`.`col0` ORDER BY `total` ASC" - testGotWant(t, q.String(), want) - }) -} - -func TestCountQuery(t *testing.T) { - testReset() - - q := testTable.Query() - q.GroupBy("col0") - q.Limit(8) - q.Offset(10) - cq := q.countQuery() - want := "SELECT COUNT(*) AS `count` FROM (SELECT `t1`.`col0`, `t1`.`col1` FROM `test` AS `t1` GROUP BY `t1`.`col0`) AS `t2`" - testGotWant(t, cq.String(), want) -} diff --git a/vendor/yunion.io/x/sqlchemy/rawquery.go b/vendor/yunion.io/x/sqlchemy/rawquery.go index ab1529b54e..cc575a8e67 100644 --- a/vendor/yunion.io/x/sqlchemy/rawquery.go +++ b/vendor/yunion.io/x/sqlchemy/rawquery.go @@ -14,8 +14,6 @@ package sqlchemy -import "yunion.io/x/log" - // SRawQueryField is a struct represents a field of a raw SQL query // a raw query is a query that not follow standard SELECT ... FROM ... pattern // e.g. show tables @@ -56,7 +54,6 @@ func NewRawQuery(sqlStr string, fields ...string) *SQuery { // NewRawQuery returns an instance of SQuery with raw SQL query for a database, e.g. show tables func (db *SDatabase) NewRawQuery(sqlStr string, fields ...string) *SQuery { - log.Debugf("Raw query: %s", sqlStr) qfs := make([]IQueryField, len(fields)) for i, f := range fields { rqf := SRawQueryField{name: f} diff --git a/vendor/yunion.io/x/sqlchemy/reflect_test.go b/vendor/yunion.io/x/sqlchemy/reflect_test.go deleted file mode 100644 index 49e4d632dd..0000000000 --- a/vendor/yunion.io/x/sqlchemy/reflect_test.go +++ /dev/null @@ -1,117 +0,0 @@ -// Copyright 2019 Yunion -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package sqlchemy - -import ( - "reflect" - "testing" - - "yunion.io/x/jsonutils" - "yunion.io/x/pkg/gotypes" -) - -type SerializableType struct { - I int - S string - IS []int - SS []string - M map[string]int -} - -func (t *SerializableType) IsZero() bool { - return reflect.DeepEqual(t, &SerializableType{}) -} - -func (t *SerializableType) String() string { - return jsonutils.Marshal(t).String() -} - -func Test_setValueBySQLString(t *testing.T) { - t.Run("serializable", func(t *testing.T) { - gotypes.RegisterSerializable(reflect.TypeOf((*SerializableType)(nil)), func() gotypes.ISerializable { - return &SerializableType{} - }) - - v := &SerializableType{ - I: 100, - S: "serializable s value", - IS: []int{200, 201}, - SS: []string{"s0", "s 1", "s 2"}, - M: map[string]int{ - "k0": 0, - "k 1": 2, - }, - } - s := v.String() - - vv := &SerializableType{} - vvv := reflect.ValueOf(&vv).Elem() - if !vvv.CanAddr() { - t.Fatalf("can not addr") - } - if err := setValueBySQLString(vvv, s); err != nil { - t.Fatalf("unexpected error: %v", err) - } - if !reflect.DeepEqual(v, vv) { - t.Fatalf("unequal, want:\n%s\ngot:\n%s", v, vv) - } - }) - - t.Run("JSONObject", func(t *testing.T) { - var ( - v jsonutils.JSONObject - wantV jsonutils.JSONObject - s = `{"i":100,"is":[200,201],"m":{"k 1":2,"k0":0},"s":"serializable s value","ss":["s0","s 1","s 2"]}` - err error - ) - - if wantV, err = jsonutils.ParseString(s); err != nil { - t.Fatalf("parse test json string: %v", err) - } - vv := reflect.ValueOf(&v).Elem() - if err := setValueBySQLString(vv, s); err != nil { - t.Fatalf("unexpected error: %v", err) - } - if !reflect.DeepEqual(wantV, v) { - t.Fatalf("unequal, want:\n%s\ngot:\n%s", v, vv) - } - }) -} - -func TestGetQuoteStringValue(t *testing.T) { - cases := []struct { - in interface{} - want string - }{ - { - in: 0, - want: "0", - }, - { - in: "abc", - want: "\"abc\"", - }, - { - in: "123\"34", - want: "\"123\\\"34\"", - }, - } - for _, c := range cases { - got := getQuoteStringValue(c.in) - if got != c.want { - t.Errorf("want %s got %s for %s", c.want, got, c.in) - } - } -} diff --git a/vendor/yunion.io/x/sqlchemy/sql.go b/vendor/yunion.io/x/sqlchemy/sql.go index a0f8bfb2d1..6a91dfc9f8 100644 --- a/vendor/yunion.io/x/sqlchemy/sql.go +++ b/vendor/yunion.io/x/sqlchemy/sql.go @@ -19,6 +19,7 @@ import ( "fmt" "yunion.io/x/log" + "yunion.io/x/pkg/errors" ) // DBName is a type of string for name of database @@ -58,8 +59,8 @@ func SetDBWithNameBackend(db *sql.DB, name DBName, backend DBBackendName) { } } -// Deprecated // GetDB get DB instance +// Deprecated func GetDB() *sql.DB { return GetDefaultDB().db } @@ -111,6 +112,7 @@ type tableName struct { } // GetTables get all tables' name in default database +// Deprecated func GetTables() []string { return GetDefaultDB().GetTables() } @@ -132,6 +134,7 @@ func (db *SDatabase) GetTables() []string { } // Exec execute a raw SQL query for the default db instance +// Deprecated func Exec(sql string, args ...interface{}) (sql.Result, error) { return GetDefaultDB().Exec(sql, args...) } @@ -140,3 +143,46 @@ func Exec(sql string, args ...interface{}) (sql.Result, error) { func (db *SDatabase) Exec(sql string, args ...interface{}) (sql.Result, error) { return db.db.Exec(sql, args...) } + +type SSqlResult struct { + Result sql.Result + Error error +} + +func (db *SDatabase) TxBatchExec(sqlstr string, varsList [][]interface{}) ([]SSqlResult, error) { + tx, err := db.db.Begin() + if err != nil { + return nil, errors.Wrap(err, "Begin transaction") + } + defer tx.Rollback() + stmt, err := tx.Prepare(sqlstr) + if err != nil { + return nil, errors.Wrapf(err, "Prepare sql %s", sqlstr) + } + defer stmt.Close() + + results := make([]SSqlResult, len(varsList)) + for i := range varsList { + vars := varsList[i] + result, err := stmt.Exec(vars...) + results[i] = SSqlResult{ + Result: result, + Error: err, + } + } + + err = tx.Commit() + if err != nil { + return nil, errors.Wrap(err, "Commit transaction") + } + + return results, nil +} + +func (db *SDatabase) TxExec(sqlstr string, vars ...interface{}) (sql.Result, error) { + results, err := db.TxBatchExec(sqlstr, [][]interface{}{vars}) + if err != nil { + return nil, errors.Wrap(err, "TxBatchExec") + } + return results[0].Result, results[0].Error +} diff --git a/vendor/yunion.io/x/sqlchemy/sqltest/main.go b/vendor/yunion.io/x/sqlchemy/sqltest/main.go deleted file mode 100644 index e1ac5a8987..0000000000 --- a/vendor/yunion.io/x/sqlchemy/sqltest/main.go +++ /dev/null @@ -1,267 +0,0 @@ -// Copyright 2019 Yunion -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package main - -import ( - "database/sql" - "fmt" - - "reflect" - "time" - - _ "github.com/go-sql-driver/mysql" - "github.com/golang-plus/uuid" - - "yunion.io/x/jsonutils" - "yunion.io/x/log" - "yunion.io/x/pkg/gotypes" - "yunion.io/x/pkg/util/timeutils" - - "yunion.io/x/sqlchemy" -) - -func uuid4() string { - uid, _ := uuid.NewV4() - return uid.String() -} - -func now() string { - return timeutils.MysqlTime(time.Time{}) -} - -// SCompondStruct is an example struct -type SCompondStruct struct { - Id string - Age int -} - -func (cs *SCompondStruct) IsZero() bool { - return len(cs.Id) == 0 && cs.Age == 0 -} - -func (cs *SCompondStruct) Equals(obj gotypes.ISerializable) bool { - comp, ok := obj.(*SCompondStruct) - if !ok { - return false - } - return cs.Age == comp.Age && cs.Id == comp.Id -} - -func (cs *SCompondStruct) String() string { - return jsonutils.Marshal(cs).String() -} - -func init() { - comp := SCompondStruct{} - compType := reflect.TypeOf(&comp) - gotypes.RegisterSerializable(compType, func() gotypes.ISerializable { - return &SCompondStruct{} - }) -} - -type TestTable struct { - Id string `primary:"true" width:"128" charset:"ascii" nullable:"false"` - Name string `width:"64" charset:"utf8" index:"true"` - Gender string `width:"10" charset:"ascii"` - Age uint8 `default:"18"` - Info jsonutils.JSONObject `nullable:"false"` - Compond *SCompondStruct `width:"1024"` - CreatedAt time.Time `nullable:"false" created_at:"true"` - UpdatedAt time.Time `nullable:"false" updated_at:"true"` - Version int `default:"0" nullable:"false" auto_version:"true"` - DeletedAt time.Time `` - Deleted bool `nullable:"false" default:"false"` - Notes string `width:"32" default:"default notes"` -} - -type Ticket struct { - Id int `auto_increment:"true"` - UserId string `width:"128" charset:"ascii" nullable:"false"` - Date time.Time `nullable:"false"` -} - -func (t *TestTable) BeforeInsert() { - t.Id = uuid4() - dict := jsonutils.NewDict() - dict.Add(jsonutils.NewString("Test"), "name") - t.Info = dict - t.Compond = &SCompondStruct{Id: "123456", Age: 24} -} - -func (t *Ticket) BeforeInsert() { - t.Date = time.Now().UTC() -} - -type AgentTable struct { - UserId string `primary:"true" width:"128" charset:"ascii"` - Age int -} - -func main() { - db, err := sql.Open("mysql", "testgo:openstack@tcp(127.0.0.1:3306)/testgo?charset=utf8&parseTime") - if err != nil { - panic(fmt.Sprintf("Open DB failed: %s", err)) - } - sqlchemy.SetDB(db) - defer sqlchemy.CloseDB() - - tablespec := sqlchemy.NewTableSpecFromStruct(TestTable{}, "testtable") - tablespec.Sync() - tablespec.CheckSync() - - agespec := sqlchemy.NewTableSpecFromStruct(AgentTable{}, "age_tbl") - agespec.Sync() - agespec.CheckSync() - - ticketSpec := sqlchemy.NewTableSpecFromStruct(Ticket{}, "ticket_tbl") - ticketSpec.Sync() - ticketSpec.CheckSync() - - t1 := tablespec.Instance() - t2 := agespec.Instance() - // t3 := ticketSpec.Instance() - q := t1.Query(t1.Field("id"), t2.Field("age")). - Join(t2, sqlchemy.AND(sqlchemy.Equals(t1.Field("id"), t2.Field("user_id")), sqlchemy.GE(t2.Field("age"), 20))). - Filter(sqlchemy.Like(t1.Field("Id"), "123%")). - Limit(10). - Asc(t2.Field("age")) - fmt.Println(q.String()) - fmt.Println(q.Variables()) - - subq := q.SubQuery() - - q2 := subq.Query().Desc("id") - fmt.Println(q2.String()) - fmt.Println(q2.Variables()) - - dt1 := TestTable{} - dt1.Name = "Test" - // dt1.Notes = "not null notes" - err = tablespec.Insert(&dt1) - if err != nil { - log.Errorf("Insert error: %s", err) - } - - fmt.Println("dt1 after insert: ", dt1) - - dt2 := Ticket{} - dt2.UserId = dt1.Id - err = ticketSpec.Insert(&dt2) - if err != nil { - log.Errorf("Insert ticket fail %s", err) - } - fmt.Println(dt2) - - count := q.Count() - fmt.Println("Count: ", count) - count = q2.Count() - fmt.Println("Count: ", count) - - q = t1.Query().Desc(t1.Field("created_at")).IsNotEmpty("info").IsNotNull("compond").Limit(10) - mapData, err := q.AllStringMap() - if err != nil { - log.Errorf("query first %s", err) - } else { - for _, v := range mapData { - fmt.Println(v) - } - } - - dt3 := TestTable{} - err = q.First(&dt3) - if err != nil { - log.Errorf("First error %s", err) - } else { - fmt.Println("Before update", dt3) - } - - /*session, err := tablespec.PrepareUpdate(dt3) - if err != nil { - log.Errorf("Fail to prepare update %s", err) - }else { - dt3.Name = "New name 4" - dt3.Compond = &SCompondStruct{Id:"998822333", Age: 80} - // dt3.Compond.Age = 80 - // dt3.Compond.Id = "998822333" - diff, err := session.SaveUpdate(dt3) - if err != nil { - log.Errorf("SaveUpdate fail %s", err) - }else { - log.Infof("Update difference: %s", sqlchemy.UpdateDiffString(diff)) - } - }*/ - - _, err = tablespec.Update(&dt3, func() error { - dt3.Name = "New name 4" - dt3.Age = 10 - dt3.Compond = &SCompondStruct{Id: "998822333", Age: 80} - return nil - }) - if err != nil { - log.Errorf("update fail %s", err) - } - - dt3.Age = 1 - target := TestTable{Id: dt3.Id} - err = tablespec.Increment(dt3, &target) - if err != nil { - log.Errorf("incremental faild %s", err) - } else { - log.Infof("Increment: %d %d", target.Age, dt3.Age) - } - - q = t1.Query().Equals("id", dt3.Id) - err = q.First(&dt3) - if err != nil { - log.Errorf("First error %s", err) - } else { - fmt.Println("After update: ", jsonutils.Marshal(dt3)) - } - - log.Infof("Start SQuery ALL") - - dt4 := make([]TestTable, 0) - err = q.GT("version", 0).All(&dt4) - if err != nil { - log.Errorf("query all fail %s", err) - } else { - log.Infof("SQuery all no error %d", len(dt4)) - for _, v := range dt4 { - fmt.Println("dt4 ", jsonutils.Marshal(v)) - } - } - - qId1 := t1.Query(t1.Field("id")) - t3 := ticketSpec.Instance() - qId2 := t3.Query(t3.Field("id")) - - { - union := sqlchemy.Union(qId1, qId2) - q := union.Limit(20).Offset(10).Query() - fmt.Println(q.String()) - - type sID struct { - Id string - } - idList := make([]sID, 0) - err := q.All(&idList) - if err != nil { - log.Errorf("fail to query idList %s", err) - } else { - log.Infof("Test: %s", jsonutils.Marshal(idList)) - } - } - -} diff --git a/vendor/yunion.io/x/sqlchemy/sync.go b/vendor/yunion.io/x/sqlchemy/sync.go index 4d761ba17d..aed468363c 100644 --- a/vendor/yunion.io/x/sqlchemy/sync.go +++ b/vendor/yunion.io/x/sqlchemy/sync.go @@ -162,7 +162,7 @@ func (ts *STableSpec) SyncSQL() []string { } return nil } - addIndexes, removeIndexes = diffIndexes(indexes, ts.indexes) + addIndexes, removeIndexes = diffIndexes(indexes, ts._indexes) } ret := make([]string, 0) @@ -185,7 +185,7 @@ func (ts *STableSpec) SyncSQL() []string { } alters := make([]string, 0) - remove, update, add := diffCols(ts.name, cols, ts.columns) + remove, update, add := diffCols(ts.name, cols, ts.Columns()) // first check if primary key is modifed changePrimary := false for _, col := range remove { @@ -251,7 +251,7 @@ func (ts *STableSpec) SyncSQL() []string { } if changePrimary { primaries := make([]string, 0) - for _, c := range ts.columns { + for _, c := range ts.Columns() { if c.IsPrimary() { primaries = append(primaries, fmt.Sprintf("`%s`", c.Name())) } diff --git a/vendor/yunion.io/x/sqlchemy/table.go b/vendor/yunion.io/x/sqlchemy/table.go index ec7a7db0b3..ffe303a172 100644 --- a/vendor/yunion.io/x/sqlchemy/table.go +++ b/vendor/yunion.io/x/sqlchemy/table.go @@ -78,11 +78,11 @@ type ITableSpec interface { // STableSpec defines the table specification, which implements ITableSpec type STableSpec struct { - structType reflect.Type - name string - columns []IColumnSpec - indexes []STableIndex - contraints []STableConstraint + structType reflect.Type + name string + _columns []IColumnSpec + _indexes []STableIndex + _contraints []STableConstraint sDBReferer } @@ -112,14 +112,13 @@ func NewTableSpecFromStructWithDBName(s interface{}, name string, dbName DBName) panic("expect Struct kind") } table := &STableSpec{ - columns: []IColumnSpec{}, name: name, structType: st, sDBReferer: sDBReferer{ dbName: dbName, }, } - table.struct2TableSpec(val) + // table.struct2TableSpec(val) return table } @@ -135,13 +134,14 @@ func (ts *STableSpec) Expression() string { // Clone makes a clone of a table, so we may create a new table of the same schema func (ts *STableSpec) Clone(name string, autoIncOffset int64) *STableSpec { - newCols := make([]IColumnSpec, len(ts.columns)) + columns := ts.Columns() + newCols := make([]IColumnSpec, len(columns)) for i := range newCols { - col := ts.columns[i] + col := columns[i] if col.IsAutoIncrement() { - colValue := reflect.ValueOf(col).Elem() - newColValue := reflect.New(colValue.Type()).Elem() - reflect.Copy(newColValue, colValue) + colValue := reflect.Indirect(reflect.ValueOf(col)) + newColValue := reflect.Indirect(reflect.New(colValue.Type())) + newColValue.Set(colValue) newCol := newColValue.Addr().Interface().(IColumnSpec) newCol.SetAutoIncrementOffset(autoIncOffset) newCols[i] = newCol @@ -150,26 +150,31 @@ func (ts *STableSpec) Clone(name string, autoIncOffset int64) *STableSpec { } } return &STableSpec{ - structType: ts.structType, - name: name, - columns: newCols, - indexes: ts.indexes, - contraints: ts.contraints, - sDBReferer: ts.sDBReferer, + structType: ts.structType, + name: name, + _columns: newCols, + _indexes: ts._indexes, + _contraints: ts._contraints, + sDBReferer: ts.sDBReferer, } } // Columns implementation of STableSpec for ITableSpec func (ts *STableSpec) Columns() []IColumnSpec { - return ts.columns + if ts._columns == nil { + val := reflect.Indirect(reflect.New(ts.structType)) + ts.struct2TableSpec(val) + } + return ts._columns } // PrimaryColumns implementation of STableSpec for ITableSpec func (ts *STableSpec) PrimaryColumns() []IColumnSpec { ret := make([]IColumnSpec, 0) - for i := range ts.columns { - if ts.columns[i].IsPrimary() { - ret = append(ret, ts.columns[i]) + columns := ts.Columns() + for i := range columns { + if columns[i].IsPrimary() { + ret = append(ret, columns[i]) } } return ret diff --git a/vendor/yunion.io/x/sqlchemy/template_test.go b/vendor/yunion.io/x/sqlchemy/template_test.go deleted file mode 100644 index c68e7fc1a0..0000000000 --- a/vendor/yunion.io/x/sqlchemy/template_test.go +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright 2019 Yunion -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package sqlchemy - -import "testing" - -func TestTemplateEvel(t *testing.T) { - cases := []struct { - In string - Var interface{} - Want string - }{ - { - In: "DROP INDEX `{{ .Index }}` ON `{{ .Table }}`", - Var: struct { - Table string - Index string - }{ - Table: "testtable", - Index: "ix_testtable_name", - }, - Want: "DROP INDEX `ix_testtable_name` ON `testtable`", - }, - { - In: "DROP INDEX `{{ .Table }}`.`{{ .Index }}`", - Var: struct { - Table string - Index string - }{ - Table: "testtable", - Index: "ix_testtable_name", - }, - Want: "DROP INDEX `testtable`.`ix_testtable_name`", - }, - } - for _, c := range cases { - got := templateEval(c.In, c.Var) - if got != c.Want { - t.Errorf("want: %s != got: %s", c.Want, got) - } - } -} diff --git a/vendor/yunion.io/x/sqlchemy/update.go b/vendor/yunion.io/x/sqlchemy/update.go index 64bc1060f1..356dad3199 100644 --- a/vendor/yunion.io/x/sqlchemy/update.go +++ b/vendor/yunion.io/x/sqlchemy/update.go @@ -20,6 +20,8 @@ import ( "reflect" "strings" + "yunion.io/x/pkg/util/timeutils" + "yunion.io/x/jsonutils" "yunion.io/x/log" "yunion.io/x/pkg/errors" @@ -42,7 +44,7 @@ func (ts *STableSpec) prepareUpdate(dt interface{}) (*SUpdateSession, error) { fields := reflectutils.FetchStructFieldValueSet(dataValue) // fetchStructFieldNameValue(dataType, dataValue) zeroPrimary := make([]string, 0) - for _, c := range ts.columns { + for _, c := range ts.Columns() { k := c.Name() ov, ok := fields.GetInterface(k) if !ok { @@ -96,12 +98,21 @@ func (uds UpdateDiffs) String() string { return obj.String() } -func (us *SUpdateSession) saveUpdate(dt interface{}) (UpdateDiffs, error) { +type sUpdateSQLResult struct { + sql string + vars []interface{} + setters UpdateDiffs + primaries map[string]interface{} +} + +func (us *SUpdateSession) saveUpdateSql(dt interface{}) (*sUpdateSQLResult, error) { beforeUpdateFunc := reflect.ValueOf(dt).MethodByName("BeforeUpdate") if beforeUpdateFunc.IsValid() && !beforeUpdateFunc.IsNil() { beforeUpdateFunc.Call([]reflect.Value{}) } + now := timeutils.UtcNow() + // dataType := reflect.TypeOf(dt).Elem() dataValue := reflect.ValueOf(dt).Elem() ofields := reflectutils.FetchStructFieldValueSet(us.oValue) @@ -111,7 +122,7 @@ func (us *SUpdateSession) saveUpdate(dt interface{}) (UpdateDiffs, error) { updatedFields := make([]string, 0) primaries := make(map[string]interface{}) setters := UpdateDiffs{} - for _, c := range us.tableSpec.columns { + for _, c := range us.tableSpec.Columns() { k := c.Name() of, _ := ofields.GetInterface(k) nf, _ := fields.GetInterface(k) @@ -146,6 +157,10 @@ func (us *SUpdateSession) saveUpdate(dt interface{}) (UpdateDiffs, error) { return nil, ErrNoDataToUpdate } + if len(primaries) == 0 { + return nil, ErrEmptyPrimaryKey + } + vars := make([]interface{}, 0) var buf bytes.Buffer buf.WriteString(fmt.Sprintf("UPDATE `%s` SET ", us.tableSpec.name)) @@ -167,13 +182,11 @@ func (us *SUpdateSession) saveUpdate(dt interface{}) (UpdateDiffs, error) { buf.WriteString(fmt.Sprintf(", `%s` = `%s` + 1", versionField, versionField)) } for _, updatedField := range updatedFields { - buf.WriteString(fmt.Sprintf(", `%s` = %s", updatedField, us.tableSpec.Database().backend.CurrentUTCTimeStampString())) + buf.WriteString(fmt.Sprintf(", `%s` = ?", updatedField)) + vars = append(vars, now) } buf.WriteString(" WHERE ") first = true - if len(primaries) == 0 { - return nil, ErrEmptyPrimaryKey - } for k, v := range primaries { if first { first = false @@ -187,26 +200,53 @@ func (us *SUpdateSession) saveUpdate(dt interface{}) (UpdateDiffs, error) { if DEBUG_SQLCHEMY { log.Infof("Update: %s %s", buf.String(), vars) } - results, err := us.tableSpec.Database().Exec(buf.String(), vars...) + + return &sUpdateSQLResult{ + sql: buf.String(), + vars: vars, + setters: setters, + primaries: primaries, + }, nil +} + +func (us *SUpdateSession) saveUpdate(dt interface{}) (UpdateDiffs, error) { + sqlResult, err := us.saveUpdateSql(dt) if err != nil { - return nil, err + return nil, errors.Wrap(err, "saveUpateSql") } - aCnt, err := results.RowsAffected() + + err = us.tableSpec.execUpdateSql(dt, sqlResult) if err != nil { - return nil, err + return nil, errors.Wrap(err, "execUpdateSql") } - if aCnt > 1 { - return nil, errors.Wrapf(ErrUnexpectRowCount, "affected rows %d != 1", aCnt) + + return sqlResult.setters, nil +} + +func (ts *STableSpec) execUpdateSql(dt interface{}, result *sUpdateSQLResult) error { + results, err := ts.Database().TxExec(result.sql, result.vars...) + if err != nil { + return errors.Wrap(err, "TxExec") } - q := us.tableSpec.Query() - for k, v := range primaries { + + if ts.Database().backend.CanSupportRowAffected() { + aCnt, err := results.RowsAffected() + if err != nil { + return errors.Wrap(err, "results.RowsAffected") + } + if aCnt > 1 { + return errors.Wrapf(ErrUnexpectRowCount, "affected rows %d != 1", aCnt) + } + } + q := ts.Query() + for k, v := range result.primaries { q = q.Equals(k, v) } err = q.First(dt) if err != nil { - return nil, errors.Wrap(err, "query after update failed") + return errors.Wrap(err, "query after update failed") } - return setters, nil + return nil } // Update method of STableSpec updates a record of a table, @@ -218,19 +258,19 @@ func (ts *STableSpec) Update(dt interface{}, doUpdate func() error) (UpdateDiffs } session, err := ts.prepareUpdate(dt) if err != nil { - return nil, err + return nil, errors.Wrap(err, "prepareUpdate") } err = doUpdate() if err != nil { - return nil, err + return nil, errors.Wrap(err, "") } uds, err := session.saveUpdate(dt) - if err == ErrNoDataToUpdate { + if err != nil && errors.Cause(err) == ErrNoDataToUpdate { return nil, nil } else if err == nil { if DEBUG_SQLCHEMY { log.Debugf("Update diff: %s", uds) } } - return uds, err + return uds, errors.Wrap(err, "saveUpdate") }