From 4d06f86e62723cfa4fc7ef436c6f3b0de42a05f3 Mon Sep 17 00:00:00 2001 From: jxxghp Date: Tue, 6 Jun 2023 07:15:17 +0800 Subject: [PATCH] init --- .github/workflows/build-docker.yml | 47 + .gitignore | 5 + alembic/__pycache__/env.cpython-310.pyc | Bin 0 -> 1826 bytes alembic/env.py | 80 ++ alembic/script.py.mako | 24 + app/__init__.py | 0 app/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 150 bytes app/__pycache__/log.cpython-310.pyc | Bin 0 -> 715 bytes app/__pycache__/main.cpython-310.pyc | Bin 0 -> 1145 bytes app/__pycache__/scheduler.cpython-310.pyc | Bin 0 -> 2051 bytes app/api/__init__.py | 0 app/api/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 154 bytes app/api/__pycache__/apiv1.cpython-310.pyc | Bin 0 -> 659 bytes app/api/apiv1.py | 12 + app/api/endpoints/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 164 bytes .../__pycache__/login.cpython-310.pyc | Bin 0 -> 1339 bytes .../__pycache__/media.cpython-310.pyc | Bin 0 -> 887 bytes .../__pycache__/messages.cpython-310.pyc | Bin 0 -> 1763 bytes .../__pycache__/sites.cpython-310.pyc | Bin 0 -> 1359 bytes .../__pycache__/subscribes.cpython-310.pyc | Bin 0 -> 2800 bytes .../__pycache__/users.cpython-310.pyc | Bin 0 -> 1901 bytes .../__pycache__/webhooks.cpython-310.pyc | Bin 0 -> 999 bytes app/api/endpoints/login.py | 38 + app/api/endpoints/media.py | 25 + app/api/endpoints/messages.py | 51 + app/api/endpoints/sites.py | 43 + app/api/endpoints/subscribes.py | 90 ++ app/api/endpoints/users.py | 74 ++ app/api/endpoints/webhooks.py | 27 + app/chain/__init__.py | 58 ++ .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 2211 bytes app/chain/__pycache__/common.cpython-310.pyc | Bin 0 -> 9792 bytes .../__pycache__/cookiecloud.cpython-310.pyc | Bin 0 -> 1892 bytes .../__pycache__/douban_sync.cpython-310.pyc | Bin 0 -> 3151 bytes .../__pycache__/identify.cpython-310.pyc | Bin 0 -> 1312 bytes app/chain/__pycache__/search.cpython-310.pyc | Bin 0 -> 2398 bytes .../__pycache__/subscribe.cpython-310.pyc | Bin 0 -> 5504 bytes .../__pycache__/user_message.cpython-310.pyc | Bin 0 -> 5721 bytes .../webhook_message.cpython-310.pyc | Bin 0 -> 840 bytes app/chain/common.py | 383 +++++++ app/chain/cookiecloud.py | 55 + app/chain/douban_sync.py | 100 ++ app/chain/identify.py | 33 + app/chain/search.py | 73 ++ app/chain/subscribe.py | 195 ++++ app/chain/user_message.py | 266 +++++ app/chain/webhook_message.py | 20 + app/command.py | 95 ++ app/core/__init__.py | 6 + app/core/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 494 bytes app/core/__pycache__/config.cpython-310.pyc | Bin 0 -> 4668 bytes app/core/__pycache__/context.cpython-310.pyc | Bin 0 -> 11268 bytes .../__pycache__/event_manager.cpython-310.pyc | Bin 0 -> 3110 bytes .../__pycache__/meta_info.cpython-310.pyc | Bin 0 -> 1345 bytes .../module_manager.cpython-310.pyc | Bin 0 -> 2445 bytes .../plugin_manager.cpython-310.pyc | Bin 0 -> 8177 bytes app/core/__pycache__/security.cpython-310.pyc | Bin 0 -> 1740 bytes app/core/config.py | 182 ++++ app/core/context.py | 421 ++++++++ app/core/event_manager.py | 105 ++ app/core/meta/__init__.py | 3 + .../meta/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 287 bytes .../__pycache__/metaanime.cpython-310.pyc | Bin 0 -> 5100 bytes .../meta/__pycache__/metabase.cpython-310.pyc | Bin 0 -> 10451 bytes .../__pycache__/metavideo.cpython-310.pyc | Bin 0 -> 12485 bytes .../release_groups.cpython-310.pyc | Bin 0 -> 4081 bytes app/core/meta/metaanime.py | 218 ++++ app/core/meta/metabase.py | 427 ++++++++ app/core/meta/metavideo.py | 557 +++++++++++ app/core/meta/release_groups.py | 111 ++ app/core/meta_info.py | 43 + app/core/module_manager.py | 72 ++ app/core/plugin_manager.py | 302 ++++++ app/core/security.py | 49 + app/db/__init__.py | 29 + app/db/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 797 bytes app/db/__pycache__/init.cpython-310.pyc | Bin 0 -> 1441 bytes app/db/__pycache__/sites.cpython-310.pyc | Bin 0 -> 1985 bytes app/db/__pycache__/subscribes.cpython-310.pyc | Bin 0 -> 2458 bytes .../__pycache__/systemconfigs.cpython-310.pyc | Bin 0 -> 1852 bytes app/db/__pycache__/userauth.cpython-310.pyc | Bin 0 -> 1578 bytes app/db/init.py | 42 + app/db/models/__init__.py | 42 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 2039 bytes .../models/__pycache__/site.cpython-310.pyc | Bin 0 -> 1213 bytes .../__pycache__/subscribe.cpython-310.pyc | Bin 0 -> 1468 bytes .../__pycache__/systemconfig.cpython-310.pyc | Bin 0 -> 1091 bytes .../models/__pycache__/user.cpython-310.pyc | Bin 0 -> 1335 bytes app/db/models/site.py | 28 + app/db/models/subscribe.py | 36 + app/db/models/systemconfig.py | 19 + app/db/models/user.py | 27 + app/db/sites.py | 56 ++ app/db/subscribes.py | 76 ++ app/db/systemconfigs.py | 58 ++ app/db/userauth.py | 46 + app/helper/__init__.py | 1 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 200 bytes .../__pycache__/cookiecloud.cpython-310.pyc | Bin 0 -> 2315 bytes app/helper/__pycache__/module.cpython-310.pyc | Bin 0 -> 1264 bytes app/helper/__pycache__/rss.cpython-310.pyc | Bin 0 -> 2008 bytes .../__pycache__/torrent.cpython-310.pyc | Bin 0 -> 6648 bytes app/helper/cookiecloud.py | 68 ++ app/helper/module.py | 33 + app/helper/rss.py | 81 ++ app/helper/sites.cp310-win_amd64.pyd | Bin 0 -> 52224 bytes app/helper/torrent.py | 218 ++++ app/log.py | 29 + app/main.py | 48 + app/modules/__init__.py | 200 ++++ .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 8125 bytes app/modules/douban/__init__.py | 115 +++ .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 3460 bytes .../douban/__pycache__/apiv2.cpython-310.pyc | Bin 0 -> 10003 bytes app/modules/douban/apiv2.py | 260 +++++ app/modules/emby/__init__.py | 69 ++ .../emby/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 2731 bytes .../emby/__pycache__/emby.cpython-310.pyc | Bin 0 -> 14499 bytes app/modules/emby/emby.py | 484 +++++++++ app/modules/fanart/__init__.py | 74 ++ .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 3180 bytes app/modules/filetransfer/__init__.py | 22 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 1183 bytes app/modules/filter/__init__.py | 20 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 1208 bytes app/modules/indexer/__init__.py | 154 +++ .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 5182 bytes .../__pycache__/spider.cpython-310.pyc | Bin 0 -> 14971 bytes .../indexer/__pycache__/tnode.cpython-310.pyc | Bin 0 -> 3305 bytes .../__pycache__/torrentleech.cpython-310.pyc | Bin 0 -> 2361 bytes app/modules/indexer/spider.py | 640 ++++++++++++ app/modules/indexer/tnode.py | 105 ++ app/modules/indexer/torrentleech.py | 64 ++ app/modules/jellyfin/__init__.py | 68 ++ .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 2775 bytes .../__pycache__/jellyfin.cpython-310.pyc | Bin 0 -> 10329 bytes app/modules/jellyfin/jellyfin.py | 337 +++++++ app/modules/plex/__init__.py | 68 ++ .../plex/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 2699 bytes .../plex/__pycache__/plex.cpython-310.pyc | Bin 0 -> 9192 bytes app/modules/plex/plex.py | 293 ++++++ app/modules/qbittorrent/__init__.py | 75 ++ .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 2614 bytes .../__pycache__/qbittorrent.cpython-310.pyc | Bin 0 -> 9512 bytes app/modules/qbittorrent/qbittorrent.py | 325 ++++++ app/modules/telegram/__init__.py | 111 ++ .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 3505 bytes .../__pycache__/telegram.cpython-310.pyc | Bin 0 -> 5888 bytes app/modules/telegram/telegram.py | 194 ++++ app/modules/themoviedb/__init__.py | 149 +++ .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 4063 bytes .../__pycache__/category.cpython-310.pyc | Bin 0 -> 4168 bytes .../__pycache__/tmdb.cpython-310.pyc | Bin 0 -> 15935 bytes .../__pycache__/tmdb_cache.cpython-310.pyc | Bin 0 -> 6991 bytes app/modules/themoviedb/category.py | 128 +++ app/modules/themoviedb/tmdb.py | 895 +++++++++++++++++ app/modules/themoviedb/tmdb_cache.py | 235 +++++ app/modules/transmission/__init__.py | 70 ++ .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 2404 bytes .../__pycache__/transmission.cpython-310.pyc | Bin 0 -> 8448 bytes app/modules/transmission/transmission.py | 282 ++++++ app/modules/wechat/WXBizMsgCrypt3.py | 300 ++++++ app/modules/wechat/__init__.py | 144 +++ .../WXBizMsgCrypt3.cpython-310.pyc | Bin 0 -> 8476 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 4523 bytes .../wechat/__pycache__/wechat.cpython-310.pyc | Bin 0 -> 5828 bytes app/modules/wechat/wechat.py | 216 ++++ app/plugins/__init__.py | 104 ++ .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 3552 bytes app/scheduler.py | 66 ++ app/schemas/__init__.py | 6 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 466 bytes .../__pycache__/context.cpython-310.pyc | Bin 0 -> 2006 bytes .../__pycache__/response.cpython-310.pyc | Bin 0 -> 482 bytes app/schemas/__pycache__/site.cpython-310.pyc | Bin 0 -> 971 bytes .../__pycache__/subscribe.cpython-310.pyc | Bin 0 -> 965 bytes app/schemas/__pycache__/token.cpython-310.pyc | Bin 0 -> 645 bytes app/schemas/__pycache__/user.cpython-310.pyc | Bin 0 -> 1612 bytes app/schemas/context.py | 86 ++ app/schemas/response.py | 8 + app/schemas/site.py | 23 + app/schemas/subscribe.py | 26 + app/schemas/token.py | 12 + app/schemas/user.py | 42 + app/utils/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 156 bytes app/utils/__pycache__/dom.cpython-310.pyc | Bin 0 -> 1120 bytes app/utils/__pycache__/http.cpython-310.pyc | Bin 0 -> 3779 bytes app/utils/__pycache__/object.cpython-310.pyc | Bin 0 -> 597 bytes .../__pycache__/singleton.cpython-310.pyc | Bin 0 -> 897 bytes app/utils/__pycache__/string.cpython-310.pyc | Bin 0 -> 14417 bytes app/utils/__pycache__/timer.cpython-310.pyc | Bin 0 -> 1359 bytes app/utils/__pycache__/tokens.cpython-310.pyc | Bin 0 -> 1367 bytes app/utils/__pycache__/types.cpython-310.pyc | Bin 0 -> 803 bytes app/utils/dom.py | 33 + app/utils/http.py | 172 ++++ app/utils/object.py | 11 + app/utils/singleton.py | 20 + app/utils/string.py | 514 ++++++++++ app/utils/system.py | 85 ++ app/utils/timer.py | 39 + app/utils/tokens.py | 38 + app/utils/types.py | 21 + config/category.yaml | 213 ++++ config/logs/nasbot.log | 16 + config/sites/user.sites.bin | 1 + config/user.db | Bin 0 -> 73728 bytes docker/Dockerfile | 55 + requirements.txt | 32 + setup.py | 20 + tests/__init__.py | 0 tests/cases/__init__.py | 0 tests/cases/meta.py | 945 ++++++++++++++++++ tests/run.py | 12 + tests/test_metainfo.py | 34 + version.py | 1 + 217 files changed, 13959 insertions(+) create mode 100644 .github/workflows/build-docker.yml create mode 100644 .gitignore create mode 100644 alembic/__pycache__/env.cpython-310.pyc create mode 100644 alembic/env.py create mode 100644 alembic/script.py.mako create mode 100644 app/__init__.py create mode 100644 app/__pycache__/__init__.cpython-310.pyc create mode 100644 app/__pycache__/log.cpython-310.pyc create mode 100644 app/__pycache__/main.cpython-310.pyc create mode 100644 app/__pycache__/scheduler.cpython-310.pyc create mode 100644 app/api/__init__.py create mode 100644 app/api/__pycache__/__init__.cpython-310.pyc create mode 100644 app/api/__pycache__/apiv1.cpython-310.pyc create mode 100644 app/api/apiv1.py create mode 100644 app/api/endpoints/__init__.py create mode 100644 app/api/endpoints/__pycache__/__init__.cpython-310.pyc create mode 100644 app/api/endpoints/__pycache__/login.cpython-310.pyc create mode 100644 app/api/endpoints/__pycache__/media.cpython-310.pyc create mode 100644 app/api/endpoints/__pycache__/messages.cpython-310.pyc create mode 100644 app/api/endpoints/__pycache__/sites.cpython-310.pyc create mode 100644 app/api/endpoints/__pycache__/subscribes.cpython-310.pyc create mode 100644 app/api/endpoints/__pycache__/users.cpython-310.pyc create mode 100644 app/api/endpoints/__pycache__/webhooks.cpython-310.pyc create mode 100644 app/api/endpoints/login.py create mode 100644 app/api/endpoints/media.py create mode 100644 app/api/endpoints/messages.py create mode 100644 app/api/endpoints/sites.py create mode 100644 app/api/endpoints/subscribes.py create mode 100644 app/api/endpoints/users.py create mode 100644 app/api/endpoints/webhooks.py create mode 100644 app/chain/__init__.py create mode 100644 app/chain/__pycache__/__init__.cpython-310.pyc create mode 100644 app/chain/__pycache__/common.cpython-310.pyc create mode 100644 app/chain/__pycache__/cookiecloud.cpython-310.pyc create mode 100644 app/chain/__pycache__/douban_sync.cpython-310.pyc create mode 100644 app/chain/__pycache__/identify.cpython-310.pyc create mode 100644 app/chain/__pycache__/search.cpython-310.pyc create mode 100644 app/chain/__pycache__/subscribe.cpython-310.pyc create mode 100644 app/chain/__pycache__/user_message.cpython-310.pyc create mode 100644 app/chain/__pycache__/webhook_message.cpython-310.pyc create mode 100644 app/chain/common.py create mode 100644 app/chain/cookiecloud.py create mode 100644 app/chain/douban_sync.py create mode 100644 app/chain/identify.py create mode 100644 app/chain/search.py create mode 100644 app/chain/subscribe.py create mode 100644 app/chain/user_message.py create mode 100644 app/chain/webhook_message.py create mode 100644 app/command.py create mode 100644 app/core/__init__.py create mode 100644 app/core/__pycache__/__init__.cpython-310.pyc create mode 100644 app/core/__pycache__/config.cpython-310.pyc create mode 100644 app/core/__pycache__/context.cpython-310.pyc create mode 100644 app/core/__pycache__/event_manager.cpython-310.pyc create mode 100644 app/core/__pycache__/meta_info.cpython-310.pyc create mode 100644 app/core/__pycache__/module_manager.cpython-310.pyc create mode 100644 app/core/__pycache__/plugin_manager.cpython-310.pyc create mode 100644 app/core/__pycache__/security.cpython-310.pyc create mode 100644 app/core/config.py create mode 100644 app/core/context.py create mode 100644 app/core/event_manager.py create mode 100644 app/core/meta/__init__.py create mode 100644 app/core/meta/__pycache__/__init__.cpython-310.pyc create mode 100644 app/core/meta/__pycache__/metaanime.cpython-310.pyc create mode 100644 app/core/meta/__pycache__/metabase.cpython-310.pyc create mode 100644 app/core/meta/__pycache__/metavideo.cpython-310.pyc create mode 100644 app/core/meta/__pycache__/release_groups.cpython-310.pyc create mode 100644 app/core/meta/metaanime.py create mode 100644 app/core/meta/metabase.py create mode 100644 app/core/meta/metavideo.py create mode 100644 app/core/meta/release_groups.py create mode 100644 app/core/meta_info.py create mode 100644 app/core/module_manager.py create mode 100644 app/core/plugin_manager.py create mode 100644 app/core/security.py create mode 100644 app/db/__init__.py create mode 100644 app/db/__pycache__/__init__.cpython-310.pyc create mode 100644 app/db/__pycache__/init.cpython-310.pyc create mode 100644 app/db/__pycache__/sites.cpython-310.pyc create mode 100644 app/db/__pycache__/subscribes.cpython-310.pyc create mode 100644 app/db/__pycache__/systemconfigs.cpython-310.pyc create mode 100644 app/db/__pycache__/userauth.cpython-310.pyc create mode 100644 app/db/init.py create mode 100644 app/db/models/__init__.py create mode 100644 app/db/models/__pycache__/__init__.cpython-310.pyc create mode 100644 app/db/models/__pycache__/site.cpython-310.pyc create mode 100644 app/db/models/__pycache__/subscribe.cpython-310.pyc create mode 100644 app/db/models/__pycache__/systemconfig.cpython-310.pyc create mode 100644 app/db/models/__pycache__/user.cpython-310.pyc create mode 100644 app/db/models/site.py create mode 100644 app/db/models/subscribe.py create mode 100644 app/db/models/systemconfig.py create mode 100644 app/db/models/user.py create mode 100644 app/db/sites.py create mode 100644 app/db/subscribes.py create mode 100644 app/db/systemconfigs.py create mode 100644 app/db/userauth.py create mode 100644 app/helper/__init__.py create mode 100644 app/helper/__pycache__/__init__.cpython-310.pyc create mode 100644 app/helper/__pycache__/cookiecloud.cpython-310.pyc create mode 100644 app/helper/__pycache__/module.cpython-310.pyc create mode 100644 app/helper/__pycache__/rss.cpython-310.pyc create mode 100644 app/helper/__pycache__/torrent.cpython-310.pyc create mode 100644 app/helper/cookiecloud.py create mode 100644 app/helper/module.py create mode 100644 app/helper/rss.py create mode 100644 app/helper/sites.cp310-win_amd64.pyd create mode 100644 app/helper/torrent.py create mode 100644 app/log.py create mode 100644 app/main.py create mode 100644 app/modules/__init__.py create mode 100644 app/modules/__pycache__/__init__.cpython-310.pyc create mode 100644 app/modules/douban/__init__.py create mode 100644 app/modules/douban/__pycache__/__init__.cpython-310.pyc create mode 100644 app/modules/douban/__pycache__/apiv2.cpython-310.pyc create mode 100644 app/modules/douban/apiv2.py create mode 100644 app/modules/emby/__init__.py create mode 100644 app/modules/emby/__pycache__/__init__.cpython-310.pyc create mode 100644 app/modules/emby/__pycache__/emby.cpython-310.pyc create mode 100644 app/modules/emby/emby.py create mode 100644 app/modules/fanart/__init__.py create mode 100644 app/modules/fanart/__pycache__/__init__.cpython-310.pyc create mode 100644 app/modules/filetransfer/__init__.py create mode 100644 app/modules/filetransfer/__pycache__/__init__.cpython-310.pyc create mode 100644 app/modules/filter/__init__.py create mode 100644 app/modules/filter/__pycache__/__init__.cpython-310.pyc create mode 100644 app/modules/indexer/__init__.py create mode 100644 app/modules/indexer/__pycache__/__init__.cpython-310.pyc create mode 100644 app/modules/indexer/__pycache__/spider.cpython-310.pyc create mode 100644 app/modules/indexer/__pycache__/tnode.cpython-310.pyc create mode 100644 app/modules/indexer/__pycache__/torrentleech.cpython-310.pyc create mode 100644 app/modules/indexer/spider.py create mode 100644 app/modules/indexer/tnode.py create mode 100644 app/modules/indexer/torrentleech.py create mode 100644 app/modules/jellyfin/__init__.py create mode 100644 app/modules/jellyfin/__pycache__/__init__.cpython-310.pyc create mode 100644 app/modules/jellyfin/__pycache__/jellyfin.cpython-310.pyc create mode 100644 app/modules/jellyfin/jellyfin.py create mode 100644 app/modules/plex/__init__.py create mode 100644 app/modules/plex/__pycache__/__init__.cpython-310.pyc create mode 100644 app/modules/plex/__pycache__/plex.cpython-310.pyc create mode 100644 app/modules/plex/plex.py create mode 100644 app/modules/qbittorrent/__init__.py create mode 100644 app/modules/qbittorrent/__pycache__/__init__.cpython-310.pyc create mode 100644 app/modules/qbittorrent/__pycache__/qbittorrent.cpython-310.pyc create mode 100644 app/modules/qbittorrent/qbittorrent.py create mode 100644 app/modules/telegram/__init__.py create mode 100644 app/modules/telegram/__pycache__/__init__.cpython-310.pyc create mode 100644 app/modules/telegram/__pycache__/telegram.cpython-310.pyc create mode 100644 app/modules/telegram/telegram.py create mode 100644 app/modules/themoviedb/__init__.py create mode 100644 app/modules/themoviedb/__pycache__/__init__.cpython-310.pyc create mode 100644 app/modules/themoviedb/__pycache__/category.cpython-310.pyc create mode 100644 app/modules/themoviedb/__pycache__/tmdb.cpython-310.pyc create mode 100644 app/modules/themoviedb/__pycache__/tmdb_cache.cpython-310.pyc create mode 100644 app/modules/themoviedb/category.py create mode 100644 app/modules/themoviedb/tmdb.py create mode 100644 app/modules/themoviedb/tmdb_cache.py create mode 100644 app/modules/transmission/__init__.py create mode 100644 app/modules/transmission/__pycache__/__init__.cpython-310.pyc create mode 100644 app/modules/transmission/__pycache__/transmission.cpython-310.pyc create mode 100644 app/modules/transmission/transmission.py create mode 100644 app/modules/wechat/WXBizMsgCrypt3.py create mode 100644 app/modules/wechat/__init__.py create mode 100644 app/modules/wechat/__pycache__/WXBizMsgCrypt3.cpython-310.pyc create mode 100644 app/modules/wechat/__pycache__/__init__.cpython-310.pyc create mode 100644 app/modules/wechat/__pycache__/wechat.cpython-310.pyc create mode 100644 app/modules/wechat/wechat.py create mode 100644 app/plugins/__init__.py create mode 100644 app/plugins/__pycache__/__init__.cpython-310.pyc create mode 100644 app/scheduler.py create mode 100644 app/schemas/__init__.py create mode 100644 app/schemas/__pycache__/__init__.cpython-310.pyc create mode 100644 app/schemas/__pycache__/context.cpython-310.pyc create mode 100644 app/schemas/__pycache__/response.cpython-310.pyc create mode 100644 app/schemas/__pycache__/site.cpython-310.pyc create mode 100644 app/schemas/__pycache__/subscribe.cpython-310.pyc create mode 100644 app/schemas/__pycache__/token.cpython-310.pyc create mode 100644 app/schemas/__pycache__/user.cpython-310.pyc create mode 100644 app/schemas/context.py create mode 100644 app/schemas/response.py create mode 100644 app/schemas/site.py create mode 100644 app/schemas/subscribe.py create mode 100644 app/schemas/token.py create mode 100644 app/schemas/user.py create mode 100644 app/utils/__init__.py create mode 100644 app/utils/__pycache__/__init__.cpython-310.pyc create mode 100644 app/utils/__pycache__/dom.cpython-310.pyc create mode 100644 app/utils/__pycache__/http.cpython-310.pyc create mode 100644 app/utils/__pycache__/object.cpython-310.pyc create mode 100644 app/utils/__pycache__/singleton.cpython-310.pyc create mode 100644 app/utils/__pycache__/string.cpython-310.pyc create mode 100644 app/utils/__pycache__/timer.cpython-310.pyc create mode 100644 app/utils/__pycache__/tokens.cpython-310.pyc create mode 100644 app/utils/__pycache__/types.cpython-310.pyc create mode 100644 app/utils/dom.py create mode 100644 app/utils/http.py create mode 100644 app/utils/object.py create mode 100644 app/utils/singleton.py create mode 100644 app/utils/string.py create mode 100644 app/utils/system.py create mode 100644 app/utils/timer.py create mode 100644 app/utils/tokens.py create mode 100644 app/utils/types.py create mode 100644 config/category.yaml create mode 100644 config/logs/nasbot.log create mode 100644 config/sites/user.sites.bin create mode 100644 config/user.db create mode 100644 docker/Dockerfile create mode 100644 requirements.txt create mode 100644 setup.py create mode 100644 tests/__init__.py create mode 100644 tests/cases/__init__.py create mode 100644 tests/cases/meta.py create mode 100644 tests/run.py create mode 100644 tests/test_metainfo.py create mode 100644 version.py diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml new file mode 100644 index 00000000..7c598914 --- /dev/null +++ b/.github/workflows/build-docker.yml @@ -0,0 +1,47 @@ +name: NASbot Docker +on: + workflow_dispatch: + +jobs: + build: + runs-on: ubuntu-latest + name: Build Docker Image + steps: + - + name: Checkout + uses: actions/checkout@master + + - + name: Release version + id: release_version + run: | + app_version=$(cat version.py |sed -ne "s/APP_VERSION\s=\s'v\(.*\)'/\1/gp") + echo "app_version=$app_version" >> $GITHUB_ENV + + - + name: Set Up QEMU + uses: docker/setup-qemu-action@v1 + + - + name: Set Up Buildx + uses: docker/setup-buildx-action@v1 + + - + name: Login DockerHub + uses: docker/login-action@v1 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + + - + name: Build Image + uses: docker/build-push-action@v2 + with: + context: . + file: docker/Dockerfile + platforms: | + linux/amd64 + push: true + tags: | + ${{ secrets.DOCKER_USERNAME }}/nasbot:latest + ${{ secrets.DOCKER_USERNAME }}/nasbot:${{ env.app_version }} diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..cbe96b30 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +.idea/ +*.c +build/ +test.py +app/helper/sites.py \ No newline at end of file diff --git a/alembic/__pycache__/env.cpython-310.pyc b/alembic/__pycache__/env.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f36a93b2bea0d66245f58d7174f85e3d5c84e8f8 GIT binary patch literal 1826 zcmZux-EJc_6dun^Cdnjex`nN@5-iqAs2eSc;0lBgVp~93394#;1VoWW&e%yDJf2{C z`m<`eDK|(|d&2{ym%ItjFt=Rs3RI{Zdy+N_%*bbsk3Hwl-{-v3i9LAU=0DQk8=m)v zovc3rOg@95e*r-~iiDS;0YX;yg`Wk3!07?#;UIK+C~8?Wh@4&%^{g>yAdf|}=Ag-% zvzSH&QjZw2`Z;)Fjah5Zrfu4w&7ZBK-*x^qI>D7$ES)kGWubxg7He%(j@EaLJOf%CjV0S;Kjr3s|j##js-oYPd@@+b<)0~&G!-`YhDfqhZC^j>wG7F|NR-$25l7kcNm zL6G_fo__ZT%C+xzFs!XtCtpIar-j5BpD1E@E;Z&7@8sjLfHHP)mQ&V`V+_ypDc86v zsZdN~Gi7#a>%m9dO!2JH1{3_^=~r$)krc}uEE0d=n(`j}k{6Tdtp$TelBR5K$Vf2v z*OV!SiN;4vh(5-a=W{M6E@0&er;533-7iNB(_HQt%nq5vk}(Qde7^hm;0ZQ4 z9)Y_K7rHWyK+iq8$s3o|dw z(&@_${evJPowDqtUnudsjORp=Oq&zI%9wc3ZlJ0|7y$vF6hsbwt1Twmc8!>utt?bfk zB=Et|gyBf=D=5Y@XyF?)3od~SCY;r%e-WH{r``ep|LXlSWa_iVDKbqOT=+nQ`XUB< z+i9&OCBhXYH(K=7LTeDD=(0Vw!ifn7_TLG}O2Ed+QMsvl+{J3n|%O@4! z428NinJfT$t z|5ZKNT(-ep^ND3~*;vuGD%L{RrBQadUg15le%2~=HM?>fpTJTf*r)cI*KdJndu_js TVE9pBYl|Wv#l6OMjAH*EOYZI- literal 0 HcmV?d00001 diff --git a/alembic/env.py b/alembic/env.py new file mode 100644 index 00000000..0192775e --- /dev/null +++ b/alembic/env.py @@ -0,0 +1,80 @@ +from logging.config import fileConfig + +from sqlalchemy import engine_from_config +from sqlalchemy import pool + +from alembic import context + +from app.db.models import Base +# this is the Alembic Config object, which provides +# access to the values within the .ini file in use. +config = context.config + +# Interpret the config file for Python logging. +# This line sets up loggers basically. +if config.config_file_name is not None: + fileConfig(config.config_file_name) + +# add your model's MetaData object here +# for 'autogenerate' support +# from myapp import mymodel +# target_metadata = mymodel.Base.metadata +target_metadata = Base.metadata + +# other values from the config, defined by the needs of env.py, +# can be acquired: +# my_important_option = config.get_main_option("my_important_option") +# ... etc. + + +def run_migrations_offline() -> None: + """Run migrations in 'offline' mode. + + This configures the context with just a URL + and not an Engine, though an Engine is acceptable + here as well. By skipping the Engine creation + we don't even need a DBAPI to be available. + + Calls to context.execute() here emit the given string to the + script output. + + """ + url = config.get_main_option("sqlalchemy.url") + context.configure( + url=url, + target_metadata=target_metadata, + literal_binds=True, + dialect_opts={"paramstyle": "named"}, + render_as_batch=True + ) + + with context.begin_transaction(): + context.run_migrations() + + +def run_migrations_online() -> None: + """Run migrations in 'online' mode. + + In this scenario we need to create an Engine + and associate a connection with the context. + + """ + connectable = engine_from_config( + config.get_section(config.config_ini_section), + prefix="sqlalchemy.", + poolclass=pool.NullPool, + ) + + with connectable.connect() as connection: + context.configure( + connection=connection, target_metadata=target_metadata + ) + + with context.begin_transaction(): + context.run_migrations() + + +if context.is_offline_mode(): + run_migrations_offline() +else: + run_migrations_online() diff --git a/alembic/script.py.mako b/alembic/script.py.mako new file mode 100644 index 00000000..55df2863 --- /dev/null +++ b/alembic/script.py.mako @@ -0,0 +1,24 @@ +"""${message} + +Revision ID: ${up_revision} +Revises: ${down_revision | comma,n} +Create Date: ${create_date} + +""" +from alembic import op +import sqlalchemy as sa +${imports if imports else ""} + +# revision identifiers, used by Alembic. +revision = ${repr(up_revision)} +down_revision = ${repr(down_revision)} +branch_labels = ${repr(branch_labels)} +depends_on = ${repr(depends_on)} + + +def upgrade() -> None: + ${upgrades if upgrades else "pass"} + + +def downgrade() -> None: + ${downgrades if downgrades else "pass"} diff --git a/app/__init__.py b/app/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/app/__pycache__/__init__.cpython-310.pyc b/app/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..90467f517a7d6f378290bac8ed149a715d2f3f6b GIT binary patch literal 150 zcmd1j<>g`k0@=*E6cGIwL?8o3AjbiSi&=m~3PUi1CZpdI zlT}fXo)HsJnVgYWlp9c#pOu;Ch^V;y-LcmL~akRWNyhM}EV= z38yIu&26PLvqFm+Y^Qcs3QLp#nL7&-mZ3ba02#Rpy5g$HdEl+M+KRKFH1c`r5#bIm z^9px)^|KQO5d5dx;@*OWbyRLceWeRFs64+1SVez>0)sd`Bdyvk_DN1!R6lqp6jMna zcajv2S6{Ns%HVdTW=B$L&ZIP?%12H3rp11r)k$1bCbI zy5(vuMf_TwA(#By6C-pe;oRz;Z3>P5kK1;vqJ+3O}D7?)T3n6tX{>PUB&}H;aa>$a;ksL8N5=t++~{ zm!v}VajZTL&>qjU`wahjlEQO}M)C;;m-y7TT-&GSc(z6FcKMg@c(zAz+gtQEzpl|w literal 0 HcmV?d00001 diff --git a/app/__pycache__/main.cpython-310.pyc b/app/__pycache__/main.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a31d93ed6c77ff11d6499649bd1c3c61bff72765 GIT binary patch literal 1145 zcmZuwOK%e~5VoDo?q-us)3g*QAaNv@AP!s*LR1wMAhnH}!eJF@wZv|-VPCSnp>W_* zxKygdjRRC_Z*V{y_$!=zMM2^pATBU=%R_*r`8+eWXXl%l&3)fPur9<;Y1cyNlQ#Zb zHW)WS#76*%C{9qIcaq?g1O#inl2lSFu#9dc)zl8`)Cru_4P4`^CbiTHytE$Fjcq55 z)DL{4J4rL031%>2gxTX3$m}ab-2*~v`y^7_=tJC2=3JlE*M1PGjtYWoCR5=Z92EFbH#llo%t`o46Svra#kWC zmwIWWc>kmgvhv85B%Xz^v_*i!=@(co0Wh@h>>L>272mfAHKYNXB=xC z!u13wOUS%mf=sg~eBA)hmK4wEH2CMlbX1zGc@s2q<)V&8pG=NgczPN&P%1I(3XBHb@LsH2zIw`r`d`@6G2o zN7I9sCqyh>g#cVnEU#(MyngdJ)@H${8bU@~hN`|OmcYtO4#4rP?e>kP|Y|SCM9JjbFJJw3)zHa(zN9l>nuuH7^(^{GiBXg?{6xr xx4yCY-$J_Ak85~C_fT8{a8Uy{$UJUg*s)#lu>HMdxv;yA+tdZN$s)17{s0L|Bq#s? literal 0 HcmV?d00001 diff --git a/app/__pycache__/scheduler.cpython-310.pyc b/app/__pycache__/scheduler.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..12e1c46f144f4f82562c2786c3d41ca8d717bb05 GIT binary patch literal 2051 zcmZuy&5zqe6!+MU?R;l9`%#uHY6X`Fh&XYm0JWr5RZ+I9?iQrcBFpQUCQkj4&WzjL zRm*`E4oE9;tAsctM-KFYgpm4waPSq{D*pl!D(_8p(;(r<&(H6@8NZL;{F2q{6$7rb z(bw#ovSIv*FN;?RUM|8de+R(~Mq-2F(~L<%C`n9el9}D27TB%WPD-?-ZFcM=E_JnD zioK*v%UXBhN>Zg&t-En8snfdFy||GyX;bUvxRor?C9PND<)ls9TCc_{$tqnX1~*kBFbX3b-ZZZNWAbXrr$-q`Axg~tNLRh00ejFRzK z1szf>?+yeH*mjo1R}OfXt4x5k{b>;1>5D8+*-kj%ERQ*wTfHp16Y*Z0<*YXdq7-b+ z%UQl3q&tUccxr0wrF{ttoH**bQFvVPDxKCvlvJ$sc6iZqS zM)LHtAr`QB%?I-#Sh+z7GpNZ3wYbeoLx-8%W!57S5oRBo)MF*)JT_>Vxy*xSg_WT# zm7+YaE8m2DD(B#O{`AKePk#IB*|X>0PhLKqy!_!iZ7y8KZwGm-rYjJMt;7Z%Whtj+ ze$q1;l7$>C&;e6M4{rGf2xSb3*nD6N&7r02N5-(k2-=i0c9l0SgI<}C2~kyMGV7SE z8<4zBjFS~LSW#yLOJOb)=KYVa4898Zs_0XVVUyKZ{g^x?56ETXtJXtvVXqczJTQk# za4!Q^ApY*f6K{K#8*4!p7VNV!UPaG%ZDJtGw7xzu5RuTvrLDq?QpLr+Af93aV2*AQ zrMcp=V~RFdXg%cz$`^U+W7noQy`m%)fUzKeOC3}=ckTzGFQ+y1lAF-u(jd!)6zgCR zO%NSI8)=^SvxY}mDhoRlfE=^1F|=@I-<`gN!Dj@vzgX$rxbfMwE4}MCZe8}TZS7vU z`NgH{Ma7?ki@E`0{xI7Y4#vA9k%e4JVd9&WX7>wwbf}I*3*XIMDsZyG!#79rK!gK< zDbtn+QkEsJH!fVkZwoF50?{STqHs|l=@cc#_wzojj0AKKKQDDlgz8v@EqQ#KdP+oi zN@U@lXg?d`U0D0~h2Dj|TM|5b!-IqVU~l^{90VfS7TJ)8O74B0-HZ5k6lZEL7>)Mk zrFKV$h3ETG8Y$mD4?9WB%rR@kBsSR~&Oe*Zrd6{%@)lXMT2{k4TArVg?&-q+z#J!z zozgJh00rQIK(FF+Y-*SQ327oS^LHRXpC^6PzWsIj&ZzRw86P!zPaH zndU3!l~<~5YA>9Ta>7**#(|WbHwzc}5X#h`n*r=?SW7n+NU%HSneGUfT4zJgF9yu# zEW7)2?$$*VtAK+pfFw%0q2})p`CB8NF8G+{abE(FYp53O*X!gdq0g}IX-_8j?3lUu z3RTR&t(WD<<6U{m@1lwoH8F1HK`s#b>=flbSJ(Al0&UH!@MnJ#FnVzEdps`OFE8EP qy0&#y_i&->dI%Z@-bb^UeuB7^$OE3yA|4g`k0@=*E6cGIwL?8o3AjbiSi&=m~3PUi1CZpdI zlT}fXo)HsJnVgYWlp9c#pOu~5pAka$Ui`lZhzkh&3lc{hH%MWI zvEN5cq+%AUge8hFq9~&(WvR+orgD~JB=C2{3Q=rEBHoO7Tw|WxMZi5tfDlfBrFZck zMu25JKVTGC!AA!y1vciB1C{|h;!h4(4(ynp>={4(h^9{;;7iaHyZp`K-KFk3VWz1g zjjrX^k=_bp9kH?#)@4dqTh)H|RV>$9f3dEx{nDYWW@5`*Ew`NwjfF-+#ZV@A2Rq|!Tmd&en=l1;B)6-k=VGtvz<(ff46latc>eah z{N!g;Zg#tRT`q1`>&mEw(HpVqZ24YaORwfLi)IVIcslR_DX5qH{vx0J9`Fc Pj9x@EI>l#ypJ(_tZfvL( literal 0 HcmV?d00001 diff --git a/app/api/apiv1.py b/app/api/apiv1.py new file mode 100644 index 00000000..27eec243 --- /dev/null +++ b/app/api/apiv1.py @@ -0,0 +1,12 @@ +from fastapi import APIRouter + +from app.api.endpoints import login, users, sites, messages, webhooks, subscribes, media + +api_router = APIRouter() +api_router.include_router(login.router, tags=["login"]) +api_router.include_router(users.router, prefix="/users", tags=["users"]) +api_router.include_router(sites.router, prefix="/sites", tags=["sites"]) +api_router.include_router(messages.router, prefix="/messages", tags=["messages"]) +api_router.include_router(webhooks.router, prefix="/webhooks", tags=["webhooks"]) +api_router.include_router(subscribes.router, prefix="/subscribes", tags=["subscribes"]) +api_router.include_router(media.router, prefix="/media", tags=["media"]) diff --git a/app/api/endpoints/__init__.py b/app/api/endpoints/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/app/api/endpoints/__pycache__/__init__.cpython-310.pyc b/app/api/endpoints/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e2722731e9bacf6a6c4214bf498aa3d51a3c2420 GIT binary patch literal 164 zcmd1j<>g`k0@=*E6cGIwL?8o3AjbiSi&=m~3PUi1CZpdI zlT}fXo)HsJnVgYWlp9c#pOuikW}}3j+XiI4HRQ literal 0 HcmV?d00001 diff --git a/app/api/endpoints/__pycache__/login.cpython-310.pyc b/app/api/endpoints/__pycache__/login.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..17087831ae9de94cc79a3245577964924d28f8de GIT binary patch literal 1339 zcmY*ZOOG2x5T5RN`?Zd}0iq-*CnO(mB#sCnRvRNCl#LZT5*k?=%})33jx(=x_k=Za z5X&Nzi(wBaryM|V00h|!Qn>Rk`U?BtFQD+KZZFcNN7eqiy1Kght11`GX3cOoy&Cv9ZSpsBH&wz8FAC2I$5z4p=zStsad?5EvqHCROkwfBwSBE2|$iPUIw`ZB36 zFm-5WA5mxD*utbi>!eA2(xT>;Lsm%pGkYHeuaFBPqu2QpA~$+S`Xb3Fp{a;qVXoz~ zo+4!vJdF5WFz z2Al4Pa=x^4dAviji1)DcIE^coh?zn{B>6T6TW6b!kZc07?sCdL>RwNa?Igb*#W6T} zT@?4Iy0673FN>VhFe@NliOHt)x8S;vL?V(7qoQJYjMcl&2BglgL4E__0Ze;H7*jMi z=4gsROoA5XLp;a4D=dPENvs9_6wUF}=2x`FUTTCR+^I*L1$t--e_8{J`rIV$0uzt; zPcRT#t1iO@wQDd=zj$`^<>S+*-<=-rjaBqo+cVh;SV$YlNK)yQXT&83$T0Nbldrx% ze)R0?SPQeIwLUmuJ{;rRCZgN<AlV%d-tQyL3Cxm7$!=rBnOF^S3&B$+@Zmqn7prY^C5Ig=fYUI<17z^}oCKe1el zEcl$iExUmn)PT>z4zm8mrt_S=3Pu~fOVWc9q^glL5z+x3p}3g|+tS^NAajreRgFxQ zA@MyYClfhKtlkzZ%GOf8$>3X4FqvnmWc?(gEPkRL#Z}C-FN@WgR{x*GL`Rmvc}_Om zhJOOfTOfAugvg45R#HN(J@OJOXvv67&;(O^kG!xZ)+cKpLBURO9RjL1fldxyAMJiS z`ugth`}@Nm`^P&6rJ29Q2o-hsb^2lZBpHsX|rAeguHEOPLCJ+$O>d zThu_bZDCLf7lih5kwr{O?WwF!d8EL5@l%-W+KaMOv9bDs#5}zJEG^#YnI_8KXgppU z_PQIv18FtfFZ9#hBfELVy)&Uee?eOz?&&n$ubhT3sPj<|R zglA&sOawTLB`nlXm~Gdtn5~wbXHsczaaOptq!J~VvH_RGRTJdjh3rMl?!i2eG-F#p WbyCOXxTI+j;$r^{%KA%4>+B!#i}eHm literal 0 HcmV?d00001 diff --git a/app/api/endpoints/__pycache__/messages.cpython-310.pyc b/app/api/endpoints/__pycache__/messages.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ba1c33347da0b6ef22bba48412cf86ad57cf5246 GIT binary patch literal 1763 zcmZ`(OK%)S5bmD$uJ;u?**H86Qlu;gbI8p?2xqejR^pB22PUJHR>O3AJ@(Gb(%ox& zqjhBC9HIydL~;WpTLLL?z(k4?iJ)-c#!r|lSrh*NE|G|+?zJOxphs0x)sO0`ud6D~ zX4449>%k53m4(osQaL_SpnL$t{{Ti1!A%rm7h@@FO)b=2Jv3ZH={o49Ybx1jTA}UQ zN;aELm~vA}wwmd1z#UMs-OPkpH>+f)nG5r79wVx6A-6zM)LhU=nhe}D+!M60G)OYk zUK%3VZH?rpq1FwOCxx5F7Ish4!p7>W5Qxuo6UhxPfcH3I>z%bNnuZo@11^;)v6F z7!%q|3ZJ}0w=N{SzC3a?q-+5F4#bPVHUWSgBybn+Y7z#b1riGV@0U>gb@$%>tw;M0 zZ|!gH_3muO5#fo@g_gq(lI42rq0UW)w$0^<^MO!vR6onhNY25H_)Z z*Ci0%*XUbKzVY>p(1gBZ0GU7*(YEzY7`4 z9$DxbBF4IT!<;$%ui{nIHI~v{+|{~z7ZG#YsA=ogy4|&iwXCx%%9afltSwwrnbx%d zUWW~Vi|to{?caUayY+ML$xlyz+dcU4^JjaT&-Nbe-~ViEq@=qRpN*Gkgr{pS^myQca47TBTaPdU2w9sV-xwT!Z56?a95*-|4ugWD^mdDaBy9(LmiTa8P;Z0cN=YVM& z1yjQoHsDLY$ms=q5<45(3rp9q{L=q8#vnE{b`~~QOJ@>GbXxElOx9CkFL;obt$@k) z!emx5Q_ky9<4mTvTLfuT74hit{O|V?M=i#T_Cd3y3Y|?s>b@m4sO)x=^3lHYqyK4k z=M~KY&XQ4eyPeD(Z~p&71dr&*S%dZ#Jpb$^^!n z;kSIPK*+y%xHw91_z;$Q27(h#BN9`OQq)<*V#~8)+q2_>S1>j!a$?tWjc!N9xa5_L zUWm$Z#j6T$zs7`+%R#Z9ki^itG{+g_UzVNHqG5uKf7UKUi8b{eaM zR~|57i`tZeY)|Pn<5l7EnrQMmU@onaZHG7b(szX^^;S%56Cy7!;xK|P(3iGt-r{Y8 zT;-h&(p^4VI}4$ul9fdtIbr!j-Oly1Ci^csCGf7A6w_yBk8O zg{p$Fh+7N(|$Ki%2uRrK{&?glR{LESHmjVFHVRx((|eSn3TB2XvpRQU;ae zj9U-bU7FFyY@f_16_}+z|`t0fK_~1{2lP!pl zZ4@04pLCgaRUQP;Roaa~`XjM<&Sw!2+D&DGZZKlP+L;%?D+wtRIgHiF&^s5ah-l6; zADYyMYHt#}1!jf!0aJx@rs}p$%P{5J;P|q8MLXGE8cs$Mdr7<7K3tTB66uo2m#ML? ztDBJ@VdwAl5*bSe!4?!ux}bT>p!J}x;iPwge`zvt(8sqVervqe{LnK^u6kI|dH=lT zz>b#{yri*+K#QMeV~O1fk752~EqGMg=3$VT`s?D2#WOPLU7!eiQ5v3#@5AMJBtF3I hQ15`Kk`AlVDz3$JSj%##LyKoX+nGbFXZ6||{U6{oZdd>S literal 0 HcmV?d00001 diff --git a/app/api/endpoints/__pycache__/subscribes.cpython-310.pyc b/app/api/endpoints/__pycache__/subscribes.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6491d5cc1c06a543be97019f09a9eb581ff5d84e GIT binary patch literal 2800 zcmZ8j-ESOM6`wm_JGFZJ-?U9X zVJCdcwxnG1l77lgNnZE5{Is2xyy0d1teus->2>=(c8}x}Uaz0CbCS2bKEL1YmweJ2 z@CWTd$)~&_f7l+De3v)kkJ_U|VOmYG$7q_3(+nG>S@?Fd3EIQPS5mZ>=5FiuDK@r# zn)Wfm((C;r3hm!hnaOfB0(7`WR#ZB`Qgo0FuIO}#4&OFv#GZsXFVPX0aYpJ}bQClR z9b-BjX9k^s^-X$;o|f7#)6oSbKY4`K%ad6Du`7bS87D8y&s?d50poGv3fl;o2;%NH zoznGHUJ1)|(Gk~0oS0%&R;D7(Tv}Y5pT1FI)xfQkWAhSoDC4kPVu1+(L&%EK8uJ|i zY<3}B7A5X3vx{qvi$Y7VAaKj8C^c7EP^8PiC6D!>qhA$r$#E2yLe5z^C_1IU-DE`( zRv8al^5kVkU1xEt%3>pM0}noafITzt>9R{>Q!q!sDJ`5(c6?Sc@bc{k`2@6!(8MT^ zK&dI~BvK+0sgV}xlH+T*dc^{H~Bm+nWfz0Mr-UZ({QRS5q7>f@<@4muE;Pbzki{D+sYm24z8#h+h zmgcugYYzA4d1alI0^hpD{dKtqGM!HsBXmrB5-&BmTFtR z2rIc|JeDwlScXMX&-fVbO3s40vz&=)r7T#{uTbX2DqW7#9kZk5N-F4f9^`ds|AHpQ zf!rh!5y=2DkE&GLQ*V)g?5mMdCtx={L=|b8=12DqAAa0?XSaFxotE|F@X>paw_zHz zj_&Rr{^e%#S3ht5p>|)5yWko@D2gRGRBTcfIIfr1IC_j{fyBCp0j%;33`@~lb{&LEXX)vuvX#j zwu8Z6(qLZa!3!jzNwdttmB1`2w<0xwkh-q%Y@j|jP^9c@b!A4O`XyyYi!?C-QiGZ; z^F`XeP7`&qqeBQjD>88%SdT|!-3pSC86_fv_D2>S*fSv|Cg>>_ z+`FpmB;_uHt8k7f<*nhJRFs1A48eJZVg7IE2pzqx$g#0H*-z2&I+;>xWG6|KGTGRU zk}xZ?({*y6sH?Nj#s{69@~6XBz`8PGe#ks;OFHZ9+$LlUy6r?j@kvmW0o4kn#-AS@ zesYh$1f#R=e=*oF6`FVMHGlWB#!ugFJox;{XI~uL|03=!R|0p%ElKAV5lHf?oxMCg zHFKeOVSfI~+_mW`yRY59x;S?{_=9j5R($f=Uh}sPo4>qy@Zs&F-472wx_9vCapRA_ z$g2Q|VF@!nPWV8bRfZ$WnAm_=h+%O`e&nVwgt^`Vu^Ad7fE+&jwE5^(aMy$tN~=j1`N4XFpXMx1LVwkF?UnvFuO|?zj}Ti_r*iJrfk0~z5P6=3+KE_$??Q_ zU^@D-vFUgr+g4wnqrVn-T-1J(H%uJG5EV>SpF@P zNTcHTfK^u4C2X~T3ve9XGbBgS@Xe8wYPO{k+P<{<_5bvcEEy#* z>#3!klv-a}2|fkO=U;(H+p0oE=4j(MvEl&mR$Y$h#u4c`I-g_dXo0T$q&IlC% literal 0 HcmV?d00001 diff --git a/app/api/endpoints/__pycache__/users.cpython-310.pyc b/app/api/endpoints/__pycache__/users.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..38b827d4dccbe24aa89e68e34175775c5751085e GIT binary patch literal 1901 zcmZuy-ESL35Wn5qJD)F(<2Y$P+VUYJTA7FRg(p-YN{a*%R1s}?I7PCY+f8%k&Ufsd zOAHPwxJZ2o>O;kcRG_H!fkQMSB5{FF;=Ea;IpW(A6=Mg@4&T7o>B7zO7?NgneW^YC+ zZ`itgYVnP?({3)LE}apX=y0XSUq63-@wK&3WOa-j$t@VsXP^!#B>~V5%C3k4c~0wEEU2S*LvpSdi{f zF#FHK*#7qWox8XGx_*26>iw;&U+iq&HfAg!HV{cXK~93u4yIIhEO`i456+x^Y3TwQ zmfCA;7gv`Sd*NzJCW|s{i!fJ9Z>5(au^7c^zSPPxn9&lzo25|)oaUs3tfze`TD)nN z6L6|>LD0*-$B3K-wLwSnmvCD%>V)7h1FLjkGMJ{?HYiXnZ9}zv(k7g2&~>|S%gLN_ z%5Baz=qHGVy=kqpKD)`dvq|Lf-06chZw&~1yC*I1xac8PUgBN^>+i^C1W&r@85}_a z9LwDqNLb+b`A=K7zA13rN6>*ziQ?UBa7nvZ+z{paKX3i`<<^bccc>myc`NU#W(f3Z zmx~k78ba<6F;$ay$hB5<1VD9p7DURlPqou!!^L(L5V z=v*|M0?#=NF{CmCH7F0ET}e%fLSS)vtOzs|9RY*F)}fbcJ|on8+&z!^q(*#Fg$cYJ zgAE_}Cq68WGQyhOC+|`@gUI*oHdW7n z*WvDvQ{wT{*NuV`i6zRzAi8xB1!LP^4|c!0277ky z{nD`IbGXI8U5V7=yWC*%IC>D(0_5jW!@Dv9=fpw3BYzQp5!~u&5cG1jJPIiz?g7Az z$roVD*~U@r=DjTHT$Fg>CE}?|D=p}vERu+(#OqM}xT<=ZoAYaY!4doA4=&SwJVRRV=h`B;+om?5oPotbt->X=fFySR^3< zArKVeNjzl1gI>&4jOf9CF;}yY`~^=|_ijWisG_>Mx~uB@Dk_%?2;{2&l4b;6psb`&N*5@)$9^i<|;ASaF@u z95wfJr^E`~GPRh|tz{)D(h{P)9!o6VNi&Vijf5(zUZ6MG2Kl*=Ib^$F6!0vuFrS5E-JZ(Kbr%qieJ=6k5*4n4 z$uyveOMsj!;LR%@=KuS5yb+eVk2o7QpMx!yE3H%COD0{%kw`LYdBRtwiG-^L{%Kr| fpt`qi0iS7~-IjZ+_H_oANC}s4j#RXYIfwrM#MB89 literal 0 HcmV?d00001 diff --git a/app/api/endpoints/login.py b/app/api/endpoints/login.py new file mode 100644 index 00000000..25e7d7df --- /dev/null +++ b/app/api/endpoints/login.py @@ -0,0 +1,38 @@ +from datetime import timedelta +from typing import Any + +from fastapi import APIRouter, Depends, HTTPException +from fastapi.security import OAuth2PasswordRequestForm +from sqlalchemy.orm import Session + +from app import schemas +from app.core import security, settings +from app.db import get_db +from app.db.models.user import User + +router = APIRouter() + + +@router.post("/login/access-token", response_model=schemas.Token) +async def login_access_token( + db: Session = Depends(get_db), form_data: OAuth2PasswordRequestForm = Depends() +) -> Any: + """ + 获取认证Token + """ + user = User.authenticate( + db=db, + email=form_data.username, + password=form_data.password + ) + if not user: + raise HTTPException(status_code=400, detail="用户名或密码不正确") + elif not user.is_active: + raise HTTPException(status_code=400, detail="用户未启用") + access_token_expires = timedelta(minutes=settings.ACCESS_TOKEN_EXPIRE_MINUTES) + return { + "access_token": security.create_access_token( + user.id, expires_delta=access_token_expires + ), + "token_type": "bearer", + } diff --git a/app/api/endpoints/media.py b/app/api/endpoints/media.py new file mode 100644 index 00000000..05c08abc --- /dev/null +++ b/app/api/endpoints/media.py @@ -0,0 +1,25 @@ +from fastapi import APIRouter, HTTPException, Depends + +from app import schemas +from app.chain.identify import IdentifyChain +from app.db.models.user import User +from app.db.userauth import get_current_active_user + +router = APIRouter() + + +@router.post("/recognize", response_model=schemas.Context) +async def recognize(title: str, + subtitle: str = None, + current_user: User = Depends(get_current_active_user)): + """ + 识别媒体信息 + """ + if not current_user: + raise HTTPException( + status_code=400, + detail="需要授权", + ) + # 识别媒体信息 + context = IdentifyChain().process(title=title, subtitle=subtitle) + return context.to_dict() diff --git a/app/api/endpoints/messages.py b/app/api/endpoints/messages.py new file mode 100644 index 00000000..a5ee8b3b --- /dev/null +++ b/app/api/endpoints/messages.py @@ -0,0 +1,51 @@ +from typing import Union + +from fastapi import APIRouter, BackgroundTasks +from fastapi import Request + +from app import schemas +from app.chain.user_message import UserMessageChain +from app.core import settings +from app.log import logger +from app.modules.wechat.WXBizMsgCrypt3 import WXBizMsgCrypt + +router = APIRouter() + + +def start_message_chain(request: Request): + """ + 启动链式任务 + """ + UserMessageChain().process(request) + + +@router.post("/", response_model=schemas.Response) +async def user_message(background_tasks: BackgroundTasks, request: Request): + """ + 用户消息响应 + """ + background_tasks.add_task(start_message_chain, request) + return {"success": True} + + +@router.get("/") +async def wechat_verify(echostr: str, msg_signature: str, timestamp: Union[str, int], nonce: str): + """ + 用户消息响应 + """ + logger.info(f"收到微信验证请求: {echostr}") + try: + wxcpt = WXBizMsgCrypt(sToken=settings.WECHAT_TOKEN, + sEncodingAESKey=settings.WECHAT_ENCODING_AESKEY, + sReceiveId=settings.WECHAT_CORPID) + except Exception as err: + logger.error(f"微信请求验证失败: {err}") + return str(err) + ret, sEchoStr = wxcpt.VerifyURL(sMsgSignature=msg_signature, + sTimeStamp=timestamp, + sNonce=nonce, + sEchoStr=echostr) + if ret != 0: + logger.error("微信请求验证失败 VerifyURL ret: %s" % str(ret)) + # 验证URL成功,将sEchoStr返回给企业号 + return sEchoStr diff --git a/app/api/endpoints/sites.py b/app/api/endpoints/sites.py new file mode 100644 index 00000000..f04f3b4e --- /dev/null +++ b/app/api/endpoints/sites.py @@ -0,0 +1,43 @@ +from typing import List + +from fastapi import APIRouter, Depends, HTTPException +from sqlalchemy.orm import Session + +from app import schemas +from app.chain.cookiecloud import CookieCloudChain +from app.db import get_db +from app.db.models.site import Site +from app.db.models.user import User +from app.db.userauth import get_current_active_user + +router = APIRouter() + + +@router.get("/", response_model=List[schemas.Site]) +async def read_sites(db: Session = Depends(get_db), + current_user: User = Depends(get_current_active_user)) -> List[dict]: + """ + 获取站点列表 + """ + if not current_user: + raise HTTPException( + status_code=400, + detail="需要授权", + ) + return Site.list(db) + + +@router.get("/cookiecloud", response_model=schemas.Response) +async def cookie_cloud_sync(current_user: User = Depends(get_current_active_user)) -> dict: + """ + 运行CookieCloud同步站点信息 + """ + if not current_user: + raise HTTPException( + status_code=400, + detail="需要授权", + ) + status, error_msg = CookieCloudChain().process() + if not status: + return {"success": False, "message": error_msg} + return {"success": True, "message": error_msg} diff --git a/app/api/endpoints/subscribes.py b/app/api/endpoints/subscribes.py new file mode 100644 index 00000000..1731f36f --- /dev/null +++ b/app/api/endpoints/subscribes.py @@ -0,0 +1,90 @@ +from typing import List + +from fastapi import APIRouter, Request, BackgroundTasks, Depends, HTTPException, Header +from sqlalchemy.orm import Session + +from app import schemas +from app.chain.subscribe import SubscribeChain +from app.core import settings +from app.db import get_db +from app.db.models.subscribe import Subscribe +from app.db.models.user import User +from app.db.userauth import get_current_active_superuser +from app.utils.types import MediaType + +router = APIRouter() + + +def start_subscribe_chain(title: str, + mtype: MediaType, tmdbid: str, season: int, username: str): + """ + 启动订阅链式任务 + """ + SubscribeChain().process(title=title, + mtype=mtype, tmdbid=tmdbid, season=season, username=username) + + +@router.get("/", response_model=List[schemas.Subscribe]) +async def read_subscribes( + db: Session = Depends(get_db), + current_user: User = Depends(get_current_active_superuser)): + """ + 查询所有订阅 + """ + if not current_user: + raise HTTPException( + status_code=400, + detail="需要授权", + ) + return Subscribe.list(db) + + +@router.post("/seerr", response_model=schemas.Response) +async def seerr_subscribe(request: Request, background_tasks: BackgroundTasks, + authorization: str = Header(None)): + """ + Jellyseerr/Overseerr订阅 + """ + if not authorization or authorization != settings.API_TOKEN: + raise HTTPException( + status_code=400, + detail="授权失败", + ) + req_json = await request.json() + if not req_json: + raise HTTPException( + status_code=500, + detail="报文内容为空", + ) + notification_type = req_json.get("notification_type") + if notification_type not in ["MEDIA_APPROVED", "MEDIA_AUTO_APPROVED"]: + return {"success": False, "message": "不支持的通知类型"} + subject = req_json.get("subject") + media_type = MediaType.MOVIE if req_json.get("media", {}).get("media_type") == "movie" else MediaType.TV + tmdbId = req_json.get("media", {}).get("tmdbId") + if not media_type or not tmdbId or not subject: + return {"success": False, "message": "请求参数不正确"} + user_name = req_json.get("request", {}).get("requestedBy_username") + # 添加订阅 + if media_type == MediaType.MOVIE: + background_tasks.add_task(start_subscribe_chain, + mtype=media_type, + tmdbid=tmdbId, + title=subject, + season=0, + username=user_name) + else: + seasons = [] + for extra in req_json.get("extra", []): + if extra.get("name") == "Requested Seasons": + seasons = [int(str(sea).strip()) for sea in extra.get("value").split(", ") if str(sea).isdigit()] + break + for season in seasons: + background_tasks.add_task(start_subscribe_chain, + mtype=media_type, + tmdbid=tmdbId, + title=subject, + season=season, + username=user_name) + + return {"success": True} diff --git a/app/api/endpoints/users.py b/app/api/endpoints/users.py new file mode 100644 index 00000000..767180fa --- /dev/null +++ b/app/api/endpoints/users.py @@ -0,0 +1,74 @@ +from typing import Any, List + +from fastapi import APIRouter, Depends, HTTPException +from sqlalchemy.orm import Session + +from app import schemas +from app.core.security import get_password_hash +from app.db import get_db +from app.db.models.user import User +from app.db.userauth import get_current_active_superuser, get_current_active_user + +router = APIRouter() + + +@router.get("/", response_model=List[schemas.User]) +async def read_users( + db: Session = Depends(get_db), + current_user: User = Depends(get_current_active_superuser), +) -> Any: + """ + 查询用户列表 + """ + users = current_user.list(db) + return users + + +@router.post("/", response_model=schemas.User) +async def create_user( + *, + db: Session = Depends(get_db), + user_in: schemas.UserCreate, + current_user: User = Depends(get_current_active_superuser), +) -> Any: + """ + 新增用户 + """ + user = current_user.get_by_email(db, email=user_in.email) + if user: + raise HTTPException( + status_code=400, + detail="用户已存在", + ) + user_info = user_in.dict() + if user_info.get("password"): + user_info["hashed_password"] = get_password_hash(user_info["password"]) + user_info.pop("password") + user = User(**user_info) + user = user.create(db) + return user + + +@router.get("/{user_id}", response_model=schemas.User) +async def read_user_by_id( + user_id: int, + current_user: User = Depends(get_current_active_user), + db: Session = Depends(get_db), +) -> Any: + """ + 查询用户详情 + """ + user = current_user.get(db, rid=user_id) + if not user: + raise HTTPException( + status_code=404, + detail="用户不存在", + ) + if user == current_user: + return user + if not user.is_superuser: + raise HTTPException( + status_code=400, + detail="用户权限不足" + ) + return user diff --git a/app/api/endpoints/webhooks.py b/app/api/endpoints/webhooks.py new file mode 100644 index 00000000..286705de --- /dev/null +++ b/app/api/endpoints/webhooks.py @@ -0,0 +1,27 @@ + +from fastapi import APIRouter, BackgroundTasks, Request + +from app import schemas +from app.chain.webhook_message import WebhookMessageChain +from app.core import settings + +router = APIRouter() + + +def start_webhook_chain(message: dict): + """ + 启动链式任务 + """ + WebhookMessageChain().process(message) + + +@router.post("/", response_model=schemas.Response) +async def webhook_message(background_tasks: BackgroundTasks, token: str, request: Request): + """ + Webhook响应 + """ + if token != settings.API_TOKEN: + return {"success": False, "message": "token认证不通过"} + + background_tasks.add_task(start_webhook_chain, await request.json()) + return {"success": True} diff --git a/app/chain/__init__.py b/app/chain/__init__.py new file mode 100644 index 00000000..a4428e34 --- /dev/null +++ b/app/chain/__init__.py @@ -0,0 +1,58 @@ +from abc import abstractmethod +from typing import Optional, Any + +from app.core import Context, ModuleManager, EventManager +from app.log import logger +from app.utils.singleton import AbstractSingleton, Singleton + + +class _ChainBase(AbstractSingleton, metaclass=Singleton): + """ + 处理链基类 + """ + + def __init__(self): + """ + 公共初始化 + """ + self.modulemanager = ModuleManager() + self.eventmanager = EventManager() + + @abstractmethod + def process(self, *args, **kwargs) -> Optional[Context]: + """ + 处理链,返回上下文 + """ + pass + + def run_module(self, method: str, *args, **kwargs) -> Any: + """ + 运行包含该方法的所有模块,然后返回结果 + """ + + def is_result_empty(ret): + """ + 判断结果是否为空 + """ + if isinstance(ret, tuple): + return all(value is None for value in ret) + else: + return result is None + + logger.info(f"请求模块执行:{method} ...") + result = None + modules = self.modulemanager.get_modules(method) + for module in modules: + try: + if is_result_empty(result): + result = getattr(module, method)(*args, **kwargs) + else: + if isinstance(result, tuple): + temp = getattr(module, method)(*result) + else: + temp = getattr(module, method)(result) + if temp: + result = temp + except Exception as err: + logger.error(f"运行模块出错:{module.__class__.__name__} - {err}") + return result diff --git a/app/chain/__pycache__/__init__.cpython-310.pyc b/app/chain/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..91159e30b1e1a9d2b46b12341d70206ce20d5a47 GIT binary patch literal 2211 zcmb7G|8EpU6rb6h+ugffOQFzEzojMyb1E0(PsR`g3o+49NQe?QC7b1TdfmETuCuey zUhYV>hqO{j6R;{!qzQ^d4Iw6qg~&hPUogMQUCU4W?l1ag_j+xKzc|gjn>TOvy*Hot zWg2#O=MaqN-LuXsIzoR*X7kX1IRGScV*)O_94 zeZw@8J>q5koS9438L!LFn|Z(6?8fL_w$6yH+u;{T* zMV#3s?o&P%It4`-M=RV71KSho!C0s z%?r!04=T1FY%4wP24#=(Fc8_!vLr2U9t4;JFe6DQGO>e9#lfcPD301dCZQRJP>t#X zXjE}Bj@BSE*fiiyS=i5w631||4PtgVIk;Ju$XP>Uwi~=-M>HM)mAOF}&6|zYh0h*e z`lI>n%Ie+w$zBPAbbZLR0&@svv=azNGpL3v%$4LWo4Mr@>4P0(n#mba0)|nnq7fEal zlE>A)4N!{fCxpf*k6Ew<2Nk}MSR7sdynXMzz<2J~LG#Ij`L&0an^&(ty7&2`dly=Z z=R0SHlM5A8CLIyPX5~m|AD@xGi6kYxQm9v0SfWw1OWKq{AeripO%AukLQ9jhB#*3* zEG)WUO7x;Xft*L9*ujp{FzSS(8`x26_$qS9lDaG_Dl-RB9anC^?lP`tYMDdm3k zTBwm(G=tfzoYb@$o>6Lwi)!jkd=bx~U^maqBCgFS?9FxgEV_v5dZ2IcGq|qTbT(Ae z=gF+dR4rvThKRB5#jd@&rYrj2LEbKs9&Gp?c~B7Hi6J_5h$##v)xApJdq&!AZZ z`DVoL!<9Oiu032>Tb^&upKC7sxOV5e*5dE2U%p(u(rC?1x30~#epqfUeFY&|ZT#9? zxR?fJ_5P*S^=lmsTVgHaEaTk=GkOUK2W&Xpo%L|2K)?|ALx9Q*ScLQNO~cHUu4g!_WY8ZsZ0Lw}TQD86HZ>_tZra^Aa-GW4T^59C93>J&U;q*X~9qEDQ`IX0) zzmW&j!M%fpE@prRLEK<8WO=#lDpTIZBN93=Hs_2z10wdUlxGi5mT2-4hzw;cWFl)> zCC`o`%aTnduzhM-g=|vZtY3a7(}>B|$p(Q4Jw+R;K3xdH0cD|rwiKxs- ztclq6QqP5MSx#88EVf;`A@h;Rgk%{>B;G=WmyyX_Vy{UeJIp2`9cQxh$PN@qObtY^ zK@@!_?$;6tWJnfTmYu*hT-XL_bE=e>5*nYXz~h*jls1F`{k&KT8BINq$&$Vox)i|M znuf4Xaxr(ks0dk^zOGEVz~uiJiP=p~CO#(+8~f5I?3YEKxSL14c&C!by?D3!F8~T! A1ONa4 literal 0 HcmV?d00001 diff --git a/app/chain/__pycache__/common.cpython-310.pyc b/app/chain/__pycache__/common.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2e898f4f85770f61b6853ba6bc7257856f0b0a1c GIT binary patch literal 9792 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 literal 0 HcmV?d00001 diff --git a/app/chain/__pycache__/identify.cpython-310.pyc b/app/chain/__pycache__/identify.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d3fc8c5d29d425906195b7feb7426105581f2eed GIT binary patch literal 1312 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 M_gDjX=s%$T7oq#$`2YX_ literal 0 HcmV?d00001 diff --git a/app/chain/__pycache__/webhook_message.cpython-310.pyc b/app/chain/__pycache__/webhook_message.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..02ecba2a1d5be42598821f16d2d0f337cc820927 GIT binary patch literal 840 zcmYjP&1(}u6rZo%P1Cgag%>G`Cl{nAPa;Jv=&2=8L|7J}mOOZGX5RefH^290vZbXa0$Yin^NR$bKV~s+3>G)R z)l~=_aoj@*_AoYc(jy7=C`NY?r<@HDXM(<@9^=*)a_u8Hfn2QVt+WqAGg$A2ae6yc zA~HMkc5=&Q$O`0Pjy%G#M>!G9aBl-Aw};HLI0J4+pS>?0bhGT?hEOW(h>E&gfz!=P zV3SXy$-(Cua(M9W@b|dNYbTlEwJk+a%5*b=qEC#%%mH5qS8EUkXa`CjU`|Hl85t0@ z$m!NB%Le2t=GH#0M!O!Jeassp2JHcyyHH*OlIrG4)wki_53g!f)3@KJUtUjsjVJFv z9=+I`j^9l8ex5+}@{?J8K^{saq>H5mRGYe$XQ~K}tFVf==n2gVv0G>>PM{Mml?#BB z=2_(;1efThEYl##cnMhA5rs=NQ=+$BacUN)+u08!PXYMfo%QSfJ-AT$JG;A`uHWuQ z-B2cNneB+EQ2s{tI2P@=mlb}P=RR!4sei1smbIGqwUf&%f?gX1ssUlyVwmA8 Optional[Context]: + pass + + def post_message(self, title: str, text: str = None, image: str = None, userid: str = None): + """ + 发送消息 + """ + self.run_module('post_message', title=title, text=text, image=image, userid=userid) + + def post_download_message(self, meta: MetaBase, mediainfo: MediaInfo, torrent: TorrentInfo, userid: str = None): + """ + 发送添加下载的消息 + """ + msg_text = "" + if torrent.site_name: + msg_text = f"站点:{torrent.site_name}" + if meta.get_resource_type_string(): + msg_text = f"{msg_text}\n质量:{meta.get_resource_type_string()}" + if torrent.size: + if str(torrent.size).isdigit(): + size = StringUtils.str_filesize(torrent.size) + else: + size = torrent.size + msg_text = f"{msg_text}\n大小:{size}" + if torrent.title: + msg_text = f"{msg_text}\n种子:{torrent.title}" + if torrent.seeders: + msg_text = f"{msg_text}\n做种数:{torrent.seeders}" + msg_text = f"{msg_text}\n促销:{torrent.get_volume_factor_string()}" + if torrent.hit_and_run: + msg_text = f"{msg_text}\nHit&Run:是" + if torrent.description: + html_re = re.compile(r'<[^>]+>', re.S) + description = html_re.sub('', torrent.description) + torrent.description = re.sub(r'<[^>]+>', '', description) + msg_text = f"{msg_text}\n描述:{torrent.description}" + + self.post_message(title=f"{mediainfo.get_title_string()}" + f"{meta.get_season_episode_string()} 开始下载", + text=msg_text, + image=mediainfo.get_message_image(), + userid=userid) + + def batch_download(self, + contexts: List[Context], + need_tvs: dict = None, + userid: str = None) -> Tuple[List[Context], dict]: + """ + 根据缺失数据,自动种子列表中组合择优下载 + :param contexts: 资源上下文列表 + :param need_tvs: 缺失的剧集信息 + :param userid: 用户ID + :return: 已经下载的资源列表、剩余未下载到的剧集 no_exists[mediainfo.tmdb_id] = [ + { + "season": season, + "episodes": episodes, + "total_episodes": len(episodes) + } + ] + """ + # 已下载的项目 + downloaded_list: list = [] + + def __download_torrent(_torrent: TorrentInfo) -> Tuple[Optional[Path], list]: + """ + 下载种子文件 + :return: 种子路径,种子文件清单 + """ + torrent_file, _, _, files, error_msg = self.torrent.download_torrent( + url=_torrent.enclosure, + cookie=_torrent.site_cookie, + ua=_torrent.site_ua, + proxy=_torrent.site_proxy) + if not torrent_file: + logger.error(f"下载种子文件失败:{_torrent.title} - {_torrent.enclosure}") + self.run_module('post_message', + title=f"{_torrent.title} 种子下载失败!", + text=f"错误信息:{error_msg}\n种子链接:{_torrent.enclosure}", + userid=userid) + return None, [] + return torrent_file, files + + def __download(_context: Context, _torrent_file: Path = None, _episodes: Set[int] = None) -> Optional[str]: + """ + 下载及发送通知 + """ + _torrent = _context.torrent_info + _media = _context.media_info + _meta = _context.meta_info + if not _torrent_file: + # 下载种子文件 + _torrent_file, _ = __download_torrent(_torrent) + if not _torrent_file: + return + # 添加下载 + _hash, error_msg = self.run_module("download", + torrent_path=_torrent_file, + mediainfo=_media, + episodes=_episodes) + if _hash: + # 下载成功 + downloaded_list.append(_context) + self.post_download_message(meta=_meta, mediainfo=_media, torrent=_torrent, userid=userid) + else: + # 下载失败 + logger.error(f"{_media.get_title_string()} 添加下载任务失败:" + f"{_torrent.title} - {_torrent.enclosure},{error_msg}") + self.run_module('post_message', + title="添加下载任务失败:%s %s" + % (_media.get_title_string(), _meta.get_season_episode_string()), + text=f"站点:{_torrent.site_name}\n" + f"种子名称:{_meta.org_string}\n" + f"种子链接:{_torrent.enclosure}\n" + f"错误信息:{error_msg}", + image=_media.get_message_image(), + userid=userid) + return _hash + + def __update_seasons(tmdbid, need, current): + """ + 更新need_tvs季数 + """ + need = list(set(need).difference(set(current))) + for cur in current: + for nt in need_tvs.get(tmdbid): + if cur == nt.get("season") or (cur == 1 and not nt.get("season")): + need_tvs[tmdbid].remove(nt) + if not need_tvs.get(tmdbid): + need_tvs.pop(tmdbid) + return need + + def __update_episodes(tmdbid, seq, need, current): + """ + 更新need_tvs集数 + """ + need = list(set(need).difference(set(current))) + if need: + need_tvs[tmdbid][seq]["episodes"] = need + else: + need_tvs[tmdbid].pop(seq) + if not need_tvs.get(tmdbid): + need_tvs.pop(tmdbid) + return need + + def __get_season_episodes(tmdbid, season): + """ + 获取需要的季的集数 + """ + if not need_tvs.get(tmdbid): + return 0 + for nt in need_tvs.get(tmdbid): + if season == nt.get("season"): + return nt.get("total_episodes") + return 0 + + # 如果是电影,直接下载 + for context in contexts: + if context.media_info.type == MediaType.MOVIE: + __download(context) + + # 电视剧整季匹配 + if need_tvs: + # 先把整季缺失的拿出来,看是否刚好有所有季都满足的种子 + need_seasons = {} + for need_tmdbid, need_tv in need_tvs.items(): + for tv in need_tv: + if not tv: + continue + if not tv.get("episodes"): + if not need_seasons.get(need_tmdbid): + need_seasons[need_tmdbid] = [] + need_seasons[need_tmdbid].append(tv.get("season") or 1) + # 查找整季包含的种子,只处理整季没集的种子或者是集数超过季的种子 + for need_tmdbid, need_season in need_seasons.items(): + for context in contexts: + media = context.media_info + meta = context.meta_info + torrent = context.torrent_info + if media.type == MediaType.MOVIE: + continue + item_season = meta.get_season_list() + if meta.get_episode_list(): + continue + if need_tmdbid == media.tmdb_id: + if set(item_season).issubset(set(need_season)): + if len(item_season) == 1: + # 只有一季的可能是命名错误,需要打开种子鉴别,只有实际集数大于等于总集数才下载 + torrent_path, torrent_files = __download_torrent(torrent) + if not torrent_path: + continue + torrent_episodes = self.torrent.get_torrent_episodes(torrent_files) + if not torrent_episodes \ + or len(torrent_episodes) >= __get_season_episodes(need_tmdbid, item_season[0]): + _, download_id = __download(_context=context, _torrent_file=torrent_path) + else: + logger.info( + f"【Downloader】种子 {meta.org_string} 未含集数信息,解析文件数为 {len(torrent_episodes)}") + continue + else: + download_id = __download(context) + if download_id: + # 更新仍需季集 + need_season = __update_seasons(tmdbid=need_tmdbid, + need=need_season, + current=item_season) + # 电视剧季内的集匹配 + if need_tvs: + need_tv_list = list(need_tvs) + for need_tmdbid in need_tv_list: + need_tv = need_tvs.get(need_tmdbid) + if not need_tv: + continue + index = 0 + for tv in need_tv: + need_season = tv.get("season") or 1 + need_episodes = tv.get("episodes") + total_episodes = tv.get("total_episodes") + # 缺失整季的转化为缺失集进行比较 + if not need_episodes: + need_episodes = list(range(1, total_episodes + 1)) + for context in contexts: + media = context.media_info + meta = context.meta_info + if media.type == MediaType.MOVIE: + continue + if media.tmdb_id == need_tmdbid: + if context in downloaded_list: + continue + # 只处理单季含集的种子 + item_season = meta.get_season_list() + if len(item_season) != 1 or item_season[0] != need_season: + continue + item_episodes = meta.get_episode_list() + if not item_episodes: + continue + # 为需要集的子集则下载 + if set(item_episodes).issubset(set(need_episodes)): + download_id = __download(context) + if download_id: + # 更新仍需集数 + need_episodes = __update_episodes(tmdbid=need_tmdbid, + need=need_episodes, + seq=index, + current=item_episodes) + index += 1 + + # 仍然缺失的剧集,从整季中选择需要的集数文件下载,仅支持QB和TR + if need_tvs: + need_tv_list = list(need_tvs) + for need_tmdbid in need_tv_list: + need_tv = need_tvs.get(need_tmdbid) + if not need_tv: + continue + index = 0 + for tv in need_tv: + need_season = tv.get("season") or 1 + need_episodes = tv.get("episodes") + if not need_episodes: + continue + for context in contexts: + media = context.media_info + meta = context.meta_info + torrent = context.torrent_info + if media.type == MediaType.MOVIE: + continue + if context in downloaded_list: + continue + if not need_episodes: + break + # 选中一个单季整季的或单季包括需要的所有集的 + if media.tmdb_id == need_tmdbid \ + and (not meta.get_episode_list() + or set(meta.get_episode_list()).intersection(set(need_episodes))) \ + and len(meta.get_season_list()) == 1 \ + and meta.get_season_list()[0] == need_season: + # 检查种子看是否有需要的集 + torrent_path, torrent_files = __download_torrent(torrent) + if not torrent_path: + continue + # 种子全部集 + torrent_episodes = self.torrent.get_torrent_episodes(torrent_files) + # 选中的集 + selected_episodes = set(torrent_episodes).intersection(set(need_episodes)) + if not selected_episodes: + logger.info(f"{meta.org_string} 没有需要的集,跳过...") + continue + # 添加下载 + download_id = __download(_context=context, + _torrent_file=torrent_path, + _episodes=selected_episodes) + if not download_id: + continue + # 更新仍需集数 + need_episodes = __update_episodes(tmdbid=need_tmdbid, + need=need_episodes, + seq=index, + current=selected_episodes) + index += 1 + + # 返回下载的资源,剩下没下完的 + return downloaded_list, need_tvs + + def get_no_exists_info(self, mediainfo: MediaInfo, no_exists: dict = None) -> Tuple[bool, dict]: + """ + 检查媒体库,查询是否存在,对于剧集同时返回不存在的季集信息 + :param mediainfo: 已识别的媒体信息 + :param no_exists: 在调用该方法前已经存储的不存在的季集信息,有传入时该函数搜索的内容将会叠加后输出 + :return: 当前媒体是否缺失,各标题总的季集和缺失的季集 + """ + def __append_no_exists(_season: int, _episodes: list): + """ + 添加不存在的季集信息 + """ + if not no_exists.get(mediainfo.tmdb_id): + no_exists[mediainfo.tmdb_id] = [ + { + "season": season, + "episodes": episodes, + "total_episodes": len(episodes) + } + ] + else: + no_exists[mediainfo.tmdb_id].append({ + "season": season, + "episodes": episodes, + "total_episodes": len(episodes) + }) + + if not no_exists: + no_exists = {} + if not mediainfo.seasons: + logger.error(f"媒体信息中没有季集信息:{mediainfo.get_title_string()}") + return False, {} + if mediainfo.type == MediaType.MOVIE: + # 电影 + exists_movies = self.run_module("media_exists", mediainfo) + if exists_movies: + logger.info(f"媒体库中已存在电影:{mediainfo.get_title_string()}") + return True, {} + return False, {} + else: + # 电视剧 + exists_tvs = self.run_module("media_exists", mediainfo) + if not exists_tvs: + # 所有剧集均缺失 + for season, episodes in mediainfo.seasons.items(): + # 添加不存在的季集信息 + __append_no_exists(season, episodes) + return False, no_exists + else: + # 存在一些,检查缺失的季集 + for season, episodes in mediainfo.seasons.items(): + exist_seasons = exists_tvs.get("seasons") + if exist_seasons.get(season): + # 取差集 + episodes = set(episodes).difference(set(exist_seasons['season'])) + # 添加不存在的季集信息 + __append_no_exists(season, episodes) + # 存在不完整的剧集 + if no_exists: + return False, no_exists + # 全部存在 + return True, no_exists diff --git a/app/chain/cookiecloud.py b/app/chain/cookiecloud.py new file mode 100644 index 00000000..78165699 --- /dev/null +++ b/app/chain/cookiecloud.py @@ -0,0 +1,55 @@ +from typing import Tuple + +from app.chain import _ChainBase +from app.core import settings +from app.db.sites import Sites +from app.helper.cookiecloud import CookieCloudHelper +from app.helper.sites import SitesHelper +from app.log import logger + + +class CookieCloudChain(_ChainBase): + """ + 同步站点Cookie + """ + + def __init__(self): + super().__init__() + self.sites = Sites() + self.siteshelper = SitesHelper() + self.cookiecloud = CookieCloudHelper( + server=settings.COOKIECLOUD_HOST, + key=settings.COOKIECLOUD_KEY, + password=settings.COOKIECLOUD_PASSWORD + ) + + def process(self) -> Tuple[bool, str]: + """ + 通过CookieCloud同步站点Cookie + """ + logger.info("开始同步CookieCloud站点 ...") + cookies, msg = self.cookiecloud.download() + if not cookies: + logger.error(f"CookieCloud同步失败:{msg}") + return False, msg + # 保存Cookie或新增站点 + _update_count = 0 + _add_count = 0 + for domain, cookie in cookies.items(): + if self.sites.exists(domain): + # 更新站点Cookie + self.sites.update_cookie(domain, cookie) + _update_count += 1 + else: + # 获取站点信息 + indexer = self.siteshelper.get_indexer(domain) + if indexer: + # 新增站点 + self.sites.add(name=indexer.get("name"), + url=indexer.get("domain"), + domain=domain, + cookie=cookie) + _add_count += 1 + ret_msg = f"更新了{_update_count}个站点,新增了{_add_count}个站点" + logger.info(f"CookieCloud同步成功:{ret_msg}") + return True, ret_msg diff --git a/app/chain/douban_sync.py b/app/chain/douban_sync.py new file mode 100644 index 00000000..1ef9122b --- /dev/null +++ b/app/chain/douban_sync.py @@ -0,0 +1,100 @@ +from pathlib import Path + +from app.chain import _ChainBase +from app.chain.common import CommonChain +from app.chain.search import SearchChain +from app.core import settings, MetaInfo +from app.db.subscribes import Subscribes +from app.helper.rss import RssHelper +from app.log import logger + + +class DoubanSyncChain(_ChainBase): + """ + 同步豆瓣相看数据 + """ + + _interests_url: str = "https://www.douban.com/feed/people/%s/interests" + + _cache_path: Path = settings.TEMP_PATH / "__doubansync_cache__" + + def __init__(self): + super().__init__() + self.rsshelper = RssHelper() + self.common = CommonChain() + self.searchchain = SearchChain() + self.subscribes = Subscribes() + + def process(self): + """ + 通过用户RSS同步豆瓣相看数据 + """ + if not settings.DOUBAN_USER_IDS: + return + # 读取缓存 + caches = self._cache_path.read_text().split("\n") if self._cache_path.exists() else [] + for user_id in settings.DOUBAN_USER_IDS.split(","): + # 同步每个用户的豆瓣数据 + if not user_id: + continue + logger.info(f"开始同步用户 {user_id} 的豆瓣想看数据 ...") + url = self._interests_url % user_id + results = self.rsshelper.parse(url) + if not results: + logger.error(f"未获取到用户 {user_id} 豆瓣RSS数据:{url}") + return + # 解析数据 + for result in results: + dtype = result.get("title", "")[:2] + title = result.get("title", "")[2:] + if dtype not in ["想看"]: + continue + douban_id = result.get("link", "").split("/")[-2] + if not douban_id or douban_id in caches: + continue + # 根据豆瓣ID获取豆瓣数据 + doubaninfo = self.run_module('douban_info', doubanid=douban_id) + if not doubaninfo: + logger.warn(f'未获取到豆瓣信息,标题:{title},豆瓣ID:{douban_id}') + continue + # 识别媒体信息 + meta = MetaInfo(doubaninfo.get("original_title") or doubaninfo.get("title")) + if doubaninfo.get("year"): + meta.year = doubaninfo.get("year") + mediainfo = self.run_module('recognize_media', meta=meta) + if not mediainfo: + logger.warn(f'未识别到媒体信息,标题:{title},豆瓣ID:{douban_id}') + continue + # 加入缓存 + caches.append(douban_id) + # 查询缺失的媒体信息 + exist_flag, no_exists = self.common.get_no_exists_info(mediainfo=mediainfo) + if exist_flag: + logger.info(f'{mediainfo.get_title_string()} 媒体库中已存在') + continue + # 搜索 + contexts = self.searchchain.process(meta=meta, mediainfo=mediainfo) + if not contexts: + logger.warn(f'{mediainfo.get_title_string()} 未搜索到资源') + continue + # 自动下载 + _, lefts = self.common.batch_download(contexts=contexts, need_tvs=no_exists) + if not lefts: + # 全部下载完成 + logger.info(f'{mediainfo.get_title_string()} 下载完成') + else: + # 未完成下载 + logger.info(f'{mediainfo.get_title_string()} 未下载未完整,添加订阅 ...') + # 添加订阅 + state, msg = self.subscribes.add(mediainfo, + season=meta.begin_season) + if state: + # 订阅成功 + self.common.post_message( + title=f"{mediainfo.get_title_string()} 已添加订阅", + text="来自:豆瓣相看", + image=mediainfo.get_message_image()) + + logger.info(f"用户 {user_id} 豆瓣相看同步完成") + # 保存缓存 + self._cache_path.write_text("\n".join(caches)) diff --git a/app/chain/identify.py b/app/chain/identify.py new file mode 100644 index 00000000..4b65f51f --- /dev/null +++ b/app/chain/identify.py @@ -0,0 +1,33 @@ +from typing import Optional + +from app.chain import _ChainBase +from app.core import Context, MetaInfo, MediaInfo +from app.log import logger + + +class IdentifyChain(_ChainBase): + """ + 识别处理链 + """ + + def process(self, title: str, subtitle: str = None) -> Optional[Context]: + """ + 识别媒体信息 + """ + logger.info(f'开始识别媒体信息,标题:{title},副标题:{subtitle} ...') + # 识别前预处理 + result = self.run_module('prepare_recognize', title=title, subtitle=subtitle) + if result: + title, subtitle = result + # 识别元数据 + metainfo = MetaInfo(title, subtitle) + # 识别媒体信息 + mediainfo: MediaInfo = self.run_module('recognize_media', meta=metainfo) + if not mediainfo: + logger.warn(f'{title} 未识别到媒体信息') + return Context(meta=metainfo) + logger.info(f'{title} 识别到媒体信息:{mediainfo.type.value} {mediainfo.get_title_string()}') + # 更新媒体图片 + self.run_module('obtain_image', mediainfo=mediainfo) + # 返回上下文 + return Context(meta=metainfo, mediainfo=mediainfo, title=title, subtitle=subtitle) diff --git a/app/chain/search.py b/app/chain/search.py new file mode 100644 index 00000000..66314408 --- /dev/null +++ b/app/chain/search.py @@ -0,0 +1,73 @@ +from typing import Optional, List + +from app.chain import _ChainBase +from app.chain.common import CommonChain +from app.core import Context, MetaInfo, MediaInfo, TorrentInfo +from app.core.meta import MetaBase +from app.helper.sites import SitesHelper +from app.log import logger + + +class SearchChain(_ChainBase): + """ + 站点资源搜索处理链 + """ + + def __init__(self): + super().__init__() + self.common = CommonChain() + self.siteshelper = SitesHelper() + + def process(self, meta: MetaBase, mediainfo: MediaInfo, + keyword: str = None) -> Optional[List[Context]]: + """ + 根据媒体信息,执行搜索 + :param meta: 元数据 + :param mediainfo: 媒体信息 + :param keyword: 搜索关键词 + """ + # 执行搜索 + logger.info(f'开始搜索资源,关键词:{keyword or mediainfo.title} ...') + torrents: List[TorrentInfo] = self.run_module( + 'search_torrents', + mediainfo=mediainfo, + keyword=keyword, + sites=self.siteshelper.get_indexers() + ) + if not torrents: + logger.warn(f'{keyword or mediainfo.title} 未搜索到资源') + return [] + # 过滤不匹配的资源 + _match_torrents = [] + if mediainfo: + for torrent in torrents: + # 比对IMDBID + if torrent.imdbid \ + and mediainfo.imdb_id \ + and torrent.imdbid == mediainfo.imdb_id: + _match_torrents.append(torrent) + continue + # 识别 + torrent_meta = MetaInfo(torrent.title, torrent.description) + # 识别媒体信息 + torrent_mediainfo: MediaInfo = self.run_module('recognize_media', meta=torrent_meta) + if not torrent_mediainfo: + logger.warn(f'未识别到媒体信息,标题:{torrent.title}') + continue + # 过滤 + if torrent_mediainfo.tmdb_id == mediainfo.tmdb_id \ + and torrent_mediainfo.type == mediainfo.type: + _match_torrents.append(torrent) + else: + _match_torrents = torrents + # 过滤种子 + result = self.run_module("filter_torrents", torrent_list=_match_torrents) + if result is not None: + _match_torrents = result + if not _match_torrents: + logger.warn(f'{keyword or mediainfo.title} 没有符合过滤条件的资源') + return [] + # 组装上下文返回 + return [Context(meta=MetaInfo(torrent.title), + mediainfo=mediainfo, + torrentinfo=torrent) for torrent in _match_torrents] diff --git a/app/chain/subscribe.py b/app/chain/subscribe.py new file mode 100644 index 00000000..ad5e4d46 --- /dev/null +++ b/app/chain/subscribe.py @@ -0,0 +1,195 @@ +from typing import Dict, List + +from app.chain import _ChainBase +from app.chain.common import CommonChain +from app.chain.search import SearchChain +from app.core import MetaInfo, TorrentInfo, Context, MediaInfo +from app.db.subscribes import Subscribes +from app.helper.sites import SitesHelper +from app.log import logger +from app.utils.string import StringUtils +from app.utils.types import MediaType + + +class SubscribeChain(_ChainBase): + """ + 订阅处理链 + """ + + # 站点最新种子缓存 {站点域名: 种子上下文} + _torrents_cache: Dict[str, List[Context]] = {} + + def __init__(self): + super().__init__() + self.common = CommonChain() + self.searchchain = SearchChain() + self.subscribes = Subscribes() + self.siteshelper = SitesHelper() + + def process(self, title: str, + mtype: MediaType = None, + tmdbid: str = None, + season: int = None, + username: str = None, + **kwargs) -> bool: + """ + 识别媒体信息并添加订阅 + """ + logger.info(f'开始添加订阅,标题:{title} ...') + # 识别前预处理 + result = self.run_module('prepare_recognize', title=title) + if result: + title, _ = result + # 识别元数据 + metainfo = MetaInfo(title) + if mtype: + metainfo.type = mtype + if season: + metainfo.type = MediaType.TV + metainfo.begin_season = season + # 识别媒体信息 + mediainfo = self.run_module('recognize_media', meta=metainfo, tmdbid=tmdbid) + if not mediainfo: + logger.warn(f'未识别到媒体信息,标题:{title},tmdbid:{tmdbid}') + return False + # 更新媒体图片 + self.run_module('obtain_image', mediainfo=mediainfo) + # 添加订阅 + state, err_msg = self.subscribes.add(mediainfo, season=season, **kwargs) + if state: + logger.info(f'{mediainfo.get_title_string()} {err_msg}') + else: + logger.error(f'{mediainfo.get_title_string()} 添加订阅成功') + self.common.post_message(title=f"{mediainfo.get_title_string()} 已添加订阅", + text="用户:{username}", + image=mediainfo.get_message_image()) + # 返回结果 + return state + + def search(self, sid: int = None, state: str = 'N'): + """ + 订阅搜索 + :param sid: 订阅ID,有值时只处理该订阅 + :param state: 订阅状态 N:未搜索 R:已搜索 + :return: 更新订阅状态为R或删除订阅 + """ + if sid: + subscribes = [self.subscribes.get(sid)] + else: + subscribes = self.subscribes.list(state) + # 遍历订阅 + for subscribe in subscribes: + # 如果状态为N则更新为R + if subscribe.state == 'N': + self.subscribes.update(subscribe.id, {'state': 'R'}) + # 生成元数据 + meta = MetaInfo(subscribe.name) + meta.year = subscribe.year + meta.begin_season = subscribe.season + meta.type = MediaType.MOVIE if subscribe.type == MediaType.MOVIE.value else MediaType.TV + # 识别媒体信息 + mediainfo = self.run_module('recognize_media', meta=meta, tmdbid=subscribe.tmdbid) + if not mediainfo: + logger.warn(f'未识别到媒体信息,标题:{subscribe.name},tmdbid:{subscribe.tmdbid}') + continue + # 查询缺失的媒体信息 + exist_flag, no_exists = self.common.get_no_exists_info(mediainfo=mediainfo) + if exist_flag: + logger.info(f'{mediainfo.get_title_string()} 媒体库中已存在,完成订阅') + self.subscribes.delete(subscribe.id) + continue + # 搜索 + contexts = self.searchchain.process(meta=meta, mediainfo=mediainfo, keyword=subscribe.keyword) + if not contexts: + logger.warn(f'{subscribe.keyword or subscribe.name} 未搜索到资源') + continue + # 自动下载 + _, lefts = self.common.batch_download(contexts=contexts, need_tvs=no_exists) + if not lefts: + # 全部下载完成 + logger.info(f'{mediainfo.get_title_string()} 下载完成,完成订阅') + self.subscribes.delete(subscribe.id) + else: + # 未完成下载 + logger.info(f'{mediainfo.get_title_string()} 未下载未完整,继续订阅 ...') + + def refresh(self): + """ + 刷新站点最新资源 + """ + # 所有站点索引 + indexers = self.siteshelper.get_indexers() + # 遍历站点缓存资源 + for indexer in indexers: + domain = StringUtils.get_url_domain(indexer.get("domain")) + torrents: List[TorrentInfo] = self.run_module("refresh_torrents", sites=[indexer]) + if torrents: + self._torrents_cache[domain] = [] + for torrent in torrents: + # 识别 + meta = MetaInfo(torrent.title, torrent.description) + # 识别媒体信息 + mediainfo = self.run_module('recognize_media', meta=meta) + if not mediainfo: + logger.warn(f'未识别到媒体信息,标题:{torrent.title}') + continue + # 上下文 + context = Context(meta=meta, mediainfo=mediainfo, torrentinfo=torrent) + self._torrents_cache[domain].append(context) + # 从缓存中匹配订阅 + self.match() + + def match(self): + """ + 从缓存中匹配订阅,并自动下载 + """ + # 所有订阅 + subscribes = self.subscribes.list('R') + # 遍历订阅 + for subscribe in subscribes: + # 生成元数据 + meta = MetaInfo(subscribe.name) + meta.year = subscribe.year + meta.begin_season = subscribe.season + meta.type = MediaType.MOVIE if subscribe.type == MediaType.MOVIE.value else MediaType.TV + # 识别媒体信息 + mediainfo: MediaInfo = self.run_module('recognize_media', meta=meta, tmdbid=subscribe.tmdbid) + if not mediainfo: + logger.warn(f'未识别到媒体信息,标题:{subscribe.name},tmdbid:{subscribe.tmdbid}') + continue + # 查询缺失的媒体信息 + exist_flag, no_exists = self.common.get_no_exists_info(mediainfo=mediainfo) + if exist_flag: + logger.info(f'{mediainfo.get_title_string()} 媒体库中已存在,完成订阅') + self.subscribes.delete(subscribe.id) + continue + # 遍历缓存种子 + _match_context = [] + for domain, contexts in self._torrents_cache.items(): + for context in contexts: + # 检查是否匹配 + torrent_meta = context.meta_info + torrent_mediainfo = context.media_info + torrent_info = context.torrent_info + if torrent_mediainfo.tmdb_id == mediainfo.tmdb_id \ + and torrent_mediainfo.type == mediainfo.type: + if meta.begin_season and meta.begin_season != torrent_meta.begin_season: + continue + # 匹配成功 + logger.info(f'{mediainfo.get_title_string()} 匹配成功:{torrent_info.title}') + _match_context.append(context) + logger(f'{mediainfo.get_title_string()} 匹配完成,共匹配到{len(_match_context)}个资源') + if _match_context: + # 批量择优下载 + _, lefts = self.common.batch_download(contexts=_match_context, need_tvs=no_exists) + if not lefts: + # 全部下载完成 + logger.info(f'{mediainfo.get_title_string()} 下载完成,完成订阅') + self.subscribes.delete(subscribe.id) + else: + # 未完成下载,计算剩余集数 + left_episodes = lefts.get(mediainfo.tmdb_id, {}).get("episodes", []) + logger.info(f'{mediainfo.get_title_string()} 未下载未完整,更新缺失集数为{len(left_episodes)} ...') + self.subscribes.update(subscribe.id, { + "lack_episode": len(left_episodes) + }) diff --git a/app/chain/user_message.py b/app/chain/user_message.py new file mode 100644 index 00000000..705c488a --- /dev/null +++ b/app/chain/user_message.py @@ -0,0 +1,266 @@ +from typing import Dict + +from fastapi import Request + +from app.chain import _ChainBase +from app.chain.common import * +from app.chain.search import SearchChain +from app.core import MediaInfo, TorrentInfo, MetaInfo +from app.db.subscribes import Subscribes +from app.log import logger +from app.utils.types import EventType + + +class UserMessageChain(_ChainBase): + """ + 外来消息处理链 + """ + # 缓存的用户数据 {userid: {type: str, items: list}} + _user_cache: Dict[str, dict] = {} + # 每页数据量 + _page_size: int = 8 + # 当前页面 + _current_page: int = 0 + # 当前元数据 + _current_meta: Optional[MetaInfo] = None + # 当前媒体信息 + _current_media: Optional[MediaInfo] = None + + def __init__(self): + super().__init__() + self.common = CommonChain() + self.subscribes = Subscribes() + self.searchchain = SearchChain() + + def process(self, request: Request, *args, **kwargs) -> None: + """ + 识别消息内容,执行操作 + """ + # 获取消息内容 + info: dict = self.run_module('message_parser', request=request) + if not info: + return + # 用户ID + userid = info.get('userid') + if not userid: + logger.debug(f'未识别到用户ID:{request}') + return + # 消息内容 + text = str(info.get('text')).strip() if info.get('text') else None + if not text: + logger.debug(f'未识别到消息内容:{request}') + return + logger.info(f'收到用户消息内容,用户:{userid},内容:{text}') + if text.startswith('/'): + # 执行命令 + self.eventmanager.send_event( + EventType.CommandExcute, + { + "cmd": text + } + ) + elif text.isdigit(): + # 缓存 + cache_data: dict = self._user_cache.get(userid) + # 选择项目 + if not cache_data \ + or not cache_data.get('items') \ + or len(cache_data.get('items')) < int(text): + # 发送消息 + self.common.post_message(title="输入有误!", userid=userid) + return + # 缓存类型 + cache_type: str = cache_data.get('type') + # 缓存列表 + cache_list: list = cache_data.get('items') + # 选择 + if cache_type == "Search": + mediainfo: MediaInfo = cache_list[int(text) - 1] + self._current_media = mediainfo + # 检查是否已存在 + exists: list = self.run_module('media_exists', mediainfo=mediainfo) + if exists: + # 已存在 + self.common.post_message( + title=f"{mediainfo.type.value} {mediainfo.get_title_string()} 媒体库中已存在", userid=userid) + return + # 搜索种子 + contexts = self.searchchain.process(meta=self._current_meta, mediainfo=mediainfo) + if not contexts: + # 没有数据 + self.common.post_message(title=f"{mediainfo.title} 未搜索到资源!", userid=userid) + return + # 更新缓存 + self._user_cache[userid] = { + "type": "Torrent", + "items": contexts + } + self._current_page = 0 + # 发送种子数据 + self.__post_torrents_message(items=contexts[:self._page_size], userid=userid) + + elif cache_type == "Subscribe": + # 订阅媒体 + mediainfo: MediaInfo = cache_list[int(text) - 1] + self._current_media = mediainfo + state, msg = self.subscribes.add(mediainfo, + season=self._current_meta.begin_season, + episode=self._current_meta.begin_episode) + if state: + # 订阅成功 + self.common.post_message( + title=f"{mediainfo.get_title_string()} 已添加订阅", + image=mediainfo.get_message_image(), + userid=userid) + else: + # 订阅失败 + self.common.post_message(title=f"{mediainfo.title} 添加订阅失败:{msg}", userid=userid) + elif cache_type == "Torrent": + if int(text) == 0: + # 自动选择下载 + # 查询缺失的媒体信息 + exist_flag, no_exists = self.common.get_no_exists_info(mediainfo=self._current_media) + if exist_flag: + self.common.post_message(title=f"{self._current_media.get_title_string()} 媒体库中已存在", + userid=userid) + return + # 批量下载 + self.common.batch_download(contexts=cache_list, need_tvs=no_exists, userid=userid) + else: + # 下载种子 + torrent: TorrentInfo = cache_list[int(text) - 1] + # 识别种子信息 + meta = MetaInfo(torrent.title) + # 预处理种子 + torrent_file, msg = self.run_module("prepare_torrent", torrentinfo=torrent) + if not torrent_file: + # 下载失败 + self.run_module('post_message', + title=f"{torrent.title} 种子下载失败!", + text=f"错误信息:{msg}\n种子链接:{torrent.enclosure}", + userid=userid) + return + # 添加下载 + state, msg = self.run_module("download_torrent", + torrent_path=torrent_file, + mediainfo=self._current_media) + if not state: + # 下载失败 + self.common.post_message(title=f"{torrent.title} 添加下载失败!", + text=f"错误信息:{msg}", + userid=userid) + return + # 下载成功,发送通知 + self.common.post_download_message(meta=meta, mediainfo=self._current_media, torrent=torrent) + + elif text.lower() == "p": + # 上一页 + cache_data: dict = self._user_cache.get(userid) + if not cache_data: + # 没有缓存 + self.common.post_message(title="输入有误!", userid=userid) + return + + if self._current_page == 0: + # 第一页 + self.common.post_message(title="已经是第一页了!", userid=userid) + return + cache_type: str = cache_data.get('type') + cache_list: list = cache_data.get('items') + # 减一页 + self._current_page -= 1 + if self._current_page == 0: + start = 0 + end = self._page_size + else: + start = self._current_page * self._page_size + end = start + self._page_size + if cache_type == "Torrent": + # 发送种子数据 + self.__post_torrents_message(items=cache_list[start:end], userid=userid) + else: + # 发送媒体数据 + self.__post_medias_message(items=cache_list[start:end], userid=userid) + + elif text.lower() == "n": + # 下一页 + cache_data: dict = self._user_cache.get(userid) + if not cache_data: + # 没有缓存 + self.common.post_message(title="输入有误!", userid=userid) + return + cache_type: str = cache_data.get('type') + cache_list: list = cache_data.get('items') + # 加一页 + self._current_page += 1 + cache_list = cache_list[self._current_page * self._page_size:] + if not cache_list: + # 没有数据 + self.common.post_message(title="已经是最后一页了!", userid=userid) + return + else: + if cache_type == "Torrent": + # 发送种子数据 + self.__post_torrents_message(items=cache_list, userid=userid) + else: + # 发送媒体数据 + self.__post_medias_message(items=cache_list, userid=userid) + + else: + # 搜索或订阅 + if text.startswith("订阅"): + # 订阅 + content = re.sub(r"订阅[::\s]*", "", text) + action = "Subscribe" + else: + # 搜索 + content = re.sub(r"(搜索|下载)[::\s]*", "", text) + action = "Search" + # 提取要素 + mtype, key_word, season_num, episode_num, year, title = StringUtils.get_keyword(content) + # 识别 + meta = MetaInfo(title) + if not meta.get_name(): + self.common.post_message(title="无法识别输入内容!", userid=userid) + return + # 合并信息 + if mtype: + meta.type = mtype + if season_num: + meta.begin_season = season_num + if episode_num: + meta.begin_episode = episode_num + if year: + meta.year = year + self._current_meta = meta + # 开始搜索 + medias = self.run_module('search_medias', meta=meta) + if not medias: + self.common.post_message(title=f"{meta.get_name()} 没有找到对应的媒体信息!", userid=userid) + return + self._user_cache[userid] = { + 'type': action, + 'items': medias + } + self._current_page = 0 + self._current_media = None + # 发送媒体列表 + self.__post_medias_message(items=medias[:self._page_size], userid=userid) + + def __post_medias_message(self, items: list, userid: str): + """ + 发送媒体列表消息 + """ + self.run_module('post_medias_message', + title="请回复数字选择对应媒体(p:上一页, n:下一页)", + items=items, + userid=userid) + + def __post_torrents_message(self, items: list, userid: str): + """ + 发送种子列表消息 + """ + self.run_module('post_torrents_message', + title="请回复数字下载对应资源(0:自动选择, p:上一页, n:下一页)", + items=items, + userid=userid) diff --git a/app/chain/webhook_message.py b/app/chain/webhook_message.py new file mode 100644 index 00000000..1afdce95 --- /dev/null +++ b/app/chain/webhook_message.py @@ -0,0 +1,20 @@ +from typing import Any + +from app.chain import _ChainBase + + +class WebhookMessageChain(_ChainBase): + """ + 响应Webhook事件 + """ + + def process(self, message: dict) -> None: + """ + 处理Webhook报文并发送消息 + """ + # 获取主体内容 + info = self.run_module('webhook_parser', message=message) + if not info: + return + # 发送消息 + self.run_module("post_message", title=info.get("title"), text=info.get("text"), image=info.get("image")) diff --git a/app/command.py b/app/command.py new file mode 100644 index 00000000..086ecd5d --- /dev/null +++ b/app/command.py @@ -0,0 +1,95 @@ +from typing import Any + +from app.chain.cookiecloud import CookieCloudChain +from app.chain.douban_sync import DoubanSyncChain +from app.chain.subscribe import SubscribeChain +from app.core import eventmanager, PluginManager, EventManager +from app.core.event_manager import Event +from app.log import logger +from app.utils.singleton import Singleton +from app.utils.types import EventType + + +class Command(metaclass=Singleton): + """ + 全局命令管理 + """ + # 内建命令 + _commands = { + "/cookiecloud": { + "func": CookieCloudChain().process, + "description": "同步CookieCloud的Cookie", + "data": {} + }, + "/doubansync": { + "func": DoubanSyncChain().process, + "description": "同步豆瓣想看", + "data": {} + }, + "/subscribe": { + "func": SubscribeChain().search, + "description": "刷新所有订阅", + "data": { + 'state': 'R', + } + } + } + + def __init__(self): + # 注册插件命令 + plugin_commands = PluginManager().get_plugin_commands() + for command in plugin_commands: + self.register( + cmd=command.get('cmd'), + func=Command.send_plugin_event, + desc=command.get('desc'), + data={ + 'etype': command.get('event'), + 'data': command.get('data') + } + ) + + def register(self, cmd: str, func: Any, data: dict = None, desc: str = None) -> None: + """ + 注册命令 + """ + self._commands[cmd] = { + "func": func, + "description": desc, + "data": data or {} + } + + def get(self, cmd: str) -> Any: + """ + 获取命令 + """ + return self._commands.get(cmd, {}) + + def execute(self, cmd: str) -> None: + """ + 执行命令 + """ + command = self.get(cmd) + if command: + logger.info(f"开始执行:{command.get('description')} ...") + data = command['data'] if command.get('data') else {} + command['func'](**data) + + @staticmethod + def send_plugin_event(etype: EventType, data: dict) -> None: + """ + 发送插件命令 + """ + EventManager().send_event(etype, data) + + @eventmanager.register(EventType.CommandExcute) + def command_event(self, event: Event) -> None: + """ + 注册命令执行事件 + event_data: { + "cmd": "/xxx" + } + """ + cmd = event.event_data.get('cmd') + if self.get(cmd): + self.execute(cmd) diff --git a/app/core/__init__.py b/app/core/__init__.py new file mode 100644 index 00000000..5f304d8e --- /dev/null +++ b/app/core/__init__.py @@ -0,0 +1,6 @@ +from .config import settings +from .event_manager import eventmanager, EventManager +from .meta_info import MetaInfo +from .module_manager import ModuleManager +from .plugin_manager import PluginManager +from .context import Context, MediaInfo, TorrentInfo diff --git a/app/core/__pycache__/__init__.cpython-310.pyc b/app/core/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7d6cf9985051d417cd243360e29deeda689fb3f9 GIT binary patch literal 494 zcmYjNOHRWu6m&k#r%eJ&HXI-u4uDXFRIy+Y6bX=!6)B1mH+5ylk>gfn!+p4tx2(7V zE1q2_ILc^d^4^;li!_}hIG6OTa~*^}jQD?C5V!D7F903t9EP}q9mjB&x!l7Z_pxua z$7Vdhf#p66d4wa&XDsG(Jhwbx3!dPFr#R&q&cF*FQ67ClHp(3xO++a=^i%HYgzU+n zcr!FTkvh3EsyHfBSrFCS4{HHDEkw6t8GUjL*^4?O7u=$J!pO`%85Oku`t_Ng+k=4kUzW@tJ?m~VEF z5hxiOFn9lsWM;U5ujT5xdY*`!s_o&>Z>sXO-87PyQfx`9rm7HoN=nLvs+w`ES|LeQ d!!}ga_0{;QqnqP8OLL!70+66{C$Z0k^9^Osh5`Tp literal 0 HcmV?d00001 diff --git a/app/core/__pycache__/config.cpython-310.pyc b/app/core/__pycache__/config.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..83ebd4ffef99f23848431f96440b850b36d9be16 GIT binary patch literal 4668 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 BWDo!V literal 0 HcmV?d00001 diff --git a/app/core/__pycache__/event_manager.cpython-310.pyc b/app/core/__pycache__/event_manager.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cf108e55d0a2353da18f194dddcc2cddcbece315 GIT binary patch literal 3110 zcmZ`*|8EpU6rY)$-P`-tmQqmsMg?Oy66@EWNHH2D8kGxLkg%y)mz(Kvb?^3=-K$)4 z7)?)U;ur7-O_XTb#6(GqN=!70{v-RVl)_K`jtThQ%-zu|xR-gEdGqegywALEQL&gK z@I6?2SG4nl{Edr^pAC!WV8m|$5k%0C)Tu}7%wrVSEVSy}<9cp|cHQwDJ?CMj?s_gI zFA`x3r%Qw*9g+FO^0L5jMHV<&nOm~Fyv!~UuOM2v7#O!LE$HhW3K{{}(%JzR%T2;}<&Tf9T>f?a$JO=oAFh4*z2=qE zyf4u>14Pz888k#FRa~JPti(BkaR5d<4kRHU zoV!R=0hTuo9N0H|GzR6f^QTW&PtG20S55}1epp5GvXaEJhoXg=JX{N-WHx9vXDgAC zv-)y=-PkhKY^Sd8*BZ6N_wgPv2ja3ETimwM=Bd8SkQEln!q8T{1e3+>9Wqbmsi1-h z>l1c{!kVqn4xP7F=^56c9oC$vk~ww^EaW8N?cJ2%PjKWq5X5q<7N7**a*GfAy3qgGNb*&4Cbs>(#emgbDn3HY1BO9QYFGbFV& zKh5{v=+#=BXkZN~qDU5$m#>eOg{0i`6w-&b#0W}Z@<#=A2=_#+^!TnF8 z3=56i984BnL=JGGJIER97-?()bXa?bL8l75j@6f#29z4~9nxVPYk{gKJJyQTVXKq^ zo-4LMwCM$i@D95`zUIgm){Gt{-g*QM8$fvVm+#j;{Mg{S_H7s3c(B#l0)pDI$=78S zfRW;#Kfk(RO+GeRE;$BPdm#uR*xgrT`=C;hN*(Yr*$@iNOKl-fw5k`mhFaYNEQJuN zZAj34H=sNo2w_n6Lp-Y?)ozf8Cx9T_1TVcckNJ5t3p_Z5$UnVb*H{COInSyUa zR$hfJ;8dmq**3A3$r4TA@s{Y@OzmAJ^Y)6fdN=uKm)A+#@ z&h)WvUjtS(T@yzfp5Igx`!WWBaV(^bpf16<99SBOR*3V0@1JS~VQ(kn`y#6NzNzW> zVCksu2aQIQ1W7Gw05m4Ia#5=!3d@b!jsy`@B_s%|dKk&0NcJGX@ZaFe1N>A5Hn2n+ zdJ?rgh2&`@&mhq--&S}VzTL1p3nNDOU4UNf@bu1-JRR$R4`S{P43V3^KVVRU+W$0F6`Mw`=oU$6;!M z`qpU8c4-IB*o1na>f63UA+T{KMrAB=>@68i1@;(h{vn7!V*NhI3#f`V@TTO;Rb>%u z1TEtlCU_b9s_?Qm{6ruHD8LuwDalXnV_j~DD$_Yw(Y>oX&#$$<|D)Z!7=86?wEpwo z&#tsK9=FzhkD6=kI}f9)SE8@CS{s*M{&W*u(dA!SHy*TZZbjGbwePI8A3cq3ecS$F zb$9Dxboo96?7p}j{dgC6h0asEu5YXHJi^_Vn9qZoe9e5GD`@Y6wwKrS8Rv=Cb2B2|C|`h zo1byYxLI9VnqM%BXUhu~bBoNY(z4IZ32)J+MceUw)2i3avd5_DLUD6;t>PW2pA9up z>NqGVNXIo01E~a3a1OJ6@t#t%Tv|o|UoC+}Sur6@0D;66f?&kb1|m3svx+xmc7TYn z3!Bol4Rmclk-fOLx_5ytd$wT_C+vE%@hLnJw{d^;&D%SFJ&C@#+j@4tcUGcQm{Uxf z|IbG7rFpyO#>vJ2q}^U=mWJLQdH3{8aeQQUXnW;5lMjM%`rKiY4~@VsnPhSH{L$g# z%b=VqO_}8UF@S^M8|)~--T{7rjt(DN4hqE+A~3!chwdACd;whPI7EJUveaA5EWBWr zbUDO~0&l3r$_rt7{Nu?_P8G&RrwTe^2jLT98g#?~q4t4z9X1z2Nhs(b>TC^8yd^--xnm}84wvs!x<>*u>9Jg{{W2co~-}? literal 0 HcmV?d00001 diff --git a/app/core/__pycache__/module_manager.cpython-310.pyc b/app/core/__pycache__/module_manager.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..923dfc4a4e4e611b4aac628c1cba054054cd2b5e GIT binary patch literal 2445 zcma)8TaOe)6t1eSzRXO|a#^yv2#S}Oj4_KZCdO2<;^PCF;hccTU? zDo3MEB!euKh4W??CxQf)IV#GsxU-;e%S43(=k&wd9VMCrlKLlO5KytE9HVAqbE~T^Rh$Icfa5KnUMalfnM2^AgdxsCb-aMru zshX{G=N1;5$Ipk0fova_X)6jd)tpJs#?kRONwa3q?KZ>~X=23Qso|0l_0iu5Dy{xJFd1o4K?M^AfPr6R%QOa)e5R?9)5GNLXO>yc zT722aSx#C;4l&5tDy(WT&Fk+ZSvS!QnYC^UGdI2=SJ?&t^~?@ofn)663viisHHM)7 z@%r7{w+9zi2H##N!|`BhsRnjWZ3ZJm(}oRs1NsT*3JuRl4!Ws70;&7PqJa zT$Q?PjP9iT-qP;JTL-s9*1YVP#+R8e zGnN^X!%<9I1QTg-wR-`gi5!9lpf=fL%Y50)tlZ2Yu=2H>Wp>H0Qjm- z8y;X34;uWiGWh<-{)e{*pWhgK`Ah%uPyL&}^{;<-=hBUlbqZ5XP&@=f8>Rw6Ti9W$ z*#?z}vWMbUxZz?Hp7u-6?}r6tj`OAcqk&q8vSFe54~1Lz7WO9cM~uZRdXP!eAml`G z)G;Rz0J_XFl2ILi@tg_TBXS&Phod<=&Ey^&5jx`@>zrFF{r7(#I_KBHg-`ppRz{q2 z@(6gv1}iWlB_gR|$mifwSn8cP3l|IXY>@P#hy7D8ZQQgCW1}#~IOl+DKr|hL&gs%C z|Jz-gN6j`W5;MNwb7`7Lj9p=7y>1fe3@yw!i`q(#!?=7N$xa{*ODCq>g9FbZc@YVg zDESl;to$X>1*WzoY%jr-!i{WYr#WF+bq@MNW>WS~m9hJl!B+U+OOubaW42M3Pr~-1 z>TeabC_dHjO#h5wG{wx5GH|AvyCzEBfKS4>0S$X_{El2 zXfHch_VIV8VNg_2T-0xgvP{}I08fgtAdaKd%i=^$so~>7!V9WY>rwhbS#Rq<`~ggR Rt+Y$FLkV=j*)E+h{ss7IZDIfb literal 0 HcmV?d00001 diff --git a/app/core/__pycache__/plugin_manager.cpython-310.pyc b/app/core/__pycache__/plugin_manager.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ada8ae80df9f29755a182f4f9810c9a8f75afdf3 GIT binary patch literal 8177 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 max_len else overview + return overview + + def get_season_episodes(self, sea: int) -> list: + """ + 返回指定季度的剧集信息 + """ + if not self.seasons: + return [] + return self.seasons.get(sea) or [] + + +class Context(object): + """ + 上下文对象 + """ + # 识别前的信息 + title: Optional[str] = None + subtitle: Optional[str] = None + + # 用户信息 + userid: Optional[str] = None + username: Optional[str] = None + + # 操作类型 + action: Optional[str] = None + + # 识别信息 + _meta_info: Optional[MetaBase] = None + # 种子信息 + _torrent_info: Optional[TorrentInfo] = None + # 媒体信息 + _media_info: Optional[MediaInfo] = None + + def __init__(self, + meta: MetaBase = None, + mediainfo: MediaInfo = None, + torrentinfo: TorrentInfo = None, + **kwargs): + if meta: + self._meta_info = meta + if mediainfo: + self._media_info = mediainfo + if torrentinfo: + self._torrent_info = torrentinfo + if kwargs: + for k, v in kwargs.items(): + setattr(self, k, v) + + @property + def meta_info(self): + return self._meta_info + + def set_meta_info(self, title: str, subtitle: str = None): + self._meta_info = MetaInfo(title, subtitle) + + @property + def media_info(self): + return self._media_info + + def set_media_info(self, + tmdb_info: dict = None, + douban_info: dict = None): + self._media_info = MediaInfo(tmdb_info, douban_info) + + @property + def torrent_info(self): + return self._torrent_info + + def set_torrent_info(self, info: dict): + self._torrent_info = TorrentInfo(**info) + + def __getattr__(self, attribute): + return None + + def __setattr__(self, name: str, value: Any): + self.__dict__[name] = value + + def to_dict(self): + """ + 转换为字典 + """ + def object_to_dict(obj): + attributes = [ + attr for attr in dir(obj) + if not callable(getattr(obj, attr)) and not attr.startswith("_") + ] + return { + attr: getattr(obj, attr).value + if isinstance(getattr(obj, attr), MediaType) + else getattr(obj, attr) for attr in attributes + } + + return { + "meta_info": object_to_dict(self.meta_info), + "media_info": object_to_dict(self.media_info) + } diff --git a/app/core/event_manager.py b/app/core/event_manager.py new file mode 100644 index 00000000..3b60d350 --- /dev/null +++ b/app/core/event_manager.py @@ -0,0 +1,105 @@ +from queue import Queue, Empty + +from app.log import logger +from app.utils.singleton import Singleton +from app.utils.types import EventType + + +class EventManager(metaclass=Singleton): + """ + 事件管理器 + """ + + # 事件队列 + _eventQueue: Queue = None + # 事件响应函数字典 + _handlers: dict = {} + + def __init__(self): + # 事件队列 + self._eventQueue = Queue() + # 事件响应函数字典 + self._handlers = {} + + def get_event(self): + """ + 获取事件 + """ + try: + event = self._eventQueue.get(block=True, timeout=1) + handlerList = self._handlers.get(event.event_type) + return event, handlerList or [] + except Empty: + return None, [] + + def add_event_listener(self, etype: EventType, handler: type): + """ + 注册事件处理 + """ + try: + handlerList = self._handlers[etype.value] + except KeyError: + handlerList = [] + self._handlers[etype.value] = handlerList + if handler not in handlerList: + handlerList.append(handler) + logger.debug(f"Event Registed:{etype.value} - {handler}") + + def remove_event_listener(self, etype: EventType, handler: type): + """ + 移除监听器的处理函数 + """ + try: + handlerList = self._handlers[etype.value] + if handler in handlerList[:]: + handlerList.remove(handler) + if not handlerList: + del self._handlers[etype.value] + except KeyError: + pass + + def send_event(self, etype: EventType, data: dict = None): + """ + 发送事件 + """ + if etype not in EventType: + return + event = Event(etype.value) + event.event_data = data or {} + logger.debug(f"发送事件:{etype.value} - {event.event_data}") + self._eventQueue.put(event) + + def register(self, etype: [EventType, list]): + """ + 事件注册 + :param etype: 事件类型 + """ + + def decorator(f): + if isinstance(etype, list): + for et in etype: + self.add_event_listener(et, f) + elif type(etype) == type(EventType): + for et in etype.__members__.values(): + self.add_event_listener(et, f) + else: + self.add_event_listener(etype, f) + return f + + return decorator + + +class Event(object): + """ + 事件对象 + """ + + def __init__(self, event_type=None): + # 事件类型 + self.event_type = event_type + # 字典用于保存具体的事件数据 + self.event_data = {} + + +# 实例引用,用于注册事件 +eventmanager = EventManager() diff --git a/app/core/meta/__init__.py b/app/core/meta/__init__.py new file mode 100644 index 00000000..108dca8d --- /dev/null +++ b/app/core/meta/__init__.py @@ -0,0 +1,3 @@ +from .metabase import MetaBase +from .metavideo import MetaVideo +from .metaanime import MetaAnime diff --git a/app/core/meta/__pycache__/__init__.cpython-310.pyc b/app/core/meta/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6258195ce9abeccc88a9e072ba95afeafbecb60c GIT binary patch literal 287 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%0AAM*{1k{qKZgn z=>z*VaShIIiL{bx@#T#8jE2uaP?KvnMOaTOQL;pQv1o~$z#j|Ycmy^~GHU<=5~5&y K=}`Eu_52r2xv#wd literal 0 HcmV?d00001 diff --git a/app/core/meta/__pycache__/release_groups.cpython-310.pyc b/app/core/meta/__pycache__/release_groups.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f022cb666cd6dede794083432c090858033a9c64 GIT binary patch literal 4081 zcmZu!X>b(B6`twonH`Ch5Fi9T0NDnc!3G?&fMD!a-lCr-*o3aGNHa_2|lDu<-(|}yeXski+tt-6!DpTI0s3~2B%R^R)gKj@J@ECn0HG3w zB#N0r)n^rgsa%l^?IP$)B|}a+Dwfl*S>QT#F1q@|m)-+ke}ke`>S-jINH2--=P(R2d=-zE5Nx?Je=&=qv0kguY> zLbAFc(Y{lB{u-gVR?r*hjbijB!QD*P32r^zAliN*y@lRNZ{xOL4;zJKlc2YQ#XE$> z&D5Y<#AOtcjt zt%CNr(B3Eb{q%qsJt#Or4{`2QnNBoh&^#>Ydrv{1|Ir%n(f6H_srj=0s!TdqCq#7; zB3Y;Om_(M*7G+GOQ%s%0v_YH4RFVdn1+r-&o1r$yx+nrzIZ5vrvzh6$yyu2(zi0;a zCiB8gfTGTR_+0q>Q|F%k^tq>BKl{~}&!0Ya=7}fIefDGL-uNi=#ds;%RJ)#qTFqOu zTWbiz$?AIO2X5=#;-1T5pS4ZT3|x;W_e@Pi8-|89@7@Xj1M&VrBNJzH@gQ)y@i=3| z)qMt0wzmU<@81Em!wlhcPM!Hg8{l0(>L1AQxxlz$UOef#Ge%qteXAbtXOjj|%_#Iu zqD?X@FfF2Gm{o;VpA7tZ({=5rFBAA+BU>099f=FMxIB;(3uEFsjHq?fgQeB1>6NP_ zRd3QsEAS09TAwZOrQ-~+Vh(2tdyVQoI7kN8tpu6T14JElSRqH05ynXBsAals3p&*D z>rEF618c1;HbU=Z(xKQEyh&?w#nU-YSQ~)C*aX0 z1r0M=QOFH|O53C{u#27;EL&NwX$CFVCm4J{Ia_a9j%na%c_EkOmN_dXs51{guzfpG zgOIu*Q7mu(s8iRToQt}+*T8Zs&Omsh<-mc{A20ZzJZ!jpAACPidXf$J0XNH00Me!l z&gm=U3S0*LxC~po;%(SdJBZSST)E1J7bD-K{>)sox{#}I*~}c*=95Hx@WA6Ek8!(! z)nY^`SvUKCu)ItGFfM>0MW3wq}p$houwAz4d zk2!%))M$QXg8nAr#!wD6ye zA=2+et289`4G1*|wzfay5S#^!5VaM6Goy5|3Ju>ZcNZ=Kib;oKI&-GefK6(SRc9Q> zuHR%1Nx7jXaI8h$qoD`W1dRDqb!enoEf6%|5~V!3mng-&A9Y(J?kwLIgi0v2twzI* zddpVc1u5)}kBJNhNVVZ=0Voi?9Wal3ELvZ#GQLWj8$KB40p;(UO9Vq}2O_*1%T*EH z#e`-VNanaDa+wD_n7y1@?V#m12u$)PP1nFgD_41sD5K>{w3S~dLjWOY28LOwJ{V_m zF-P6LTs(Y`-zrx;S)2t|Rq_X_+?K$B+71ISq?W@fG#$Ph+OsaWj->sz2hXt&31-ek zo!Mem01XhlrUDr@!w&~X5eI|?irkac$HvQ5LnTVJnkRU_wbvp_DW4%q&K-!l`1Z!E zc<|`hpiwe9quvZiia9Tg*_`W8?&*>d_3_MtgrKfx#(`%yXwm&<;GaNfV9BJ;*83fox5>#|B3R2P%WL{MhJtxl)&5jVm7v9bS87;p;yH zq#@1Au{156kWWfE>2P`;#R%Heyb{YNP^_GkW$DPWBPlAM0Le+vtzjy`lZi@~jSW)2`)sd@%zj*k|@s(tYhiNS66lz%IXvr0bf&Pf8xtjMAmy z?9PdCA5Jzgee`IfIZ>XggI`)@&z)xVz@I3(vlc5`wi`^qx)XKRV-qbFm=o7n^S8C< z61`S~MM227={oS(no?db&CA0`fs~3Cs6|{uvwxlzTtHRreFD_pu^88 z9C{2ovFwXdHAa3PcdWMxsQeOCo1A+|dPSK>j>2W&YA#n^LGyBePC&UEqdqA>)A%Hs zS0FGLq-xCF&O@?nUX9fl&&u9|F+QQistCcJ^QR(y@gvKeuq=_{CEnUwHb3g%^&WJ^lK*=bnAH`r>JK_AgaEcQ0Y| z9aWD7q33|oGjCk{;IrpXKfmyamzPEp$>X*7CAmN3b^hkvyB;~Tb7hm+Kl1<7jL z9*?A_anc3ENO|47zlxJyAn@>uvJ1*B(iJ+^k?;!S5)ANbB^^rzmw?wZ&_| z3UvMTK(K~oENgPFtf5YMrHoMzz^7A2Pjmu}ZoDplgb9!5xVH|-HNfE@f}bagz~OL@ zd2UHDz@#RN-#RE92Jwf(zZIscj0 zmgbiXwCGXpE<;)L)Y9JGef+Ml4FwIWE!L&eFvaIE*DxIR*6SYjnh9_{l#Fhkb`HE} zwOZ0ytF>Gj+Pt5x)sBRweR(8Rt5LTOg)+CFD1P82%WE~$aooTREZ6a2NFYIkSzI@m zTJ^wN3Hlz7jkkdl?!&7H52DAN%%}Np0qKOCPb+Dj^AJe%Hb&@wSV8~QG5QZy(Z4kf zUD8wNUz(2osdu1%;7;^+ybS$KOQXNyF7y|z8~s^Zj{byu&|CTn{3c$B{)kthKj^*a z_xft|JFO4>R$GHEYHQI2{RVU%--s6QP3RoH8J*SEp)=Zg^c%bZ{aWiszrwemU*cP} zU+A}?pX(dZ&-6{`r}%c1;5*Py@MiR5-9SImwxA#4JJAocyU_Qwt>}Ar8~Uz(H~J2~ z2Yp-Hj=qI=pl@pT;&0&lkbou<=h9Hm*Y(}KskLjw>G>~Zekay#(}%)5Q9agRN4>S+ uk7O0xn%ly_vi)uTl^@d{$E28fl`n;BMONs$7Nhtme^h+#T3t$`KIQ*% 1 and title.find("- ") == -1: + titles = [] + for name in names: + if not name: + continue + left_char = '' + if name.startswith('['): + left_char = '[' + name = name[1:] + if name and name.find("/") != -1: + if name.split("/")[-1].strip(): + titles.append("%s%s" % (left_char, name.split("/")[-1].strip())) + else: + titles.append("%s%s" % (left_char, name.split("/")[0].strip())) + elif name: + if StringUtils.is_chinese(name) and not StringUtils.is_all_chinese(name): + if not re.search(r"\[\d+", name, re.IGNORECASE): + name = re.sub(r'[\d|#::\-()()\u4e00-\u9fff]', '', name).strip() + if not name or name.strip().isdigit(): + continue + if name == '[': + titles.append("") + else: + titles.append("%s%s" % (left_char, name.strip())) + return "]".join(titles) + return title diff --git a/app/core/meta/metabase.py b/app/core/meta/metabase.py new file mode 100644 index 00000000..f0cdfcf3 --- /dev/null +++ b/app/core/meta/metabase.py @@ -0,0 +1,427 @@ +from typing import Union, Optional + +import cn2an +import regex as re + +from app.utils.string import StringUtils +from app.utils.types import MediaType + + +class MetaBase(object): + """ + 媒体信息基类 + """ + # 是否处理的文件 + isfile: bool = False + # 原字符串 + org_string: Optional[str] = None + # 副标题 + subtitle: Optional[str] = None + # 类型 电影、电视剧 + type: Optional[MediaType] = None + # 识别的中文名 + cn_name: Optional[str] = None + # 识别的英文名 + en_name: Optional[str] = None + # 年份 + year: Optional[str] = None + # 总季数 + total_seasons: int = 0 + # 识别的开始季 数字 + begin_season: Optional[int] = None + # 识别的结束季 数字 + end_season: Optional[int] = None + # 总集数 + total_episodes: int = 0 + # 识别的开始集 + begin_episode: Optional[int] = None + # 识别的结束集 + end_episode: Optional[int] = None + # Partx Cd Dvd Disk Disc + part: Optional[str] = None + # 识别的资源类型 + resource_type: Optional[str] = None + # 识别的效果 + resource_effect: Optional[str] = None + # 识别的分辨率 + resource_pix: Optional[str] = None + # 识别的制作组/字幕组 + resource_team: Optional[str] = None + # 视频编码 + video_encode: Optional[str] = None + # 音频编码 + audio_encode: Optional[str] = None + + # 副标题解析 + _subtitle_flag = False + _subtitle_season_re = r"(? 1: + end_season = int(cn2an.cn2an(seasons[1].strip(), mode='smart')) + else: + begin_season = int(cn2an.cn2an(seasons, mode='smart')) + except Exception as err: + print(str(err)) + return + if self.begin_season is None and isinstance(begin_season, int): + self.begin_season = begin_season + self.total_seasons = 1 + if self.begin_season is not None \ + and self.end_season is None \ + and isinstance(end_season, int) \ + and end_season != self.begin_season: + self.end_season = end_season + self.total_seasons = (self.end_season - self.begin_season) + 1 + self.type = MediaType.TV + self._subtitle_flag = True + # 第x集 + episode_str = re.search(r'%s' % self._subtitle_episode_re, title_text, re.IGNORECASE) + if episode_str: + episodes = episode_str.group(1) + if episodes: + episodes = episodes.upper().replace("E", "").replace("P", "").strip() + else: + return + try: + end_episode = None + if episodes.find('-') != -1: + episodes = episodes.split('-') + begin_episode = int(cn2an.cn2an(episodes[0].strip(), mode='smart')) + if len(episodes) > 1: + end_episode = int(cn2an.cn2an(episodes[1].strip(), mode='smart')) + else: + begin_episode = int(cn2an.cn2an(episodes, mode='smart')) + except Exception as err: + print(str(err)) + return + if self.begin_episode is None and isinstance(begin_episode, int): + self.begin_episode = begin_episode + self.total_episodes = 1 + if self.begin_episode is not None \ + and self.end_episode is None \ + and isinstance(end_episode, int) \ + and end_episode != self.begin_episode: + self.end_episode = end_episode + self.total_episodes = (self.end_episode - self.begin_episode) + 1 + self.type = MediaType.TV + self._subtitle_flag = True + # x集全 + episode_all_str = re.search(r'%s' % self._subtitle_episode_all_re, title_text, re.IGNORECASE) + if episode_all_str: + episode_all = episode_all_str.group(1) + if not episode_all: + episode_all = episode_all_str.group(2) + if episode_all and self.begin_episode is None: + try: + self.total_episodes = int(cn2an.cn2an(episode_all.strip(), mode='smart')) + except Exception as err: + print(str(err)) + return + self.begin_episode = None + self.end_episode = None + self.type = MediaType.TV + self._subtitle_flag = True + # 全x季 x季全 + season_all_str = re.search(r"%s" % self._subtitle_season_all_re, title_text, re.IGNORECASE) + if season_all_str: + season_all = season_all_str.group(1) + if not season_all: + season_all = season_all_str.group(2) + if season_all and self.begin_season is None and self.begin_episode is None: + try: + self.total_seasons = int(cn2an.cn2an(season_all.strip(), mode='smart')) + except Exception as err: + print(str(err)) + return + self.begin_season = 1 + self.end_season = self.total_seasons + self.type = MediaType.TV + self._subtitle_flag = True + + def is_in_season(self, season: Union[list, int, str]): + """ + 是否包含季 + """ + if isinstance(season, list): + if self.end_season is not None: + meta_season = list(range(self.begin_season, self.end_season + 1)) + else: + if self.begin_season is not None: + meta_season = [self.begin_season] + else: + meta_season = [1] + + return set(meta_season).issuperset(set(season)) + else: + if self.end_season is not None: + return self.begin_season <= int(season) <= self.end_season + else: + if self.begin_season is not None: + return int(season) == self.begin_season + else: + return int(season) == 1 + + def is_in_episode(self, episode: Union[list, int, str]): + """ + 是否包含集 + """ + if isinstance(episode, list): + if self.end_episode is not None: + meta_episode = list(range(self.begin_episode, self.end_episode + 1)) + else: + meta_episode = [self.begin_episode] + return set(meta_episode).issuperset(set(episode)) + else: + if self.end_episode is not None: + return self.begin_episode <= int(episode) <= self.end_episode + else: + return int(episode) == self.begin_episode + + def get_season_string(self): + """ + 返回季字符串 + """ + if self.begin_season is not None: + return "S%s" % str(self.begin_season).rjust(2, "0") \ + if self.end_season is None \ + else "S%s-S%s" % \ + (str(self.begin_season).rjust(2, "0"), + str(self.end_season).rjust(2, "0")) + else: + if self.type == MediaType.MOVIE: + return "" + else: + return "S01" + + def get_season_item(self): + """ + 返回begin_season 的Sxx + """ + if self.begin_season is not None: + return "S%s" % str(self.begin_season).rjust(2, "0") + else: + if self.type == MediaType.MOVIE: + return "" + else: + return "S01" + + def get_season_seq(self): + """ + 返回begin_season 的数字 + """ + if self.begin_season is not None: + return str(self.begin_season) + else: + if self.type == MediaType.MOVIE: + return "" + else: + return "1" + + def get_season_list(self): + """ + 返回季的数组 + """ + if self.begin_season is None: + if self.type == MediaType.MOVIE: + return [] + else: + return [1] + elif self.end_season is not None: + return [season for season in range(self.begin_season, self.end_season + 1)] + else: + return [self.begin_season] + + def set_season(self, sea: Union[list, int, str]): + """ + 更新季 + """ + if not sea: + return + if isinstance(sea, list): + if len(sea) == 1 and str(sea[0]).isdigit(): + self.begin_season = int(sea[0]) + self.end_season = None + elif len(sea) > 1 and str(sea[0]).isdigit() and str(sea[-1]).isdigit(): + self.begin_season = int(sea[0]) + self.end_season = int(sea[-1]) + elif str(sea).isdigit(): + self.begin_season = int(sea) + self.end_season = None + + def set_episode(self, ep: Union[list, int, str]): + """ + 更新集 + """ + if not ep: + return + if isinstance(ep, list): + if len(ep) == 1 and str(ep[0]).isdigit(): + self.begin_episode = int(ep[0]) + self.end_episode = None + elif len(ep) > 1 and str(ep[0]).isdigit() and str(ep[-1]).isdigit(): + self.begin_episode = int(ep[0]) + self.end_episode = int(ep[-1]) + elif str(ep).isdigit(): + self.begin_episode = int(ep) + self.end_episode = None + + # + def get_episode_string(self): + """ + 返回集字符串 + """ + if self.begin_episode is not None: + return "E%s" % str(self.begin_episode).rjust(2, "0") \ + if self.end_episode is None \ + else "E%s-E%s" % \ + ( + str(self.begin_episode).rjust(2, "0"), + str(self.end_episode).rjust(2, "0")) + else: + return "" + + def get_episode_list(self): + """ + 返回集的数组 + """ + if self.begin_episode is None: + return [] + elif self.end_episode is not None: + return [episode for episode in range(self.begin_episode, self.end_episode + 1)] + else: + return [self.begin_episode] + + def get_episode_items(self): + """ + 返回集的并列表达方式,用于支持单文件多集 + """ + return "E%s" % "E".join(str(episode).rjust(2, '0') for episode in self.get_episode_list()) + + def get_episode_seqs(self): + """ + 返回单文件多集的集数表达方式,用于支持单文件多集 + """ + episodes = self.get_episode_list() + if episodes: + # 集 xx + if len(episodes) == 1: + return str(episodes[0]) + else: + return "%s-%s" % (episodes[0], episodes[-1]) + else: + return "" + + def get_episode_seq(self): + """ + 返回begin_episode 的数字 + """ + episodes = self.get_episode_list() + if episodes: + return str(episodes[0]) + else: + return "" + + def get_season_episode_string(self): + """ + 返回季集字符串 + """ + if self.type == MediaType.MOVIE: + return "" + else: + seaion = self.get_season_string() + episode = self.get_episode_string() + if seaion and episode: + return "%s %s" % (seaion, episode) + elif seaion: + return "%s" % seaion + elif episode: + return "%s" % episode + return "" + + def get_resource_type_string(self): + """ + 返回资源类型字符串,含分辨率 + """ + ret_string = "" + if self.resource_type: + ret_string = f"{ret_string} {self.resource_type}" + if self.resource_effect: + ret_string = f"{ret_string} {self.resource_effect}" + if self.resource_pix: + ret_string = f"{ret_string} {self.resource_pix}" + return ret_string + + def get_edtion_string(self): + """ + 返回资源类型字符串,不含分辨率 + """ + ret_string = "" + if self.resource_type: + ret_string = f"{ret_string} {self.resource_type}" + if self.resource_effect: + ret_string = f"{ret_string} {self.resource_effect}" + return ret_string.strip() + + def get_resource_team_string(self): + """ + 返回发布组/字幕组字符串 + """ + if self.resource_team: + return self.resource_team + else: + return "" + + def get_video_encode_string(self): + """ + 返回视频编码 + """ + return self.video_encode or "" + + def get_audio_encode_string(self): + """ + 返回音频编码 + """ + return self.audio_encode or "" diff --git a/app/core/meta/metavideo.py b/app/core/meta/metavideo.py new file mode 100644 index 00000000..6bc3fbe0 --- /dev/null +++ b/app/core/meta/metavideo.py @@ -0,0 +1,557 @@ +import re +from pathlib import Path + +from app.core.config import settings +from app.core.meta.metabase import MetaBase +from app.core.meta.release_groups import ReleaseGroupsMatcher +from app.utils.string import StringUtils +from app.utils.tokens import Tokens +from app.utils.types import MediaType + + +class MetaVideo(MetaBase): + """ + 识别电影、电视剧 + """ + # 控制标位区 + _stop_name_flag = False + _stop_cnname_flag = False + _last_token = "" + _last_token_type = "" + _continue_flag = True + _unknown_name_str = "" + _source = "" + _effect = [] + # 正则式区 + _season_re = r"S(\d{2})|^S(\d{1,2})$|S(\d{1,2})E" + _episode_re = r"EP?(\d{2,4})$|^EP?(\d{1,4})$|^S\d{1,2}EP?(\d{1,4})$|S\d{2}EP?(\d{2,4})" + _part_re = r"(^PART[0-9ABI]{0,2}$|^CD[0-9]{0,2}$|^DVD[0-9]{0,2}$|^DISK[0-9]{0,2}$|^DISC[0-9]{0,2}$)" + _roman_numerals = r"^(?=[MDCLXVI])M*(C[MD]|D?C{0,3})(X[CL]|L?X{0,3})(I[XV]|V?I{0,3})$" + _source_re = r"^BLURAY$|^HDTV$|^UHDTV$|^HDDVD$|^WEBRIP$|^DVDRIP$|^BDRIP$|^BLU$|^WEB$|^BD$|^HDRip$" + _effect_re = r"^REMUX$|^UHD$|^SDR$|^HDR\d*$|^DOLBY$|^DOVI$|^DV$|^3D$|^REPACK$" + _resources_type_re = r"%s|%s" % (_source_re, _effect_re) + _name_no_begin_re = r"^\[.+?]" + _name_no_chinese_re = r".*版|.*字幕" + _name_se_words = ['共', '第', '季', '集', '话', '話', '期'] + _name_nostring_re = r"^PTS|^JADE|^AOD|^CHC|^[A-Z]{1,4}TV[\-0-9UVHDK]*" \ + r"|HBO$|\s+HBO|\d{1,2}th|\d{1,2}bit|NETFLIX|AMAZON|IMAX|^3D|\s+3D|^BBC\s+|\s+BBC|BBC$|DISNEY\+?|XXX|\s+DC$" \ + r"|[第\s共]+[0-9一二三四五六七八九十\-\s]+季" \ + r"|[第\s共]+[0-9一二三四五六七八九十百零\-\s]+[集话話]" \ + r"|连载|日剧|美剧|电视剧|动画片|动漫|欧美|西德|日韩|超高清|高清|蓝光|翡翠台|梦幻天堂·龙网|★?\d*月?新番" \ + r"|最终季|合集|[多中国英葡法俄日韩德意西印泰台港粤双文语简繁体特效内封官译外挂]+字幕|版本|出品|台版|港版|\w+字幕组" \ + r"|未删减版|UNCUT$|UNRATE$|WITH EXTRAS$|RERIP$|SUBBED$|PROPER$|REPACK$|SEASON$|EPISODE$|Complete$|Extended$|Extended Version$" \ + r"|S\d{2}\s*-\s*S\d{2}|S\d{2}|\s+S\d{1,2}|EP?\d{2,4}\s*-\s*EP?\d{2,4}|EP?\d{2,4}|\s+EP?\d{1,4}" \ + r"|CD[\s.]*[1-9]|DVD[\s.]*[1-9]|DISK[\s.]*[1-9]|DISC[\s.]*[1-9]" \ + r"|[248]K|\d{3,4}[PIX]+" \ + r"|CD[\s.]*[1-9]|DVD[\s.]*[1-9]|DISK[\s.]*[1-9]|DISC[\s.]*[1-9]" + _resources_pix_re = r"^[SBUHD]*(\d{3,4}[PI]+)|\d{3,4}X(\d{3,4})" + _resources_pix_re2 = r"(^[248]+K)" + _video_encode_re = r"^[HX]26[45]$|^AVC$|^HEVC$|^VC\d?$|^MPEG\d?$|^Xvid$|^DivX$|^HDR\d*$" + _audio_encode_re = r"^DTS\d?$|^DTSHD$|^DTSHDMA$|^Atmos$|^TrueHD\d?$|^AC3$|^\dAudios?$|^DDP\d?$|^DD\d?$|^LPCM\d?$|^AAC\d?$|^FLAC\d?$|^HD\d?$|^MA\d?$" + + def __init__(self, title: str, subtitle: str = None, isfile: bool = False): + super().__init__(title, subtitle, isfile) + if not title: + return + original_title = title + self._source = "" + self._effect = [] + # 判断是否纯数字命名 + title_path = Path(title) + if title_path.suffix.lower() in settings.RMT_MEDIAEXT \ + and title_path.stem.isdigit() \ + and len(title_path.stem) < 5: + self.begin_episode = int(title_path.stem) + self.type = MediaType.TV + return + # 去掉名称中第1个[]的内容 + title = re.sub(r'%s' % self._name_no_begin_re, "", title, count=1) + # 把xxxx-xxxx年份换成前一个年份,常出现在季集上 + title = re.sub(r'([\s.]+)(\d{4})-(\d{4})', r'\1\2', title) + # 把大小去掉 + title = re.sub(r'[0-9.]+\s*[MGT]i?B(?![A-Z]+)', "", title, flags=re.IGNORECASE) + # 把年月日去掉 + title = re.sub(r'\d{4}[\s._-]\d{1,2}[\s._-]\d{1,2}', "", title) + # 拆分tokens + tokens = Tokens(title) + self.tokens = tokens + # 解析名称、年份、季、集、资源类型、分辨率等 + token = tokens.get_next() + while token: + # Part + self.__init_part(token) + # 标题 + if self._continue_flag: + self.__init_name(token) + # 年份 + if self._continue_flag: + self.__init_year(token) + # 分辨率 + if self._continue_flag: + self.__init_resource_pix(token) + # 季 + if self._continue_flag: + self.__init_season(token) + # 集 + if self._continue_flag: + self.__init_episode(token) + # 资源类型 + if self._continue_flag: + self.__init_resource_type(token) + # 视频编码 + if self._continue_flag: + self.__init_video_encode(token) + # 音频编码 + if self._continue_flag: + self.__init_audio_encode(token) + # 取下一个,直到没有为卡 + token = tokens.get_next() + self._continue_flag = True + # 合成质量 + if self._effect: + self._effect.reverse() + self.resource_effect = " ".join(self._effect) + if self._source: + self.resource_type = self._source.strip() + # 提取原盘DIY + if self.resource_type and "BluRay" in self.resource_type: + if (self.subtitle and re.findall(r'D[Ii]Y', self.subtitle)) \ + or re.findall(r'-D[Ii]Y@', original_title): + self.resource_type = f"{self.resource_type} DIY" + # 解析副标题,只要季和集 + self.init_subtitle(self.org_string) + if not self._subtitle_flag and self.subtitle: + self.init_subtitle(self.subtitle) + # 没有识别出类型时默认为电影 + if not self.type: + self.type = MediaType.MOVIE + # 去掉名字中不需要的干扰字符,过短的纯数字不要 + self.cn_name = self.__fix_name(self.cn_name) + self.en_name = StringUtils.str_title(self.__fix_name(self.en_name)) + # 处理part + if self.part and self.part.upper() == "PART": + self.part = None + # 制作组/字幕组 + self.resource_team = ReleaseGroupsMatcher().match(title=original_title) or None + + def __fix_name(self, name: str): + if not name: + return name + name = re.sub(r'%s' % self._name_nostring_re, '', name, + flags=re.IGNORECASE).strip() + name = re.sub(r'\s+', ' ', name) + if name.isdigit() \ + and int(name) < 1800 \ + and not self.year \ + and not self.begin_season \ + and not self.resource_pix \ + and not self.resource_type \ + and not self.audio_encode \ + and not self.video_encode: + if self.begin_episode is None: + self.begin_episode = int(name) + name = None + elif self.is_in_episode(int(name)) and not self.begin_season: + name = None + return name + + def __init_name(self, token: str): + if not token: + return + # 回收标题 + if self._unknown_name_str: + if not self.cn_name: + if not self.en_name: + self.en_name = self._unknown_name_str + elif self._unknown_name_str != self.year: + self.en_name = "%s %s" % (self.en_name, self._unknown_name_str) + self._last_token_type = "enname" + self._unknown_name_str = "" + if self._stop_name_flag: + return + if token.upper() == "AKA": + self._continue_flag = False + self._stop_name_flag = True + return + if token in self._name_se_words: + self._last_token_type = 'name_se_words' + return + if StringUtils.is_chinese(token): + # 含有中文,直接做为标题(连着的数字或者英文会保留),且不再取用后面出现的中文 + self._last_token_type = "cnname" + if not self.cn_name: + self.cn_name = token + elif not self._stop_cnname_flag: + if not re.search("%s" % self._name_no_chinese_re, token, flags=re.IGNORECASE) \ + and not re.search("%s" % self._name_se_words, token, flags=re.IGNORECASE): + self.cn_name = "%s %s" % (self.cn_name, token) + self._stop_cnname_flag = True + else: + is_roman_digit = re.search(self._roman_numerals, token) + # 阿拉伯数字或者罗马数字 + if token.isdigit() or is_roman_digit: + # 第季集后面的不要 + if self._last_token_type == 'name_se_words': + return + if self.get_name(): + # 名字后面以 0 开头的不要,极有可能是集 + if token.startswith('0'): + return + # 检查是否真正的数字 + if token.isdigit(): + try: + int(token) + except ValueError: + return + # 中文名后面跟的数字不是年份的极有可能是集 + if not is_roman_digit \ + and self._last_token_type == "cnname" \ + and int(token) < 1900: + return + if (token.isdigit() and len(token) < 4) or is_roman_digit: + # 4位以下的数字或者罗马数字,拼装到已有标题中 + if self._last_token_type == "cnname": + self.cn_name = "%s %s" % (self.cn_name, token) + elif self._last_token_type == "enname": + self.en_name = "%s %s" % (self.en_name, token) + self._continue_flag = False + elif token.isdigit() and len(token) == 4: + # 4位数字,可能是年份,也可能真的是标题的一部分,也有可能是集 + if not self._unknown_name_str: + self._unknown_name_str = token + else: + # 名字未出现前的第一个数字,记下来 + if not self._unknown_name_str: + self._unknown_name_str = token + elif re.search(r"%s" % self._season_re, token, re.IGNORECASE): + # 季的处理 + if self.en_name and re.search(r"SEASON$", self.en_name, re.IGNORECASE): + # 如果匹配到季,英文名结尾为Season,说明Season属于标题,不应在后续作为干扰词去除 + self.en_name += ' ' + self._stop_name_flag = True + return + elif re.search(r"%s" % self._episode_re, token, re.IGNORECASE) \ + or re.search(r"(%s)" % self._resources_type_re, token, re.IGNORECASE) \ + or re.search(r"%s" % self._resources_pix_re, token, re.IGNORECASE): + # 集、来源、版本等不要 + self._stop_name_flag = True + return + else: + # 后缀名不要 + if ".%s".lower() % token in settings.RMT_MEDIAEXT: + return + # 英文或者英文+数字,拼装起来 + if self.en_name: + self.en_name = "%s %s" % (self.en_name, token) + else: + self.en_name = token + self._last_token_type = "enname" + + def __init_part(self, token: str): + if not self.get_name(): + return + if not self.year \ + and not self.begin_season \ + and not self.begin_episode \ + and not self.resource_pix \ + and not self.resource_type: + return + re_res = re.search(r"%s" % self._part_re, token, re.IGNORECASE) + if re_res: + if not self.part: + self.part = re_res.group(1) + nextv = self.tokens.cur() + if nextv \ + and ((nextv.isdigit() and (len(nextv) == 1 or len(nextv) == 2 and nextv.startswith('0'))) + or nextv.upper() in ['A', 'B', 'C', 'I', 'II', 'III']): + self.part = "%s%s" % (self.part, nextv) + self.tokens.get_next() + self._last_token_type = "part" + self._continue_flag = False + self._stop_name_flag = False + + def __init_year(self, token: str): + if not self.get_name(): + return + if not token.isdigit(): + return + if len(token) != 4: + return + if not 1900 < int(token) < 2050: + return + if self.year: + if self.en_name: + self.en_name = "%s %s" % (self.en_name.strip(), self.year) + elif self.cn_name: + self.cn_name = "%s %s" % (self.cn_name, self.year) + elif self.en_name and re.search(r"SEASON$", self.en_name, re.IGNORECASE): + # 如果匹配到年,且英文名结尾为Season,说明Season属于标题,不应在后续作为干扰词去除 + self.en_name += ' ' + self.year = token + self._last_token_type = "year" + self._continue_flag = False + self._stop_name_flag = True + + def __init_resource_pix(self, token: str): + if not self.get_name(): + return + re_res = re.findall(r"%s" % self._resources_pix_re, token, re.IGNORECASE) + if re_res: + self._last_token_type = "pix" + self._continue_flag = False + self._stop_name_flag = True + resource_pix = None + for pixs in re_res: + if isinstance(pixs, tuple): + pix_t = None + for pix_i in pixs: + if pix_i: + pix_t = pix_i + break + if pix_t: + resource_pix = pix_t + else: + resource_pix = pixs + if resource_pix and not self.resource_pix: + self.resource_pix = resource_pix.lower() + break + if self.resource_pix \ + and self.resource_pix.isdigit() \ + and self.resource_pix[-1] not in 'kpi': + self.resource_pix = "%sp" % self.resource_pix + else: + re_res = re.search(r"%s" % self._resources_pix_re2, token, re.IGNORECASE) + if re_res: + self._last_token_type = "pix" + self._continue_flag = False + self._stop_name_flag = True + if not self.resource_pix: + self.resource_pix = re_res.group(1).lower() + + def __init_season(self, token: str): + re_res = re.findall(r"%s" % self._season_re, token, re.IGNORECASE) + if re_res: + self._last_token_type = "season" + self.type = MediaType.TV + self._stop_name_flag = True + self._continue_flag = True + for se in re_res: + if isinstance(se, tuple): + se_t = None + for se_i in se: + if se_i and str(se_i).isdigit(): + se_t = se_i + break + if se_t: + se = int(se_t) + else: + break + else: + se = int(se) + if self.begin_season is None: + self.begin_season = se + self.total_seasons = 1 + else: + if se > self.begin_season: + self.end_season = se + self.total_seasons = (self.end_season - self.begin_season) + 1 + if self.isfile and self.total_seasons > 1: + self.end_season = None + self.total_seasons = 1 + elif token.isdigit(): + try: + int(token) + except ValueError: + return + if self._last_token_type == "SEASON" \ + and self.begin_season is None \ + and len(token) < 3: + self.begin_season = int(token) + self.total_seasons = 1 + self._last_token_type = "season" + self._stop_name_flag = True + self._continue_flag = False + self.type = MediaType.TV + elif token.upper() == "SEASON" and self.begin_season is None: + self._last_token_type = "SEASON" + + def __init_episode(self, token: str): + re_res = re.findall(r"%s" % self._episode_re, token, re.IGNORECASE) + if re_res: + self._last_token_type = "episode" + self._continue_flag = False + self._stop_name_flag = True + self.type = MediaType.TV + for se in re_res: + if isinstance(se, tuple): + se_t = None + for se_i in se: + if se_i and str(se_i).isdigit(): + se_t = se_i + break + if se_t: + se = int(se_t) + else: + break + else: + se = int(se) + if self.begin_episode is None: + self.begin_episode = se + self.total_episodes = 1 + else: + if se > self.begin_episode: + self.end_episode = se + self.total_episodes = (self.end_episode - self.begin_episode) + 1 + if self.isfile and self.total_episodes > 2: + self.end_episode = None + self.total_episodes = 1 + elif token.isdigit(): + try: + int(token) + except ValueError: + return + if self.begin_episode is not None \ + and self.end_episode is None \ + and len(token) < 5 \ + and int(token) > self.begin_episode \ + and self._last_token_type == "episode": + self.end_episode = int(token) + self.total_episodes = (self.end_episode - self.begin_episode) + 1 + if self.isfile and self.total_episodes > 2: + self.end_episode = None + self.total_episodes = 1 + self._continue_flag = False + self.type = MediaType.TV + elif self.begin_episode is None \ + and 1 < len(token) < 4 \ + and self._last_token_type != "year" \ + and self._last_token_type != "videoencode" \ + and token != self._unknown_name_str: + self.begin_episode = int(token) + self.total_episodes = 1 + self._last_token_type = "episode" + self._continue_flag = False + self._stop_name_flag = True + self.type = MediaType.TV + elif self._last_token_type == "EPISODE" \ + and self.begin_episode is None \ + and len(token) < 5: + self.begin_episode = int(token) + self.total_episodes = 1 + self._last_token_type = "episode" + self._continue_flag = False + self._stop_name_flag = True + self.type = MediaType.TV + elif token.upper() == "EPISODE": + self._last_token_type = "EPISODE" + + def __init_resource_type(self, token): + if not self.get_name(): + return + source_res = re.search(r"(%s)" % self._source_re, token, re.IGNORECASE) + if source_res: + self._last_token_type = "source" + self._continue_flag = False + self._stop_name_flag = True + if not self._source: + self._source = source_res.group(1) + self._last_token = self._source.upper() + return + elif token.upper() == "DL" \ + and self._last_token_type == "source" \ + and self._last_token == "WEB": + self._source = "WEB-DL" + self._continue_flag = False + return + elif token.upper() == "RAY" \ + and self._last_token_type == "source" \ + and self._last_token == "BLU": + self._source = "BluRay" + self._continue_flag = False + return + elif token.upper() == "WEBDL": + self._source = "WEB-DL" + self._continue_flag = False + return + effect_res = re.search(r"(%s)" % self._effect_re, token, re.IGNORECASE) + if effect_res: + self._last_token_type = "effect" + self._continue_flag = False + self._stop_name_flag = True + effect = effect_res.group(1) + if effect not in self._effect: + self._effect.append(effect) + self._last_token = effect.upper() + + def __init_video_encode(self, token: str): + if not self.get_name(): + return + if not self.year \ + and not self.resource_pix \ + and not self.resource_type \ + and not self.begin_season \ + and not self.begin_episode: + return + re_res = re.search(r"(%s)" % self._video_encode_re, token, re.IGNORECASE) + if re_res: + self._continue_flag = False + self._stop_name_flag = True + self._last_token_type = "videoencode" + if not self.video_encode: + self.video_encode = re_res.group(1).upper() + self._last_token = self.video_encode + elif self.video_encode == "10bit": + self.video_encode = f"{re_res.group(1).upper()} 10bit" + self._last_token = re_res.group(1).upper() + elif token.upper() in ['H', 'X']: + self._continue_flag = False + self._stop_name_flag = True + self._last_token_type = "videoencode" + self._last_token = token.upper() if token.upper() == "H" else token.lower() + elif token in ["264", "265"] \ + and self._last_token_type == "videoencode" \ + and self._last_token in ['H', 'X']: + self.video_encode = "%s%s" % (self._last_token, token) + elif token.isdigit() \ + and self._last_token_type == "videoencode" \ + and self._last_token in ['VC', 'MPEG']: + self.video_encode = "%s%s" % (self._last_token, token) + elif token.upper() == "10BIT": + self._last_token_type = "videoencode" + if not self.video_encode: + self.video_encode = "10bit" + else: + self.video_encode = f"{self.video_encode} 10bit" + + def __init_audio_encode(self, token: str): + if not self.get_name(): + return + if not self.year \ + and not self.resource_pix \ + and not self.resource_type \ + and not self.begin_season \ + and not self.begin_episode: + return + re_res = re.search(r"(%s)" % self._audio_encode_re, token, re.IGNORECASE) + if re_res: + self._continue_flag = False + self._stop_name_flag = True + self._last_token_type = "audioencode" + self._last_token = re_res.group(1).upper() + if not self.audio_encode: + self.audio_encode = re_res.group(1) + else: + if self.audio_encode.upper() == "DTS": + self.audio_encode = "%s-%s" % (self.audio_encode, re_res.group(1)) + else: + self.audio_encode = "%s %s" % (self.audio_encode, re_res.group(1)) + elif token.isdigit() \ + and self._last_token_type == "audioencode": + if self.audio_encode: + if self._last_token.isdigit(): + self.audio_encode = "%s.%s" % (self.audio_encode, token) + elif self.audio_encode[-1].isdigit(): + self.audio_encode = "%s %s.%s" % (self.audio_encode[:-1], self.audio_encode[-1], token) + else: + self.audio_encode = "%s %s" % (self.audio_encode, token) + self._last_token = token diff --git a/app/core/meta/release_groups.py b/app/core/meta/release_groups.py new file mode 100644 index 00000000..b360d3d4 --- /dev/null +++ b/app/core/meta/release_groups.py @@ -0,0 +1,111 @@ +import regex as re + +from app.utils.singleton import Singleton + + +class ReleaseGroupsMatcher(metaclass=Singleton): + """ + 识别制作组、字幕组 + """ + __release_groups: str = None + custom_release_groups: str = None + custom_separator: str = None + RELEASE_GROUPS: dict = { + "0ff": ['FF(?:(?:A|WE)B|CD|E(?:DU|B)|TV)'], + "1pt": [], + "52pt": [], + "audiences": ['Audies', 'AD(?:Audio|E(?:|book)|Music|Web)'], + "azusa": [], + "beitai": ['BeiTai'], + "btschool": ['Bts(?:CHOOL|HD|PAD|TV)', 'Zone'], + "carpt": ['CarPT'], + "chdbits": ['CHD(?:|Bits|PAD|(?:|HK)TV|WEB)', 'StBOX', 'OneHD', 'Lee', 'xiaopie'], + "discfan": [], + "dragonhd": [], + "eastgame": ['(?:(?:iNT|(?:HALFC|Mini(?:S|H|FH)D))-|)TLF'], + "filelist": [], + "gainbound": ['(?:DG|GBWE)B'], + "hares": ['Hares(?:|(?:M|T)V|Web)'], + "hd4fans": [], + "hdarea": ['HDA(?:pad|rea|TV)', 'EPiC'], + "hdatmos": [], + "hdbd": [], + "hdchina": ['HDC(?:|hina|TV)', 'k9611', 'tudou', 'iHD'], + "hddolby": ['D(?:ream|BTV)', '(?:HD|QHstudI)o'], + "hdfans": ['beAst(?:|TV)'], + "hdhome": ['HDH(?:|ome|Pad|TV|WEB)'], + "hdpt": ['HDPT(?:|Web)'], + "hdsky": ['HDS(?:|ky|TV|Pad|WEB)', 'AQLJ'], + "hdtime": [], + "HDU": [], + "hdvideo": [], + "hdzone": ['HDZ(?:|one)'], + "hhanclub": ['HHWEB'], + "hitpt": [], + "htpt": ['HTPT'], + "iptorrents": [], + "joyhd": [], + "keepfrds": ['FRDS', 'Yumi', 'cXcY'], + "lemonhd": ['L(?:eague(?:(?:C|H)D|(?:M|T)V|NF|WEB)|HD)', 'i18n', 'CiNT'], + "mteam": ['MTeam(?:|TV)', 'MPAD'], + "nanyangpt": [], + "nicept": [], + "oshen": [], + "ourbits": ['Our(?:Bits|TV)', 'FLTTH', 'Ao', 'PbK', 'MGs', 'iLove(?:HD|TV)'], + "piggo": ['PiGo(?:NF|(?:H|WE)B)'], + "ptchina": [], + "pterclub": ['PTer(?:|DIY|Game|(?:M|T)V|WEB)'], + "pthome": ['PTH(?:|Audio|eBook|music|ome|tv|WEB)'], + "ptmsg": [], + "ptsbao": ['PTsbao', 'OPS', 'F(?:Fans(?:AIeNcE|BD|D(?:VD|IY)|TV|WEB)|HDMv)', 'SGXT'], + "pttime": [], + "putao": ['PuTao'], + "soulvoice": [], + "springsunday": ['CMCT(?:|V)'], + "sharkpt": ['Shark(?:|WEB|DIY|TV|MV)'], + "tccf": [], + "tjupt": ['TJUPT'], + "totheglory": ['TTG', 'WiKi', 'NGB', 'DoA', '(?:ARi|ExRE)N'], + "U2": [], + "ultrahd": [], + "others": ['B(?:MDru|eyondHD|TN)', 'C(?:fandora|trlhd|MRG)', 'DON', 'EVO', 'FLUX', 'HONE(?:|yG)', + 'N(?:oGroup|T(?:b|G))', 'PandaMoon', 'SMURF', 'T(?:EPES|aengoo|rollHD )'], + "anime": ['ANi', 'HYSUB', 'KTXP', 'LoliHouse', 'MCE', 'Nekomoe kissaten', '(?:Lilith|NC)-Raws', '织梦字幕组'] + } + + def __init__(self): + release_groups = [] + for site_groups in self.RELEASE_GROUPS.values(): + for release_group in site_groups: + release_groups.append(release_group) + self.__release_groups = '|'.join(release_groups) + + def match(self, title: str = None, groups: str = None): + """ + :param title: 资源标题或文件名 + :param groups: 制作组/字幕组 + :return: 匹配结果 + """ + if not title: + return "" + if not groups: + if self.custom_release_groups: + groups = f"{self.__release_groups}|{self.custom_release_groups}" + else: + groups = self.__release_groups + title = f"{title} " + groups_re = re.compile(r"(?<=[-@\[£【&])(?:%s)(?=[@.\s\]\[】&])" % groups, re.I) + # 处理一个制作组识别多次的情况,保留顺序 + unique_groups = [] + for item in re.findall(groups_re, title): + if item not in unique_groups: + unique_groups.append(item) + separator = self.custom_separator or "@" + return separator.join(unique_groups) + + def update_custom(self, release_groups: str = None, separator: str = None): + """ + 更新自定义制作组/字幕组,自定义分隔符 + """ + self.custom_release_groups = release_groups + self.custom_separator = separator diff --git a/app/core/meta_info.py b/app/core/meta_info.py new file mode 100644 index 00000000..331e677a --- /dev/null +++ b/app/core/meta_info.py @@ -0,0 +1,43 @@ +from pathlib import Path + +import regex as re + +from app.core.config import settings +from app.core.meta import MetaAnime, MetaVideo + + +def MetaInfo(title: str, subtitle: str = None): + """ + 媒体整理入口,根据名称和副标题,判断是哪种类型的识别,返回对应对象 + :param title: 标题、种子名、文件名 + :param subtitle: 副标题、描述 + :return: MetaAnime、MetaVideo + """ + + # 判断是否处理文件 + if title and Path(title).suffix.lower() in settings.RMT_MEDIAEXT: + isfile = True + else: + isfile = False + + return MetaAnime(title, subtitle, isfile) if is_anime(title) else MetaVideo(title, subtitle, isfile) + + +def is_anime(name: str): + """ + 判断是否为动漫 + :param name: 名称 + :return: 是否动漫 + """ + if not name: + return False + if re.search(r'【[+0-9XVPI-]+】\s*【', name, re.IGNORECASE): + return True + if re.search(r'\s+-\s+[\dv]{1,4}\s+', name, re.IGNORECASE): + return True + if re.search(r"S\d{2}\s*-\s*S\d{2}|S\d{2}|\s+S\d{1,2}|EP?\d{2,4}\s*-\s*EP?\d{2,4}|EP?\d{2,4}|\s+EP?\d{1,4}", name, + re.IGNORECASE): + return False + if re.search(r'\[[+0-9XVPI-]+]\s*\[', name, re.IGNORECASE): + return True + return False diff --git a/app/core/module_manager.py b/app/core/module_manager.py new file mode 100644 index 00000000..be152f7a --- /dev/null +++ b/app/core/module_manager.py @@ -0,0 +1,72 @@ +from types import FunctionType +from typing import Generator, Optional + +from app.core import settings +from app.helper import ModuleHelper +from app.log import logger +from app.utils.singleton import Singleton + + +class ModuleManager(metaclass=Singleton): + """ + 模块管理器 + """ + + # 模块列表 + _modules: dict = {} + # 运行态模块列表 + _running_modules: dict = {} + + def __init__(self): + self.load_modules() + + def load_modules(self): + """ + 加载所有模块 + """ + # 扫描模块目录 + modules = ModuleHelper.load( + "app.modules", + filter_func=lambda _, obj: hasattr(obj, 'init_module') and hasattr(obj, 'init_setting') + ) + self._running_modules = {} + self._modules = {} + for module in modules: + module_id = module.__name__ + self._modules[module_id] = module + # 生成实例 + self._running_modules[module_id] = module() + self._running_modules[module_id].init_module() + logger.info(f"Moudle Loaded:{module_id}") + + def get_modules(self, method: str) -> Generator: + """ + 获取模块列表 + """ + + def check_method(func: FunctionType) -> bool: + """ + 检查函数是否已实现 + """ + return func.__code__.co_code != b'd\x01S\x00' + + def check_setting(setting: Optional[tuple]) -> bool: + """ + 检查开关是否己打开 + """ + if not setting: + return True + switch, value = setting + if getattr(settings, switch) and value is True: + return True + if getattr(settings, switch) == value: + return True + return False + + if not self._running_modules: + return [] + for _, module in self._running_modules.items(): + if hasattr(module, method) \ + and check_method(getattr(module, method)) \ + and check_setting(module.init_setting()): + yield module diff --git a/app/core/plugin_manager.py b/app/core/plugin_manager.py new file mode 100644 index 00000000..92c8e610 --- /dev/null +++ b/app/core/plugin_manager.py @@ -0,0 +1,302 @@ +import traceback +from threading import Thread +from typing import Tuple, Optional, List, Any + +from app.helper import ModuleHelper + +from app.core import EventManager +from app.db.systemconfigs import SystemConfigs +from app.log import logger +from app.utils.singleton import Singleton +from app.utils.types import SystemConfigKey + + +class PluginManager(metaclass=Singleton): + """ + 插件管理器 + """ + systemconfigs: SystemConfigs = None + eventmanager: EventManager = None + + # 插件列表 + _plugins: dict = {} + # 运行态插件列表 + _running_plugins: dict = {} + # 配置Key + _config_key: str = "plugin.%s" + # 事件处理线程 + _thread: Thread = None + # 开关 + _active: bool = False + + def __init__(self): + self.init_config() + + def init_config(self): + self.systemconfigs = SystemConfigs() + self.eventmanager = EventManager() + # 停止已有插件 + self.stop_service() + # 启动插件 + self.start_service() + + def __run(self): + """ + 事件处理线程 + """ + while self._active: + event, handlers = self.eventmanager.get_event() + if event: + logger.info(f"处理事件:{event.event_type} - {handlers}") + for handler in handlers: + try: + names = handler.__qualname__.split(".") + self.run_plugin_method(names[0], names[1], event) + except Exception as e: + logger.error(f"事件处理出错:{str(e)} - {traceback.format_exc()}") + + def start_service(self): + """ + 启动 + """ + # 加载插件 + self.__load_plugins() + + # 将事件管理器设为启动 + self._active = True + self._thread = Thread(target=self.__run) + # 启动事件处理线程 + self._thread.start() + + def stop_service(self): + """ + 停止 + """ + # 将事件管理器设为停止 + self._active = False + # 等待事件处理线程退出 + if self._thread: + self._thread.join() + # 停止所有插件 + self.__stop_plugins() + + def __load_plugins(self): + """ + 加载所有插件 + """ + # 扫描插件目录 + plugins = ModuleHelper.load( + "app.plugins", + filter_func=lambda _, obj: hasattr(obj, 'init_plugin') + ) + # 排序 + plugins.sort(key=lambda x: x.plugin_order if hasattr(x, "plugin_order") else 0) + # 用户已安装插件列表 + user_plugins = self.systemconfigs.get(SystemConfigKey.UserInstalledPlugins) or [] + self._running_plugins = {} + self._plugins = {} + for plugin in plugins: + plugin_id = plugin.__name__ + self._plugins[plugin_id] = plugin + # 未安装的跳过加载 + if plugin_id not in user_plugins: + continue + # 生成实例 + self._running_plugins[plugin_id] = plugin() + # 初始化配置 + self.reload_plugin(plugin_id) + logger.info(f"加载插件:{plugin}") + + def reload_plugin(self, pid: str): + """ + 生效插件配置 + """ + if not pid: + return + if not self._running_plugins.get(pid): + return + if hasattr(self._running_plugins[pid], "init_plugin"): + try: + self._running_plugins[pid].init_plugin(self.get_plugin_config(pid)) + logger.debug(f"生效插件配置:{pid}") + except Exception as err: + logger.error(f"加载插件 {pid} 出错:{err} - {traceback.format_exc()}") + + def __stop_plugins(self): + """ + 停止所有插件 + """ + for plugin in self._running_plugins.values(): + if hasattr(plugin, "stop_service"): + plugin.stop_service() + + def get_plugin_config(self, pid: str) -> dict: + """ + 获取插件配置 + """ + if not self._plugins.get(pid): + return {} + return self.systemconfigs.get(self._config_key % pid) or {} + + def get_plugin_page(self, pid: str) -> Tuple[Optional[str], Optional[str], Optional[str]]: + """ + 获取插件额外页面数据 + :return: 标题,页面内容,确定按钮响应函数 + """ + if not self._running_plugins.get(pid): + return None, None, None + if not hasattr(self._running_plugins[pid], "get_page"): + return None, None, None + return self._running_plugins[pid].get_page() + + def get_plugin_script(self, pid: str) -> Optional[str]: + """ + 获取插件额外脚本 + """ + if not self._running_plugins.get(pid): + return None + if not hasattr(self._running_plugins[pid], "get_script"): + return None + return self._running_plugins[pid].get_script() + + def get_plugin_state(self, pid: str) -> Optional[bool]: + """ + 获取插件状态 + """ + if not self._running_plugins.get(pid): + return None + if not hasattr(self._running_plugins[pid], "get_state"): + return None + return self._running_plugins[pid].get_state() + + def save_plugin_config(self, pid: str, conf: dict) -> bool: + """ + 保存插件配置 + """ + if not self._plugins.get(pid): + return False + return self.systemconfigs.set(self._config_key % pid, conf) + + @staticmethod + def __get_plugin_color(plugin: str) -> str: + """ + 获取插件的主题色 + """ + if hasattr(plugin, "plugin_color") and plugin.plugin_color: + return plugin.plugin_color + return "" + + def get_plugins_conf(self, auth_level: int) -> dict: + """ + 获取所有插件配置 + """ + all_confs = {} + for pid, plugin in self._running_plugins.items(): + # 基本属性 + conf = {} + # 权限 + if hasattr(plugin, "auth_level") \ + and plugin.auth_level > auth_level: + continue + # 名称 + if hasattr(plugin, "plugin_name"): + conf.update({"name": plugin.plugin_name}) + # 描述 + if hasattr(plugin, "plugin_desc"): + conf.update({"desc": plugin.plugin_desc}) + # 版本号 + if hasattr(plugin, "plugin_version"): + conf.update({"version": plugin.plugin_version}) + # 图标 + if hasattr(plugin, "plugin_icon"): + conf.update({"icon": plugin.plugin_icon}) + # ID前缀 + if hasattr(plugin, "plugin_config_prefix"): + conf.update({"prefix": plugin.plugin_config_prefix}) + # 插件额外的页面 + if hasattr(plugin, "get_page"): + title, _, _ = plugin.get_page() + conf.update({"page": title}) + # 插件额外的脚本 + if hasattr(plugin, "get_script"): + conf.update({"script": plugin.get_script()}) + # 主题色 + conf.update({"color": self.__get_plugin_color(plugin)}) + # 配置项 + conf.update({"fields": plugin.get_fields() or {}}) + # 配置值 + conf.update({"config": self.get_plugin_config(pid)}) + # 状态 + conf.update({"state": plugin.get_state()}) + # 汇总 + all_confs[pid] = conf + return all_confs + + def get_plugin_apps(self, auth_level: int) -> dict: + """ + 获取所有插件 + """ + all_confs = {} + installed_apps = self.systemconfigs.get(SystemConfigKey.UserInstalledPlugins) or [] + for pid, plugin in self._plugins.items(): + # 基本属性 + conf = {} + # 权限 + if hasattr(plugin, "auth_level") \ + and plugin.auth_level > auth_level: + continue + # ID + conf.update({"id": pid}) + # 安装状态 + if pid in installed_apps: + conf.update({"installed": True}) + else: + conf.update({"installed": False}) + # 名称 + if hasattr(plugin, "plugin_name"): + conf.update({"name": plugin.plugin_name}) + # 描述 + if hasattr(plugin, "plugin_desc"): + conf.update({"desc": plugin.plugin_desc}) + # 版本 + if hasattr(plugin, "plugin_version"): + conf.update({"version": plugin.plugin_version}) + # 图标 + if hasattr(plugin, "plugin_icon"): + conf.update({"icon": plugin.plugin_icon}) + # 主题色 + conf.update({"color": self.__get_plugin_color(plugin)}) + if hasattr(plugin, "plugin_author"): + conf.update({"author": plugin.plugin_author}) + # 作者链接 + if hasattr(plugin, "author_url"): + conf.update({"author_url": plugin.author_url}) + # 汇总 + all_confs[pid] = conf + return all_confs + + def get_plugin_commands(self) -> List[dict]: + """ + 获取插件命令 + [{ + "cmd": "/xx", + "event": EventType.xx, + "desc": "xxxx", + "data": {} + }] + """ + ret_commands = [] + for _, plugin in self._running_plugins.items(): + if hasattr(plugin, "get_command"): + ret_commands.append(plugin.get_command()) + return ret_commands + + def run_plugin_method(self, pid: str, method: str, *args, **kwargs) -> Any: + """ + 运行插件方法 + """ + if not self._running_plugins.get(pid): + return None + if not hasattr(self._running_plugins[pid], method): + return None + return getattr(self._running_plugins[pid], method)(*args, **kwargs) diff --git a/app/core/security.py b/app/core/security.py new file mode 100644 index 00000000..e9952131 --- /dev/null +++ b/app/core/security.py @@ -0,0 +1,49 @@ +from datetime import datetime, timedelta +from typing import Any, Union, Optional +import jwt +from fastapi.security import OAuth2PasswordBearer +from passlib.context import CryptContext +from app.core.config import settings +from cryptography.fernet import Fernet + +pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto") +ALGORITHM = "HS256" + +# Token认证 +reusable_oauth2 = OAuth2PasswordBearer( + tokenUrl=f"{settings.API_V1_STR}/login/access-token" +) + + +def create_access_token( + subject: Union[str, Any], expires_delta: timedelta = None +) -> str: + if expires_delta: + expire = datetime.utcnow() + expires_delta + else: + expire = datetime.utcnow() + timedelta( + minutes=settings.ACCESS_TOKEN_EXPIRE_MINUTES + ) + to_encode = {"exp": expire, "sub": str(subject)} + encoded_jwt = jwt.encode(to_encode, settings.SECRET_KEY, algorithm=ALGORITHM) + return encoded_jwt + + +def verify_password(plain_password: str, hashed_password: str) -> bool: + return pwd_context.verify(plain_password, hashed_password) + + +def get_password_hash(password: str) -> str: + return pwd_context.hash(password) + + +def decrypt(data, key) -> Optional[bytes]: + """ + 解密二进制数据 + """ + fernet = Fernet(key) + try: + return fernet.decrypt(data) + except Exception as e: + print(str(e)) + return None diff --git a/app/db/__init__.py b/app/db/__init__.py new file mode 100644 index 00000000..54a690cf --- /dev/null +++ b/app/db/__init__.py @@ -0,0 +1,29 @@ +from sqlalchemy import create_engine, QueuePool +from sqlalchemy.orm import sessionmaker + +from app.core.config import settings + +# 数据库引擎 +Engine = create_engine(f"sqlite:///{settings.CONFIG_PATH}/user.db", + pool_pre_ping=True, + echo=False, + poolclass=QueuePool, + pool_size=1000, + pool_recycle=60 * 10, + max_overflow=0) +# 数据库会话 +SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=Engine) + + +def get_db(): + """ + 获取数据库会话 + :return: Session + """ + db = None + try: + db = SessionLocal() + yield db + finally: + if db: + db.close() diff --git a/app/db/__pycache__/__init__.cpython-310.pyc b/app/db/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fbedf256b69c9644f379f1873a2f9fcd25aa51e2 GIT binary patch literal 797 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 literal 0 HcmV?d00001 diff --git a/app/db/__pycache__/subscribes.cpython-310.pyc b/app/db/__pycache__/subscribes.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5751320d7b4a37af63b3cbb162463f7b61e90e7a GIT binary patch literal 2458 zcmZ`)-)j^{9N*cU-Miat?k+L@s8lJX4_-@S+ow`Q1i@0&ASCu-30?MXCUMW*+jC}5 zy>OO-sf2>oms*R`=EMhWsg)vF=zlV=F0cUg)%AuIRZ)W;LP;^IXa( zZNav5p0gWGr>II zRM~zu$vxmr@ru?gv&yRNPow6N$*OD$wD#$9(|iWb?PD{*+0RVy!U5$D?U0=V0MUI1 z#^$p}Tlc?x^{oHu?k&xjQ&zz04HFc02JUg5hAAA*2-Cdrl+4wLKpyy)N**t1 z;;A7ff%p34>CYA~N-pGL^ZNDWON$q}jZ2|OE{L?r8<|`@pI(jlg(yz5#jxF8Wc5Y4 z<7+wF?y6!CM6D6&F}P%9->x0AJ91S@FoF?8P&tBU9nl&y!G@!dhsIgF=Py`# zq-kWNXP%|2{o|k1;xr zx|9KxpUeu(g%d@XC48xg)I^W0dwqO)lGzWPp81&EAvb7`Hp@MuSXH@^9M>%py!AD-77MO$G4HPYpwP&9))S5B6&dc>3+CE+qx z6O3auv@dBu6=T`RCyG`-6v1=5&tKro=(K zq6mvJ7rs>1GS8ILX|pin%8GeQ6>@8&D4>p=MOn-RX0WoahH;0h0wN3mVinE??Nnx5 z1UcGbdX)=EvTMrW*P-sE&QIku1c&=;w(#)rDqiMXz7~pQDQ1u;4HHqL%$G7stdKEO zk)Ocg*)E~*bN+L!!+MufMGJVyN8Z1t+mi!NiLyk*YL@nzcpL7?OVi9vejgcFq`RhRCA3Oc zT9uAL#i-aa1E;+iEM{hph*D;(Zv*ZFT%at3-zNZ_blwA{VWy5kAFTbj*?%$=)u=}9 zdl=JtH_&hA(W5bT@NGk8hc;+yFh=4yET6)Z*pn$O6OXJ^M*NQF-)sg(ciiVtf9Q8> z-0y?6^{t;C@A13%08Ym)e>mub8Z09_n9 zQ$9xSF8xWtq0Y$_6=4Jg9rZMKmLuJI}dNmkcp_y==h7Tm#OIlJ3<{9 literal 0 HcmV?d00001 diff --git a/app/db/__pycache__/systemconfigs.cpython-310.pyc b/app/db/__pycache__/systemconfigs.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f691eea16e344666c6084cc4550c3e98cf31fd6c GIT binary patch literal 1852 zcmZux&2Jk;6rY*>@Or(DU8)8ewS@x$`Qk&5C_+@><3Q_1GC8m^TCI1+$(sFeX4X+% zZ4gpZgpdL^#0~q%feMKOhbsIbdqq)N@gE=#ytmsrPUu+s{AT9u+xLFI_g>m;+630k z@GJheNyuNgSzQKfK7dCZfZ&AFh`9LAA{sN7#hR;8+-s2@8?I66dSu2mw^r&#WW{y2 zUg~CK#|^hp>b1y;n{Knzt!OQ7xh+aQA-vA*Bf@RbGMsO;KOF41b4he~?30)YRZUP>zDQci=n?zWT$cS>C8%NZwb5q!& zA)FDrPIyf;M>@B7{YZD$xU+gUV%+A9Bg1WR201s2=4x1~*zhjwJ+J?H|Fe(oZQbvE z+$%JX4+FLmvj(~j&lWuDE{L4w#3LDv*!dF9~7OcfqCo){Axe-Tc|f$@9m@XD3fizy0m>o5!cW{u%m=jgYkn0yL*G}S+M8Jcw44OwHn+@4??jWMrk(iCzAmm4pdnbL0J^4JDC-h z=Y>g_dERT_P+^p&-lh&+r){SH`*8gNbG*n>2!(yf*!JjaR$s-^Ez1DIbE;6pzyt>z9|ENFGtF{W=r7)vIeJ^2$DI{W?U+0&mZeR5`n1Lb--#Z4iaQr}0FU9J}_e$h_gq1Nti3%;|*tnJCOa3i$8n z@+!W#gt5?(lakd+tfNa!iR>mQ>J1RKZc>}s%mQ|FwnlZ}$YE{z@XAGw;GGMNfK7oU zm884_%Ku2As)@Ap2})=Oy1SH&xf@JPfj;<#~RR zq?w<=fK;AWwIG(L#2S^aqd;H)=1f+>BUbVj3Jh+Ajxu!QL}IW_c*L zAx{yh?rPswCDulRDNge)j1Xw|YNT8}KZe4sCcL!Jee3)N;t{IK7}I%Go`tnpLHs_& RWU){!0)v5J!qsnG`wy{ozajtt literal 0 HcmV?d00001 diff --git a/app/db/__pycache__/userauth.cpython-310.pyc b/app/db/__pycache__/userauth.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..12e0f65c0e30c377027364ca61c8263af4a2a827 GIT binary patch literal 1578 zcmZ`(&2Jk;6rY)0ufJnEaRLWEB)%;q3jqgIRR~B7ji70i1R++IthHz2?6T`MGqY)e z98?h`I1toB4}gjU5{I@@Par_z&Dzln5?_=KXoA>+8#?@+x zzaG|OOTO#sQi=_o6wDw0sh1wvIzTSlmH7OG1^+VB% zy+m(44=!gYbdUEzv)@)iri}N~oQ~fU@C_++B1Z#;#oQgxe}ZT%!c;pTKA6`epcATD zU}-zZ4JoGw)*jPNkmq@yOxSnybGm1}Lq<)Tz}^DPBFxgJ1tk%DbXiw|Drej}U?0(o zM9&1Z37J?yo!bX&&z{)oj4tyWcd{K58+ue&ftpKRIE>+NTaikdP>m^k`pvh8H$MCQ z=YzvbU){O&$#s^Nvu^bUF&C-Bh4%aqvMuRz{|Y4}sX^`^SFTMz{Rz@;-~8hC)oa&D ztC3p4MU4rVD3NDrX}zLEpMDVFCDZi8`!*6Z#RrRo|czP zZb!;krj6y%wio)`?8saT%TWYCO0n(_M@BJzX~C9=ySg4?U;&5yG$yCu_$9{04D+6h1_u|Y=sb$0Pg7tvPTU}tBz)m_~k zYvjraj(G>qr^kloTV~!vKC=JpzJRHmy+S zxM@8|8MR?LN9?$sL$6Kc<5*zjbmjn>e{Z0UM@DY_xd3890-}l<7TZGhzm>`-Aqq9gr(jKHL1aXle!YMAiy6Q@dvTnj%6hACZ`s_ zo6)uaT6+-7jOH1&8z;W@$v;FEG0QqzQznusTY7Z2Oo|mQ7YVa+-H-)Qczj%+cR#8>fo^ literal 0 HcmV?d00001 diff --git a/app/db/init.py b/app/db/init.py new file mode 100644 index 00000000..d2583c69 --- /dev/null +++ b/app/db/init.py @@ -0,0 +1,42 @@ +from alembic.command import upgrade +from alembic.config import Config + +from app.core.config import settings +from app.core.security import get_password_hash +from app.db import Engine, SessionLocal +from app.db.models import Base +from app.db.models.user import User +from app.log import logger + + +def init_db(): + """ + 初始化数据库 + """ + Base.metadata.create_all(bind=Engine) + # 初始化超级管理员 + _db = SessionLocal() + user = User.get_by_email(db=_db, email=settings.SUPERUSER) + if not user: + user = User( + full_name="Admin", + email=settings.SUPERUSER, + hashed_password=get_password_hash(settings.SUPERUSER_PASSWORD), + is_superuser=True, + ) + user.create(_db) + + +def update_db(): + """ + 更新数据库 + """ + db_location = settings.CONFIG_PATH / 'user.db' + script_location = settings.ROOT_PATH / 'alembic' + try: + alembic_cfg = Config() + alembic_cfg.set_main_option('script_location', str(script_location)) + alembic_cfg.set_main_option('sqlalchemy.url', f"sqlite:///{db_location}") + upgrade(alembic_cfg, 'head') + except Exception as e: + logger(f'数据库更新失败:{e}') diff --git a/app/db/models/__init__.py b/app/db/models/__init__.py new file mode 100644 index 00000000..96b98a8e --- /dev/null +++ b/app/db/models/__init__.py @@ -0,0 +1,42 @@ +from typing import Any + +from sqlalchemy.orm import as_declarative, declared_attr + + +@as_declarative() +class Base: + id: Any + __name__: str + + def create(self, db): + db.add(self) + db.commit() + db.refresh(self) + return self + + @classmethod + def get(cls, db, rid: int): + return db.query(cls).filter(cls.id == rid).first() + + def update(self, db, payload: dict): + payload = {k: v for k, v in payload.items() if v is not None} + for key, value in payload.items(): + setattr(self, key, value) + db.commit() + db.refresh(self) + + @classmethod + def delete(cls, db, rid): + db.query(cls).filter(cls.id == rid).delete() + db.commit() + + @classmethod + def list(cls, db): + return db.query(cls).all() + + def to_dict(self): + return {c.name: getattr(self, c.name, None) for c in self.__table__.columns} + + @declared_attr + def __tablename__(self) -> str: + return self.__name__.lower() diff --git a/app/db/models/__pycache__/__init__.cpython-310.pyc b/app/db/models/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ef499552bbb6ffa42af35e900d78778fee09bc3b GIT binary patch literal 2039 zcmZ`)OK&4Z5bnp!c;Z(cn_VDcmj%RXEg{2!6N(}r2u?(iqPS{<;0mAC#rhv#K~@2>UK?acRjxPx?D6GRRZIA`iI!`2>Ba7mIvs_ z4>0w2um~b(MsnJr6lIpNoOgKcbv#NWza+mB!G$*?!n z{a&iHxq+mUOsfW{)H*JhU%9N}F@7Ws>NP^T#U`PP4V1PrjK^6K-w)1*Q#f64zknd9 zU^6mhSLB-f428ac089C8waYH}g=Zk_DW7_moRZT9B*W(A;bnOQB+}x02?cA5vB2N} z6#4}$DOC4u4GcO5f{dtQQ#xgTu~Rn3!6gMnX6RMSN2ub8RbH8hkbiU$MfvwtQ7b*}?lUNS2?-vGvd5 z3@Y*f>Y()T6pm@MutC>o6FAXaFrwUloD8qv(qm+Bg!d3x#Iq!ZuQuR@dV-7NL;xI> zzz`Qd#_=FT^(E*&g{hH%Tdcl_ti1R56U0pKBDq(>bC!*`@l`V<-XKAX^J1ttQq#HI^6rF~-PI|#iG zuwC*cHepx5#$zk+7O?0L|0i(Y(&UDgMR!TyBT@(%7DqjYW%AMmZ;A-%_CZE5yAnkv zKFpx6*-BDmqkN!M3oSUKPIAw)GB@)T>^X3r(Mf&Tz73Q#BQ=lC`y+n5JfHs9B12rX9GWW%|?x4qX|FAY|s2pZwY-TlC#yoKGKZbazi2wiq literal 0 HcmV?d00001 diff --git a/app/db/models/__pycache__/site.cpython-310.pyc b/app/db/models/__pycache__/site.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f5f2409310970966b8bee3321456ee852621dd89 GIT binary patch literal 1213 zcmZ8gyKWpe6eT&&ea5n7*^y-qH@O5{)?If~XW z(nziTK`Pz&Gx8B^Q{@i~SH7ItARBYQ`{E_%@Z3u^7<3VgFZ@sXIY8)d@2rmyoEI?7 zAqa{n7D%EDVQ&+GCCP{kvOtDeD5ETraTYggfk$9<20mrGHrId!T*(#!BB`=?9=UuYg6Gz#krhm$0qdM|bG< zF-`Aq6aA5G(++z=yKH9>(jM(!`;(s10q{0-;gnnE2&ac*;(BMA%R(>nQ?_&wuPD2G zn-A&R*Gn)CoJ@7bbkQPjeI*ciQkK9bKz^rzA9yQ8??el(jU5wx z54S9dM!StT;QH(fLd& z%7mF2pkZ>hbb}*i^Z7Dw@q3iUAJOJ1s~7&2WPM?*N1gk3l&7a*%MJfankX$BSlIxoH=*-MTRrVDG)J!i^!=bcN|*l9*5y|Wp7EIb LXomn)vKf2>HaRg% literal 0 HcmV?d00001 diff --git a/app/db/models/__pycache__/subscribe.cpython-310.pyc b/app/db/models/__pycache__/subscribe.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5ab91e87da645c7072ec81ff911c0bb9ee77fb68 GIT binary patch literal 1468 zcmZuw%WmT~6eX#rZP{@i&18~J2k6cle?T!Pf@aX7iv|JQZUh5@EM7ZGD9It|sa*u! zB-{K$vYcPywyOgDf^OPNNl6T}6nM{lk-9Hd{eG9=dYAvs-+P4oVTJAGqHu~^eMG_u zr-BqTrUi>x;lxhi#xAvbCcMIr{hD_~P=s+v$q$6P+`A{-gYeFYJKUd;QSc|;L`JUh z&nmGhN)!B8YFL0Y{zS{XT$peIH!CPJ7*P{UK&iYck#)aI6=e4C_6kur#jXBA0wkuK z#0(s8!Q=Ffa)zJt;Kn}c0t|<7@4<;fE8Wq!(_**9UhT!W|G?s?)%6iw^c}SFPK(19 zcU#Ky^VYw0_oe7XV ztkQ_qVCebCkr65yG2k#yS3;i~#%IRY1)t^I_zF^0m6?Nn&&%>SEaVKgIz@8J0UJN>b&KF<=!GOPAbHRHQ8E4on}McSbMYpoy;~#9l+P9 zQTE3eK)jgf@pfDW+L_KR9PDm@yM$u1RWw_wx^ial vY9Cj!r~{1qIDlh58#e)2jN-RAH^)1z;x4b{GlBNEYw9XS62MjT@6 literal 0 HcmV?d00001 diff --git a/app/db/models/__pycache__/systemconfig.cpython-310.pyc b/app/db/models/__pycache__/systemconfig.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..70a3ff108ae3c5837e711f112ee1e81eb9bb7672 GIT binary patch literal 1091 zcmZ`%O>5gQ7?$LZIEmA4EZe%kt^;5414bET8I&DX3fV5kU>xgB;?%NJNhwV!yR_H- zhxXXNr0Y)m3p?$VQ`Qt#3B7*a56RE-N_DT-AvoR_Kly?Y^2<8g!$s!+m->Q+6HZGa zXiNo*nQ&r9xUoxZoRyyNW52;p*%Cn-2C7RyRTc+v4xuhoyv3p0xf(b2$2#{7@iOvN%7V&6DGGKF_2$mh}R1t&(r`SpmmIS?eTQE)zaUM9ra8 ziE6~=jo9IGZ8|g1>7>ya;=#(2AFzwJ+f5lh);urt18#gyD76{yj@Sn^CUO@`BVWG2 zPa|5sw5U<+BT3L;{Ja*T(DIedSj8Lj8j(w zjV*j<%_HdsS>}z{76N5S2c%C!oQ(A;bM|PHJ&HP}qfX1L%;zB1TVxsvmXX~FMxqLz$(cY6e>u)gyb^0WZ= literal 0 HcmV?d00001 diff --git a/app/db/models/__pycache__/user.cpython-310.pyc b/app/db/models/__pycache__/user.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9908e2293c8bdd9b1b03fd34e06333b5399ac089 GIT binary patch literal 1335 zcmZ`(&2Aev5GJ|5l2(?KIIZg>z3)X25ClyS0}XPhVL<6+Az-muQr0@$U76&%R-pEx zTyyIKB*(lGuLT116?*CnZO1yaTyXXq&Mf)OHpASpem%$rl)NT9;Nb_tLowKS zS;C_kN#nm^XOadsdeyd46pal}TG`c&jovgyoC{^cnNd}9ZsVD_>_k(Fl-g(}w659) z;OI)IYPreRh1S2dio=rss?egujrT_c&P$m3PcVXHl#`4JPxvC>bVoUZ$NT7KA*@A! z{f{h*Z!tsa5bHTV;1R_7fCoD$oX6lLw_f19p*Y|@G2(qO<^wTahCJcJ5B`p3ll#ch z=LdY`Rv+*&h%vGLuNo?56@QyDJ6Nl#F4QJ}CpI>y8ZNF=s)oS+=hU-d*HoZ~^KIO8 zQWgsd+NcpEphR3Oi%uHL_`(LFE-Go`JCRE0_P2pu#(4r$KLfKRpNOHK=_h9Bg}0^e z7-0W1`Q6)kdcw(!m|)9Hxb-fg9o;eg7}vJmjC`S|X>0@JwNZGtY`CnX5lTHkCs0O5TO$4dknF?VzE9~q`{XaX>{ zw}i{%zQ5sy$0pF literal 0 HcmV?d00001 diff --git a/app/db/models/site.py b/app/db/models/site.py new file mode 100644 index 00000000..a846defe --- /dev/null +++ b/app/db/models/site.py @@ -0,0 +1,28 @@ +from datetime import datetime + +from sqlalchemy import Boolean, Column, Integer, String, Sequence +from sqlalchemy.orm import Session + +from app.db.models import Base + + +class Site(Base): + id = Column(Integer, Sequence('id'), primary_key=True, index=True) + name = Column(String, nullable=False) + domain = Column(String, index=True) + url = Column(String, nullable=False) + pri = Column(Integer) + rss = Column(String) + cookie = Column(String) + ua = Column(String) + filter = Column(String) + note = Column(String) + limit_interval = Column(Integer) + limit_count = Column(Integer) + limit_seconds = Column(Integer) + is_active = Column(Boolean(), default=True) + lst_mod_date = Column(String, default=datetime.now().strftime("%Y-%m-%d %H:%M:%S")) + + @staticmethod + def get_by_domain(db: Session, domain: str): + return db.query(Site).filter(Site.domain == domain).first() diff --git a/app/db/models/subscribe.py b/app/db/models/subscribe.py new file mode 100644 index 00000000..3db64fa0 --- /dev/null +++ b/app/db/models/subscribe.py @@ -0,0 +1,36 @@ +from sqlalchemy import Column, Integer, String, Sequence +from sqlalchemy.orm import Session + +from app.db.models import Base + + +class Subscribe(Base): + id = Column(Integer, Sequence('id'), primary_key=True, index=True) + name = Column(String, nullable=False, index=True) + year = Column(String) + type = Column(String) + keyword = Column(String) + tmdbid = Column(String, index=True) + doubanid = Column(String) + season = Column(Integer) + image = Column(String) + description = Column(String) + filter = Column(String) + include = Column(String) + exclude = Column(String) + total_episode = Column(Integer) + start_episode = Column(Integer) + lack_episode = Column(Integer) + note = Column(String) + state = Column(String, nullable=False, index=True, default='N') + + @staticmethod + def exists(db: Session, tmdbid: str, season: int = None): + if season: + return db.query(Subscribe).filter(Subscribe.tmdbid == tmdbid, + Subscribe.season == season).first() + return db.query(Subscribe).filter(Subscribe.tmdbid == tmdbid).first() + + @staticmethod + def get_by_state(db: Session, state: str): + return db.query(Subscribe).filter(Subscribe.state == state).all() diff --git a/app/db/models/systemconfig.py b/app/db/models/systemconfig.py new file mode 100644 index 00000000..cb1ae268 --- /dev/null +++ b/app/db/models/systemconfig.py @@ -0,0 +1,19 @@ +from sqlalchemy import Column, Integer, String, Sequence +from sqlalchemy.orm import Session + +from app.db.models import Base + + +class SystemConfig(Base): + id = Column(Integer, Sequence('id'), primary_key=True, index=True) + key = Column(String, index=True) + value = Column(String, nullable=True) + + @staticmethod + def get_by_key(db: Session, key: str): + return db.query(SystemConfig).filter(SystemConfig.key == key).first() + + @staticmethod + def delete_by_key(db: Session, key: str): + db.query(SystemConfig).filter(SystemConfig.key == key).delete() + db.commit() diff --git a/app/db/models/user.py b/app/db/models/user.py new file mode 100644 index 00000000..1be302be --- /dev/null +++ b/app/db/models/user.py @@ -0,0 +1,27 @@ +from sqlalchemy import Boolean, Column, Integer, String, Sequence +from sqlalchemy.orm import Session + +from app.core.security import verify_password +from app.db.models import Base + + +class User(Base): + id = Column(Integer, Sequence('id'), primary_key=True, index=True) + full_name = Column(String, index=True) + email = Column(String, unique=True, index=True, nullable=False) + hashed_password = Column(String, nullable=False) + is_active = Column(Boolean(), default=True) + is_superuser = Column(Boolean(), default=False) + + @staticmethod + def authenticate(db: Session, email: str, password: str): + user = db.query(User).filter(User.email == email).first() + if not user: + return None + if not verify_password(password, str(user.hashed_password)): + return None + return user + + @staticmethod + def get_by_email(db: Session, email: str): + return db.query(User).filter(User.email == email).first() diff --git a/app/db/sites.py b/app/db/sites.py new file mode 100644 index 00000000..db98a744 --- /dev/null +++ b/app/db/sites.py @@ -0,0 +1,56 @@ +from typing import Tuple, List + +from sqlalchemy.orm import Session + +from app.db import SessionLocal +from app.db.models.site import Site + + +class Sites: + """ + 站点管理 + """ + _db: Session = None + + def __init__(self, _db=SessionLocal()): + self._db = _db + + def add(self, **kwargs) -> Tuple[bool, str]: + """ + 新增站点 + """ + site = Site(**kwargs) + if not site.get_by_domain(self._db, kwargs.get("domain")): + site.create(self._db) + return True, "新增站点成功" + return False, "站点已存在" + + def list(self) -> List[Site]: + """ + 获取站点列表 + """ + return Site.list(self._db) + + def get_by_domain(self, domain: str) -> Site: + """ + 按域名获取站点 + """ + return Site.get_by_domain(self._db, domain) + + def exists(self, domain: str) -> bool: + """ + 判断站点是否存在 + """ + return Site.get_by_domain(self._db, domain) is not None + + def update_cookie(self, domain: str, cookies: str) -> Tuple[bool, str]: + """ + 更新站点Cookie + """ + site = Site.get_by_domain(self._db, domain) + if not site: + return False, "站点不存在" + site.update(self._db, { + "cookie": cookies + }) + return True, "更新站点Cookie成功" diff --git a/app/db/subscribes.py b/app/db/subscribes.py new file mode 100644 index 00000000..dc4754f5 --- /dev/null +++ b/app/db/subscribes.py @@ -0,0 +1,76 @@ +from typing import Tuple, List + +from sqlalchemy.orm import Session + +from app.core import MediaInfo +from app.db import SessionLocal +from app.db.models.subscribe import Subscribe +from app.utils.types import MediaType + + +class Subscribes: + """ + 订阅管理 + """ + _db: Session = None + + def __init__(self, _db=SessionLocal()): + self._db = _db + + def add(self, mediainfo: MediaInfo, **kwargs) -> Tuple[bool, str]: + """ + 新增订阅 + """ + # 总集数 + if mediainfo.type == MediaType.TV: + if not kwargs.get('season'): + kwargs.update({ + 'season': 1 + }) + if not kwargs.get('total_episode'): + total_episode = len(mediainfo.seasons.get(kwargs.get('season')) or []) + if not total_episode: + return False, "未识别到总集数" + kwargs.update({ + 'total_episode': total_episode + }) + subscribe = Subscribe(name=mediainfo.title, + year=mediainfo.year, + type=mediainfo.type.value, + tmdbid=mediainfo.tmdb_id, + image=mediainfo.get_poster_image(), + description=mediainfo.overview, + **kwargs) + if not subscribe.exists(self._db, tmdbid=mediainfo.tmdb_id, season=kwargs.get('season')): + subscribe.create(self._db) + return True, "新增订阅成功" + else: + return False, "订阅已存在" + + def get(self, sid: int) -> Subscribe: + """ + 获取订阅 + """ + return Subscribe.get(self._db, rid=sid) + + def list(self, state: str = None) -> List[Subscribe]: + """ + 获取订阅列表 + """ + if state: + return Subscribe.get_by_state(self._db, state) + return Subscribe.list(self._db) + + def delete(self, sid: int): + """ + 删除订阅 + """ + Subscribe.delete(self._db, rid=sid) + + def update(self, sid: int, payload: dict): + """ + 更新订阅 + """ + subscribe = self.get(sid) + subscribe.update(self._db, payload) + return subscribe diff --git a/app/db/systemconfigs.py b/app/db/systemconfigs.py new file mode 100644 index 00000000..119c3719 --- /dev/null +++ b/app/db/systemconfigs.py @@ -0,0 +1,58 @@ +import json +from typing import Any, Union + +from sqlalchemy.orm import Session + +from app.db import SessionLocal +from app.db.models.systemconfig import SystemConfig +from app.utils.object import ObjectUtils +from app.utils.singleton import Singleton +from app.utils.types import SystemConfigKey + + +class SystemConfigs(metaclass=Singleton): + # 配置对象 + __SYSTEMCONF: dict = {} + _db: Session = None + + def __init__(self, _db=SessionLocal()): + """ + 加载配置到内存 + """ + self._db = _db + for item in SystemConfig.list(self._db): + if ObjectUtils.is_obj(item.value): + self.__SYSTEMCONF[item.key] = json.loads(item.value) + else: + self.__SYSTEMCONF[item.key] = item.value + + def set(self, key: Union[str, SystemConfigKey], value: Any): + """ + 设置系统设置 + """ + if isinstance(key, SystemConfigKey): + key = key.value + # 更新内存 + self.__SYSTEMCONF[key] = value + # 写入数据库 + if ObjectUtils.is_obj(value): + if value is not None: + value = json.dumps(value) + else: + value = '' + conf = SystemConfig.get_by_key(self._db, key) + if conf: + conf.update(self._db, {"value": value}) + else: + conf = SystemConfig(key=key, value=value) + conf.create(self._db) + + def get(self, key: Union[str, SystemConfigKey] = None): + """ + 获取系统设置 + """ + if isinstance(key, SystemConfigKey): + key = key.value + if not key: + return self.__SYSTEMCONF + return self.__SYSTEMCONF.get(key) diff --git a/app/db/userauth.py b/app/db/userauth.py new file mode 100644 index 00000000..c09c2a86 --- /dev/null +++ b/app/db/userauth.py @@ -0,0 +1,46 @@ +import jwt +from fastapi import Depends, HTTPException, status +from sqlalchemy.orm import Session + +from app import schemas +from app.core import settings, security +from app.core.security import reusable_oauth2 +from app.db import get_db +from app.db.models.user import User + + +def get_current_user( + db: Session = Depends(get_db), token: str = Depends(reusable_oauth2) +) -> User: + try: + payload = jwt.decode( + token, settings.SECRET_KEY, algorithms=[security.ALGORITHM] + ) + token_data = schemas.TokenPayload(**payload) + except (jwt.DecodeError, jwt.InvalidTokenError, jwt.ImmatureSignatureError): + raise HTTPException( + status_code=status.HTTP_403_FORBIDDEN, + detail="token校验不通过", + ) + user = User.get(db, rid=token_data.sub) + if not user: + raise HTTPException(status_code=404, detail="用户不存在") + return user + + +def get_current_active_user( + current_user: User = Depends(get_current_user), +) -> User: + if not current_user.is_active: + raise HTTPException(status_code=400, detail="用户未激活") + return current_user + + +def get_current_active_superuser( + current_user: User = Depends(get_current_user), +) -> User: + if not current_user.is_superuser: + raise HTTPException( + status_code=400, detail="用户权限不足" + ) + return current_user diff --git a/app/helper/__init__.py b/app/helper/__init__.py new file mode 100644 index 00000000..4b336652 --- /dev/null +++ b/app/helper/__init__.py @@ -0,0 +1 @@ +from .module import ModuleHelper diff --git a/app/helper/__pycache__/__init__.cpython-310.pyc b/app/helper/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bffde891abf073904d0608c212c76a77fb99e63a GIT binary patch literal 200 zcmd1j<>g`k0@=*E6eS@27{oyaOhAqU5Elyoi4=wu#vF!R#wbQch7_h?22JLdj6h*c z##=nT`6;D2sUE301*t`TnoPIYa=`*cApI*DidcXYnE2)3Y!wq)oLW>IlT}fXo)HsJ znVgYWlp9c#pOu{ zxy%~Aq69s~1QS0X?glYn0tbnSCSrW`H_WT-0#CkUf>zDko~yBUySA#jx~l7=t2e6G zEdpbQ|306s67o9|qeBDY6_{!Y04JOVq(yDoVm6~lvp{RrLCKqh>%4TH z@X|SEm$`9>G|P`*KWVb8bU0}TA~WA@$9@#LL6c^+gJLNWDn1hXfdaaED3*S>kdq#6 z8yz|jufS9Y1hFY6Hah|b<7|Q1n$SgwYt!oounlgAvM@zuoCs^4jgxuC%iKJ#+f`nH zV_DhenJ7Bpi994|MaJUshwAdbPEfvKJckkXVmBxL|;ssUuNhF+~AU*`l)tIe)7 z+;%(gJr{#Fxu~KLUHF~6@rJ9=b2{-21A(Cp{GB5Y2oEl;sJ!GlY(S6b>rFz%wk^SV@?m5;m zI_0zs_%j_du5_)`gq>!O_GqV)mb&G%(xd8FYA(>Ulvbw6(p&gDPP)|;q$to!uYpbr zWDA`yg3fBEme!P73V5YcPivsP))`C3xHV3A^@JwR@mi-&Nl2HL)4Kc+3)gZNaBlnES@AziE1^xe;TxH1PTcO6DN{&KotzGNm{?DI` zr0D)nA3gl#m%-M5c;7P3p z?SFa}_T2wzb#Uw2gWm0x${sbjAmYhAN@BX9XK0BGG99b^(Qm*>wg4Dh`Mx+!|H7TZ zq+Rv$d**PsrkTN`mg|RyGd*-$!mfGqjt5s)x}hiDcue>HtE?C(#Io87GjA*lB*j$H zly;%ZK>_R>VpvossboX?YiK<=&UzFAseQ(lAe2o_j)Shp^yRE{(hU-UUVu{)tpLs@ zUdqbr*Y+lrb>QX~PNHj>H68dW_M%pM-(H~A7yyGXYEt&3!Jd9%u$76C02Xa)f=A0? z5V?F}I*2?sQ2PKGs>#S~@&ah-U;21(>-xyv{^8i{1X( z2k-^GgD=+lm%b}<+^owA=$H8RNbCx-2EaDkk&2-^sjRAEH%=6EPA=p&6xabEEBUc# zDOo~%48rL^VK_yiGXols2szYAl0&`7|D6qy1vE?ag`Hn-AQLzAv8zDcdS^IVzS# zrgs6iNVhr69JX9_5Wtp_4&8AZ9fOqXFfCf6I@4JL@J3EG82eK%H<(TtteChCANEAo zkhYNfm;RSk!u<{4{9mUXnw@Rdut(!Pah%L@oL0n>0P&jREG2GGtmL(u>F6aqZH^m; z5hMxTA>}v{Z;r%kB(XJTI`_Re)6m&TWTIyy0IOUY0Ps5GFM>rH%w#)_oIBezGXowo zcuoJ&X^%mICldURFmXJN+r?vs@8LQVjNt|>j$F%#z1)0$wan?lxqbMm976rYi_TCH|nNN7SsJ}@Phz4%h-VJW60ffS03A?ZaZ2w5}sYNK7rGov;R z+K|)yHLV{bArPjBA5kKcQ5p5loK z8^Jmq-XPx^2>qiD<4cFb*Rc8LKnNl@LQeU`4!($pM)cc==qs9|5qt?XjsHLo%?65& zFYsOZISUL$4kk!hI65^-9}Acmq;eatV5dS%@KlwJnV6&z{f0&fW$7s}v?pQhJssu` zf64DY-Me`!zdP99-7Um{HWp9u81{MCT*WTHX|tDqLrqN@J-9U`zh;c9)mU(f83)fY=mVP$nu zThZ9LOv~)7UU2#VxFN=9sR@2{=z^ZU0!T%HRqgX+R>Ges6B%_t!`Kv%mNM9D>gN%b)VCN0(Vj^R)*hHf6c_D;!^MZrPkqlnBCUQzy&NfYzwu+^S;f*Q;e8cmWQa>8qRG~C+0OEQO`J8vDXvc(| z{18wvj0zP~=fX BeE$Fd literal 0 HcmV?d00001 diff --git a/app/helper/__pycache__/rss.cpython-310.pyc b/app/helper/__pycache__/rss.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2072294e8e6089ccbd8631be929ed460f26db143 GIT binary patch literal 2008 zcmZ8iOKco97`A7;Gqbz1vzzS$T8S!0!XctPp@2|DA8;rk%2EQWpwV{iZf2Rs#`d;J zG#eEX3I_@~ASft6LZ!AGO1V+-P|w^snIn1i1YAL?_&vK#0v_4^|KI=1pMQIjQmKHT zJrOKYQbOo=&FpU`Fejml*I=NC;t zlDKWem||*N!)s=W)^X2FO>v}!ra&t-+axvp+!TtB5+tqpXE5p!j21j;OD82ucnM?h zJB2Lt24LSKi=;M~FXPK#&;J4+`Ce|}Gg)XC+wNK^%|Q$+wc1|KPVKcaHGy|h=QMhA zxtCvP%SwAF&Ff85>zdgsqy^zmq1lOn+#bk_1Kt_%?tstJLM9=-Qd$y=sVf$>HPBa6 zmqYKBAkRJRB6T4S>3ONgS7A@y5?-sWBcKmxy643Pb$i~xdub4@oR;|=d2sDeT88Y) zX(278URq4uv`oEKt5->lwZmy;9njIyGwgl^?1lh4H^XkIkKI%sx1q(M*$K!CW{ukv zN{t%Ito{V6Dp-{=tLlHOs*6>v2X;VZcmp?5?*0NNUKk#E$=vEi-jcQ;pVZv1?I`{UaiKi=40xw@y=FU_&x{XsV0|8!^lHYBon^PP=* zKa3|a12YgoY46;BZ)^3dU3-1)Y#kGD$n9(n20WC%7k4gD`as?&TzO2sBU+<7fv@M8?m?xJRgEV5fLmfUeKavExM04WwrAL1nxuDfz}sr;F_ChI2!S2c*GGKJ)d zNHz!LTofvkCXuqEAPzK91XqIfUkz2JNwXV)=QAPGlR5}72ef!${?$fnyb&=@bXIxU zX!(~KVV5a85Hx57;2+{~ORqXQSs6r3S&%J@>Bs?I)jM)vsORB`{08TZd1V5rOvZWL z)e@eSfn z!@}Rso*J7zFBlio?YX(u%=E;3bEd(g37)iBQ;O-AlS=`c2*N~8L(0=L*@HLDg&6J3 z!?UMh(g!EzU?6#d2{!Oi7%l8#4|)YVSB!_mv_S3|7A{~1sEVOAD@Mhr8V*oS##fCB ztP_wDTri-4X8*JP@ht7l&Ab`Ek*ByNz(L;tJW2K{H}F0PvY0?ubS%>V!Z literal 0 HcmV?d00001 diff --git a/app/helper/__pycache__/torrent.cpython-310.pyc b/app/helper/__pycache__/torrent.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a3abf5285bc212074fce710cc7207664e69b6209 GIT binary patch literal 6648 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 Tuple[Optional[dict], str]: + """ + 从CookieCloud下载数据 + :return: Cookie数据、错误信息 + """ + if not self._server or not self._key or not self._password: + return None, "CookieCloud参数不正确" + req_url = "%s/get/%s" % (self._server, self._key) + ret = self._req.post_res(url=req_url, json={"password": self._password}) + if ret and ret.status_code == 200: + result = ret.json() + if not result: + return {}, "未下载到数据" + if result.get("cookie_data"): + contents = result.get("cookie_data") + else: + contents = result + # 整理数据,使用domain域名的最后两级作为分组依据 + domain_groups = {} + for site, cookies in contents.items(): + for cookie in cookies: + domain_key = StringUtils.get_url_domain(cookie.get("domain")) + if not domain_groups.get(domain_key): + domain_groups[domain_key] = [cookie] + else: + domain_groups[domain_key].append(cookie) + # 返回错误 + ret_cookies = {} + # 索引器 + for domain, content_list in domain_groups.items(): + if not content_list: + continue + # 只有cf的cookie过滤掉 + cloudflare_cookie = True + for content in content_list: + if content["name"] != "cf_clearance": + cloudflare_cookie = False + break + if cloudflare_cookie: + continue + # 站点Cookie + cookie_str = ";".join( + [f"{content.get('name')}={content.get('value')}" + for content in content_list + if content.get("name") and content.get("name") not in self._ignore_cookies] + ) + ret_cookies[domain] = cookie_str + return ret_cookies, "" + elif ret: + return None, f"同步CookieCloud失败,错误码:{ret.status_code}" + else: + return None, "CookieCloud请求失败,请检查服务器地址、用户KEY及加密密码是否正确" diff --git a/app/helper/module.py b/app/helper/module.py new file mode 100644 index 00000000..abf40068 --- /dev/null +++ b/app/helper/module.py @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- +import importlib +import pkgutil + + +class ModuleHelper: + """ + 模块动态加载 + """ + + @classmethod + def load(cls, package_path, filter_func=lambda name, obj: True): + """ + 导入子模块 + :param package_path: 父包名 + :param filter_func: 子模块过滤函数,入参为模块名和模块对象,返回True则导入,否则不导入 + :return: + """ + + submodules: list = [] + packages = importlib.import_module(package_path) + for importer, package_name, _ in pkgutil.iter_modules(packages.__path__): + if package_name.startswith('_'): + continue + full_package_name = f'{package_path}.{package_name}' + module = importlib.import_module(full_package_name) + for name, obj in module.__dict__.items(): + if name.startswith('_'): + continue + if isinstance(obj, type) and filter_func(name, obj): + submodules.append(obj) + + return submodules diff --git a/app/helper/rss.py b/app/helper/rss.py new file mode 100644 index 00000000..949f8511 --- /dev/null +++ b/app/helper/rss.py @@ -0,0 +1,81 @@ +import xml.dom.minidom +from typing import List + +from app.core import settings +from app.utils.dom import DomUtils +from app.utils.http import RequestUtils +from app.utils.string import StringUtils + + +class RssHelper: + + @staticmethod + def parse(url, proxy: bool = False) -> List[dict]: + """ + 解析RSS订阅URL,获取RSS中的种子信息 + :param url: RSS地址 + :param proxy: 是否使用代理 + :return: 种子信息列表,如为None代表Rss过期 + """ + # 开始处理 + ret_array: list = [] + if not url: + return [] + try: + ret = RequestUtils(proxies=settings.PROXY if proxy else None).get_res(url) + if not ret: + return [] + ret.encoding = ret.apparent_encoding + except Exception as err: + print(str(err)) + return [] + if ret: + ret_xml = ret.text + try: + # 解析XML + dom_tree = xml.dom.minidom.parseString(ret_xml) + rootNode = dom_tree.documentElement + items = rootNode.getElementsByTagName("item") + for item in items: + try: + # 标题 + title = DomUtils.tag_value(item, "title", default="") + if not title: + continue + # 描述 + description = DomUtils.tag_value(item, "description", default="") + # 种子页面 + link = DomUtils.tag_value(item, "link", default="") + # 种子链接 + enclosure = DomUtils.tag_value(item, "enclosure", "url", default="") + if not enclosure and not link: + continue + # 部分RSS只有link没有enclosure + if not enclosure and link: + enclosure = link + link = None + # 大小 + size = DomUtils.tag_value(item, "enclosure", "length", default=0) + if size and str(size).isdigit(): + size = int(size) + else: + size = 0 + # 发布日期 + pubdate = DomUtils.tag_value(item, "pubDate", default="") + if pubdate: + # 转换为时间 + pubdate = StringUtils.get_time(pubdate) + # 返回对象 + tmp_dict = {'title': title, + 'enclosure': enclosure, + 'size': size, + 'description': description, + 'link': link, + 'pubdate': pubdate} + ret_array.append(tmp_dict) + except Exception as e1: + print(str(e1)) + continue + except Exception as e2: + print(str(e2)) + return ret_array diff --git a/app/helper/sites.cp310-win_amd64.pyd b/app/helper/sites.cp310-win_amd64.pyd new file mode 100644 index 0000000000000000000000000000000000000000..690af52b49dbfd153beb86515b94f316e42f9377 GIT binary patch literal 52224 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 *pBmJYL+vt;-J0aUqcM>~ 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 U8N&%U35-bELE!&yADbTd4+Kjx)&Kwi literal 0 HcmV?d00001 diff --git a/app/helper/torrent.py b/app/helper/torrent.py new file mode 100644 index 00000000..769cdef8 --- /dev/null +++ b/app/helper/torrent.py @@ -0,0 +1,218 @@ +import datetime +import re +from pathlib import Path +from typing import Tuple, Optional, List +from urllib.parse import unquote + +from bencode import bdecode + +from app.core import settings, Context, MetaInfo +from app.log import logger +from app.utils.http import RequestUtils +from app.utils.string import StringUtils +from app.utils.types import MediaType + + +class TorrentHelper: + """ + 种子帮助类 + """ + def download_torrent(self, url: str, + cookie: str = None, + ua: str = None, + referer: str = None, + proxy: bool = False) \ + -> Tuple[Optional[Path], Optional[bytes], Optional[str], Optional[list], Optional[str]]: + """ + 把种子下载到本地 + :return: 种子保存路径、种子内容、种子主目录、种子文件清单、错误信息 + """ + if url.startswith("magnet:"): + return None, None, "", [], f"{url} 为磁力链接" + req = RequestUtils( + ua=ua, + cookies=cookie, + referer=referer, + proxies=settings.PROXY if proxy else None + ).get_res(url=url, allow_redirects=False) + while req and req.status_code in [301, 302]: + url = req.headers['Location'] + if url and url.startswith("magnet:"): + return None, None, "", [], f"获取到磁力链接:{url}" + req = RequestUtils( + ua=ua, + cookies=cookie, + referer=referer, + proxies=settings.PROXY if proxy else None + ).get_res(url=url, allow_redirects=False) + if req and req.status_code == 200: + if not req.content: + return None, None, "", [], "未下载到种子数据" + # 解析内容格式 + if req.text and str(req.text).startswith("magnet:"): + # 磁力链接 + return None, None, "", [], f"获取到磁力链接:{req.text}" + elif req.text and "下载种子文件" in req.text: + # 首次下载提示页面 + skip_flag = False + try: + form = re.findall(r'(.*?)', req.text, re.S) + if form: + action = form[0][0] + if not action or action == "?": + action = url + elif not action.startswith('http'): + action = StringUtils.get_base_url(url) + action + inputs = re.findall(r'', form[0][1], re.S) + if action and inputs: + data = {} + for item in inputs: + data[item[0]] = item[1] + # 改写req + req = RequestUtils( + ua=ua, + cookies=cookie, + referer=referer, + proxies=settings.PROXY if proxy else None + ).post_res(url=action, data=data) + if req and req.status_code == 200: + # 检查是不是种子文件,如果不是抛出异常 + bdecode(req.content) + # 跳过成功 + logger.info(f"触发了站点首次种子下载,已自动跳过:{url}") + skip_flag = True + elif req is not None: + logger.warn(f"触发了站点首次种子下载,且无法自动跳过," + f"返回码:{req.status_code},错误原因:{req.reason}") + else: + logger.warn(f"触发了站点首次种子下载,且无法自动跳过:{url}") + except Exception as err: + logger.warn(f"【Downloader】触发了站点首次种子下载,尝试自动跳过时出现错误:{err},链接:{url}") + + if not skip_flag: + return None, None, "", [], "种子数据有误,请确认链接是否正确,如为PT站点则需手工在站点下载一次种子" + else: + # 检查是不是种子文件,如果不是仍然抛出异常 + try: + bdecode(req.content) + except Exception as err: + print(str(err)) + return None, None, "", [], "种子数据有误,请确认链接是否正确" + # 读取种子文件名 + file_name = self.__get_url_torrent_filename(req, url) + # 种子文件路径 + file_path = Path(settings.TEMP_PATH) / file_name + # 种子内容 + file_content: bytes = req.content + # 读取种子信息 + file_folder, file_names, ret_msg = self.__get_torrent_fileinfo(file_content) + # 写入磁盘 + file_path.write_bytes(file_content) + # 返回 + return file_path, file_content, file_folder, file_names, ret_msg + + elif req is None: + return None, None, "", [], "无法打开链接:%s" % url + elif req.status_code == 429: + return None, None, "", [], "触发站点流控,请稍后重试" + else: + return None, None, "", [], "下载种子出错,状态码:%s" % req.status_code + + @staticmethod + def __get_torrent_fileinfo(content: bytes) -> Tuple[str, list, str]: + """ + 解析Torrent文件,获取文件清单 + :return: 种子文件列表主目录、种子文件列表、错误信息 + """ + file_folder = "" + file_names = [] + try: + torrent = bdecode(content) + if torrent.get("info"): + files = torrent.get("info", {}).get("files") or [] + if files: + for item in files: + if item.get("path"): + file_names.append(item["path"][0]) + file_folder = torrent.get("info", {}).get("name") + else: + file_names.append(torrent.get("info", {}).get("name")) + except Exception as err: + return file_folder, file_names, "解析种子文件异常:%s" % str(err) + return file_folder, file_names, "" + + @staticmethod + def __get_url_torrent_filename(req, url): + """ + 从下载请求中获取种子文件名 + """ + if not req: + return "" + disposition = req.headers.get('content-disposition') or "" + file_name = re.findall(r"filename=\"?(.+)\"?", disposition) + if file_name: + file_name = unquote(str(file_name[0].encode('ISO-8859-1').decode()).split(";")[0].strip()) + if file_name.endswith('"'): + file_name = file_name[:-1] + elif url and url.endswith(".torrent"): + file_name = unquote(url.split("/")[-1]) + else: + file_name = str(datetime.datetime.now()) + return file_name + + @staticmethod + def sort_group_torrents(torrent_list: List[Context]): + """ + 对媒体信息进行排序、去重 + """ + if not torrent_list: + return [] + + # 排序函数,标题、站点、资源类型、做种数量 + def get_sort_str(_context): + _meta = _context.meta_info + _torrent = _context.torrent_info + season_len = str(len(_meta.get_season_list())).rjust(2, '0') + episode_len = str(len(_meta.get_episode_list())).rjust(4, '0') + # 排序:标题、资源类型、站点、做种、季集 + return "%s%s%s%s" % (str(_torrent.title).ljust(100, ' '), + str(_torrent.pri_order).rjust(3, '0'), + str(_torrent.seeders).rjust(10, '0'), + "%s%s" % (season_len, episode_len)) + + # 匹配的资源中排序分组选最好的一个下载 + # 按站点顺序、资源匹配顺序、做种人数下载数逆序排序 + torrent_list = sorted(torrent_list, key=lambda x: get_sort_str(x), reverse=True) + # 控重 + result = [] + _added = [] + # 排序后重新加入数组,按真实名称控重,即只取每个名称的第一个 + for context in torrent_list: + # 控重的主链是名称、年份、季、集 + meta = context.meta_info + media = context.media_info + if media.type != MediaType.MOVIE: + media_name = "%s%s" % (media.get_title_string(), + meta.get_season_episode_string()) + else: + media_name = media.get_title_string() + if media_name not in _added: + _added.append(media_name) + result.append(context) + + return result + + @staticmethod + def get_torrent_episodes(files: list): + """ + 从种子的文件清单中获取所有集数 + """ + episodes = [] + for file in files: + if Path(file).suffix not in settings.RMT_MEDIAEXT: + continue + meta = MetaInfo(file) + if not meta.begin_episode: + continue + episodes = list(set(episodes).union(set(meta.get_episode_list()))) + return episodes diff --git a/app/log.py b/app/log.py new file mode 100644 index 00000000..ae72f8a1 --- /dev/null +++ b/app/log.py @@ -0,0 +1,29 @@ +import logging +from logging.handlers import RotatingFileHandler + +from app.core import settings + +# logger +logger = logging.getLogger() +logger.setLevel(logging.INFO) + +# 创建终端输出Handler +console_handler = logging.StreamHandler() +console_handler.setLevel(logging.DEBUG) + +# 创建文件输出Handler +file_handler = RotatingFileHandler(filename=settings.LOG_PATH / 'nasbot.log', + mode='w', + maxBytes=5 * 1024 * 1024, + backupCount=3, + encoding='utf-8') +file_handler.setLevel(logging.INFO) + +# 定义日志输出格式 +formatter = logging.Formatter("%(asctime)s - %(filename)s -【%(levelname)s】%(message)s") +console_handler.setFormatter(formatter) +file_handler.setFormatter(formatter) + +# 将Handler添加到Logger +logger.addHandler(console_handler) +logger.addHandler(file_handler) diff --git a/app/main.py b/app/main.py new file mode 100644 index 00000000..32fa24e1 --- /dev/null +++ b/app/main.py @@ -0,0 +1,48 @@ +import uvicorn as uvicorn +from fastapi import FastAPI + +from app.api.apiv1 import api_router +from app.core import settings, ModuleManager, PluginManager +from app.db.init import init_db, update_db +from app.helper.sites import SitesHelper +from app.scheduler import Scheduler + +# App +App = FastAPI(title=settings.PROJECT_NAME, + openapi_url=f"{settings.API_V1_STR}/openapi.json") + +# API路由 +App.include_router(api_router, prefix=settings.API_V1_STR) + + +@App.on_event("shutdown") +def shutdown_server(): + """ + 服务关闭 + """ + Scheduler().stop() + + +def start_module(): + """ + 启动模块 + """ + # 加载模块 + ModuleManager() + # 加载插件 + PluginManager() + # 加载站点 + SitesHelper() + # 启动定时服务 + Scheduler() + + +if __name__ == '__main__': + # 初始化数据库 + init_db() + # 更新数据库 + update_db() + # 启动模块 + start_module() + # 启动服务 + uvicorn.run('main:App', host=settings.HOST, port=settings.PORT, reload=False) diff --git a/app/modules/__init__.py b/app/modules/__init__.py new file mode 100644 index 00000000..bfd1aead --- /dev/null +++ b/app/modules/__init__.py @@ -0,0 +1,200 @@ +from abc import abstractmethod, ABCMeta +from pathlib import Path +from typing import Optional, List, Tuple, Union, Set + +from fastapi import Request + +from app.core.context import MediaInfo, TorrentInfo +from app.core.meta import MetaBase + + +class _ModuleBase(metaclass=ABCMeta): + """ + 模块基类,实现对应方法,在有需要时会被自动调用,返回None代表不启用该模块 + 输入参数与输出参数一致的,可以被多个模块重复实现 + 通过监听事件来实现多个模块之间的协作 + """ + + @abstractmethod + def init_module(self) -> None: + """ + 模块初始化 + """ + pass + + @abstractmethod + def init_setting(self) -> Tuple[str, Union[str, bool]]: + """ + 模块开关设置,返回开关名和开关值,开关值为True时代表有值即打开,不实现该方法或返回None代表不使用开关 + """ + pass + + def prepare_recognize(self, title: str, + subtitle: str = None) -> Tuple[str, str]: + """ + 识别前的预处理 + :param title: 标题 + :param subtitle: 副标题 + :return: 处理后的标题、副标题,注意如果返回None,有可能是没有对应的处理模块,应无视结果 + """ + pass + + def recognize_media(self, meta: MetaBase, + tmdbid: str = None) -> Optional[MediaInfo]: + """ + 识别媒体信息 + :param meta: 识别的元数据 + :param tmdbid: tmdbid + :return: 识别的媒体信息,包括剧集信息 + """ + pass + + def douban_info(self, doubanid: str) -> Optional[dict]: + """ + 获取豆瓣信息 + :param doubanid: 豆瓣ID + :return: 识别的媒体信息,包括剧集信息 + """ + pass + + def message_parser(self, request: Request) -> Optional[dict]: + """ + 解析消息内容,返回字典,注意以下约定值: + userid: 用户ID + username: 用户名 + text: 内容 + :param request: 请求体 + :return: 消息内容、用户ID + """ + pass + + def webhook_parser(self, message: dict) -> Optional[dict]: + """ + 解析Webhook报文体 + :param message: 请求体 + :return: 字典,解析为消息时需要包含:title、text、image + """ + pass + + def obtain_image(self, mediainfo: MediaInfo) -> Optional[MediaInfo]: + """ + 获取图片 + :param mediainfo: 识别的媒体信息 + :return: 更新后的媒体信息,注意如果返回None,有可能是没有对应的处理模块,应无视结果 + """ + pass + + def search_medias(self, meta: MetaBase) -> Optional[List[MediaInfo]]: + """ + 搜索媒体信息 + :param meta: 识别的元数据 + :reutrn: 媒体信息 + """ + pass + + def search_torrents(self, mediainfo: Optional[MediaInfo], sites: List[dict], + keyword: str = None) -> Optional[List[TorrentInfo]]: + """ + 搜索站点,多个站点需要多线程处理 + :param mediainfo: 识别的媒体信息 + :param sites: 站点列表 + :param keyword: 搜索关键词,如有按关键词搜索,否则按媒体信息名称搜索 + :reutrn: 资源列表 + """ + pass + + def refresh_torrents(self, sites: List[dict]) -> Optional[List[TorrentInfo]]: + """ + 获取站点最新一页的种子,多个站点需要多线程处理 + :param sites: 站点列表 + :reutrn: 种子资源列表 + """ + pass + + def filter_torrents(self, torrent_list: List[TorrentInfo]) -> List[TorrentInfo]: + """ + 过滤资源 + :param torrent_list: 资源列表 + :return: 过滤后的资源列表,注意如果返回None,有可能是没有对应的处理模块,应无视结果 + """ + pass + + def download(self, torrent_path: Path, cookie: str, + episodes: Set[int] = None) -> Optional[Tuple[Optional[str], str]]: + """ + 根据种子文件,选择并添加下载任务 + :param torrent_path: 种子文件地址 + :param cookie: 站点Cookie + :param episodes: 需要下载的集数 + :return: 种子Hash + """ + pass + + def transfer(self, path: str, mediainfo: MediaInfo) -> Optional[bool]: + """ + 文件转移 + :param path: 文件路径 + :param mediainfo: 识别的媒体信息 + :return: 成功或失败 + """ + pass + + def media_exists(self, mediainfo: MediaInfo) -> Optional[dict]: + """ + 判断媒体文件是否存在 + :param mediainfo: 识别的媒体信息 + :return: 如不存在返回None,存在时返回信息,包括每季已存在所有集{type: movie/tv, seasons: {season: [episodes]}} + """ + pass + + def refresh_mediaserver(self, mediainfo: MediaInfo, file_path: str) -> Optional[bool]: + """ + 刷新媒体库 + :param mediainfo: 识别的媒体信息 + :param file_path: 文件路径 + :return: 成功或失败 + """ + pass + + def post_message(self, title: str, + text: str = None, image: str = None, userid: Union[str, int] = None) -> Optional[bool]: + """ + 发送消息 + :param title: 标题 + :param text: 内容 + :param image: 图片 + :param userid: 用户ID + :return: 成功或失败 + """ + pass + + def post_medias_message(self, title: str, items: List[MediaInfo], + userid: Union[str, int] = None) -> Optional[bool]: + """ + 发送媒体信息选择列表 + :param title: 标题 + :param items: 消息列表 + :param userid: 用户ID + :return: 成功或失败 + """ + pass + + def post_torrents_message(self, title: str, items: List[TorrentInfo], + userid: Union[str, int] = None) -> Optional[bool]: + """ + 发送种子信息选择列表 + :param title: 标题 + :param items: 消息列表 + :param userid: 用户ID + :return: 成功或失败 + """ + pass + + def scrape_metadata(self, path: str, mediainfo: MediaInfo) -> None: + """ + 刮削元数据 + :param path: 媒体文件路径 + :param mediainfo: 识别的媒体信息 + :return: 成功或失败 + """ + pass diff --git a/app/modules/__pycache__/__init__.cpython-310.pyc b/app/modules/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7f6140b6516393270a5ebc7bd008540d7e46176c GIT binary patch literal 8125 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 None: + pass + + def init_setting(self) -> Tuple[str, Union[str, bool]]: + pass + + def douban_info(self, doubanid: str) -> Optional[dict]: + """ + 获取豆瓣信息 + :param doubanid: 豆瓣ID + :return: 识别的媒体信息,包括剧集信息 + """ + if not doubanid: + return None + douban_info = self.doubanapi.movie_detail(doubanid) + if douban_info: + celebrities = self.doubanapi.movie_celebrities(doubanid) + if celebrities: + douban_info["directors"] = celebrities.get("directors") + douban_info["actors"] = celebrities.get("actors") + else: + douban_info = self.doubanapi.tv_detail(doubanid) + celebrities = self.doubanapi.tv_celebrities(doubanid) + if douban_info and celebrities: + douban_info["directors"] = celebrities.get("directors") + douban_info["actors"] = celebrities.get("actors") + return self.__extend_doubaninfo(douban_info) + + @staticmethod + def __extend_doubaninfo(doubaninfo: dict): + """ + 补充添加豆瓣信息 + """ + # 类型 + if doubaninfo.get("type") == "movie": + doubaninfo['media_type'] = MediaType.MOVIE + elif doubaninfo.get("type") == "tv": + doubaninfo['media_type'] = MediaType.TV + else: + return doubaninfo + # 评分 + rating = doubaninfo.get('rating') + if rating: + doubaninfo['vote_average'] = float(rating.get("value")) + else: + doubaninfo['vote_average'] = 0 + + # 海报 + if doubaninfo.get("type") == "movie": + poster_path = doubaninfo.get('cover', {}).get("url") + if not poster_path: + poster_path = doubaninfo.get('cover_url') + if not poster_path: + poster_path = doubaninfo.get('pic', {}).get("large") + else: + poster_path = doubaninfo.get('pic', {}).get("normal") + if poster_path: + poster_path = poster_path.replace("s_ratio_poster", "m_ratio_poster") + doubaninfo['poster_path'] = poster_path + + # 简介 + doubaninfo['overview'] = doubaninfo.get("card_subtitle") or "" + + return doubaninfo + + def search_medias(self, meta: MetaBase) -> Optional[List[MediaInfo]]: + """ + 搜索媒体信息 + :param meta: 识别的元数据 + :reutrn: 媒体信息 + """ + # 未启用豆瓣搜索时返回None + if settings.SEARCH_SOURCE != "douban": + return None + + if not meta.get_name(): + return [] + result = self.doubanapi.search(meta.get_name()) + if not result: + return [] + # 返回数据 + ret_medias = [] + for item_obj in result.get("items"): + if meta.type and meta.type.value != item_obj.get("type_name"): + continue + if item_obj.get("type_name") not in (MediaType.TV.value, MediaType.MOVIE.value): + continue + ret_medias.append(MediaInfo(douban_info=item_obj.get("target"))) + + return ret_medias + + def scrape_metadata(self, path: str, mediainfo: MediaInfo) -> None: + """ + TODO 刮削元数据 + :param path: 媒体文件路径 + :param mediainfo: 识别的媒体信息 + :return: 成功或失败 + """ + if settings.SCRAP_SOURCE != "douban": + return None diff --git a/app/modules/douban/__pycache__/__init__.cpython-310.pyc b/app/modules/douban/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..09ce4575eeb36fbb695806cf6b05f296f27dad49 GIT binary patch literal 3460 zcmaJ@-EUk+6`z@V_wLzJLhB0 znVIvOGZU3cc>>?F{*U<|D}?+Dnc>d_<|Sxx0E81x0}@h)hRk81;TWOmm=xtK$b^<- zg;^)7c_XmHoRiaiGsuSpr=a_ppcs~%lI~kUIjlGpO1?*UmfQP;+oG^%I3ql_N~-yf zAtI@o%KW|`C(2%FCVtfL0+m^7H3OkCmm9!WnaV8*?t2#+n~}0(ktBX&E3Q&yFNwr^ z*^34A3+__HTY>1Yxy7ip;Wg%)KIqcnYuB2hh5?5^tH;D|Lq`yYa^kRCWRr5r*}m-< ze3EClwGW%X4UrL+$U?I>*=dqCy)4to@tm;0A}c?JxESRIH#aRl!B2s7{1!2ZGXb0RjIz=-)#%Uyu+N|w z(BerT3E3kDv_mLK*dA#U*WhH8+^5U1&6&8>6jIr)>o@$wbtM8r<+$D|uj${X%8W&@ z3I93Qtp#2jyY7ARpYscI>z898~@$ z*<25GBI5Pb?|MJlZ1b7~{E;F~6+xG$MY>x_7d6|rQkE1+OE#9DSSBuY0oo@x78fN; z(2=K*j1GF5#f?w}y~uPjBOv$$_sOKYW4(w&>d%ZNr_k~Lk5kl+daxWv`)MG%9{N1B}b`F2~V4#|7deRGL`fHq*x zLCx+!xw^t+DWP@NCLHr$8E8z-V+EWnriMglki-s;dj3RYPdZ*n{B z4g6q)HO=LG(qUkqPmvj)*V00dTh&~#XH!CHBX>epPA#Qqvx5w;@R1HfghRYhz%kBj ztV5d-9|y?_Z4xn_@dAEDx#^J+{x_1tqibiE7Q1MkpgF)p(yh2mBz^*y98osL0r>u?YRP9IvMlKEODnHj zIH%a!D=M=YL|&q@QZxgvCaQ*QgfN^fU4kv^Xlmn8ott&9O0g?{ic>D1Oza1__ z168l0;Y#ObhKkmWy~AJs_3-ugjt!+~C9*L$^Hev=N>B5$%J_*0W0gZ3x(zP`3?&Gq zq)K(ksFoz|pen7No4>Sh-d$a}d}-mFvcW=|>vE^8Sa`CwoucInU@yOd1aTw3iR48f z%7V)nN}0qrPBoJjv2SUG6mcs^oIF%xSD%a6v2kKk&b6lHW8+7xiR6FuOZ7_3Zv0CGAcR?r$&v;K#DycIQiu;QLX4da`Nn| zN?em3U;`n?y~IPL#+X6eaPz;rll_f7X$HZb0i)&WDSX}`uv}N=T{nIHK)>j^ueQ7( z)#!JaJdNS;E>T9DNQtLcnHy0Q$j_k$^Px=c*Ak6PRg4p;aW$COcElxKYtlx7Inx-E zFJW&Hh${7-k8nW-@XkD5qkbRZy(sY+i0{uB_roSdmN(BBlLng{q0?VFGp+T@)loPf z*P2kM(=a$EJ>_(^HXwYq7DR3yF<3oxqjAU6xw%itsd;9Cz?cJH_ z(d(XFX&4z22{3`hfUp(7z%IeZLW1qsF>!E!IB|eDKv795sjehNg;<3uR{|ey#@l`f0b-yO zW2*P9sET}MD#LG9jF;kSTp?b($V&+|AtM5I4hB zi2ZOi;uhG7n1yRDDrjc_uEnQqupMy+T!*+51`*!|*CW0iZa^G@9O5wSLL7nJh~ai;;nGoMdb;ybPx{V^RL70hY@m{zO@g&@jsKNt?r{H~v?}t3%gPy`yOze+=KoIH%q-|(IpQ!cZ zyh3iqFwdA}wbOgdYvbd!l+SZ}OV+e$APKdzZtZD(u6 zK*rbX^etLexwfsfmW_O0!;gVuRYvv>*LJkl@gzJgwad4on+3DBy|t1}0=|xK3H#K5 zvnyHhBo=FFGFmHXc@n;sABUnfZLAar;(Hn{B?ktxmTlG;kLTCjg-?KuupLux-u8$< zL`N$b!ql~LOPxRYHm=|v*GUPclN*f-{Qi%3T$e63zN z^H7{@1E&npJkm>qd|hwW@&|U)F)H;Ijq44PR50aeqnHHUv#VKXS_u30H%oTeDmSTa zPs{3>$_FtlRc%wx+j2wOJX@m@K@7dQN@(S&e9^R>#%dB!)ILw-EUr;`lCx{8{B@&2 zQhQ{38rAgXh>!~j-kKEDS@YJU;4xThz;HCPh)a;Pm{a{pQQ!c?6(U&Yw%b@OQ38Gi zyTY=ge2=2~ONAq_Rzuje)qcfTLqJn|z1Ep!#}JfBwKWZ)kf{2Ll`wGWooNJsT=7Wi zIzN!XvMeVJySAxOTev=ZEO(Wsp&LbGOqh;o*tK;H=?Gb_wtj3lEzc^=WPVg+BpV?i zjvtSJ;|GIg=AhNJUaBS<2HG-&&Bai9?2w{%l10DuJw7*R`fADZw-XttMrp}SbEOg|I|X==txQNIy=p+wM(wLX85 z!?leOxkVhzJ~`kTNlTBEw36INT1jrW+UxN{zbN4Xk&uW9=hf0kxIiXwcU>T{$SX>? zhU6lan*ysU$9PB1FXh~Bzm%7oD;(JYheAjDt--ix*8+m*#?hfof8 zuR{f4ft4E_8W|ZH9vZ{(yMO1%?p=e~Tgo6T6LKTFvlSGn>Q3$mzNTmQ3}>ft(`t#_ z9Vc$N@6h3F$pWJo^2Tt&fPj@1Rw;+iR8cltHk=ttOyy>9)0E9tikgG#MJeYSI;KH8 z7kAw_G>py-N1PjJICnU^Kk)3NsaYj6@QfIqTfV8R^s8i6&3!GsDp_MVV_AU>Anqb8xM8xcnaUdl%op>F2_AYK@1>O!kdR~J8D+S+tx}TBULd)3{nR>{H&bK$1B(h znod6d7#U>*Qr{C9#mgTe^QQ7M$3e zQdj1cNp_BdG8eDM=lDEQClhrJ4C1rQN!HnUWjsEwoJ%;VxwO+U*IAEEcFkqxWAy}~ z(>>WUAD`=;kIgG{ee)C$e)LUchwH^eD;R^T1fBc2Y4lAVqq)4IITJ3Qw9K-bs8%pV z-NfmtwReQ|8$@ z?4~&eob>7m#B@DgPe5XpLGp1#Z7#nN$?YpUQOcdOjVZzzyPD;FsR45PJ4owmkG-q5{ ziy#gn=rkIFi^{>6d}A{{U`NrdfU*e_qt0Y^vDpN6PyDE$+*#nRa@tMUjwT#8p<7jq z6-9r6xvQh$G0SA!O;E$^g@m{kW!x0T8dpIO@53kYegbOll7>n<&m#Q|>V(ZoG|RnH zo0g3bDr%6c8LIXHf;_<(!9WN!tfa{EQ~-q9`mk$61nJs*`mpxh6s%n%9J-YA}midV6)sy zGs^6RcqB(iOZMXemw6OnHA^4T{|??VeKsn!4UI_nUF)65we(OJs7+b4nhX~RWEPE6 zX-O85$SXvjK&Y)uvwbkYu|#5KrmGX_ZHGKtA4F){|czVQwv#q}uRD#!ICeg_wo(|F4) zr7m8+Ow>7UGTCg>TPkQfypV7?{^El>EZY)JWNm0H8%b~3IE~Um5Ujlapjzqod70P! zN-Z*Hcufe;!diMSEYznZq>Ic|2xNxYR9ceDB=QTQI|$K1g#F*J)V60fP!%grx+L=N zBqn<%+ZZ*JY0D4p+s{+9l((@-BL5ZI+`7o-@^kxkNnX7btLn`9*Uz8($m>p<3%Ga-}_S@NjWn0I@?J8H^%qvDq+Y|{+7Hc^WV&&5K^_N0`| zl!Es1L|z{Yx7KpcQ>Ayi&^garYS{eKA@QxWDv+VQ`GM@~FMsIur#`;40=Z*9kiGoq zvsXU)$Wo?bBj?hKS1!G9`Qhh7rnm;ZYxMGda0ErZvej_$;Q;K@@u z{2z?ifpUXG^paD?AItK2w=&d3wW7xn8d<)ZV3gq91cwpaG`>mE|6}l- z>K^a?PaG%ac4BtvMa{Oo*KRRFPjbqXc&m&?}GkG9mZ*au-h9UqPEp zZ-2OoO0=X3x$TiV61h{5i@01*DFeJ^My>>Mo|Y3S%{1N=AxEzqPF14GkT>QDS=vSn znjXoveNv&hk|{jF{+lP+o4kwtl6SK=crW`;-pBrfuV(+o*RX%(YuPXOI`%JoGrP?D z*+26w?4Nj+{ge-|f8^WP-}4>Z&@Eh1)@f`aJ-^G5+ce5Yzz3eqU%6`E2 zv+wbDuvhs_>=k}9`!2tgeVZR-FY`m}Tl{wR5S!EtUH#4M>~{4c<_aX6?iB?leL?~S6@64lIKt2EKz#!tZk@Df8H9RlRtTU;I3&9 ty str: + url_path = parse.urlparse(url).path + raw_sign = '&'.join([method.upper(), parse.quote(url_path, safe=''), str(ts)]) + return base64.b64encode(hmac.new(cls._api_secret_key.encode(), raw_sign.encode(), hashlib.sha1).digest() + ).decode() + + @classmethod + @lru_cache(maxsize=256) + def __invoke(cls, url, **kwargs): + req_url = cls._base_url + url + + params = {'apiKey': cls._api_key} + if kwargs: + params.update(kwargs) + + ts = params.pop('_ts', int(datetime.strftime(datetime.now(), '%Y%m%d'))) + params.update({'os_rom': 'android', 'apiKey': cls._api_key, '_ts': ts, '_sig': cls.__sign(url=req_url, ts=ts)}) + + resp = RequestUtils(ua=choice(cls._user_agents), session=cls._session).get_res(url=req_url, params=params) + + return resp.json() if resp else {} + + def search(self, keyword, start=0, count=20, ts=datetime.strftime(datetime.now(), '%Y%m%d')): + return self.__invoke(self._urls["search"], q=keyword, start=start, count=count, _ts=ts) + + def movie_search(self, keyword, start=0, count=20, ts=datetime.strftime(datetime.now(), '%Y%m%d')): + return self.__invoke(self._urls["movie_search"], q=keyword, start=start, count=count, _ts=ts) + + def tv_search(self, keyword, start=0, count=20, ts=datetime.strftime(datetime.now(), '%Y%m%d')): + return self.__invoke(self._urls["tv_search"], q=keyword, start=start, count=count, _ts=ts) + + def book_search(self, keyword, start=0, count=20, ts=datetime.strftime(datetime.now(), '%Y%m%d')): + return self.__invoke(self._urls["book_search"], q=keyword, start=start, count=count, _ts=ts) + + def group_search(self, keyword, start=0, count=20, ts=datetime.strftime(datetime.now(), '%Y%m%d')): + return self.__invoke(self._urls["group_search"], q=keyword, start=start, count=count, _ts=ts) + + def movie_showing(self, start=0, count=20, ts=datetime.strftime(datetime.now(), '%Y%m%d')): + return self.__invoke(self._urls["movie_showing"], start=start, count=count, _ts=ts) + + def movie_soon(self, start=0, count=20, ts=datetime.strftime(datetime.now(), '%Y%m%d')): + return self.__invoke(self._urls["movie_soon"], start=start, count=count, _ts=ts) + + def movie_hot_gaia(self, start=0, count=20, ts=datetime.strftime(datetime.now(), '%Y%m%d')): + return self.__invoke(self._urls["movie_hot_gaia"], start=start, count=count, _ts=ts) + + def tv_hot(self, start=0, count=20, ts=datetime.strftime(datetime.now(), '%Y%m%d')): + return self.__invoke(self._urls["tv_hot"], start=start, count=count, _ts=ts) + + def tv_animation(self, start=0, count=20, ts=datetime.strftime(datetime.now(), '%Y%m%d')): + return self.__invoke(self._urls["tv_animation"], start=start, count=count, _ts=ts) + + def tv_variety_show(self, start=0, count=20, ts=datetime.strftime(datetime.now(), '%Y%m%d')): + return self.__invoke(self._urls["tv_variety_show"], start=start, count=count, _ts=ts) + + def tv_rank_list(self, start=0, count=20, ts=datetime.strftime(datetime.now(), '%Y%m%d')): + return self.__invoke(self._urls["tv_rank_list"], start=start, count=count, _ts=ts) + + def show_hot(self, start=0, count=20, ts=datetime.strftime(datetime.now(), '%Y%m%d')): + return self.__invoke(self._urls["show_hot"], start=start, count=count, _ts=ts) + + def movie_detail(self, subject_id): + return self.__invoke(self._urls["movie_detail"] + subject_id) + + def movie_celebrities(self, subject_id): + return self.__invoke(self._urls["movie_celebrities"] % subject_id) + + def tv_detail(self, subject_id): + return self.__invoke(self._urls["tv_detail"] + subject_id) + + def tv_celebrities(self, subject_id): + return self.__invoke(self._urls["tv_celebrities"] % subject_id) + + def book_detail(self, subject_id): + return self.__invoke(self._urls["book_detail"] + subject_id) + + def movie_top250(self, start=0, count=20, ts=datetime.strftime(datetime.now(), '%Y%m%d')): + return self.__invoke(self._urls["movie_top250"], start=start, count=count, _ts=ts) + + def movie_recommend(self, tags='', sort='R', start=0, count=20, ts=datetime.strftime(datetime.now(), '%Y%m%d')): + return self.__invoke(self._urls["movie_recommend"], tags=tags, sort=sort, start=start, count=count, _ts=ts) + + def tv_recommend(self, tags='', sort='R', start=0, count=20, ts=datetime.strftime(datetime.now(), '%Y%m%d')): + return self.__invoke(self._urls["tv_recommend"], tags=tags, sort=sort, start=start, count=count, _ts=ts) + + def tv_chinese_best_weekly(self, start=0, count=20, ts=datetime.strftime(datetime.now(), '%Y%m%d')): + return self.__invoke(self._urls["tv_chinese_best_weekly"], start=start, count=count, _ts=ts) + + def tv_global_best_weekly(self, start=0, count=20, ts=datetime.strftime(datetime.now(), '%Y%m%d')): + return self.__invoke(self._urls["tv_global_best_weekly"], start=start, count=count, _ts=ts) + + def doulist_detail(self, subject_id): + """ + 豆列详情 + :param subject_id: 豆列id + """ + return self.__invoke(self._urls["doulist"] + subject_id) + + def doulist_items(self, subject_id, start=0, count=20, ts=datetime.strftime(datetime.now(), '%Y%m%d')): + """ + 豆列列表 + :param subject_id: 豆列id + :param start: 开始 + :param count: 数量 + :param ts: 时间戳 + """ + return self.__invoke(self._urls["doulist_items"] % subject_id, start=start, count=count, _ts=ts) diff --git a/app/modules/emby/__init__.py b/app/modules/emby/__init__.py new file mode 100644 index 00000000..51771470 --- /dev/null +++ b/app/modules/emby/__init__.py @@ -0,0 +1,69 @@ +from typing import Optional, Tuple, Union + +from app.core import MediaInfo +from app.log import logger +from app.modules import _ModuleBase +from app.modules.emby.emby import Emby +from app.utils.types import MediaType + + +class EmbyModule(_ModuleBase): + + emby: Emby = None + + def init_module(self) -> None: + self.emby = Emby() + + def init_setting(self) -> Tuple[str, Union[str, bool]]: + return "MEDIASERVER", "emby" + + def webhook_parser(self, message: dict) -> Optional[dict]: + """ + 解析Webhook报文体 + :param message: 请求体 + :return: 字典,解析为消息时需要包含:title、text、image + """ + return self.emby.get_webhook_message(message) + + def media_exists(self, mediainfo: MediaInfo) -> Optional[dict]: + """ + 判断媒体文件是否存在 + :param mediainfo: 识别的媒体信息 + :return: 如不存在返回None,存在时返回信息,包括每季已存在所有集{type: movie/tv, seasons: {season: [episodes]}} + """ + if mediainfo.type == MediaType.MOVIE: + movies = self.emby.get_movies(title=mediainfo.title, year=mediainfo.year) + if movies: + logger.info(f"{mediainfo.get_title_string()} 在媒体库中不存在") + return None + else: + logger.info(f"媒体库中已存在:{movies}") + return {"type": MediaType.MOVIE} + else: + tvs = self.emby.get_tv_episodes(title=mediainfo.title, + year=mediainfo.year, + tmdb_id=mediainfo.tmdb_id) + if not tvs: + logger.info(f"{mediainfo.get_title_string()} 在媒体库中不存在") + return None + else: + logger.info(f"{mediainfo.get_title_string()} 媒体库中已存在:{tvs}") + return {"type": MediaType.TV, "seasons": tvs} + + def refresh_mediaserver(self, mediainfo: MediaInfo, file_path: str) -> Optional[bool]: + """ + 刷新媒体库 + :param mediainfo: 识别的媒体信息 + :param file_path: 文件路径 + :return: 成功或失败 + """ + items = [ + { + "title": mediainfo.title, + "year": mediainfo.year, + "type": mediainfo.type, + "category": mediainfo.category, + "target_path": file_path + } + ] + return self.emby.refresh_library_by_items(items) diff --git a/app/modules/emby/__pycache__/__init__.cpython-310.pyc b/app/modules/emby/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3678b1acf77706666a6828d0ed83cf127fbdcdc3 GIT binary patch literal 2731 zcmb7GTW=dh6yBTfc9POGZ4g8T2_y>?o_L8WR44)ZkhJOzX)#)DJQHW#U9Xv4ha`1S zFKJ0jD0stF}gFHlMdMW~5Nq5orFn>FcE#Vbg_IkWc02?&X?W_;$%*)!j{%$cz> znWO;iS>q$}4p5J9(%KZ5?1AnO7>GbbQ?Nu;v?NusWK|ZCCz*;BQ6rp|&8QVqW1LpZ zxRp>7oQ{}DE2XA59W~QdM$L%A+X9J^_>@56G;vy1+eqS&kV`&>orIk1#rIcS!!GNl z7dc$5nAD3LDZ@M`dWiu_41HgD*oH~ew2MW`fJ$itHmREQ4c(zIRr;-=@lg8kc!d^F zb8CyiWDj&_8U`w;A`w*S2w17gRG|?f?H0&3qL9dxqDF~KV-%1=PYz4nLeNQ+#9%cA zHl#r!L({OLkOWBrw~eG|dkZ&BGQjQN+%_8LD@l-#l6KMoE8B<&9(c-2BJ{wRK~JGD z@uG~nRaP#DfVA0=mZ0y2?xbOGh0{V!(7+5(BM#;y76&d%!EhTK;!tz=w!qq9`ukgZ z`|?K|%A9;@Y^*qvKQLYx(V2CC*(F+Vo&113YS06QX}fv7QpsD~vrZndr*)CxhiSQ0yR}v^deVVM1?<$UpF-4IDpa8aH18++J#+|IK}`AL>7NwErN-&r!1s z2n7@x!8%~@(pVr@30W$2+ZYeGp_5NqNh z#zd^n!CErgXzO2HuV0&amky2C_Obf;oAud`*M7bfF85V*rd!#@HhtOb`tnNs?x{^8 zK|K4i{?cXt%<7W|7XqDYtM}{ort2q{>zD66o!g3-j6ZYd$%Ct|;hOZ(iIXlJ zbK%dhz=Uv1h&6^;-Cm@w_F(`_YXE>X3=QkVfje%)du>fwfDGw?B0&hF6WuNT+brcJ zEIfe*oWM;!#27}Pb02;OL`^ISu2_h!$R|ooniCql2x>AQ8eCJdsR{m5BzjSvlxwon|6kg|U1BvEw92>> z=uFpS5}%hK%8BZ406O%kKYgP|{0nF5pL|=4->%|(Fa~VEo31mhF_8;BXA0&7Z6P%mqY;3}!D5hXSdL1ah z&Cwi}K}}HGIcHRB+RmOvY3cCMoDv+2E|{y)K&dLbqt4b-lIHoY(J{kuoo7JW$- zrZyBe6S_V<kp8`p-$HN&Nr(;7wg9LReS&fglu?M($d6j1C&DSH*f9lS=A1V&F0 zB~kf9`7526=xM2b|MDT^E8e(+a9hVUt*l#A)4ZexnTbyjpwpW6K~*<{mEa1)%h+qz zG`(E5T^%1cj;1lZvKVH8Cquq6%mGgsvTc)X=Oi%-F2mc2?Z5%+E6d{W0uCGHJgn&q zpLEzAtolhIEhVKMxl8Vf_jL2M!Cbo+g>wpLBT$UH2OG!XvhOX}jPiZF7*64V#m|?T z!dc@b!0_#)?r7okQg|EifxkMuc3i8vhUxTTO>p>8=KKE}XfM7y(EJ*{2srXiK%N$Z HU#I*xlt(Bk literal 0 HcmV?d00001 diff --git a/app/modules/emby/__pycache__/emby.cpython-310.pyc b/app/modules/emby/__pycache__/emby.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6a7853f353de2c4026a894218a42888a7444ebf0 GIT binary patch literal 14499 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 CSXznz literal 0 HcmV?d00001 diff --git a/app/modules/emby/emby.py b/app/modules/emby/emby.py new file mode 100644 index 00000000..6c9f6dac --- /dev/null +++ b/app/modules/emby/emby.py @@ -0,0 +1,484 @@ +import re +from pathlib import Path +from typing import List, Optional, Union, Dict + +from app.core import settings +from app.log import logger +from app.utils.http import RequestUtils +from app.utils.singleton import Singleton +from app.utils.string import StringUtils +from app.utils.types import MediaType + + +class Emby(metaclass=Singleton): + + def __init__(self): + self._host = settings.EMBY_HOST + self._apikey = settings.EMBY_API_KEY + self._user = self.get_user() + self._folders = self.get_emby_folders() + + def get_emby_folders(self) -> List[dict]: + """ + 获取Emby媒体库路径列表 + """ + if not self._host or not self._apikey: + return [] + req_url = "%semby/Library/SelectableMediaFolders?api_key=%s" % (self._host, self._apikey) + try: + res = RequestUtils().get_res(req_url) + if res: + return res.json() + else: + logger.error(f"Library/SelectableMediaFolders 未获取到返回数据") + return [] + except Exception as e: + logger.error(f"连接Library/SelectableMediaFolders 出错:" + str(e)) + return [] + + def get_emby_librarys(self) -> List[dict]: + """ + 获取Emby媒体库列表 + """ + if not self._host or not self._apikey: + return [] + req_url = f"{self._host}emby/Users/{self._user}/Views?api_key={self._apikey}" + try: + res = RequestUtils().get_res(req_url) + if res: + return res.json().get("Items") + else: + logger.error(f"User/Views 未获取到返回数据") + return [] + except Exception as e: + logger.error(f"连接User/Views 出错:" + str(e)) + return [] + + def get_user(self, user_name: str = None) -> Optional[Union[str, int]]: + """ + 获得管理员用户 + """ + if not self._host or not self._apikey: + return None + req_url = "%sUsers?api_key=%s" % (self._host, self._apikey) + try: + res = RequestUtils().get_res(req_url) + if res: + users = res.json() + # 先查询是否有与当前用户名称匹配的 + if user_name: + for user in users: + if user.get("Name") == user_name: + return user.get("Id") + # 查询管理员 + for user in users: + if user.get("Policy", {}).get("IsAdministrator"): + return user.get("Id") + else: + logger.error(f"Users 未获取到返回数据") + except Exception as e: + logger.error(f"连接Users出错:" + str(e)) + return None + + def get_server_id(self) -> Optional[str]: + """ + 获得服务器信息 + """ + if not self._host or not self._apikey: + return None + req_url = "%sSystem/Info?api_key=%s" % (self._host, self._apikey) + try: + res = RequestUtils().get_res(req_url) + if res: + return res.json().get("Id") + else: + logger.error(f"System/Info 未获取到返回数据") + except Exception as e: + + logger.error(f"连接System/Info出错:" + str(e)) + return None + + def get_user_count(self) -> int: + """ + 获得用户数量 + """ + if not self._host or not self._apikey: + return 0 + req_url = "%semby/Users/Query?api_key=%s" % (self._host, self._apikey) + try: + res = RequestUtils().get_res(req_url) + if res: + return res.json().get("TotalRecordCount") + else: + logger.error(f"Users/Query 未获取到返回数据") + return 0 + except Exception as e: + logger.error(f"连接Users/Query出错:" + str(e)) + return 0 + + def get_activity_log(self, num: int = 30) -> List[dict]: + """ + 获取Emby活动记录 + """ + if not self._host or not self._apikey: + return [] + req_url = "%semby/System/ActivityLog/Entries?api_key=%s&" % (self._host, self._apikey) + ret_array = [] + try: + res = RequestUtils().get_res(req_url) + if res: + ret_json = res.json() + items = ret_json.get('Items') + for item in items: + if item.get("Type") == "AuthenticationSucceeded": + event_type = "LG" + event_date = StringUtils.get_time(item.get("Date")) + event_str = "%s, %s" % (item.get("Name"), item.get("ShortOverview")) + activity = {"type": event_type, "event": event_str, "date": event_date} + ret_array.append(activity) + if item.get("Type") in ["VideoPlayback", "VideoPlaybackStopped"]: + event_type = "PL" + event_date = StringUtils.get_time(item.get("Date")) + event_str = item.get("Name") + activity = {"type": event_type, "event": event_str, "date": event_date} + ret_array.append(activity) + else: + logger.error(f"System/ActivityLog/Entries 未获取到返回数据") + return [] + except Exception as e: + + logger.error(f"连接System/ActivityLog/Entries出错:" + str(e)) + return [] + return ret_array[:num] + + def get_medias_count(self) -> dict: + """ + 获得电影、电视剧、动漫媒体数量 + :return: MovieCount SeriesCount SongCount + """ + if not self._host or not self._apikey: + return {} + req_url = "%semby/Items/Counts?api_key=%s" % (self._host, self._apikey) + try: + res = RequestUtils().get_res(req_url) + if res: + return res.json() + else: + logger.error(f"Items/Counts 未获取到返回数据") + return {} + except Exception as e: + logger.error(f"连接Items/Counts出错:" + str(e)) + return {} + + def __get_emby_series_id_by_name(self, name: str, year: str) -> Optional[str]: + """ + 根据名称查询Emby中剧集的SeriesId + :param name: 标题 + :param year: 年份 + :return: None 表示连不通,""表示未找到,找到返回ID + """ + if not self._host or not self._apikey: + return None + req_url = "%semby/Items?IncludeItemTypes=Series&Fields=ProductionYear&StartIndex=0&Recursive=true&SearchTerm=%s&Limit=10&IncludeSearchTypes=false&api_key=%s" % ( + self._host, name, self._apikey) + try: + res = RequestUtils().get_res(req_url) + if res: + res_items = res.json().get("Items") + if res_items: + for res_item in res_items: + if res_item.get('Name') == name and ( + not year or str(res_item.get('ProductionYear')) == str(year)): + return res_item.get('Id') + except Exception as e: + logger.error(f"连接Items出错:" + str(e)) + return None + return "" + + def get_movies(self, title: str, year: str = None) -> Optional[List[dict]]: + """ + 根据标题和年份,检查电影是否在Emby中存在,存在则返回列表 + :param title: 标题 + :param year: 年份,可以为空,为空时不按年份过滤 + :return: 含title、year属性的字典列表 + """ + if not self._host or not self._apikey: + return None + req_url = "%semby/Items?IncludeItemTypes=Movie&Fields=ProductionYear&StartIndex=0" \ + "&Recursive=true&SearchTerm=%s&Limit=10&IncludeSearchTypes=false&api_key=%s" % ( + self._host, title, self._apikey) + try: + res = RequestUtils().get_res(req_url) + if res: + res_items = res.json().get("Items") + if res_items: + ret_movies = [] + for res_item in res_items: + if res_item.get('Name') == title and ( + not year or str(res_item.get('ProductionYear')) == str(year)): + ret_movies.append( + {'title': res_item.get('Name'), 'year': str(res_item.get('ProductionYear'))}) + return ret_movies + except Exception as e: + logger.error(f"连接Items出错:" + str(e)) + return None + return [] + + def get_tv_episodes(self, + title: str = None, + year: str = None, + tmdb_id: str = None, + season: int = None) -> Optional[Dict[int, list]]: + """ + 根据标题和年份和季,返回Emby中的剧集列表 + :param title: 标题 + :param year: 年份 + :param tmdb_id: TMDBID + :param season: 季 + :return: 每一季的已有集数 + """ + if not self._host or not self._apikey: + return None + # 电视剧 + item_id = self.__get_emby_series_id_by_name(title, year) + if item_id is None: + return None + if not item_id: + return {} + # 验证tmdbid是否相同 + item_tmdbid = self.get_iteminfo(item_id).get("ProviderIds", {}).get("Tmdb") + if tmdb_id and item_tmdbid: + if str(tmdb_id) != str(item_tmdbid): + return {} + # /Shows/Id/Episodes 查集的信息 + if not season: + season = "" + try: + req_url = "%semby/Shows/%s/Episodes?Season=%s&IsMissing=false&api_key=%s" % ( + self._host, item_id, season, self._apikey) + res_json = RequestUtils().get_res(req_url) + if res_json: + res_items = res_json.json().get("Items") + season_episodes = {} + for res_item in res_items: + season_index = res_item.get("ParentIndexNumber") + if not season_index: + continue + if season and season != season_index: + continue + episode_index = res_item.get("IndexNumber") + if not episode_index: + continue + if season_index not in season_episodes: + season_episodes[season_index] = [] + season_episodes[season_index].append(episode_index) + # 返回 + return season_episodes + except Exception as e: + logger.error(f"连接Shows/Id/Episodes出错:" + str(e)) + return None + return {} + + def get_remote_image_by_id(self, item_id: str, image_type: str) -> Optional[str]: + """ + 根据ItemId从Emby查询TMDB的图片地址 + :param item_id: 在Emby中的ID + :param image_type: 图片的类弄地,poster或者backdrop等 + :return: 图片对应在TMDB中的URL + """ + if not self._host or not self._apikey: + return None + req_url = "%semby/Items/%s/RemoteImages?api_key=%s" % (self._host, item_id, self._apikey) + try: + res = RequestUtils().get_res(req_url) + if res: + images = res.json().get("Images") + for image in images: + if image.get("ProviderName") == "TheMovieDb" and image.get("Type") == image_type: + return image.get("Url") + else: + logger.error(f"Items/RemoteImages 未获取到返回数据") + return None + except Exception as e: + logger.error(f"连接Items/Id/RemoteImages出错:" + str(e)) + return None + return None + + def __refresh_emby_library_by_id(self, item_id: str) -> bool: + """ + 通知Emby刷新一个项目的媒体库 + """ + if not self._host or not self._apikey: + return False + req_url = "%semby/Items/%s/Refresh?Recursive=true&api_key=%s" % (self._host, item_id, self._apikey) + try: + res = RequestUtils().post_res(req_url) + if res: + return True + else: + logger.info(f"刷新媒体库对象 {item_id} 失败,无法连接Emby!") + except Exception as e: + logger.error(f"连接Items/Id/Refresh出错:" + str(e)) + return False + return False + + def refresh_root_library(self) -> bool: + """ + 通知Emby刷新整个媒体库 + """ + if not self._host or not self._apikey: + return False + req_url = "%semby/Library/Refresh?api_key=%s" % (self._host, self._apikey) + try: + res = RequestUtils().post_res(req_url) + if res: + return True + else: + logger.info(f"刷新媒体库失败,无法连接Emby!") + except Exception as e: + logger.error(f"连接Library/Refresh出错:" + str(e)) + return False + return False + + def refresh_library_by_items(self, items: List[dict]) -> bool: + """ + 按类型、名称、年份来刷新媒体库 + :param items: 已识别的需要刷新媒体库的媒体信息列表 + """ + if not items: + return False + # 收集要刷新的媒体库信息 + logger.info(f"开始刷新Emby媒体库...") + library_ids = [] + for item in items: + if not item: + continue + library_id = self.__get_emby_library_id_by_item(item) + if library_id and library_id not in library_ids: + library_ids.append(library_id) + # 开始刷新媒体库 + if "/" in library_ids: + return self.refresh_root_library() + for library_id in library_ids: + if library_id != "/": + return self.__refresh_emby_library_by_id(library_id) + logger.info(f"Emby媒体库刷新完成") + + def __get_emby_library_id_by_item(self, item: dict) -> Optional[str]: + """ + 根据媒体信息查询在哪个媒体库,返回要刷新的位置的ID + :param item: {title, year, type, category, target_path} + """ + if not item.get("title") or not item.get("year") or not item.get("type"): + return None + if item.get("type") != MediaType.MOVIE.value: + item_id = self.__get_emby_series_id_by_name(item.get("title"), item.get("year")) + if item_id: + # 存在电视剧,则直接刷新这个电视剧就行 + return item_id + else: + if self.get_movies(item.get("title"), item.get("year")): + # 已存在,不用刷新 + return None + # 查找需要刷新的媒体库ID + item_path = Path(item.get("target_path")) + for folder in self._folders: + # 找同级路径最多的媒体库(要求容器内映射路径与实际一致) + max_comm_path = "" + match_num = 0 + match_id = None + # 匹配子目录 + for subfolder in folder.get("SubFolders"): + try: + # 查询最大公共路径 + subfolder_path = Path(subfolder.get("Path")) + item_path_parents = list(item_path.parents) + subfolder_path_parents = list(subfolder_path.parents) + common_path = next(p1 for p1, p2 in zip(reversed(item_path_parents), + reversed(subfolder_path_parents) + ) if p1 == p2) + if len(common_path) > len(max_comm_path): + max_comm_path = common_path + match_id = subfolder.get("Id") + match_num += 1 + except StopIteration: + continue + except Exception as err: + print(str(err)) + # 检查匹配情况 + if match_id: + return match_id if match_num == 1 else folder.get("Id") + # 如果找不到,只要路径中有分类目录名就命中 + for subfolder in folder.get("SubFolders"): + if subfolder.get("Path") and re.search(r"[/\\]%s" % item.get("category"), + subfolder.get("Path")): + return folder.get("Id") + # 刷新根目录 + return "/" + + def get_iteminfo(self, itemid: str) -> dict: + """ + 获取单个项目详情 + """ + if not itemid: + return {} + if not self._host or not self._apikey: + return {} + req_url = "%semby/Users/%s/Items/%s?api_key=%s" % (self._host, self._user, itemid, self._apikey) + try: + res = RequestUtils().get_res(req_url) + if res and res.status_code == 200: + return res.json() + except Exception as e: + logger.error(f"连接Items/Id出错:" + str(e)) + return {} + + @staticmethod + def get_webhook_message(message: dict) -> dict: + """ + 解析Emby Webhook报文 + """ + eventItem = {'event': message.get('Event', '')} + if message.get('Item'): + if message.get('Item', {}).get('Type') == 'Episode': + eventItem['item_type'] = "TV" + eventItem['item_name'] = "%s %s%s %s" % ( + message.get('Item', {}).get('SeriesName'), + "S" + str(message.get('Item', {}).get('ParentIndexNumber')), + "E" + str(message.get('Item', {}).get('IndexNumber')), + message.get('Item', {}).get('Name')) + eventItem['item_id'] = message.get('Item', {}).get('SeriesId') + eventItem['season_id'] = message.get('Item', {}).get('ParentIndexNumber') + eventItem['episode_id'] = message.get('Item', {}).get('IndexNumber') + elif message.get('Item', {}).get('Type') == 'Audio': + eventItem['item_type'] = "AUD" + album = message.get('Item', {}).get('Album') + file_name = message.get('Item', {}).get('FileName') + eventItem['item_name'] = album + eventItem['overview'] = file_name + eventItem['item_id'] = message.get('Item', {}).get('AlbumId') + else: + eventItem['item_type'] = "MOV" + eventItem['item_name'] = "%s %s" % ( + message.get('Item', {}).get('Name'), "(" + str(message.get('Item', {}).get('ProductionYear')) + ")") + eventItem['item_path'] = message.get('Item', {}).get('Path') + eventItem['item_id'] = message.get('Item', {}).get('Id') + + eventItem['tmdb_id'] = message.get('Item', {}).get('ProviderIds', {}).get('Tmdb') + if message.get('Item', {}).get('Overview') and len(message.get('Item', {}).get('Overview')) > 100: + eventItem['overview'] = str(message.get('Item', {}).get('Overview'))[:100] + "..." + else: + eventItem['overview'] = message.get('Item', {}).get('Overview') + eventItem['percentage'] = message.get('TranscodingInfo', {}).get('CompletionPercentage') + if not eventItem['percentage']: + if message.get('PlaybackInfo', {}).get('PositionTicks'): + eventItem['percentage'] = message.get('PlaybackInfo', {}).get('PositionTicks') / \ + message.get('Item', {}).get('RunTimeTicks') * 100 + if message.get('Session'): + eventItem['ip'] = message.get('Session').get('RemoteEndPoint') + eventItem['device_name'] = message.get('Session').get('DeviceName') + eventItem['client'] = message.get('Session').get('Client') + if message.get("User"): + eventItem['user_name'] = message.get("User").get('Name') + + return eventItem diff --git a/app/modules/fanart/__init__.py b/app/modules/fanart/__init__.py new file mode 100644 index 00000000..9651da7f --- /dev/null +++ b/app/modules/fanart/__init__.py @@ -0,0 +1,74 @@ +import re +from functools import lru_cache +from typing import Optional, Tuple, Union + +from app.core import MediaInfo, settings +from app.log import logger +from app.modules import _ModuleBase +from app.utils.http import RequestUtils +from app.utils.types import MediaType + + +class FanartModule(_ModuleBase): + + # 代理 + _proxies: dict = settings.PROXY + + # Fanart Api + _movie_url: str = f'https://webservice.fanart.tv/v3/movies/%s?api_key={settings.FANART_API_KEY}' + _tv_url: str = f'https://webservice.fanart.tv/v3/tv/%s?api_key={settings.FANART_API_KEY}' + + def init_module(self) -> None: + pass + + def init_setting(self) -> Tuple[str, Union[str, bool]]: + return "FANART_API_KEY", True + + def obtain_image(self, mediainfo: MediaInfo) -> Optional[MediaInfo]: + """ + 获取图片 + :param mediainfo: 识别的媒体信息 + :return: 更新后的媒体信息,注意如果返回None,有可能是没有对应的处理模块,应无视结果 + """ + if mediainfo.type == MediaType.MOVIE: + result = self.__request_fanart(mediainfo.type, mediainfo.tmdb_id) + else: + result = self.__request_fanart(mediainfo.type, mediainfo.tvdb_id) + if not result or result.get('status') == 'error': + logger.warn(f"没有获取到 {mediainfo.get_title_string()} 的Fanart图片数据") + return + for name, images in result.items(): + if not images: + continue + if not isinstance(images, list): + continue + # 按欢迎程度倒排 + images.sort(key=lambda x: int(x.get('likes', 0)), reverse=True) + mediainfo.set_image(self.__name(name), images[0].get('url')) + + return mediainfo + + @staticmethod + def __name(fanart_name: str) -> str: + """ + 转换Fanart图片的名字 + """ + words_to_remove = r'tv|movie|hdmovie|hdtv' + pattern = re.compile(words_to_remove, re.IGNORECASE) + result = re.sub(pattern, '', fanart_name) + return result + + @classmethod + @lru_cache(maxsize=256) + def __request_fanart(cls, media_type: MediaType, queryid: str) -> Optional[dict]: + if media_type == MediaType.MOVIE: + image_url = cls._movie_url % queryid + else: + image_url = cls._tv_url % queryid + try: + ret = RequestUtils(proxies=cls._proxies, timeout=5).get_res(image_url) + if ret: + return ret.json() + except Exception as err: + logger.error(f"获取{queryid}的Fanart图片失败:{err}") + return None diff --git a/app/modules/fanart/__pycache__/__init__.cpython-310.pyc b/app/modules/fanart/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fa339b61c72195cef62f7be257c28b15ff612657 GIT binary patch literal 3180 zcmahLYj0df_0E0l+q>&W92-bwRqclrs!b_EC`#R?!7UMrVB$-Jod{l}zX0f8xH$aTuy_`RXu(7cN6!##E3_ipwIj!M zqLiD`I6F*788;JU-K<_aVJ^zMc@3w+Le%5-XgD1fqmo2ftUNC5u<~9tP zV?FDZ+egVoqmsW58W@umqOu`xcvZi;z$%u?oUh9uuKA&IrW^H;Dd$oR))iA_&oLVK zXKQn@$_OT9P@5OPoeJamdBy?Cd*@=>2-$PKV6ZG)VAmQ<$V)N^kuc$(Uahk#o_zSr z!s1yN;vX6xayXnJweC>1J6Da2DX~16*F?9Ka3H49#xX zZh@v)4`7QhN^|D0kqnxndDtz}0_z2eKGq96HtnHB!1l8NT4FiC=Kxoxy&LvAagVV< zcAWOn{!Ky$*bqIYDf(CnI8$_x9!Dym8>VTn?64|4@7H`T6LYAHSLg9cz(n)w3sTm_ z$+59zHY*rk3aV^$PLqzxrLm=_#-ex$=*Auw&-nGgyUJFdRyj{2y#^1PqhG`iQV#Q` zJ-LL8D#e*>@Y-aRfPwcvgmIjKAuuqh0os$v_l@_7vIPt0crRe}^q=pXIXQC)bQUv< zD=YI0GgGV81)oP#JYHl~DQ3>0=2Jl!%Nf63pNVuNh?(SeGoBaJ0_l09^;MPEU_x*V zvWQec%2SlH~v_RY6PN z3*sRp7=)=g{CN%bXjC@B;13}9tEle&=Kzp~p-p%PfEHOaBv~}Cn!MC9wk=%4u-oRE zS<4*4IEZPPe57S=rzmL?iabxq^mc{<*LJpTY(aS6w%P=e*|}%{U9N3>+xWp_Gv=DL zX18qdt!q!pe9M-FbyJLAd$MIO_RthfL!v_hY(g;sIYl_L)B-6jo92cMI4j>KZP){P zv|OR_Pf$BIviI%2^5@Qt*E?H(zxVP_4v;77KKG-M0~4Ga8QI;r-g)Ua_uky-eDJeR z?!NlT$L;Qqb{;S!;dXMQyY*rB^*f!LuN!nV`q2$ZugCy?jPH@-1$rAudktqcQ)?byxx7U-MM`WC;{2MwY~f9^?QGN z6{H*-uTnz#vLTeiIFEUw3^z<9?OpGsJ0lJB_z1{Me4gC6`|~^9&EJ1MOVG_1VF;8Y z4KOL8;IOv2jwZAwT_+5#GQlyMAP}vfCY3eMBvd`J@*s)04!+E((2r)RKR${QF`CLo z^Q#YqUOX!y*1RC{=h^6~Fs}Nc7zZHXo5mxcHmEdbOOTOFpQ|iL^h#OT5-KdugIML9 zJO9126Y7L_Sh(l$q%M1Ny7H*BjOeTvPym)Rz)t`(&!7Z*+2=J?hO2lokRkJgbl?y~r16$XsOxa-|B$SPqOO=JRNwin}M-H#~5vw@7ACDNuBcL>iMhKj^qf+|L z;;79Ehb{7DU=v?~sgUX;WwVbA5}TA^m?Q_I&wPZ~=8-GX@${Jmzv%4(U^Y#D89&1zZb|HczQdJuiPcYoX6{AFVDB&;xUZ*F#e zck6(rc}y;~bX{*P(EWe8q>PHKOwLrg8b|d2Ufi}qT5vXVR7MQJN4jOA#%>fuphj4R1 z+OTpki8i7BVSU1i#vg6j+v&D(8M5uNevWKIW>%jg#+pNnW}nP%=b$>8SQ%Rmv;sC( z$IHeQpj~rbbnpR7pk=abRGi8C=uJqM^xg{$F&;!LZpa4eoK%AbJ^)7wLFb)6?0)#G zPd|FIlGmxkF&KCerxH$hTiyecN@H$72rGM0#5I+jSgA7ILFokI7^{_(vZ|rrzCPrQmHJcQ%8K}mX9Xt)4-|2K4%q3&NRsYcn|{qzqVccYy{xU56#b-CysdZ z;bgCv981__L3=8wy*Z)&s3G(94WgW6ro%TH7OyIB0scgWWu?_PQO8eXJ@X wrh!ebZr60IsL}%@=8;G)ggXDf3#rVhMC3TWC<0rUj8OoGm(2o6egoG30P^;X9RL6T literal 0 HcmV?d00001 diff --git a/app/modules/filetransfer/__init__.py b/app/modules/filetransfer/__init__.py new file mode 100644 index 00000000..11c912da --- /dev/null +++ b/app/modules/filetransfer/__init__.py @@ -0,0 +1,22 @@ +from typing import Optional, Tuple, Union + +from app.core import MediaInfo +from app.modules import _ModuleBase + + +class FileTransferModule(_ModuleBase): + + def init_module(self) -> None: + pass + + def init_setting(self) -> Tuple[str, Union[str, bool]]: + return "TRANSFER_TYPE", True + + def transfer(self, path: str, mediainfo: MediaInfo) -> Optional[bool]: + """ + TODO 文件转移 + :param path: 文件路径 + :param mediainfo: 识别的媒体信息 + :return: 成功或失败 + """ + pass diff --git a/app/modules/filetransfer/__pycache__/__init__.cpython-310.pyc b/app/modules/filetransfer/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..efc78eee5cf6a4bc35998fbcc86d652c578640bf GIT binary patch literal 1183 zcmZ`&&1=*^6rX%;vR{g|7ZK}T_tHOL5vkTzJTzU}?ZFTTac8zoNj7nkm9_^#T(o!+ zg(6-=P^2mpLG)0n|HoYIZtJ->PrjGzZi}`L-phM4znS;(n}p?Zfq-1`9?~h9kY5;_ z6cvIg&=?IRRPsq6SyCWda-dj>gln>|2AZX%zT)Qs-O?p;n^2W%T|zacKUOS*<`zj+ z{|&d0sv?Z}DDlF!>kF;XiF_usr8dM>N#y4k_1rt{RtQ1SnG0#hXE)uLHSy?4(IJ=u zjZH9&SP~_cOp8>ZYFD)sDlwI5EC;H$b)@Z`32n3&|p?Rj^? None: + pass + + def init_setting(self) -> Tuple[str, Union[str, bool]]: + return "FILTER_RULE", True + + def filter_torrents(self, torrent_list: List[TorrentInfo]) -> List[TorrentInfo]: + """ + TODO 过滤资源 + :param torrent_list: 资源列表 + :return: 过滤后的资源列表,注意如果返回None,有可能是没有对应的处理模块,应无视结果 + """ + pass diff --git a/app/modules/filter/__pycache__/__init__.cpython-310.pyc b/app/modules/filter/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ed8a5f44231b2b0e8b42dc13acb615329e993e9f GIT binary patch literal 1208 zcmZ`&OHUL*5bk;IYmlfMBvG>0x$pysF+>CcfUemOF%=Q| z&W%oz!59P%xWEVt4sr!Ua79COB|{SUndr!_Vkn6&IjWm6G6K4du#A-^!V1YONk$f{ zcafg?0a=hPF?q}mLZ*}(b%!uz+OvI67g(X}Q%byW)T{a2w8nkhaLCO{K&t#=C#hfz z0tY1!1Q`NGhKTc6!g5nKBrFh_C`1L$)WlwtGFGq(-Ym|L9Le{>bJA~3##x*LPXUWi zW`SuVwi6PX;xmkF)q zsA)hJ@*l(0kSr`->8!ZFBj~?HA16f%P_$UmMOGLY9V-t{SyR(v!{xMez8Ytbpc+!NyZNegK=7`oW_2A_PfP34JO6UEly zJ?gXi=C+lip4Z2da~Zy+BpkNr#H|}6sY-g6TLQtPAf%L!pUL-p-=P<|ha*yji_2V`E^n&w z;nNHV&H;zbqP);2^-0NTNzXAgT&TlRq=`6A3Xz44?yvfkB*~2eH`@zN`Cpve{}&v~ TUQgq0@Fhtwdypn-LXY$tUoTH; literal 0 HcmV?d00001 diff --git a/app/modules/indexer/__init__.py b/app/modules/indexer/__init__.py new file mode 100644 index 00000000..e9e426d6 --- /dev/null +++ b/app/modules/indexer/__init__.py @@ -0,0 +1,154 @@ +import time +from concurrent.futures import ThreadPoolExecutor, as_completed +from datetime import datetime +from typing import List, Optional, Tuple, Union + +from app.core import MediaInfo, TorrentInfo, settings +from app.log import logger +from app.modules import _ModuleBase +from app.modules.indexer.spider import TorrentSpider +from app.modules.indexer.tnode import TNodeSpider +from app.modules.indexer.torrentleech import TorrentLeech +from app.utils.types import MediaType + + +class IndexerModule(_ModuleBase): + """ + 索引模块 + """ + + def init_module(self) -> None: + pass + + def init_setting(self) -> Tuple[str, Union[str, bool]]: + return "INDEXER", "builtin" + + def search_torrents(self, mediainfo: Optional[MediaInfo], sites: List[dict], + keyword: str = None) -> Optional[List[TorrentInfo]]: + """ + 搜索站点,多个站点需要多线程处理 + :param mediainfo: 识别的媒体信息 + :param sites: 站点列表 + :param keyword: 搜索关键词,如有按关键词搜索,否则按媒体信息名称搜索 + :reutrn: 资源列表 + """ + # 开始计时 + start_time = datetime.now() + # 多线程 + executor = ThreadPoolExecutor(max_workers=len(sites)) + all_task = [] + for site in sites: + task = executor.submit(self.__search, mediainfo=mediainfo, + site=site, keyword=keyword) + all_task.append(task) + results = [] + finish_count = 0 + for future in as_completed(all_task): + finish_count += 1 + result = future.result() + if result: + results += result + # 计算耗时 + end_time = datetime.now() + logger.info(f"所有站点搜索完成,有效资源数:{len(results)},总耗时 {(end_time - start_time).seconds} 秒") + # 返回 + return results + + def __search(self, mediainfo: MediaInfo, site: dict, + keyword: str = None) -> Optional[List[TorrentInfo]]: + """ + 搜索一个站点 + :param mediainfo: 识别的媒体信息 + :param site: 站点 + :param keyword: 搜索关键词,如有按关键词搜索,否则按媒体信息名称搜索 + :return: 资源列表 + """ + # 确认搜索的名字 + if keyword: + search_word = keyword + elif mediainfo: + search_word = mediainfo.title + else: + search_word = None + # 开始索引 + result_array = [] + # 开始计时 + start_time = datetime.now() + try: + if site.get('parser') == "TNodeSpider": + error_flag, result_array = TNodeSpider(site).search(keyword=search_word) + elif site.get('parser') == "TorrentLeech": + error_flag, result_array = TorrentLeech(site).search(keyword=search_word) + else: + error_flag, result_array = self.__spider_search( + keyword=search_word, + indexer=site, + mtype=mediainfo.type + ) + except Exception as err: + error_flag = True + print(str(err)) + + # 索引花费的时间 + seconds = round((datetime.now() - start_time).seconds, 1) + if error_flag: + logger.error(f"{site.get('name')} 搜索发生错误,耗时 {seconds} 秒") + else: + logger.info(f"{site.get('name')} 搜索完成,耗时 {seconds} 秒") + # 返回结果 + if len(result_array) == 0: + logger.warn(f"{site.get('name')} 未搜索到数据") + return [] + else: + logger.warn(f"{site.get('name')} 返回数据:{len(result_array)}") + # 合并站点信息,以TorrentInfo返回 + return [TorrentInfo(site=site.get("id"), + site_name=site.get("name"), + site_cookie=site.get("cookie"), + site_ua=site.get("ua"), + site_proxy=site.get("proxy"), + site_order=site.get("order"), + **result) for result in result_array] + + @staticmethod + def __spider_search(indexer: dict, + keyword: str = None, + mtype: MediaType = None, + page: int = None, timeout: int = 30) -> (bool, List[dict]): + """ + 根据关键字搜索单个站点 + :param: indexer: 站点配置 + :param: keyword: 关键字 + :param: page: 页码 + :param: mtype: 媒体类型 + :param: timeout: 超时时间 + :return: 是否发生错误, 种子列表 + """ + _spider = TorrentSpider() + _spider.setparam(indexer=indexer, + mtype=mtype, + keyword=keyword, + page=page) + _spider.start() + # 循环判断是否获取到数据 + sleep_count = 0 + while not _spider.is_complete: + sleep_count += 1 + time.sleep(1) + if sleep_count > timeout: + break + # 是否发生错误 + result_flag = _spider.is_error + # 种子列表 + result_array = _spider.torrents_info_array.copy() + # 重置状态 + _spider.torrents_info_array.clear() + return result_flag, result_array + + def refresh_torrents(self, sites: List[dict]) -> Optional[List[TorrentInfo]]: + """ + 获取站点最新一页的种子,多个站点需要多线程处理 + :param sites: 站点列表 + :reutrn: 种子资源列表 + """ + return self.search_torrents(mediainfo=None, sites=sites, keyword=None) diff --git a/app/modules/indexer/__pycache__/__init__.cpython-310.pyc b/app/modules/indexer/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9e5db99dac45367fe617f7a83049a10a77faf3ea GIT binary patch literal 5182 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 O>><6f4d2#ZukvqKrZQmw literal 0 HcmV?d00001 diff --git a/app/modules/indexer/__pycache__/spider.cpython-310.pyc b/app/modules/indexer/__pycache__/spider.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..22849108dfd096448f485a2710286fe5d6690c34 GIT binary patch literal 14971 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 literal 0 HcmV?d00001 diff --git a/app/modules/indexer/__pycache__/tnode.cpython-310.pyc b/app/modules/indexer/__pycache__/tnode.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a1ef955ddfd771db16dafac5397f5151c9978b14 GIT binary patch literal 3305 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 literal 0 HcmV?d00001 diff --git a/app/modules/indexer/spider.py b/app/modules/indexer/spider.py new file mode 100644 index 00000000..26e7be8d --- /dev/null +++ b/app/modules/indexer/spider.py @@ -0,0 +1,640 @@ +import copy +import datetime +import re +from urllib.parse import quote + +import feapder +from feapder.utils.tools import urlencode +from jinja2 import Template +from pyquery import PyQuery + +from app.core import settings +from app.log import logger +from app.utils.http import RequestUtils +from app.utils.string import StringUtils +from app.utils.types import MediaType + + +class TorrentSpider(feapder.AirSpider): + __custom_setting__ = dict( + SPIDER_THREAD_COUNT=1, + SPIDER_MAX_RETRY_TIMES=0, + REQUEST_LOST_TIMEOUT=10, + RETRY_FAILED_REQUESTS=False, + LOG_LEVEL="ERROR", + RANDOM_HEADERS=False, + WEBDRIVER=dict( + pool_size=1, + load_images=False, + proxy=None, + headless=True, + driver_type="CHROME", + timeout=20, + window_size=(1024, 800), + executable_path=None, + render_time=10, + custom_argument=["--ignore-certificate-errors"], + ) + ) + # 是否搜索完成标志 + is_complete: bool = False + # 是否出现错误 + is_error: bool = False + # 索引器ID + indexerid: int = None + # 索引器名称 + indexername: str = None + # 站点域名 + domain: str = None + # 站点Cookie + cookie: str = None + # 站点UA + ua: str = None + # 代理 + proxies: bool = None + # 是否渲染 + render: bool = False + # Referer + referer: str = None + # 搜索关键字 + keyword: str = None + # 媒体类型 + mtype: MediaType = None + # 搜索路径、方式配置 + search: dict = {} + # 批量搜索配置 + batch: dict = {} + # 浏览配置 + browse: dict = {} + # 站点分类配置 + category: dict = {} + # 站点种子列表配置 + list: dict = {} + # 站点种子字段配置 + fields: dict = {} + # 页码 + page: int = 0 + # 搜索条数 + result_num: int = 100 + # 单个种子信息 + torrents_info: dict = {} + # 种子列表 + torrents_info_array: list = [] + + def setparam(self, indexer, + keyword: [str, list] = None, + page=None, + referer=None, + mtype: MediaType = None): + """ + 设置查询参数 + :param indexer: 索引器 + :param keyword: 搜索关键字,如果数组则为批量搜索 + :param page: 页码 + :param referer: Referer + :param mtype: 媒体类型 + """ + if not indexer: + return + self.keyword = keyword + self.mtype = mtype + self.indexerid = indexer.get('id') + self.indexername = indexer.get('name') + self.search = indexer.get('search') + self.batch = indexer.get('batch') + self.browse = indexer.get('browse') + self.category = indexer.get('category') + self.list = indexer.get('torrents').get('list', {}) + self.fields = indexer.get('torrents').get('fields') + self.render = indexer.get('render') + self.domain = indexer.get('domain') + self.page = page + if self.domain and not str(self.domain).endswith("/"): + self.domain = self.domain + "/" + if indexer.get('ua'): + self.ua = indexer.get('ua') + else: + self.ua = settings.USER_AGENT + if indexer.get('proxy'): + self.proxies = settings.PROXY + if indexer.get('cookie'): + self.cookie = indexer.get('cookie') + if referer: + self.referer = referer + self.torrents_info_array = [] + + def start_requests(self): + """ + 开始请求 + """ + + if not self.search or not self.domain: + self.is_complete = True + return + + # 种子搜索相对路径 + paths = self.search.get('paths', []) + torrentspath = "" + if len(paths) == 1: + torrentspath = paths[0].get('path', '') + else: + for path in paths: + if path.get("type") == "all" and not self.mtype: + torrentspath = path.get('path') + break + elif path.get("type") == "movie" and self.mtype == MediaType.MOVIE: + torrentspath = path.get('path') + break + elif path.get("type") == "tv" and self.mtype == MediaType.TV: + torrentspath = path.get('path') + break + + # 关键字搜索 + if self.keyword: + + if isinstance(self.keyword, list): + # 批量查询 + if self.batch: + delimiter = self.batch.get('delimiter') or ' ' + space_replace = self.batch.get('space_replace') or ' ' + search_word = delimiter.join([str(k).replace(' ', space_replace) for k in self.keyword]) + else: + search_word = " ".join(self.keyword) + # 查询模式:或 + search_mode = "1" + else: + # 单个查询 + search_word = self.keyword + # 查询模式与 + search_mode = "0" + + # 搜索URL + if self.search.get("params"): + # 变量字典 + inputs_dict = { + "keyword": search_word + } + # 查询参数 + params = { + "search_mode": search_mode, + "page": self.page or 0, + "notnewword": 1 + } + # 额外参数 + for key, value in self.search.get("params").items(): + params.update({ + "%s" % key: str(value).format(**inputs_dict) + }) + # 分类条件 + if self.category: + if self.mtype == MediaType.MOVIE: + cats = self.category.get("movie") or [] + elif self.mtype: + cats = self.category.get("tv") or [] + else: + cats = (self.category.get("movie") or []) + (self.category.get("tv") or []) + for cat in cats: + if self.category.get("field"): + value = params.get(self.category.get("field"), "") + params.update({ + "%s" % self.category.get("field"): value + self.category.get("delimiter", + ' ') + cat.get("id") + }) + else: + params.update({ + "cat%s" % cat.get("id"): 1 + }) + searchurl = self.domain + torrentspath + "?" + urlencode(params) + else: + # 变量字典 + inputs_dict = { + "keyword": quote(search_word), + "page": self.page or 0 + } + # 无额外参数 + searchurl = self.domain + str(torrentspath).format(**inputs_dict) + + # 列表浏览 + else: + # 变量字典 + inputs_dict = { + "page": self.page or 0, + "keyword": "" + } + # 有单独浏览路径 + if self.browse: + torrentspath = self.browse.get("path") + if self.browse.get("start"): + start_page = int(self.browse.get("start")) + int(self.page or 0) + inputs_dict.update({ + "page": start_page + }) + elif self.page: + torrentspath = torrentspath + f"?page={self.page}" + # 搜索Url + searchurl = self.domain + str(torrentspath).format(**inputs_dict) + + logger.info(f"开始请求:{searchurl}") + yield feapder.Request(url=searchurl, + use_session=True, + render=self.render) + + def download_midware(self, request): + request.headers = { + "User-Agent": self.ua + } + request.cookies = RequestUtils.cookie_parse(self.cookie) + if self.proxies: + request.proxies = self.proxies + return request + + def Gettitle_default(self, torrent): + # title default + if 'title' not in self.fields: + return + selector = self.fields.get('title', {}) + if 'selector' in selector: + title = torrent(selector.get('selector', '')).clone() + self.__remove(title, selector) + items = self.__attribute_or_text(title, selector) + self.torrents_info['title'] = self.__index(items, selector) + elif 'text' in selector: + render_dict = {} + if "title_default" in self.fields: + title_default_selector = self.fields.get('title_default', {}) + title_default_item = torrent(title_default_selector.get('selector', '')).clone() + self.__remove(title_default_item, title_default_selector) + items = self.__attribute_or_text(title_default_item, selector) + title_default = self.__index(items, title_default_selector) + render_dict.update({'title_default': title_default}) + if "title_optional" in self.fields: + title_optional_selector = self.fields.get('title_optional', {}) + title_optional_item = torrent(title_optional_selector.get('selector', '')).clone() + self.__remove(title_optional_item, title_optional_selector) + items = self.__attribute_or_text(title_optional_item, title_optional_selector) + title_optional = self.__index(items, title_optional_selector) + render_dict.update({'title_optional': title_optional}) + self.torrents_info['title'] = Template(selector.get('text')).render(fields=render_dict) + self.torrents_info['title'] = self.__filter_text(self.torrents_info.get('title'), + selector.get('filters')) + + def Gettitle_optional(self, torrent): + # title optional + if 'description' not in self.fields: + return + selector = self.fields.get('description', {}) + if "selector" in selector \ + or "selectors" in selector: + description = torrent(selector.get('selector', selector.get('selectors', ''))).clone() + if description: + self.__remove(description, selector) + items = self.__attribute_or_text(description, selector) + self.torrents_info['description'] = self.__index(items, selector) + elif "text" in selector: + render_dict = {} + if "tags" in self.fields: + tags_selector = self.fields.get('tags', {}) + tags_item = torrent(tags_selector.get('selector', '')).clone() + self.__remove(tags_item, tags_selector) + items = self.__attribute_or_text(tags_item, tags_selector) + tag = self.__index(items, tags_selector) + render_dict.update({'tags': tag}) + if "subject" in self.fields: + subject_selector = self.fields.get('subject', {}) + subject_item = torrent(subject_selector.get('selector', '')).clone() + self.__remove(subject_item, subject_selector) + items = self.__attribute_or_text(subject_item, subject_selector) + subject = self.__index(items, subject_selector) + render_dict.update({'subject': subject}) + if "description_free_forever" in self.fields: + description_free_forever_selector = self.fields.get("description_free_forever", {}) + description_free_forever_item = torrent(description_free_forever_selector.get("selector", '')).clone() + self.__remove(description_free_forever_item, description_free_forever_selector) + items = self.__attribute_or_text(description_free_forever_item, description_free_forever_selector) + description_free_forever = self.__index(items, description_free_forever_selector) + render_dict.update({"description_free_forever": description_free_forever}) + if "description_normal" in self.fields: + description_normal_selector = self.fields.get("description_normal", {}) + description_normal_item = torrent(description_normal_selector.get("selector", '')).clone() + self.__remove(description_normal_item, description_normal_selector) + items = self.__attribute_or_text(description_normal_item, description_normal_selector) + description_normal = self.__index(items, description_normal_selector) + render_dict.update({"description_normal": description_normal}) + self.torrents_info['description'] = Template(selector.get('text')).render(fields=render_dict) + self.torrents_info['description'] = self.__filter_text(self.torrents_info.get('description'), + selector.get('filters')) + + def Getdetails(self, torrent): + # details + if 'details' not in self.fields: + return + selector = self.fields.get('details', {}) + details = torrent(selector.get('selector', '')).clone() + self.__remove(details, selector) + items = self.__attribute_or_text(details, selector) + item = self.__index(items, selector) + detail_link = self.__filter_text(item, selector.get('filters')) + if detail_link: + if not detail_link.startswith("http"): + if detail_link.startswith("//"): + self.torrents_info['page_url'] = self.domain.split(":")[0] + ":" + detail_link + elif detail_link.startswith("/"): + self.torrents_info['page_url'] = self.domain + detail_link[1:] + else: + self.torrents_info['page_url'] = self.domain + detail_link + else: + self.torrents_info['page_url'] = detail_link + + def Getdownload(self, torrent): + # download link + if 'download' not in self.fields: + return + selector = self.fields.get('download', {}) + download = torrent(selector.get('selector', '')).clone() + self.__remove(download, selector) + items = self.__attribute_or_text(download, selector) + item = self.__index(items, selector) + download_link = self.__filter_text(item, selector.get('filters')) + if download_link: + if not download_link.startswith("http") and not download_link.startswith("magnet"): + self.torrents_info['enclosure'] = self.domain + download_link[1:] if download_link.startswith( + "/") else self.domain + download_link + else: + self.torrents_info['enclosure'] = download_link + + def Getimdbid(self, torrent): + # imdbid + if "imdbid" not in self.fields: + return + selector = self.fields.get('imdbid', {}) + imdbid = torrent(selector.get('selector', '')).clone() + self.__remove(imdbid, selector) + items = self.__attribute_or_text(imdbid, selector) + item = self.__index(items, selector) + self.torrents_info['imdbid'] = item + self.torrents_info['imdbid'] = self.__filter_text(self.torrents_info.get('imdbid'), + selector.get('filters')) + + def Getsize(self, torrent): + # torrent size + if 'size' not in self.fields: + return + selector = self.fields.get('size', {}) + size = torrent(selector.get('selector', selector.get("selectors", ''))).clone() + self.__remove(size, selector) + items = self.__attribute_or_text(size, selector) + item = self.__index(items, selector) + if item: + self.torrents_info['size'] = StringUtils.num_filesize(item.replace("\n", "").strip()) + self.torrents_info['size'] = self.__filter_text(self.torrents_info.get('size'), + selector.get('filters')) + self.torrents_info['size'] = StringUtils.num_filesize(self.torrents_info.get('size')) + + def Getleechers(self, torrent): + # torrent leechers + if 'leechers' not in self.fields: + return + selector = self.fields.get('leechers', {}) + leechers = torrent(selector.get('selector', '')).clone() + self.__remove(leechers, selector) + items = self.__attribute_or_text(leechers, selector) + item = self.__index(items, selector) + if item: + self.torrents_info['peers'] = item.split("/")[0] + self.torrents_info['peers'] = self.__filter_text(self.torrents_info.get('peers'), + selector.get('filters')) + else: + self.torrents_info['peers'] = 0 + + def Getseeders(self, torrent): + # torrent leechers + if 'seeders' not in self.fields: + return + selector = self.fields.get('seeders', {}) + seeders = torrent(selector.get('selector', '')).clone() + self.__remove(seeders, selector) + items = self.__attribute_or_text(seeders, selector) + item = self.__index(items, selector) + if item: + self.torrents_info['seeders'] = item.split("/")[0] + self.torrents_info['seeders'] = self.__filter_text(self.torrents_info.get('seeders'), + selector.get('filters')) + else: + self.torrents_info['seeders'] = 0 + + def Getgrabs(self, torrent): + # torrent grabs + if 'grabs' not in self.fields: + return + selector = self.fields.get('grabs', {}) + grabs = torrent(selector.get('selector', '')).clone() + self.__remove(grabs, selector) + items = self.__attribute_or_text(grabs, selector) + item = self.__index(items, selector) + if item: + self.torrents_info['grabs'] = item.split("/")[0] + self.torrents_info['grabs'] = self.__filter_text(self.torrents_info.get('grabs'), + selector.get('filters')) + else: + self.torrents_info['grabs'] = 0 + + def Getpubdate(self, torrent): + # torrent pubdate + if 'date_added' not in self.fields: + return + selector = self.fields.get('date_added', {}) + pubdate = torrent(selector.get('selector', '')).clone() + self.__remove(pubdate, selector) + items = self.__attribute_or_text(pubdate, selector) + self.torrents_info['pubdate'] = self.__index(items, selector) + self.torrents_info['pubdate'] = self.__filter_text(self.torrents_info.get('pubdate'), + selector.get('filters')) + + def Getelapsed_date(self, torrent): + # torrent pubdate + if 'date_elapsed' not in self.fields: + return + selector = self.fields.get('date_elapsed', {}) + date_elapsed = torrent(selector.get('selector', '')).clone() + self.__remove(date_elapsed, selector) + items = self.__attribute_or_text(date_elapsed, selector) + self.torrents_info['date_elapsed'] = self.__index(items, selector) + self.torrents_info['date_elapsed'] = self.__filter_text(self.torrents_info.get('date_elapsed'), + selector.get('filters')) + + def Getdownloadvolumefactor(self, torrent): + # downloadvolumefactor + selector = self.fields.get('downloadvolumefactor', {}) + if not selector: + return + self.torrents_info['downloadvolumefactor'] = 1 + if 'case' in selector: + for downloadvolumefactorselector in list(selector.get('case', {}).keys()): + downloadvolumefactor = torrent(downloadvolumefactorselector) + if len(downloadvolumefactor) > 0: + self.torrents_info['downloadvolumefactor'] = selector.get('case', {}).get( + downloadvolumefactorselector) + break + elif "selector" in selector: + downloadvolume = torrent(selector.get('selector', '')).clone() + self.__remove(downloadvolume, selector) + items = self.__attribute_or_text(downloadvolume, selector) + item = self.__index(items, selector) + if item: + downloadvolumefactor = re.search(r'(\d+\.?\d*)', item) + if downloadvolumefactor: + self.torrents_info['downloadvolumefactor'] = int(downloadvolumefactor.group(1)) + + def Getuploadvolumefactor(self, torrent): + # uploadvolumefactor + selector = self.fields.get('uploadvolumefactor', {}) + if not selector: + return + self.torrents_info['uploadvolumefactor'] = 1 + if 'case' in selector: + for uploadvolumefactorselector in list(selector.get('case', {}).keys()): + uploadvolumefactor = torrent(uploadvolumefactorselector) + if len(uploadvolumefactor) > 0: + self.torrents_info['uploadvolumefactor'] = selector.get('case', {}).get( + uploadvolumefactorselector) + break + elif "selector" in selector: + uploadvolume = torrent(selector.get('selector', '')).clone() + self.__remove(uploadvolume, selector) + items = self.__attribute_or_text(uploadvolume, selector) + item = self.__index(items, selector) + if item: + uploadvolumefactor = re.search(r'(\d+\.?\d*)', item) + if uploadvolumefactor: + self.torrents_info['uploadvolumefactor'] = int(uploadvolumefactor.group(1)) + + def Getlabels(self, torrent): + # labels + if 'labels' not in self.fields: + return + selector = self.fields.get('labels', {}) + labels = torrent(selector.get("selector", "")).clone() + self.__remove(labels, selector) + items = self.__attribute_or_text(labels, selector) + if items: + self.torrents_info['labels'] = items + + def Getinfo(self, torrent): + """ + 解析单条种子数据 + """ + self.torrents_info = {'indexer': self.indexerid} + try: + self.Gettitle_default(torrent) + self.Gettitle_optional(torrent) + self.Getdetails(torrent) + self.Getdownload(torrent) + self.Getgrabs(torrent) + self.Getleechers(torrent) + self.Getseeders(torrent) + self.Getsize(torrent) + self.Getimdbid(torrent) + self.Getdownloadvolumefactor(torrent) + self.Getuploadvolumefactor(torrent) + self.Getpubdate(torrent) + self.Getelapsed_date(torrent) + self.Getlabels(torrent) + except Exception as err: + logger.error("%s 搜索出现错误:%s" % (self.indexername, str(err))) + return self.torrents_info + + @staticmethod + def __filter_text(text, filters): + """ + 对文件进行处理 + """ + if not text or not filters or not isinstance(filters, list): + return text + if not isinstance(text, str): + text = str(text) + for filter_item in filters: + if not text: + break + try: + method_name = filter_item.get("name") + args = filter_item.get("args") + if method_name == "re_search" and isinstance(args, list): + text = re.search(r"%s" % args[0], text).group(args[-1]) + elif method_name == "split" and isinstance(args, list): + text = text.split(r"%s" % args[0])[args[-1]] + elif method_name == "replace" and isinstance(args, list): + text = text.replace(r"%s" % args[0], r"%s" % args[-1]) + elif method_name == "dateparse" and isinstance(args, str): + text = datetime.datetime.strptime(text, r"%s" % args) + elif method_name == "strip": + text = text.strip() + elif method_name == "appendleft": + text = f"{args}{text}" + except Exception as err: + print(str(err)) + return text.strip() + + @staticmethod + def __remove(item, selector): + """ + 移除元素 + """ + if selector and "remove" in selector: + removelist = selector.get('remove', '').split(', ') + for v in removelist: + item.remove(v) + + @staticmethod + def __attribute_or_text(item, selector): + if not selector: + return item + if not item: + return [] + if 'attribute' in selector: + items = [i.attr(selector.get('attribute')) for i in item.items() if i] + else: + items = [i.text() for i in item.items() if i] + return items + + @staticmethod + def __index(items, selector): + if not selector: + return items + if not items: + return items + if "contents" in selector \ + and len(items) > int(selector.get("contents")): + items = items[0].split("\n")[selector.get("contents")] + elif "index" in selector \ + and len(items) > int(selector.get("index")): + items = items[int(selector.get("index"))] + elif isinstance(items, list): + items = items[0] + return items + + def parse(self, request, response): + """ + 解析整个页面 + """ + try: + # 获取站点文本 + html_text = response.extract() + if not html_text: + self.is_error = True + self.is_complete = True + return + # 解析站点文本对象 + html_doc = PyQuery(html_text) + # 种子筛选器 + torrents_selector = self.list.get('selector', '') + # 遍历种子html列表 + for torn in html_doc(torrents_selector): + self.torrents_info_array.append(copy.deepcopy(self.Getinfo(PyQuery(torn)))) + if len(self.torrents_info_array) >= int(self.result_num): + break + + except Exception as err: + self.is_error = True + logger.warn(f"错误:{self.indexername} {err}") + finally: + self.is_complete = True diff --git a/app/modules/indexer/tnode.py b/app/modules/indexer/tnode.py new file mode 100644 index 00000000..714430fe --- /dev/null +++ b/app/modules/indexer/tnode.py @@ -0,0 +1,105 @@ +import re +from typing import Tuple, List + +from app.core import settings +from app.log import logger +from app.utils.http import RequestUtils +from app.utils.string import StringUtils + + +class TNodeSpider: + _indexerid = None + _domain = None + _name = "" + _proxy = None + _cookie = None + _ua = None + _token = None + _size = 100 + _searchurl = "%sapi/torrent/advancedSearch" + _downloadurl = "%sapi/torrent/download/%s" + _pageurl = "%storrent/info/%s" + + def __init__(self, indexer: dict): + if indexer: + self._indexerid = indexer.get('id') + self._domain = indexer.get('domain') + self._searchurl = self._searchurl % self._domain + self._name = indexer.get('name') + if indexer.get('proxy'): + self._proxy = settings.PROXY + self._cookie = indexer.get('cookie') + self._ua = indexer.get('ua') + self.init_config() + + def init_config(self): + self.__get_token() + + def __get_token(self): + if not self._domain: + return + res = RequestUtils(ua=self._ua, + cookies=self._cookie, + proxies=self._proxy, + timeout=15).get_res(url=self._domain) + if res and res.status_code == 200: + csrf_token = re.search(r'', res.text) + if csrf_token: + self._token = csrf_token.group(1) + + def search(self, keyword: str, page: int = 0) -> Tuple[bool, List[dict]]: + if not self._token: + logger.warn(f"{self._name} 未获取到token,无法搜索") + return True, [] + params = { + "page": int(page) + 1, + "size": self._size, + "type": "title", + "keyword": keyword or "", + "sorter": "id", + "order": "desc", + "tags": [], + "category": [501, 502, 503, 504], + "medium": [], + "videoCoding": [], + "audioCoding": [], + "resolution": [], + "group": [] + } + res = RequestUtils( + headers={ + 'X-CSRF-TOKEN': self._token, + "Content-Type": "application/json; charset=utf-8", + "User-Agent": f"{self._ua}" + }, + cookies=self._cookie, + proxies=self._proxy, + timeout=30 + ).post_res(url=self._searchurl, json=params) + torrents = [] + if res and res.status_code == 200: + results = res.json().get('data', {}).get("torrents") or [] + for result in results: + torrent = { + 'indexer': self._indexerid, + 'title': result.get('title'), + 'description': result.get('subtitle'), + 'enclosure': self._downloadurl % (self._domain, result.get('id')), + 'pubdate': StringUtils.timestamp_to_date(result.get('upload_time')), + 'size': result.get('size'), + 'seeders': result.get('seeding'), + 'peers': result.get('leeching'), + 'grabs': result.get('complete'), + 'downloadvolumefactor': result.get('downloadRate'), + 'uploadvolumefactor': result.get('uploadRate'), + 'page_url': self._pageurl % (self._domain, result.get('id')), + 'imdbid': result.get('imdb') + } + torrents.append(torrent) + elif res is not None: + logger.warn(f"{self._name} 搜索失败,错误码:{res.status_code}") + return True, [] + else: + logger.warn(f"{self._name} 搜索失败,无法连接 {self._domain}") + return True, [] + return False, torrents diff --git a/app/modules/indexer/torrentleech.py b/app/modules/indexer/torrentleech.py new file mode 100644 index 00000000..48f90172 --- /dev/null +++ b/app/modules/indexer/torrentleech.py @@ -0,0 +1,64 @@ +from typing import List, Tuple +from urllib.parse import quote + +from app.core import settings +from app.log import logger +from app.utils.http import RequestUtils +from app.utils.string import StringUtils + + +class TorrentLeech: + _indexer = None + _proxy = None + _size = 100 + _searchurl = "%storrents/browse/list/query/%s" + _browseurl = "%storrents/browse/list/page/2%s" + _downloadurl = "%sdownload/%s/%s" + _pageurl = "%storrent/%s" + + def __init__(self, indexer: dict): + self._indexer = indexer + if indexer.get('proxy'): + self._proxy = settings.PROXY + + def search(self, keyword: str, page: int = 0) -> Tuple[bool, List[dict]]: + if keyword: + url = self._searchurl % (self._indexer.get('domain'), quote(keyword)) + else: + url = self._browseurl % (self._indexer.get('domain'), int(page) + 1) + res = RequestUtils( + headers={ + "Content-Type": "application/json; charset=utf-8", + "User-Agent": f"{self._indexer.get('ua')}", + }, + cookies=self._indexer.get('cookie'), + proxies=self._proxy, + timeout=30 + ).get_res(url) + torrents = [] + if res and res.status_code == 200: + results = res.json().get('torrentList') or [] + for result in results: + torrent = { + 'indexer': self._indexer.get('id'), + 'title': result.get('name'), + 'enclosure': self._downloadurl % (self._indexer.get('domain'), result.get('fid'), result.get('filename')), + 'pubdate': StringUtils.timestamp_to_date(result.get('addedTimestamp')), + 'size': result.get('size'), + 'seeders': result.get('seeders'), + 'peers': result.get('leechers'), + 'grabs': result.get('completed'), + 'downloadvolumefactor': result.get('download_multiplier'), + 'uploadvolumefactor': 1, + 'page_url': self._pageurl % (self._indexer.get('domain'), result.get('fid')), + 'imdbid': result.get('imdbID') + } + torrents.append(torrent) + elif res is not None: + logger.warn(f"【INDEXER】{self._indexer.get('name')} 搜索失败,错误码:{res.status_code}") + return True, [] + else: + logger.warn(f"【INDEXER】{self._indexer.get('name')} 搜索失败,无法连接 {self._indexer.get('domain')}") + return True, [] + + return False, torrents diff --git a/app/modules/jellyfin/__init__.py b/app/modules/jellyfin/__init__.py new file mode 100644 index 00000000..fc914e3d --- /dev/null +++ b/app/modules/jellyfin/__init__.py @@ -0,0 +1,68 @@ +from typing import Optional, Tuple, Union + +from app.core import MediaInfo +from app.log import logger +from app.modules import _ModuleBase +from app.modules.jellyfin.jellyfin import Jellyfin +from app.utils.types import MediaType + + +class JellyfinModule(_ModuleBase): + jellyfin: Jellyfin = None + + def init_module(self) -> None: + self.jellyfin = Jellyfin() + + def init_setting(self) -> Tuple[str, Union[str, bool]]: + return "MEDIASERVER", "jellyfin" + + def webhook_parser(self, message: dict) -> Optional[dict]: + """ + 解析Webhook报文体 + :param message: 请求体 + :return: 字典,解析为消息时需要包含:title、text、image + """ + return self.jellyfin.get_webhook_message(message) + + def media_exists(self, mediainfo: MediaInfo) -> Optional[dict]: + """ + 判断媒体文件是否存在 + :param mediainfo: 识别的媒体信息 + :return: 如不存在返回None,存在时返回信息,包括每季已存在所有集{type: movie/tv, seasons: {season: [episodes]}} + """ + if mediainfo.type == MediaType.MOVIE: + movies = self.jellyfin.get_movies(title=mediainfo.title, year=mediainfo.year) + if movies: + logger.info(f"{mediainfo.get_title_string()} 在媒体库中不存在") + return None + else: + logger.info(f"媒体库中已存在:{movies}") + return {"type": MediaType.MOVIE} + else: + tvs = self.jellyfin.get_tv_episodes(title=mediainfo.title, + year=mediainfo.year, + tmdb_id=mediainfo.tmdb_id) + if not tvs: + logger.info(f"{mediainfo.get_title_string()} 在媒体库中不存在") + return None + else: + logger.info(f"{mediainfo.get_title_string()} 媒体库中已存在:{tvs}") + return {"type": MediaType.TV, "seasons": tvs} + + def refresh_mediaserver(self, mediainfo: MediaInfo, file_path: str) -> Optional[bool]: + """ + 刷新媒体库 + :param mediainfo: 识别的媒体信息 + :param file_path: 文件路径 + :return: 成功或失败 + """ + items = [ + { + "title": mediainfo.title, + "year": mediainfo.year, + "type": mediainfo.type, + "category": mediainfo.category, + "target_path": file_path + } + ] + return self.jellyfin.refresh_library_by_items(items) diff --git a/app/modules/jellyfin/__pycache__/__init__.cpython-310.pyc b/app/modules/jellyfin/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..492561fd2b13be53c55e663136fc7f18e88e0732 GIT binary patch literal 2775 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 List[dict]: + """ + 获取Jellyfin媒体库的信息 + """ + if not self._host or not self._apikey: + return [] + req_url = f"{self._host}Users/{self._user}/Views?api_key={self._apikey}" + try: + res = RequestUtils().get_res(req_url) + if res: + return res.json().get("Items") + else: + logger.error(f"Users/Views 未获取到返回数据") + return [] + except Exception as e: + logger.error(f"连接Users/Views 出错:" + str(e)) + return [] + + def get_user_count(self) -> int: + """ + 获得用户数量 + """ + if not self._host or not self._apikey: + return 0 + req_url = "%sUsers?api_key=%s" % (self._host, self._apikey) + try: + res = RequestUtils().get_res(req_url) + if res: + return len(res.json()) + else: + logger.error(f"Users 未获取到返回数据") + return 0 + except Exception as e: + logger.error(f"连接Users出错:" + str(e)) + return 0 + + def get_user(self, user_name: str = None) -> Optional[Union[str, int]]: + """ + 获得管理员用户 + """ + if not self._host or not self._apikey: + return None + req_url = "%sUsers?api_key=%s" % (self._host, self._apikey) + try: + res = RequestUtils().get_res(req_url) + if res: + users = res.json() + # 先查询是否有与当前用户名称匹配的 + if user_name: + for user in users: + if user.get("Name") == user_name: + return user.get("Id") + # 查询管理员 + for user in users: + if user.get("Policy", {}).get("IsAdministrator"): + return user.get("Id") + else: + logger.error(f"Users 未获取到返回数据") + except Exception as e: + logger.error(f"连接Users出错:" + str(e)) + return None + + def get_server_id(self) -> Optional[str]: + """ + 获得服务器信息 + """ + if not self._host or not self._apikey: + return None + req_url = "%sSystem/Info?api_key=%s" % (self._host, self._apikey) + try: + res = RequestUtils().get_res(req_url) + if res: + return res.json().get("Id") + else: + logger.error(f"System/Info 未获取到返回数据") + except Exception as e: + logger.error(f"连接System/Info出错:" + str(e)) + return None + + def get_activity_log(self, num: int = 30) -> List[dict]: + """ + 获取Jellyfin活动记录 + """ + if not self._host or not self._apikey: + return [] + req_url = "%sSystem/ActivityLog/Entries?api_key=%s&Limit=%s" % (self._host, self._apikey, num) + ret_array = [] + try: + res = RequestUtils().get_res(req_url) + if res: + ret_json = res.json() + items = ret_json.get('Items') + for item in items: + if item.get("Type") == "SessionStarted": + event_type = "LG" + event_date = re.sub(r'\dZ', 'Z', item.get("Date")) + event_str = "%s, %s" % (item.get("Name"), item.get("ShortOverview")) + activity = {"type": event_type, "event": event_str, + "date": StringUtils.get_time(event_date)} + ret_array.append(activity) + if item.get("Type") in ["VideoPlayback", "VideoPlaybackStopped"]: + event_type = "PL" + event_date = re.sub(r'\dZ', 'Z', item.get("Date")) + activity = {"type": event_type, "event": item.get("Name"), + "date": StringUtils.get_time(event_date)} + ret_array.append(activity) + else: + logger.error(f"System/ActivityLog/Entries 未获取到返回数据") + return [] + except Exception as e: + logger.error(f"连接System/ActivityLog/Entries出错:" + str(e)) + return [] + return ret_array + + def get_medias_count(self) -> Optional[dict]: + """ + 获得电影、电视剧、动漫媒体数量 + :return: MovieCount SeriesCount SongCount + """ + if not self._host or not self._apikey: + return None + req_url = "%sItems/Counts?api_key=%s" % (self._host, self._apikey) + try: + res = RequestUtils().get_res(req_url) + if res: + return res.json() + else: + logger.error(f"Items/Counts 未获取到返回数据") + return {} + except Exception as e: + logger.error(f"连接Items/Counts出错:" + str(e)) + return {} + + def __get_jellyfin_series_id_by_name(self, name: str, year: str) -> Optional[str]: + """ + 根据名称查询Jellyfin中剧集的SeriesId + """ + if not self._host or not self._apikey or not self._user: + return None + req_url = "%sUsers/%s/Items?api_key=%s&searchTerm=%s&IncludeItemTypes=Series&Limit=10&Recursive=true" % ( + self._host, self._user, self._apikey, name) + try: + res = RequestUtils().get_res(req_url) + if res: + res_items = res.json().get("Items") + if res_items: + for res_item in res_items: + if res_item.get('Name') == name and ( + not year or str(res_item.get('ProductionYear')) == str(year)): + return res_item.get('Id') + except Exception as e: + logger.error(f"连接Items出错:" + str(e)) + return None + return "" + + def get_movies(self, title: str, year: str = None) -> Optional[List[dict]]: + """ + 根据标题和年份,检查电影是否在Jellyfin中存在,存在则返回列表 + :param title: 标题 + :param year: 年份,为空则不过滤 + :return: 含title、year属性的字典列表 + """ + if not self._host or not self._apikey or not self._user: + return None + req_url = "%sUsers/%s/Items?api_key=%s&searchTerm=%s&IncludeItemTypes=Movie&Limit=10&Recursive=true" % ( + self._host, self._user, self._apikey, title) + try: + res = RequestUtils().get_res(req_url) + if res: + res_items = res.json().get("Items") + if res_items: + ret_movies = [] + for res_item in res_items: + if res_item.get('Name') == title and ( + not year or str(res_item.get('ProductionYear')) == str(year)): + ret_movies.append( + {'title': res_item.get('Name'), 'year': str(res_item.get('ProductionYear'))}) + return ret_movies + except Exception as e: + logger.error(f"连接Items出错:" + str(e)) + return None + return [] + + def get_tv_episodes(self, + title: str = None, + year: str = None, + tmdb_id: str = None, + season: int = None) -> Optional[Dict[str, list]]: + """ + 根据标题和年份和季,返回Jellyfin中的剧集列表 + :param title: 标题 + :param year: 年份 + :param tmdb_id: TMDBID + :param season: 季 + :return: 集号的列表 + """ + if not self._host or not self._apikey or not self._user: + return None + # 查TVID + item_id = self.__get_jellyfin_series_id_by_name(title, year) + if item_id is None: + return None + if not item_id: + return {} + # 验证tmdbid是否相同 + item_tmdbid = self.get_iteminfo(item_id).get("ProviderIds", {}).get("Tmdb") + if tmdb_id and item_tmdbid: + if str(tmdb_id) != str(item_tmdbid): + return {} + if not season: + season = "" + try: + req_url = "%sShows/%s/Episodes?season=%s&&userId=%s&isMissing=false&api_key=%s" % ( + self._host, item_id, season, self._user, self._apikey) + res_json = RequestUtils().get_res(req_url) + if res_json: + res_items = res_json.json().get("Items") + # 返回的季集信息 + season_episodes = {} + for res_item in res_items: + season_index = res_item.get("ParentIndexNumber") + if not season_index: + continue + if season and season != season_index: + continue + episode_index = res_item.get("IndexNumber") + if not episode_index: + continue + if not season_episodes.get(season_index): + season_episodes[season_index] = [] + season_episodes[season_index].append(episode_index) + return season_episodes + except Exception as e: + logger.error(f"连接Shows/Id/Episodes出错:" + str(e)) + return None + return {} + + def get_remote_image_by_id(self, item_id: str, image_type: str) -> Optional[str]: + """ + 根据ItemId从Jellyfin查询TMDB图片地址 + :param item_id: 在Emby中的ID + :param image_type: 图片的类弄地,poster或者backdrop等 + :return: 图片对应在TMDB中的URL + """ + if not self._host or not self._apikey: + return None + req_url = "%sItems/%s/RemoteImages?api_key=%s" % (self._host, item_id, self._apikey) + try: + res = RequestUtils().get_res(req_url) + if res: + images = res.json().get("Images") + for image in images: + if image.get("ProviderName") == "TheMovieDb" and image.get("Type") == image_type: + return image.get("Url") + else: + logger.error(f"Items/RemoteImages 未获取到返回数据") + return None + except Exception as e: + logger.error(f"连接Items/Id/RemoteImages出错:" + str(e)) + return None + return None + + def refresh_root_library(self) -> bool: + """ + 通知Jellyfin刷新整个媒体库 + """ + if not self._host or not self._apikey: + return False + req_url = "%sLibrary/Refresh?api_key=%s" % (self._host, self._apikey) + try: + res = RequestUtils().post_res(req_url) + if res: + return True + else: + logger.info(f"刷新媒体库失败,无法连接Jellyfin!") + except Exception as e: + logger.error(f"连接Library/Refresh出错:" + str(e)) + return False + + def refresh_library_by_items(self, items: List[dict]) -> bool: + """ + 按类型、名称、年份来刷新媒体库,Jellyfin没有刷单个项目的API,这里直接刷新整个库 + :param items: 已识别的需要刷新媒体库的媒体信息列表 + """ + # 没找到单项目刷新的对应的API,先按全库刷新 + if not items: + return False + if not self._host or not self._apikey: + return False + return self.refresh_root_library() + + def get_iteminfo(self, itemid: str) -> dict: + """ + 获取单个项目详情 + """ + if not itemid: + return {} + if not self._host or not self._apikey: + return {} + req_url = "%sUsers/%s/Items/%s?api_key=%s" % ( + self._host, self._user, itemid, self._apikey) + try: + res = RequestUtils().get_res(req_url) + if res and res.status_code == 200: + return res.json() + except Exception as e: + logger.error(f"连接Users/Items出错:" + str(e)) + return {} + + @staticmethod + def get_webhook_message(message: dict) -> dict: + """ + 解析Jellyfin报文 + """ + eventItem = {'event': message.get('NotificationType', ''), + 'item_name': message.get('Name'), + 'user_name': message.get('NotificationUsername') + } + return eventItem diff --git a/app/modules/plex/__init__.py b/app/modules/plex/__init__.py new file mode 100644 index 00000000..96ab0f05 --- /dev/null +++ b/app/modules/plex/__init__.py @@ -0,0 +1,68 @@ +from typing import Optional, Tuple, Union + +from app.core import MediaInfo +from app.log import logger +from app.modules import _ModuleBase +from app.modules.plex.plex import Plex +from app.utils.types import MediaType + + +class PlexModule(_ModuleBase): + + plex: Plex = None + + def init_module(self) -> None: + self.plex = Plex() + + def init_setting(self) -> Tuple[str, Union[str, bool]]: + return "MEDIASERVER", "plex" + + def webhook_parser(self, message: dict) -> Optional[dict]: + """ + 解析Webhook报文体 + :param message: 请求体 + :return: 字典,解析为消息时需要包含:title、text、image + """ + return self.plex.get_webhook_message(message) + + def media_exists(self, mediainfo: MediaInfo) -> Optional[dict]: + """ + 判断媒体文件是否存在 + :param mediainfo: 识别的媒体信息 + :return: 如不存在返回None,存在时返回信息,包括每季已存在所有集{type: movie/tv, seasons: {season: [episodes]}} + """ + if mediainfo.type == MediaType.MOVIE: + movies = self.plex.get_movies(title=mediainfo.title, year=mediainfo.year) + if movies: + logger.info(f"{mediainfo.get_title_string()} 在媒体库中不存在") + return None + else: + logger.info(f"媒体库中已存在:{movies}") + return {"type": MediaType.MOVIE} + else: + tvs = self.plex.get_tv_episodes(title=mediainfo.title, + year=mediainfo.year) + if not tvs: + logger.info(f"{mediainfo.get_title_string()} 在媒体库中不存在") + return None + else: + logger.info(f"{mediainfo.get_title_string()} 媒体库中已存在:{tvs}") + return {"type": MediaType.TV, "seasons": tvs} + + def refresh_mediaserver(self, mediainfo: MediaInfo, file_path: str) -> Optional[bool]: + """ + 刷新媒体库 + :param mediainfo: 识别的媒体信息 + :param file_path: 文件路径 + :return: 成功或失败 + """ + items = [ + { + "title": mediainfo.title, + "year": mediainfo.year, + "type": mediainfo.type, + "category": mediainfo.category, + "target_path": file_path + } + ] + return self.plex.refresh_library_by_items(items) diff --git a/app/modules/plex/__pycache__/__init__.cpython-310.pyc b/app/modules/plex/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a0ca7d3faf60b9a022817f2bb3d0f39d067fd0ae GIT binary patch literal 2699 zcmb7G-A^1<6rbEVpdf zzIwP?v5Bu9DZ@M``iVYbTE_nJkP8#dc1tBfflBFpu35Foy9OgLRR(M_7D*o-uaF{Y zZf-G{?1j#zVIV?YG=;o$1a6s^i9%FU+9Q}dOvO~El)PrjBt`%!^yHAVTL`LY3EWmQMKVp?wAljOHqLD&alVoSdCkn2ZLqS#6u|<|`ALKxUZ&qy z;O=9-Mu}IY<)R2kHyY9s^nK7-8U{}|Ez|@Zt^sPq{+vYPz@;e|Zh=7Egy9Bx@wKr97ax5}2M z>)n-cKgG##xfK*M1e6vhIySG+-6Zla{CEeBA0v%lUjp2Is;~FG{qG#=J$SVDAji*9 z(-sg4DZB)2gTYU8^^AC)RW9uS4u_zK6T7xUXvp|6hcIT8ND;AaG^Azdkuht+h_E2m z#6|RpSe=8lWVX@PzrR-hcIHDeIPAK|>gR9NXFp&2?NYSdQ!%LFWE;oyWV7qbEA_jl zwuprO?8yd8mxD8_Paa$db*`=6uiu-lpIokAzV~?k#QM#X!G$xy%$+9>u6mYdlSd~` zdSuLlKg)qDL`QFXgdzvaGTa^-H-*y5Dq93x=@?g-DJP5 zQhvh0474Bvx7ZMUs6yv9ybVN691%QmL^>wX*TJ6hhyolHx@L+OrAetK(Jn8x5U+^~ ziA7-!YRNa!q6k$&J|rODRBF2_0FLY#Okc0hE(N#00;i#Of4x_~vK-9Z43@40^FKslk*6Ex;J!W^OyBwA z>QuOS?cpMLb8|!F_nW8IRxgI?)*pTy%zfMMmI=f`$O89=+;BhgFPy1=@ne1Y%V6nR zu<~<5?A(d^{JF<-XODYO;CiwSrtO>F=o?u^4Ca;_!VN?4!Tn2Xt4k5i{%R*IH!np%AU=HsF*G!A!-d{b=w-G1|8Q2$92mi4r}%y zeFfxwmGif|aOZ{s?g}VoqlCT%;tZb&C82=V6j2hDzm=!y#6(w9b$iA}2vmGg`{6Z? z>w4L6h_3rd9YPX6F@R3%`X^Px4p+h_3LjfPqw7Yw?0N=%yf9s-_#{z`0$+wer5FRg zGU&QC-N{MQDtZ)OAKHNf)=&B}4zJ;`S+1j+P4SZrJHx7;6w*>s>XJL;j(ArmU+d3h zd<}9Dk|I=$r-ui};W6(nx|Hy9{1{H*11e0c6wVqiJ;iUM{PRtm?h3s9eBfUdeg@a7 jo@KLc%zMUjn4kYF(0+VRsQGPt@j3E#K%N%EU%UJdAd)3{ literal 0 HcmV?d00001 diff --git a/app/modules/plex/__pycache__/plex.cpython-310.pyc b/app/modules/plex/__pycache__/plex.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b86c2c0f88675fd3096e2b02690cf94a6bd087c7 GIT binary patch literal 9192 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 P>LmY&p4r4xTZj688!Se* literal 0 HcmV?d00001 diff --git a/app/modules/plex/plex.py b/app/modules/plex/plex.py new file mode 100644 index 00000000..8f3dd909 --- /dev/null +++ b/app/modules/plex/plex.py @@ -0,0 +1,293 @@ +from pathlib import Path +from typing import List, Optional, Dict, Tuple +from urllib.parse import quote_plus + +from plexapi import media +from plexapi.server import PlexServer + +from app.core import settings +from app.log import logger +from app.utils.singleton import Singleton + + +class Plex(metaclass=Singleton): + + def __init__(self): + self._host = settings.PLEX_HOST + self._token = settings.PLEX_TOKEN + if self._host and self._token: + try: + self._plex = PlexServer(self._host, self._token) + self._libraries = self._plex.library.sections() + except Exception as e: + self._plex = None + logger.error(f"Plex服务器连接失败:{str(e)}") + + def get_activity_log(self, num: int = 30) -> Optional[List[dict]]: + """ + 获取Plex活动记录 + """ + if not self._plex: + return [] + ret_array = [] + try: + # type的含义: 1 电影 4 剧集单集 详见 plexapi/utils.py中SEARCHTYPES的定义 + # 根据最后播放时间倒序获取数据 + historys = self._plex.library.search(sort='lastViewedAt:desc', limit=num, type='1,4') + for his in historys: + # 过滤掉最后播放时间为空的 + if his.lastViewedAt: + if his.type == "episode": + event_title = "%s %s%s %s" % ( + his.grandparentTitle, + "S" + str(his.parentIndex), + "E" + str(his.index), + his.title + ) + event_str = "开始播放剧集 %s" % event_title + else: + event_title = "%s %s" % ( + his.title, "(" + str(his.year) + ")") + event_str = "开始播放电影 %s" % event_title + + event_type = "PL" + event_date = his.lastViewedAt.strftime('%Y-%m-%d %H:%M:%S') + activity = {"type": event_type, "event": event_str, "date": event_date} + ret_array.append(activity) + except Exception as e: + logger.error(f"连接System/ActivityLog/Entries出错:" + str(e)) + return [] + if ret_array: + ret_array = sorted(ret_array, key=lambda x: x['date'], reverse=True) + return ret_array + + def get_medias_count(self) -> dict: + """ + 获得电影、电视剧、动漫媒体数量 + :return: MovieCount SeriesCount SongCount + """ + if not self._plex: + return {} + sections = self._plex.library.sections() + MovieCount = SeriesCount = SongCount = EpisodeCount = 0 + for sec in sections: + if sec.type == "movie": + MovieCount += sec.totalSize + if sec.type == "show": + SeriesCount += sec.totalSize + EpisodeCount += sec.totalViewSize(libtype='episode') + if sec.type == "artist": + SongCount += sec.totalSize + return { + "MovieCount": MovieCount, + "SeriesCount": SeriesCount, + "SongCount": SongCount, + "EpisodeCount": EpisodeCount + } + + def get_movies(self, title: str, year: str = None) -> Optional[List[dict]]: + """ + 根据标题和年份,检查电影是否在Plex中存在,存在则返回列表 + :param title: 标题 + :param year: 年份,为空则不过滤 + :return: 含title、year属性的字典列表 + """ + if not self._plex: + return None + ret_movies = [] + if year: + movies = self._plex.library.search(title=title, year=year, libtype="movie") + else: + movies = self._plex.library.search(title=title, libtype="movie") + for movie in movies: + ret_movies.append({'title': movie.title, 'year': movie.year}) + return ret_movies + + def get_tv_episodes(self, + title: str = None, + year: str = None, + season: int = None) -> Optional[Dict[str, list]]: + """ + 根据标题、年份、季查询电视剧所有集信息 + :param title: 标题 + :param year: 年份,可以为空,为空时不按年份过滤 + :param season: 季号,数字 + :return: 所有集的列表 + """ + if not self._plex: + return {} + videos = self._plex.library.search(title=title, year=year, libtype="show") + if not videos: + return {} + episodes = videos[0].episodes() + season_episodes = {} + for episode in episodes: + if season and episode.seasonNumber != int(season): + continue + if episode.seasonNumber not in season_episodes: + season_episodes[episode.seasonNumber] = [] + season_episodes[episode.seasonNumber].append(episode.index) + return season_episodes + + def get_remote_image_by_id(self, item_id: str, image_type: str) -> Optional[str]: + """ + 根据ItemId从Plex查询图片地址 + :param item_id: 在Emby中的ID + :param image_type: 图片的类型,Poster或者Backdrop等 + :return: 图片对应在TMDB中的URL + """ + if not self._plex: + return None + try: + if image_type == "Poster": + images = self._plex.fetchItems('/library/metadata/%s/posters' % item_id, cls=media.Poster) + else: + images = self._plex.fetchItems('/library/metadata/%s/arts' % item_id, cls=media.Art) + for image in images: + if hasattr(image, 'key') and image.key.startswith('http'): + return image.key + except Exception as e: + logger.error(f"获取封面出错:" + str(e)) + return None + + def refresh_root_library(self) -> bool: + """ + 通知Plex刷新整个媒体库 + """ + if not self._plex: + return False + return self._plex.library.update() + + def refresh_library_by_items(self, items: List[dict]) -> bool: + """ + 按路径刷新媒体库 item: target_path + """ + if not self._plex: + return False + result_dict = {} + for item in items: + file_path = item.get("target_path") + lib_key, path = self.__find_librarie(file_path, self._libraries) + # 如果存在同一剧集的多集,key(path)相同会合并 + result_dict[path] = lib_key + if "" in result_dict: + # 如果有匹配失败的,刷新整个库 + self._plex.library.update() + else: + # 否则一个一个刷新 + for path, lib_key in result_dict.items(): + logger.info(f"刷新媒体库:{lib_key} - {path}") + self._plex.query(f'/library/sections/{lib_key}/refresh?path={quote_plus(path)}') + + @staticmethod + def __find_librarie(path: str, libraries: List[dict]) -> Tuple[str, str]: + """ + 判断这个path属于哪个媒体库 + 多个媒体库配置的目录不应有重复和嵌套, + """ + + def is_subpath(_path: str, _parent: str) -> bool: + """ + 判断_path是否是_parent的子目录下 + """ + _path = Path(_path).resolve() + _parent = Path(_parent).resolve() + return _path.parts[:len(_parent.parts)] == _parent.parts + + if path is None: + return "", "" + + try: + for lib in libraries: + if hasattr(lib, "locations") and lib.locations: + for location in lib.locations: + if is_subpath(path, location): + return lib.key, location + except Exception as err: + logger.error(f"查找媒体库出错:{err}") + return "", "" + + def get_iteminfo(self, itemid: str) -> dict: + """ + 获取单个项目详情 + """ + if not self._plex: + return {} + try: + item = self._plex.fetchItem(itemid) + ids = self.__get_ids(item.guids) + return {'ProviderIds': {'Tmdb': ids['tmdb_id'], 'Imdb': ids['imdb_id']}} + except Exception as err: + logger.error(f"获取项目详情出错:{err}") + return {} + + @staticmethod + def __get_ids(guids: List[dict]) -> dict: + guid_mapping = { + "imdb://": "imdb_id", + "tmdb://": "tmdb_id", + "tvdb://": "tvdb_id" + } + ids = {} + for prefix, varname in guid_mapping.items(): + ids[varname] = None + for guid in guids: + for prefix, varname in guid_mapping.items(): + if isinstance(guid, dict): + if guid['id'].startswith(prefix): + # 找到匹配的ID + ids[varname] = guid['id'][len(prefix):] + break + else: + if guid.id.startswith(prefix): + # 找到匹配的ID + ids[varname] = guid.id[len(prefix):] + break + return ids + + @staticmethod + def get_webhook_message(message: dict) -> dict: + """ + 解析Plex报文 + eventItem 字段的含义 + event 事件类型 + item_type 媒体类型 TV,MOV + item_name TV:琅琊榜 S1E6 剖心明志 虎口脱险 + MOV:猪猪侠大冒险(2001) + overview 剧情描述 + """ + eventItem = {'event': message.get('event', '')} + if message.get('Metadata'): + if message.get('Metadata', {}).get('type') == 'episode': + eventItem['item_type'] = "TV" + eventItem['item_name'] = "%s %s%s %s" % ( + message.get('Metadata', {}).get('grandparentTitle'), + "S" + str(message.get('Metadata', {}).get('parentIndex')), + "E" + str(message.get('Metadata', {}).get('index')), + message.get('Metadata', {}).get('title')) + eventItem['item_id'] = message.get('Metadata', {}).get('ratingKey') + eventItem['season_id'] = message.get('Metadata', {}).get('parentIndex') + eventItem['episode_id'] = message.get('Metadata', {}).get('index') + + if message.get('Metadata', {}).get('summary') and len(message.get('Metadata', {}).get('summary')) > 100: + eventItem['overview'] = str(message.get('Metadata', {}).get('summary'))[:100] + "..." + else: + eventItem['overview'] = message.get('Metadata', {}).get('summary') + else: + eventItem['item_type'] = "MOV" if message.get('Metadata', {}).get('type') == 'movie' else "SHOW" + eventItem['item_name'] = "%s %s" % ( + message.get('Metadata', {}).get('title'), "(" + str(message.get('Metadata', {}).get('year')) + ")") + eventItem['item_id'] = message.get('Metadata', {}).get('ratingKey') + if len(message.get('Metadata', {}).get('summary')) > 100: + eventItem['overview'] = str(message.get('Metadata', {}).get('summary'))[:100] + "..." + else: + eventItem['overview'] = message.get('Metadata', {}).get('summary') + if message.get('Player'): + eventItem['ip'] = message.get('Player').get('publicAddress') + eventItem['client'] = message.get('Player').get('title') + # 这里给个空,防止拼消息的时候出现None + eventItem['device_name'] = ' ' + if message.get('Account'): + eventItem['user_name'] = message.get("Account").get('title') + + return eventItem diff --git a/app/modules/qbittorrent/__init__.py b/app/modules/qbittorrent/__init__.py new file mode 100644 index 00000000..e66121cc --- /dev/null +++ b/app/modules/qbittorrent/__init__.py @@ -0,0 +1,75 @@ +from pathlib import Path +from typing import Set, Tuple, Optional, Union + +from app.core import settings, MetaInfo +from app.modules import _ModuleBase +from app.modules.qbittorrent.qbittorrent import Qbittorrent +from app.utils.string import StringUtils + + +class QbittorrentModule(_ModuleBase): + qbittorrent: Qbittorrent = None + + def init_module(self) -> None: + self.qbittorrent = Qbittorrent() + + def init_setting(self) -> Tuple[str, Union[str, bool]]: + return "DOWNLOADER", "qbittorrent" + + def download(self, torrent_path: Path, cookie: str, + episodes: Set[int] = None) -> Optional[Tuple[Optional[str], str]]: + """ + 根据种子文件,选择并添加下载任务 + :param torrent_path: 种子文件地址 + :param cookie: cookie + :param episodes: 需要下载的集数 + :return: 种子Hash + """ + if not torrent_path.exists(): + return None, f"种子文件不存在:{torrent_path}" + # 生成随机Tag + tag = StringUtils.generate_random_str(10) + # 如果要选择文件则先暂停 + is_paused = True if episodes else False + # 添加任务 + state = self.qbittorrent.add_torrent(content=torrent_path.read_bytes(), + download_dir=settings.DOWNLOAD_PATH, + is_paused=is_paused, + tag=tag, + cookie=cookie) + if not state: + return None, f"添加种子任务失败:{torrent_path}" + else: + # 获取种子Hash + torrent_hash = self.qbittorrent.get_torrent_id_by_tag(tag=tag) + if not torrent_hash: + return None, f"获取种子Hash失败:{torrent_path}" + else: + if is_paused: + # 种子文件 + torrent_files = self.qbittorrent.get_files(torrent_hash) + if not torrent_files: + return torrent_hash, "获取种子文件失败,下载任务可能在暂停状态" + + # 不需要的文件ID + file_ids = [] + # 需要的集清单 + sucess_epidised = [] + + for torrent_file in torrent_files: + file_id = torrent_file.get("id") + file_name = torrent_file.get("name") + meta_info = MetaInfo(file_name) + if not meta_info.get_episode_list() \ + or not set(meta_info.get_episode_list()).issubset(episodes): + file_ids.append(file_id) + else: + sucess_epidised = list(set(sucess_epidised).union(set(meta_info.get_episode_list()))) + if sucess_epidised and file_ids: + # 选择文件 + self.qbittorrent.set_files(torrent_hash=torrent_hash, file_ids=file_ids, priority=0) + # 开始任务 + self.qbittorrent.start_torrents(torrent_hash) + return torrent_hash, f"添加下载成功,已选择集数:{sucess_epidised}" + else: + return torrent_hash, "添加下载成功" diff --git a/app/modules/qbittorrent/__pycache__/__init__.cpython-310.pyc b/app/modules/qbittorrent/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..39e3fe77bef2e955b797651516c1c39e1ee09692 GIT binary patch literal 2614 zcmZ`*%WoS+7@ygfch_q>Y0INPs~`@@2OC;m?4@J{UZPi6DYw)WklMSsr!1<@QtSFn@!8N@_junHErK+ zI=+*yjo59L{c=v5vDd8lm7KQXYP06oFnSG<60y%9V$<@n?vD^>3f0{WkcjG78k3=z zuNzXIqC%QS+pU;N`*2G{X%fcLJeB}a*QCv<5K%J6rG1Es@Qq|Pg~R3GP)gb{eL3V* zEsxAZLZpn*M5yJIU~uG^h+^JQ;)XvD7W-gu0TV?&Cdk*0feU<{8q_4(UPLOyAm$mv zw}?(l)TRy$cUIepia{(=0&dyCqzcA)1o*_I6LNdtq9gHO>Ki~}&ZvO=I`l%W6&m_nEFL|tPl=nUcw zOKET#&t67s8!Z1mbYRc)F-{quUN~`LZhm@lu`wUA<|IoOXhZPnL+Sewos8mCOoy%3 zbTfA@pB_?aItZd95Yw??I7?ivlOknX|5 z?@YXPc>lpy-p-B5O<*H{DJW$T+YXcT^4t3vq5!!f20pp_e-!CMrPoiEpan@Ntwx%@ z7eV^bR>V_6c|$2Q_-a6uVC0(a1D!M6L2HPY2_{;Gzd@I@S#1gl+|h`>hL?;?XFG_I zU}7$r8CuX63^-w~Az>|)GBYzWjaVz@l9gHfIk=;=bw`f2GlSSGc&U_?_=~`IhWI91 zRhW*Gl|Yi6+5F9{L?AV%&>UKFV7Qrm5WV~SQaLMkTv7&_5v6H;wEZXe(;e%7z0Qr^$}e|+TWDl|c02`~P)_*u%2)}#r%*Hn#_rAKag)d&|p1#P}Lq5OBn`l1{HV*4@=QV9m)E-IE)+1O*CwdF_W^F<@d5vfVMlk*{kpz<8#L}+ z{HS|+_3qiLy;G;977=MAVUsfTe(UcC8bkyNc8f(Ri^O94SpW{lvG?iu z?%8i4%H3wXwp-ytn}BI1IxG63ZEIhs%w3L3C5A!#$`V9*(m0eIVY)V8vNOC3mNtD_@ov!5G5 z45~;S%89fi&f7DJvY>R*1e}vI&9>@b(g99!m0#r|WSio6y~al2UiO%pRD78VTpmL9 z6j0Ixyr67M(Un1x=UTC+Vb8Dec7t-RbRv<;l+CK9Kz^wo2!Z>R0;OdTNH++I?gF$I1jpN9TyTnppk9xx1woi3 zDfkHd%!7dKfL*34Hv|T~VtUSw62VNhd_hflKiQg;1DNWsN(xt( zy3pHPZMUu&-hB%!+=i?7bHoHFT~aM1j%M=vr6m?y@Yf@klj~B*$#tvtSQcJKG}JoL0JWEKO}% zoRiV%>guXn)z$ajy7zZ)soK?*QSjSTI>Fx9swn?K56Pd2hsSVvr%*73sb!@=cde{W zYXwcEx?a|&je;?47R+g@V2L)hoGPTyXOvUZcEJ{HW;s2bDP%<5Drcv2g`B9T%3agl zg>F%|%RSS*gE=h%N8(_Dfb)chl zkgZ4SE$mO(YAZC@2DTAz90WhwDU$pk{u$zXZe^Q5z5Z)bZ)RISy&*kB-;Xid*lmKd z8wJO2cl+2KuFG>0uN6%( zpV!5+zFr9w$4In*=V&p}V&R^`-Nro~C`Szb9h4^jF3J@D9?CR-G*IR<3p66jlu?+A z_A76WTvN9%e~BNbr7lyE&v6^KF!j{q&J%k_$3kPWRAHg%)ygHG=g`HwqW%M;yZ7^M zddh-&-;UAIgM0VyYH{Frm9ub*lVFl zUfZ{G`}hGc)f+$Z+;dZh$M?-l94_+deY|?ao$$T!zp6f4a`%9gIw?WY6nw0c@4njb36Y-lGmNh|Be)#EfOGqVq4bd2fov-3G-1^QdcJKDm^IQ@jq zOvv19phlzesroRjdZ_hV`r;>xFaJEjvbblv{NU|FiO%K+A20pOLQFCoru@>hTdn(f zZMg^2Ela*_+D|vwxWc9JG<}5Wa$ejg+cX)MIxBDOetJ-V7|#zhj#Nv-T+7YD{XRht?( z7+KR5O$~E+r4voE4Sn9jC@jl{a?)jeX+T+_pm;KH^-IM)Np0H6ZYV13q`FqB>tIq{ zlM_#nuZw;JWa$!?lDCvVhU42vZt zdEfl#Uz-V-2>$T7j{vTy$4R8sKGb8jwv@oMv}pNv#1Zaj1(Oixs&fnt4^ z<#owTbsEn_PsjU!w%nTkjE9iSJZ^%vg%WqH0JcxUw*p$=FgoCm0%@2$n&}AE;Ps-=tX>F;jL2#} zZ81jbScW0A#y zze7#P%dGz;y({)K7cXD^{Gyb|)fYcpJo)^UOP|05Exz_|SI__Gcb~m<<4jpT3x#MaEVW&U<>oBCRSH z#N8`Gk*@7H)*$3!8H7&;v~G1X8TT*SvB)YTzgjNI-NRtp32TVmV+=Z(^63N~N){Ou&0$&FiXrFf|9O5O@@EqI%xkJ&rY;%_(@^Ort$vdSl1 z2R!0_#~$FjNo?%~ia&w2)5J;&ku+lf%H3jPnpF|8H&X7vye?iN$^j6}}5Iga$?9_4TL@Ex!HF&6mzL&;M%ir5BnP zFGz!l03u9#MOdjCl38^MYC+dR7UzC5R9{0w<(sd3@lNyoH<)FeB8= zJ6`e+^KTO^Sv(nsckSAHaOBCoJ9Z(y9(w}7lC)VsK>;@kS)UgxWMI9c9{(=-3b~e! zNei)$$e*P4jHD#CbSQ7wC!iZmH0g3N*Gm}Tk$K9Q1Oj2HHBHTF8(<+as-X?aJ78c& z%>fo>02y86Kn!56FVU<4QDmP^oN$4OfNFHHFoH zPQ%KZZ8ltQm?y9YU^PUIY&fEu2LhcTYXZ$S7s$Soj#>3-dT(Ue7w11-oQo{`g)>s* z%YT0vp>b0Eu3UP5@!ac+7fv;we;c4^`R{&;m;;qPyW*MRs97pzq6fx4#_;?hynRHZ zT=-s8VSfluc3K%y8bs48@)i>i#tcBYVd;w(T8QUo7Z!iL(EQCi zOCP)zZQBcrAHgon$C!1`E;#1q#~(`YBge&)jfic#Oggws>xYa4q9H!#&CtYtm_ndN zNe<+{%C1`r?`h9x-IUv$_yO6r3lQ5-O2sL$P%U-t#C2jP#uP2VUB*n_01CtG)+jWi zFiq}A3fg9GONwsQ8IY`LnXNEg@?g4ut1@d;u?^doZ^Z_Izk1Hmi~=i#LY zCi!sczIIyUeF2;YoKLD^ptSIWbOA>apL6}x0qYj8A_QLNWsmm0a6lbMJHqP`Qvt|@ z4mQufENw;S+}MZ_Xz%Pwier1r_eihPNjXui9xb_8->=@hdg|ky;_2$E?_T-j<)zDK zn=ig6jaY|&jLp-bYPB5CI6RV1g$8|MoUfpChwE{|zx)st%0Ngl_5D{spnnvxGZPcug@%OkVJ$wGA)!+e+AMn&op zE1IC1*shaQBj3SYDrnJ#6m*nyqWtgVCRL?e^4)Ii0;Fxf>I+w_!Y;-hzva#P7+*CE}Qj*c=i!!(<}rggF#Z z%-uJQVnn7`D7~n)qE5r%|DgHeyB&Hl{GKY1vXohpB$inOk_$aCf~E8mpv2vn zekE(Q8a58Q1-yy0#)Au2eosP{5l44>G`Jzjz4n1$$v{py47l~SPi=YX_WeD~OCW72 zr*!2qcNis=;}4B8fvtW0b-okH!fGx4%zk_(KZ>`_u5bUO1WlN2h1#^?+MKF^fsuZA z&){K2KLX85la!-)H_GO=Y0CX=`3bnzHuES>1X`LBoegxbuX%1h&QHYZGo057xx|va zq~0V3+)Que@D6^qa_pRdnM^L+N454KE9{996Ro_$7O>c(PWvS0qr@w68%nRTcvC(%B49;+1~Y_=%Ng1JT0%`C814>1G@8uLpz!Z9H&0csqj#YNr5IZKCN|#MI;1j z$>5QW6AA;d?G>+xChy!zQo5ma6hS5uc&lxsw8(Iflm9jem}Xy#Eu>MPhd=AOg_vM< zVaFr$`pC#gUc;r18 zg?}FL97i54>o|{-M|V9S;&hD0Ntxv79!2z=tRsJz3Igt-L4ZaEQ9G#daVp5O@?k1y zC-Z|;{0$Y)pa{)FGd>^=rDXXLD#}z;s3087k5N&lV#NlD8u=KWMM1m5JA)#l$T0p$GXi;B z*L3Z_GluqGI7Ga*VcUkT&0PaM{TZ<$`X8EU*Dp>W0`&6zd>o4lQr^I#%%-u literal 0 HcmV?d00001 diff --git a/app/modules/qbittorrent/qbittorrent.py b/app/modules/qbittorrent/qbittorrent.py new file mode 100644 index 00000000..1a7e475e --- /dev/null +++ b/app/modules/qbittorrent/qbittorrent.py @@ -0,0 +1,325 @@ +import time +from pathlib import Path +from typing import Optional, Union, Tuple + +import qbittorrentapi +from qbittorrentapi import TorrentFilesList +from qbittorrentapi.client import Client + +from app.core import settings +from app.log import logger +from app.utils.singleton import Singleton + + +class Qbittorrent(metaclass=Singleton): + + _host: str = None + _port: int = None + _username: str = None + _passowrd: str = None + + def __init__(self): + host = settings.QB_HOST + if host and host.find(":") != -1: + self._host = settings.QB_HOST.split(":")[0] + self._port = settings.QB_HOST.split(":")[1] + self._username = settings.QB_USER + self._password = settings.QB_PASSWORD + if self._host and self._port and self._username and self._password: + self.qbc = self.__login_qbittorrent() + + def __login_qbittorrent(self) -> Optional[Client]: + """ + 连接qbittorrent + :return: qbittorrent对象 + """ + try: + # 登录 + qbt = qbittorrentapi.Client(host=self._host, + port=self._port, + username=self._username, + password=self._password, + VERIFY_WEBUI_CERTIFICATE=False, + REQUESTS_ARGS={'timeout': (15, 60)}) + try: + qbt.auth_log_in() + except qbittorrentapi.LoginFailed as e: + print(str(e)) + return qbt + except Exception as err: + logger.error(f"qbittorrent 连接出错:{err}") + return None + + def get_torrents(self, ids: Union[str, list] = None, + status: Union[str, list] = None, tag: Union[str, list] = None) -> Tuple[list, bool]: + """ + 获取种子列表 + return: 种子列表, 是否发生异常 + """ + if not self.qbc: + return [], True + try: + torrents = self.qbc.torrents_info(torrent_hashes=ids, + status_filter=status) + if tag: + results = [] + if not isinstance(tag, list): + tag = [tag] + for torrent in torrents: + include_flag = True + for t in tag: + if t and t not in torrent.get("tags"): + include_flag = False + break + if include_flag: + results.append(torrent) + return results or [], False + return torrents or [], False + except Exception as err: + logger.error(f"获取种子列表出错:{err}") + return [], True + + def get_completed_torrents(self, ids: Union[str, list] = None, + tag: Union[str, list] = None) -> Optional[list]: + """ + 获取已完成的种子 + return: 种子列表, 如发生异常则返回None + """ + if not self.qbc: + return None + torrents, error = self.get_torrents(status=["completed"], ids=ids, tag=tag) + return None if error else torrents or [] + + def get_downloading_torrents(self, ids: Union[str, list] = None, + tag: Union[str, list] = None) -> Optional[list]: + """ + 获取正在下载的种子 + return: 种子列表, 如发生异常则返回None + """ + if not self.qbc: + return None + torrents, error = self.get_torrents(ids=ids, + status=["downloading"], + tag=tag) + return None if error else torrents or [] + + def remove_torrents_tag(self, ids: Union[str, list], tag: Union[str, list]) -> bool: + """ + 移除种子Tag + :param ids: 种子Hash列表 + :param tag: 标签内容 + """ + try: + self.qbc.torrents_delete_tags(torrent_hashes=ids, tags=tag) + return True + except Exception as err: + logger.error(f"移除种子Tag出错:{err}") + return False + + def set_torrents_status(self, ids: Union[str, list]): + """ + 设置种子状态为已整理,以及是否强制做种 + """ + if not self.qbc: + return + try: + # 打标签 + self.qbc.torrents_add_tags(tags="已整理", torrent_hashes=ids) + except Exception as err: + logger.error(f"设置种子Tag出错:{err}") + + def torrents_set_force_start(self, ids: Union[str, list]): + """ + 设置强制作种 + """ + try: + self.qbc.torrents_set_force_start(enable=True, torrent_hashes=ids) + except Exception as err: + logger.error(f"设置强制作种出错:{err}") + + def get_transfer_task(self, tag: Union[str, list] = None) -> Optional[list]: + """ + 获取下载文件转移任务种子 + """ + # 处理下载完成的任务 + torrents = self.get_completed_torrents() or [] + trans_tasks = [] + for torrent in torrents: + torrent_tags = torrent.get("tags") or "" + # 含"已整理"tag的不处理 + if "已整理" in torrent_tags: + continue + # 开启标签隔离,未包含指定标签的不处理 + if tag and tag not in torrent_tags: + logger.debug(f"{torrent.get('name')} 未包含指定标签:{tag}") + continue + path = torrent.get("save_path") + # 无法获取下载路径的不处理 + if not path: + logger.warn(f"未获取到 {torrent.get('name')} 下载保存路径") + continue + content_path = torrent.get("content_path") + if content_path: + trans_name = content_path.replace(path, "").replace("\\", "/") + if trans_name.startswith('/'): + trans_name = trans_name[1:] + else: + trans_name = torrent.get('name') + trans_tasks.append({ + 'path': Path(settings.DOWNLOAD_PATH) / trans_name, + 'id': torrent.get('hash') + }) + return trans_tasks + + def __get_last_add_torrentid_by_tag(self, tag: Union[str, list], + status: Union[str, list] = None) -> Optional[str]: + """ + 根据种子的下载链接获取下载中或暂停的钟子的ID + :return: 种子ID + """ + try: + torrents, _ = self.get_torrents(status=status, tag=tag) + except Exception as err: + logger.error(f"获取种子列表出错:{err}") + return None + if torrents: + return torrents[0].get("hash") + else: + return None + + def get_torrent_id_by_tag(self, tag: Union[str, list], + status: Union[str, list] = None) -> Optional[str]: + """ + 通过标签多次尝试获取刚添加的种子ID,并移除标签 + """ + torrent_id = None + # QB添加下载后需要时间,重试5次每次等待5秒 + for i in range(1, 6): + time.sleep(5) + torrent_id = self.__get_last_add_torrentid_by_tag(tag=tag, + status=status) + if torrent_id is None: + continue + else: + self.remove_torrents_tag(torrent_id, tag) + break + return torrent_id + + def add_torrent(self, + content: Union[str, bytes], + is_paused: bool = False, + download_dir: str = None, + tag: Union[str, list] = None, + cookie=None + ) -> bool: + """ + 添加种子 + :param content: 种子urls或文件内容 + :param is_paused: 添加后暂停 + :param tag: 标签 + :param download_dir: 下载路径 + :param cookie: 站点Cookie用于辅助下载种子 + :return: bool + """ + if not self.qbc or not content: + return False + + if isinstance(content, str): + urls = content + torrent_files = None + else: + urls = None + torrent_files = content + + if download_dir: + save_path = download_dir + is_auto = False + else: + save_path = None + is_auto = None + + if tag: + tags = tag + else: + tags = None + + try: + + # 添加下载 + qbc_ret = self.qbc.torrents_add(urls=urls, + torrent_files=torrent_files, + save_path=save_path, + is_paused=is_paused, + tags=tags, + use_auto_torrent_management=is_auto, + cookie=cookie) + return True if qbc_ret and str(qbc_ret).find("Ok") != -1 else False + except Exception as err: + logger.error(f"添加种子出错:{err}") + return False + + def start_torrents(self, ids: Union[str, list]) -> bool: + """ + 启动种子 + """ + if not self.qbc: + return False + try: + self.qbc.torrents_resume(torrent_hashes=ids) + return True + except Exception as err: + logger.error(f"启动种子出错:{err}") + return False + + def stop_torrents(self, ids: Union[str, list]) -> bool: + """ + 暂停种子 + """ + if not self.qbc: + return False + try: + self.qbc.torrents_pause(torrent_hashes=ids) + return True + except Exception as err: + logger.error(f"暂停种子出错:{err}") + return False + + def delete_torrents(self, delete_file: bool, ids: Union[str, list]) -> bool: + """ + 删除种子 + """ + if not self.qbc: + return False + if not ids: + return False + try: + self.qbc.torrents_delete(delete_files=delete_file, torrent_hashes=ids) + return True + except Exception as err: + logger.error(f"删除种子出错:{err}") + return False + + def get_files(self, tid: str) -> Optional[TorrentFilesList]: + """ + 获取种子文件清单 + """ + try: + return self.qbc.torrents_files(torrent_hash=tid) + except Exception as err: + logger.error(f"获取种子文件列表出错:{err}") + return None + + def set_files(self, **kwargs) -> bool: + """ + 设置下载文件的状态,priority为0为不下载,priority为1为下载 + """ + if not kwargs.get("torrent_hash") or not kwargs.get("file_ids"): + return False + try: + self.qbc.torrents_file_priority(torrent_hash=kwargs.get("torrent_hash"), + file_ids=kwargs.get("file_ids"), + priority=kwargs.get("priority")) + return True + except Exception as err: + logger.error(f"设置种子文件状态出错:{err}") + return False diff --git a/app/modules/telegram/__init__.py b/app/modules/telegram/__init__.py new file mode 100644 index 00000000..9fbe2c85 --- /dev/null +++ b/app/modules/telegram/__init__.py @@ -0,0 +1,111 @@ +from typing import Optional, Union, List, Tuple + +from fastapi import Request + +from app.core import MediaInfo, TorrentInfo, settings +from app.log import logger +from app.modules import _ModuleBase +from app.modules.telegram.telegram import Telegram + + +class TelegramModule(_ModuleBase): + + telegram: Telegram = None + + def init_module(self) -> None: + self.telegram = Telegram() + + def init_setting(self) -> Tuple[str, Union[str, bool]]: + return "MESSAGER", "telegram" + + async def message_parser(self, request: Request) -> Optional[dict]: + """ + 解析消息内容,返回字典,注意以下约定值: + userid: 用户ID + username: 用户名 + text: 内容 + :param request: 请求体 + :return: 消息内容、用户ID + """ + """ + { + 'update_id': , + 'message': { + 'message_id': , + 'from': { + 'id': , + 'is_bot': False, + 'first_name': '', + 'username': '', + 'language_code': 'zh-hans' + }, + 'chat': { + 'id': , + 'first_name': '', + 'username': '', + 'type': 'private' + }, + 'date': , + 'text': '' + } + } + """ + msg_json: dict = await request.json() + if msg_json: + message = msg_json.get("message", {}) + text = message.get("text") + user_id = message.get("from", {}).get("id") + # 获取用户名 + user_name = message.get("from", {}).get("username") + if text: + logger.info(f"收到Telegram消息:userid={user_id}, username={user_name}, text={text}") + # 检查权限 + if text.startswith("/"): + if str(user_id) not in settings.TELEGRAM_ADMINS.split(',') \ + and str(user_id) != settings.TELEGRAM_CHAT_ID: + self.telegram.send_msg(title="只有管理员才有权限执行此命令", userid=user_id) + return {} + else: + if not str(user_id) in settings.TELEGRAM_USERS.split(','): + self.telegram.send_msg(title="你不在用户白名单中,无法使用此机器人", userid=user_id) + return {} + return { + "userid": user_id, + "username": user_name, + "text": text + } + return None + + def post_message(self, title: str, + text: str = None, image: str = None, userid: Union[str, int] = None) -> Optional[bool]: + """ + 发送消息 + :param title: 标题 + :param text: 内容 + :param image: 图片 + :param userid: 用户ID + :return: 成功或失败 + """ + return self.telegram.send_msg(title=title, text=text, image=image, userid=userid) + + def post_medias_message(self, title: str, items: List[MediaInfo], + userid: Union[str, int] = None) -> Optional[bool]: + """ + 发送媒体信息选择列表 + :param title: 标题 + :param items: 消息列表 + :param userid: 用户ID + :return: 成功或失败 + """ + return self.telegram.send_meidas_msg(title=title, medias=items, userid=userid) + + def post_torrents_message(self, title: str, items: List[TorrentInfo], + userid: Union[str, int] = None) -> Optional[bool]: + """ + TODO 发送种子信息选择列表 + :param title: 标题 + :param items: 消息列表 + :param userid: 用户ID + :return: 成功或失败 + """ + pass diff --git a/app/modules/telegram/__pycache__/__init__.cpython-310.pyc b/app/modules/telegram/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dc44a4ab27db176eed42d1338cbd9c356c4c79ab GIT binary patch literal 3505 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 bEOKs*xA- Optional[bool]: + """ + 发送Telegram消息 + :param title: 消息标题 + :param text: 消息内容 + :param image: 消息图片地址 + :param userid: 用户ID,如有则只发消息给该用户 + :userid: 发送消息的目标用户ID,为空则发给管理员 + """ + if not self._telegram_token or not self._telegram_chat_id: + return None + + if not title and not text: + logger.warn("标题和内容不能同时为空") + return False + + try: + # text中的Markdown特殊字符转义 + text = text.replace("[", r"\[").replace("_", r"\_").replace("*", r"\*").replace("`", r"\`") + # 拼装消息内容 + titles = str(title).split('\n') + if len(titles) > 1: + title = titles[0] + if not text: + text = "\n".join(titles[1:]) + else: + text = "%s\n%s" % ("\n".join(titles[1:]), text) + + if text: + caption = "*%s*\n%s" % (title, text.replace("\n\n", "\n")) + else: + caption = title + + if userid: + chat_id = userid + else: + chat_id = self._telegram_chat_id + + return self.__send_request(chat_id=chat_id, image=image, caption=caption) + + except Exception as msg_e: + logger.error(f"发送消息失败:{msg_e}") + return False + + def send_meidas_msg(self, medias: List[MediaInfo], userid: str = "", title: str = "") -> Optional[bool]: + """ + 发送媒体列表消息 + """ + if not self._telegram_token or not self._telegram_chat_id: + return None + + try: + index, image, caption = 1, "", "*%s*" % title + for media in medias: + if not image: + image = media.get_message_image() + if media.get_vote_string(): + caption = "%s\n%s. [%s](%s)\n%s,%s" % (caption, + index, + media.get_title_string(), + media.get_detail_url(), + media.get_type_string(), + media.get_vote_string()) + else: + caption = "%s\n%s. [%s](%s)\n%s" % (caption, + index, + media.get_title_string(), + media.get_detail_url(), + media.get_type_string()) + index += 1 + + if userid: + chat_id = userid + else: + chat_id = self._telegram_chat_id + + return self.__send_request(chat_id=chat_id, image=image, caption=caption) + + except Exception as msg_e: + logger.error(f"发送消息失败:{msg_e}") + return False + + def __send_request(self, chat_id="", image="", caption="") -> bool: + """ + 向Telegram发送报文 + """ + + def __res_parse(result): + if result and result.status_code == 200: + ret_json = result.json() + status = ret_json.get("ok") + if status: + return True + else: + logger.error( + f"发送消息错误,错误码:{ret_json.get('error_code')},错误原因:{ret_json.get('description')}") + return False + elif result is not None: + logger.error(f"发送消息错误,错误码:{result.status_code},错误原因:{result.reason}") + return False + else: + logger.error("发送消息错误,未知错误") + return False + + # 请求 + request = RequestUtils(proxies=settings.PROXY) + + # 发送图文消息 + if image: + res = request.get_res("https://api.telegram.org/bot%s/sendPhoto?" % self._telegram_token + urlencode( + {"chat_id": chat_id, "photo": image, "caption": caption, "parse_mode": "Markdown"})) + if __res_parse(res): + return True + else: + photo_req = request.get_res(image) + if photo_req and photo_req.content: + res = request.post_res("https://api.telegram.org/bot%s/sendPhoto" % self._telegram_token, + data={"chat_id": chat_id, "caption": caption, "parse_mode": "Markdown"}, + files={"photo": photo_req.content}) + if __res_parse(res): + return True + # 发送文本消息 + res = request.get_res("https://api.telegram.org/bot%s/sendMessage?" % self._telegram_token + urlencode( + {"chat_id": chat_id, "text": caption, "parse_mode": "Markdown"})) + return __res_parse(res) + + def __start_telegram_message_proxy(self): + logger.info("Telegram消息接收服务启动") + + def consume_messages(_offset: int, _sc_url: str, _ds_url: str) -> int: + try: + res = RequestUtils(proxies=settings.PROXY).get_res( + _sc_url + urlencode({"timeout": self._poll_timeout, "offset": _offset})) + if res and res.json(): + for msg in res.json().get("result", []): + # 无论本地是否成功,先更新offset,即消息最多成功消费一次 + _offset = msg["update_id"] + 1 + logger.debug("Telegram接收到消息: %s" % msg) + local_res = RequestUtils(timeout=10).post_res(_ds_url, json=msg) + logger.debug("Telegram message: %s processed, response is: %s" % (msg, local_res.text)) + except Exception as e: + logger.error("Telegram 消息接收出现错误: %s" % e) + return _offset + + offset = 0 + + while True: + if self._event.is_set(): + logger.info("Telegram消息接收服务已停止") + break + index = 0 + while index < 20 and not self._event.is_set(): + offset = consume_messages(_offset=offset, + _sc_url="https://api.telegram.org/bot%s/getUpdates?" % self._telegram_token, + _ds_url="http://127.0.0.1:%s/api/v1/messages?token=%s" % ( + settings.PORT, settings.API_TOKEN)) + index += 1 + + def stop(self): + """ + 停止Telegram消息接收服务 + """ + self._event.set() diff --git a/app/modules/themoviedb/__init__.py b/app/modules/themoviedb/__init__.py new file mode 100644 index 00000000..214cf5be --- /dev/null +++ b/app/modules/themoviedb/__init__.py @@ -0,0 +1,149 @@ +from typing import Optional, List, Tuple, Union + +from app.core import settings, MediaInfo +from app.core.meta import MetaBase +from app.modules import _ModuleBase +from app.modules.themoviedb.category import CategoryHelper +from app.modules.themoviedb.tmdb import TmdbHelper +from app.modules.themoviedb.tmdb_cache import TmdbCache +from app.utils.types import MediaType + + +class TheMovieDb(_ModuleBase): + """ + TMDB媒体信息匹配 + """ + + # 元数据缓存 + cache: TmdbCache = None + # TMDB + tmdb: TmdbHelper = None + # 二级分类 + category: CategoryHelper = None + + def init_module(self) -> None: + self.cache = TmdbCache() + self.tmdb = TmdbHelper() + self.category = CategoryHelper() + + def init_setting(self) -> Tuple[str, Union[str, bool]]: + pass + + def recognize_media(self, meta: MetaBase, + tmdbid: str = None) -> Optional[MediaInfo]: + """ + 识别媒体信息 + :param meta: 识别的元数据 + :param tmdbid: tmdbid + :return: 识别的媒体信息,包括剧集信息 + """ + if not meta: + return None + cache_info = self.cache.get(meta) + if not cache_info: + # 缓存没有或者强制不使用缓存 + if tmdbid: + # 直接查询详情 + info = self.tmdb.get_tmdb_info(mtype=meta.type, tmdbid=tmdbid) + else: + if meta.type != MediaType.TV and not meta.year: + info = self.tmdb.search_multi_tmdb(meta.get_name()) + else: + if meta.type == MediaType.TV: + # 确定是电视 + info = self.tmdb.search_tmdb(name=meta.get_name(), + year=meta.year, + mtype=meta.type, + season_year=meta.year, + season_number=meta.begin_season + ) + if meta.year: + # 非严格模式下去掉年份再查一次 + info = self.tmdb.search_tmdb(name=meta.get_name(), + mtype=meta.type) + else: + # 有年份先按电影查 + info = self.tmdb.search_tmdb(name=meta.get_name(), + year=meta.year, + mtype=MediaType.MOVIE) + # 没有再按电视剧查 + if not info: + info = self.tmdb.search_tmdb(name=meta.get_name(), + year=meta.year, + mtype=MediaType.TV + ) + if not info: + # 非严格模式下去掉年份和类型再查一次 + info = self.tmdb.search_multi_tmdb(name=meta.get_name()) + + if not info: + # 从网站查询 + info = self.tmdb.search_tmdb_web(name=meta.get_name(), + mtype=meta.type) + # 补充全量信息 + if info and not info.get("genres"): + info = self.tmdb.get_tmdb_info(mtype=info.get("media_type"), + tmdbid=info.get("id")) + # 保存到缓存 + self.cache.update(meta, info) + else: + # 使用缓存信息 + if cache_info.get("title"): + info = self.tmdb.get_tmdb_info(mtype=cache_info.get("type"), + tmdbid=cache_info.get("id")) + else: + info = None + # 赋值TMDB信息并返回 + mediainfo = MediaInfo(tmdb_info=info) + # 确定二级分类 + if info: + if info.get('media_type') == MediaType.MOVIE: + cat = self.category.get_movie_category(info) + else: + cat = self.category.get_tv_category(info) + mediainfo.set_category(cat) + + return mediainfo + + def search_medias(self, meta: MetaBase) -> Optional[List[MediaInfo]]: + """ + 搜索媒体信息 + :param meta: 识别的元数据 + :reutrn: 媒体信息 + """ + # 未启用时返回None + if settings.SEARCH_SOURCE != "themoviedb": + return None + + if not meta.get_name(): + return [] + if not meta.type and not meta.year: + results = self.tmdb.search_multi_tmdbinfos(meta.get_name()) + else: + if not meta.type: + results = list( + set(self.tmdb.search_movie_tmdbinfos(meta.get_name(), meta.year)) + .union(set(self.tmdb.search_tv_tmdbinfos(meta.get_name(), meta.year))) + ) + # 组合结果的情况下要排序 + results = sorted( + results, + key=lambda x: x.get("release_date") or x.get("first_air_date") or "0000-00-00", + reverse=True + ) + elif meta.type == MediaType.MOVIE: + results = self.tmdb.search_movie_tmdbinfos(meta.get_name(), meta.year) + else: + results = self.tmdb.search_tv_tmdbinfos(meta.get_name(), meta.year) + + return [MediaInfo(tmdb_info=info) for info in results] + + def scrape_metadata(self, path: str, mediainfo: MediaInfo) -> None: + """ + TODO 刮削元数据 + :param path: 媒体文件路径 + :param mediainfo: 识别的媒体信息 + :return: 成功或失败 + """ + if settings.SCRAP_SOURCE != "themoviedb": + return None diff --git a/app/modules/themoviedb/__pycache__/__init__.cpython-310.pyc b/app/modules/themoviedb/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0982eeabd095692fa070c0696f45793336620384 GIT binary patch literal 4063 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 literal 0 HcmV?d00001 diff --git a/app/modules/themoviedb/__pycache__/tmdb.cpython-310.pyc b/app/modules/themoviedb/__pycache__/tmdb.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2d865e390af09dd6a6fbd0e579543a67b5448721 GIT binary patch literal 15935 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 P16!j%TQ?CDM~uG#V`#aR literal 0 HcmV?d00001 diff --git a/app/modules/themoviedb/category.py b/app/modules/themoviedb/category.py new file mode 100644 index 00000000..455bac86 --- /dev/null +++ b/app/modules/themoviedb/category.py @@ -0,0 +1,128 @@ +import shutil +from pathlib import Path + +import ruamel.yaml + +from app.core import settings +from app.log import logger +from app.utils.singleton import Singleton + + +class CategoryHelper(metaclass=Singleton): + + def __init__(self): + self._category_path: Path = settings.CONFIG_PATH / "category.yaml" + # 二级分类策略关闭 + if not settings.LIBRARY_CATEGORY: + return + try: + if not self._category_path.exists(): + shutil.copy(settings.INNER_CONFIG_PATH / "category.yaml", self._category_path) + with open(self._category_path, mode='r', encoding='utf-8') as f: + try: + yaml = ruamel.yaml.YAML() + self._categorys = yaml.load(f) + except Exception as e: + logger.warn(f"二级分类策略配置文件格式出现严重错误!请检查:{str(e)}") + self._categorys = {} + except Exception as err: + logger.warn(f"二级分类策略配置文件加载出错:{err}") + + if self._categorys: + self._movie_categorys = self._categorys.get('movie') + self._tv_categorys = self._categorys.get('tv') + logger.info(f"已加载二级分类策略 category.yaml") + + @property + def is_movie_category(self) -> bool: + """ + 获取电影分类标志 + """ + if self._movie_categorys: + return True + return False + + @property + def is_tv_category(self) -> bool: + """ + 获取电视剧分类标志 + """ + if self._tv_categorys: + return True + return False + + @property + def movie_categorys(self) -> list: + """ + 获取电影分类清单 + """ + if not self._movie_categorys: + return [] + return self._movie_categorys.keys() + + @property + def tv_categorys(self) -> list: + """ + 获取电视剧分类清单 + """ + if not self._tv_categorys: + return [] + return self._tv_categorys.keys() + + def get_movie_category(self, tmdb_info) -> str: + """ + 判断电影的分类 + :param tmdb_info: 识别的TMDB中的信息 + :return: 二级分类的名称 + """ + return self.get_category(self._movie_categorys, tmdb_info) + + def get_tv_category(self, tmdb_info) -> str: + """ + 判断电视剧的分类 + :param tmdb_info: 识别的TMDB中的信息 + :return: 二级分类的名称 + """ + return self.get_category(self._tv_categorys, tmdb_info) + + @staticmethod + def get_category(categorys: dict, tmdb_info: dict) -> str: + """ + 根据 TMDB信息与分类配置文件进行比较,确定所属分类 + :param categorys: 分类配置 + :param tmdb_info: TMDB信息 + :return: 分类的名称 + """ + if not tmdb_info: + return "" + if not categorys: + return "" + for key, item in categorys.items(): + if not item: + return key + match_flag = True + for attr, value in item.items(): + if not value: + continue + info_value = tmdb_info.get(attr) + if not info_value: + match_flag = False + continue + elif attr == "production_countries": + info_values = [str(val.get("iso_3166_1")).upper() for val in info_value] + else: + if isinstance(info_value, list): + info_values = [str(val).upper() for val in info_value] + else: + info_values = [str(info_value).upper()] + + if value.find(",") != -1: + values = [str(val).upper() for val in value.split(",")] + else: + values = [str(value).upper()] + + if not set(values).intersection(set(info_values)): + match_flag = False + if match_flag: + return key + return "" diff --git a/app/modules/themoviedb/tmdb.py b/app/modules/themoviedb/tmdb.py new file mode 100644 index 00000000..6cafb515 --- /dev/null +++ b/app/modules/themoviedb/tmdb.py @@ -0,0 +1,895 @@ +from functools import lru_cache +from typing import Optional, Tuple, List + +import zhconv +from lxml import etree +from tmdbv3api import TMDb, Search, Movie, TV +from tmdbv3api.exceptions import TMDbException + +from app.core import settings +from app.log import logger +from app.utils.http import RequestUtils +from app.utils.string import StringUtils +from app.utils.types import MediaType + + +class TmdbHelper: + """ + TMDB识别匹配 + """ + + tmdb: TMDb = None + search: Search = None + movie: Movie = None + tv: TV = None + + def __init__(self): + # TMDB主体 + self.tmdb = TMDb() + # 域名 + self.tmdb.domain = settings.TMDB_API_DOMAIN + # 开启缓存 + self.tmdb.cache = True + # 缓存大小 + self.tmdb.REQUEST_CACHE_MAXSIZE = 256 + # APIKEY + self.tmdb.api_key = settings.TMDB_API_KEY + # 语种 + self.tmdb.language = 'zh' + # 代理 + self.tmdb.proxies = settings.PROXY + # 调试模式 + self.tmdb.debug = False + # 查询对象 + self.search = Search() + self.movie = Movie() + self.tv = TV() + + def search_multi_tmdbinfos(self, title: str) -> List[dict]: + """ + 同时查询模糊匹配的电影、电视剧TMDB信息 + """ + if not title: + return [] + ret_infos = [] + multis = self.search.multi({"query": title}) or [] + for multi in multis: + if multi.get("media_type") in ["movie", "tv"]: + multi['media_type'] = MediaType.MOVIE if multi.get("media_type") == "movie" else MediaType.TV + ret_infos.append(multi) + return ret_infos + + def search_movie_tmdbinfos(self, title: str, year: str) -> List[dict]: + """ + 查询模糊匹配的所有电影TMDB信息 + """ + if not title: + return [] + ret_infos = [] + if year: + movies = self.search.movies({"query": title, "year": year}) or [] + else: + movies = self.search.movies({"query": title}) or [] + for movie in movies: + if title in movie.get("title"): + movie['media_type'] = MediaType.MOVIE + ret_infos.append(movie) + return ret_infos + + def search_tv_tmdbinfos(self, title: str, year: str) -> List[dict]: + """ + 查询模糊匹配的所有电视剧TMDB信息 + """ + if not title: + return [] + ret_infos = [] + if year: + tvs = self.search.tv_shows({"query": title, "first_air_date_year": year}) or [] + else: + tvs = self.search.tv_shows({"query": title}) or [] + for tv in tvs: + if title in tv.get("name"): + tv['media_type'] = MediaType.TV + ret_infos.append(tv) + return ret_infos + + @staticmethod + def __compare_tmdb_names(file_name: str, tmdb_names: list) -> bool: + """ + 比较文件名是否匹配,忽略大小写和特殊字符 + :param file_name: 识别的文件名或者种子名 + :param tmdb_names: TMDB返回的译名 + :return: True or False + """ + if not file_name or not tmdb_names: + return False + if not isinstance(tmdb_names, list): + tmdb_names = [tmdb_names] + file_name = StringUtils.clear_special_chars(file_name).upper() + for tmdb_name in tmdb_names: + tmdb_name = StringUtils.clear_special_chars(tmdb_name).strip().upper() + if file_name == tmdb_name: + return True + return False + + def __get_tmdb_names(self, mtype: MediaType, tmdb_id: str) -> Tuple[Optional[dict], List[str]]: + """ + 搜索tmdb中所有的标题和译名,用于名称匹配 + :param mtype: 类型:电影、电视剧、动漫 + :param tmdb_id: TMDB的ID + :return: 所有译名的清单 + """ + if not mtype or not tmdb_id: + return {}, [] + ret_names = [] + tmdb_info = self.get_tmdb_info(mtype=mtype, tmdbid=tmdb_id) + if not tmdb_info: + return tmdb_info, [] + if mtype == MediaType.MOVIE: + alternative_titles = tmdb_info.get("alternative_titles", {}).get("titles", []) + for alternative_title in alternative_titles: + title = alternative_title.get("title") + if title and title not in ret_names: + ret_names.append(title) + translations = tmdb_info.get("translations", {}).get("translations", []) + for translation in translations: + title = translation.get("data", {}).get("title") + if title and title not in ret_names: + ret_names.append(title) + else: + alternative_titles = tmdb_info.get("alternative_titles", {}).get("results", []) + for alternative_title in alternative_titles: + name = alternative_title.get("title") + if name and name not in ret_names: + ret_names.append(name) + translations = tmdb_info.get("translations", {}).get("translations", []) + for translation in translations: + name = translation.get("data", {}).get("name") + if name and name not in ret_names: + ret_names.append(name) + return tmdb_info, ret_names + + def search_tmdb(self, name: str, + mtype: MediaType, + year: str = None, + season_year: str = None, + season_number: int = None) -> Optional[dict]: + """ + 搜索tmdb中的媒体信息,匹配返回一条尽可能正确的信息 + :param name: 剑索的名称 + :param mtype: 类型:电影、电视剧 + :param year: 年份,如要是季集需要是首播年份(first_air_date) + :param season_year: 当前季集年份 + :param season_number: 季集,整数 + :return: TMDB的INFO,同时会将mtype赋值到media_type中 + """ + if not self.search: + return None + if not name: + return None + # TMDB搜索 + info = {} + if mtype == MediaType.MOVIE: + year_range = [year] + if year: + year_range.append(str(int(year) + 1)) + year_range.append(str(int(year) - 1)) + for year in year_range: + logger.debug( + f"正在识别{mtype.value}:{name}, 年份={year} ...") + info = self.__search_movie_by_name(name, year) + if info: + info['media_type'] = MediaType.MOVIE + logger.info("%s 识别到 电影:TMDBID=%s, 名称=%s, 上映日期=%s" % ( + name, + info.get('id'), + info.get('title'), + info.get('release_date'))) + break + else: + # 有当前季和当前季集年份,使用精确匹配 + if season_year and season_number: + logger.debug( + f"正在识别{mtype.value}:{name}, 季集={season_number}, 季集年份={season_year} ...") + info = self.__search_tv_by_season(name, + season_year, + season_number) + if not info: + logger.debug( + f"正在识别{mtype.value}:{name}, 年份={year} ...") + info = self.__search_tv_by_name(name, + year) + if info: + info['media_type'] = MediaType.TV + logger.info("%s 识别到 电视剧:TMDBID=%s, 名称=%s, 首播日期=%s" % ( + name, + info.get('id'), + info.get('name'), + info.get('first_air_date'))) + # 返回 + if not info: + logger.info("%s 以年份 %s 在TMDB中未找到%s信息!" % ( + name, year, mtype.value if mtype else "")) + return info + + def __search_movie_by_name(self, name: str, year: str) -> Optional[dict]: + """ + 根据名称查询电影TMDB匹配 + :param name: 识别的文件名或种子名 + :param year: 电影上映日期 + :return: 匹配的媒体信息 + """ + try: + if year: + movies = self.search.movies({"query": name, "year": year}) + else: + movies = self.search.movies({"query": name}) + except TMDbException as err: + logger.error(f"连接TMDB出错:{err}") + return None + except Exception as e: + logger.error(f"连接TMDB出错:{str(e)}") + return None + logger.debug(f"API返回:{str(self.search.total_results)}") + if len(movies) == 0: + logger.debug(f"{name} 未找到相关电影信息!") + return {} + else: + info = {} + if year: + for movie in movies: + if movie.get('release_date'): + if self.__compare_tmdb_names(name, movie.get('title')) \ + and movie.get('release_date')[0:4] == str(year): + return movie + if self.__compare_tmdb_names(name, movie.get('original_title')) \ + and movie.get('release_date')[0:4] == str(year): + return movie + else: + for movie in movies: + if self.__compare_tmdb_names(name, movie.get('title')) \ + or self.__compare_tmdb_names(name, movie.get('original_title')): + return movie + if not info: + index = 0 + for movie in movies: + if year: + if not movie.get('release_date'): + continue + if movie.get('release_date')[0:4] != str(year): + continue + index += 1 + info, names = self.__get_tmdb_names(MediaType.MOVIE, movie.get("id")) + if self.__compare_tmdb_names(name, names): + return info + else: + index += 1 + info, names = self.__get_tmdb_names(MediaType.MOVIE, movie.get("id")) + if self.__compare_tmdb_names(name, names): + return info + if index > 5: + break + return {} + + def __search_tv_by_name(self, name: str, year: str) -> Optional[dict]: + """ + 根据名称查询电视剧TMDB匹配 + :param name: 识别的文件名或者种子名 + :param year: 电视剧的首播年份 + :return: 匹配的媒体信息 + """ + try: + if year: + tvs = self.search.tv_shows({"query": name, "first_air_date_year": year}) + else: + tvs = self.search.tv_shows({"query": name}) + except TMDbException as err: + logger.error(f"连接TMDB出错:{err}") + return None + except Exception as e: + logger.error(f"连接TMDB出错:{str(e)}") + return None + logger.debug(f"API返回:{str(self.search.total_results)}") + if len(tvs) == 0: + logger.debug(f"{name} 未找到相关剧集信息!") + return {} + else: + info = {} + if year: + for tv in tvs: + if tv.get('first_air_date'): + if self.__compare_tmdb_names(name, tv.get('name')) \ + and tv.get('first_air_date')[0:4] == str(year): + return tv + if self.__compare_tmdb_names(name, tv.get('original_name')) \ + and tv.get('first_air_date')[0:4] == str(year): + return tv + else: + for tv in tvs: + if self.__compare_tmdb_names(name, tv.get('name')) \ + or self.__compare_tmdb_names(name, tv.get('original_name')): + return tv + if not info: + index = 0 + for tv in tvs: + if year: + if not tv.get('first_air_date'): + continue + if tv.get('first_air_date')[0:4] != str(year): + continue + index += 1 + info, names = self.__get_tmdb_names(MediaType.TV, tv.get("id")) + if self.__compare_tmdb_names(name, names): + return info + else: + index += 1 + info, names = self.__get_tmdb_names(MediaType.TV, tv.get("id")) + if self.__compare_tmdb_names(name, names): + return info + if index > 5: + break + return {} + + def __search_tv_by_season(self, name: str, season_year: str, season_number: int) -> Optional[dict]: + """ + 根据电视剧的名称和季的年份及序号匹配TMDB + :param name: 识别的文件名或者种子名 + :param season_year: 季的年份 + :param season_number: 季序号 + :return: 匹配的媒体信息 + """ + + def __season_match(tv_info: dict, _season_year: str) -> bool: + if not tv_info: + return False + try: + seasons = self.__get_tmdb_tv_seasons(tv_info) + for season, season_info in seasons.values(): + if season_info.get("air_date"): + if season.get("air_date")[0:4] == str(_season_year) \ + and season == int(season_number): + return True + except Exception as e1: + logger.error(f"连接TMDB出错:{e1}") + return False + return False + + try: + tvs = self.search.tv_shows({"query": name}) + except TMDbException as err: + logger.error(f"连接TMDB出错:{err}") + return None + except Exception as e: + logger.error(f"连接TMDB出错:{e}") + return None + + if len(tvs) == 0: + logger.debug("%s 未找到季%s相关信息!" % (name, season_number)) + return {} + else: + for tv in tvs: + if (self.__compare_tmdb_names(name, tv.get('name')) + or self.__compare_tmdb_names(name, tv.get('original_name'))) \ + and (tv.get('first_air_date') and tv.get('first_air_date')[0:4] == str(season_year)): + return tv + + for tv in tvs[:5]: + info, names = self.__get_tmdb_names(MediaType.TV, tv.get("id")) + if not self.__compare_tmdb_names(name, names): + continue + if __season_match(tv_info=info, _season_year=season_year): + return info + return {} + + @staticmethod + def __get_tmdb_tv_seasons(tv_info: dict) -> Optional[dict]: + """ + 查询TMDB电视剧的所有季 + :param tv_info: TMDB 的季信息 + :return: 包括每季集数的字典 + """ + """ + "seasons": [ + { + "air_date": "2006-01-08", + "episode_count": 11, + "id": 3722, + "name": "特别篇", + "overview": "", + "poster_path": "/snQYndfsEr3Sto2jOmkmsQuUXAQ.jpg", + "season_number": 0 + }, + { + "air_date": "2005-03-27", + "episode_count": 9, + "id": 3718, + "name": "第 1 季", + "overview": "", + "poster_path": "/foM4ImvUXPrD2NvtkHyixq5vhPx.jpg", + "season_number": 1 + } + ] + """ + if not tv_info: + return {} + ret_seasons = {} + for season_info in tv_info.get("seasons") or []: + if not season_info.get("season_number"): + continue + ret_seasons[season_info.get("season_number")] = season_info + return ret_seasons + + def search_multi_tmdb(self, name: str) -> Optional[dict]: + """ + 根据名称同时查询电影和电视剧,不带年份 + :param name: 识别的文件名或种子名 + :return: 匹配的媒体信息 + """ + try: + multis = self.search.multi({"query": name}) or [] + except TMDbException as err: + logger.error(f"连接TMDB出错:{err}") + return None + except Exception as e: + logger.error(f"连接TMDB出错:{str(e)}") + return None + logger.debug(f"API返回:{str(self.search.total_results)}") + if len(multis) == 0: + logger.debug(f"{name} 未找到相关媒体息!") + return {} + else: + info = {} + for multi in multis: + if multi.get("media_type") == "movie": + if self.__compare_tmdb_names(name, multi.get('title')) \ + or self.__compare_tmdb_names(name, multi.get('original_title')): + info = multi + elif multi.get("media_type") == "tv": + if self.__compare_tmdb_names(name, multi.get('name')) \ + or self.__compare_tmdb_names(name, multi.get('original_name')): + info = multi + if not info: + for multi in multis[:5]: + if multi.get("media_type") == "movie": + movie_info, names = self.__get_tmdb_names(MediaType.MOVIE, multi.get("id")) + if self.__compare_tmdb_names(name, names): + info = movie_info + elif multi.get("media_type") == "tv": + tv_info, names = self.__get_tmdb_names(MediaType.TV, multi.get("id")) + if self.__compare_tmdb_names(name, names): + info = tv_info + # 返回 + if info: + info['media_type'] = MediaType.MOVIE if info.get('media_type') in ['movie', + MediaType.MOVIE] else MediaType.TV + else: + logger.info("%s 在TMDB中未找到媒体信息!" % name) + return info + + @lru_cache(maxsize=128) + def search_tmdb_web(self, name: str, mtype: MediaType) -> Optional[dict]: + """ + 搜索TMDB网站,直接抓取结果,结果只有一条时才返回 + :param name: 名称 + :param mtype: 媒体类型 + """ + if not name: + return None + if StringUtils.is_chinese(name): + return {} + logger.info("正在从TheDbMovie网站查询:%s ..." % name) + tmdb_url = "https://www.themoviedb.org/search?query=%s" % name + res = RequestUtils(timeout=5).get_res(url=tmdb_url) + if res and res.status_code == 200: + html_text = res.text + if not html_text: + return None + try: + tmdb_links = [] + html = etree.HTML(html_text) + if mtype == MediaType.TV: + links = html.xpath("//a[@data-id and @data-media-type='tv']/@href") + else: + links = html.xpath("//a[@data-id]/@href") + for link in links: + if not link or (not link.startswith("/tv") and not link.startswith("/movie")): + continue + if link not in tmdb_links: + tmdb_links.append(link) + if len(tmdb_links) == 1: + tmdbinfo = self.get_tmdb_info( + mtype=MediaType.TV if tmdb_links[0].startswith("/tv") else MediaType.MOVIE, + tmdbid=tmdb_links[0].split("/")[-1]) + if tmdbinfo: + if mtype == MediaType.TV and tmdbinfo.get('media_type') != MediaType.TV: + return {} + if tmdbinfo.get('media_type') == MediaType.MOVIE: + logger.info("%s 从WEB识别到 电影:TMDBID=%s, 名称=%s, 上映日期=%s" % ( + name, + tmdbinfo.get('id'), + tmdbinfo.get('title'), + tmdbinfo.get('release_date'))) + else: + logger.info("%s 从WEB识别到 电视剧:TMDBID=%s, 名称=%s, 首播日期=%s" % ( + name, + tmdbinfo.get('id'), + tmdbinfo.get('name'), + tmdbinfo.get('first_air_date'))) + return tmdbinfo + elif len(tmdb_links) > 1: + logger.info("%s TMDB网站返回数据过多:%s" % (name, len(tmdb_links))) + else: + logger.info("%s TMDB网站未查询到媒体信息!" % name) + except Exception as err: + print(str(err)) + return None + return None + + def get_tmdb_info(self, + mtype: MediaType, + tmdbid: str) -> dict: + """ + 给定TMDB号,查询一条媒体信息 + :param mtype: 类型:电影、电视剧、动漫,为空时都查(此时用不上年份) + :param tmdbid: TMDB的ID,有tmdbid时优先使用tmdbid,否则使用年份和标题 + """ + + def __get_genre_ids(genres: list) -> list: + """ + 从TMDB详情中获取genre_id列表 + """ + if not genres: + return [] + genre_ids = [] + for genre in genres: + genre_ids.append(genre.get('id')) + return genre_ids + + # 设置语言 + if mtype == MediaType.MOVIE: + tmdb_info = self.__get_tmdb_movie_detail(tmdbid) + if tmdb_info: + tmdb_info['media_type'] = MediaType.MOVIE + else: + tmdb_info = self.__get_tmdb_tv_detail(tmdbid) + if tmdb_info: + tmdb_info['media_type'] = MediaType.TV + if tmdb_info: + # 转换genreid + tmdb_info['genre_ids'] = __get_genre_ids(tmdb_info.get('genres')) + # 转换中文标题 + self.__update_tmdbinfo_cn_title(tmdb_info) + + return tmdb_info + + @staticmethod + def __update_tmdbinfo_cn_title(tmdb_info: dict): + """ + 更新TMDB信息中的中文名称 + """ + + def __get_tmdb_chinese_title(tmdbinfo): + """ + 从别名中获取中文标题 + """ + if not tmdbinfo: + return None + if tmdbinfo.get("media_type") == MediaType.MOVIE: + alternative_titles = tmdbinfo.get("alternative_titles", {}).get("titles", []) + else: + alternative_titles = tmdbinfo.get("alternative_titles", {}).get("results", []) + for alternative_title in alternative_titles: + iso_3166_1 = alternative_title.get("iso_3166_1") + if iso_3166_1 == "CN": + title = alternative_title.get("title") + if title and StringUtils.is_chinese(title) \ + and zhconv.convert(title, "zh-hans") == title: + return title + return tmdbinfo.get("title") if tmdbinfo.get("media_type") == MediaType.MOVIE else tmdbinfo.get("name") + + # 查找中文名 + org_title = tmdb_info.get("title") \ + if tmdb_info.get("media_type") == MediaType.MOVIE \ + else tmdb_info.get("name") + if not StringUtils.is_chinese(org_title): + cn_title = __get_tmdb_chinese_title(tmdb_info) + if cn_title and cn_title != org_title: + if tmdb_info.get("media_type") == MediaType.MOVIE: + tmdb_info['title'] = cn_title + else: + tmdb_info['name'] = cn_title + + def __get_tmdb_movie_detail(self, + tmdbid: str, + append_to_response: str = "images," + "credits," + "alternative_titles," + "translations," + "external_ids") -> Optional[dict]: + """ + 获取电影的详情 + :param tmdbid: TMDB ID + :return: TMDB信息 + """ + """ + { + "adult": false, + "backdrop_path": "/r9PkFnRUIthgBp2JZZzD380MWZy.jpg", + "belongs_to_collection": { + "id": 94602, + "name": "穿靴子的猫(系列)", + "poster_path": "/anHwj9IupRoRZZ98WTBvHpTiE6A.jpg", + "backdrop_path": "/feU1DWV5zMWxXUHJyAIk3dHRQ9c.jpg" + }, + "budget": 90000000, + "genres": [ + { + "id": 16, + "name": "动画" + }, + { + "id": 28, + "name": "动作" + }, + { + "id": 12, + "name": "冒险" + }, + { + "id": 35, + "name": "喜剧" + }, + { + "id": 10751, + "name": "家庭" + }, + { + "id": 14, + "name": "奇幻" + } + ], + "homepage": "", + "id": 315162, + "imdb_id": "tt3915174", + "original_language": "en", + "original_title": "Puss in Boots: The Last Wish", + "overview": "时隔11年,臭屁自大又爱卖萌的猫大侠回来了!如今的猫大侠(安东尼奥·班德拉斯 配音),依旧幽默潇洒又不拘小节、数次“花式送命”后,九条命如今只剩一条,于是不得不请求自己的老搭档兼“宿敌”——迷人的软爪妞(萨尔玛·海耶克 配音)来施以援手来恢复自己的九条生命。", + "popularity": 8842.129, + "poster_path": "/rnn30OlNPiC3IOoWHKoKARGsBRK.jpg", + "production_companies": [ + { + "id": 33, + "logo_path": "/8lvHyhjr8oUKOOy2dKXoALWKdp0.png", + "name": "Universal Pictures", + "origin_country": "US" + }, + { + "id": 521, + "logo_path": "/kP7t6RwGz2AvvTkvnI1uteEwHet.png", + "name": "DreamWorks Animation", + "origin_country": "US" + } + ], + "production_countries": [ + { + "iso_3166_1": "US", + "name": "United States of America" + } + ], + "release_date": "2022-12-07", + "revenue": 260725470, + "runtime": 102, + "spoken_languages": [ + { + "english_name": "English", + "iso_639_1": "en", + "name": "English" + }, + { + "english_name": "Spanish", + "iso_639_1": "es", + "name": "Español" + } + ], + "status": "Released", + "tagline": "", + "title": "穿靴子的猫2", + "video": false, + "vote_average": 8.614, + "vote_count": 2291 + } + """ + if not self.movie: + return {} + try: + logger.info("正在查询TMDB电影:%s ..." % tmdbid) + tmdbinfo = self.movie.details(tmdbid, append_to_response) + if tmdbinfo: + logger.info(f"{tmdbid} 查询结果:{tmdbinfo.get('title')}") + return tmdbinfo or {} + except Exception as e: + print(str(e)) + return None + + def __get_tmdb_tv_detail(self, + tmdbid: str, + append_to_response: str = "images," + "credits," + "alternative_titles," + "translations," + "external_ids") -> Optional[dict]: + """ + 获取电视剧的详情 + :param tmdbid: TMDB ID + :return: TMDB信息 + """ + """ + { + "adult": false, + "backdrop_path": "/uDgy6hyPd82kOHh6I95FLtLnj6p.jpg", + "created_by": [ + { + "id": 35796, + "credit_id": "5e84f06a3344c600153f6a57", + "name": "Craig Mazin", + "gender": 2, + "profile_path": "/uEhna6qcMuyU5TP7irpTUZ2ZsZc.jpg" + }, + { + "id": 1295692, + "credit_id": "5e84f03598f1f10016a985c0", + "name": "Neil Druckmann", + "gender": 2, + "profile_path": "/bVUsM4aYiHbeSYE1xAw2H5Z1ANU.jpg" + } + ], + "episode_run_time": [], + "first_air_date": "2023-01-15", + "genres": [ + { + "id": 18, + "name": "剧情" + }, + { + "id": 10765, + "name": "Sci-Fi & Fantasy" + }, + { + "id": 10759, + "name": "动作冒险" + } + ], + "homepage": "https://www.hbo.com/the-last-of-us", + "id": 100088, + "in_production": true, + "languages": [ + "en" + ], + "last_air_date": "2023-01-15", + "last_episode_to_air": { + "air_date": "2023-01-15", + "episode_number": 1, + "id": 2181581, + "name": "当你迷失在黑暗中", + "overview": "在一场全球性的流行病摧毁了文明之后,一个顽强的幸存者负责照顾一个 14 岁的小女孩,她可能是人类最后的希望。", + "production_code": "", + "runtime": 81, + "season_number": 1, + "show_id": 100088, + "still_path": "/aRquEWm8wWF1dfa9uZ1TXLvVrKD.jpg", + "vote_average": 8, + "vote_count": 33 + }, + "name": "最后生还者", + "next_episode_to_air": { + "air_date": "2023-01-22", + "episode_number": 2, + "id": 4071039, + "name": "虫草变异菌", + "overview": "", + "production_code": "", + "runtime": 55, + "season_number": 1, + "show_id": 100088, + "still_path": "/jkUtYTmeap6EvkHI4n0j5IRFrIr.jpg", + "vote_average": 10, + "vote_count": 1 + }, + "networks": [ + { + "id": 49, + "name": "HBO", + "logo_path": "/tuomPhY2UtuPTqqFnKMVHvSb724.png", + "origin_country": "US" + } + ], + "number_of_episodes": 9, + "number_of_seasons": 1, + "origin_country": [ + "US" + ], + "original_language": "en", + "original_name": "The Last of Us", + "overview": "不明真菌疫情肆虐之后的美国,被真菌感染的人都变成了可怕的怪物,乔尔(Joel)为了换回武器答应将小女孩儿艾莉(Ellie)送到指定地点,由此开始了两人穿越美国的漫漫旅程。", + "popularity": 5585.639, + "poster_path": "/nOY3VBFO0VnlN9nlRombnMTztyh.jpg", + "production_companies": [ + { + "id": 3268, + "logo_path": "/tuomPhY2UtuPTqqFnKMVHvSb724.png", + "name": "HBO", + "origin_country": "US" + }, + { + "id": 11073, + "logo_path": "/aCbASRcI1MI7DXjPbSW9Fcv9uGR.png", + "name": "Sony Pictures Television Studios", + "origin_country": "US" + }, + { + "id": 23217, + "logo_path": "/kXBZdQigEf6QiTLzo6TFLAa7jKD.png", + "name": "Naughty Dog", + "origin_country": "US" + }, + { + "id": 115241, + "logo_path": null, + "name": "The Mighty Mint", + "origin_country": "US" + }, + { + "id": 119645, + "logo_path": null, + "name": "Word Games", + "origin_country": "US" + }, + { + "id": 125281, + "logo_path": "/3hV8pyxzAJgEjiSYVv1WZ0ZYayp.png", + "name": "PlayStation Productions", + "origin_country": "US" + } + ], + "production_countries": [ + { + "iso_3166_1": "US", + "name": "United States of America" + } + ], + "seasons": [ + { + "air_date": "2023-01-15", + "episode_count": 9, + "id": 144593, + "name": "第 1 季", + "overview": "", + "poster_path": "/aUQKIpZZ31KWbpdHMCmaV76u78T.jpg", + "season_number": 1 + } + ], + "spoken_languages": [ + { + "english_name": "English", + "iso_639_1": "en", + "name": "English" + } + ], + "status": "Returning Series", + "tagline": "", + "type": "Scripted", + "vote_average": 8.924, + "vote_count": 601 + } + """ + if not self.tv: + return {} + try: + logger.info("正在查询TMDB电视剧:%s ..." % tmdbid) + tmdbinfo = self.tv.details(tmdbid, append_to_response) + if tmdbinfo: + logger.info(f"{tmdbid} 查询结果:{tmdbinfo.get('name')}") + return tmdbinfo or {} + except Exception as e: + print(str(e)) + return None diff --git a/app/modules/themoviedb/tmdb_cache.py b/app/modules/themoviedb/tmdb_cache.py new file mode 100644 index 00000000..22ebb916 --- /dev/null +++ b/app/modules/themoviedb/tmdb_cache.py @@ -0,0 +1,235 @@ +import pickle +import random +import threading +import time +from pathlib import Path +from threading import RLock +from typing import Optional + +from app.core import settings +from app.core.meta import MetaBase +from app.utils.singleton import Singleton +from app.utils.types import MediaType + +lock = RLock() + +CACHE_EXPIRE_TIMESTAMP_STR = "cache_expire_timestamp" +EXPIRE_TIMESTAMP = 7 * 24 * 3600 + + +class TmdbCache(metaclass=Singleton): + """ + TMDB缓存数据 + { + "id": '', + "title": '', + "year": '', + "type": MediaType + } + """ + _meta_data: dict = {} + # 缓存文件路径 + _meta_path: Path = None + # TMDB缓存过期 + _tmdb_cache_expire: bool = True + # 自动保存暗隔时间 + _save_interval: int = 600 + + def __init__(self): + # 创建计时器 + self.timer = threading.Timer(self._save_interval, self.save) + self.init_config() + + def init_config(self): + self._meta_path = settings.TEMP_PATH / "__tmdb_cache__" + self._meta_data = self.__load(self._meta_path) + + def clear(self): + """ + 清空所有TMDB缓存 + """ + with lock: + self._meta_data = {} + + @staticmethod + def __get_key(meta: MetaBase) -> str: + """ + 获取缓存KEY + """ + return f"[{meta.type.value}]{meta.get_name()}-{meta.year}-{meta.begin_season}" + + def get(self, meta: MetaBase): + """ + 根据KEY值获取缓存值 + """ + key = self.__get_key(meta) + with lock: + info: dict = self._meta_data.get(key) + if info: + expire = info.get(CACHE_EXPIRE_TIMESTAMP_STR) + if not expire or int(time.time()) < expire: + info[CACHE_EXPIRE_TIMESTAMP_STR] = int(time.time()) + EXPIRE_TIMESTAMP + self.update(meta, info) + elif expire and self._tmdb_cache_expire: + self.delete(key) + return info or {} + + def delete(self, key: str) -> dict: + """ + 删除缓存信息 + @param key: 缓存key + @return: 被删除的缓存内容 + """ + with lock: + return self._meta_data.pop(key, None) + + def delete_by_tmdbid(self, tmdbid: str) -> None: + """ + 清空对应TMDBID的所有缓存记录,以强制更新TMDB中最新的数据 + """ + for key in list(self._meta_data): + if str(self._meta_data.get(key, {}).get("id")) == str(tmdbid): + with lock: + self._meta_data.pop(key) + + def delete_unknown(self) -> None: + """ + 清除未识别的缓存记录,以便重新搜索TMDB + """ + for key in list(self._meta_data): + if str(self._meta_data.get(key, {}).get("id")) == '0': + with lock: + self._meta_data.pop(key) + + def modify(self, key: str, title: str) -> dict: + """ + 删除缓存信息 + @param key: 缓存key + @param title: 标题 + @return: 被修改后缓存内容 + """ + with lock: + if self._meta_data.get(key): + self._meta_data[key]['title'] = title + self._meta_data[key][CACHE_EXPIRE_TIMESTAMP_STR] = int(time.time()) + EXPIRE_TIMESTAMP + return self._meta_data.get(key) + + @staticmethod + def __load(path) -> dict: + """ + 从文件中加载缓存 + """ + try: + if Path(path).exists(): + with open(path, 'rb') as f: + data = pickle.load(f) + return data + return {} + except Exception as e: + print(str(e)) + return {} + + def update(self, meta: MetaBase, info: dict) -> None: + """ + 新增或更新缓存条目 + """ + if info: + # 缓存标题 + cache_title = info.get("title") \ + if info.get("media_type") == MediaType.MOVIE else info.get("name") + # 缓存年份 + cache_year = info.get('release_date') \ + if info.get("media_type") == MediaType.MOVIE else info.get('first_air_date') + if cache_year: + cache_year = cache_year[:4] + self._meta_data[self.__get_key(meta)] = { + "id": info.get("id"), + "type": info.get("media_type"), + "year": cache_year, + "title": cache_title, + "poster_path": info.get("poster_path"), + "backdrop_path": info.get("backdrop_path"), + CACHE_EXPIRE_TIMESTAMP_STR: int(time.time()) + EXPIRE_TIMESTAMP + } + else: + self._meta_data[self.__get_key(meta)] = {'id': 0} + + def save(self, force: bool = False) -> None: + """ + 保存缓存数据到文件 + """ + meta_data = self.__load(self._meta_path) + new_meta_data = {k: v for k, v in self._meta_data.items() if str(v.get("id")) != '0'} + + if not force \ + and not self._random_sample(new_meta_data) \ + and meta_data.keys() == new_meta_data.keys(): + return + + with open(self._meta_path, 'wb') as f: + pickle.dump(new_meta_data, f, pickle.HIGHEST_PROTOCOL) + + if not force: + # 重新创建计时器 + self.timer = threading.Timer(self._save_interval, self.save) + # 启动计时器 + self.timer.start() + + def _random_sample(self, new_meta_data: dict) -> bool: + """ + 采样分析是否需要保存 + """ + ret = False + if len(new_meta_data) < 25: + keys = list(new_meta_data.keys()) + for k in keys: + info = new_meta_data.get(k) + expire = info.get(CACHE_EXPIRE_TIMESTAMP_STR) + if not expire: + ret = True + info[CACHE_EXPIRE_TIMESTAMP_STR] = int(time.time()) + EXPIRE_TIMESTAMP + elif int(time.time()) >= expire: + ret = True + if self._tmdb_cache_expire: + new_meta_data.pop(k) + else: + count = 0 + keys = random.sample(new_meta_data.keys(), 25) + for k in keys: + info = new_meta_data.get(k) + expire = info.get(CACHE_EXPIRE_TIMESTAMP_STR) + if not expire: + ret = True + info[CACHE_EXPIRE_TIMESTAMP_STR] = int(time.time()) + EXPIRE_TIMESTAMP + elif int(time.time()) >= expire: + ret = True + if self._tmdb_cache_expire: + new_meta_data.pop(k) + count += 1 + if count >= 5: + ret |= self._random_sample(new_meta_data) + return ret + + def get_title(self, key: str) -> Optional[str]: + """ + 获取缓存的标题 + """ + cache_media_info = self._meta_data.get(key) + if not cache_media_info or not cache_media_info.get("id"): + return None + return cache_media_info.get("title") + + def set_title(self, key: str, cn_title: str) -> None: + """ + 重新设置缓存标题 + """ + cache_media_info = self._meta_data.get(key) + if not cache_media_info: + return + self._meta_data[key]['title'] = cn_title + + def __del__(self): + """ + 退出 + """ + self.timer.cancel() diff --git a/app/modules/transmission/__init__.py b/app/modules/transmission/__init__.py new file mode 100644 index 00000000..d329cd56 --- /dev/null +++ b/app/modules/transmission/__init__.py @@ -0,0 +1,70 @@ +from pathlib import Path +from typing import Set, Tuple, Optional, Union + +from app.core import settings, MetaInfo +from app.modules import _ModuleBase +from app.modules.transmission.transmission import Transmission + + +class TransmissionModule(_ModuleBase): + + transmission: Transmission = None + + def init_module(self) -> None: + self.transmission = Transmission() + + def init_setting(self) -> Tuple[str, Union[str, bool]]: + return "DOWNLOADER", "transmission" + + def download(self, torrent_path: Path, cookie: str, + episodes: Set[int] = None) -> Optional[Tuple[Optional[str], str]]: + """ + 根据种子文件,选择并添加下载任务 + :param torrent_path: 种子文件地址 + :param cookie: cookie + :param episodes: 需要下载的集数 + :return: 种子Hash + """ + # 如果要选择文件则先暂停 + is_paused = True if episodes else False + # 添加任务 + torrent = self.transmission.add_torrent(content=torrent_path.read_bytes(), + download_dir=settings.DOWNLOAD_PATH, + is_paused=is_paused, + cookie=cookie) + if not torrent: + return None, f"添加种子任务失败:{torrent_path}" + else: + torrent_hash = torrent.hashString + torrent_id = torrent.id + if is_paused: + # 选择文件 + torrent_files = self.transmission.get_files(torrent_hash) + if not torrent_files: + return torrent_hash, "获取种子文件失败,下载任务可能在暂停状态" + + # 需要的文件信息 + files_info = {} + # 需要的集清单 + sucess_epidised = [] + + for torrent_file in torrent_files: + file_id = torrent_file.id + file_name = torrent_file.name + meta_info = MetaInfo(file_name) + if not meta_info.get_episode_list(): + selected = False + else: + selected = set(meta_info.get_episode_list()).issubset(set(episodes)) + if selected: + sucess_epidised = list(set(sucess_epidised).union(set(meta_info.get_episode_list()))) + if not files_info.get(torrent_id): + files_info[torrent_id] = {file_id: {'priority': 'normal', 'selected': selected}} + else: + files_info[torrent_id][file_id] = {'priority': 'normal', 'selected': selected} + if sucess_epidised and files_info: + self.transmission.set_files(file_info=files_info) + # 开始任务 + self.transmission.start_torrents(torrent_hash) + else: + return torrent_hash, "添加下载任务成功" diff --git a/app/modules/transmission/__pycache__/__init__.cpython-310.pyc b/app/modules/transmission/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b19f1b534557078cf3c478ece97994ebf8508f1e GIT binary patch literal 2404 zcmZ`)&2QX96rZuZUfb*4O+zS63vDhS?Iq#_QWT+ySHaYcZoV z-EfS$>6mF>3#@v8)uLYwsBxr!## zDH@C1bh8mqVVrEleiV9v$ejv7sVKtWG>-jnmJ8zqjlJXHOazk)?um#r1NyedDRk{= z=7qfOa}JYga)bU4NM{6NP$+URL5^|?h&n3OXpSi3h!lxNa?6^d6P4zvK}~4Zj53U} zmJ-pNf{6*xpf&+Jv1pN&h7rst!<;fTh7mQSKg=>nf!NDAXMkWJT^57=2s7*x!jAi3 z3!Txp$-)}$!!C6N+F@v1@`%wAN{|Z_rqBkSs3=SxE|aDWh$*MR%m!k+p!?6n;j!u| zP8qMxpFKM}SDjp_&3UXo$)b5$i+S}#^odU={UC~~UZYX1rvc^FeoR%@^+P{)-O1ZLxN`=6yY+UNQVAIT}@BNHzTj{-b|b>!p+6YrfobmZv!DV>xAD}zs_ zNlt7Kgs{`qyLmAHBPkLMpF8k>NV>id@Q5)Q#%=?0Pw2HM`q+o8qYa-&gz}n1)cfSZ zd1xur*8p^)GL7I66Q!jkXdcbu1g|OUC|2jSL`xK+u4t`XlH)JSTuSf_^sO?ZOraz< zpKIwL^;SO7*cCZTJyFX1&Cbae^Cn&qU-YH<KKLUyR&nki44duI&}TdRwkKc3Gve|UX) z>&6$IZ*K1RXV-D8yX7&D&u!bL-+{uFuSH=D$s}wNeHsRlM_l4FVfq}>tH~*0FF_zC zn)^UzJTvea&-VAfZ~pPaqkGqz<6z(X`gZ%uwI|4R?U(z5)4uZC=Fd&3)pSRDi zKD>CVvv^+UVZ`cQAd6*#`4RKu1z9!&xaE{Ubu?%EfWk$diJE)1vGgz7`SNP};&+w7 z^xlbrM~K@EyRaAqUZ)pg%9*?kqS(8p?&P8AV~#ZkahZx4RA{02M3}QQcIAFtXrWi9 z%#f1?R-Tw+lQ6vNBJw63EIfVYseD>AJ#l-K=thZoBT8rWa(E ztk%j$M3i0E3&SY(y+UY0?*o)F4>pxRdvmeGRC%bP-u@i*t zNU#DJOlW)vgoSLyQueEgWH0#C7aEXU={_lzY@Za1 z0q@pmEn+lH%`DXla;*E7F}b1hYTw9c|LgWdCwoUF%ICos#(1{oTk`cvUt$~WfdjFz Ijfd3#0J>JvrT_o{ literal 0 HcmV?d00001 diff --git a/app/modules/transmission/__pycache__/transmission.cpython-310.pyc b/app/modules/transmission/__pycache__/transmission.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..05cef99fe4427e123f2d9bc0310a330a38b05361 GIT binary patch literal 8448 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 QYAI>6Y$9t2$TF<{4 Optional[Client]: + """ + 连接transmission + :return: transmission对象 + """ + try: + # 登录 + trt = transmission_rpc.Client(host=self._host, + port=self._port, + username=self._username, + password=self._password, + timeout=60) + return trt + except Exception as err: + logger.error(f"连接出错:{err}") + return None + + def get_torrents(self, ids: Union[str, list] = None, status: Union[str, list] = None, + tag: Union[str, list] = None) -> Tuple[list, bool]: + """ + 获取种子列表 + 返回结果 种子列表, 是否有错误 + """ + if not self.trc: + return [], True + try: + torrents = self.trc.get_torrents(ids=ids, arguments=self._trarg) + except Exception as err: + logger.error(f"获取种子列表出错:{err}") + return [], True + if status and not isinstance(status, list): + status = [status] + if tag and not isinstance(tag, list): + tag = [tag] + ret_torrents = [] + for torrent in torrents: + if status and torrent.status not in status: + continue + labels = torrent.labels if hasattr(torrent, "labels") else [] + include_flag = True + if tag: + for t in tag: + if t and t not in labels: + include_flag = False + break + if include_flag: + ret_torrents.append(torrent) + return ret_torrents, False + + def get_completed_torrents(self, ids: Union[str, list] = None, tag: Union[str, list] = None) -> Optional[list]: + """ + 获取已完成的种子列表 + return 种子列表, 发生错误时返回None + """ + if not self.trc: + return None + try: + torrents, error = self.get_torrents(status=["seeding", "seed_pending"], ids=ids, tag=tag) + return None if error else torrents or [] + except Exception as err: + logger.error(f"获取已完成的种子列表出错:{err}") + return None + + def get_downloading_torrents(self, ids: Union[str, list] = None, + tag: Union[str, list] = None) -> Optional[list]: + """ + 获取正在下载的种子列表 + return 种子列表, 发生错误时返回None + """ + if not self.trc: + return None + try: + torrents, error = self.get_torrents(ids=ids, + status=["downloading", "download_pending"], + tag=tag) + return None if error else torrents or [] + except Exception as err: + logger.error(f"获取正在下载的种子列表出错:{err}") + return None + + def set_torrents_status(self, ids: Union[str, list], + tags: Union[str, list] = None) -> bool: + """ + 设置种子为已整理状态 + """ + if not self.trc: + return False + # 合成标签 + if tags: + if not isinstance(tags, list): + tags = [tags, "已整理"] + else: + tags.append("已整理") + else: + tags = ["已整理"] + # 打标签 + try: + self.trc.change_torrent(labels=tags, ids=ids) + return True + except Exception as err: + logger.error(f"设置种子为已整理状态出错:{err}") + return False + + def set_torrent_tag(self, ids: str, tag: Union[str, list]) -> bool: + """ + 设置种子标签 + """ + if not ids or not tag: + return False + try: + self.trc.change_torrent(labels=tag, ids=ids) + return True + except Exception as err: + logger.error(f"设置种子标签出错:{err}") + return False + + def get_transfer_task(self, tag: Union[str, list] = None) -> List[dict]: + """ + 获取下载文件转移任务种子 + """ + # 处理下载完成的任务 + torrents = self.get_completed_torrents() or [] + trans_tasks = [] + for torrent in torrents: + # 3.0版本以下的Transmission没有labels + if not hasattr(torrent, "labels"): + logger.error(f"版本可能过低,无labels属性,请安装3.0以上版本!") + break + torrent_tags = torrent.labels or "" + # 含"已整理"tag的不处理 + if "已整理" in torrent_tags: + continue + # 开启标签隔离,未包含指定标签的不处理 + if tag and tag not in torrent_tags: + logger.debug(f"{torrent.name} 未包含指定标签:{tag}") + continue + path = torrent.download_dir + # 无法获取下载路径的不处理 + if not path: + logger.debug(f"未获取到 {torrent.name} 下载保存路径") + continue + trans_tasks.append({ + 'path': Path(settings.DOWNLOAD_PATH) / torrent.name, + 'id': torrent.hashString, + 'tags': torrent.labels + }) + return trans_tasks + + def add_torrent(self, content: Union[str, bytes], + is_paused: bool = False, + download_dir: str = None, + cookie=None) -> Optional[Torrent]: + """ + 添加下载任务 + :param content: 种子urls或文件内容 + :param is_paused: 添加后暂停 + :param download_dir: 下载路径 + :param cookie: 站点Cookie用于辅助下载种子 + :return: Torrent + """ + try: + return self.trc.add_torrent(torrent=content, + download_dir=download_dir, + paused=is_paused, + cookies=cookie) + except Exception as err: + logger.error(f"添加种子出错:{err}") + return None + + def start_torrents(self, ids: Union[str, list]) -> bool: + """ + 启动种子 + """ + if not self.trc: + return False + try: + self.trc.start_torrent(ids=ids) + return True + except Exception as err: + logger.error(f"启动种子出错:{err}") + return False + + def stop_torrents(self, ids: Union[str, list]) -> bool: + """ + 停止种子 + """ + if not self.trc: + return False + try: + self.trc.stop_torrent(ids=ids) + return True + except Exception as err: + logger.error(f"停止种子出错:{err}") + return False + + def delete_torrents(self, delete_file: bool, ids: Union[str, list]) -> bool: + """ + 删除种子 + """ + if not self.trc: + return False + if not ids: + return False + try: + self.trc.remove_torrent(delete_data=delete_file, ids=ids) + return True + except Exception as err: + logger.error(f"删除种子出错:{err}") + return False + + def get_files(self, tid: str) -> Optional[List[File]]: + """ + 获取种子文件列表 + """ + if not tid: + return None + try: + torrent = self.trc.get_torrent(tid) + except Exception as err: + logger.error(f"获取种子文件列表出错:{err}") + return None + if torrent: + return torrent.files() + else: + return None + + def set_files(self, **kwargs) -> bool: + """ + 设置下载文件的状态 + { + : { + : { + 'priority': , + 'selected': + }, + ... + }, + ... + } + """ + if not kwargs.get("file_info"): + return False + try: + self.trc.set_files(kwargs.get("file_info")) + return True + except Exception as err: + logger.error(f"设置下载文件状态出错:{err}") + return False diff --git a/app/modules/wechat/WXBizMsgCrypt3.py b/app/modules/wechat/WXBizMsgCrypt3.py new file mode 100644 index 00000000..ce10d0c9 --- /dev/null +++ b/app/modules/wechat/WXBizMsgCrypt3.py @@ -0,0 +1,300 @@ +#!/usr/bin/env python +# -*- encoding:utf-8 -*- + +""" 对企业微信发送给企业后台的消息加解密示例代码. +@copyright: Copyright (c) 1998-2014 Tencent Inc. + +""" +import base64 +import hashlib +# ------------------------------------------------------------------------ +import logging +import random +import socket +import struct +import time +import xml.etree.cElementTree as ET + +from Crypto.Cipher import AES + +# Description:定义错误码含义 +######################################################################### +WXBizMsgCrypt_OK = 0 +WXBizMsgCrypt_ValidateSignature_Error = -40001 +WXBizMsgCrypt_ParseXml_Error = -40002 +WXBizMsgCrypt_ComputeSignature_Error = -40003 +WXBizMsgCrypt_IllegalAesKey = -40004 +WXBizMsgCrypt_ValidateCorpid_Error = -40005 +WXBizMsgCrypt_EncryptAES_Error = -40006 +WXBizMsgCrypt_DecryptAES_Error = -40007 +WXBizMsgCrypt_IllegalBuffer = -40008 +WXBizMsgCrypt_EncodeBase64_Error = -40009 +WXBizMsgCrypt_DecodeBase64_Error = -40010 +WXBizMsgCrypt_GenReturnXml_Error = -40011 + +""" +关于Crypto.Cipher模块,ImportError: No module named 'Crypto'解决方案 +请到官方网站 https://www.dlitz.net/software/pycrypto/ 下载pycrypto。 +下载后,按照README中的“Installation”小节的提示进行pycrypto安装。 +""" + + +class FormatException(Exception): + pass + + +def throw_exception(message, exception_class=FormatException): + """my define raise exception function""" + raise exception_class(message) + + +class SHA1: + """计算企业微信的消息签名接口""" + + @staticmethod + def getSHA1(token, timestamp, nonce, encrypt): + """用SHA1算法生成安全签名 + @param token: 票据 + @param timestamp: 时间戳 + @param encrypt: 密文 + @param nonce: 随机字符串 + @return: 安全签名 + """ + try: + sortlist = [token, timestamp, nonce, encrypt] + sortlist.sort() + sha = hashlib.sha1() + sha.update("".join(sortlist).encode()) + return WXBizMsgCrypt_OK, sha.hexdigest() + except Exception as e: + logger = logging.getLogger() + logger.error(e) + return WXBizMsgCrypt_ComputeSignature_Error, None + + +class XMLParse: + """提供提取消息格式中的密文及生成回复消息格式的接口""" + + # xml消息模板 + AES_TEXT_RESPONSE_TEMPLATE = """ + + +%(timestamp)s + +""" + + @staticmethod + def extract(xmltext): + """提取出xml数据包中的加密消息 + @param xmltext: 待提取的xml字符串 + @return: 提取出的加密消息字符串 + """ + try: + xml_tree = ET.fromstring(xmltext) + encrypt = xml_tree.find("Encrypt") + return WXBizMsgCrypt_OK, encrypt.text + except Exception as e: + logger = logging.getLogger() + logger.error(e) + return WXBizMsgCrypt_ParseXml_Error, None + + def generate(self, encrypt, signature, timestamp, nonce): + """生成xml消息 + @param encrypt: 加密后的消息密文 + @param signature: 安全签名 + @param timestamp: 时间戳 + @param nonce: 随机字符串 + @return: 生成的xml字符串 + """ + resp_dict = { + 'msg_encrypt': encrypt, + 'msg_signaturet': signature, + 'timestamp': timestamp, + 'nonce': nonce, + } + resp_xml = self.AES_TEXT_RESPONSE_TEMPLATE % resp_dict + return resp_xml + + +class PKCS7Encoder: + """提供基于PKCS7算法的加解密接口""" + + block_size = 32 + + def encode(self, text): + """ 对需要加密的明文进行填充补位 + @param text: 需要进行填充补位操作的明文 + @return: 补齐明文字符串 + """ + text_length = len(text) + # 计算需要填充的位数 + amount_to_pad = self.block_size - (text_length % self.block_size) + if amount_to_pad == 0: + amount_to_pad = self.block_size + # 获得补位所用的字符 + pad = chr(amount_to_pad) + return text + (pad * amount_to_pad).encode() + + @staticmethod + def decode(decrypted): + """删除解密后明文的补位字符 + @param decrypted: 解密后的明文 + @return: 删除补位字符后的明文 + """ + pad = ord(decrypted[-1]) + if pad < 1 or pad > 32: + pad = 0 + return decrypted[:-pad] + + +class Prpcrypt(object): + """提供接收和推送给企业微信消息的加解密接口""" + + def __init__(self, key): + + # self.key = base64.b64decode(key+"=") + self.key = key + # 设置加解密模式为AES的CBC模式 + self.mode = AES.MODE_CBC + + def encrypt(self, text, receiveid): + """对明文进行加密 + @param text: 需要加密的明文 + @param receiveid: receiveid + @return: 加密得到的字符串 + """ + # 16位随机字符串添加到明文开头 + text = text.encode() + text = self.get_random_str() + struct.pack("I", socket.htonl(len(text))) + text + receiveid.encode() + + # 使用自定义的填充方式对明文进行补位填充 + pkcs7 = PKCS7Encoder() + text = pkcs7.encode(text) + # 加密 + cryptor = AES.new(self.key, self.mode, self.key[:16]) + try: + ciphertext = cryptor.encrypt(text) + # 使用BASE64对加密后的字符串进行编码 + return WXBizMsgCrypt_OK, base64.b64encode(ciphertext) + except Exception as e: + logger = logging.getLogger() + logger.error(e) + return WXBizMsgCrypt_EncryptAES_Error, None + + def decrypt(self, text, receiveid): + """对解密后的明文进行补位删除 + @param text: 密文 + @param receiveid: receiveid + @return: 删除填充补位后的明文 + """ + try: + cryptor = AES.new(self.key, self.mode, self.key[:16]) + # 使用BASE64对密文进行解码,然后AES-CBC解密 + plain_text = cryptor.decrypt(base64.b64decode(text)) + except Exception as e: + logger = logging.getLogger() + logger.error(e) + return WXBizMsgCrypt_DecryptAES_Error, None + try: + pad = plain_text[-1] + # 去掉补位字符串 + # pkcs7 = PKCS7Encoder() + # plain_text = pkcs7.encode(plain_text) + # 去除16位随机字符串 + content = plain_text[16:-pad] + xml_len = socket.ntohl(struct.unpack("I", content[: 4])[0]) + xml_content = content[4: xml_len + 4] + from_receiveid = content[xml_len + 4:] + except Exception as e: + logger = logging.getLogger() + logger.error(e) + return WXBizMsgCrypt_IllegalBuffer, None + + if from_receiveid.decode('utf8') != receiveid: + return WXBizMsgCrypt_ValidateCorpid_Error, None + return 0, xml_content + + @staticmethod + def get_random_str(): + """ 随机生成16位字符串 + @return: 16位字符串 + """ + return str(random.randint(1000000000000000, 9999999999999999)).encode() + + +class WXBizMsgCrypt(object): + # 构造函数 + def __init__(self, sToken, sEncodingAESKey, sReceiveId): + try: + self.key = base64.b64decode(sEncodingAESKey + "=") + assert len(self.key) == 32 + except Exception as err: + print(str(err)) + throw_exception("[error]: EncodingAESKey unvalid !", FormatException) + # return WXBizMsgCrypt_IllegalAesKey,None + self.m_sToken = sToken + self.m_sReceiveId = sReceiveId + + # 验证URL + # @param sMsgSignature: 签名串,对应URL参数的msg_signature + # @param sTimeStamp: 时间戳,对应URL参数的timestamp + # @param sNonce: 随机串,对应URL参数的nonce + # @param sEchoStr: 随机串,对应URL参数的echostr + # @param sReplyEchoStr: 解密之后的echostr,当return返回0时有效 + # @return:成功0,失败返回对应的错误码 + + def VerifyURL(self, sMsgSignature, sTimeStamp, sNonce, sEchoStr): + sha1 = SHA1() + ret, signature = sha1.getSHA1(self.m_sToken, sTimeStamp, sNonce, sEchoStr) + if ret != 0: + return ret, None + if not signature == sMsgSignature: + return WXBizMsgCrypt_ValidateSignature_Error, None + pc = Prpcrypt(self.key) + ret, sReplyEchoStr = pc.decrypt(sEchoStr, self.m_sReceiveId) + return ret, sReplyEchoStr + + def EncryptMsg(self, sReplyMsg, sNonce, timestamp=None): + # 将企业回复用户的消息加密打包 + # @param sReplyMsg: 企业号待回复用户的消息,xml格式的字符串 + # @param sTimeStamp: 时间戳,可以自己生成,也可以用URL参数的timestamp,如为None则自动用当前时间 + # @param sNonce: 随机串,可以自己生成,也可以用URL参数的nonce + # sEncryptMsg: 加密后的可以直接回复用户的密文,包括msg_signature, timestamp, nonce, encrypt的xml格式的字符串, + # return:成功0,sEncryptMsg,失败返回对应的错误码None + pc = Prpcrypt(self.key) + ret, encrypt = pc.encrypt(sReplyMsg, self.m_sReceiveId) + encrypt = encrypt.decode('utf8') + if ret != 0: + return ret, None + if timestamp is None: + timestamp = str(int(time.time())) + # 生成安全签名 + sha1 = SHA1() + ret, signature = sha1.getSHA1(self.m_sToken, timestamp, sNonce, encrypt) + if ret != 0: + return ret, None + xmlParse = XMLParse() + return ret, xmlParse.generate(encrypt, signature, timestamp, sNonce) + + def DecryptMsg(self, sPostData, sMsgSignature, sTimeStamp, sNonce): + # 检验消息的真实性,并且获取解密后的明文 + # @param sMsgSignature: 签名串,对应URL参数的msg_signature + # @param sTimeStamp: 时间戳,对应URL参数的timestamp + # @param sNonce: 随机串,对应URL参数的nonce + # @param sPostData: 密文,对应POST请求的数据 + # xml_content: 解密后的原文,当return返回0时有效 + # @return: 成功0,失败返回对应的错误码 + # 验证安全签名 + xmlParse = XMLParse() + ret, encrypt = xmlParse.extract(sPostData) + if ret != 0: + return ret, None + sha1 = SHA1() + ret, signature = sha1.getSHA1(self.m_sToken, sTimeStamp, sNonce, encrypt) + if ret != 0: + return ret, None + if not signature == sMsgSignature: + return WXBizMsgCrypt_ValidateSignature_Error, None + pc = Prpcrypt(self.key) + ret, xml_content = pc.decrypt(encrypt, self.m_sReceiveId) + return ret, xml_content diff --git a/app/modules/wechat/__init__.py b/app/modules/wechat/__init__.py new file mode 100644 index 00000000..3d58db4d --- /dev/null +++ b/app/modules/wechat/__init__.py @@ -0,0 +1,144 @@ +from typing import Optional, Union, List, Tuple + +from fastapi import Request +import xml.dom.minidom +from app.core import MediaInfo, TorrentInfo, settings +from app.log import logger +from app.modules import _ModuleBase +from app.modules.wechat.WXBizMsgCrypt3 import WXBizMsgCrypt +from app.modules.wechat.wechat import WeChat +from app.utils.dom import DomUtils + + +class WechatModule(_ModuleBase): + + wechat: WeChat = None + + def init_module(self) -> None: + self.wechat = WeChat() + + def init_setting(self) -> Tuple[str, Union[str, bool]]: + return "MESSAGER", "wechat" + + def message_parser(self, request: Request) -> Optional[dict]: + """ + 解析消息内容,返回字典,注意以下约定值: + userid: 用户ID + username: 用户名 + text: 内容 + :param request: 请求体 + :return: 消息内容、用户ID + """ + try: + # URL参数 + sVerifyMsgSig = request.query_params.get("msg_signature") + sVerifyTimeStamp = request.query_params.get("timestamp") + sVerifyNonce = request.query_params.get("nonce") + # 解密模块 + wxcpt = WXBizMsgCrypt(sToken=settings.WECHAT_TOKEN, + sEncodingAESKey=settings.WECHAT_ENCODING_AESKEY, + sReceiveId=settings.WECHAT_CORPID) + # 报文数据 + sReqData = request.form() + if not sReqData: + return None + logger.debug(f"收到微信请求:{sReqData}") + ret, sMsg = wxcpt.DecryptMsg(sPostData=sReqData, + sMsgSignature=sVerifyMsgSig, + sTimeStamp=sVerifyTimeStamp, + sNonce=sVerifyNonce) + if ret != 0: + logger.error(f"解密微信消息失败 DecryptMsg ret = {ret}") + return None + # 解析XML报文 + """ + 1、消息格式: + + + + 1348831860 + + + 1234567890123456 + 1 + + 2、事件格式: + + + + 1348831860 + + + 1 + + """ + dom_tree = xml.dom.minidom.parseString(sMsg.decode('UTF-8')) + root_node = dom_tree.documentElement + # 消息类型 + msg_type = DomUtils.tag_value(root_node, "MsgType") + # Event event事件只有click才有效,enter_agent无效 + event = DomUtils.tag_value(root_node, "Event") + # 用户ID + user_id = DomUtils.tag_value(root_node, "FromUserName") + # 没的消息类型和用户ID的消息不要 + if not msg_type or not user_id: + return None + # 解析消息内容 + if msg_type == "event" and event == "click": + # 校验用户有权限执行交互命令 + wechat_admins = settings.WECHAT_ADMINS.split(',') + if wechat_admins and not any( + user_id == admin_user for admin_user in wechat_admins): + self.wechat.send_msg(title="用户无权限执行菜单命令", userid=user_id) + return {} + elif msg_type == "text": + # 文本消息 + content = DomUtils.tag_value(root_node, "Content", default="") + if content: + logger.info(f"收到微信消息:userid={user_id}, text={content}") + # 处理消息内容 + return { + "userid": user_id, + "username": user_id, + "text": content + } + except Exception as err: + logger.error(f"微信消息处理发生错误:{err}") + return None + + def post_message(self, title: str, + text: str = None, image: str = None, userid: Union[str, int] = None) -> Optional[bool]: + """ + 发送消息 + :param title: 标题 + :param text: 内容 + :param image: 图片 + :param userid: 用户ID + :return: 成功或失败 + """ + return self.wechat.send_msg(title=title, text=text, image=image, userid=userid) + + def post_medias_message(self, title: str, items: List[MediaInfo], + userid: Union[str, int] = None) -> Optional[bool]: + """ + 发送媒体信息选择列表 + :param title: 标题 + :param items: 消息列表 + :param userid: 用户ID + :return: 成功或失败 + """ + # 先发送标题 + self.wechat.send_msg(title=title) + # 再发送内容 + return self.wechat.send_medias_msg(medias=items, userid=userid) + + def post_torrents_message(self, title: str, items: List[TorrentInfo], + userid: Union[str, int] = None) -> Optional[bool]: + """ + TODO 发送种子信息选择列表 + :param title: 标题 + :param items: 消息列表 + :param userid: 用户ID + :return: 成功或失败 + """ + pass diff --git a/app/modules/wechat/__pycache__/WXBizMsgCrypt3.cpython-310.pyc b/app/modules/wechat/__pycache__/WXBizMsgCrypt3.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e7ab674ccd4b72734028ab88e404f028e3cb6a95 GIT binary patch literal 8476 zcmb7J>vJ2|b>BA@OOS#nn$%m69mhiIP*&pjq0)*Zim?@0G{B&@nafbY^V0LmNQN3DzYt4KlVfafbO?U2vYn9@*&gK{hhmu#e84vO8~hJa&7_MG*dM+M>c)M-5wbPnQl{(#03Ou-T@DJPmDze=XW zud*rgt70nrs+ualYNp1o5i`QCdOj)%qL4StE|FG}bFqB4*-iImkENI!EY*x#nz_-6 zn7x*6ZnC0gpJkX2SY2kn6*C8{ZgaEMV{VBG&kEKCD}F(+;`Y`>+1zGtn-r~$R__JT z+>WtLRv*Ut7A12BdJkCr==Gzw6TJazGkTlR+lAg1Yb$zN?F3fYjs7-kJNnys|3OO{ z7m_>5XYlcf`X|3#`uzOTt+(rUZZ3UUt6%-u>TBm$K6@*8caSPczOel1rRDRV z)L*aO{fGDJpZsLy{o6}-{$}a3_g1Rs2aSW7Vrh5QgiQ&d=VoxTS*!T3)Pkr-S zkL`OrF<}=ncEL>?Eo24_V->F!Mw6l^9~v3Yewq2|tLzPO{t&L8{3{+1Uf9}w}@*^O;d$YE3^G2)Qg(|l4@tyj$%ga|js9$|ALyT!0 zv_IMcXT>?(%4Y#YD1xic9T0^DO%&!gxzVbDd67z_+EvjwbU6 zW;6>qx#@gqe`5K@r>i&qW%<%?I%!}=q(J*&xIbBb^QWD|g(A#se`59RtIO}+u77-E z<)41FbnBm+RLpkE3_DnNlO9a6+f$q(bG^uP+L_K}Poq1X-sfrMl9hICPnjuZ3!a8u z6fN6}w<&e%g=1cH+CFP#r|=nGG&D9Zk}FP4WeZbYbjo(0$Gy!w)n=^7ysxz{F@^AGb0Y^-o_MOW*t|?>7o@jd-y%w(tP1slR z2sS}Ndjj%vHlvZEF;T~_Pwc@@7Y*F$uSx$iA0x8CfP6HmF;YmTQlp{qBB_*B%#hQ7 z*xYO;Z@be)izSGl`BHvI>dU&&d>bb>WwLll>Jj!{U4us$YFQ zP~3O^zW)B@Rx+|mZi(~%K6EypJ75fr`096HX!py*M-ELKdimi!d1opW$RO#w^2&js zy$vE`2>vbgfcC`HSU&9B~-?$hEE?J{Q=oYDR+nn>ub%F0*a6gC_5!W*0S0V<9_%P2)}JjQbKg zP9GXcGhmgmcI%8cRDCcY&yZLf2Q5i`9xo_5`LUt`EcdR0_#n&(6}2DUzXHFWl*+#Y ziEjtkamK46R?gLI&a^qjkM;sN(l-Pu_2S6**bAfMBj_C;d;ZYGNHT)3VCN>e7`iia5?G&>Dv9*d{@c(LaeiYc;RfYsQtxoW zY&Y#WNzH@QkiTRA{jEyX^uP~c;22Jh5y=B9vJ`=4^)MRw|9N5G2b-!L_+UVth8K>F z9UC5h5_W|s$;z}j*dsh~{g=0wZeQVp0c7CT>4R$D)vhLJBZRpc2Whd4a~P*{0F4V> zUW9vs4io-C+b?W}W2yl0%t~w%Jz0=lAR|yI(0ipK_X$5I#q?#TB={^YgP%YS!y>5F&6<(iWl z*aM5MesRrz*;;qR$WJE~PtMr|&p4ecW@e$G^R_2vrWxy{L6s3~W?x5RcF|^1pq+B3 z&F*x*ST49Jx0ouWEl)<%p>uqJ3MTprpvEO#)I?p1i}RaWWi|*~hwR#d2FWCp10iF` z0Xg0lU|b3smNW|`##NqGSlm+ZOt937*d<()wh-U7^6QvXzf@g)>wRD1@E|@Lz%8HE zK0lf~^Zh?ILZHvK_9w!L_hE4G3NAZ;!N65<`G$+HeuZO|*v;r`IOBOvR%8~EhG_U! z_AMIj@X;EE!6Eu24rgLoTvXtoJNW2R-OFqrqlHPPzU@BQ{+_1UeiH+ft~Sk9(t(`- zo@nIWX8Sls+rbm%B*^C#OT`t?$%^2r*%3>(q8w1^mH}CHdHNVDajut#u!wKIu+Zh} zpVt5OjpZvJwx!8DclILzn8@i>{Omk{Q(G1!cY)$y$ulscyI1Q{7NeYhsA9;&U$pW%)_j#%eG2K}p%BASvr> zLs^|knNq%i?ZdORxiTKDL$z-NUHA>e)Ac-HCn>WtcJ@^}3-b$an=}o#7Jz~~H|m$D zVzSn=dE(L0)j0N-e1Pk`*MrO=#nJ_#`Tm^Ix~wNT%YZF>a<%dm_I5pBYBa_q>Cc~YDu`_ zp`v2zw4pXVrMgb2r(cKTn&0fBcCwur87FYNB?Wqha9CAbwF;eu#v%}&5DL4H^hf5N zgnp?U#Y0P>Ux0vBgLDujf-Z||B2W6o1@)W?6wj}O;^!X)e3ZA4Mxwk?iTJL4L3d+S zuE&;A(Xj)S??AFN=)1TO#WS@MwbTI~2o{Wr?)NN_=oY%deJ$Q+U-A3xtI}0Paj^z4 zFe|gGZZFYd-&)0>Yf>*0_hA)lgNGl!gV@6(Q&X}1*y9KL^{Wk`Ufka>_`0otV%=~w z$_U#q%8%JIXjXZ$P2tH?%I@S-$xU4I*%2ZLHQ$Q_VTz3qC274Ma{d&pKjO#LQ0v)Y zT0RTRySW_A67>ZNTi%216fdQ7S*n-}7g;H51x6KX z8WnpEli2ssm_{j=&K6P~HbgNOc2+F7D4X&WicpT%MJZI{X%A&;sZa_X(SVI&33BHS zg;`14F7~xqo22MskGfNg^TJ2d3VT#4hRio@G2rl;FdL>PUfJwZ=LbTs)9#Q*lhJjP4FUwd$0ZK?(1q4);eYdGPhsFq zoIJmwj6;|7h`w3c4e&x^Yq(00`5;XoP}T%5mIR<82RVmg863J$ag_rX{3QWT1=!Nv zriN`5R1#O{J{dZwdQ#B?PICZ`3h;vp9&neC_xr++ML4G&aGJ{8V{lFioaRQC zV1Tj+AOLq6v1C_YltkeKRY^f{PARDVl^iAqH_-}KO&J7jlFFzjKEvVW{O*@wIz{%% z{se+g5fYn%9Uimi66M0HWIT!8$u4fx>;>%Aw|E`|sRV&Qg!+WbPS6m26tA6oIs)kg z)mXh4?q2l6)=?|S7!XqZ!3|FPD?Ou0>&e(wizEpgF_QT2ar(swSWG{VZVWBTg#W84 zhB)8f#`h-9BBnPE+9%ZwhjBVTMB@rTO;oA|^AW?4u%TS7oIEEK+&Md4U_|P>3g)OtJ@kr>7)QNGP2zK-6|E8_nvbMWKb_Kfk&z|vPWB2K@8P!X zrW)RAyit?$9TrzmpYvSP{}NM^26tj!x6@j$0|&#h9N5e&Z=UXqWTuPbE@K<$oia?E z{Tba!rHt7PmX~sK4T`3n62radOE$|+&i&xU=l_7NLqJ(0b_YL0>?Id9(DoIB;hfPn zy(hNQ@|^A0aYK3A3}w*tuYp85IwNz|sT>NRLWHo5{|aCQGTVl$F90yUEU-sN|J?|c z|HuZAXX_9mK~x{`qGSlDNZ@#>` zTR6|59dVw=8Lsi34BbaT4t1jr!SXT&FMkAbGNV49AuKjUi|`W94Bcg^;j5E)e92IS zj@R!xEWk4Ygot%u_kyz(Q;bM2Ae=9gxTs0Kd^CiU`OWQ;X-;md(Gj2v4dMbiEd~J@ zv>8Hg!w_5vJS3$jUxmsBR6i0J4HTan&7KBrB??F+Igh!44B@$8CXkv@F{(ODN|=cT zMuUHSDqSQAmcd5Ay@zn|t4UP0Z`uyCs7tQ9(=z<u2;l`H)|N8^Jy6p{AdjlhhEN;y{Y!acA~Jy9VI|Y zlC$$bHWTRJzaV;M##$e;uhER|VafuEgTp+{@BtvDIld4cp}Q?aw>~~QWIG5bY=X$1 zrDlwpahi~5Q_vKT2lio}I{Ch@lLEX%@_j#wXYIm^{O`4sjoP=5L1lU=G0wMDu2)pH z@U-G-`sdi!C1PcZ^h4fz`jG!mGXAQB07znrtOL412!ZYOiZMx1P|IBBCrR;0OzBa3 NHupRl-_>{Q{{UeIM3Mji literal 0 HcmV?d00001 diff --git a/app/modules/wechat/__pycache__/__init__.cpython-310.pyc b/app/modules/wechat/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cf5062e1842e23fd88ae5c1305cabe7fe0269ef0 GIT binary patch literal 4523 zcmcIo>u(&@6`$Ac&c4^r*a@JeACR^Jw-QoSSpgAjL!#id8#}m+T#c5!*JhlVoz0!u z#J0vLX##Ny7N!l)@UUAbq!OgG2-1efzfs+f#k;mY@quqhke+jAy|!Z)Aypmg-aYr; zGiT2Io!7l~)9Hi+&z;uOq;NozzQV!IM}xsb(7a{nh(u&ta%4kx6hm=TLv=JmlW|_L zBTm$a3R<;eh7NO@9d{B&!buuQCuO9>TEtE}86zX;sGW6kMo!Q%yUl4g+6ArK9Zsjw zDd@P}<#Zd}vh=7#5+r$1B1xLNpc)5=IwloTo1m3c(6~NQ^)0tjvU%iW1qiM^W_do3 zjMu6*Eyz4}f}XBX&o35K9v`N}Djlm#xjZ@UGDa)D80a4LeXBC<0e{qXr>7|cDrpY8 zq-N8HOCAbJPyG5}Ykt_99$<4-A2}!Jz*8lp^g-7->07o}Mx}N>DHuEi&HFcWR5D~D z8Olij(@?2KBSbkYk#3@q$VJVF5|zfNPUFxLQ%bKCHWDQ!h7@0C(pu?ympJ z-ATHDyPL>hmR_Ekpk+WMgs#Y=XT^|58TD(dQkDUStp{lZ+5j{Uk@BSrQXrWC(wKBj zE*2D)hFO+_?wZUskJ?k$B-RDPZ;uZ2PoDHB^Co9zXQ!W<9G!!&GG~;zGqmh`lf&*A zi;h~h>ra-d)k#NK(whvmnKVtSV)>@oSDoWYL52)%AlgHfQu2Jy&W-f#VA`_>+z0OA z8w?o%g95s9eRybW?8u`-C&UJX+N=XOLJD`mx}oDKA-m~fV_T7~BQ4YZp7JdkIk6`9DZ@`BQ&6`<87tpct2im%RS&?3;HL|al9B7wXT zTa^}~LDaivLL!kd$=6rn1jbjTH$j3d1(BIV5Dk<-4Kxy4(k7LK*n%F!h<-|CM}a#@ z;z4YSJCqTZ{M1Z(CbNZa{G|4|W_b*vm$jZ`uR^V|*kln`P2|#rr`*aqu4XLy8S*dVmZ4IrM zZ$2CE{i*TRa^sW5#`){@XP>Em_>ZqYdw%1~EA^{y)jxQp{>%*+Hvay8KbzW(g>mXI36iADPJ>sQ`yEPi@yaMwbmM-57)k24V3}}3Yro3MqSSzEcqp#_8@tWwZ50|#^Hlw;)7AIh+kwF$+e$C2e{X- zKO2f`ZseVhHa>ngKS;}%{y`F;;O8I6&qq#~2tN6heeS- zAiXGkKQ|I3;#d_E4Gak~hQFpo!UQ97OZ@OOt@R& zO4HN?3xkxt!?s&4+1`VFEdjN=;pNbZjaOD0Z(i7ZZMkvzy^Yo9H(q$7zVuT4#n0Dn zz5|Lye9N~fkA`l?HS{DN8*nQ=LLfoCj1f9js@Z<+4iLH1av{`Ux$xZw=41Ef@%0A^ zD(eGYuHyo_Ec+P@g-W}Pba8$8+4>7Fu3ve3^U7-**RP`&9O5ZB0G^Lt^wv|%w=4ib!@H@*D+#XCJP9j6!?z$41AeK2?ejFMwYncngi$z*%W_R z2ILxXzcg*0DcLpJ`uLH-;bX-y9`UNS<#V-EnG>~z!vUs3Oo%70S$MjM56zaTI2RRi z3`+_-gc8%<J1rte1(!E83?n$@xsK^G zN{u*kUEi$0KDZ7Vm_7snyGML3thT0bQjf>VO&3rBozO=y)WRZ|+3kODAeB5DIwhV` zQgTX;Dw?dx(eHH)dN~J85r2vAbWMzu&aS8oyzr+hzyZHG;Lva7V5EGfwJBd~ZTdGk zkkc(ID!#3Mr+llWGv6Ns$@)3v`}spZ5E1M?)D^vsM=S>-ML1+R0ux&g(otyQJcFo1 zt&wKrKyFq^c}asKl2ZE=mRk7|oOScu`OxuOlg&IU0tvEgW98E3A791 z>KE&mFWvrP7+fHCPfqS{CGW-M`tROuEWTV9X|E-rpl##89)o=d6yTtSXAg!OFGNCz zYr(b6w&&neh16^|4e!9a;^5Pnxb5JxlMAr-spFOLq_y=RjZMIQ7Z6*p6L|>_Drf`+ zO+b_-1q`6pJ_e@NmO=y6|MGjNVo*Gw&~Bc)+<5LIFb*MUw?0@{=xE(Mt=WT_&)<*3;`R3E!+-W zm%zdgZ<8(XE&*qFjE~R%WG{5LvqJ#k)dTLR#bQxZ`N9FNn)Pxfu3(~Kc=F&HvC2L> zj-+Zq@fpSyG(3x8_bcr1;J{8`C+;oV9iB2+7CKbI`vr6fDWxQoyVPz~nb2=Ro)s+t zzfm}KDCyj-7MqKZ92tz>efUCl saalFexL(752B31Hl8e3V2OQTAhdMln!Qx@b=mGR}xf3eh)?cUkAN?~rF8}}l literal 0 HcmV?d00001 diff --git a/app/modules/wechat/__pycache__/wechat.cpython-310.pyc b/app/modules/wechat/__pycache__/wechat.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1402948784e3b78a70ab27d55d3973304ee17ac4 GIT binary patch literal 5828 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 self._expires_in: + token_flag = False + + if not token_flag or force: + if not self._corpid or not self._appsecret: + return None + try: + token_url = self._token_url % (self._corpid, self._appsecret) + res = RequestUtils().get_res(token_url) + if res: + ret_json = res.json() + if ret_json.get('errcode') == 0: + self._access_token = ret_json.get('access_token') + self._expires_in = ret_json.get('expires_in') + self._access_token_time = datetime.now() + except Exception as e: + logger.error(f"获取微信access_token失败,错误信息:{e}") + return None + return self._access_token + + def __send_message(self, title: str, text: str, userid: str = None) -> Optional[bool]: + """ + 发送文本消息 + :param title: 消息标题 + :param text: 消息内容 + :param userid: 消息发送对象的ID,为空则发给所有人 + :return: 发送状态,错误信息 + """ + message_url = self._send_msg_url % self.__get_access_token() + if text: + conent = "%s\n%s" % (title, text.replace("\n\n", "\n")) + else: + conent = title + + if not userid: + userid = "@all" + req_json = { + "touser": userid, + "msgtype": "text", + "agentid": self._appid, + "text": { + "content": conent + }, + "safe": 0, + "enable_id_trans": 0, + "enable_duplicate_check": 0 + } + return self.__post_request(message_url, req_json) + + def __send_image_message(self, title: str, text: str, image_url: str, userid: str = None) -> Optional[bool]: + """ + 发送图文消息 + :param title: 消息标题 + :param text: 消息内容 + :param image_url: 图片地址 + :param userid: 消息发送对象的ID,为空则发给所有人 + :return: 发送状态,错误信息 + """ + message_url = self._send_msg_url % self.__get_access_token() + if text: + text = text.replace("\n\n", "\n") + if not userid: + userid = "@all" + req_json = { + "touser": userid, + "msgtype": "news", + "agentid": self._appid, + "news": { + "articles": [ + { + "title": title, + "description": text, + "picurl": image_url, + "url": '' + } + ] + } + } + return self.__post_request(message_url, req_json) + + def send_msg(self, title: str, text: str = "", image: str = "", userid: str = None): + """ + 微信消息发送入口,支持文本、图片、链接跳转、指定发送对象 + :param title: 消息标题 + :param text: 消息内容 + :param image: 图片地址 + :param userid: 消息发送对象的ID,为空则发给所有人 + :return: 发送状态,错误信息 + """ + if not self.__get_access_token(): + logger.error("获取微信access_token失败,请检查参数配置") + return None + + if image: + ret_code, ret_msg = self.__send_image_message(title, text, image, userid) + else: + ret_code, ret_msg = self.__send_message(title, text, userid) + + return ret_code, ret_msg + + def send_medias_msg(self, medias: List[MediaInfo], userid: str = "") -> Optional[bool]: + """ + 发送列表类消息 + """ + if not self.__get_access_token(): + logger.error("获取微信access_token失败,请检查参数配置") + return None + + message_url = self._send_msg_url % self.__get_access_token() + if not userid: + userid = "@all" + articles = [] + index = 1 + for media in medias: + if media.get_vote_string(): + title = f"{index}. {media.get_title_string()}\n{media.get_type_string()},{media.get_vote_string()}" + else: + title = f"{index}. {media.get_title_string()}\n{media.get_type_string()}" + articles.append({ + "title": title, + "description": "", + "picurl": media.get_message_image() if index == 1 else media.get_poster_image(), + "url": media.get_detail_url() + }) + index += 1 + + req_json = { + "touser": userid, + "msgtype": "news", + "agentid": self._appid, + "news": { + "articles": articles + } + } + return self.__post_request(message_url, req_json) + + def __post_request(self, message_url: str, req_json: dict) -> bool: + """ + 向微信发送请求 + """ + try: + res = RequestUtils(content_type='application/json').post( + message_url, + data=json.dumps(req_json, ensure_ascii=False).encode('utf-8') + ) + if res and res.status_code == 200: + ret_json = res.json() + if ret_json.get('errcode') == 0: + return True + else: + if ret_json.get('errcode') == 42001: + self.__get_access_token(force=True) + logger.error(f"发送消息失败,错误信息:{ret_json.get('errmsg')}") + return False + elif res is not None: + logger.error(f"发送消息失败,错误码:{res.status_code},错误原因:{res.reason}") + return False + else: + logger.error(f"发送消息失败,未获取到返回信息") + return False + except Exception as err: + logger.error(f"发送消息失败,错误信息:{err}") + return False diff --git a/app/plugins/__init__.py b/app/plugins/__init__.py new file mode 100644 index 00000000..d96361a9 --- /dev/null +++ b/app/plugins/__init__.py @@ -0,0 +1,104 @@ +from abc import ABCMeta, abstractmethod +from pathlib import Path +from typing import Any + +from app.core import settings +from app.db.systemconfigs import SystemConfigs + + +class _PluginBase(metaclass=ABCMeta): + """ + 插件模块基类,通过继续该类实现插件功能 + 除内置属性外,还有以下方法可以扩展或调用: + - get_fields() 获取配置字典,用于生成插件配置表单 + - get_state() 获取插件启用状态,用于展示运行状态 + - stop_service() 停止插件服务 + - get_config() 获取配置信息 + - update_config() 更新配置信息 + - init_config() 生效配置信息 + - get_page() 插件额外页面数据,在插件配置页面左下解按钮展示 + - get_script() 插件额外脚本(Javascript),将会写入插件页面,可在插件元素中绑定使用,,XX_PluginInit为初始化函数 + - get_data_path() 获取插件数据保存目录 + - get_command() 获取插件命令,使用消息机制通过远程控制 + + """ + # 插件名称 + plugin_name: str = "" + # 插件描述 + plugin_desc: str = "" + # 插件图标 + plugin_icon: str = "" + # 主题色 + plugin_color: str = "" + # 插件版本 + plugin_version: str = "1.0" + # 插件作者 + plugin_author: str = "" + # 作者主页 + author_url: str = "" + # 插件配置项ID前缀:为了避免各插件配置表单相冲突,配置表单元素ID自动在前面加上此前缀 + plugin_config_prefix: str = "plugin_" + # 显示顺序 + plugin_order: int = 0 + # 可使用的用户级别 + auth_level: int = 1 + + @staticmethod + @abstractmethod + def get_fields() -> dict: + """ + 获取配置字典,用于生成表单 + """ + pass + + @abstractmethod + def get_state(self) -> bool: + """ + 获取插件启用状态 + """ + pass + + @abstractmethod + def init_plugin(self, config: dict = None): + """ + 生效配置信息 + :param config: 配置信息字典 + """ + pass + + @abstractmethod + def stop_service(self): + """ + 停止插件 + """ + pass + + def update_config(self, config: dict, plugin_id: str = None) -> bool: + """ + 更新配置信息 + :param config: 配置信息字典 + :param plugin_id: 插件ID + """ + if not plugin_id: + plugin_id = self.__class__.__name__ + return SystemConfigs().set(f"plugin.{plugin_id}", config) + + def get_config(self, plugin_id: str = None) -> Any: + """ + 获取配置信息 + :param plugin_id: 插件ID + """ + if not plugin_id: + plugin_id = self.__class__.__name__ + return SystemConfigs().get(f"plugin.{plugin_id}") + + def get_data_path(self, plugin_id: str = None) -> Path: + """ + 获取插件数据保存目录 + """ + if not plugin_id: + plugin_id = self.__class__.__name__ + data_path = settings.PLUGIN_DATA_PATH / f"{plugin_id}" + if not data_path.exists(): + data_path.mkdir(parents=True) + return data_path diff --git a/app/plugins/__pycache__/__init__.cpython-310.pyc b/app/plugins/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bbb4a70facd06f5357781d0611ea0c8567d205ec GIT binary patch literal 3552 zcmb7H-EZ7P5Vw6k-$yQK8qzfVB($J%NJQ|0L{$)>pi%@;BwB>5NS5Q>Bo4mwvGzqx z6i}-qC2fd0w53Uu|HH4GeV3;`@WvCf>x<)F(;|HGcy@L?JHMIP zS)W;3o8;g+pnru{QXKae9fYqa4Bmm;`V2yL>%UadAX6vc7d!B?V>Wd z2_%QnZl>3a_KZY9wi{%7(Y_H5_-20=?Z;8DwyRr02hhQhsJsW{zHD!|h@M9+Alnzn z_JiyNbO>YzP!mM|MW;sTF!DWm_FdJ&`6CgIOSZt}UHP`Sa?hJDxU=88*B_Sdt~^>D z-#9y6UjMqZGFMtzC@GHC#>|VTH9$sT_Z~S=6JwIAnTXgUKAtI^N&`inT=Olda$i@>)1fn z%juT#<@@fHsg2PIYIWgzck}_61oh&>%cbwGdt+C9Cwzr+VcwmX44JWP)y9F9ioaKv z;Qi9Yd*0b|fi3W)bn9Vx{c5=|?oU;$Shkr{EKK@!jT&;#&3FqpD^Z%6a4!}@t7)tl zgXMgmit7dM+)_m=pF`k~5-57te)p!9w^7uyy1k`Fkxq_nqeerOQ+udql{nm-g{W^7 z{@9qk=}j(s6N>=RotY0u$)9!a{{jgq&;9I;U)cB-GDZUs0%K`J&)HRm%Olg?%&(7D z$39g1RbS)L>IJ&Q^7-QGw0r(Xcl35;E#?EAy0R2F;EoQLe!o$Cuuxk0#$B8)uC24o zkAvE0pH&L-BtS1dc<7GJx^tJ@@hSJ~H9!*b3__>^YP&axbR{1QZ*hIrUHGANZP8r| zSAu3{GHMo8z2bheR$RFStNWgK_r@Ss-V7{$&oBD&`b=s5l6QFyBuVCj!#OoMwsVxM zn!&*UVM_}JI%L>MRn#=oFv(!#_14#%x{9bD6H5n`+R9kXL&qad(tj#>V#u+|l+zfP zp{-8I5!|hxA<)*iURj7usl4zx@tJc7uT}@=x3Gqn)Q=-&mb}XU_EWc6JPCy(-Cc5VH?!w$=Hu*{|ac z-7xJ=HJ9u3Fo`(BqP9gl z;O;Pzkj8%o`5?R5c(P8MBuY09SNoI5J;=@So_$~@)2lQ5)e^} z^NsxAo^S{s(|n>RgTT?)5Ai|Z_#kjR4P3!*8z(?1fD>*Tp<^!;wr2%{90pryk-P{G z@)9LJde~~41-u<_)+PL{K)+Uf)X_NKz(3h3w%LcYR_M)Y_arrWECiylT+H4@NOXL8b}& z9C1+3qz0x4U6|BTQb)-SO6n=uNl60`C!%L<(nvYz1n{=z{}CWGKaPlW%_e&o+hv*t zIRGqaq2vWhj!;7XxR5j@w2TQoHbOCBt&es+5(koi+hVEXL_SrY5~_cKAV3ufQa#-8 zj3xPIsWI7{U~fbE65yW7_H27PFsdkwvdIpRq6Ko0)6F#nu59C)po uNibo#Zlpuh)oQUnG=7O%toGSL+xhRrkNN3%n;s!7r}bP4@(B?5rpUihV5>p^ literal 0 HcmV?d00001 diff --git a/app/scheduler.py b/app/scheduler.py new file mode 100644 index 00000000..b761d5cb --- /dev/null +++ b/app/scheduler.py @@ -0,0 +1,66 @@ +import logging +from datetime import datetime, timedelta + +import pytz +from apscheduler.executors.pool import ThreadPoolExecutor +from apscheduler.schedulers.background import BackgroundScheduler + +from app.chain.cookiecloud import CookieCloudChain +from app.chain.douban_sync import DoubanSyncChain +from app.chain.subscribe import SubscribeChain +from app.core import settings +from app.log import logger +from app.utils.singleton import Singleton +from app.utils.timer import TimerUtils + +# 获取 apscheduler 的日志记录器 +scheduler_logger = logging.getLogger('apscheduler') + +# 设置日志级别为 WARNING +scheduler_logger.setLevel(logging.WARNING) + + +class Scheduler(metaclass=Singleton): + """ + 定时任务管理 + """ + # 定时服务 + _scheduler = BackgroundScheduler(timezone=settings.TZ, + executors={ + 'default': ThreadPoolExecutor(20) + }) + + def __init__(self): + # CookieCloud定时同步 + if settings.COOKIECLOUD_INTERVAL: + self._scheduler.add_job(CookieCloudChain().process, + "interval", + minutes=settings.COOKIECLOUD_INTERVAL, + next_run_time=datetime.now(pytz.timezone(settings.TZ)) + timedelta(minutes=1)) + + # 新增订阅时搜索(5分钟检查一次) + self._scheduler.add_job(SubscribeChain().search, "interval", minutes=5, kwargs={'state': 'N'}) + + # 订阅状态每隔12小时刷新一次 + self._scheduler.add_job(SubscribeChain().search, "interval", hours=12, kwargs={'state': 'R'}) + + # 站点首页种子定时刷新缓存并匹配订阅 + triggers = TimerUtils.random_scheduler(num_executions=20) + for trigger in triggers: + self._scheduler.add_job(SubscribeChain().refresh, "cron", hour=trigger.hour, minute=trigger.minute) + + # 豆瓣同步(每30分钟) + self._scheduler.add_job(DoubanSyncChain().process, "interval", minutes=30) + + # 打印服务 + logger.debug(self._scheduler.print_jobs()) + + # 启动定时服务 + self._scheduler.start() + + def stop(self): + """ + 关闭定时服务 + """ + if self._scheduler.running: + self._scheduler.shutdown() diff --git a/app/schemas/__init__.py b/app/schemas/__init__.py new file mode 100644 index 00000000..1a3b83bf --- /dev/null +++ b/app/schemas/__init__.py @@ -0,0 +1,6 @@ +from .token import Token, TokenPayload +from .user import User, UserCreate, UserInDB, UserUpdate +from .response import Response +from .site import Site +from .subscribe import Subscribe +from .context import Context diff --git a/app/schemas/__pycache__/__init__.cpython-310.pyc b/app/schemas/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..43c30c8659bb0111ecee63637f043676c857ad17 GIT binary patch literal 466 zcmYjNOHRWu6pT~n*CsSeHXI-u4uB8>%7z6fqI6?fiqgcQDRvy$DQY*|hbwu@iYu_f z&jpERdEU%enrB;P+0?Uj*1fmJ_D>N1%eUg%ZcQz;UW>RV5JAExJ_7CYiNFMlfCM5W zp@>N2{0WamLK4R@pNbioIUev-WF&Juqo7ec-Zg z3vBR8Gi9cL3&rY@nHczee|LLyS3_&v0-5-U=|T1yI9_(nOP0H}ZdA7hGg`=gWc%^4 z$W1W9GzITe6AK3KY^uVb1Aq`9f|FSN=Bn6Ag0+oS3D89Ur7QSO6E(*HYG&1kr*hjI zeBUfCC|q09?SB8Vq2;03)Jl{}Zdo&G`XJvrR(4#Dv>pbkn++4Srd8GT-B?xU!@vasvOf1RJtWIUJiAM3#&VQ@Xje~~*q#{NLqz9N8Axb1f! zlF6W8tAGaq#;u~Y3V9f?Z zfs4Pd>RgwifVlTWSaqhQDi)aCzCwUgxb2gGF~xWw8E?IS5%Ew(sx4b5FbdvLT@@cO z;E1^AxlNpS?hyAqcZpNaG4a524>;jNHG;nTlp8~CMDI$8C!Pn?c8A&yDYxr$BjTy& zG4UR7GwuoTzULj{1JAp}hn}azN1peH?|I%QzVG<}8P@;M#b>G(-0-OSsPno|E~+<`a@|Flm0|^fx(%X@62`!OFgK`mEsD%4VRdO;dZCti zd5bPlrM!!WO+!`X7WUb?LDTYnl)b$O{4wM+ejD!&LaqZj)4~QJESl*e#wg$=X3$!ukCKA8FfVH}KpdisP{t?|lpT~^lqt#{ z%09{g$|1<_%p7Bk^7rY}FXu0;GIsv*=4N>{f3{g%3A1`;^h;P1J3rIcxq6ltx}J-w zn%l*dS_wN}=(1Kf_2X(|(AqeD`w2+G($;wE*U+oaFh6b4|K9A*zo4`KyAxc}A%_OM zi*6+jp%Mcgdq&3wyyqDm8}P(4IyT^a&*<2Ir=HQV0Uvlq#|GfoyZ0r;BhTpKfR8<+ zivvFKj4mGX9kmN%N7n{?>T~GY3Exv~$e}|6aMZ5rohg}7SN?v5S zblvaGt+Bbt4v%ggPp}10w|529dq#lI#_D6neCe+*f(*6Pgb~-6raz!|6Ltg z81zrGFgWtpP6?;;9Bzv~Yb<8)8FcA7aG1d1*+%NzuaL_|f#?Kf4jYQ~&?~ literal 0 HcmV?d00001 diff --git a/app/schemas/__pycache__/response.cpython-310.pyc b/app/schemas/__pycache__/response.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5c2da0f1589d79a70c65ba1829a6451ab9cde16d GIT binary patch literal 482 zcmYjNu};G<5VhkZ4OJ?ZE)1+lkq{q%DpX)#YNoR2L`f)fS3NX_VvKIi5P+mqlGK|M zVBkwS!ft5*A@oiNYUVWd@NM(}rct$lv}e|N4#rGvufiY}kVH1(ycQL3Zu^{9O0G-C zW6qz~qTE;fC#6bz%(=y>#bGZNj literal 0 HcmV?d00001 diff --git a/app/schemas/__pycache__/site.cpython-310.pyc b/app/schemas/__pycache__/site.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..43a97617e6225a829a2c2491b51ef0d233ec72d0 GIT binary patch literal 971 zcmZvb%Wl*#6o&0MNi#E5k$~}lr*6f zW3TW^mM}^_5W$51jR;?|2bTCExFC!07px!)>Y|Tzqjbd!hzIYvm1kPWBFF6G#sE&B z+aDm3Bvg>ZyCjlHU(h9y0gT>mWV_K{5)mY!+>`8>Kt2TCOCsQ)<*4OB&x4kSJr7$R z^*m}h?l}eyk}+_%|G4Ez&y$v?Jx_sW$*f<$zr@-ch(oB&;e(g#i#@2!-1!%(kHX<(U#4JL&uRg&m%g}k2xnY)-TC59<<1D*d^J15Yv?(zszZ3Hu_HE_&+tWAcrIp5}xA*tgH|hB{ zzu~4lH~LoQjZM$=M#*zk=qBZLo!b0HmfWTm4b)o~b|#L{EMCrtMAW>1U~ypPc*rvp zOgjdJanmg06;zAk9kk$)*~XXwPJ;VR3|@aTLWxnvC=-+^3YNp{qa32(IsZPTi;nRf zItiiMmmov1)IBr$^f~a_*{en1!e(2m>bf^r JjY;gy*&l&Q*gF6K literal 0 HcmV?d00001 diff --git a/app/schemas/__pycache__/subscribe.cpython-310.pyc b/app/schemas/__pycache__/subscribe.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..08286713b767b1acfd6e36fea1ffc28c0304f74b GIT binary patch literal 965 zcmZuwPfy!06nEk@4J92=U=oL2Csmp_PZOFD9Co6s#JE_IA~${%LlOtu-P#>?VP9t7 zXD45G+E>_V&uL+ihAqGMdw%x&YpdaKKybX0-^AOHkY8TtjtGTQT;>fDK}1lJDqun2 zaae{GWi%ikh@c|+PDBLsfwD;SF3C9ljW@_RaLLEUN>%d`@zxnPaG?a0h1YfmMd1{e z`H2Jw3j|@|6#)v72u=v}kcS&iH#|ZfL+^;7uD98XJA3^W(^j8!_P08C(81dsoObZA z#cMk+I(VmpcRT0zPJB&9VjpX={}8giIKYY=x~TV1PgZ;mZd-u2)Rxx8*Rr&rU0>Ekxe#avmMvgI zt1K^bXr#fav!StE+b1zCd2#nBVK~ade|-ra`?A~ViwGDMA?8HC?mp#oe6H$iIsY^n zM=r^8pIn~1L7rDiEJ}~lJilM?a-&I9cbbws$7u po{O>DvYxjdSkkNnudOV!{{!ur=N!7^WL?Pjz9q)HPDvUb(7%7@;!6Mk literal 0 HcmV?d00001 diff --git a/app/schemas/__pycache__/token.cpython-310.pyc b/app/schemas/__pycache__/token.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4ed174b97326e9fa2895776210d7fe1164c3167e GIT binary patch literal 645 zcma)3v2NQi5G6%PmKC|_kflSiYsm)$Mi4YZr?>`MFMRH7o`9dU<@h>7{#eT9X2A;?icp7*jXWvMf{ecOjq(1vPx>gUOgM9v3SaqeP>Kg36 zJq*YNTzdkbNJS;7q76|@#gZ=fF=dZpq)USmh<1l6d)qN-}B3}dSjKb_3gvM&9+`o z%~qIxZS<{boUO0)eXG`Or(G?^v9`@t^}^Oc%IP>6bTq}i5OR{yf`;0A4Un_~3smxn zs8pf>6bxX#2nMXh)M+7Cp4r`XIWseqogvH-4iO>%&)UJ61EjB;?Xv~eJ^*0TqS%}q w(NI~HsZYVocDM;cs%)I37+l*J{8?d(@bG^#eYV_Neok>PYAQ$(ePl<;KNR|l`Tzg` literal 0 HcmV?d00001 diff --git a/app/schemas/__pycache__/user.cpython-310.pyc b/app/schemas/__pycache__/user.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..17a40990af77ea5c6c5629735e60f0a5393f2674 GIT binary patch literal 1612 zcmb7E&2G~`5Z?9g#&w8k3*tv`K|->G`T(e)szsn8HB_RxSdlD~-8QZq+w3}}L5NFv znZD9qIq?ddm{})n)g}ilc|70Fc>K+`v#z?`fWY-E|H=1lLVhE-c{u=f;8s7taKdRp zCN!ZGeXFo0c4AZVfpD8UzX*4PePJgKV3&JdX$0sEW*W(IqJJ3Ig!80-UH<00Ts z_>j*4clkZQ_YCgv-e(d=e}Dmrsb-(*Ca=n@0Kc=FDREG7QH(Hp^MY<#<{!ZkB%z!n z)&M$4Y~cv^F%cfOwt;!#17-$0fZe1c7{omAX#x!Axjtgx!898vA@Rd~?TSg37e~62 zt27%m`I&gHL-5tK7IF${x^p}&inPooB3{!hHC~$PAWbI~pB4iAFipQsvjTI{RJuS{ zT41!T8mW6}nw4eMWZ1KUxQ8L5ZOF!5YPbuT^%63Jt?wA82YAX&FW04ZF{vn_XN= zcoU)z;a0erNEr0RwbgWALG)VR+d~WoW_|!Kti(5C>go_x-Y?(nwxeq0{7!iaRd?W4 zDC43$7B_v{-#2cS*xIYga@%aSgH2!0WnXT< zTT2N%fxru_yVypUI$T>#0QX_-f~Qv}Vl@X8AVvBksrAc H+w}ecx!NDS literal 0 HcmV?d00001 diff --git a/app/schemas/context.py b/app/schemas/context.py new file mode 100644 index 00000000..7849c2c7 --- /dev/null +++ b/app/schemas/context.py @@ -0,0 +1,86 @@ +from typing import Optional + +from pydantic import BaseModel + + +class MetaInfo(BaseModel): + # 是否处理的文件 + isfile: bool = False + # 原字符串 + org_string: Optional[str] = None + # 副标题 + subtitle: Optional[str] = None + # 类型 电影、电视剧 + type: Optional[str] = None + # 识别的中文名 + cn_name: Optional[str] = None + # 识别的英文名 + en_name: Optional[str] = None + # 年份 + year: Optional[str] = None + # 总季数 + total_seasons: int = 0 + # 识别的开始季 数字 + begin_season: Optional[int] = None + # 识别的结束季 数字 + end_season: Optional[int] = None + # 总集数 + total_episodes: int = 0 + # 识别的开始集 + begin_episode: Optional[int] = None + # 识别的结束集 + end_episode: Optional[int] = None + # Partx Cd Dvd Disk Disc + part: Optional[str] = None + # 识别的资源类型 + resource_type: Optional[str] = None + # 识别的效果 + resource_effect: Optional[str] = None + # 识别的分辨率 + resource_pix: Optional[str] = None + # 识别的制作组/字幕组 + resource_team: Optional[str] = None + # 视频编码 + video_encode: Optional[str] = None + # 音频编码 + audio_encode: Optional[str] = None + + +class MediaInfo(BaseModel): + # 类型 电影、电视剧 + type: Optional[str] = None + # 媒体标题 + title: Optional[str] = None + # 年份 + year: Optional[str] = None + # TMDB ID + tmdb_id: Optional[str] = None + # IMDB ID + imdb_id: Optional[str] = None + # TVDB ID + tvdb_id: Optional[str] = None + # 豆瓣ID + douban_id: Optional[str] = None + # 媒体原语种 + original_language: Optional[str] = None + # 媒体原发行标题 + original_title: Optional[str] = None + # 媒体发行日期 + release_date: Optional[str] = None + # 背景图片 + backdrop_path: Optional[str] = None + # 海报图片 + poster_path: Optional[str] = None + # 评分 + vote_average: int = 0 + # 描述 + overview: Optional[str] = None + # 二级分类 + category: str = "" + + +class Context(BaseModel): + # 元数据 + meta_info: Optional[MetaInfo] + # 媒体信息 + media_info: Optional[MediaInfo] diff --git a/app/schemas/response.py b/app/schemas/response.py new file mode 100644 index 00000000..25bd963c --- /dev/null +++ b/app/schemas/response.py @@ -0,0 +1,8 @@ +from typing import Optional + +from pydantic import BaseModel + + +class Response(BaseModel): + success: bool + message: Optional[str] = None diff --git a/app/schemas/site.py b/app/schemas/site.py new file mode 100644 index 00000000..22caac9a --- /dev/null +++ b/app/schemas/site.py @@ -0,0 +1,23 @@ +from typing import Optional + +from pydantic import BaseModel + + +class Site(BaseModel): + id: int + name: str + domain: str + url: str + pri: Optional[int] = 0 + rss: Optional[str] = None + cookie: Optional[str] = None + ua: Optional[str] = None + filter: Optional[str] = None + note: Optional[str] = None + limit_interval: Optional[int] = 0 + limit_count: Optional[int] = 0 + limit_seconds: Optional[int] = 0 + is_active: Optional[str] = 'N' + + class Config: + orm_mode = True diff --git a/app/schemas/subscribe.py b/app/schemas/subscribe.py new file mode 100644 index 00000000..2999e72e --- /dev/null +++ b/app/schemas/subscribe.py @@ -0,0 +1,26 @@ +from typing import Optional + +from pydantic import BaseModel + + +class Subscribe(BaseModel): + id: int + name: str + year: str + type: str + keyword: Optional[str] + tmdbid: str + doubanid: Optional[str] + season: Optional[int] + image: Optional[str] + description: Optional[str] + filter: Optional[str] + include: Optional[str] + exclude: Optional[str] + total_episode: Optional[int] + start_episode: Optional[int] + lack_episode: Optional[int] + note: Optional[str] + + class Config: + orm_mode = True diff --git a/app/schemas/token.py b/app/schemas/token.py new file mode 100644 index 00000000..ea85b460 --- /dev/null +++ b/app/schemas/token.py @@ -0,0 +1,12 @@ +from typing import Optional + +from pydantic import BaseModel + + +class Token(BaseModel): + access_token: str + token_type: str + + +class TokenPayload(BaseModel): + sub: Optional[int] = None diff --git a/app/schemas/user.py b/app/schemas/user.py new file mode 100644 index 00000000..8815d3da --- /dev/null +++ b/app/schemas/user.py @@ -0,0 +1,42 @@ +from typing import Optional + +from pydantic import BaseModel + + +# Shared properties +class UserBase(BaseModel): + email: Optional[str] = None + is_active: Optional[bool] = True + is_superuser: bool = False + full_name: Optional[str] = None + + +# Properties to receive via API on creation +class UserCreate(UserBase): + full_name: str + email: str + password: str + + +# Properties to receive via API on update +class UserUpdate(UserBase): + full_name: str + password: Optional[str] = None + + +class UserInDBBase(UserBase): + id: Optional[int] = None + + class Config: + orm_mode = True + + +# Additional properties to return via API +class User(UserInDBBase): + full_name: str + email: str + + +# Additional properties stored in DB +class UserInDB(UserInDBBase): + hashed_password: str diff --git a/app/utils/__init__.py b/app/utils/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/app/utils/__pycache__/__init__.cpython-310.pyc b/app/utils/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1a2c5f73420507c7299277e30131e3c1ad629dc9 GIT binary patch literal 156 zcmd1j<>g`k0@=*E6cGIwL?8o3AjbiSi&=m~3PUi1CZpdI zlT}fXo)HsJnVgYWlp9c#pOu+ zU?Vdi*$q&F2pW@wHYg>Jh+x9nCBoWa4JP;^@$FyWLwsuNFw+c3_862T z4Jt^3NlR3PCAr`rwzMUePMeLBwj&%-*|m3QqXIrP;Q~G&d7BGQ43>6RFvvP&+_^Ma z)=``pQa7#+J3%*0q^X2j_cube!#vh44tdX41vXgREJ!v7sv!HMpa*o57hFviOpO&> z&~dU)3kFuZu+?Z`FOtFnDUnsS=@bt5I;&^{@mYQgLV1(_*4g`aCvV?8n}2e$|N8XP z_v5W^7m%Xh=yNmLk@{gQ6WP_-gN>!IQ^&Vg!Fpe76+O?jG+sMWnVwyVVqv%lb?8?b zWu1|hiLxP(a!_GSC4e!qh6@C&g>fzwGXH_7D*XMPo}F$kXHsR&)%EqxN^@bOwGygi zL8Ys*rL*RIx)#ZWC{A@V?Dd*C65AAMGS%BK14wQe67ywapgfyXPKQ9?XM2A*bzt{$ zvMW5=S zKDH#+bv+f*SeaJ7V=R%jjMEDhv`k%rbZQtBREIuXgLg@EU)2zDLm>i$ufZw9E_k*_ zU0}^auC88ib?)agg?!X~TK5Nx8&3SX!2E5K|SPKiqxyGhyb1TF1#-!hKg=tbR58Lu>63Q)%D S*Lb)8vU@n!8OE!U5$i9IOcz@K literal 0 HcmV?d00001 diff --git a/app/utils/__pycache__/http.cpython-310.pyc b/app/utils/__pycache__/http.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..974ab5959be3c94c738c1d5071fd67b94854b8e0 GIT binary patch literal 3779 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 biZKtV11aZReeMr+ag{n-4sx)MPZ|FKAMcAG literal 0 HcmV?d00001 diff --git a/app/utils/__pycache__/tokens.cpython-310.pyc b/app/utils/__pycache__/tokens.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ce54d0a4344bc4672517e643ad858cf7becc1d58 GIT binary patch literal 1367 zcmZvcOK;RL5XWujv1yv!mhvo*0|FreqMU((kcz~KRi)BP2(p&7DQVMWak8jXE<%DM zNbm(vd))5;U&L2VoVas9%sAWC7VygU#N*h%`Ojp_b~_}{E@W@SSBH@A_%PjIjogP` zorOUVL35IjheR;pyeGnW#}X>&8j0N>;3wTaj?-=OegdnKz;2STbvP$+q$@qamf@7d zmo2c}WwJq%K+b^e!MZP6?@1DhK+M2AD?%{~b0i|shPf>|Vh-kxn1}n18UJy)C5y@s z&Sq4dT+^wFx+IXEoch=T1g%^r}a;hv)%wV=r++XoAydl_JSG3yR*!5it4POIxWy{gk#r%&`#eM6_$ z_4l`*pnujk_0Ml#^c{Ugr&?dq92P%7|ES-@u3<_VuNvf8-Du=PWU>&kt1t?Mg_cCt zFB|ESpc+1Fl7*sK=U60CHF+hdchEnUwt%co)S$0+eG)tjfQS==xINWizMf9tT*B~FIgi@K8)iRO(MD->MeE;x98N^Kh*t$a3|b-7Jfw1 z2Ua`%+L}F#4iuLvI$p0=N71rPj}nYU}A}*458#`JeZ8nK4zG7P$kV%yH1}_>Nt>UHKRa|5gsF zUA?*2s+#AsvUr}Yc6h5N#?b9T)rk6m6cif-&zX6+ete*e? literal 0 HcmV?d00001 diff --git a/app/utils/dom.py b/app/utils/dom.py new file mode 100644 index 00000000..55004347 --- /dev/null +++ b/app/utils/dom.py @@ -0,0 +1,33 @@ +from typing import Union + + +class DomUtils: + + @staticmethod + def tag_value(tag_item, tag_name: str, attname: str = "", default: Union[str, int] = None): + """ + 解析XML标签值 + """ + tagNames = tag_item.getElementsByTagName(tag_name) + if tagNames: + if attname: + attvalue = tagNames[0].getAttribute(attname) + if attvalue: + return attvalue + else: + firstChild = tagNames[0].firstChild + if firstChild: + return firstChild.data + return default + + @staticmethod + def add_node(doc, parent, name: str, value: str = None): + """ + 添加一个DOM节点 + """ + node = doc.createElement(name) + parent.appendChild(node) + if value is not None: + text = doc.createTextNode(str(value)) + node.appendChild(text) + return node diff --git a/app/utils/http.py b/app/utils/http.py new file mode 100644 index 00000000..0d0db8ff --- /dev/null +++ b/app/utils/http.py @@ -0,0 +1,172 @@ +from typing import Union, Any + +import requests +import urllib3 +from requests import Session +from urllib3.exceptions import InsecureRequestWarning + +urllib3.disable_warnings(InsecureRequestWarning) + + +class RequestUtils: + _headers: dict = None + _cookies: Union[str, dict] = None + _proxies: dict = None + _timeout: int = 20 + _session: Session = None + + def __init__(self, + headers: dict = None, + ua: str = None, + cookies: Union[str, dict] = None, + proxies: dict = None, + session: Session = None, + timeout: int = None, + referer: str = None, + content_type: str = None, + accept_type: str = None): + if not content_type: + content_type = "application/x-www-form-urlencoded; charset=UTF-8" + if headers: + self._headers = headers + else: + self._headers = { + "User-Agent": ua, + "Content-Type": content_type, + "Accept": accept_type, + "referer": referer + } + if cookies: + if isinstance(cookies, str): + self._cookies = self.cookie_parse(cookies) + else: + self._cookies = cookies + if proxies: + self._proxies = proxies + if session: + self._session = session + if timeout: + self._timeout = timeout + + def post(self, url: str, data: Any = None, json: dict = None): + if json is None: + json = {} + try: + if self._session: + return self._session.post(url, + data=data, + verify=False, + headers=self._headers, + proxies=self._proxies, + timeout=self._timeout, + json=json) + else: + return requests.post(url, + data=data, + verify=False, + headers=self._headers, + proxies=self._proxies, + timeout=self._timeout, + json=json) + except requests.exceptions.RequestException: + return None + + def get(self, url: str, params: dict = None): + try: + if self._session: + r = self._session.get(url, + verify=False, + headers=self._headers, + proxies=self._proxies, + timeout=self._timeout, + params=params) + else: + r = requests.get(url, + verify=False, + headers=self._headers, + proxies=self._proxies, + timeout=self._timeout, + params=params) + return str(r.content, 'utf-8') + except requests.exceptions.RequestException: + return None + + def get_res(self, url: str, params: dict = None, allow_redirects: bool = True, raise_exception: bool = False): + try: + if self._session: + return self._session.get(url, + params=params, + verify=False, + headers=self._headers, + proxies=self._proxies, + cookies=self._cookies, + timeout=self._timeout, + allow_redirects=allow_redirects) + else: + return requests.get(url, + params=params, + verify=False, + headers=self._headers, + proxies=self._proxies, + cookies=self._cookies, + timeout=self._timeout, + allow_redirects=allow_redirects) + except requests.exceptions.RequestException: + if raise_exception: + raise requests.exceptions.RequestException + return None + + def post_res(self, url: str, data: Any = None, params: dict = None, allow_redirects: bool = True, + files: Any = None, + json: dict = None): + try: + if self._session: + return self._session.post(url, + data=data, + params=params, + verify=False, + headers=self._headers, + proxies=self._proxies, + cookies=self._cookies, + timeout=self._timeout, + allow_redirects=allow_redirects, + files=files, + json=json) + else: + return requests.post(url, + data=data, + params=params, + verify=False, + headers=self._headers, + proxies=self._proxies, + cookies=self._cookies, + timeout=self._timeout, + allow_redirects=allow_redirects, + files=files, + json=json) + except requests.exceptions.RequestException: + return None + + @staticmethod + def cookie_parse(cookies_str: str, array: bool = False): + """ + 解析cookie,转化为字典或者数组 + :param cookies_str: cookie字符串 + :param array: 是否转化为数组 + :return: 字典或者数组 + """ + if not cookies_str: + return {} + cookie_dict = {} + cookies = cookies_str.split(';') + for cookie in cookies: + cstr = cookie.split('=') + if len(cstr) > 1: + cookie_dict[cstr[0].strip()] = cstr[1].strip() + if array: + cookiesList = [] + for cookieName, cookieValue in cookie_dict.items(): + cookies = {'name': cookieName, 'value': cookieValue} + cookiesList.append(cookies) + return cookiesList + return cookie_dict diff --git a/app/utils/object.py b/app/utils/object.py new file mode 100644 index 00000000..9265bfd8 --- /dev/null +++ b/app/utils/object.py @@ -0,0 +1,11 @@ +from typing import Any + + +class ObjectUtils: + + @staticmethod + def is_obj(obj: Any): + if isinstance(obj, list) or isinstance(obj, dict): + return True + else: + return str(obj).startswith("{") or str(obj).startswith("[") diff --git a/app/utils/singleton.py b/app/utils/singleton.py new file mode 100644 index 00000000..a6bf423d --- /dev/null +++ b/app/utils/singleton.py @@ -0,0 +1,20 @@ +import abc + + +class Singleton(abc.ABCMeta, type): + """ + 类单例模式 + """ + + _instances: dict = {} + + def __call__(cls, *args, **kwargs): + if cls not in cls._instances: + cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs) + return cls._instances[cls] + + +class AbstractSingleton(abc.ABC, metaclass=Singleton): + """ + 抽像类单例模式 + """ \ No newline at end of file diff --git a/app/utils/string.py b/app/utils/string.py new file mode 100644 index 00000000..d72707d9 --- /dev/null +++ b/app/utils/string.py @@ -0,0 +1,514 @@ +import bisect +import datetime +import hashlib +import random +import re +from typing import Union, Tuple, Optional, Any, List, Generator +from urllib import parse + +import cn2an +import dateparser +import dateutil.parser + +from app.utils.types import MediaType + + +class StringUtils: + + @staticmethod + def num_filesize(text: Union[str, int, float]) -> int: + """ + 将文件大小文本转化为字节 + """ + if not text: + return 0 + if not isinstance(text, str): + text = str(text) + if text.isdigit(): + return int(text) + text = text.replace(",", "").replace(" ", "").upper() + size = re.sub(r"[KMGTPI]*B?", "", text, flags=re.IGNORECASE) + try: + size = float(size) + except ValueError: + return 0 + if text.find("PB") != -1 or text.find("PIB") != -1: + size *= 1024 ** 5 + elif text.find("TB") != -1 or text.find("TIB") != -1: + size *= 1024 ** 4 + elif text.find("GB") != -1 or text.find("GIB") != -1: + size *= 1024 ** 3 + elif text.find("MB") != -1 or text.find("MIB") != -1: + size *= 1024 ** 2 + elif text.find("KB") != -1 or text.find("KIB") != -1: + size *= 1024 + return round(size) + + @staticmethod + def str_timelong(time_sec: Union[str, int, float]) -> str: + """ + 将数字转换为时间描述 + """ + if not isinstance(time_sec, int) or not isinstance(time_sec, float): + try: + time_sec = float(time_sec) + except ValueError: + return "" + d = [(0, '秒'), (60 - 1, '分'), (3600 - 1, '小时'), (86400 - 1, '天')] + s = [x[0] for x in d] + index = bisect.bisect_left(s, time_sec) - 1 + if index == -1: + return str(time_sec) + else: + b, u = d[index] + return str(round(time_sec / (b + 1))) + u + + @staticmethod + def is_chinese(word: Union[str, list]) -> bool: + """ + 判断是否含有中文 + """ + if isinstance(word, list): + word = " ".join(word) + chn = re.compile(r'[\u4e00-\u9fff]') + if chn.search(word): + return True + else: + return False + + @staticmethod + def is_japanese(word: str) -> bool: + """ + 判断是否含有日文 + """ + jap = re.compile(r'[\u3040-\u309F\u30A0-\u30FF]') + if jap.search(word): + return True + else: + return False + + @staticmethod + def is_korean(word: str) -> bool: + """ + 判断是否包含韩文 + """ + kor = re.compile(r'[\uAC00-\uD7FF]') + if kor.search(word): + return True + else: + return False + + @staticmethod + def is_all_chinese(word: str) -> bool: + """ + 判断是否全是中文 + """ + for ch in word: + if ch == ' ': + continue + if '\u4e00' <= ch <= '\u9fff': + continue + else: + return False + return True + + @staticmethod + def str_int(text: str) -> int: + """ + web字符串转int + :param text: + :return: + """ + if text: + text = text.strip() + if not text: + return 0 + try: + return int(text.replace(',', '')) + except ValueError: + return 0 + + @staticmethod + def str_float(text: str) -> float: + """ + web字符串转float + :param text: + :return: + """ + if text: + text = text.strip() + if not text: + return 0.0 + try: + text = text.replace(',', '') + if text: + return float(text) + except ValueError: + pass + return 0.0 + + @staticmethod + def clear_special_chars(text: Union[list, str], replace_word: str = "", + allow_space: bool = False) -> Union[list, str]: + """ + 忽略特殊字符 + """ + # 需要忽略的特殊字符 + CONVERT_EMPTY_CHARS = r"[、.。,,·::;;!!'’\"“”()()\[\]【】「」\-——\+\|\\_/&#~~]" + if not text: + return text + if not isinstance(text, list): + text = re.sub(r"[\u200B-\u200D\uFEFF]", + "", + re.sub(r"%s" % CONVERT_EMPTY_CHARS, replace_word, text), + flags=re.IGNORECASE) + if not allow_space: + return re.sub(r"\s+", "", text) + else: + return re.sub(r"\s+", " ", text).strip() + else: + return [StringUtils.clear_special_chars(x) for x in text] + + @staticmethod + def str_filesize(size: Union[str, float, int], pre: int = 2) -> str: + """ + 将字节计算为文件大小描述(带单位的格式化后返回) + """ + if size is None: + return "" + size = re.sub(r"\s|B|iB", "", str(size), re.I) + if size.replace(".", "").isdigit(): + try: + size = float(size) + d = [(1024 - 1, 'K'), (1024 ** 2 - 1, 'M'), (1024 ** 3 - 1, 'G'), (1024 ** 4 - 1, 'T')] + s = [x[0] for x in d] + index = bisect.bisect_left(s, size) - 1 + if index == -1: + return str(size) + "B" + else: + b, u = d[index] + return str(round(size / (b + 1), pre)) + u + except ValueError: + return "" + if re.findall(r"[KMGTP]", size, re.I): + return size + else: + return size + "B" + + @staticmethod + def url_equal(url1: str, url2: str) -> bool: + """ + 比较两个地址是否为同一个网站 + """ + if not url1 or not url2: + return False + if url1.startswith("http"): + url1 = parse.urlparse(url1).netloc + if url2.startswith("http"): + url2 = parse.urlparse(url2).netloc + if url1.replace("www.", "") == url2.replace("www.", ""): + return True + return False + + @staticmethod + def get_url_netloc(url: str) -> Tuple[str, str]: + """ + 获取URL的协议和域名部分 + """ + if not url: + return "", "" + if not url.startswith("http"): + return "http", url + addr = parse.urlparse(url) + return addr.scheme, addr.netloc + + @staticmethod + def get_url_domain(url: str) -> str: + """ + 获取URL的域名部分,只保留最后两级 + """ + if not url: + return "" + _, netloc = StringUtils.get_url_netloc(url) + if netloc: + return ".".join(netloc.split(".")[-2:]) + return "" + + @staticmethod + def get_url_sld(url: str) -> str: + """ + 获取URL的二级域名部分,不含端口,若为IP则返回IP + """ + if not url: + return "" + _, netloc = StringUtils.get_url_netloc(url) + if not netloc: + return "" + netloc = netloc.split(":")[0].split(".") + if len(netloc) >= 2: + return netloc[-2] + return netloc[0] + + @staticmethod + def get_base_url(url: str) -> str: + """ + 获取URL根地址 + """ + if not url: + return "" + scheme, netloc = StringUtils.get_url_netloc(url) + return f"{scheme}://{netloc}" + + @staticmethod + def clear_file_name(name: str) -> Optional[str]: + if not name: + return None + return re.sub(r"[*?\\/\"<>~|]", "", name, flags=re.IGNORECASE).replace(":", ":") + + @staticmethod + def generate_random_str(randomlength: int = 16) -> str: + """ + 生成一个指定长度的随机字符串 + """ + random_str = '' + base_str = 'ABCDEFGHIGKLMNOPQRSTUVWXYZabcdefghigklmnopqrstuvwxyz0123456789' + length = len(base_str) - 1 + for i in range(randomlength): + random_str += base_str[random.randint(0, length)] + return random_str + + @staticmethod + def get_time(date: Any) -> datetime: + try: + return dateutil.parser.parse(date) + except dateutil.parser.ParserError: + return None + + @staticmethod + def unify_datetime_str(datetime_str: str) -> str: + """ + 日期时间格式化 统一转成 2020-10-14 07:48:04 这种格式 + # 场景1: 带有时区的日期字符串 eg: Sat, 15 Oct 2022 14:02:54 +0800 + # 场景2: 中间带T的日期字符串 eg: 2020-10-14T07:48:04 + # 场景3: 中间带T的日期字符串 eg: 2020-10-14T07:48:04.208 + # 场景4: 日期字符串以GMT结尾 eg: Fri, 14 Oct 2022 07:48:04 GMT + # 场景5: 日期字符串以UTC结尾 eg: Fri, 14 Oct 2022 07:48:04 UTC + # 场景6: 日期字符串以Z结尾 eg: Fri, 14 Oct 2022 07:48:04Z + # 场景7: 日期字符串为相对时间 eg: 1 month, 2 days ago + :param datetime_str: + :return: + """ + # 传入的参数如果是None 或者空字符串 直接返回 + if not datetime_str: + return datetime_str + + try: + return dateparser.parse(datetime_str).strftime('%Y-%m-%d %H:%M:%S') + except Exception as e: + print(str(e)) + return datetime_str + + @staticmethod + def format_timestamp(timestamp: str, date_format: str = '%Y-%m-%d %H:%M:%S') -> str: + """ + 时间戳转日期 + :param timestamp: + :param date_format: + :return: + """ + if isinstance(timestamp, str) and not timestamp.isdigit(): + return timestamp + try: + return datetime.datetime.fromtimestamp(int(timestamp)).strftime(date_format) + except Exception as e: + print(str(e)) + return timestamp + + @staticmethod + def to_bool(text: str, default_val: bool = False) -> bool: + """ + 字符串转bool + :param text: 要转换的值 + :param default_val: 默认值 + :return: + """ + if isinstance(text, str) and not text: + return default_val + if isinstance(text, bool): + return text + if isinstance(text, int) or isinstance(text, float): + return True if text > 0 else False + if isinstance(text, str) and text.lower() in ['y', 'true', '1', 'yes', 'on']: + return True + return False + + @staticmethod + def str_from_cookiejar(cj: dict) -> str: + """ + 将cookiejar转换为字符串 + :param cj: + :return: + """ + return '; '.join(['='.join(item) for item in cj.items()]) + + @staticmethod + def get_idlist(content: str, dicts: List[dict]): + """ + 从字符串中提取id列表 + :param content: 字符串 + :param dicts: 字典 + :return: + """ + if not content: + return [] + id_list = [] + content_list = content.split() + for dic in dicts: + if dic.get('name') in content_list and dic.get('id') not in id_list: + id_list.append(dic.get('id')) + content = content.replace(dic.get('name'), '') + return id_list, re.sub(r'\s+', ' ', content).strip() + + @staticmethod + def md5_hash(data: Any) -> str: + """ + MD5 HASH + """ + if not data: + return "" + return hashlib.md5(str(data).encode()).hexdigest() + + @staticmethod + def str_timehours(minutes: int) -> str: + """ + 将分钟转换成小时和分钟 + :param minutes: + :return: + """ + if not minutes: + return "" + hours = minutes // 60 + minutes = minutes % 60 + if hours: + return "%s小时%s分" % (hours, minutes) + else: + return "%s分钟" % minutes + + @staticmethod + def str_amount(amount: object, curr="$") -> str: + """ + 格式化显示金额 + """ + if not amount: + return "0" + return curr + format(amount, ",") + + @staticmethod + def count_words(s: str) -> int: + """ + 计算字符串中包含的单词数量,只适用于简单的单行文本 + :param s: 要计算的字符串 + :return: 字符串中包含的单词数量 + """ + # 匹配英文单词 + if re.match(r'^[A-Za-z0-9\s]+$', s): + # 如果是英文字符串,则按空格分隔单词,并计算单词数量 + num_words = len(s.split()) + else: + # 如果不是英文字符串,则计算字符数量 + num_words = len(s) + + return num_words + + @staticmethod + def split_text(text: str, max_length: int) -> Generator: + """ + 把文本拆分为固定字节长度的数组,优先按换行拆分,避免单词内拆分 + """ + if not text: + yield '' + # 分行 + lines = re.split('\n', text) + buf = '' + for line in lines: + if len(line.encode('utf-8')) > max_length: + # 超长行继续拆分 + blank = "" + if re.match(r'^[A-Za-z0-9.\s]+', line): + # 英文行按空格拆分 + parts = line.split() + blank = " " + else: + # 中文行按字符拆分 + parts = line + part = '' + for p in parts: + if len((part + p).encode('utf-8')) > max_length: + # 超长则Yield + yield (buf + part).strip() + buf = '' + part = f"{blank}{p}" + else: + part = f"{part}{blank}{p}" + if part: + # 将最后的部分追加到buf + buf += part + else: + if len((buf + "\n" + line).encode('utf-8')) > max_length: + # buf超长则Yield + yield buf.strip() + buf = line + else: + # 短行直接追加到buf + if buf: + buf = f"{buf}\n{line}" + else: + buf = line + if buf: + # 处理文本末尾剩余部分 + yield buf.strip() + + @staticmethod + def get_keyword(content: str) \ + -> Tuple[Optional[MediaType], Optional[str], Optional[int], Optional[int], Optional[str], Optional[str]]: + """ + 从搜索关键字中拆分中年份、季、集、类型 + """ + if not content: + return None, None, None, None, None, None + + # 去掉查询中的电影或电视剧关键字 + mtype = MediaType.TV if re.search(r'^(电视剧|动漫|\s+电视剧|\s+动漫)', content) else None + content = re.sub(r'^(电影|电视剧|动漫|\s+电影|\s+电视剧|\s+动漫)', '', content).strip() + + # 稍微切一下剧集吧 + season_num = None + episode_num = None + season_re = re.search(r'第\s*([0-9一二三四五六七八九十]+)\s*季', content, re.IGNORECASE) + if season_re: + mtype = MediaType.TV + season_num = int(cn2an.cn2an(season_re.group(1), mode='smart')) + + episode_re = re.search(r'第\s*([0-9一二三四五六七八九十百零]+)\s*集', content, re.IGNORECASE) + if episode_re: + mtype = MediaType.TV + episode_num = int(cn2an.cn2an(episode_re.group(1), mode='smart')) + if episode_num and not season_num: + season_num = 1 + + year_re = re.search(r'[\s(]+(\d{4})[\s)]*', content) + year = year_re.group(1) if year_re else None + + key_word = re.sub( + r'第\s*[0-9一二三四五六七八九十]+\s*季|第\s*[0-9一二三四五六七八九十百零]+\s*集|[\s(]+(\d{4})[\s)]*', '', + content, flags=re.IGNORECASE).strip() + key_word = re.sub(r'\s+', ' ', key_word) if key_word else year + + return mtype, key_word, season_num, episode_num, year, content + + @staticmethod + def str_title(s: str) -> str: + """ + 大写首字母兼容None + """ + return s.title() if s else s diff --git a/app/utils/system.py b/app/utils/system.py new file mode 100644 index 00000000..519f298a --- /dev/null +++ b/app/utils/system.py @@ -0,0 +1,85 @@ +import os +import platform +import shutil +from pathlib import Path + + +class SystemUtils: + + @staticmethod + def execute(cmd: str) -> str: + """ + 执行命令,获得返回结果 + """ + try: + with os.popen(cmd) as p: + return p.readline().strip() + except Exception as err: + print(str(err)) + return "" + + @staticmethod + def is_docker() -> bool: + return Path("/.dockerenv").exists() + + @staticmethod + def is_synology() -> bool: + if SystemUtils.is_windows(): + return False + return True if "synology" in SystemUtils.execute('uname -a') else False + + @staticmethod + def is_windows() -> bool: + return True if os.name == "nt" else False + + @staticmethod + def is_macos() -> bool: + return True if platform.system() == 'Darwin' else False + + @staticmethod + def copy(src: Path, dest: Path): + """ + 复制 + """ + try: + shutil.copy2(src, dest) + return 0, "" + except Exception as err: + print(str(err)) + return -1, str(err) + + @staticmethod + def move(src: Path, dest: Path): + """ + 移动 + """ + try: + shutil.move(src.with_name(dest.name), dest) + return 0, "" + except Exception as err: + print(str(err)) + return -1, str(err) + + @staticmethod + def link(src: Path, dest: Path): + """ + 硬链接 + """ + try: + os.link(src, dest) + return 0, "" + except Exception as err: + print(str(err)) + return -1, str(err) + + @staticmethod + def softlink(src: Path, dest: Path): + """ + 软链接 + """ + try: + os.symlink(src, dest) + return 0, "" + except Exception as err: + print(str(err)) + return -1, str(err) diff --git a/app/utils/timer.py b/app/utils/timer.py new file mode 100644 index 00000000..cea7c8f2 --- /dev/null +++ b/app/utils/timer.py @@ -0,0 +1,39 @@ +import datetime +import random +from typing import List + + +class TimerUtils: + + @staticmethod + def random_scheduler(num_executions: int = 1, + begin_hour: int = 7, + end_hour: int = 23, + min_interval: int = 20, + max_interval: int = 40) -> List[datetime.datetime]: + """ + 按执行次数生成随机定时器 + :param num_executions: 执行次数 + :param begin_hour: 开始时间 + :param end_hour: 结束时间 + :param min_interval: 最小间隔分钟 + :param max_interval: 最大间隔分钟 + """ + trigger: list = [] + # 当前时间 + now = datetime.datetime.now() + # 创建随机的时间触发器 + random_trigger = now.replace(hour=begin_hour, minute=0, second=0, microsecond=0) + for _ in range(num_executions): + # 随机生成下一个任务的时间间隔 + interval_minutes = random.randint(min_interval, max_interval) + random_interval = datetime.timedelta(minutes=interval_minutes) + # 更新当前时间为下一个任务的时间触发器 + random_trigger += random_interval + # 达到结否时间时退出 + if now.hour > end_hour: + break + # 添加到队列 + trigger.append(random_trigger) + + return trigger diff --git a/app/utils/tokens.py b/app/utils/tokens.py new file mode 100644 index 00000000..ca49645d --- /dev/null +++ b/app/utils/tokens.py @@ -0,0 +1,38 @@ +import re + + +class Tokens: + _text: str = "" + _index: int = 0 + _tokens: list = [] + + def __init__(self, text): + self._text = text + self._tokens = [] + self.load_text(text) + + def load_text(self, text): + splited_text = re.split(r"\.|\s+|\(|\)|\[|]|-|\+|【|】|/|~|;|&|\||#|_|「|」|~", text) + for sub_text in splited_text: + if sub_text: + self._tokens.append(sub_text) + + def cur(self): + if self._index >= len(self._tokens): + return None + else: + token = self._tokens[self._index] + return token + + def get_next(self): + token = self.cur() + if token: + self._index = self._index + 1 + return token + + def peek(self): + index = self._index + 1 + if index >= len(self._tokens): + return None + else: + return self._tokens[index] diff --git a/app/utils/types.py b/app/utils/types.py new file mode 100644 index 00000000..6fc96d5a --- /dev/null +++ b/app/utils/types.py @@ -0,0 +1,21 @@ +from enum import Enum + + +class MediaType(Enum): + MOVIE = '电影' + TV = '电视剧' + UNKNOWN = '未知' + + +# 可监听事件 +class EventType(Enum): + # 插件重载 + PluginReload = "plugin.reload" + # 执行命令 + CommandExcute = "command.excute" + + +# 系统配置Key字典 +class SystemConfigKey(Enum): + # 用户已安装的插件 + UserInstalledPlugins = "UserInstalledPlugins" diff --git a/config/category.yaml b/config/category.yaml new file mode 100644 index 00000000..ed941e05 --- /dev/null +++ b/config/category.yaml @@ -0,0 +1,213 @@ +# 配置电影的分类策略, 配置为空或者不配置该项则不启用电影分类 +movie: + # 分类名同时也是目录名,会按先后顺序匹配,匹配后程序会按这个名称建立二级目录 + 动画电影: + # 匹配 genre_ids 内容类型,16是动漫 + genre_ids: '16' + 华语电影: + # 分类依据,可以是:original_language 语种、production_countries(电影)/origin_country(电视剧) 国家或地区、genre_ids 内容类型等,只要TMDB API返回的字段中有就行 + # 配置多项条件时,需要同时满足;不需要的匹配项可以删掉或者配置为空 + # 匹配值对应用,号分隔,这里是匹配语种 + original_language: 'zh,cn,bo,za' + # 未配置任何过滤条件时,则按先后顺序不符合上面分类的都会在这个分类下,建议配置在最末尾 + 外语电影: + +# 配置电视剧的分类策略, 配置为空或者不配置该项则不启用电视剧分类 +tv: + # 分类名同时也是目录名,会按先后顺序匹配,匹配后程序会按这个名称建立二级目录 + # 如果有配置动漫独立目录,则实际上不会使用到tv下的动漫二级分类 + 动漫: + # 匹配 genre_ids 内容类型,16是动漫 + genre_ids: '16' + 纪录片: + # 匹配 genre_ids 内容类型,99是纪录片 + genre_ids: '99' + 儿童: + # 匹配 genre_ids 内容类型,10762是儿童 + genre_ids: '10762' + 综艺: + # 匹配 genre_ids 内容类型,10764 10767都是综艺 + genre_ids: '10764,10767' + 国产剧: + # 匹配 origin_country 国家,CN是中国大陆,TW是中国台湾,HK是中国香港 + origin_country: 'CN,TW,HK' + 欧美剧: + # 匹配 origin_country 国家,主要欧美国家列表 + origin_country: 'US,FR,GB,DE,ES,IT,NL,PT,RU,UK' + 日韩剧: + # 匹配 origin_country 国家,主要亚洲国家列表 + origin_country: 'JP,KP,KR,TH,IN,SG' + # 未匹配以上分类,则命名为未分类 + 未分类: + + +## genre_ids 内容类型 字典,注意部分中英文是不一样的 +# 28 Action +# 12 Adventure +# 16 Animation +# 35 Comedy +# 80 Crime +# 99 Documentary +# 18 Drama +# 10751 Family +# 14 Fantasy +# 36 History +# 27 Horror +# 10402 Music +# 9648 Mystery +# 10749 Romance +# 878 Science Fiction +# 10770 TV Movie +# 53 Thriller +# 10752 War +# 37 Western +# 28 动作 +# 12 冒险 +# 16 动画 +# 35 喜剧 +# 80 犯罪 +# 99 纪录 +# 18 剧情 +# 10751 家庭 +# 14 奇幻 +# 36 历史 +# 27 恐怖 +# 10402 音乐 +# 9648 悬疑 +# 10749 爱情 +# 878 科幻 +# 10770 电视电影 +# 53 惊悚 +# 10752 战争 +# 37 西部 + +## original_language 语种 字典 +# af 南非语 +# ar 阿拉伯语 +# az 阿塞拜疆语 +# be 比利时语 +# bg 保加利亚语 +# ca 加泰隆语 +# cs 捷克语 +# cy 威尔士语 +# da 丹麦语 +# de 德语 +# dv 第维埃语 +# el 希腊语 +# en 英语 +# eo 世界语 +# es 西班牙语 +# et 爱沙尼亚语 +# eu 巴士克语 +# fa 法斯语 +# fi 芬兰语 +# fo 法罗语 +# fr 法语 +# gl 加里西亚语 +# gu 古吉拉特语 +# he 希伯来语 +# hi 印地语 +# hr 克罗地亚语 +# hu 匈牙利语 +# hy 亚美尼亚语 +# id 印度尼西亚语 +# is 冰岛语 +# it 意大利语 +# ja 日语 +# ka 格鲁吉亚语 +# kk 哈萨克语 +# kn 卡纳拉语 +# ko 朝鲜语 +# kok 孔卡尼语 +# ky 吉尔吉斯语 +# lt 立陶宛语 +# lv 拉脱维亚语 +# mi 毛利语 +# mk 马其顿语 +# mn 蒙古语 +# mr 马拉地语 +# ms 马来语 +# mt 马耳他语 +# nb 挪威语(伯克梅尔) +# nl 荷兰语 +# ns 北梭托语 +# pa 旁遮普语 +# pl 波兰语 +# pt 葡萄牙语 +# qu 克丘亚语 +# ro 罗马尼亚语 +# ru 俄语 +# sa 梵文 +# se 北萨摩斯语 +# sk 斯洛伐克语 +# sl 斯洛文尼亚语 +# sq 阿尔巴尼亚语 +# sv 瑞典语 +# sw 斯瓦希里语 +# syr 叙利亚语 +# ta 泰米尔语 +# te 泰卢固语 +# th 泰语 +# tl 塔加路语 +# tn 茨瓦纳语 +# tr 土耳其语 +# ts 宗加语 +# tt 鞑靼语 +# uk 乌克兰语 +# ur 乌都语 +# uz 乌兹别克语 +# vi 越南语 +# xh 班图语 +# zh 中文 +# cn 中文 +# zu 祖鲁语 + +## origin_country 国家地区 字典 +# AR 阿根廷 +# AU 澳大利亚 +# BE 比利时 +# BR 巴西 +# CA 加拿大 +# CH 瑞士 +# CL 智利 +# CO 哥伦比亚 +# CZ 捷克 +# DE 德国 +# DK 丹麦 +# EG 埃及 +# ES 西班牙 +# FR 法国 +# GR 希腊 +# HK 香港 +# IL 以色列 +# IN 印度 +# IQ 伊拉克 +# IR 伊朗 +# IT 意大利 +# JP 日本 +# MM 缅甸 +# MO 澳门 +# MX 墨西哥 +# MY 马来西亚 +# NL 荷兰 +# NO 挪威 +# PH 菲律宾 +# PK 巴基斯坦 +# PL 波兰 +# RU 俄罗斯 +# SE 瑞典 +# SG 新加坡 +# TH 泰国 +# TR 土耳其 +# US 美国 +# VN 越南 +# CN 中国 内地 +# GB 英国 +# TW 中国台湾 +# NZ 新西兰 +# SA 沙特阿拉伯 +# LA 老挝 +# KP 朝鲜 北朝鲜 +# KR 韩国 南朝鲜 +# PT 葡萄牙 +# MN 蒙古国 蒙古 diff --git a/config/logs/nasbot.log b/config/logs/nasbot.log new file mode 100644 index 00000000..ff97815d --- /dev/null +++ b/config/logs/nasbot.log @@ -0,0 +1,16 @@ +2023-06-06 07:08:50,349 - migration.py -【INFO】Context impl SQLiteImpl. +2023-06-06 07:08:50,349 - migration.py -【INFO】Will assume non-transactional DDL. +2023-06-06 07:08:51,149 - module_manager.py -【INFO】Moudle Loaded:Douban +2023-06-06 07:08:51,149 - module_manager.py -【INFO】Moudle Loaded:EmbyModule +2023-06-06 07:08:51,149 - module_manager.py -【INFO】Moudle Loaded:FanartModule +2023-06-06 07:08:51,149 - module_manager.py -【INFO】Moudle Loaded:FileTransferModule +2023-06-06 07:08:51,150 - module_manager.py -【INFO】Moudle Loaded:FilterModule +2023-06-06 07:08:51,150 - module_manager.py -【INFO】Moudle Loaded:IndexerModule +2023-06-06 07:08:51,150 - module_manager.py -【INFO】Moudle Loaded:JellyfinModule +2023-06-06 07:08:51,151 - module_manager.py -【INFO】Moudle Loaded:PlexModule +2023-06-06 07:08:51,151 - module_manager.py -【INFO】Moudle Loaded:QbittorrentModule +2023-06-06 07:08:51,151 - module_manager.py -【INFO】Moudle Loaded:TelegramModule +2023-06-06 07:08:51,167 - category.py -【INFO】已加载二级分类策略 category.yaml +2023-06-06 07:08:51,167 - module_manager.py -【INFO】Moudle Loaded:TheMovieDb +2023-06-06 07:08:51,167 - module_manager.py -【INFO】Moudle Loaded:TransmissionModule +2023-06-06 07:08:51,168 - module_manager.py -【INFO】Moudle Loaded:WechatModule diff --git a/config/sites/user.sites.bin b/config/sites/user.sites.bin new file mode 100644 index 00000000..89092371 --- /dev/null +++ b/config/sites/user.sites.bin @@ -0,0 +1 @@ +gAAAAABkdWj0tofALSodTwx4blKbHC2uA7Z2EXLk6jUYrd61FsOcrz74Zr0OQBdASclV1ZPIZLBoOnRMfpwWoJsPW7xQiCvdYUnbu3jEMeqI4qWc3G1rJQHSYHJw0yNHardvxZpB70081msRwuxDjeKbY_Pbnx2ai2LWE5hqs4OvlCrOh-khmKRE-0UkdNOgFOC9QTvZSI61-5iy_D6HGBkt65JgIiVwMiFwqHNq-EdI6YmVmk7Dz1Kn5bjzcLf1tM1h6cAIhkQWPkvHDiW9dhAUwMVnv2jj_MQJNXzkuPYy22JNx1fL3kVhnbuhBYx_MZaGjxxI24HsWORekPT5nuTCqoVLbfZ1zjw39Z7W8cB-BiciPIQAvvJDb5MCNdKIhUjWOXH99Vi10ZYRZQQd7l1fuLHsgt0Qxp1YwlWUo86HQuKd7VHupqyYG_YA46gyVhW-sm_wvYhl18aRm0c6Z63Me3dLPpc2LkywUwjtDwlKyyKdevWNCSXqUPOKACyYjPLF2KpxmMtpfgn0cthEVZlP3ujB_Ng2K41QWp6p31Oz5zUielCy4GtIRbBi8InKV95tvD9tJUTIxGijPiPmwSNFKtpf75bN6-s7T0FNJ3_C8o_aC1fzELSOXmVwl_5_a8PYgxowL0BJkDsnqRNIgOdtd_kQ7n4Aa_8eP9l8xK2aiCgoz9pM-UP6gqaWR_w-FNu-XFh0MEArVTMPytgycokE1KEHLEwMZmVkSfUO7_MnIG3wVMKRzRBQlcss4i1WCtufGg8WCQGQUHbu21bHgxIbiYOJs6aYA1PRylIsJ3z_OzkF_luqTm-On-VrWAgr5el0_SUbbUs34lhqvFejdCBZOYFbp28pR7U_LEInpegWFvxn_PmJkD_cPXvc7wbtc7NJML9a-Q78a0Y5ho4YnFlvNJOT0r7w8Hd4yrnEBwyV0jIiTkxh3XjugbsOKZdqiJwzHdsUokX6Od3Pd6hJAKsHB3DkPqQbG1L-2Yb-3xS_g2DcAUhBwy7u9hkfzXwtK1-vPlohGTSypbmfTW2P6xl178c3xgnp1yVx5ez81A5llypzLJmw-rSaKw1TRQpBPKW5MxIuec90XCVj6VLBCdroQlcxnZAqiUb9_VW3i1X7UqNnQqM3pSviEFue8D5LJMlRXPO0t0uitKDvEu9omigqMlQxyuVMl2482USvYeT7rLlautsi4RIGejY0YpmvD3MoLI6qrqbf8142AvSBzMjO6B6MhM-tBvqFeUXXFcb5S2mxzLPriAVnBLfTO75w-gTODE3grki-Q_RdwX7URcCmYRrSkcJFIoW0g40pMn9y6k3JwhB2NLwWrALVuu_6LPuziAvplVL9fn_h6GcmyRn0YGG0WcMO8hteEO9LrsFjEmoo6WlO1r14pcqq06GeA-Y-46RxTpF-_tSLPzLzvJ24QfFmcwla4qt7KxDs-oTtV2I9gMlY51gHWNKRQDqnyzHBBjoQZ96bsOMaVMy1aWp_2quhB49LQ3kmPk_-MztXdu1NaWYpCbRDOOf58XkmTBzqtBY4gsKUrAI5SSWyrrtkjmWrUVoOsdxVPrwc3rg8Yq48QQf7w4DPZTQr3gCLpB3lYQGWz6nEUBmrfh0VpuknO6VcTz9mdhcmHT9oucTCGqa2ia-HoX95VxW2yH0Ec49-RTnIx00KxJMomnsxXD6CoNYxHpMWQuAPjYQ7WbdlHGM7aDum3szkWIGxZOYYTWtK1eE-q3aJZN-sqaHMprtqGyl1Qrhx1V_1zVbgfQPmYTHnPT5GwMmsd8HM_HHaypAVeJ7wIywa0HuIEN3nkDQKW6SIPnd8HZdxnZbAFf6XnBzVoWMRxKkkotnl3V7mfvg8yJq-kvgfcu2lhSk8wwo_oQHtCUp36waTCRvoftRuxkmIp5u8ht_euldXUSzDxhr2QC0oCKKvtHx4UAdsdQODg7bkXuBk4AW_3QMjeVx5rHMraeBpU2lgrP1Pwsg-oumzO_bLIuz6pQEyiBU8mAOSgahvygk9_-i76XGug0LoCfI_sHsZhk0riC9yll2zREyBocwKtztYqNnUCPzDa_gqKJGQ3lnlQZRBZSvqML_FjpEmpmvr_RFCdINlzdypBJnMvUxCE5A4njcGj2b0trpiXdkq3ZaAQGJVtdNXWnL2DH7FJZICKBRBXMn1SpwvgIHYNlhzbnK1NYki-B_q6S8BO9ZkCD-WxqjavQ2gKtHfIR4z8hGQgM9Zlq5nRfWhveKUw4K4s-xH02MNJkTbpQv9fReM12YvGkAzAawEadu28WvKVjLRYwxH8I7kOQggFGF8nPguGNwzWpCfB8HaL8HuBGNvDkaVg7JrdkmelJoKVKxaBDFOTlbgabONGPcvSX5ILigLmqbrlefS--nBXoAv2W7fZuIkdtWygIt7FmQmn5_jYF0DAiR7fOwx7uI5MGPfKSEf4J2dm4p2mUNP3EuyTyjU-Etz4p8662sf0HxtfkaWEMufVZN8gVKZWPdDUF5aYffE62mEULZXlZlNg7_-ooInIqtM4fxpfNyoL632NponvSh2N5aD-zptcmUN6xg9YiRMj3BPQPFiDjSjps5LRD6WdSo0rgRLrMAiZZjNLawEoddko8twqa79WMP5ShpA2GROPjSgU7TBoReo8tqRx0xgYjXfAaSjcaHG0MuHL1Ge6m7f3f30r8OPU85nLHRY7IkgjhYwOn0xqZtdT8vLP4QdIyDhWsLqjA9SMIF2x2kwbRNo6YiACbeE-Iwg4DfCCuXEO2HUpAOvR4EFgEqIDCnr-alTtfzibC4-F-3r61h0qWTn80DRm3tdSX8Mc7kD2miKaL1CIv9IUTtOWMThHrB3_tI9ffS8rqtsPJdW-XAoKbo9za1WOoGu63asj9YgnXSNDUnfBvtXd0ndLs68CQz8MG7ht_RtqsYjh4zJ9CwPSkHAhNtCp0kcNHZ3QZuJd32T4aKuVmE1bQPY8IAjzqvbAhK7XQaNK3jtfvsN4l8OI09shwNk-AHuXBvhw0A_Rc6rwp_CtEmy7ZWnsXFf6C_kMU7gE1AlBNjh_s10JO_4pacog9__ky08KzkPGSnWdpnq9RMlHCKIBaHM4c5sMu0pCuP62teGIgiKjd1ovWKymei0I8ZRKanFI9RQlSte2cqbE-KJs7hUKuuCfPQlFtgD6CByda2mcpNKWDVpHbpXtfCRoGZH7GpQ1WCT62FO4QSOdk6ETQAmGPULHEgci_zbEKKncAcygAHa5q3mXjts52YEvqYuOdthFtOVyF8cg6Wg1Wa2h7ULNhOS9xSh8cv3YYDtfw8Vox2L016DzXzqx2n4g1YGaLhbJoQJ-cf3spTxRzEJX5VI7GZKyZ_w32An3l_yBSzViSp8C-OMmhjeYI-fCCTgZaxPootln4Dd9D73C9HUY8nzy2ic95s_8X39gbr6seEOjMgaqnCVfSMu-LN4NG93ZNrTS0o30LfDiWNAT5b7MgbcwURblu_Yj3mt3B1tG4v0Z_TBlOigtmia-RelQBMw72qgDTny8C9UodvqSUVocoC1G6ZdOmtGBW1XOAmxMlGGhjBJB3DyvKMVirEmQn_uukWvr0R-LfBJgsuy4Bo1hwXrleHyxOUlZS70bmENYN-41-i2II-DdqkF8znosP_kU8LjmIVf5yCOC2muOuixVfgaoXJ-8xkS2OMe-H5NvkEUojtrqT9xui5EQryLs0w-9TFJB4GeB50rAj1QzGYeWeHTk-qPlVl5A0Rmnn4bZyO4JbvKo0SwvaCLoA9oDF23Ji6USGLfd_VkS-_HDtWy7X8DrcOCZAHEkc9h14P7XorbjHcF5CDP6UH_Xntrh2iYPwh5Py-3WmKYvg0Ma_om9UKOdXx7O4FD0_3vxBPmCvHJhKXHNzKwJqm_orfrn96YgLlEZ6rp2qy0wFpaWduLOMskYx_xm8F9GwQ2v0_NM045pJ3P270dahda9DRVAcfg9A4f83WNgcGO6NAzujW0o896UQJdUll8K9qbfUVGGHV6vP1Cu8IsMCUDS1AOHGn8aNJJRwScxVeDcqpudaNa0OlcKKgSsLMhV6YfvQ_j0-v3R9CL8ARtsNvZwpWfmrH0iJCMlTdmjLpykBH4EWeumHax9EX0A5sKK5OMHX1NH3By5aQJ__I1mjVSlavxK0Q4dWY1wceKpmjm-jmFcCZYny7b851eBlp0kIwdEmW0BwW-l2rRrVA1CMOW1PH2gBynvmjmZZVWeeO4B-BQSYDiMxfWtkGuY0dbyBNJf_VPrvOFEZVli-cRYU11-Zxb4xLX48BYVR1vsX89tKAjIyyI2NtVHyX7xAv6bmmVpMntsWpp08Ok4hcgGsiJ2ypBBzDizb0pTajnLoLUgNxl4a5n6CJin1t2FZbN-bUE8kMJ7dJ9MDubnME71QKXHvApF9or5RuouPbJrxm8Gdc7H-Gu7-X6l0xlnaFuEo0CA7LuRzS1N3jvZBEqZeZwQbdsJpaqn2fD1iyoLw_CjDbc0PChc_vbNyahmeEhGSDagnZm6oDdc23B7dvMS8yVB_x85oE87-PE-M2rGuOwl0WQ3GdtknVny33KE17_h0gFiTsMVSZschy1m0u8Wozu3vgpT6uAbuEhzEWGKiPg3EjuqUHaxuElHnI6htC3V7wQK8WaumUIEQd8kzOtXHL3ZvbmMi94HVMH2636uPb9ZvIluif3nGB9S9MiBljhDTrc0G4lTCyrkDHiNquejPTIfWXWpUvz2V5TQeplJ7PiT0an2ZzH6qzgrjc1mSDEYTnTh0hKD-ez45DNQU63RiDN1QlaTPQuKGeSmpYtnYHldaj_MNr_PO3L3_yFswDyGBffAwPw5V3K5X4IxUUZOfyA1FwX5-6f4Lv6xVXrr_1as0r7pH0XGvTwzQIDTi952BUuVItu4GzlV07ZblncjVOybENOZxa2CkySc9VHSGEepDytH7-fbFKoHl5JtSPaoLzahMd-l1U4T3YUPb8iP9B-Ub4-GQ8a_OzNA6O_Cbfe9dRZuvycySFasT-QfidhmItV4OtpWAmKZANSCktWnoEOYMftpWZRLOL_Mup_UzWqvAz29kjUmPoMkhUBTVVFYEeMv_qvbUOnqKsiVZVam-2OS9BeHNle4sGyw-hbmP7QbuBgqHyF9jRm_W83bw0XY0lCnO_hYfqq9z24vAgnUtNesCQIU5XVnUTRwleqTDrUywoJu4D0dLpQHL_6aTlcEhX-fffjbRHFlTW2r84M7YJMlIIUrSGYv82-iWNocqBbeMs_FP1zBGME7eusR6x0KxXpmUJcc-k6N60X1IwMzyRl1tOurU8lyIEI1_07R7Xpo1b__EEaooLVd1ETLYij_tjADRFJIb2Q6Yt9_--srT5aYm43q6LQO94HCNHYk8fI-jIjXYyaVRzQMSa70SrjXb92jtaPgm2V0qaJ5F9D5ZeWnuICoz9SMoQemv_xSFQ2P8SUZgUY-X1VhBJMgRR2zTcSfbRJ9hVeZdAON1AdqHVNuxLFvRSbYHHp6hSdnJZVBmzDPfClOVwQkRZ_X3xwDl3BvXFDxLPE0pZgcly0x5FGyVK-v_7x6f-jfV1b3ceej3WrmiZbFR3vJFJrWMrxKIM_LdVX5dzMX1CN1ZgtOX_WKHNZvv5FgpJWrMAJIz4K0mZbUxYNKwrChKkTivlQdtUQUvJiU5LQa4n8MOIzXZ-xj77ziF6Oi3JWqnRUuIfnKENz6ok332ZnKebtYEblvsLkq7NrI-oP2ulgB1ZW2_g8ewKxFwO5xPH9lNxRMRZXHRETnSfeg8CNh2PKX8BCBdquxt5aG4qlY_mJG5rNvfyiaYRoLRUva-mJkfKZ8DRp2tCjBL2zgTs64KyYiqRfnudlOjmKaLYMd8mn5El-hjg80kEtAzfQZcw819JFnb8OBdyhCTRxcLsepPMl5ZCQLAWeD5oUCHvCql4tbaBH7clX87LGssKpCS1AdR0eETMSK4oWIwj1_Zn1BU9sIDZsn0I-9nlApVEZ184rUeW43McYSSooQLt5-OHcpCsUGcN4zEw5RrUDYl1P-W_DrmM8wVEL4pZhixBBHEvg_V0JQhdJ0L3ATqbScZopKAAT_4aZqnBi5ufGL9KAoDlHnSmn6jD7n6h3lFTWtFNJVnIqWVA0jfwFV2EYkG22vs5pPSm1oSq2sRqmwOxIYkqRZM-g-bga6Ay9IQheeYqJwhiNcl1oK-pgNVeJDRwrHtNICIOi1v9lZD96zOcTNLz7EnrQL2o6IeSWaTeH7GL8TZUs0WV_CJ5VQ-4YVfMFQD0f13BEMpbsaEPAia9WJpYPZAdtDebSY0sC4iykULWOv2__KCxXWztDNh-z2G7S8mODyj9-uU9z7eiMS9bS6M6EQY1S9_CQZPTzJErqEJwWGO7HUuG3rJGuUvy2NS4tpMjGA1fnKjrXugDxut36F0046EE_VzP2Jb4jaow_X_a0JZQ3y7rPwbAo-2AY-TTuUeZfMzCnmly63ngsgCjwye6NINfgU1a4bqZE39z0HVHvKUzP1GEc4VmSpHMkNfBrfhqBajLsgsYi6f1FN2UNLxUbbf9TonznWAbGBK41uUNm-6PbzEDzAldwEBaL7RhhxcKfOZhwOrG2xPSV7RbvlhKc__q7mgDWrB8Vz1CdO1c_mC5yBeYJVd5JLUPucnsr1fMYzbrWv8mU5Hs5gxAgevyJEPRcXSLjrjnMfLEF2fpHsB3pR6BW5cJzNMT2CttQaRQPNQTKTU1jw-ySFrUvWO7sdENobSPm8LooXmehcSQBE5JHFMCZV9iwIIy3ot498gY7xBcUqaJ_ejXQAg3VGY_3UjI-XgDDhrIhuXtc3JfC_Taz93UETf0IHR8NvL3vmQ7yiXPpatMgk6PIgX7ZJpiFWUetpk3b8dBobJSxybghU8yoFY21PKWyswuLtZxf6bduFLWR2h_gs-dXdU6JB3dKYy1vPJI5OE9UJO4jEHHpoLtARXt8GPA6mVP0c9zz1PmjXW9qsLGKjva2qbTWEE5EY7VHgU0zBtP-ZPqir0_59zEVALknLKJam-RX7d7SITVWpYL6mcfxYgdAIHtmaiNX2dLQKSbNfT_mhgbYLf8T5xIeCN1urGWz4mpmnR97gnHI7X-mRGzAEZyNUYEtd7DJKb2vD5xH5y8J5xcKQCKennVDBUX35aA0PEUCDczgyXP4CrsHDL0LqQgJbnQgbnlWd8FcWTrMLL-teD3FLAmclxErtT0i2Jv9IKT-DtoduBgq-ETdkrzdazkToIF-o3IHmta1D5HPQe1edLvgO1cu2WIJr_H5kpS5S8hla_mAUpm-AqdStogJ7jMAyejt-A7kmbw6I6WY2hNFQFXv-SL2293lgi3MOv6BItOIGTFoaah9NV_h3n21J3qvv_PnegOzgWpabtBPi67SpQVdOv3nlJGIjdfe0X7hI1-W2Fd-wIZYiQ2hsj8eisByvXwXNP0-R9Q_njmsMpQfI1WlxZUtDbDpMXpwpL9IiGnIK5KGa8MfFrjTqMG_g1GblqMVWQHfzXGI6Mwtf25SRx086bXfbwA5VbTQsOt9gMPhqldDNkKdCSgbVMT6oqwUgLzB0-TazeAPUy8NNoHSAn4szReocq1Mm799TFfwsawRzYIFUbMzLIxxT5pIHNCihvesoDoX6WTBB64TkwXEIKOUGxXKj8NFv_Rk5sal4aeYm0CXLCZ3Gu90AMBiSSgi5td-Sbg0HJwvyR7RQv93R1O6aElkDfA2Cwj-wpy4gJaY0Z8lNDepd2w4PvptGUPauathKOBYOhRkw49-EycMLomDI6dmqx46xJSfY_06d4WguQRkCdfx2NuzpcU3TxOuZtcQj6wX50snMImE6qKpP0jAqf5jdRM5CZ2zlA34o3Z9HwOAwPyu0JI3oH1Bzt9AKuh-zC5a1yUQsf0Yd3QL3rqqtVr4Gic1fb3F8va9SI12xyYFxDt7Rq-eyKl_NNfnL-6jGRdjaZbKXQ5d8MJ8U5xCyN1o-CiAT0iX3A5Ptnp40TP_qGi-vEvH34dFiL5nKCEwxkVX6OzolZuQL4bCspaZDP9b4dJDpNhtEGjNMguR9AnxAmZMWg6xZE1TVoViLy-YH0M-hl6hLatS1Kf29eVkTLM7fbRBV9eAV0piSJR75UqZZUQ7LmcXafmcWS1FJf81Z4FtHeT-1no7ZPac10aO2XIT0dg_sRVHDrOEKbMog4nZYP966UgHNl_yUGjd0iZkoyCEvmLWUXj2Ka3Xyc0JjVraKSIx4BDB9whKuDAeh72qQbDFV_eMh0-BhRAN_WJ1k67amvm74ErA-AItDjGzRxK_N2UQvYb4NzKyl7gjq6YdR6vmb6hA1cJofuaQsN-btd4Ouy-dIjypEYxXuoeFAxtXeYA7XgHNSxGQGMfbPAvoM-tVsLemw9pwJ1HlOF0Ucjn_AK1j9VGmcpFT-GzqhkyXT_VbQ39IUoc78cYuj1qBHcs2CRK_CPkDwrZIg1IlZHXL8xxQ1H9pm3ak7PA7OVdy1qS_NmJfCqPjuS80UdGv3n21mkdGo0ruImxXwBRFQZeIJq01JpdyQMqbz45aNKNr1cago-ykwPEFSiWY_E8cEUvBFNaStb9_i7Ah8KFnbQIbDXpV7JTsjDmeVrFVkJRh3-nd7sVTtOAEWNAy69AzgA4eiJx7B4E1gyIFutSyD-qtOVfmxcOeEwC6IoXtKa8GYdtXyJO4lwPDmKqMspVWBUZ3qsI2hOLlIxmxYZYnGwVZx1VuQcuzwYike-KotQuOw961aqfyn95ZKKBoEFhuKIeAm6bvmLO-I5SQQrw2aXY6jNbUAduzp0wGzYvN4BhjBuLC72b8o_GVMlKA1iSqZjFdqtpvTd3Y_9pJgJ8G4g25RpC2XMlYjxN4m4W_qnyWBkMwqPWfZwd_FiAA67ngBzHXfIstnE-7LMX9G5PLvDpBi3fRNMXuSDY4wQSSl-XOKnEHUyPZgdN0a1qr3HnpXAWM8J2BJggQT19ydAt9ReNsJ3GaeNseQH1ezSyu6ENOo8cewUzqOF1hjTQU1sAWpTB2nAM-myqmCizVAPsEjTJAXDziqbHXi-dsVAkLVdjhjZlZ-ftox4zYb0joW98Ezvr8zxw0GQdrmWgEEYqu0tN7yA1InotYJ9GbNkyhgOt2p3LWffvwYw3c__LfPnFQqWkk9SsGFbJDp9ptR7TFlzusWB-jXWquLrgF3mtHIMd0vlvMz3KcV5Nt4Az1C1OCopmCJIlEA4XU3nhR7KTo92cwgd8ie1mt6tCxdL6gcVsmuWAl8U0F4EMTEhUFvabrLCJ-aj32cITaufkevo4JjwSR9DPCKka9JFHq0-wDZIWicKBpyQi9u_NydcEYU7jQeQjAzxFAlvWEmN5J1nu8ZqUqtNndXM6MZoujCMi64ibtLe_imjvU9Gcf1cZ9HLuI0oHW0dSCE0hC27CW2UO67Lmo5nxOfYhpFRLUlh42m8AsHpJBO8O3lbkm7_yVc0iWhF8w6RM5yMB2cpeNXte8fvyR0y-EA6S2sRwDULtYKZs3j5AineAiSlV-oCknY2vNpJwYIxeKfY5moh0ogghA0HTJbJrz8kPu6biKmtetBS0_uTTUO1PjbpcrAnIsMKnwsgzHxpd3sBAyShk5gZXEeprHbr_jJzM5p0ghbzrEN5nPalfKXXfqSWAlzrmd2pFLyz4sQZE-p1m3edd0D9612b67J2CvnMiwtAU6yq3KY7w_hgKOc5Rl5h7Pjg49SDe8FRba8zoUGSbb0Vb7_TzeOf2gvel-Oe4OBajOIL06OG5XQ6NV2J5P0qRmzNq_CTKu7vwLee7OqvmQJEIjNq3LbNWmZsGyALgC9Wsr0BdbN6667YVi4QjCoTYs0KPJ80HIMrCVS5LKFTunb2YXvC45uRgRTmqk9r4Nj6GbDtHTfaMCyMepOHsiaYenARJebXxxkx_OtHf2gPeoTjQ20HnhWbSpoWtwE6tpBQuFoxiUxNe3apPR1pLgYcky3D9WOfRusLsFyEPCR9oKFrPaS7zZkuygDlIM_SYrtUCRD-PQLR2uA27PKqJpVuHFebeC5hIj2Z4_PShtdxtL24xOTbA-VGtJtSDlwbVh7EesLrtgsE1rhHcbysu8MPsezAjD6GjXDNOZkFJcKUHMMDI7fiXpOgq6YbqdnzfDMtA9k7istDq9mpF1NfSkesvgf-2ZM8eJklSRG9A3kzkYO7Jdra4uFm7nWBjfJQHFkus-_rZgpULlGIZU4JeJknAdPSTeAhpgf5HkhtEmNc6zck9jemIp3xznmyzjKhrmR3l0oh3lr2iBKuALDt9cRWVlOYcxiOsRUg3M7q089q1AghQPtXLhIFxGiJ5lUti_n091_vEGRu-Jds43hy47bMz06XksOLn7HaRYwNBSqi7ixz3OY0SPnjRne-sI2kKv0c0DWBzyrceHl1xoDpp7m9f7sdlCyZTk4YHK50K_aB7JOUxpDJof38goa-ItFjQPRBXw_i9YZpXvJxtVNx0Xho5lZOXJEokkr3SV04_qZuj7MYcNtz-3-F9pUIer8PknNaiFRwjuA-1pP3hpWMqmp1e4Q8GPsXWAUIbeNUpnt1aB-mThgEHA3mnqt9mtSN19WLwNl73a8-1BMBNGvLbQfdz4kMqRzsw--naa8FWu0zOCU_1YENh9yUTnEyfPCqFYyNjLmrv6Kv2duweeYKakuQrbb-MSdd7yoGQ_Yreh9MNpcZdve1tLVUL2ejlHmayrTgJZltgHllAN3e3Y4xV-r_1NfmYjEfIz6b45i3lC7-zdjq-JQ1VNtOXY18Lnu5ia_WsJawrsqiihUvC6trBdyPWYMaC2FCsWI2hrowgpSZ_ZCvm76vUHWDvxTM8ry0uV4BWTigajHJrQQLYOwVvypYS8pPOTdc7zFzglNDMuyi1oxlAURLkQErv1Fb0XJslh47Rh4y8zMl7cGfhIh5azzlnUD9f7dCYrK1f06xlej9VUlpEg0iKNDthJrf3okkyRpxk0XecYoM5SKhZY3L6jv65C-lWrrV-l4A6JPkeql2z0PnMVLM8_ZRyb4r1gUs3FTDNDHVqNETw7wsMWmm0c8kcTVjI7cBtszTuJTT5EJ5s9huwTYR1H-qzF-utcoRGTAwJvQMrxduKcPCzoURKEjitcOFUydefUdMPDfrKjFTIpX_R4rrblrpjiiPxRJppmdXMRP28KPZWMbWRcomfLkk5sWi7S1oh-fdeo6gRCpMNgucXa11XlIY3UYyhbApuBeaB_5F8DIp5AAfPbqbZ0w9lJwhyF1-PWNwxAwPGgcHw2InqrR91zLyx6X4VKMNgX8AcgmN9rZZcL15TGpdJeZZ9ImTA9JxNaffe-aJUrUV2BW5ofqjUKY9tOrghxMBAK5JxUzUFx97x70jLoxsW245ioTHto53e00bMKUGo4v3YfIEZNGgHso6SuP5Lgta1a5im2fv8LHRdS-o5sWu154dz5KgMjPbre5u3auPe6QKEQqUaR3Eff_PR2PnfBIhmvWS54fXOVKcXy9QPdHNxaWUk8wshncpuuD3d0WYhLNoH1Z2-5keALvdZsU-mZaiUDlAkl0CvLUQAt5JS8w3VOF8UiQ3IO3SfG8UbatJr_wuo8agGwmdUHhMzNS8NVpiS32SWMeNChXYIMvGzxRiMWKXm6LsofE96wXQzhoypLzIYYIuZf449dabUUcnA4ZkPVAmAhzbF0mKRhRE2KqLAdrkSF5555YyWveuWook1tVBRBALD-YGdX7tzNH_ojIJXKDyBI70xp0Gaj1PSVpqddplcJeHnJgRW4H4A2Vs2I3XXeOeGX0CKg4wwyHADo3Ake_SPeBBQmWjab54qST2_45yrvkPNSjKHsGB--_U-adyYTL5LDxtzP1WVkJ7GCvQmZhF-ne7npBHuj9ePgAXwM631aR9l4SVorfTumzsmlbFhWHJb3LudxQ6IISuEgif15U3P5Vx0ZV_4_-AMXzYHtd3ghP9nUx8oXj-1plv2b0B5Ht4eL4bXE620Jj_qLREJ_oTZbaAt_1L2AkBiZtQA6vMLw0fItucDSNPZf356WJS7wR67EFT4S1QC-sUJQh19RuEWL81TPVTqPv1gF-FSmI6EkVQ1gqYSFinmgmNxbwa1DNgHZ5uZi8zycAClSOvW4vihQnoC83-1cISzQbM3epJlFbt06b21ixFKnWPBffJFehqVpz2MabLqQOeSlzFtzPqI8DHyXiKTXR7rJxz5pz310OphTYbkmG6rl4vx5RAIP5u-V8MqL1_ST2viXusgmJpk5XxZJuj0J5PWy9LZOUIX3yzZ5Dxxushfg0E6U-RQXu7PdFAKrRvhvXFxW12sHR5zci15R_vJLShZEvRSa_8tZm8ilaH8hY8zN5Y--OG4cPbaPkcIyrI-nmDrpBHW-50QywH7q9-9MSu6ZXx_vbWrMWaDTFG4GzWs-UihbwYfrtJjxqrq0FSAomNitIxv75e4Jlls67mpaYafVXOHHiL2-VAX9ihSPkdKUhxSHGA1QCErFXFvYyBT8X9CPQ5Ku5ue8ZOBI29FcXEqjy8RLDjklxkZDZ-VfeLEtWG1m71U2FRYG2OAW4DWjf32rSr2efQqAT1DUdNIyCcUrcWtYfo6mmPPljL_JHteBf9bu5F3NMUyFcNIbmXRI_imk-5Qpcs7f77y_mozQay0BLpRIWVVpInUdMKgncJEtPzzFr4BWPlofRN3lGUlppTlOMVI2-WBtj_YXQ9QUZ8l4VWRrQxYiDpKt54rmMXr0gJ_rhoKfV5B5RZzI2t6pYk2fSDXrKT4_zlaMoRHwRAW4U2zhS8LquG6PrZ11_gMguPwF9HGwPh9B1CoIIeqwRIa3TST9Z4ojrg1mvt4H75me99csmLzAwnmawVxnHmctj5zAVcO9xVDH81o3EhAswpdpbbUzATY5l64zKbQPjIZ5DGS5vwD30kRjd6UmuEnGMgdXT3AM5_jjHzB4pht-5anlyRdlgk3u2cXAEryMhvPAp9KPNboLmIwccwcV_xDjF4UAG9KKEW7THfQOBd8YuWxHfVcWKIcM8-aVgilETNmDy9FWP3RHFePLQNuxyq4P2uSuGNyFinnirVzA_MVMB2Qm7WtWB2gHeagqE6Q9Ej4mImiwPKcu_WVUdCq6gtg6SkfLCuIGgSEcbA5sIeC1cmohKBO9kWzbWu_6sKuNULYsul6cko-oFmpG-vbm1qBlOLYyyrTYXBpKHl5oIXLAFpMQhJLIjIgtKRkiBVerQHB-tSQyce7Kp-KS75v-xbDpJCzdVfhxozkg9ASEvk_JTo6Ng7Qh5oJUJlFIT7AFafATg065waKCPo9mTNHr59N4_ztSW6t0qpVqHP6XMIkx91vyLQDFJYR35HI2Uyuq8WOilMDDLYGS1yZPzP7jbEHS4ERzRKn46OD7eQy7RCKgaXoU7gxb16DGKdWQePi-Ivslt66q_DgpAukq2sRr1gtRM8zlivichYiin1IzPI-TJqZ4aI1OhdE1JH_glXieCsIuEL5IV6FKCGH-WrQ7-HXyICJnXPEdfdoSTVQdylK73LJRwrJmDKoB9Wa73pA6ghthL1fm7EAlVNgJQ7pXQdJpcQhb3UT2rjBGWAGMe66p_d0VOfkV3HYoy0jcwFBLxEs1t-ixhQ_lKz_japy14W8TGrXgT83H_pZsTTSo1ADrNhJSJmpiu37xK7I6ayJDDaPT3CF4xcQRPKZAw2rUpLrE6qzxcg1OaIT4VJ4HR8wPtN8DcXfVoHGMuu3f2vLi6gBmYELsTXiskP3m6WWy0yxtS4MZQk-I1yOBDY8yN2idCJdKfep8gHabw8QvF1QMwAltyI-oWCiiNNRE7SRb_PqDpNfD7zwOhaHWfrlh7CLOa0jMZPYvCGVFVjpWyw1XY3fCKXshZkSMNR_S6cUc4pYDVkQF4Z_6KGci8FwtmjqgfNllUS1XrGr8_QiLDBDW223zCIZkFsIFtZLlRHdTllt5XkeWW-2mYr6anEJxTDHXt71i-N2waexkvCwzBrX5vuyOvi9zKaEyqqnsO1DibkO2Jsn8kPgD7fnn9DIiFfRKFByHUuvTx5HiRB4780-CiSA3UsVVTNcrflH9X2WWQieFk9sjH21TEqvnDDhI8DXFaG_PUp_nd78C2V1vTaiC65Yj3Q_YAbKxtuzBn9not7tUKINsmWObUk4DLdtoooaZiOTWB_n3GpiBgLbe_aC8ZupUZX-AdLG8tE8878FHRWXmHqKCsXkIYGW79Sr0ZYDR_VeHozpCugqQZZVNYHv1NXPmzxCdtVfT47WBWk3kJGa6js-Ftp7BNlFrofnc-7ieB_o0oTP22KYNAu_8O6BeGyIjhvecscCHBcfM5PQCMNo7hK_ha7EFIeNdLRn5iShRjdLzjsQ3jYNffENUsxHCe95KxPSYrccPToNYcCrBFPPJVTQt-rmJwv2CQM2PJuQ6OKTPXaW-BcKQgBIbIwhN7ToPG9XoDGk9eEhAY_lQJIfH5EcCn_h7n13pGoo72TJ1XgYP04sCCEytO9BC_iKFQqPoBa2xXI0NS0YQv3omiVggGcwQendya1SPlzzMItWRowsUIlTp55CzyPZpVFcQIZv5_Mg-ndA2HO0tIFLkOYCLC4l4XQDjK91BD69Mf05qumccCFGcLdNq8ILiVWuvA8W500Z-ESH74tvHGCvm3Pg1_XjnN5jxiT2jj0g_LWwyqEx6vOztkfgPETTmpvRaXhd_kaYTHB1fiGJAzFufOn8gRYG396Ij-TCPp4pPySrOYLnoMWJBRJTtoGDELtlrkz2LYc-yA0B_OjdKXQ7ohrjCS-Dv9oy42LwQwc0CfxwyqzArJ8Vc4f7uGIHsJBEGoGMrQQmz0okslpfLaLa-Fx6RjCUhW4r-rTHSMPuYzS814FDuGljvhfN12lsHJsP5vTTxiU1w5G0Rh8Lx_1KTPQDuLzOjXQ8rPfMCqpJFxyfDdgOUUi1YaGvFb86CDi8G-x26SEVlwCE_Xa71FMtf2JjlHkHM1pIBRst-KprzIqm5wPCLkeyVodkpbJYT78s3V-KWwVrhe7CyTTyMVUOR6h4_4IP5DCR_vLbTH16cpwlZP01gaNNttw9Rzq6VyjVF8oJO0Ka2UunQhEEM80ffWaL8Wz-Nvo7ZoJH8qA5pfI0ffj3_9T7PT7ddm52ZURRTE8uo7zum9U1LQrco2wgjISF0TtliSmjrg2X6qQHSPO9dnw2-hkzMk8r1BQR3wzLko9OPnR4-67hOUAcSgYWWCQPuBr5-MFNr_JG8o_WD8oD7MZaD-To0HzqsY0HjvkwadoVomEbZmd1ZehI_WAp9fInk9z2uIuUh1f4tdZVmV7ZqjrvPt1o05hCNAMxEwJ7RqfEygWDCEV_EVjwur-Fy1heoS7vwyU9kCDFwh4EONr4bSUtKJEB5gEYRqA9xOtnvfzoyYda-rg4y6xbG_I_isXGhzSutHoL5tKYUdZ_yBkYwAgC3MXPkjPCn-3ObB9rNFjWwNKzvOZy1RJRqR091zOFJHDSm6DdZgUqz1Pq12CO8R_KFF6YzTMLO3pvLdNzkIGUpjVUJepdBoMplEuMqYGUgp4gKZDLGLKZJhjwO8TCrFV0Vj6ULVCsHM4XroY2ykspVssdpT5bS5cwxNS9pqnsN64qkEKE2GGP9alp0ur585mYsTZy2BIHhBqXoc2tRfUfmPs5MzeSabwScGcL5PjCe2pADx6Ii_a2c7vvu5Vx1Yb_Xz5Msi_YtnEbMTjYnYk15SjpLiG3bpKMsEkDZ-PyBpLPbqV2oHZ3R7ZmrwZ65juUiCOnyUwyE_JxpKPn2hHDV880TTnvN7mpw-fGYTxH-YS38OeFFFMPwR3rrcyga9xAfh0tKFDEhfhVL9wMu_lM9wciY7rqccyJv3QQvEIWUlJToywph8ANsU4WflnYDIPj44nfVGsvAbLSuCB2fN0FScWZQjy3bXqCsd4d0B25Whf8iEJWIlasFVNRQeaWweZWtIO0z2BF3uwdQhkej11TCO7IsGGyMhIUEuelZ0jNFo2ZA9JOEqCQv_65WPw34M34HOPgw8BbV5hBdY4PEy8IXntfpTwv3Otx5XdJXvCWgYYEwpZEVm2RgxRrxQZWc7EhS5lZ03cZqgpKZAF2r4S8HsijtxnuVQ4OaMJ6irspkguQlQi4vyFIyvsP5S2Y-0OhA0p54aLAFeOJoXPOdX85-3q8717x2VacfsfI5vsVHVkhuDjKGE66yJvlpYE6v0tvP0cHfP7gTyThK8Kb7CexJsL2lN7A7QdzSYCov2ZdjFZ1TJuG7o5pfNoEUxoOuEpePtI2b6DYPBQDUpX1Q8lZxAlWMGp3J9uxVuj2Gnb5egl7t_5fc7wwjbqNS0_VlSAi3p-XkFZZp79rPw3kHX8PlWrjA1nfV9BW2_Rf1gy7NkNGXpE_PawGBeCWdqLv4ughBWB3bwSRpNODZZsS3kyDM0P4FzbgJfotfF2HmbZBhXVob8W_UCJUIqvNc7ZKCrdsJlZsO96S0a615SfJJytpu7zDlBTQsN5ruDXckTciBs3OrXQHfpu6QLGzHYuIQJFp53slIYcI1CppScuWvcDfDAYisfcfSv3-duhypYEZIbAPBTnxYa08GTwj2ujpTOx3dZydkJC1HIw3ngLWjRrXAlWu0KdWFiaE77eyxt9phuIAC-MJlpTFVLhDGav7m868RpqfbWF5ndCya5e3pBm0PwY2YKqQO546U_OTj4ds-RH38rmsnoYS_NxuyhZl0-xIsUfnxr2R7kK3QDUN5ajRkg7jLTRngqSR-xxQJU4vXohoRU_Qk0gYXWg3x_7vT__iPTGCtvJzqPzEmEEqIOuTdZVUu2GSbFTKqEJJkSLhW7gzEcQEp2oQycxOcoDjusSXF8X8q5VuylghGjz2HRCqFUXFrnC_xrZt6KbriKF4rCxSBE0Yez-77Htnq_HX5Gs1aM5tFGstcHcp5u4HoVU4QKnh9XjAwelXyI8MF4Uc6g_N78HekZRQ5VV7wSguQzHTfZlo7W7aK-LniMxzh95ZscyzL3diEddyWb1ld7df3FS7GXhOeKeqDLJkMQ6jnWQ5l5yGxMESaUSwkri-Y-wTR6wySgbE0wZA_68HPt6U-k6ViSljnI2jt3ByWJp5T3wd_OgHx77fQuwlCe7tn8jyZgZg4RoqI4DWiC5W803JnGkEpO-OwdQfC20UnyCeFhnRNdcrjq1-6ZK1l10VDZZUbNW7nW_56Nh91U5V_mwr5Um-zDADQYuU3jg7it7w37h9QSSTAzsDd-LtIQokAQcv8QV4zz-5FwzliLQMD7oWU_tia9LJnUaxkbDLQgGDwPGlJ-J_ZYf69Uzl-bnZ2HnWee0F2cfGiu43tqeP3CRe-NiKwJEEUlZb6-QbR1yX7j63plltDQLq-0Z69YexSXKcL_t8z9a2zYLzO14haaZvnizpkFlm1ZNIta8RYOYAi22iK4IoNTlqHt1GDTHj2z5prhlQK55fOqFzMIbmh6wkJTwQ63dm6hfL5I06-hRzC7vLssuOqsEZ_WHwpVynW88I3oZkxBPjG6LfdLJUusP8KAOgtxYEibZ09db_fALmaRGyJ7SXkD-NeqPqL1KifdjGRSDXOEYLrFyqrxYfRyna-JMWScXbNdehmpvZKcCSE9th-XYGTfSoHIEZaVgjUhHkoHejG9VjQn7tuF9NH608PvJyG8KP4nh4GYihpohxhy0VEgNn8MMk4WMZGB4MFSUyo-hQTWWW80U-x4YMXIqnmsMZrM0NlYUvO5PA0E0JCX5Tob_LOL_Hpp41SZc9TZIBc11IhRkXy-SbrIEy3-Q2Lzq5YqTwWv1BzLcpUarom5XVP97eJjvmoywxM-jkYPLHzDxe6EsmQPSKZQ4gJHPVyORSyaFA6IYP7l8HaGqqjYXI3o38TMJbKDTMTdgIeaasxQZqS0mLH1KKZLuzPegwhYB-Uzd0FDeEGDDo_AWFGlVEk8zlCqa9f6Dv_aYJHfjS3R9Yaa2tUvYrGVLx8zSy2sr2F7frNZW4M6aKkaBuCJNLRAbKzgHfA1K-sw5LC0yCZ7R-qX4rwNxkRwnW6TkS5EM8JVzyzNodxNMT-UaoT7Iax-XQfLK3at9QVXxJhS3qo4mpVoWsLEP5JHfz6JmHcKA8z_m1wCBcnKJ3f9UYyXZiJZMQnPSlDEnbzZnyQ7yV7Ml21SgMT7K8r72_u84-9fYkLN2dTZ69UpfWoTJaH54OSN_8j5AjYGDxTtnE6jpCTaYhu5pZ-NlFaSQ7IvY28gSdQMzuk7RKiMwDCFJZ_j9XJkueJaLSApweAXK6ipSbOdKxUpZc3nbP6fv3Pg5sFPq5NWU3u6PEFQwQ874-ktg5Xw01MXOG9sjONeP5-n8ZwjfgWDY10EsWuXrhuTSImm-6i5eV-IS0uLfui9oHK6_55nrzo4I4Y8B_TriDsRItdXDZ_GALWiyET9riWaDql6fUt4tvZyOJTR-XKzJHsuTWN9feOd4u-R47qdRFnFCWmqqT-PC5HY6dbJTzuuneRVe-KnCELr_i_JBTAPbqUJuVIre1IZBnj-wAataC_JXgY_zXqQ2UPPn8su-VQlv0Vdh6I2e4igFUuQQWLgZK0KTcPhFqR2-l7y9FnQdTFwP1TpjNOtvj2PGxKMa115nWMFfI0R26erumDlceK6qQ2gnoALVaCnDc1MQNgv_Hn0tVKNnOY5SknZgpnfFRM_yyC1_K2NbXcv9F5_050ij7vs-FNFaAfZvniMZPC8wNtcviFlzoqRv8iFIvdr2AAdMXqe0i48R_fNAygJDNqUrcUeG-4_vEs8i2t5C0ZuZFlV-4xKRxXpeNm9bd7seg_iM2meKJdrURd_AAajbu5LFrVGOvBLfmFwgV5uTAZOfe8RMI0SceW9H1KrCHddwsYBZG1h2ipjT_8c5E6j5HzJHPGcaYHdnkaZMNiI2-lOlbuo9fdoJSuoy4BL4Bz_aZsoR1w1hJXT3UNpWaP0OZ3gDVBlNXpH-McL4sshuz_CWajg7VV8KFaubhZ5clw-ddKHxi1XenB1FVX7NoSbVVvAo03EBhG7LfOtxIUvWAvFqE9ctBzGAA3Vhl-VABNBCQ7YuikTYCLX1WB-aksNNpxL08zoLEQjyKDFV-ZMNfThT38y9ES_Bidp2Jfnct7krKlPFvZvPhbWZosiBhjariPBGw0Piu5HMKhSAD17hO16HRDIuXi18c7zMiP6KvUAz-fa_wHKTo6NABh-rFmANyGksyYT4kh4snahnjdKYpFZhpn5tOh8cIED3zK-8HN3nCtR-DammlAsMmjLD4TUBvUZa9pel5cm9NRgYCbtlmKe35gef8Ogq8IuuvvjPzhU-0IK6JR2-QGhsWR8MYMRxsHAOSVdgB_v7DEzAi8sQLyccwbVLRBvV95pu2wFk3ZR-QXMluFQHfj0snBLafxX1HBREo5rlAOa6NUglSoZ-hHuUiX4ppMv2tZcRMurLcZr4B846aSZVE2XqzJwE3wHb56iCRxstV65N89Uwmw_mg1R8rYzF6xezdou7kBur4wHVhcZ20fFzUmunlQ3ZhG2QgKNIJjM3fugMFAZMeLBX6rP4brI4-X8Wk3W34FLTZoRT0lmx5K_8l24n_x3bS867RrybZMugV4GlBo4E5WS5Gw7TznPvSU5KqWYA_p0j9wQ5hgmroY6iZ72wlIQbo_FQrN03TA_kXcte5Qz49Lt_FmKjH4acOYqetjZS9iXBY_CzGdtwsKaXFe_XDsoS3movKMgM1kY3qVH-3Eu8YcRwIk7ZhxdBANKT7NGLiCiG4MnMIgdUlHF6CJKb39djLsjyQm6GbX4D6iVr9lJ1d31gQfzpcJ7-3ZkjwIA9Z158RBrjXeI8xIorG8TlVA3A1WNkTS--0a114NgDIEwOa9NvrXb4FO7t4W80ddusDe9TgrGz0fsuXQuVG7J9xNYFHw9aEcyMVm2AzrMbIGRnyMgp5ZIcEI3amEfTljxHiTEag4odqWut-VTGW0Z-E-mPRny4opDVY1QtItVn9zJovm-qw2RyCmbMeag2BHA70t0OmIxX8W5GhnIM2-1DQe32Qsr4IUYHi5OqqPMs__T5gxqDQJKrLYEg1OJxuZgX_Qdvkd_qrDn0G0ny6Xzw6eB2S-NV24z_RXm_viWiADU2vx8priEhgL5njxzN3OrAJ9Pc_YKeh0bIi_uXq-fC6tvIVYtvGCdXwcKU-pEcVcJtdgMnGmGGRPsjd-QnEi10xfWyLjIwDoKNCWupEv6ZiE9DxmHPUM2_Tha9W0WscP5ehUsO3NWUDmIBjpuq6Ys4jmKM_Q7fdo-AeeD7oBCkx3LpeJqVXi77c9ht7Sm6Cl8X4lRRdYtQhDpudVUPhq3AeNLLiGWpjjQEDFpFbEJ3xerGW43z0nsdwhDCY1Ql4PKTIF0Mle-wESOqd3be40GeGuGdfZbxMmNOjyYNwUDbDdCiGBeuPQN4leAamFeX0nYleZI7bQpdlTa6aL9iWIry9Ns80TkJqS5CBCwW-QmhavBbkw_STBZ17GevFoy7YDmaHE6QwLdVa2tM5CUSlod7xWCMwDKxoaJCv8knDWOgPNmEvUFSJBLFiaL670FqwYHRRe1Upk5ckqf5IXalH7lvg5PxTPFs-mWbkywFEeCvDlUTxG9CRgY3BMRVQ-zmvftbUh1dmr0LKG2HG0VULhNG3uXOQVM7fDPOfmmOE0_fVXY-0eZm8PV5TYlY3dfT76nbV70vRs7Y0i5tKmkRWxEEQSqerDp_Vxaxa3csVuP2EkRO9kb9-nTRrLAMJDx1xeGx8GkmkYBMWA89G4kkVzPpSQGMPnVx-JZeogGy3irgoj5WSAJVlcAbCtP1K7FSLoG6V-GBbMgB_EMjYk6-lu-21B-hPj63Cf1znePI_8ygknoca8dwdv5j59Pqi6Df4X5SWAmAUBn4NYEwQiqsTJguy_lFf1D4a91YIrH9ssSD75rNHY9gLLFwVk0rwg9p2QD5UJ8vuamHtWX7Ul6nVq8UCbZRPDxI1_vqZfG5eipsD33lr6Kb6zHMn82sEi-xlx6MnByLYcryAX3F57w-TyxFAljQJuGDQmS0r14RZpBSbMh0_RPcJachJ2dX41XLd9L8Wt3FhvU7TniM8acidJtLS5MFaskq36jY2VOR6jz3DkBZshfrLxREzm8rcqE26w8TS5PHwYiu5ZCQszVIPK89hxSZOg7DbuqRRoaSzYb3jSptzU1KIvU9sV1-kVYvGKWlRu8GkGesDy2e3HJMzTT9U5L66d2iCweIOwLlWXdHOky72w0ZqcpjhtUWSzs4Nk1P3ItWfD9yL56FjetoAwtGiUyZihcfdS6KpdzWKbM6NzPbXlgIiTvpPRrVrpXxXI19QxncdUKX-sB6eQSJ6fCThzD-RlPkQO4Nnsm8JiZT3NdYgBaIhcD8dtTLh_9PQgRqzxJaz2W3RNXAyWNXFuCIo_9a4YShw2andm53wdHXLEekicFlVzUQkEQMaV6rau8iL7VfpGF9VIcb78SVWEgRKbrHWhkq-pnq334Nwm2frAa0i-k-ugRLShxcoJK3hdqcB-psUA1KUCuuqXOteK5KiSLfawozr8iEtN0cwUoaLQ8LC57q6WKv4pFXNGLFdMJ7Yp9bnWEiBilBjsdXYfcwirRDfH6Kutpn4bvBFeaBU495HFtSpvvJ0r1xXrm1CBWICIMehPlEIpGXNRFuvjafviVMGa170fptozbi5ZsXuqcvJjpknmLBWPMIg7eGWwiwfobjWwOTKzeh00QQ-cwwvwnrgAKYIHiLu5sSlkrqAvqhjabj3hjiACCAz1hKINVEKmuvoxme70bAwr07miuhlB5a0Iymual3Pw_fpcPVVhRzm7_eJFNOwkQ4mBGGWc5Ssh-487HTfEceWZzWqHN-566G_o8zQ2AnVU5rXVQTEpq2kGx8oGDLRmFUHHoeyNV83wmx_IXN7u8h-0Cm7YVLi_7rnKfZ4CWJjYeipEUrQjobKhqf0OQW2mtmK1dx5oCWpDs4UQAy43Q2gXOfz3Bc5FZhKBit5SMdboXL_O0hJHlMfAg0kjwx_BXS-h5BztFby8A6uoP17VQrEK-ATJZrYKYzxlyFSQFFZ1illIqGGrRcjjJpeKJVGlaXAw4-N4LK5BxCur7UERTILwTtEL1wvUbkRmHKfD8NTKKMml8UvdFGAplR2EYS-vFJ5ftl05eEmUMWF7G6aTxHpBXouIIrnHSVfjyv6W3O853BaQvQtKOaYcIlkmVKgxXU_U_O_STjAbubNjJz9RwxSCdcrv51ixLpBsu-3HMJkr5EN7a8vHSBx4GH8UzlIRsXBhBt863N7QUqDECiJIbEX96crJYQ-6EtUOr1Icdgd-O41jFOMxp_zkX3_gyxUG98O2ANoUse67PXx50zRDfvuek0_EmINY3LB0jBPQv6BbDNZ7d6zNy8C9LmQax8Vk79vjY1cgBfcsh5JuW0tFoH2Nw7u1yybjquE1Sox1E05EUBR1UfVhHE0dC9iGHknF5GIr9Yjj0NsHCz3_1JR3PXv0Sb37Yfl6HHEfO1hsF1RF9e7SxjJ8LaDSjdWLE78hqW4N_RrNX3qBGlx6IF2xgn1NyuBLLstGDhYKwapJtvw-arFjOXImQ-bVOqKzowNviSV5xiZqtcV8cjocO73BeyfWUOXSCDbizPJJIYM_L8Gg-EBQG6QHZuyGZH-mk-OlTB_-8nP2brGlUT3ajS8DEpAEiege15x6t00gMoFtXsJU-f-vqqtVquCJRmdfOkpPKVFKUpBaFRU2wyF2ie3YcKhriYQ_INW24KJpUasKPd-yFbD52YpJXDfolcTr0PVQjGeKGVYr5J4M7pVlRdpwCFC3Curf7W-nHi_Q9zmsbzzCti1DrXfMiJwuP8Jn0rJNZpfpPOjbnEhbQNC6jd3aO5HTURaK9w7bFESWGuuONWBTOZ_d5jQqM5PSr6qa8VYp1mWq4X--M6Wfr4vRbGhNLQ9Oqdeo1I0q0DTzV5p9gI5AloMnXxLqqF_UmNY3n5829gEJtmhv6NlKJ77G9GHUAJIo7iDfwoYrV100W-Lf-52xi8t-9Ip7OapXLAudSPrE5tRA09nEtqJpHGisVUAE3j6v2Hf-542bhUNjdOYOBKaFkhD2AgsyrvwXS5524_HqwUV0j3nZtEpjqxIQDEglhc9ekYGmGr5UEQ6voQbbeKhcJWX7vfphz60OaLtcGtDRlOlaI3Ju5HulLFD3MwGbahnmcu5b7osOBeHT8KdpXCghAfuyv3FKyfE6LElAGY4P_YRLJ7Uje3NaCcpRP9qHw3A1GLJJhmHPzVXIek6u8Z5lIcDxCqhlmuFfU5VKRBx-ZUUpcQirQv_wsrxNYonQX7ez6Ma7iNPQ9anUMhKQh4pQvypZ1OS_DJ2EvcpL007ijm7T0fboJdprg2v4075W9kEjllPXoj04uMxcDD6QOgx9rnsZyB4cmRPWd0LwvLr4PEo9VAo9FOM1j8cV0YwoWeBIlTL2LJuhzuDJDBwkXqm1u-pD1dLH7TNMpc7qIsQc8gbYtDRyhCfCE6Fy1OGHy_0SDj1noHAu0nQ0R06jmRe1GyKAD7X-Z4Sk6OmytDWKNTg6bpqzh8l338UGT7UlrAmBNeXnJ7QA6oZ1CuDfHhxy7sGvkBiaydY_8L754vHqku5pRcOGc94to06rL3ymHdZbmwESPPEzIR4pQhnyqjnTBYH_q7C19MrFa5AU6-6v8pZ5UKND7O0B9rQSlW6QfzmAapnywiu7HGuKwHX9CgFwygFS9UhWgKovgkAuj7rNn00NGyn2P3CJWVhHF5XXRWkgfLMgQ0TT5VAPlotVXAhqiX5BJZ2q7wl09aUxWHj2tE_R3TUHum3nBhj7AS1LmeN9e9X5wf515iAoMEw7Gl7HDyTVW-z-t5dzrTZzWgZW9TLIbTe1_ajlB5D5uRz3zcZYuFmYYjldnu-uXePm0K2dJvuReio4Zwaqz_k7AZPWEYNHgmhOdVQKbo8rviOClaE0CrEG5ZMfYsTyq7bjYljcMRO8hNQ_cxR_-ysqPM9OH7bk-d7xiCQNcqZaEWF_8v4Y1LJdl3E1kc3JHKOlxPi2qx6qbLRwJEyBcG73Oe14swDUWglSkdZ0O10bfzunuB6ZS3iMUyVUfFUAdIZ64znPzz73Qc4bADzdEfvZq2sNWdsvkXSXsafVpVtWoL3a13OX8aehdrQB6LKOWY1jzlufGHB9sJ8ib9dzBBA6tuGffEs_IBJb2lYPvJdj6yWCyOzHGmyuiXje6OiJ62ddGR983Ry-LACwGDM0TTPTFeFAHCmQhMQrkhJghffQF9ZqddQmEyPAv7qK984_03mlJj3VuJQrm-4cNBbF8hh5vyZO8QzMOcymv5V5sbJ9_I2RUX7oeG-VsrHlBkVaDeJxRZmsVlKWhqDK4q7b-4arMt-sc3WzGaaANeZbaHcqYpNLmF_sYMt34msr6g6N2aaBIEqjPC7S9lu2OOiPQ6dyZJgoQaKxj8MW6yKbrfMuRk9OhZFgsL1jwxy9o7-vbXua7Yi4I-Ul9YyVmlHRvW9PEFoJbQIZchLRFpDtWjyZb1M_2K52FEJYWr2ZK07G-XUzpFufzfmEenVT6ZwMait91dQrvvna8mxuYf1itr338qJJrl8GuO7znqurhtcZqu1sH6rvwqrWYNLqU7f1qx0iq6czNw-8rUf5MaVKqresOmO6yThqwAd4_D2pj9YlTP9htvcPhrndIIFTQA6cb5ZO8cXlkjblag8fEjZZHnnugoSDbkEuFqv93bo6gLD6oW0EVa1GJUAxCMLeOgyZy5uOtpSTiYHzRxV_MKaI4yWxVsg0y6XfoNShLhsa94FhRtUCWKF_ANtm7NIcGi505_S-ih_r92jaq3cHqT9g8SLSxUl7fagSLdL4H6BmtPeSwVAwsVZtTOM0C4r-fHFzTvhx5s2t-yAWpUsMz4HRqdi6mxAkqt9mB49FVfFCGFqTFCoK9P9Y2T4JvgbIVEZLu6yX4v5_5KUgusAdXihnE7hhTxfzs2RQVvDk_7pGUjsv7asTTBPfRwJp9DccWE5fw2TaOsOJ-1RDz3PDSGGJ5kFbCv03wXKsjI19HO9fCjfquHYCpz7lYbCSeYLwPfbtDETN-MnQI9gu5gLxPndZtecQA0-KfvNeLXU-weLU6hBxAR8M1BDti8E-ejQwUb_bnCaKzc5Zex0D1x56CMrudC84rWrx-jB8S2g-jo5WJYm6Q9vNAuTajjsqPhLzMJxLLx_OvQf7D20JaTTFGhprqfqpLs5OWJI8d69n5woIryo4uGTK5Bp_5UEbOL-GE8Jm47132n6VZpJ4pANSE9y7MBNkWl8uU0Bz8hXQ-_45vUy-RfNkUfBbmVge7-doA5LthTZ0ofuon0w8DxqmNidNdMCgxiJQ32Z6QtRJNpHGx-Svel0rCC3KVDSuKoXjw1s7hZGWPqrgSQMtEh0Z4QLIJHnpva4XcGWKnMD0FTW9rSXug9yiXbOkXSku2FTLyakPymQBj1L_KSrLlroIuCs228rFTEY_KHA8Q0b_DoXBXLhq5GrO8I2xXvZogoZSCu89K0r2arWIHMVsGYcD2xPD7eNCh6II_XAD5mAFMKu9FaKwB8Kn6AaPjZwE46sGNcq-qItscAv_RByPi3L_3fsLD7pTTQeWxBRVne6G7Gz8bWJ2sns6l1cQvdHhLbtKYhjL0uOLAYTGnUXycCAynIS1Qez5wZgn09qDhcTsgbE3o4m4t2ISRCdMpDGV64yJHqaeiUdoX7PT81hCv2JigZdiUdTZTjnWtCxv0RoMMJ4q9Gn6GJ3-P5Xp5IBbZXE3KxPyh7s4pUx9_qaK89pkLWeMxA6eoFovM8_olqT9q9YNhOK391m50MmVJf7uDhqmJ_FDXqkAvuHdZyOiYaT4gFQ8snGj4DWQoDvsrosytdotHMVJK03sNg0pz1fp7-mjUe_5YbuZuivDETzfSDfp87YHM35ZDAVfmNciA73UUDcHU9NmD0qz5zQVwhCsLq7JRJmOeg-YVSLUL2FfyrE_yXkbdwbPpL9SE79iQIgbIO82wgouXUVlQir-hxsQAkigxcoqEuB2R7RvH4KPn_KhZT_8jR7Ompq07kCEvaHPLfi4Q4FI10KUZLyonsqhbY0OKhw_BNrEnCZhcAR0EuDpOz8EmpGKrQYTRE5Mu_xfnMYnzx3ZlHlcwYWNR0wq3XanmAjUl28ilKGXl_04AnQo1IGgxMWZHdob4V_7ybDSNBzL5g-PiQO41PzpP8EunMvu-yeqIVK12qYeZhYhC_BGiVOaRFaBJkWMU5PT1nyOEDpAZlGQGpLVM3McCnRbGPDVVFS0_P4mr4zXxrP2TBiVFrAE0RK5FZQtrmuvctqRU900oQrA0YSQbm67OgnJeBpNORAZHMpC5TpUA8auiWmzxlPMhXucIgQ3sdAztbaGmObOfHAjLfKOX7ww2Q5pmhIg4EPYlZcb8s2Ir4Wj9hWFr-1VaYj0jMw2Eyeo6IN6jaxdrPHCqhk9qgSAdBxBN9lkP8TeR0m3Alnw9bEgr6aLcCOT87c3dKujGCplK8eV1NPqI3kx8EVwit_mEKnCUo03FAk1UErikCj1QgUQX2_omlx_6dLclS7uVhghPZvwpuXvtA_SZUiPvIDqXqzsKad0Dwhe_vmXDvHE36yS4XJm4nNAo8iyFNBVyUdcPfhOHUG4K504GMOLkmAMrgDwf-i4tAXjp6IbKCOY33L7LWdL_cN2Dr3-M0GAR-9OSHxHYynXW0VXFfILH72eBqSmbS8IZ0S5axq0aPVdQiOCrZHldxnFLViqFcUgNO5Yj1KDKCwLWcSbMaJYQTSiNXdq9jFXuyHF_MjZhkyq8YCmNCEc7vWADtZKucFWnlfBV89raCHSx_3Et8JYdBM0xIWDdaIA9hItvUASGBkDUte-6krBws7WxiOBMvMATPGjlw6uUyBsk7JRNSI74Gy4SiwxHkMU0wsFFQJThxawgmuT2W6LovqJKsRLe0fkwc_031wX1thxPgQTt9LHQncijgwfriFfWWb6y2fcji1Wt5OxucNlqcwN1z4p67VmkA9gDKSd0yaEHKGJLSYAEBeS0y9RrsOp2yE36tKIQG108Q36MwH4cn6Y9OaLjC140ea2qZtQ97FkhiAGgKemnEJawbIITTAQgT3Qa7siODa4qmGKynNt5g9yS7scL31zIJIOfX2FZwrXeo8R1eL6S8sr4GvulJOwGcyMKPKwR_9wAS5sYpTiZvZs5yDz2_yLsckSJmFKkqy3J536DkI-2KdIK7KT5P9MxGZhrLmGYAdC2SA37RGKDmMcyBwnUql6E28CYoyMW6q8oVHbY0izhPjc7k9AFodZJHZdMtdvnXDa6VeaXMDjX3zwGcdAS5vRfZMjqYcaBUosWttrtx9qzdZu_f2TqbFwXlwbsZ5aYOO8ePryKPa3xCjbnRUCxrLqAdRhfDlmtMS5K_mKYkj2ofSEDzsTT1-5SqFKTs9O6-3ARpqpWXxVXxCeTfQcAOpos2mEj03g-a4x1mXNgxliEbcwFtqk7mDcsTEFYEVIvrs5MV-f-PL3KrNKWdwq_4bWz44dngg2fPPmEvMEMIW5lbsfSFcykQweH1XMsTPKDCfSrYoxdhWhVSc6k6hfxyvUMhuVyj7nshJ1ITENI8ju040AZnKxkHYeU4--3cbLlKLPJFi_tKcixwf5cJ-NUGrknHAZY5IWv00sCbwkPPv_LWWIDBN_yE17lkxkHfd4eZSt4XeGja367kyAHHIZhFrBLpnUl_ChI5zzQadDFq8mPpjHfgg6kKTbpmAls4dVbxJ7gPb6n4qZAkIBT7j5Mnsg8LZvDVa6hgSnsCGxnMBeA1LO-LgmvDB9fDnjFapisNUeGi3CA8HvvegIqKoaustZaQDba4_rEvGXzP18rjjXaYohXafVUM76SZeXtiYRDo7ZQP96f2Gooj28cU6jgNUHk8F3LyV77l3xWHBzJoQIoRy97OQA0eH-if4NBU2MN6gqPrXGOT64PFuZRguqHKJg5pOrkPYYkFn6fwyvg7Kh41pOWK24YUayW0lr3QFQeJfXuGHV9WJiq_Y5l64dfvf5NCVgWNTZZibIa-MKOl0YiqPpxgWZGMEFsYSnj9XXKLCHgxcHidzjNJugshW05jsFcIAOKWrAqAyjcnLuPrV2mJPPsNSDGHplV1-9PqTM8S5UKcbyQBhJKBNLx0MaDh18sPfMlrnIk6M4giCOmzs7asiyGmIhbcUDje1H8jQPV4wuUW81O6oWuGAeXK6qpBHACrTaONiITRIYoK2FoJV8gw-SxVv2I_7lOewBMkADamgRTmgtiblc7KPa9Zu2a00xx9vhDQTPYbqsdP3QSqCBRzi3hMqsLavhAuAr6VixnvnKIupOtefPWHSMmVbVhIPwP6iz8-ZCJvqvpfEbjoIttcuXutxcW2wJm0TjVoVBxZj6yjev28DvKe0ggHzwQZx9ipvpmkpkb7shu0l6jY7HstX11uWCPMlmM3OHDBTnzd9P7iwf5HKxbD63XMxndcDA7dVxEhUG9T5mBZbU58cNkWwAbYZFVVET47FCNLe1wzqgkTJpMQQA1oI-FU58FTws4TPV9LNQvXHDTNKvpFtx0XvtjaJTkqvzR5argfWpDZsAuG1cvIwLH7QF7SxCYjE4XMScD3B_NnQp63Q7KiK2PKCGjEH3t2A13IZta3okb6EiOkexN6_TnMqbtYRH3jORsTCULfgAZjomk0MrHxWNxersqlYAXAYQX2HtuAWTVK3dftqGH4sBWKL4ZTD-qWF4P4CvsZJ8lfAIjlcCrvgn7Da3RQi3wpRxSZXxb1Jj-h4jpKL1RLcuIfoOHl4k7TMYyXdlHkxtq7_Is-UiZ_mdVDWHhPmmvY93Ow_kc174zRQednRQ3Mwyxn-s1GXaB92l92zF6e5LC-C3Jkae3nCQg-oExKvZreZdA5VVVG9o985f6AGes6hRtUgrLoEVzVNddvgrEuJSMsFt-8VjOSrQdnF7u8XetAK8rAY_7xUuRWaGYATNsE89A4RZ5BB74L-OIFIS08VlgBGEthm2nW0nfAyrU6KVnZQIZOw4c6PU5PBNTMn3EQahPg6GFPbIrTB8i_Y5UnWUj6Fa7BxD4QG02lCSSwAQ9OMxnNgYzIDP3wtmW9eiamdjnGUYpjUzny9mN7IwjOTlxGe1fCsQa2ytURzSQ4St03Ivq5AkILrqzyCl4q1FkU0CaNfliNmF0d6gO0eer5Wv46LEWDtJJ6CNh_8P7Yw-5YFSstD9cBZAGhbdbMA5JumwQsTk5HQvaXY_QlA58alDvatKdoA5zCYy9Natghr6Sh0eJMiYJoBqNyA8XMmDNpVc1aSd59CeuTlKqU68CnqE-lUsReK_TkrX883huqrwFzAkzDbVduqLM8Zq0lBC0iI-9ZBuenLCEzfsBxQc5nIF-nKyDyhepBQ-gwue9wqDRda54mSIRZJzZPMxhTIsOFFdaV2dOJxv9LwQllhMydMbekwGU8cL-4HfnJqFKj7YZT6T_YjYs2Fw7-qr9HjaJt7inrE7DuGAUkzeVFoAVV85rP64IHDIVfvCENjXgRC12ubOD820FxdCLSQu_1M-F1n6cU17Y0Fyl8MqRNC5xSF-cvPgilzdO-eEYnsQHMSE6SXBnlGwls1YCv1qGJW5lanaq-DuqTdRjIuzevF9iLlhz5JPLa-RML1oGEZxEpFNGYzIy0QuFCfVVR9UuBLUkOPkukMXgniTh3G48yh0GUF0Md5UGk3URQkpy33nKiQeXgB35hIb2z40y9qQz08xMm9EJYR2PIxKGObCGbXovE6AAF9c0sKPNPmxsrXySKMBA1OnYRFRsqcWr84zc6GgHinp4HK5RwSJ9qoyvFr9Uaosm5QJ8vJKIhA2q_4wR8Sgqp3Q6u7ks6VIOi92uqrrmq5USCfZKC4teEWElQMVxxoEaFoc9dpZ1gieBdx2wJO0HfsHUIgKK1LXsDl_uONzTcjOt20Sv9AXo56Rve23MTBdzdrqR36LVPSt-cc-9pG8aBG9NABuXi9qLQvaVnRDD79y46tMhH8XsazPc__Xnck2B0Sng2kTLWGO1A8EbqfrilTcn87RSep_C3WyQqqCtwnyhnfBsjPB0SwqkzcdY4POlLLORR1FtcRPD2bZXaijlASz2d25SFvKA4bataO31ulUvY8yj-HWLHWlSux4ZK-uFfa_iNgBPi0FIR7C14G6rI_JTwGB2BoRlTkBXGZJgezKgq9KgXmncMIJ7dfMhrNULDIsMFReKas3UGpyO_ZI0C7Q1mxWSjgshlWnRx9Cyxlw8kI2PwI70uA3Apou8RjAT2JVkCkAfg82lDmx5HfY1WvOUPPEXPxhwKqwCDQutLFSkGUtEc2CbBx1OWc3nw9v7UHUHdVQQp0p0qtK3G_ExDD0uTUbuQyt7d7wHVYWdSwdTIdE2_rfvoBRd2IcYVhuLDaXzfhI2jKBm5HLd62lZtDo7k4_sXk3iBNruqQpk_DHVL6tiXsTElGrBIidc2akPAbv7QsB36MK1zZqXJ46-hZYNkIjokUveMHHjc28IThre9WOcCa8iJX4TdAJ-IlVsxsLbp90O8w7qLVgiVyv4DKRgTBAGLpcS57L0qFrvu_Z2tjyG9ra4FGYV2zYhE-JE-NjVuuI93DSVFFYV5XiWHeF9aQ7I6wJZtz8RtgE9fmYvkoqFbkQmBEIjmnvuGIP535FWSuoltIgLrlWbsOQf6v13iUlNa_NCpKW87IE6azhBBMJeeHnoj95-eXyegRb1I1po0vLGuaSzD2LORHgXfBdqN9cLbOzg-AwI_QxZ2oDsqISqD4P4PtBOwC05ikoIUoYOdSlRBjQQwUEk4OMx95nq28qUrxO2Kx_lpT2T_293OUeqlkQao9Lu3Th1pfoavBEeDugPodi_LOIJG7koW-tCJjQjB_OHq17Ok8atFXR9GBnVF8icBhJj2HpbSiWewxb5ZFy3hj9-_1yXnarV2hajd7VHRwN8O4OaVVxHX1q25km_L1weyAMddJwv4gENkqIhQFlJq_hAGJvboDru1-7CBs2dsUbOJfNLxoWcOkJay5j8fR1X2QydgjcgBa-kp0KynO5MyZ0evSQSPoRY5moj1O650-9kCp7oWkxdeUS-Hzt7wi86a_wTLe3_zRFpRIvGU3qlYNTwHS-zW-HZhkNLXwfD661vwwsQwaFXmP0wWdX5ni57snZLnu_F9dpWrvSbv9z0k2NJoFE9DXqgMYXg7S1Aa63EinvRyewla66wQCvNcQo184c1W-jWPd41YyJaiOAFFEGuv64on8uipyWdPavg04YBREJwzWfVzm-41kFaFAm6L4f8yKYc2ZWrMwon1Z2ydHBxQpn3ZnX4ug_WlugcsklImJlB8hdfWrnVyTsGNETyUxc9l6Gd8F8xwByTPYONI10jeQgeOQar_qcaXfu6cvUanE2fsrMglHnHWuZqmPpoyWaSTviEqAVAMW2ThOCuM1SzHjoUJV6H2sP2mqgkIY1LOXWQbiIVzJNX2zrU5SVLnYteE0rXW9ExVeZhwkBRuCN0zPqoapc1Ai9KFTdHCG4hQFY1npKJsk1ycMrOG-SF-w6pkweZK5o9obD7at2Je23n4Sbvwwxnw42f-NfiQzvKnL3tp8F9dOt91nJjDwVpl8yhU_zRX1oQfFYEc-5c_G9DO2Z-Jy0nw1DXA25cTZL5pnGG004EQGbcJQtw_0O2U1baxL2FwQ-cxKd7J-QLn2uJsskXBmEzbSzJRaYtffijV10j7oQZ08ygPke75g8Tyg4fM2QZUD45cOF1WOzgEVes_WIJqOAYyQJb_pxTiqfGnupY6tYa4nZwqtXlveUAxYDXx3GRG4-x7CK4PdBs6mlMQb48VOhRvbFE_aQd-JRLz4fAYxoREO7CEVCBEOMRO7Qe4QXddESurN_nXcaWsAjtFUr2LnguOQqiAhng2alH-wMNz2Weu08kzjfSz9NE46790xZaTYx2KbYsdCIJoQE0r2YIM1M0MRYGt_vjoDuzzgXuJ5A_Gq16DL4oSp0uQT0fzGWJqdv6f6TMrhXmuvlx0CfOzEyrJudA-sL-VsEXRs0WNdkB34LCkva5LcMhZ2wUkLIb-zuHvasiuFCZdJ9tPa6eNd5hfXDuLWmfw0A0NgmsHmy9ypDSiVXNYUffpphe3azuoLoMxYAB9GBHRDLwPXJU7d-9MkLlDVkhfvfBTrcAerTnSWz-swyyZjmW8mX7CyN8sDQ1oCnsUQavToZs5OI_kWGsO1HGKO1CLiFcRp21kg5H1CPkQxadMnBTp8aQ_GGmz6n5cj_dWgB9HRt5hx3m2kBFvoYlQFrz8BNUpIlHljAX1hi570A3Zf8f_Xtxt6n2KCus4c8wqlzbcV0I7ZhjCqngE02s9gUaNIvpBpKLPeSIX5iI5t7OvhrwKSDih-5gkrrbxgsI9hSIFsjm2BIXo6bxoodWsavim2WdiKGOVlEbLYAMvTzl4ag7jdk-CF2Hx7GOh8bELIq2ADiAzBn0K5izB5pR2nwZshF_N35HT5RZ1dkWadpeRXzruhNP2IVtiSIy5Yo_fKFTYRSRBTczaJwqXg0mM4-33bL0Lu7QaTOgsYla9JE3ixvtr0jm6OPVAq4zBjG9soWeENrAElIw4zJWRQF-yqSIYAaOSzTQRbjS2soHt_U_WDpiM3PVJIYlPosvsnAJ8nD0eIa8Y6iZ-_O3rORQ9zZwKBFOqDd2IAmJuGRN85qtSkZfP8Y-V-PrLtgtYU9JAkQkaGSLUz9TuVZdysVNzuRtlIbZ5OjNXysD70weewHk5PTtHOoG-Q-ld1dlha70B9-Sfgr2Gnrky930Eqd7DO5tQPM58cSAeWnEtXQoDvr8nX_unumBeBFOSu6Z7mslpiZeMHuN6O55ZYpvcdpvY46AV3hoOdB_BmV1WRiPpHi3ZDcoxKWyQEGrH15CAS9VcskKPPkkBw7em74kmFA54sE1NPh-r8L9sOhl5Husaqil8utidzHDCBxoipoZHgtsTgrIUsWfDzEXsxRyCpm-LlgEvm2GCNk-ZpiQYOw2fo_PPTknfY37l2iebLm1Ona3ur6xp4WpTE-iuhEGHjLEUHewH3Ce9FrfA_w5TqRJwjaCKikSOMfxC50e4LZAqsIP8GTa4LIoGc3g7kPfORHwlp7Ss_UiHJJKVTsMqtKDXSDYNjtaZ59PQtJw9Jm47txtobnqB5aWoNf17BHQn-RdDhYfIPBmj7KopdPbcvS6KJKtPLiTPKaw8wLe5kBNrDy4HtBHO3qlPLxXfT6L_MUjxsbAHcz2P6hdErzDytiyG6IatDaDYhrShthPq2GGu_88oEOlF_Q1rVVOt8GPnLWCYDkABUeGGGprAeZeHzVlABsDWbcaq8hTzxIP6dhJ1EmlVN_iWD3tRFj-s_wqJH-yi98Rh4xWoXhM8wrlCRVyLkBrPcnmofatkTRpwj9n39seeCq0qaVhhmpdd0hPEUxW4xCIWJUPSl0Xz6iHsS6KNOlWcDqoGK1sDVb8k0N97pu24svAr5Hl0UY_rExtLxnuujgi4Rr26GW2E7IAAXvFzHbrvEGbMnGEQVE6kKkcEt-j3R8qcawL5FBl4F9HxvJ1cnKJ3CDiDHVixjER45_WHCBdBnTnK7eC27zCpLkZPTTMSck8FQXt0O0gIskfr7pUr4qcEYksMbPCDxkQofpgKWJ1OJQJxPsbiIsbvfAinWv9Uq9GiyBOuaLtzwJEAoTGi0I5_xkF8Uq3SJoRQnW3B9oxb_uZhLts3Z7UPfgDW9MluLUelZJgN87Gbjzzq64WOWnQVnI-C7l0mvOir9swoqjqPkqAHGRlxTdNvj7tfnRHEL3oCbgx9tcQH_pBXdv68lY1aU2QvF6_umuy2HTiBPkekCFjwnMjCELt4P627cfsMcRbAaU3FtOvYhkroaZY1aB9ifNqhGvlQz0jHB7QP77HjiqnAma2mRxgGL46Dpm8Cj5jlZG44DDvAHqIbbHgBvav3ciKQ_luY_Y99nYLvftPjqGLsffqJComKhfdSsEp_eDbX5BI_Oo09xVWKKlPSuTThFjSxAr7wixPRnEKZvdBjxNrPkDohyCejhvIam1vw31MMXLWMEdP23llcf3T-BissirCPAzb9-h6Rq3ooO2Nv92JeHybeYUSuuDwQnmCbb_Q1M4qx_Y0V-nRPCqxYYVxG6qTuySfnfKfIXkFN0VZR6Maj3Y697QsbOAjUh328TQvuSHQSeUD3V2TnptA4qbxsyQcfRfZ8ho1tvjh7p26VJgvCTRYeTUi_MPyV7ZHi3SKoMB8acE9Cs0YplPe7aMnYD5G7LxRGpTXxq0foiunH7nTmZXqV1lvYbUJgC5tgUuHxEuilk0Nb7bXPXUCHIIulekXD9OxR0-D5Saa5Y3RYgcsxEYoliE6Y5aQwJFRF9x6d59e3vNBI4bpqFxVSToionNHAXv7jaYkRLKDZ8b7Mo-EaSt9f6x2wc0Rfs4hAA-X6O7R24oevYzSJsMNl3rtpWfLnUZsrr61GJwo0gO2KY7MMto5lEhH5XVe7s1QVEGZYeEH_mgvxX20MhBpGNOaF6bHEV8gMWl58Yfimv-1Y9ZCrElwJldylptk4kKVsR1qs_fo987fM00cYz8YT62N_9dCog5_49rHWomazeeM-t4BGA56BxSWco8HQNeg6yWYO5RFKB3i5jZzzhOLsuwvPjaNusKDJRKZMOvps2JXTLqJIp7YE_2Jd2pPku8lJMkgyuxtm5EEcQ9JFaG9oMl8yMMhpY7jN0ylzj8589CwQyT6ezKg8C9mviZr00gk53F4-NHVU-swIrBCNXC72TJ-HX-NTOJ1rD1ddNtWlZmxlnhXP0t8YSX9Y8gT7wriyfL7hZFExcYAT-LMmiivEsdqPBP78rQ0K6x7WOxPY8ety00xM2k6tOhrq1j5DC9R1m0WL79ruhvLPFvMPuXBxz17V4uTYPWXwxouwfUFXS1rJKMYcMv2j7RMs63f1tS_ot9j-O6TRFaIQIecED9LvMq5FiQicXaWIEuXEUDruGg8M5-V7AVjajvLVNcH_bmtH58hC-AF70n7Unhh5nsH6BR5ZonRqUClzAjPU30udHM2669gcFItm56CS3SnEyKL7bqZ1VXAStOnBKgipyXouhW86Mf6gEDH3CRRb5p6IoKPeYnivu-pvEHBTtxYGuMle74Ev8oqQYAnYeyoMBMUJSq9WAPE_S-q5eDlhc9p2VFjhre605w84u1GWf1et8boHPHWaPyWYg74vVnOCYvrYuLLEK5CFBMli2Jb4ek0Uh81-jcGc7RBAnhRy4sh-9KhfGrGj8lxKm_cki7jJ7QE4wW2XbF5SwZ1z1D5S9j6I0Suo9_-a3cFGavpzj4Lhf5emThQq00mS5nC3Q1uyjiFG19rhTO6U-T0-B5rpKQ-E_vKO-73PolCgzCW-v7mFUWWKphCmWXoe-0uAb0DglXcu6mcGjiJDCFYrxw_2O4bdkuB8N8Q2P4DxLit8Y1jCybL8RVcxJzWW3GFP6pA_g-ZrcgRrcexa25MXUZ-1Kk8zwk0ALrKRQMmrJK2KqidbkagtGHMXR2QxEcH5VIxgIZ3SqZD9BBcHgqOkHTm0JV9bR-VdpZ-l9Oyu4h9AQYe03bYQBzqNFge-jGsaZKQm0unNiXC26FUccsSmOeoMAcINWLBKPnQSdiep9u4XCgiE4OAjNqN0VQqK5bB8RrzcM8f4zEO1R_GITGuue1RwWPCaqM2Oi0wSakZSIhV6RfEWL1WfhBFQ72ejpviIDKBTWmdoHQ0cLfPxqeb_rOYo7F56lsAkxT24LjLA06u92ki1bvqRRnENeC5kay8nPSpaKGFVDymGIh5rG8oIKIhbmTGQNKwJWCx9xe2CIsGdyBnJBQ7fVVUBRFPaj0zWC1E65xzEs0u55_yK-asTm_q7Gfo7qEbjYqeKk9jumdpVFzRzxV3-gISosMMNE7Ne-gNxITqj9yPZhR9VjN8_y2Vy5fD7yeK5XtEzgvN3bQzG8x0947psmXeubq4N0eT43NBQNYpQS9e8bYYAODyR7MGs3EtpHi7Sd5Qcj66p3oAXqMNh08_xD_2B-CIKciYip4Jmob0aPCU0o7UBjkzE6HO9tYWAv932edH3N80EbaNkIeJ7MT187eMQ8AiigD6aAy1QPWdJumRu5bm2iAJJ4Z8pS1AjgRu1h3J7nqMDoMy7bNpMAepcngSW1fd_OL_TMvF7q9VC5XnuEoonPk63gZ5mibjV_j4L9sdJ298z-sHCXGxG2ygHMskESCKMmq8J9Do6c2Z-6MY7soZM2TOj5YfgdAPkdSoKSjpissXAIAIR34orCOuYK9Km5m8OTZbJzRIfhEkKK8K3zYv0zb_idYBNmrDEojL1jr68e2zwQUJtHGRsYIDGZukCWRNXQSA0QITprgMSHUOPh2iEOeKsA8GpG4KfOgShfuSO-S1oUUXd4UhNGQ25zwM_TNTnzu1s1ECduNF9Ct814tmv_E3f5hu_rm6pg9IcVhjzSQJcAEOm1ZtBtUJb7U7f3BekVyenMWFfY0I-4VI1aZG2LGZIKuzMK3QSpz2ezYVwZShvs9aTN5kAfyVLg4BZozStcvGcjmgdy5jmpI5V6G7QajXnqFIeqzoqNGZfpNP4lo6bMmuarEoGrjSoF-n9Ci-62i7cyhztJXJfdnrpRPZMrNDhf6qmCKpPLcKLkKCIn9B2_7Lre-VdFv5TrJ_k841QhDnUG06VzVfBSEqqoXE6znkksicLcRcf_kX0V1c67tzTuURAsBnnZ5BuE0CLW8IqadRPx7s0qr9SUaL6u_eW5cg5yBgpVmvyZ5gwDHUaF6WMeK_hCUmJYhlPlW680d84VlYR-pu0nrcu9z7to5hVLYOHsYXUlTJM-NHn_SHYCsbADsMunPrnJnThczmUI0eEYx-hqOllCiiq3l8sIb3GeFtUj2c_sBy5ACYq4YHG1APRiwmgHx3R-nRRy8iI98juTY2EabGGuzGMOpskqwjW8Kh7RFoDwjvuvcknRf2mE0HfT8IT1EzqS99x7lBbMio5KDVfb9bpmseN3gzu5Gf-jd3lgAAKmirCj9QEysrMNJCDGACirQOKC66DKW58dlrw_NLgK1fhsFK6U0wS6gxfUdlsvSDPHHTtSkh8oxmvUihmH7FpESi3zoO0dW9jOL_MwNwab_syrAfCmMK8xz8TvK6HizmtsXY5hYcFzfu7AGW9wQN_Zp209fOJsSMda5f58HvvztqrVfzGDycmdBYYoyLjubvSKsHYkAefyDTy-8X6Y0L37MMjKXzET6JB_4Sb9M2gj4if0ElbkqfprPHeHdpQ-JEw9l5sDKGhhzwIu2u0CTSfuOGEFSgl_jfEoqKmiCdVgHgY64VCZxCH_gCv8Y2aNXnjNjNuz7TGopC7xq-CrssSHWy0SMBfhvj7cqRwPaX2Jn8MBWd-6gcq5uD7u1BhnbHHMGQcznNIW3AW3ljFelfsskLiqejinbqBj9pMi2QcvJnmkoA-mzIEdUMXDsn66n5mbCVOaRKzYQa4b1d-XX1zjc6fORsAFF_bzZzgSluGhh5PDwd2pqqv8Vag5Xhk9eTynEc3XFqin-ZckbohPsYpqKazh8PQkW0J2YGkT4j1O5c53seCMmbRMieXmziC1lA-C84nAeHoth7_Zpkhas5W4ihNUIVWQhE-hGXSzDXDkYa_BHIcg3vH15xdTkoNXUskBG_7dvxsTC7t7h-8EAdZQlXowcyhx7QvKRNUqVl9SzDHPMIApgrn9hotuQLTQialgpK1OQK9M7J_ZnyzO975Mm-JVRKvk0Ty87psoKjEGZP1WKv32J1lgRNYExrHIKL6t77atdUQtuqh8ERBd1GO_iky1BlFkhM4rJU5Aocsc8tko8pRMrzbXHfUzAV8pj8JX-dDd7jnkq0r9IzLayO9OQ6NTWg-QOtrsuCP7FzIJ8hw0fK39pWRG3gFu2yjSofQWNUbs9FKbGFrCX35eu7tjeEGT-lR67qINO6O3LyZ6EEGVYTF6JsHxBB73NUSyhr0fDbEmL-4ffAcRi-bpKxVG7maao1PteM-9m1FweeUwcmlJ6n0XpVQMyhDaWsKVI6rG8po6qIea9m1yJ5-j3rGvhpxSLhomYSDiFAoFjITXF4FGEjNa3fQ5CD3cLNgOc2r7uUfyCid-XT_E_TUHRRAXRghj8410moMZj0KK6C2nq8NkPlT9-gzGvN55_XrAWQIlGCIBETBSNAw9DuThb8P0R5IuwggeTaGO2YH8L8xvVTUmsUcaSw0HEB914i4BSqrgZQgQg_OpK6qAdMAvt0fMmHQ78ubemLtHePOyMO3-0YkuniyY526ZdTDisSG2VnbY1tlsMhq3cIcJjCDQrrJDIJ_g85_qXsypJ336GfooaichuE7z9_HoaoNRbODu19QFHC9fh_tDxyJbIyFF65bTVjs7O7NnX_SGxKQQ6Ixt9P5xj4Hkr6e_J2y40twPjhbgJ60QloA3zJtg1AB2KgccVDWlQ1eDi2d3UJ_S1IVScwjYKvZkKyixNQ4Y8VSk6mEEMTvy_T5KYR0q-5rsV9S3y64xcEWdcED3BQJMAFMNn_5Hj1ywRlqV55QvodQvzqD66k7HqfaFmVf1LUZNby-myn2s17_eQ2AokS6n2eZxpZ_MesbkiCQCvhsifLqkrTNuRrbv35o2e-uipfzUsb7wUzEvwJP42n9cTclzohXtE_AWZHeyDl288A9VUv4d6uUbZuoeU7iUABR0KFjaQDGsmeadPGVGBHDrfllJEP0f4Ae6K0GFmmCGine9pfXnhJx6vPwa7dtQqiemtnthfRru2e52MC39pisDZx_jtyEVj2fM4TEFawFRE9plbqHtWBOzsmzhavYNndATOtlYLjhWgKxMxrxTgtAae12OSBxqVEonNYbL5p8nkka8QTaSVDIV1Zuj95RN-00ZqqtMiJHCKbUvewY3KpmcjUnfIlHyzATcdE9mjkn3BmzW-BCAcu73MgwyefjTzVPEP6DQWyZmVGVGXbQOG72Ymw3Q4GQTujJb5znecMbaVgkjKHtHr0HPlPRchZ_b68trdP5itL-CliHpDEJ2PTnIM4AKhYcGStUw0gcqIoAqA7SH8miKoRw6SymWhEs3ALnJRq9ksuVDIvUKUqzcMuNy64aubjVPC8pc0DoQdoA46KAIEaeWgCKpn98liHbUHuD9c1qW5XsNXiuRE2Jiq5YVw7jXS73yp2uHjRkkjZiyXF_j_NNeXhKwWGOFfC2EWj9Jns5BqAEhgSbdbIyZtnYOM78aXITpjlJDL65dBlWyePacVC8Owfmzv3V_M6haukHeJI45HlwF5zmeRqLcKE-_DsVkiVkU-3130eeboWCzY7T7FeVwsaPtXGwwBVaUMrv9GkJL2eb8SbsIgC7dD2zFACak45nv1_5sOQo1LuPtufAEF1lIwBxZTj11uzJepJr-DVwoW88G9cpFiSmZ3k_NfpkZX1zWZZ3Vn9QdgyukohfojkRS9dtY7Q_af51rT3-QW4kueZ6xkFv-B3_f5uhdnIP9KWbkbGIJKAlLaIh0WuMTRtHv_-Es6FGQOQkQdRNMo_bsLkYKEoRgOQIY1227K1Ox-5j3CB-DLnGa6XVTZRS0B8FuvtuFuZusrJ5XisXJe99bzQtmwge9vOVLVLoHBRViIGmoz0DsB-kvENn_kB-LS3hE0zExgisdAk6Wyz01ir0bXfnLxkiucmYt60gk-JLkrlcaFSqN0lZNEQ5OxXBq-Egp0WRO3zj6PJ-hLHyHgAUl3bKN-y29HLHA0XhjCqtPUlZnNu6ox8m--Kryl-uYRhQDa396QVl_OUrc-PMMvz1RpQZKvUxHauL4LsgXUS-SqTpbdvwEOYM3YBN0-kQ-JEmxqXdzdUeJdpOdssQi1ORCl6yUafwgqNUqYPmwrf5awuszjf56QI3hoLj1H_LZOQln_eVylHTKg4JZnj0g-ovGK7s3WfPWZ5Wgiyde3MCiIx4jbhvt4af1qsxALhodbdloO1ErDhxGvR9fS4oH3OdRxXd5C9jgTsQ2damUdaiX0hvdRTkFdTCXceitcKreBNGoUyk1PrEAhWQOO8msC_j_ZLSOMx0HmC3eL1kV8fHdSVlzCWGISLDv83msXbwT-WyyDFqEAZ_IVKpNXrW94uRLs9iY7_qstISAvzLYacFpFxFgG5NULoX8uHkwGoQZtcJ7HG5egv71mY6hx0Cz2zncYAlF4wuvrlDNbd1_wiHIfUVpzHhCib6omU6TS7bcF1VQ-rXAbTNVshJcpT2HJ9JSmpdzMYix4uy4Xt_J0S42imu-Q6U7Rei_4NouEebo3vti8qWz6rJJec7M_yD3UAsknPJ9M0ae8QBtsfOUG8jgECB5-QHvy6RHasrR55g3h_nSwcUaDKd3I6Yp9RzQZIH_ilsaoQOxMoGcknib3fzZSHMNFWBcXRHGTjIkn7xiabS329Z7tysCSG1ImIhlquTVcYcxIEZuRzqMVgtwdbumcekSVIdtm9wEvHVENjd8KxakBzLydNGpRmtkR--KYBaQbKOXJaGJ_OwCcmtwKeblqzYaKiMCz4-wDxgjJlIB0anD205v8dQjuEUXXTvVIGu-3sN7r_Gbg5M2kwHu86VnoLickkbczKz4Bf5pTpfigLwcibmV6Dg1-6lY9tWMlFBYZmDMSm2OTnGH58Nkts4njrvzvjBDLJ7mrTvHYyURulm98Qew2Jx-eMw-TPIu3tMjXtZHJua49hvM1zeDpBrybR5a1cKPfFkyiiQurtadgnWofBqyI6V5UOqKzWR97qnIEXmlfxjsne2JmBjevrNJnq5cb2QhtaHYHVetn_NVu7kn9tR2ceOdUr2I3KG09_71VGG_57jRKkByidPIVpmvTYdHVPIF2oCnO7MhtH61nxP7Lw3mnRN-JlSobQWXwCACCCfCfmMQhTN1nYK7Yuxhci9agbeRpuI_cSqsmJ5RPo_vlI0ev9fZoPo8_MlyhxaejalHDTJ_JQ3Z5bNugaABP-eqCQgwXu2hiRYoTjhpmXHVJQc-tMu1tK7VfjThTlqPFl9PmmkW8748orQHAiC-T1kVVNgnK7fXPQKJc0wd_Ie2FzrJKm9LeYA4XY3WHcWDAw9oqw1rvD4Xy31ZB899jM1Mi_l43A0CsESTMNjnCBONHiiztv8cGSllf-S8QbeQp0mJYoMw94PdZ1aXKiskqWLzhwNr4uw4y4ygIdADBMKxx9Ir3VmD6_47KPNaPuMIDh0sC1PLDCcB0eV_OyvPbX898JR8KfLTZvddmKdiZOIGUbsphclT5h9pMaz4fbdAZ32AwBx1UuBEmUDuqZB7_egMNnGyqqclV88t25aaKlboB2yyzZR2YaJuHaJoLuNtGvodwluIrX9lhInxHgEPuHMNCgmBqnCyFapx1Q6r6OUbIqlSXcHJTEkTB58_er2XoCX3N3QFD30_G3QIRGXg7K0Mfj2NrUChlMaKjSyUgHVXLkLrT_P3nZ45fRnlUoYa6mCIHGouWjPQQ9D7eB5yqRQeCH0hVtA9FP4xgk1oTMs3zAZ5rBa7PvTqzX4XhPHB7_8Vy7mHXckPdXOf7PC8qjkdp13_QGohS_I2w3eYTTV-EFvUQgubkxERZHxU7ImXO65CPyJcNxVH8014efXd-W7AOuKql2ByiBewD1rAjeQv1yuNPTI9_sSV1KcpUyYHbaForLb0NMz09QemDE_dzzZEBobqFjxyuJzOEeo_VSzvtNFTaEtPzRdEZaINhG_h6wUdRAEQRc3oLuGevAoNtq98m-nmsK77yKdO0LOzrh2i4T1qhN9DxvLzATsLmRA-Ltk0BgRmxJWSQR3ZJm_6KF8KryNZoa0QCoZY2KJCmNF3RsxjnoLT0Uh0y-sL6f8HaFv875-_adcwMgXOVXA1pZupINKsBviiOEztxFdURVEBAT0i5oe_N19td08qGwI58wKZYdX_fplVTUr8yyTccc9iqQx4j5-a5HSGN3VfeYIH5m1xm_4QMIwY97W9O3UwrPFiXW7mN6WXNBUauUY_r2ibAB2uzQbZmQoRfKpaVBuvFLLm3cp4Xx_BqAEsh_BgVREQ8wlTjwEr7wADxnO_iLwgrfyWQXdKl2sbv400BI66RiCafLVTXd-BfJY65x0w7bVscAOJYlH9OAtWnOk9sLlikEqnTu07IRICAFkehvzI_NFkSO_2j8MVTVsYrqvDTQ-fbNX4F2TIMwjDXENJ27Au1RrVxiCfh9awaIqyaDhDiBNRDHIv7qrceIKrDKO9z5o5x-LWPbFdYvprwZI4uQwSBuGSsEPqJ8716-gwWl2BB2BHEWD3fE1WV_r04tQdlGL6b5AjB_z0hdYdSpziP3_9aG0pHAz_4m7CY1cIgHpkOkMME3tTq2XS2QR_kMy-L9qo_2Ye18SRPRH2avG3exffJ60Wn57iPXm81CRouWqcI8VUWeGoSG-3kxub-5pCDIHEjwgYSQSEVjwp9OHvQ-7oHDt2z_I2ru9H-7iteUiEhhluCCqyPnacttqhR2kSBibNkSSxYUyjJmx0cnDKrnvX6cFgw7HJlA1T3LQcY7bIH6f3ZcKOO1xkNMHSGairNeBI8yzeXHxg8c7ChsXlFhTfT3d9xUyfOcee5IN_faWidBF7HrVdZn73oz7S8H8fqxAOpNMs4bnTAF0R9aNLP8NAl0nMMViJ1yCXdLD4qur4N7hhEgotYcfCsUNY0FvHTy9LxNxQuh_gKpWqdTCt9KSDnzb6DsgV1ATQhDdIY4dQmamg_hiZOECE6gjfNVFIRdOUWawmglRrqpKwYmJefFuQ356wzN3qwrcsdM-DiWnBQDRtHbGCGAvYOD66JI8DR52qUrdL-mTN1TjkJksh5dbyqpfoDs3Bt8yT5yuWa0nUn8-SNumIMbBmikwbQmu6Cd4T3ys78wavr5M8aGUPdt8bv4fyEkGxETBi_oP3pXSuyiDKPkqLzX1If9BoZvHiPskDB_SI3kFPlJTGdkS-aiO5VuQYgGKigMDr_Ho0LugaxhCKZwMaCdvKNg867pM2p9GXAdvPuTRv1DzmYbdRzS0x9S144vEr6QOc_LVz4HrG-Nbu-mYHelKcLoRz0jI28EBakVfSjsHVKCwP0fecZ-yVFN8Xzid8NzoC3k0ees8kllUvQetoOYyzvYi-i_akt6cwiUH8CTorhgC54PgokzQitnh9gpLOLl6W-laYtpz8nl1rx8CN-9DpNixfB0vOh8cvcWgSqrboNdPeEBe27niB3jFF2Rp8EZnYMJ-IR9gZ-axB5fPNb1Ofq40rsxj_0eDZtEtGHuHXLmTACwPngj7O9EQHf0gkgxg7XTildDSPS2wyRXRWkktWjuK1qv1g2GCKwdhJjTDolh63u6nNaKpCdRG9IiEj_1E6C5xPn85Zj0HoQgs1FUuHaMEpLx-mwOHihWcGkG-HteCMLFOj7aeaiB71nRY5GGAVZr8XI2Yn_Qa27rJP_8myge0FMD3Q26BVzUV-IOB4b6c8H7ePygm6KDDw3aQo-fhYMDS1AJznXjHWNR-XWTay-W6I1wRStxmUTg49cmmOHm9OJKqUPKq9CxEiJD3MG1zsMvjOnQfTp7LrcPkjvSJRf9jk7V6QpBs3hmeg-jvHAX0COjuC8i92VnHHMtfNK-LODl4O8mDTOY9HXOebhG4bPwqSB4VBoWeznbjfspFIRXJQjKE4yvw94p7z0gWdf93EhtbQpYqQpnqRlgqAftaGUqXaems69humaKRneOofB-MymOSRjuoLzxCPcxa3Ml53ArBQog2112THvRa8JdFNzGl2vXzD3zxLJiblkXvbINcNyA8V9ET18N1GUWKzUphlgLGhvw0vKU4nhCMce9xrQm_PG7ut73RAOba3unBvopWO8cWgEJdJAiQy4x9ZYI6UekhEd2j2tg6gwbg7UdJvsxZYlgB_x2IjryAHD2mWE8jxKX59aNHIdqHGISpf1ZiAKWQWsPuMPNw6WzEG4Dht1xxBRVFCCOgv0Dwfblav2jzePMReW0p73dGa_zz8OINQkFpJzO4TF7fqopaWaGyrIiB6VRkw3MWWcIyNHWQu8HaS208mCoUFI1nIVp2DSKicu5BNwj0CXj3e4MIhUcaGagNsB5BOAazzs_Ia8eLXVt-PjlE8aLQkUIIUKs7pROt811_vBRTHlu5SuV5hKKRwDzeQ0jx1oURqG_AjkclrO69iohE29AfrAp1ObGEO-o2hhE30UF4QlbE_Q4o61_1syM289jgeIO-6ZkoLIqNTuW08j3A2_CQCsXbiiBf5f7oMtYWIdfZsmEnyNkzi33xB6QEheX4K8U8MqS5ts5quVvS9ov8wsNIvcFbIFh5Qi0hJMAXI62tyLuvQYtXsnouUc3pX6HhfbtuidnioqB5M8CDJsS0qSt-0oj4t9Y80YvPHfOFZ1ilGmPh9evuQ44UagPleYWosmkMqyiCSJipD9lS4MIVwdJQczIuF2-j_EjVJ3sQSJCBP7VCcU_OYgS3v9_vel7-9fAEvsMbq8qqjWvgjEq_muOKT3mq_iIfariXlM5XggWeakA8dy5uryj0Vd25vCK5dU2oLMjfvejaeOhk8AWXEpewe2WQ_9iQCreNPY5RkHwIyGoi2aFz40w1LC7KcmLJtHrH_FsfsoaSrapdLiZESAD0blz3VS-2UUmmy3Xqq-BT4pGDaV6vqp7BHpHD4Iy-pzaxGIipDRbwm-dCxm3q-ePPBuL8skX8bM-kno3JzMCtWPg4LyFrxVMRs4UwrGmoDz5gfXSiSf9-pISvGlyGSWL8lSfErrIF24u3PsbY_fHiFyx1L3MH-M1ddzmld0snyroIB55FBCPqvBMZD1fyAHnHV8t_HR87omcuGiJ1kDQEfN61cm61xZvs5R9G6xOmnEk-7_Gg9lUJHKzwaemQ52aYHVo9883xlxy3K264jVzNJpqlWMwL20_k48VdH_qOICV86VC1zugH7Qo0eBaHOArc6EN8cDHw2Lfxh2S0znTRMZR9HGQhIhm4sAFJidCF_AJu4pzEjXsy5zTVTfyq5W3_Ko4kaeFfRV8d-Ajo8mS0voy5qrm3OLsb7OGHrLI9O0ZJ6ErVEkbdFSNw27o6DGPN16lKzlC9ZxhgMrtSBkkHwzGyKe-GFhgHHgXsheP-woMrrNtVtMm-s97n5OwCsVvl1tA19allIqJC_sbBw44WuAM--vptyesbEyXMgYc4n7xRvEfmp1O4VGIkc-PA_myL1B3CHPQEKz6av0-sf50urGHukA9YwObnF4g3fhC_kheCoL31BEasFedOpstAFBUenYM7Rkp6_KC9_epfjufOmjjuVPBlZghxOjAcAOFy6NqNEaOMcan3Jdz7iUa5KoXCs_w06XGLnqbsICXAKoez3aaDqB4BDeNRn-x5ljfTLEO5jknh7bjRDNkVBardG682_0ZZRNe_q6kg6bmjf_Z16Ac0BcxcAiXeYuLQU7FbeP0QqFZP_KnZotyA0G0YURwU4CS0rbLCxfh7L2gv5r8Bmml7w_67JnQgwaxc8fqm1pC3y41H-2jd184juIqN9tfzkwb6xLoGOpMZW9AmYMalmD9Upr7pVsG612b03aoKyhrzAQhEdkYQM7Dx_fCe3XOF7BEJOY23fUnRNGLLv1IquBt9c2Nn5XTnQN49SbovyrJS2qPCce2ymDwBYHl-gijz-BhWw427RTFxi0vDXj9kC3YWHlnJFq9wspY0nd-AcWwfeMZ7ar1W7TCvG9eNcJvIGSfgrmoEWjSDlKXMGAsjrR4lgGCp-jm6epSIAO9IW7A-J4_E1wW2J6vXgTQCZc8tUAWsBGhEMIrKUusupUEN1h58miITCMX9-fDCSJOZDBwxvdeRdSc7Ck9iIs-4I3Gcbd5QpoZkHEIbaXvjOGXPqHEEdcOOTWPFlZSnuOssvf13R5Y1T7W0pgB6TR8SSYMG2Xj1oiTcHG0PO-bf0HPllrtP40b6iqOI2HSazdjfCt2s46qiuFWTIvKpliCjWzW_cGBcny7NlX6zKuPZBk9Ut_PVfquZ2AQ8NNgDjn1zWHVWeMNbOovBqgwVUiHxWxF3cAix5CZIrg9uaOXRgQqbMBxGpkoGqM1wtKgOcxADhMNbjpm1oQDhw0SqXadijORCETKkgvNwNKEcdpwMRvxD_94lbzWe9XZuwS35BYXQwfgLkXuQQ-SR_ZfO4X8gK8a-ITamB-iLe_nBVo64kmw6FvNE--nbweE5JhQAK6WoWMz-7-RTDSesOSqXPN0Ay0yspAfbg4WyLN4N_2K9n33cdZeepZiYGTRH-O1T9_EPTvNNWqGgKIryzUPcJn5a6cO-XRnfmRvKEN2wEjZQyqJsUzweXw9gWOnDEbPUlkR0ddAW_004SucBvHqh1m-p941HnGoMcAn17M0NPxqbIA_Z4uwtzRRQjgZsXDEc-PtvHyRa22pAz_xZHGO3AyBJMAnIGrUoczDbUcDZpnYONBzpB94s2fmDWza73EfGiyNlPf3dIWKIyQgR_oSfsxRSDC08t-jpYCGA788EvH1rUfT7b6676HT86sWIROPo32pqUCJ0r2NuI6XsHI3WZnFNBKdPYRICiMwWF_4ssBsZ3gDdo6QzREkCllpW-5xxU7dGuZUZUNcf1hUZ6DNbubCPVnk8dTmTyoxbD7wbg-eT1dqraUX3Qr-38WU0Dig0UEuhhps0IknYgp9ziGlG7X7ydkYOdVUgOWgqz5wyaq1Ugni6-25NYX8v-ZLjBoT_SGq8F1SMvfQVJvWCDK0SsuHkFsCCKMGD2uWhk8s5iPV2i9pEnW3xDyH1Iwz7Kl1WXPg9XkQvwKzAaPIWYEc411biOHNuaZorSoLy9w9TCehWeo4waGOqwIsDkAi-R6EEPqG6sxqzQBfim5Y-e2KjCKehC4OC7tD-ok0FTQs7EMbMy6zXFwKQgJFvuiiuLM-3Bovs5XTptS020g-hxsGymE8bGZ6NnYO75Y-OoVag9hgRQsPAhhMsWu1VOOIfsdiS9uip7kGYbAaQ9kCgX3NjAfJLesmmZnkbSWGGJSONDthr1sE0kJQzcS0E9SlfkRqeBgTy2a2_Ms7ePguix--5MYkOZoYtMcCQSRdekqZYgrfS2d30BEwUpxoe91zkq1Y6UDWH8x-vXBKZLNsrfDRp-mh3dc2TlIIGGRhk52pm9KarDAU0PMZ2560x2CXhDNl00ArPzYFQHHd9k_OsPSWOYHSprZWtQ7x7dgdR9iU5JYa0MTn_DcahJ8TA40DjPBHaraAfj6xb8kcS4Md34VEXd9htCAXByVvwEgBVvBMBznLAVVWP1KyMZSxDm8razUNlEUCS9Jz8SHZxHhGQJERBqJxIVHAvWT48EIj8eZak_iYqTC8X5JFHVRLzruN-gYgcNJjuGoDtpKnL_B1sd0xXtNZNWs2KQ0SLvcXd7C62x5c42tTaFhrqQEhq75rrYw9gJU95I15fshWRMq1Ld0cTFMI3eCLqXv29ciUnelv4s46w01q-BGhkSKhce1ysVgJuiOtQpVZ9lXG3Itdej8T6EA5w6w8RiOJ6gbUpq7OmXxLlPv8Ry4OAXJnhaR5J4LMAi-ifCd9u8YeiP--UF3Ybh728M0BdXfK12pcC4_9BvY2iYim1xIBunO9gN25G5d8XZIdwn7UdqXU8U1yrjNE2aM2eyfZq-7KurD2sOxpEqoNr4L-aE-2A_Tyin-eNgQukK5lqBe2w70yZzBOPw6C6_30uXDXUmuTZtzoJ3f0PVBYf8qBVAVVBcqs2firnfS4hjmSrO57qT0VZpGRjWMmQR5CkXfRtF2MOBIaRn3sOxG2qY80Xz8nDeOmw-wKe6dfKphC6kOWGetaUegCSXwMoElsdYYMNeje7BNT2o7XAG34o6n6wTVPjvtOtXDBrOQbJrg-0J8RZydXYcbT-D-tF5JAzBlJKI_jQG6sd2dysxTa8F0CK2MqgyqVG-rsPUUu1BTk1XNYrkZ2eRS0MitZCeD8LRBcgJiop3-mbT8oM9H59ld4LnTIQHTJjoX3Nb1ASduB-CFs57fy9wrgn8sDjGHhTLEkKcYUxCTNlkQ0Svb0nzoprmZHUSgasiRWuYGEdku8gVCni8KRSFygJAEeN_zodgVtsosXI2yI91_yf2hNP68WA4VND6Nyzw2JLURkBrAhKkRjtsI2BwA7qb9Tg-u22FeC9UeZL0Yd-SuybnFtTGXIPrSalFL-IFrfu-o_tGHs9rsz6TIzLCUohFWn511cG70bpMnpPsA-dqpfAOAbw-ZjCDXU_ukNbfxbwATnSTL3Jq2cWrVHM2BOMCp_jj85BIqjc1xc96SHESAvIXzkGCUqncmj6jh2ymjH6D92cMbqwWayMEhexaVcHLYnC_QMgdlIRVFDaL95EcVLRS-_Vz5yo_IF76XKKYzXPABNKGJxVYrkajRaFrLsjp61_feVxaVtvKIRmdtz3lmAg1PuFkh3NQdAxISwaozbVt2Hhfo_eb6YgrWT0rYJ3uNsu8WdmYo6c8BBwbvYntExrWQ4-y7m4d6PJogJ7fK4V3BExpeIYVGr2Y2BmHRYQYpfBqw0UIUS9axm75-GhXEYLULOh_sz7Lw22y2hi17RZ5rniTjwnDTJJnPK2IBvum420xa-STb0TUpaiZrYWoWgV7KUNDxbVDp7nREfCZJImsP4DH0rvSI9Di1ZrNiRKVUtDl8lU3bKp9ufKXo02Hu_tSJgMdahh2lLs2PfztzwKj2_dsaLq6-vQmmhXEgy-Wn2Pbuq_Otw0Lt1UlntrfxPqqllXn4VKBijs6ug1VuswF_oHxoAbL8uqh3VOHhmDr9Mh5UJsGUiMCbOQLr7NIMiz2z155SSQdneEr2pSnAgdiNnuw0lSltz6nzmcACOYTKOJe5acne4kyMjOF_rwGp7XJ20KCsXTylL2gUkn-krxh418MAlTdUhMtaRQ3OPW5Uk-h9IJSwhVZJxX1v1XiBmPzsvrn0Y20FG1mMcxzhf4aMhFgTmGmuEj61IrPU28oIsaz1TuGfZZOQOcwst-TKSunsyI00BZhsji7Q4RG7CnQ3uXERCOW3d8T-jC9nJP4IN2qbHgk2hk3zzGwoWZm9rxx_YQv6yUeGe81tsrU9CsG_QXti2NnvDcjfF_964bWMsl-G0AGcjHlJ_CwsqZsHlWqntOZ9DZ6ny9eHM5brZCcZ9jDXSSmaFESaOCbEpalhIukihReC8MJ5IWISkFiFlRsUyG3cDyjvLw1xCMcaPueqZ2KL9c4U-nTBWzQkSpm2888FKbV18CNIUtH7m7Vuj2zJHeSmEnPzq5bdE72QoPNcAinMfHCDeMxUsP04_CbBgCpDescP6zFfBvVF2aSxFIgdxCHVcrY4015RLajoCkrHL1c97MG9Zha9J7GqpG-21-hA6jjxHrQZWYT5TZ4XEcfp_Str7y0D4xXBQO4cLClmYb4niiK2_wnuTwPtIM8hyM5Wygx4UuobHUdfR6btnMGnTaWdMBDaFa-VwMh_hC8k-7udfcWMPqyK1ax9ZuQcLedJXRZu9W93B9QW2bZ9WvPwVUgdfzCPmQuIm8KolqdQBOVt-VgYryhYO-aIRHLNhJgkFwOpsQjuvsaitJfMy2BgpZ5fGBWsDX33x_akaPlIA9-EPQUwpjN2hw4UYPAUEJStGKkF2G6wCeaOEVUjT1Ttwh5wiXiERVj-bicf1EzG-R5zSB29SRSQABz78INhVRE4onJW69_9xETea2Qas08Y7NtRo_1RU3j_CCXp_fwI4Bj7mv_u8ycshVPwt8jPlf6f12SLhUlTegZMSUr97t5waPaYqC8gGN6nkDnBtAK2DiU40Qwtezt3IHDqbMnRsG3sqrMLGtEgmTA3AvIN2TYgId9OfdNvP_JvngLjt8EPVlOZQPsH62Usy3soS9CUyv46OtOZLo3DX-l8GfcnW0aq1nNccUN1xC0OhzkGo1FqntMRS0RzL3O3nbIP_WdqhEhcuNshg-YHyQLhVKq22nCs4sHCtRKDdiabxS99cmjNDe5bO_YEUxYKN7dXFB5mx-Haj7-lhGy54YNbCGEtLCBpS4457boEOELGEIO03E2laEWY-hHKjMhuySlnOshlesUrvPJgcMv_ntctcLnVJ2fZtN0RWmKFN1iEqAHHPqMjWZMKG1M_1l_IZELndpA9SEReW1-HnSWAYhnabOrF6LcsTTX0wIyZDMdtXLe7JxBPn8GMspqTmB2EvJEaw7GkzgSiX2jpYNdB5WNkK7N7sxdbEpNE7W0eDf_d0YqZ6jmoDhMEbxPdq3hdSyFvNbbtBLmo5LjveUDiTiLYovST9_Dl0jUEWTAjoEVJM5sTRgQz9sH9pGREYzmPJgGrjCiwyU6FgAxX6cRBIMFo09Ut02deGfaLImQQLAqbJvq3_tZAGt-7b0g9fzoJxZrbOw2EPo_VtXUZv-kAvB9e8PnlwG2qDtPseCHG18M3-rM0MFi1SQ66dzvHIOUU7yTOywFKGnFB_TvpfLWxFHLFxmDj2pB909fRJyKH1EqFq5OqCvEJVjbN9bfMsSR6p4UA1Lh4tHzf1fKvZcw-vYJRbtB0UfNM5LQnHbrgKdGllD2hT3YpwJeQ2tItsLxwIS3eJTCTTZ-ZjfaSDzM68NWPEtJFlIVrZO-0PDJdwrnUkyJAf5ibZWRn6U7E3c29DSRM5v7Shu_W0vGo3Mp1LF4Dar3JZpkG1yHpznujoK4v3WTVD0i0DGq-n_tEdSC1__XS-5pwAgwH9yJ5PEBtIyJ93MIE3ETk0jHee0An8Vk1z_6W7KFHXPRbbxVstjOtdMm0ptIjkkphgcB7XDzZcojJmBfZr_OtLRiTV3vgc2sZSpkB8MwfW1nnzMwHCdh72CSEaHPY0DzGftXyZaUw5n8T9K3ofcBP6Z8adaL2DR6JzebiSQK8C3jVmdY5Z3jQu9qu44ZqGddz92Ly0f5jup92SQCk5fNcItYhCpAaTdQsUv8P1zLjROOE7CNURdt6_-KsoxHME0OOEe34_PEKceHXfoZGP06pSwUAzKo6ifPAUljvr4yGn4j243uvDqrfbpOaJrHsImphOuOf2-x37srqHX6NyU6r0rzfPiR10PqheNoGxE-M_ifxG1uejLvo7fqmMk3bwFMp3_j40KENK9eAwaN5bCVEg6XlHbHHqrQ4s1DsCSz-U1pJH5gdCMP4NGB2qn9VJ7pkLLZzZMP2mx4H_cgVP3H2Pkk7RGKp922BBiyplFtyCicY_2QC_VLvfY2yAeKTtQaA2NgZ58F1bfmrMbVOrxpGnIuhNneHL1j5ObWgcPV-gORYltCSzESp9FrhBcGm4CPemNKnie4GkzLRssDUq94bASxSe4peZti1k2_CFLOL6CutOBngtbKVnI_8otTyWv2O3LUVriqIFtSXzQhqUcYvUyqNvXIlkrh-U8A7-8BYQjSblfUAMZQklYVv23zbrhwKqm7aaKhYoGjRQPgUBCqexz4SvGrJhdXZhD-RI-TjeArWFS-y8SOfGE1J-vSmqE4x7FzcWo7aQ_W6OU5cZXeJnrf4sfhpt7CKz8_x9jjoYjGJwFdaPXWFokcFHhKwVqmngGjeKAD1eyp3rKHXc35oGCK7slcpWM1ildrInidWkl2hT9JXr4vliMz8CaWViQnaS0IIvLCXw_ObMcnN0XaPHxaTA-FW8x9GrPHBdjafYv4NQf8mgROouDt2GWlE_tHnznqYN2boQO95kPcSeJmonqtsZAX6eKuGN79OR4hlZQRCC4hcHIOz-gT_Cif3Fv9-eVvv_m_xg9K2gVPSpxdU34Vsj7jC68yU3WmTXtROeVQdAmGywAg8QWKUz9w4HOd__b40gnlT4ruIHm-0L5iidRG7bXCm_TSVb0QiG9Maf6B1PwWy1KtqGXO4bnwY5rK7i8Bs_U3Z39zmSZVf1z2ufgum7l9DxuNbhgGeUoyXuilB_bwlk7hsuLgWQ4a0rp1LIAf9bhm2AhhPYz74ynjl9f9bCN0ckh_PFUIJ7d-riQfiwKmev6gblYOKhIyVxDk9wvGLl-KWuV2hHMm3yOGJ5Kg7Ck6UeVkUC9pGOfZqhlyiL1M24phyKxnWNhjZCuFOh8VGmqZ_fegXW07gsv57GUndlPQpZKtKYoJLHGRxRKFfjFIeethReRP3dg5aR3AsoLXY3zo_kiybOcMiEgVDtDA6dLqQDSI1FIcjpqDHdybUJjr-KCvCAKgxK4b6_XMskkqEqm82ydplNFbliJJduvJBZ0VJDvA6uJO00mqM-0Y_i4xbggS755qijXlr_ThdrehveXicFiqWAjReY5IOoYElgg4Stlsk9WG7ff7aD5qt_yDP1wVT2BofA3U6I2kwx4DSIdMCu1yN2mNScvUoBDFWbnpj65qRUf3ssSfbeB2Yg8xpatwNEbshcBkaNHA16DbFhx4uRpWcyOmwHbRrztR_Xh4DeoLSvVJ_KQdde55pETQtLEpcVefynM51BEuT8ID92zpZ7aiROlZBVPE9suWckYMg3tyZGLEhC0oFQm0Asa_44ygyn7dLoAy3sViERjodth9BNI9lZymGrvLYZEIEgOEJh47Y631BdAHpw-ueWELaqgEPTa2OMRRtAsj3mAHXmO0YKcL-nq-oX8s-CE3TPkR4Dk5bdZ5gNU-M47Mbj1NsmPP0gbRzRztktSnAGDXBgvX-MlTu-JA5-my-FFF4QhL_PUIODt0GsYdCq56G4OlCQ5ZqduGakgLAGiWMZx_4WD9X30reB7yy_i0xeVSUsTgPCDZCb-vzYHehB41B6o6FhNET5gxOLidieygCirTxIVee_AgSLerLpjdClSViFkYu1z_60AIHxxg6At2t9OT8XNwnnxAKNMZlZQ_IEKzfqtxAbVxPFAbcrKI_JK3etGeIYf_IEmcGcL2L4g3-qxWVStNKjf10lFFvZLOWkcj_smh7PBz6EZnvzVT-PyiBW6nFiNAuZLrCWdeVtgEIvU0WUQNbRnc1h__EoR8D1pVAYoxUnG_h0JczAGEKdD0XRZP11kJ0Yxz3KQwGQg-7yG3_22feUq7iP7TfX-LqRYUTkqlEajlSHHzYPbHVbdrUfKPx77lHKx-5lfte-Q0gZ0yRxkLSIUXh7b-TnuJ446CYvTmWTnPkK1WlYbLsr5UFZfiimP2oJpGEgewE8a_2Uob74qR5TPAy5IOf8wBprJPFKaOqOIsNlCu1H33WSgp73PzeMTyV-abbpcf0z-zC1dGj_h8ii182ovUXSTZk6ZcZ7SEBwPc0qWt8Qq_YBJb3BMzzrmzbZkU4Dm1vio5knsfDHXnOgkFcLQpMiZKuUFij3MWVHnSNsY_Qjwx5MVQGNoHggRLetGW-tRVTItY3LLaXciaRyXWVlF19Own-Yke0TfrPRgCeoZhN4u5wNRKP5w55zgS8saBqLt8oy2prbgqUJPPVKN8p5pVLpelNtG4mPdnaADYA06YLWZa5KiU0iUe9e079w6NMwaIPvZr6HdQ0Id8S5UoxiMU42Qd-xa70IOyAPSvvUq-AqKVtoRdcQnN6L-V8Pwptn7_Z-fgCpN6ikccxAICDrY8gPRmxW-fsdvS0Y1avojh-wEiDftBo5Vy1JR0N8YXAGHoaEBCTcjjXBxDoG0ounrLFNfTlZOa6epd-gmfXJy7jkRQ1ahKVBUN3SUO4m1dwM3R9S3275AxMFjyEPvpGodEIlYszhtaozmJuKLTFfeNjza24ZoatHKkoOtWWMZDdlXLlEDDTPev7ifZxbgImf_4aprpSlUQTJiNyhgsynxAAHbacGh09S_bFpjlPuwKh8DVir-BainN1brpcAFSnwzKJjBdT56FqkJYBPQRRqZiLlTduPB0qIW_Hxfvuq3pyNLrpoj_79y-YlGpAboKj6Tu20C5azX-9aFDbu7Q6TkNu3eygcpib064CnKueoqvgFtpimspOZ0A2b4JhJXyPE_ctmW8FUz7DyJir547U8JWVYHayOoOOtw4lB_IMB4uvnbsf5bGNjJxAhzXFxKC3xz0R3uYieiE913GhPHpX-jGxuYh04GzBaWh6-bKC5321Y220yES7WxzEmGtnYz9In6SnHUMfAxRMy705ikI5zV-LlktWFSbalPv4p350ruSNdZncZzC-SP7V4EvBzykYEytOn7JBCZaMuPq-tMreNha1kyCK3HZWAgE0ABszNiM1i9aHxQRdSMXzsydYQuwmSTJ2qfZo1Y_6Z0S3NZz82UgAty10Ic2sQa7P2CcZP2KcYZxiMP-xKpa1jZtMjl5onTa2sVerKy_jOAyixryUUeb4ikfb7aHyjGcB1gBCnM3SscGnSTKNHy-2KyGaFcYBfgCqU6-0Sh4k7cVi00KKztwoon2iyf6490HxOYm6jzLRNeoXyY2rnkcqzQfSBMWjb-TG8-Nt8odsh4zvfyJLBrlSJhwP8-feGPQqIDUE1fw5Jud1FePS8dgcVNCF-I59NQ8MzhdZJZpqn3GLYsrkjFYreKv-bVz4aCFhxfVLWY2ttqP6MfAnU569M7GgxpEVX6oOlexZVv868oaWZw0uS9wbotH2pujFIaHi6sU308RhLv6gNlJh9TumWF6OOFJPOqwvqw7VI1Z-U8VGt7f-BlSYunV4JlDIWUMARha1zsmZG5ZCAvRrx0EUgLjpP8RzIFr06nYizTbid1Xa2iUEpDFldpezbr7DQaproSRN9-JCjU4sV-B-Qui5XX854oNMtlfdavJPnKZ98Xl6Z_m8gNHzNwoxXWQUIOBd1cUqUyPiVsYrvC31qViRJG7pVHORXdoDSykb8e6C30JhdxWqdcLdPRWC20iFZQb8zd20_Ntjc4BO0KlzgcqI_QfdG6ElFV1zffTL7ucNrl-Ug5LsiYDvV0dwJTmWxe5jluoeY1ciyGKzXlk9erd5kjIP4h66Vu2758mZYYjb-wWeB1fhQ4mDPZ37teh-7Nm4oSKEP1b2uvMlCsXZgfVz0pIWMkQi5a9_oh5GyzCAqxpwYAkJeERlNsFxMByMiDYvrKTaZWzwNXPuzEDwFcXYq2pP0QCx7W9C1GaMjJZlK0Utq1JF36LQOOjBEu_LZU87nSRbXSgcmdp9n176mOLy_l3RImsX8CTDZKLeQzzqo63wXbHRvAiBWA_oC_c9_GehtWherkMuYWpktR7hrhB4NQEzC1ly9OLrAjSkwBgAGtXNxv6AEg-a0DdWGZilregJPlutxABOW-CxcVkcnpsl3Yn7hhRNQkTWiHRF2JL_CpFr17ZlX06cQjMTBN4FrMP1ALeUJkb62lK2UREeftvW9s9DrLDXq7CrhLvs0f05N9pQawlCIbe8QB9nggyukowCZCeJwrAlDSyouMO1f3p4RvuMwyt8nODk3xh0Xvp7TUEpPHW6zePF6-hCL0jAQFvFDreu3OA4P8KjpCz9tJfGyJrfcsw08hB7hy7PsoBBaeGZmz0kn_zFizWi5nmtpBdAT4zsR0pm0dVRd8H_ip-3QIhtoQsFmgyqGFF2LOcrfEugB-Hsgyf_Da1c6PPmtfqbubHScx7YhYTrgZyPLAapV-ZQixSuCy1UF0z_c6xOosLVytLPyOj0k1l7EKui4e7nCTk3LC0vkWX5LWzM7Zt7haJiL-i2P86H_SxwY_TImx3tQgjWgs2CgoBLBZ7XmeqGJ-PByl7dmwp5IpsXoFJ13uhVzLmobbtFxZtY2PHlBTKU7lmynQgf4ajbEW0e2Ws6Wa0JwaY7HELg-G9Hu9tlXRP7l8VQi8OREQyS8t88Kd8VO9n9ZeE3FUU34n6dhyvBOVLEoN2pL_b5obgX9Gh2cOQbY5UzjCaioCyI_AFYP4tk2wRi3i4tVYI7bjc91C2CyzkjE083UFIzFyVrl9NE7hK2kmunUmrMPuiQF3ceeFrde7b1dDngGYBy-2Zp7Elq3XP-q28-ZtGgIBA6fFMqGxaZPVJxT5c0CNfDPicmsiECutAwW0gll4zgKL-LJ-Agk_AXC16vbF4d1ZKsCxrl4vlckPn8wfG0pv8RxMDewcvGd6o4LOrFfZrcyeWTEFpwdxQnCc76tyHnAxANUs4HFGBcBhSfvVIazlD05JsSjNNtJFAlfEqOTuRUOXN1GoqKOegpf783c0jORekGazw3ABA8rZZq1KL3Umkaqlmu-Fx24ixjpg8ZioKairDSvuaHhCs7LSjgNm1NV8hKd-vvmV2MtlVKj-tR8xBUz-MhPXNpG7FbbyjZyPURearhNJidamwF7gZu1XR4P1Kv7xQSUC5TF4KtrXPbMa22IyspMCmAtBZhg6ucrLpgdFg0j1-yTA4fX6_vLM5IdB4ALqOEb-CSCtzQE8parHtI3WnS1qhlmxiEGPzdbErnIPVu7GwzjfDZQfB5ZfW4YC9Ss_zNjXtpD7yfQaR72xEY6o8RRxuo2hskdhg9TxBNt6koGleH_73LH5FfFs_kmU3luUg8cxwQOUeL2jlew-4e7dCO8C_QIQgTTj2McjDDaDeU_jqbkHRiMqOG568_0XcdDlq-WR0hJXCwhD2JBznh5Jv9IklHk5YkAXqGG42OP-YcHIe1_BCToRVcPIMaL9JYZLVkaCsbPrg93vSlntLtF4jDBsR-3oNvJ3t7EfLVw_L4J48pFd7R4CZOUl48UX6oYRPvyJDKwsaMrn4DspCm0PtkwTQl-rk5cBXn5HqdXnWH0JGqBch1z88WsyChEF1EsbdPm8CSdWemDDEwko-_jQEVLyUbBb1TRRkfActPMteBGsz76m5_WFpPag3Byua1ZofbkkWMZFnPsgtJpJQlp8QAefw8MlnWFC_hLDt2pEvQ9t_dqR-eiMIcOVZtTN3YQ499jiBepgxy5UhHpLcR_80TsTtJovSX8d8g0-DtcolOU0klsenhL5gIN1ddVk4v7ugSSuaVLmKuaFpJEYIrwEgig-vlOrvTTHpA17NNRlPoD9KH-mPM9OxFjrYvTCWY835_wQnbG-pjrdwMgje1t7zlHQym0Upa9gijTX2UOhP-LdOIL4VRF6y1qg9tUP2KTtP0NifaPkocCMhlI44yIktfWrKUgJbDSr3awrh4QPHvOHSmVx-sC4Q0mXeAP0url7IXh7HOR9j1hflYkNhDgHyqR2lwrw0A4j4Ru8cdl44-mm7xpXncYF_0xe5Eo5Z0rT6UhMdfb855dmY6-zzzSpeCx-F32Fm12xbNd5m_6kYz4tWOQRY9oRseKEDFxN6jmewnJ4XiJuunmDLZpB11xPIr1a9Nah9gwZtLgH74Fby19fpbV47AmIjegSLDzG2s2DQcqX6lLIvd05hbg1ndWXQjnF2K06ZI_zBMBH9eSDk1FYWb3t3s5po1o52rCrGNvWui5ys4kP8g-ZFlUe0rUc-cw0I44vpxTtTTHdb8lTt-XVTDxelhOXiU6ZPFXD_Vz9hPkkT1U8wzAhSpINm3rHiqZVVi79MXxmBrBkjUli1vGo_6slNfJf9S8UME5yx6BXpAiZsFB21RADfZ_eKKRZ1l0e5RJxSzPYkaAn-oApzBnL55oJq7ukg52QFiPnnxmwDc1S5f338CBPwEo_SZUMdvIV_nDeTf0eNRzMqjXN3ATzSKyOKefDED-1HerF4aokzSFRXQr9ojQdmQO6s_SHh3CTcxvTWhDzl6I-4Ne7NI_tBTkcsA-eVc7CpD0tuYQF-xTiMfoRCda1aUU7aG54z0meYRhLueHkKxdZU3GjqoDm_n0QDrIbVMagu5NKupvw0yF-wtYZO2h9jm1uP8AKqEjO7kDxRA2Yi6UT-J-tt-z6mlvV_vSNxLGlAqGUmADiPXv3Kodma4Oabaz90EumVcNo9FIStICmVPK7dnMULlmJWzYZZpMEwdiMzHcWzMypU61YJUaSSFjFKBzr5L-xbBNpDH4v0dTXnacbnnh6CVq_OLB0OI0_AW4n8RFcoe36BgZInKigZ4n6KLxbD9spe_Lek7HlDk1_wNwGFt4v82ATxMQmqaKLssokpERSx-tgNQ30MjM5cQoocgar2OWNVanHDZv82jkbgoleEhWyn-14L8lzhbyYqtNcuVoyMEtyoJ3oY_vazfwVvNKNkbNjUdAvA2mPq-pG4gtbLuCDuL-u-CwZvJJOy77_d2ikKu4FXN9JJl6uqwVVUSJN2N-ymqTfSKg43jox1_Gn7NiSaem9r4-4dIpWJkOq0vsBpLhdSLOnGkiby5qH9PwOqjCh02OKnh4JrfcdY9InN_nyeoOxAZ-PtvgDMoBStWXdU4X9i5OwhDjdMmWnB_l_LRM0OjWv4OBHza2QDfeuGg8Bbwi1Iw4iEevKjYu5szoSmW2tFmb7v1dOV9XyZMd5J7Zm-EUQwla8KXIJNvzwK0qg0AKvGJDzXNr5aPoJnnwAQeUphsI4kTXjflaGVVUaspUIVNKY_N_aPd6UyOcTJo1AK5pkXdgau1MaaBZa8d_VtWIt0FilRxP_jEerHX_9PMwOISll63vMcC6te-Baa0-GSHd_xzbNYZ-w7J6H6MLy12QDjKS5k-stE5HHV2GOpe9BD67iSjawyX9fJMZdjOG-nt7tTXjW0L-96Qe2z4S2Mc8m7pzpwU56Xq1Tk1sE-wGayEyJkIUbN8E7LBMhV0VKqAXrsQSbsefgt-dqXV-IcCPiYMQM6Rzguu3FiBDUafKMDylDfbGV2sxjaLOX_0PhvYWWaBYJtHCe2WwAY9js2nqbc4qrDCEGGqb7-ZG9qAyJ5Bx9hdwVTm02PkQrfZ8qVn3KONnvxM6iF2iHRdbOe2h4QW6IBXZRI1C77hx8MO7dXUGdi0FGRejfte_HSnXmCNzj7MCzqfSw2w7-CqhFOL56YO1kLvVje_AAr62LxPmQeQudF9xQ1F11_Is_L-Hjir1MigEmOS7Yn8-Eu8d2AHOfpo2r9OdHIPdGUT9mkPmInF8689jiN9SsDnBv1XtnbB6VNBquBQrdX_mkBCMFfq6-cq_rZMqtTd9IGHZl0Cc4K5FlEe2His6SwcIS0NC5iCJca7IS-p7Y1iz8twwiX1F1ojZF0oxXAv2Y5aKIjJnIIQi7hKmYjpkf4SnaZ9FdGwv0ml8o_3UAb5l0q-KgX5cyurorXA0__IGPt4mkcQ4sRM9CrdHy4a2ehrakClEXKRb4-yLcik37G0-rDtg6vCMlgxgyvpFpbO56ZLHQYwlZfvfzLzSJ5IfqnisJxKxLuuiqfDv7hiRnoFR5oWm5Fg7p6KhwMCioss98-6qJlGwraHAvrDaWspkYh_CxCgW2nFQZ6rrx4zxLB9nj_UZRBr3T13B0y0BtZNWxJjiVgbY8QJRoFWBrurs2W13VGtDJ5VwNwegPz8E0AF53Fv7phfSVJNpr4UXCx-rwAWIdie13kF-xh-E1lxh5iNh0EpzxQWgexh2uyflsWc64X2nxELIa3b6Bs8WFVSyqXA1OGQLrFobRnAYdgNpZmBNqYpck07p7A80YC7k_K6JaAn34A2mVJgWwORtx8ZMpcf1leyXNlSYVScsZy60YPdBRVuQS-SnJbM0Kbh_AHFpjodtWmlt0QNcQsf4GX-FObHIIiCdkIAjzSzaGvEE2jZnotaZ0B9cJgHX8utA9A7RbdML1CTTikvswY_tgxgzZKu79S9OL6rlNtg8WDcqRLP0CvID7Q40G261qIaTJWB-4D8yAWVEteqBGxFz26J9CcvY8B4yNruKKxkfkRhakMlTzKQ68-92CJxGUSuaz1IbeiOl4pkzM4vQmi9IWsUiSRTtPPdt92isQeiGa3YPaZjd6v77O57nyR7FFnLO9aVik1O5CUNdEnXH9let0p88JDKrF0gPFj4kT6CTzVjrdEqygKE169loZ9D3vmKRvRdqFQI3piOLdWnWfJA2tgzub7oyOFGLv3tIckJJUKi5ttkTDtJNPai7fdealnKXK07QW82f62VRnplCTwTYviwuw8k9AlT8wydUipSUyNhpij88Dpv_O19np2nXZy3vnb93srSc_6aGqE0UbMRO1llbOMEZaDDUERBrkLqm6UpfMAJU4KAHfEAr4GlWVVXPJEP1hCqvHPJyhoqGr4n6XcSGt7331WKCmmhH9HSvFsv56hv3I4o70NnVj0Xev1VpOsrynMSRmjqmM-y5xlPRLx-ZZX5N3OyMeVUUZ3-r3UkJcujRxtzH5L4mhBHWQVua8RkaeBSYQdAueveBIxAte04pmAyZ-VGg7M_q2-CPYunLQzXPNQkWRCelfm4QidefX05eKEHHkn4Cugc5R4SUdGSftjZf7CK57djFnV7YlFqF6Ns0LgeBSw91CxF7O1zHDHDE6XdiQJNQ3-DsxSPt_poS2miNOlXnx6I1hLOUflbehjR8lRYvQX3a2z4q0-K2a_t4JW6O7LRGObQRBJ9mXiskJxIodfwg-_oyytmDBnqCO8rDY2aUGZRhb83_ScBLj2Bfh8Kaqo4uO67QB2mf4740LYk-V_ANulzyZcWPDssyEM5_2X4ckgbtRQiEkAMd6og8Jye83bPh8RO3_eaC5sGLaQ0K4aKDHYKLZSQVk6SGrTr14U9DEE3OMeymkNrRT8XPYxocK15AHpMn6i3szySEMn2ArAQem36oLe6XJJoUXe0_rFQJDia9p6q-XatwVWSpaT8NXdThEVNWEkGLPc2Hf9RXqZowRlcFgxmyTtvjZHozkSqd-8cqncgp_Ue8K_2XEU_l7O-wtlJYw-4QVBzQyUbNJnXfgHpeBJx-hTkXgl3bhzVHbMfb_0Lq4GH_DbvQTHVe32Y05EPeIzqh6MLBERI_l7fkdfr4FRsIShLzM2ERZUoR6l0FwiCqQHyWhaKMDlsa0k9oiL-tmVgKYtkx-eY0anaSUXTGlAfowr9ZX55vccfPPYdhUd8gI9f9_gSX_BuARqeoXQfNSjdT7XBVvJ27fAvreuAc_d3hcP5Up8lzksgBQBmkmU33XdkCjl8NZGU0OmPLTS-B_SN794OiAxeZlj653W8jfXGTJg98LaSYymItGsa3o9iExCw5b8EJaYAR3yJFkqShte4y8Sh6rcNi0-zre4Ff0Z0LE0KZWSa0JPnEOZKz35IA0n3voWo_dnE79zHkkK6RG5NVMAetPQ2gUa4a9Vxpr7zWslBB19JL2qb53SEw0f9y4_40fFaHDpUxcNgj_hqXoIM3A0FgVzBFlIz10cizIUKDSGNysrylcTkEqBZp6jhVhcdsMMuf1EDWZm8CHQ6y8Tpy7ntHVhEQh4pXicbrhPecg0Bl3sreogORdq-ANfYLFYxldz3OplKdsmonla2-lDx-z_Ud4I_UOVc5PdPm0yeIQzetOSMKjUcLExJTx7i3m6VYfVa8M-UaalZcLJQXYX-lp3EVoQm-h2DNKdU_i_3_TAuLcPoQTiRLYze1t1Qx773NPp2kP3UGJbAT-pDYzusWyhHSlqBVgnZcpu5kmCwQc5wnip0EUtSgxadedMQyOl8q_MFD-pLSJd4Y0J9qgAVDyGPX-vOKiWF6SIrp57GQAH1JYK6fxu5GuNr_ixln6_XNF9hDtgWFPrf3pWG0P4S1lEA7NGEo7xSIWYTlbVwmAkp04E3L4l67QGAPm9AHwH2v1zodPFSwaMxITgfS3c8ncwPdewgwNEmDAXr6fAVVeMgxnIuJ_dI1mVYDHt9UAUCK9uKgIsqALCmWg6hMakpWpUNDPrDIh_b-1bMOW-PfmWaxVYZVntaneOtBUOAkv9ZjcopNv6JYXdS45jEkVRu-hJZ5kfoO_KeV3ukkbc8JDc5zEqyzcrJRj6-rglNuKnlUmHMGlBJzgUvByCR_9t1RyqdADJmUIsHe3fGOGKJtPANw3V39y-QWChLCIWv-cMvjDY9bYrBKrR-3UWxLg_r0h2yIYC-xb-VDczzKkBOjmHhgdi1zaPgs27HYn-K4IQtQ8WQfkrGBL3TnzoJcX40-IrlhNYILTzRugCMgytXHLmMzVTN7HXkTdAdkFepE3jQtH2duHlONghTf0EDk5xtr-DWrsiKRTTe2IXiKPX_9mzkuNO2i2CVYb3GaDXHAPOI40NlRc1N-FpjBnIk3iecyhMEZhEsdD8Nh7XUfxwNQCFjDWIzO-LDFMgOfaGCwCrmBNg681pA91Z2Ac375ZWpIW3l8es_b0iATILVFGCbnvfZycApUEkH7bMDsJqH1AkxS0QNnHldjwGw48WJIcCjtszjjCFfWx7PxBL1P0G3V3p9R-6YDFzenaOJGhnoLNZlBMogHV_qpTJR51SiwDDoDgGU8KBNLOqBlhtBP6IYd3eR_uuAhZm9ZKwPb-13W6S9YN1o6m7zdxcxHGbhVEFR8o29flY6TD2m4aZ-fKfYi8cK_JTt1VmWDqCFFZW50FOoCKVKjw_o-HT0NYgJrtV1yRyBTKvFIOsywUu20E0Vup8-egGkDVDtMHXiUSqyYqO-yjQuWJM0PiafrBC4Fp7ZQipcJl0Cy9G6ki5DQz8mWCaigXF6hpoI6KxVicCg13-DqI2yuse-LoC4pK8jQ79Lr41zdR_o-IZJQinSCb-hJp7suiWvspXCBkYi3PBMHUJlbN3_qjJXRcoL4c3tqDGFGpceaZt2jH9IFUlrRUo_Rxq5VeGFHiwJgxZXQJ02TBayLBNta9olKZ8EnUrP9Zzf9Z-3aDvA-qUMznS1Fsc8Tsfj4CDj0JLE99bJ6KfpQR0p6hgUE010ej2PkCfTJLw1PC7n0Yz3D5AcQdmSZwuVrCs9lEXMXvDrxkruAPy627O1HA5NdOtGN1gq-obt__1ltXIrKwGvOvsKxUXARLZ8a7BJbq03edWGxZtPFeTzxFniIQtZh-KPkLphbrYIuB7YtAidVkDQ7MpKdwbzcqWivvihmP1KkSnXQI_FgzP40QMo0iOfqSWHdwKLdt90Gga06EWLKlOxMpbf8D55tKI_T7NPrfrropAPmZqWmmDKsWKl7yZCbBShavrcKcKrW6CxGu_hwuHjrymVWRRF1BKfaI71GJAaqkXaPndU1QX_PBPpdaCD58JqHeWrRw5TL8yaMH0wdKuGak4gBSQ7Yf0-8bKdZ2wu4IYTZl4ElZuW7nGBn9mzE4hV6KIBVNh7mEAIiRbtLoxFDvS_GOgDjQ9IaIGbefSECbxVzeVNCfbFPWKLhAWKtfDh8ujluK5QCr0eHK7kRsGHFDpjo-6o7KUWi8qga5cV4ob2m8Kdz4pb11bPoKqpIiNybceS-ODP5HAYx8ICmkqDR_olx_6HKjV9ytwapBCLnOkirP2xmGOXAxgsfCVx5QW2-k2WfOa2dQIyv1Fy6tGD9Y3c-tHO7AoAQ0eoRBqmk3mkS745sspA6nHjJ61xpWB_AG-bsd1RJbXeEnhwDYa_Pi9HNtu8nvmOt97Pd3Lr4TV9qAPhuvcmjBOoZEXbCjW3dzYyU5zYGx3k9Vkm2SlsnsBY7TeAY-6gqrEC12Ns3s3o9xyJIUHgL8rpYhM8YHH5makMpv69LstAHC-F3jtLepxQfy83Ah5MueV7Ja33GMeaJ7nwe87TjyuKZD6weDUMUPonHZ0gA_f5Tmy1lUdJs7B-ng9jMFldIaSGWTgyfPn13yK9RMKzH2ffQ_20EJPkhyCqYls297Q01qXOJZpc_YkOLzNJOG3jTv4fvvHJXTTjxdCgmhWRSzC8iZJX8m76lgHKg8zPiJyrJ5rNuipTX2ewjnm4Dc0GwpBibuHLNEFNcoxpy0lO0DFQSKpgRkOG0L00UuzKi1qszyGKRW1itK53TE82iKmNklztaC2dFZsx6OOcl2SH9PN5fSvGGunwvoCUvZQiPGifEL80YG22CUS9WjpJMj4QLa6aC01ZyBp6-Sz9b8OEBwWMz-jt4EsuM3rRck6QZ04_fTcQXQw-pYalwWRWvLR71hsdtqqBguQMQ9o0CS6n6_Gj5tfAlo1C7WzaPdyOnBvEeUN4amEM4-lu0tArNWlAB8SCehUL76txCNAxY3AUBv75ngblD3HW8jnjntdpMuC6taBqvIiL_NqXLZGKO_7FHLlZ8BWcx6rxMzsAv556X0CoAaVSLVfNDcSM3yQN1Ik31Gp7I4aKDaLSa_s9Oi7c7GX5SqWHAD0WsEYf0B3TcUILcH6rJlGz5VlVS9BXa37xhA47vUzcfx3eOb0-jCXnVgJgh13vN1gaYFUfl97l6CGb86MtrGkuEpBEVE9Z8hr6h9XKLYc1a9iUPM_yeC9N3W5zGgQt5uPlpiET8lpk7b0sGn-aDnFuTTuoVHjgU4yluZBbKYnqplhgefiUD_NAjT4zCbNVWrN3fZMEU8H8eXZLpYLnZ_ozegqSNjPbWd7pmwINGQsQOV-XoDfQ-cgG4eOex2i3CZB1GsKrVOswau8B8a3S261gOBSwzLphsZ6HZpUgC59tMufUzGYvh-JimThb8VwyHmfQw5kktUS-LXYIm2jSvvIo8kZcs9WdZUzXwDRXfMkHCXV9yFtAwmgBIlS3_5-6JYoR29Clx1i5Idy2Cx6S2JntQzbNHvVUOcjqfjlo27gf9XLMMvx14fq1bIq9Ik5GFuc92MNHbjw7bizWxP6VDKPfKMnQevq4LeC91duICZL8rcZkX52rS8p03faZErJoY0W-o3mTwVg28TPrnyaG1v7NRCJqFuXLnZP3-C_aDhpePIh8MB0dpnv-b30VS6sWI5viWiIENwRUDODKo2LJYV_w2PZa_TnxSsAm9-uZrG3buoBUv2qLmsuFV0YR7zW-OPwOkNKsYn_k51TtynLObDO3K_Up1TRXwPGF2VEOi9beCMev61oNEMx8gLzz25HNiJqSP7bGIlWaxsmpoJ0ij9E2VXab-eklyAG5m9NAOYKaqPeG-P_O6vgwIuLsC0IBUF0126h8ONsGL2a_7YfqZvnJ_umUgjtHF5ums2OG9oIBcV5DX890KdehOZ0huABu18pvI6_FTplz7dP7JBGf5_XmADd18cvhG7K1JaFD1ZVofHz_aGnbUbY2Av-HPV9MtU0WkdaEiPWLwjqZM1SWmB31cViP78_gaH8b_Yk9U6rxk0yEPrlnj04mo0maGWTmAJfWvEoNLZixPbRL8fOwECno0MidEuo_j4t5H1v_c0qZYuSq0YMwjID__s8vquzg7H-H-JW6P0oNRPcTB0VP9TD9VwCIEw44ha2iPonAxOFa4Qdkn3AmCQOnHr8BZF_P6Y-4cAsvU_Mwk19SHSzHc2tAQMFgCzBAHt7GQtnXcWQ33UlAumSv8_XNXlcTYJXttsdoT6pi78P_FZCuTvSSH00PXeUt_o4yXJLsj_VNqJJNpiQyE_CDnytVbmzD37A1mWQBn0eTDa6HDb8usHB5b7dFZB9_W-G0lLbAwaW1RNbYTGAaQfcxhUTiGsSHvj3Nb6UMWcF_HdqJ4KF0d5-BUPqCD4sLDXpyD7U7R_YqI2vBWtrHP6Jp444AzRb-1RAfW1SNpJ8gdW4jMOmP1GShBP5fsbMHZkUaGJnZXl_ySXOPNPnKTFdWw9JxdL_cSVqeZtWkxvgLttiRpOzypO8stYbhwtA1Cw18BHsCTUUJPd28Nj_SHkb5IDH6ltHmFXWtXIOO2ITo9oiGTHFyQDITDt0giLCZ2aJ-OU21_pjpApMO4_gZ0SsCRN8Z5jlk2bPr9-2p7BDYSxDKAVUfM-boU_0Dtykn3-0_wc5Opn8pN4CKjsNgmsvmHomf01qLsgJkA3bErPP_MusJH5O6V0rkXykA7E4dDcofVdZAQPzoJXqp-IHgTW9ORSY2ssLt1Hm0F20BIIu7Scj6AthjSOLeVmFtneXdIdUEfre-v2tXz5Z3bK_98P5J8-erIItuqpRwy3DP1omNtyhEqTLhyS9RpaeraMH4IW1Y3ybyw_d4sSda9mmLIc6AvbcKvzXXi0cZmduroZ0noslzeoNL4YPGGe3qGxhReq6TKImW3zgy17SNjaPvZcG2u8qHfTo38jFFDGtu7i8eoq3uaeUgfmi3mf6690M4P87xo_vFxX91Xt880iAROamkBVgACyilFUOWmTUrSOtSxsdAFeGyRn9R7fRutVA15sTktIr3zxhnIRDvmdq84w8WYrXUvAjV9VMJifeuYZ2igjz5j9N82pWDwRC0q2ZDSN6xfc40YAMnQ0QclUlvzOr0kokC_imDEfxqpgRJdRHtPR1jk1NYzZ7Ov3VvVYkAfbzo7oB0ZUaRi-dKRG1tv7QQooTAaDi3JxxZ9nQM17JmBLrygLzbQOX0rkKGfhADKF9xVOLASuSdN1pF2YX1QItFtGfbw4TIHtuEmMWjbCUAnBoeOwANimFqYnn35jbZgqOyaiXcshn3KbfDfieogL-Q36cGI9__ASf__L1k75Yo6QkjY6UCRXw_1ZDAjCGMdy_c0wkhTSoahXA-xn6acnCPs2LxloYAPrSEIgYHUNz90WRr2kHnIsVrCHp-7EqUxO_xwMS6k8EJGJNKAMVPh5KoEHDn8m0I027XFF2pY8U1a8WitPNO4xg69bmFSdfBfAk5888BxxtIhH6n1ZKcVBDmSP3g1YDcXc-OeWK88GJF9A_J-OlLy3uSppA73Jb05-LXKIREqEcZ8jU6JEHStELQywQk9sBjPisNpt15_VhSNo6092NYYJdC6KTjsErSK9Z6MkYSztmrDA6Ncw8fIUjgD7OnYLBc-_JzkdU42SJ54gY-z4EUftdp2dhPSvKbadrlnYHhNmITbRzZLcW1zT6VFZGJvbZMqU6K7b7m1McyhvhAFetz1t-oxuWDi5g0vSVgTGcahenKSeMOoeQ9hVLJRNq0j-9oVEWfm9QfY-Y6K9B_BzZlI51FwU_oafhWycR4PkcrV9RpifPSzZ3xq_Zz69SrdIbg3ljRn641Y3WU2e9ICox1DWXKipFBnPAS8R2sD1neL3q8P3f_rzEPxwfOkKohWcALuH-Jj63KC-85lP3Al2kKv5bDkI0II-CrMzOll9g5jVS-PUAbJBW3VoePJ4GAv22-Ysm5PA0AmXH9uC7rQ4n_L_ZS4sl-ddbNpHOy58K7F4U2gxYsnEz65k0P7Vjkvsfa6T1qZ5i9XGudanz6EoLD-M6dJcIg0UwYLc9RzC0kjR9T6JC-uVcpMnYqPiGu7FllXoVzBF16pJ-NoFXl6Ib1jP3BjSYlM0ynW-Ci0hT5U66cEvD_Lpa8-AFuIB3d6uLj5kt3Zhnak0NwkRhwo26Hui5iD_nVUwSc3mtuPvbu-LMJo06JRMK8SQB6w-9aXQM6YHMprkIp0v-AHn6J4YYabZe8lEUjGnkwxLWUzmTW3jMEILdov0f68y2fBhdJPcoqvQkSkJVKJkqUvYeaeHUK4ZVlpE4cAYyShIBzFV5dBPBe-l9LAMgV0XlNcESOu5YTxakeg8ttNhuFoRqb7utWArCriiu1LBcw6P3loUcZZRcTGwFgTbJ8OwyI-dQDuQRsi-u70kI9n9l8nABF_Fp-9YClWizkUJ3poFwO7XRpl0nUbsm-xlgCfLRweJS9WStlCwgtqUjoEpdqJ9NgeeTAkbZh6VPBFNHhhncxN0ZL5tT8oe1McSio2lXnHLlA9GaPemY7wrLOzOVsyG2R1TxXU83rrddmU86QhIcDADF7WAmgX1KQwWMc9wTBTgPry2DFWTrTSrA9GJqBiKXy19EnyrkkFfMaskRIXS0UBdQUFXpUCVyPcJusVF2FV9S51pxgGsiXEx81NXCzn86OYJiK0gR_ss2IKg_SJux68BKUJjB7OnKNrTVFxhFpu0NgHUCBX8duUCD1oNb0kZnMlYOTqecz0lVKVLiv_Q6n4M1kHLcPS6F6AL-7dv_UVWfECEVqqLyGlm2d2clnv9v86gNVDBviRn4YQnC3di7soKjIXwF1JH_D0pNSnzKdovD17VIpoGpQ7tmYk8TtD-CSbPbswdV2TIwpiT7i35yq0GI9D37DLx8iwx1zN6gfRROq0Vs3HliqcYbyUypMJp3YV9uLGpJvp-wYUkNtRLiLGBD_A1Tnuq7G5ymrlCNNcA-QJigcXyjE3W5vyT6wnYpg2ghVnsms9AHPJW1DAU-NSlhfU-d2HNT_KIMzmeiSGj0OtNXCzu6dgL3WwmPG-_vqptAlAutGyKSZSJYg3LwaDWjk2Y9yL12zdZth9Y77ex0Xp2Y3-4qceTi_FSBIeQmVm1G9ieUpl8fDa6_I7Q9T6lFNvODs_WFlrwjh2s2rqMkO9GQIrpUTlJI6QHsVtlMFGlZin0zTR__krXpi8c4vFjSt6lyPSGooNG8pRqxWMeZgPugv8qIT8HWiUM71ANzCuSZ05cntyESAD3LYR5lt2im7yGsf5gHXZb0PZijmLXQkorrGTUJ1DxKBjHY4i2tFO5ZJIbBB6OEKkTHHrSnxJ609EBC05e5G2KXvUFy3AOL74oQhaU9TPx9uHm2Jutw1uwGKIyVrmZVdND6kEVA_ItvNJwxmfWoStFjyOpY4k8HHQyC9BvyLmPmt8gH_veF2InrtmdeXS0ngwOLMazQF_QgNt1iKpB9gWbgrNup5ZYfxPOP8ITeYdzCOPkcRmwSCv_4fr7ARmkJ8CMNTPqN9yZFBFN3nhPEleWviiNqEw-_bnImYJAYmQFPzB50F_bIodHlf4vkyXsvFnH8kgH2KB-aFcOWXTHvY-erntkJ6AeIeaoVZbSnRlRwTv-KP-gCpx-wuFFCrPmzWgd8xZ8hjOyWFgfACu5xlDlbopS_2LM1gv3V4PXMjBzo4Wa0ZpU2GP7jkKJQxOwQjIWj5m6gPtVYg01SQUZiWoUEynBVeVMiHDV9RD3uYVPjEclbMSe_v_qb10RR0W-8bIt7dFE1RmQuAdHflyDkEPOsS5mOKPRsGZPB6oUvcKn2lqrZ3pDJ921jqsdPEPrjjOQcVknoJwI9_Dfp2FPjLD2oudE5i6V-gbc8zdmC3jP6Wjm8z08HBvXy9TMAss1g44cFpws8ywYAMDbqIXMiUujfVXTJfP0ZqUOzlwOx1AGgIjXeULhKJrTsKFFmH8hFkUpxndgaazBqWsSvRwGJR5_k0LDstZAQDAkanPVCePJVeQChLdLORvsSKvWhd6f3CagRWGyZ4QeL4c_EZlwrAMt1Zl3iR0WASlbSAGgdrI0bjN21O6B6WlGBAfNW0CpKw8GwQFYZf5WURUxPCkpF9rSRcBx1bdLVIzknvvt5kQZ1JBCHnMbw7-2QQxk-n_QvGNuNB_aabo7G6uD-uZMAuHcHZHk8iz4oiOP2Aqu_LONmSmV_KDdVDYtTQc6hz5F1rchpeKX28DDrOBeSP7obhtlH-IJTv5NBojzfRVXuPGqSSiiQl8EUAcBtG3Yux1JkBR5rgJTyeqtdVh5KDjKCXN6zQvPxNUo2sj7X-itVql9fH9wSsInSUhPwRJ10GQrgSuUjBQtq5F_0nZDRYUl4w_tPyrYBdmSzosUtGqVP1f42WngWGs9MNldspq_BaSxQIAO-YEdAe07tUsFP_Kdn9efiwXLcNBcbSs11EipslqgBTrj00mYYcC0-fJaGwnvG4XFeXLvPXJl7gDGRpIdFdYqnjA7uzBhKC-s1NgrVaQtU3DQ2_-TKLo5qOygGXeZKYWbbXAUWmurD3jo_TLoUfj7nJo6M3JgXqCDZiSO3V-amy87sfdXIuQ-t1q-NwZPjXQYwFl2ygoRgLMVTgKht8jSNMJRFeCtWCRt5iu9eB7OU1A_akrlybuh6CQ3S6-urbzyndidBYVMUjJeb5VHtBRiCtpbaSwWY1eb7rbIok7NX2xbUzSnZuiiedgXlSI9gJZ4xmq3ppqOLFgK_GXiVYIOkbmCaq1UmTL_mGY7F1N7ceSFYJmwp3xz12vixnZsJONPdSP5Wod9m_hDr9KEPtsvURMLsx4WH4bYUywzQhPxbOO7k2nk-pyj2gys3HTMIsZ-ZSH3Sp9yZkEjuHdiONPYOWKaavrrIIzD5PcMauZkfC1qk7PayFv8tpPfT2Gh1SwMteRaoYt1rDw4an0FRfVxVnWw6E94DL_1Z5FgLGXOsM9HqtyuxuJQWdmgK3MgAt_IzHphYpigJsQSmeMQaeSu6Xs5q9BHiJL8-LvOgyKWzwiO83eYnIVlB-DRv_icUqwcwuOZnS0zZf9WjIyFwV98PZHIV4v_w_ce7TF5_-ZEofzp9zpPLqsFrac89MC1zty7k2yKWGNbBzQ9dp1nqdXedmQSE9texHbMRP7B0pmmM3-E7kX6VgRAbGXOkINXScXHKNVc4-ziy8-Z0eON8jjkzpVH6WK7e3jnBgeL0TO6QCpE5CapnLtfbpE9SAaI74AVOkuD6SPzpyx1DuHAM8t_EJOpVy3uL5q-wdQAG19CFGnprbzRN52FGbHAPthh-PeUS4W8AqXtsHdRNqxzFsoffv4M6SxeDmONTsHVf6rawYRPc_xeOQXEtQVdmKT4C81MHLbiDNGRWVCj_ZsTztovukVn7Lx_z-57LlBp5dat0HhSmJgiAFG46rY9jsmlNYse3zndOgXKnYUTlSAsv_Mw_-iGwCjPsa6YTX9df2JKjEM9o0aDnlTIUm1oJRZeE1Tufnn9sSGN-TmhAFNVzYm3ZFEE42q5uaaKGWwVG2fOHZAymcLvOnJ4RLQwENT5pJcrqjuYynKiCZFv0hKRZFyvmyokpxgACaoVe3A25K0IIAfLbGz0RAKk1ues7_evh-JU2qoFONyeTsKp_qhsYDpocaZgz1IlR60grIZGMKN0r37JvV6ACYvV-BH6ekLKrD0uaZXUqIzJoBeFjkbuiEr7PkKdNtGF6oor4ERF1wHYtpNGLXmDTtmjs_aoU5aoYBNsS9-Rf3UnU7rC6-ztzuiA3AVHo1hIJ23xh44VcAMaVEy0pXlGsmkQtKAdzMoSZtHZ4EbSI-aBVrvO19QhZaBJ9Ex_PwXRodz1kSqQIG6HZw0_rWs9n_S2GQmxqq9uR0SKKnqI7oVjL75Rpr2p96WzyVUwY-BWnSLdWQFQ7qoH2j6BHa2lO4ug07MzDuLTYGAlELGaANOpVDgKJe10oGK1XYI2Ti_JX3bZZy0ckgvw4tULhq4zxuZ5xKKCDdHUZ-1Cco1AFEDAiNz3nWaG1NXIt5PMkoJNc5y9tKVpN26Z6z-_RyIbldVdeM4l5MCrm5qGK2fgEydW6duageGe6XzTnGIXAN5sI--QUUpubMuapMJCNggm-AhLn-Cw9BBgWCm2slCEkQdjTD6yh3mkdJuTQxv_mKq9Rut7YKaWLZcn7W7Rdxiz3HZLBPUKCwoQ7OEY8sWXksLK2wGsSKGid0TtfREKB1wmpIRw7dyTzsHoAq15JhibG8NKnyEszeKlMl2UGu9eqsZu401T5X6PCObiDxMYFYjfgkpWr-fFFIGoz6zzhxjwxWNq6n_a8FDKtpVNui-WOoKreLyc8HcYUIod_LQ_IURktFFK3WLM0odzTjdCnqs-ClEBW9ChssFvuAo6UTZDKrrJ48ZEFP6bvKBP3kP-B-5POHWdwPnCpZNB5kRRyjwu8tZaDly-WcB4ZNCHCHk0pML5hJ_9Z2tjDo-YgPyPUhw-N8GNL8zFgQZiJbFWwV0Ssrd-7lZ26lOVJf1UvsUUEZ1SKo0yCnP_9FJ__EhCJBEJT2TIPHL6O07tfDhYpbbqHqdIVywTpUOXYzhoVjZG8IHDIis3TVLacwcVGkhvvO1D783izzDAD1_SyCK9odr4YU9aGbVKKhbMnK9PAukbqJ0ynqOYuoSqOVTnuk6XHdvmJU7cI5Ibq7Eb52xUrPEQynRscw2uwHMVFiaRcqUlY2ychEBoyiqkgt2l6aZffmnUutpysew9yD-WOEsYsl6MilAOu618yR7jrqbTFNP7HOOexZMh8LU7utOcVYnBS-J9N1XNb1cZVybO6atHGG5ZKCHCHcj5VAUI5_Jp0d0M8y4OghZZR1eee5bl4GjXJ5rnos6xnKHg-S6XSGEFKLxeMDClubxm84r6sHmTkAqblK2hvsEhIJvjJnaYY83R7DMteJgZ06A5Qkqy-O962zhIoS4IYOuIyg6H6QFyAy1Uw16EAcRECP4laph5edxYrX9aoVzwvaMvXMfbTalZ8IgLfuGM1cZlH8FoQo6j0v-00446vYPRPgcZeLgYZYdBW7_zTI1qmpX2wxZFFKdkw6ZEEiZueoWBpmGri-rBbfYq8NpQE5eb4vkd9tGXROFmypwOpO0aA1o5z4vo3giFD-VOyzpKKn2VSfVLDvscfj4pfA0i9x49ShTY5XrlRv5B5vXQjrjaXXow2s_UInLCETp2FcZEFJ6twmB9riaI3cxD7aLGUBPs4wUn7L42vYdUzB0fQnyIOlALPHxMGBvUxpgDitYjOAjHu8VipOWxKVOIjr9D1YYTE-lyyOwjYMSlm2zoqF_ExIyfmcl_YgkGpDXUeng5fs9sSSp7U6Dhc7Wbmn7lgfvCIF-G7VbfIlAEyGwvoFtVeWnl408xF9j_nHHvn2du4S6FprfijhGB_X5RY8QLJN5K6bxeEFBwQrx8PSZvsxIvmzeTY31oQ6TZFE5HvJJsqyNnv5Te3ax7JsaVA0HI5zmXzVrmXsRR1AJxYua3ogwV3U1NLwyI4WsF7S0h6UU5bYndImGhGgen2fSGdZHgyZ-tH37H2YvLDXCGQXenYTB8vcbTqvM1TsvOua6qQsI0Wsl3YKl2JoV1PKCiqooZkOF9aVN0HmsAiJmcQmDGLKkni-nJ4-7fXY17YGsNKpCxOZwNtGUH-VN-vc2GpKesrsukmFITZy8krgUcSKf1-Vph3SdV5XlHUpDUtMOiiPF_RW14wU_hI-19BPeo3Q_je_uEpAsD652b9qFoH0xzs7tdFrAx6WFahVUcb5io61atdGxrSpAgVmZe4iDdPaZrsYrTZg-BNKd5WgHNscO7MayCGIj03nuauDZbLoCi8_MdWzgRm_0ti2TT3VHmsNb4yzTS1aKnm6UZuI6e65lsn274bHua4SZAYt5ec0ypMJLSLTYgInJC-GvWcUhp81aQwpQIWbwNao5ipXY0r6FIzRPTbI7NvIjOlwPlizbnIyfN3tEmBfNtg2vwkcloCGLMQ_ZHlS5aJyU6R6RHMuWsDIb6j8AnzUBhK2ZoH24Bmtq5K6Z51hdFIbZquMV97ZDvskQxBz8CfB5PY3gv4RGFGnMsVQAwOrFsknE9iavjXQ8h_Fs9xx2jDkTAh2t8USaaU1tRDqWvHSUppyEW9m_DFyUZOUHrG6inFca7RrMwPBD22mErzY5KwMcs8V1SPGtcdfz2KuESPXXDNZ7bBTVKaHDJB-eh6vDY_nmq-IxEl07jlj4sXvH0vKsDbftSQd1PGM7uiwmVu_VeNG173xEUJ2YYt5EZ1_gnXFkJUBu24l--9ahRc9mdStI0dSZv6MwAoJGG7dm2t8IfJ6FyTIjinaLwSYYXUENlxsb5HQBUu5Zlh12SttlGC8pabLBe8C62WhlK8VCVqD8tNrot7wVWqTx8nwJ4PRFJHJiEBetIcn3VR0RC0hOq11ebJNKFenAiDhWeux_AFgHn-kPBVQLEkTFILYQBgSALIAgtCce8XKtlmfCrCwGkSJas5teUnQ-jOzAxxrZLx7kd6ijqX1a0KThxqKyuTohLdsS5ZD7HlXYNfqnljV62B3Tv3RiAgHFpwZyAVHHgrTO9-85shfye8Ust55gJBkc4cQzmWcHZV5QSOIJUaY6OmoKTIAPaWmHxXe_7FbwVkp8EH9LSREU4sJN7_CD7GDPlZg7mvr4Z34U4N6niEQA0l0_MccH5wdKh91fAB453udyAmYyc4cwDDd7x4AaztJ2RZ47IZNva_N6EtrIH5nba7Ie_JvI7j8q4Sq7x9s-v-XOjvGtYNKZQ3m1_Rvr4gyMRjb4aI53lH1Jug6MnV7p6SrqbbRdULRNwwixuRYg2LXfDJ_YDwBbYRpm3bHDpZlQDuuBgnH9GMUY2Vr-byOy4QRdkh1PZwn784jxRztjHc53Dqoz-TUGC8Wc-TrQfChPf02Y97o2gs8scl2wOqtEEdA0yFPYiZLB_kV51wpBMMr0e-zuSDzy8N0G2uSPYxEtEhjhKcDdR8y-hjKv0oN3581n4ek31yvTL4v_uYZrwga6lXsnu9U1009qvUhuOq3e9vRlIOM62PV41nCbbangrWv8mJz0LpwRQ4OQNUky3vondRcCNaQF30YJeEcGRrVmvcaXMvrlL9wR_8CDtLfmBuUuKKXy7cnRgikPTC_Zoxvs9u5RnJmhqNrx3GDUf986F1GFmnz-e2amBovSiQpwUDoLzkNLN0hEj_jlbRm1ALLnoWINTD7OM5Ho59ZCZd_BhVV4ARxJLrE9NW-yV7G4m6sDo87yz6FaW9sUkDD4L74tRJ0W4-Fk_A9Ly6GsTTu5yKYDi1MjDzIssv-TWpf_S9pbFwjvMCt-t6FYsujILqzzeKVi4ByGSCti66mRg1Q5y8mKqm2ebMB0svLMJXPoQUvYXzaOrVvg8YFKiaNyM4QEHNXSvNdOoaBeqfgaDoZPW76yj248_fa7Tytq9F8WLkpHrTvL3Vxalxsz6CwSMbRYlKrrATe0zNbR5d1JKCuXw4YgWp0qp-4-E1VqJxmnJzVEJIeKp87AnWWsKIKB1HEH2c4_L5YypYwZ3II-XBYdXYdDagppahJedp3rua9lbMscbLT_mI5WScu0I3tUXjkg1ukg5HTGke4GP4m8_YdYAYLOS2yORDQJDk798X1ToahF8wXWE81nmPxrXxNoV8NDKYqk3otDuhq_2s51zWzuUb1WTsdvmNp6-gDQPG09Vdn_sOKbKFmICEoiprRGw9pAoclOsOKHBZAGh0yLrzoP9A4ACvq9XK5GSLQz83P2vMGkR4RJ8cDdbtuEim4mFWVPf6imuJomiuuaIeDNzPbXfzym_ygRvF9Byhv70E3djhdQjLxajpHIUHBozIwdKCWG8TIU17p06mFwOSQBixIIVh0Dy-3ocxoqSGCTNL3EWuc1UoUURy5rRUCQFNDBK28-iH3dNtcdOgY-hwDlvWrcYpBbnQh0Z_sOBNlYIihvRkXyz8V6Xtf_fz0X_je4g9TvO6tR6rEXOADQHGZ2mJf6pFK4tAmMQHMhU-awUke9TpWGQ67eA-9jwdDE15CHc4oemjFqvf9xp2rLeIPEWbA462qwaatrdsXSRs035BnoY3pwRaHy5sjbT2UqZ2SeZ23W0jRJyoQlzU-DjQnGhm6-T4FUPzAJShXn2wazlgSK1qf9-fdDzEAlKA_ZEY9aWVhaAYyRE_rLdGuazZxD-alWECFEd0nzQhg-IKkZK5Jp5wJsy56CCP2NEB2ihh10AufeTZIMuhtr5W1VpHqSaM7ce-vSjI-1Z2u74v_YGOJ7unctEXceuSbaYN1DdGOFP2VJbFuXtDAwJUTJoB64mWN4KQO3PHmWcmayYJDdMW1yJPZsbugD6e8XoC_9nkL2Z0yIDwzqy4dhkQb11Hif8R6wq2AW2aOeLtwE-2HSkRbaCkYEzy_1Ne-jry6Goosp9REBgapkRYkY0ElMvAUFqOocWEvvJT5EWlwOzlmyXIiZpMalq8iXHA8e2Kz-0VmdPeYLzMgENQaRKg5YFR_8rBXtLftPdpuh0Qnm17FnmW7yQeWYrDGt0_CjjlxmeccxUaZK1TMYiCMF8Z77Eba6BkbJyHyUFM-LbJ2DqhALyRrD7s_6Ydesp4i8zy5-NmcLvOZgAQ8MERk_NBMEI4jRMm1-Sw-cOF3zVRnTBZ_bMZzYWVeNcqs2mKWSZKnWIuxefrg2RWW6Lh4aYxc2RKkkKxd1AkE_suSlIZLRfZ8JxenG2e8UC3iYriyREPpIFLXng9s20JPjFCwCFOSxWaKrAr5f3tJtAJacmdy3Dhl2SgS8VhdoA51gfPtotxxIBB64qHokahEHH1jtUghEd0j1HPxvZOBsBaQ8Aw_KeNljTHP0nv42D6KlpMP6PG6FGSyR_05LoHvvIJE4UP1zUd2wveOnrxMe5oQCAGqpvnmibi8xSjpZnIU8zdFoT0NO00zhnqucosTAb8ll0Bd_WWeyX4ccq8kIxjDm05CDiMnmx0jGIaHusjavy2qjH6lZrAQLIuOtal1b5zIIqCk9Ivs2LEHB5z_ty6joraeHdsJg0ArEc2Rbjkk-KO35kDI_gAR-KH2NOdLtLk7lWmC8uMzK96NtbIJt654sru2ud-0IZLmWs3r6lNMEX3-XR4gyi3chiG6zslFykEalXtbqGqyo3NDg2SOrCdmt4bwaHaiDatFod7Pbn2rYDXhFX2OUiiE10usaRrivCAyLZZP43U-H_OZNYRWYtWvU1RQi-_MEHajdATYXkvv3i0NZDjWvQ6aw648mxj09mCzd37rYakgukex1hJJRcG3XwSaHNb9BINyeMuCMD2ehKJ3_5CHWkBvy_Q40UBVL0LClbPFPFQfUaOWKfvNH_TGrZBoitIpbl7TiTc2AOt1cPFOTnw7mw--5im-pcROxzh9Ru0dGsngZRLCL3aE6FZ2qOKL_UYrAcccijwfquOK-3nJtjE9KdW4fgfVg_ntPkvngblfjBddlUWwr6_VDqqrqSqzEmTbWbRAW1kSNDyU6ThfU34AltxkEBplCLd7engdfckHzKZGC0nC4cOJDr1IYLuXoYqV6nuPbwtEN4IL-O2bMjyKYmDoWhYHvtxBtz0u4w6zkdI_XE5MzD1W6O-SkVvzaOxDYCw4CLImREeUxd1gVjuE3pa95Ze3d3wvNXYH1SC-WJYnSyG1gurl56fvycR6cHnK4XarG__qR83krywgnEzzVElbIwa15wgQiieCtSzCJxyrhuLescuhjr7G_RLpq2Ir8dCyHKhFGBc16-hOqKnHXbkLisfNwjTcAXNpbHxs61B6GCKG7_Vuff9mhrViMgTp-IPJI9Jc33B9R3Iu_1_AzPJidiYzsmvlK2l3ziKYp7iDvyjQSZKMSdvKgNKUlb1RgcEB1vVXSy-hOXLZKnwNv_zbBelQUDhB-zirrCHdcVDppRXSrWBCOrwmiLXzpC7n6WRzMFDx8A2LYnjo5DE4heR58GqMCshykA4e3nZGQwj_qraPFYZURAdM3TOvLyPzWT6qkGLUP1N_VRqlqeRzNhki27foPq2ahWy_xUamgyi1QnXHWiFcXL_vpCAxmSc44BUL0p_aRysl6DQxV_aH32d0qgrSuD9utI8vK8kMQc_mxcolEmNmrCkqpjak5hJoQVoIPt9fp6W624v9bKWzmQ3r2QJCHsjViR8AUFhAJiLrKPlvCRQCM33vL38VfSQXLGEh8FgSX7XsmNZde_DR2FnGrd9Ppsmi9X17FBETDAY6HgDDcUmb9sPwusV7q1xg16Vhb8r7z9ABg_xLwrbFQ6rqX6Ct6trphcVcH6NbXxs3KreeC8MuajFvT_63zONEfGEW93D6tbWkQCa3KLpV4JcIcc5SareI8l3tZU9RweBZGMi-_zjuDJSGAkE7g02kGoOgFMO4kWzW2Al98omH6RqsbVasxNP605XAVcEZWsIa40pVuN09f13amBD2gxmjIcndb6DaEFau6t2qzma24hqb4nAOCwP25coXTWlOBLWOppJoDr_iBizvGGECuHiSG04_kjk3VOrKIygTvZM7zA9it6WXnJ9C1kRse_aR-jeCX5VpCflFwA0x3wTG9FkIcj3zOHdJSq0Rvi6HSJKe4CBWK75pzQUVZoIPjR_pdYbVyyveAavT53I5-Tw59LzltuzGFYVMSM61Qot_YwP-ZOen1aRsrZ_9wCdRkUXyTpG3R1tLg_wAJuteW18OxEVGupuKgubGEiwShlmIyIIOSsiYjSAm57BoTMhKJh3A6EJ8L4dPibjm9rwVK7UKM8aK2-7JzvoeHcyZYULhv1yDbxji-oGY4e7c13d0CJ5WkAbhENzcIAvPl02b5Jp-9nv8XZM8W8w6SI8oEJo5ExFh0mVtI0Zt7PtasUkURGsz2rfprTW8tbkCD8GVems_SFAm6apDAub-xl49J4f3NbUQQajg0QFYMNf3JlcVMV16c2YNcp2JSMG3IPeSfnvBF5TQHWVlsy2gzC1T17VQLsNoaNaoGhEm7wMar0d_W0b1id7YNc_taMnIfN8YItkygH7l4dMiz4QFYTHHL5Z-EKdC8hISVqdAxOrQAYXLTOn30-ArW03hqedBiE8evDOEAOm2VN4Ai6bItg4XEd3zXpGvkJiH7PgjG6sljNz-1w3HljYcG9Swjm-Cv4PnXMkmUtzmNVWkOdfIl2haq-uIhq_m8fuVILVAQ1Q0jx-i-TiXD3dSZ1_KAza-HFymPtBtqhKJUv-mQJbMZB5TNYWFsKWf8Yvfe_7thl6R4Rt0FN0AlNxyt6HkQjocPDi4fYA4-JzfD4gcqiQhmmojOzm4BfXouU-bYy1lFsKzbQR6HpmLtkCiDnstREoWaR_pfN3_UTT42Y2YGzoxRDteYpmV-w-55FdhyAeLczgLWbWpcxWTTLv1L1b3J-lH6GvuB2cl8PGtO39AHBv-_WqhkdeJ78y-WVbukHV_2f2W0cTSUMxaWvqYoPjDZ6uqKFNyHLBAdLVnoFw3GcnhjrQZIc_sA_2njfoU-JSi6FNa7PKBEqnFnmrKvPpJWiYrTV87eVQ2ObekpEQmRFqYTp8sXDwnTiwMhi0hFZWzr30aR6PH16MsyZVMSpnFMjCXE4fVUIIn9tJPeXaud7gIGh0r-Xt9XFvhzjp7p5XHN6Lt0YAm6kLLqvpMqK1yUBZfvE4096Qbswm6Nt7Lxn2XcjthJ40owqGdWKNhyrHBmUWxAck40cIq_n2Y9pqB9Cx-U1oMMHC_sM1IuoZxyEhVuigD4e9C2DyzRCHtedbKMdDEVXxr2phkkHejX7-svsSMLVv93WJSQZAKg91moOB5zEydcqdZ7UQpSaCHsj-d_3ED_GXWuf8l-Kiv0du_5WNQhvp1CwUS7u6GriEvh7KWtKW6yXsH_deCS97pMUXhlguztoBl-UUmNyfOm6C7ejdAYKdLAo5rux90R9dRFKVw2eqhPdsDLwVG37L6zhYXlzzK_aX_GImbWHh2VvcB0d6EVix7TX7fs0XS-gIAZeP-8Rg59D7t1SrmbGwZDThIHwoBLFfD0oilp0TBi4z_ic1Uo64jP59-Ccgi4ar7bPXsWPiCNpGuEag3HqgCgOllJhTrRAk4C9GZSFX2z4lNLDtPqOZW82uf-rz57VGQyeBt_YVkmRAGbiTACRn2_fFr_RJJbDQ_AzHQ_Qx5bVg_qaCmMUCGx3Bphtu8_lopwWVMu7_vn3J6aN09673BIHPJTGat-VMfGie29SCGnHMFIVUajFPA0rmL4vOHgryA14tZ9QRHb2sgxzX4eqFWLKtbn7OuY4yBspJvGP2jCu9_Z88Hn6gGyxvRgpjWJouC7LfPSIrn4l1Xxe6CWQxf3ZUfQsMDi8e4bKhM7ERekxIZpKJVcjBWJjLHij2k5m-QrkMpsHjKc8_IfKAa8QuM9Lzcn8aedmOCQCDkJ6RDcvs5ePPDDuQWxRPzc4bZSysYbjwmnvY83mjJT6DKq8HnGMtO-oe1_oG7xIs5WhZaUX4IpcGEODza6nUn0HIFZieSxz1BQ2I-8vy0BlktmH9E5i_wJYiEZsERXl_u-4JXW_eR1NdcMAyZgpQ_VBqWzGMzx80BstHp4FVwaQ_E8Eq-yZJFEyZ_nuuIkA4yPLANUiaRmOO0awo4I1e8HGn_FVA6kHsfHazY9LgTPGnEX2ASkvI9bl60dsMPOCNX-na38D4cPEClOQesLI3jIKpkFkRvZGhU-COQ-N6ci6qaNUsgr-ZXajGzkQsPQMpJeNk6jGjiDk9uMAlca0fOsiwf13jXedurkcbOrXUePckB1O3VZgfn3wgD-QAGVRxlHrE598htaxk5oPEyPs_gLg2NKSQhpsc5CdnG27CDQkerCKnGFz2EU5K7RC7RzcNVVVNuVLrJqbsAnEI1jAZY6MkSzoYc3Qtm39zvrIqppPEdlUGYyJMzrDaS3v0t1FA-qGQCSLBoZg6I0ABDUEeGrT0hEkaZHpXfKWEfVlJG8kW-CsLGSw4jZesI1Nb-4WJjb6cpRzIEuQ-eh2irMexCMmKLmJWiUvZOnG1tGPfbhZbPGuY6ey8vcoqqbglUujnViloQ4VsBbrr2xCMM8lCOOh2o3yo6Y5iwpwV4cRz1WiOlCrXfnrPkcSmWwN8PWammPtpEhMjt1kpCxjz-R-XR5pjwKm2757-W3JL12EhdvAsYk3S1nb9oBWmdpWKPysPbj-LeMIjHAJf1a4me3EnChGCt8vUY4Hyf6xukkNK9wsZbdYHN_rJTNh2Lkdj3yj9LSxm9dQiQoGrZ5ZGAS-Pwjc5CW4szhotscO8zGKqtzPeI4ovk1L-1tLkQOmN6v1HxHJuWma96Gsi_vhQElqG9rj2MDw_FQhGoLenubWZNneaf5GX7Xo9spONVmPw-IoDreDLIOxwYak5_kIlQiYl2uk_6WRtQIeXo90FkpmEWKG8_gMFfKjEC7kUi7c7C9sX27kxBKqlzLFQ59YDy39aAoQ7-VJRLc4usG4LOkVpcKqUfoyJ9ZS6Lq2vpZeqjReNiQ0_fmyfBw1aBBXEOgOSFz674BF_z8baNNr7d-yaredrHEyZa5JAzXP9ODajHELCLlD0D6TuKhYN2JEuRVjlVcbR8lW2_np8Yfy3EGfC_MIXry2XE4cz9ryGfKXUgoYAgrRM9cBYjq81rf7-OTeivX-lYwO6S-Y8tZS4UAKhJ4f9NkYA2dPg1Q8DNrjSq7Yfytn9jeUf8gO-lHd65lehCA49N6lMGM2_mMswrZqAe7clToN0JTqeEPZH5T9jINaGFZr3SvkeNVdkMCiIU2Er5Ar8w9RCau6_-mHqPoKN9YmXoWvmcOu8XuEc-rGhBJpVeHJoSEqLFJy74tQ_P4of-2UNhEBLU69N2gcZLNdteBqjKandIrgVybZjW2BJyPTGJBDGBakp76jLFY1T7dJJHtbF6mWiEjOZllIHNC2QonUyz9R5vTxdi-a-hBFvxJtjgvDu7CJw3LnGjLwJUB89e3pM78vQLB4urKrMQslTJs5Tz3mrldMn0f6N2irkYchdlBxjgh9D4FUw-WQbVe7iRQq7lgLYxom2O0HQBlSVauMcsftjPI-8g99-j20gFcvt00XOsErTfuCUNTB5Hlr_zNh8FTn5ohzNa6OEGjmc4JT9dCkyl58WIzOh1DNIaJu1MIv_KMA1eBVVro7lMt_8M46uVxnan7Hr3sEvkCKChrtCnsFQQsFgZ6JdKX-gmBzb3SdJcx1wuE1mDgfvuDJnKg-I2pR0R5zLzA42Zr5jzr3lbqRWBE23Vq4-EblqndCYp9bU924Wy4pCaRm0k0N52K3Fb1PtrPSrbXkZIayXqcetXwzbw62Dm2PQ_OKDb0aAMjBJMkTzGEJm5lUex82tIFabR_0LYLE7HI7ZqqLAVHrBLtjzLOlkkEmxt1GDkntwFMKXsoJudaFPj9CyQ5oaxImm3A824xTMmwo11I6k95nZ77N1fken0iySQSI8njxB1D5ZCRz3uw0cbuP2kPiT65vn3AKlXUJ44h4wA4-QATkZGoAgGfkl_QKyeEQ-KkmUaQhNxWHMa0Iq6kTXlWMhfs-JyLldNuxeTHBKBp60UOCKuVkkwQN9niz4zhSlZ9jE3TkHS4rSJT0Q5KuDErFhxFYWCnQd4ocHrmY9P6Tw8UK6ACwhRKM4WsbTNbzm9fqz1xFpg2-jlzysXxLTyl_yJY1CB3mPIYo87mnhUgAd0PoHzoizHNanhKOVYCyj4WxP1a9V7EjxnohnoYqTYpYXp4eLK5vvKQhFng816RtxbGDljQEw4n2BINO2eoMEwG9K7KRihVAFFZmkQfX4681hxp8mmjumIbXL8ELMYRTqQFgNhH9KOJ33gaJJlXPZCQEr0etjxIbduMTR1w2qhFHwVOdXJDoknRpscU7VjipU2HLpa8ouHDUsNEgO-B7MUxED6mSnFxL1x3OJCn2S6dKVd7cLyXVmDp-t-DGrAkO6y3cYjVr1vj-WHAI7a8FYnw_zpt5t8w7CWm-pkQ911hDOSlcNUCJYA7YOmszP3rq5HfCqevrNGFl2XJuPYWMYqGm1bBuCa_QYjfbJaJoILkoxUkPwPLFt8lwdhgwTg6jEr33yymTiXEcIiizyzb-u-djdZqgnE6Y0ix4KFqD0HFzVN4AIhZsPSbY5pRNj9RmmU3w-N_MDf6jkWTIJzw9MnjCNTEHo4q8YrxgBn8Eg7VFCIdHGnWMbG6cwLxrN-Ydzyoj1NL8FEuvBYEZGkZ562mMCkIGR2sGJRuSlLrubQfd5iEBJ5DzMesQl2v3GGK0aYUHfuKjB6K6CVnxpgCo8g9wqsSYrs8-MCsiFUL5gvbW3knFMCN8Zfmk0pGokkmR8EuFF040xXG6sGPg41Z50Q9TVlYl5iti6ph96GXsyi8B6vvjebDXyhacawcHj-qJPXNx2OII2mfjMG012tn8d3u8UDWpx3R1iUDmETpktrSGx1PFFzlLFpI407gy-RZFe828lMA8hhIyP96t3eaeWJt-W2H0554ICpzktFJZ0UtAhXxyVHOMzjSmBHAVhoenCBDvlwEiu31K9K6Bmoz1LD0HvBq4_6z2lTOjE4a-MmEQRjO1sGLx4mSGGSTbVpdaMIGVpmmfoXLMuVi-KHhYVszRfUrcTEE2T6m1qtjiM2j3pHHA3KTLOcub07jmvl8kuKAQ3-AY3JYTEopjVOF1urwzkZmIjuXX8Xd_7dkCnyVGIMsjM3PH65e5wNeVsgw-WyCRrkyltNLHO9geiZhjnjKnm0xgEMuKMfTb5Xojp04nfNE_2f1Tzpqt9ergHVU7WajwUdFMnm7qzunWi-AHE3e6WkbFcCDIem1xCGxd1UWzCvP6H0KnnCg4dji6S_p4KWUqYKEZY1X7YNvPq1H2QIlfchBQms7Efho_x0dl4aS2RnReYCVYR938CgL3_hyUlqxdmb6ZauZ5W8DofJ32XQrIVflTf-U6iMHwhAV4q0qbeszl7-UW9Del7kSizUukAJjLjbaK12AqIS_OlksWj5fMPja_zKM7WRLxSjUIBI5C1DdGq70hlMH78ENmO4SFMgxLlNZx4tvWIipOJBJbWxJ7l1wiaAtgF3YhAvKAZVVDvxD6aRzv4ABuyzxC-dptqbpnLQmsU0DatRkZ_qGjeHLyxG-nrz6zNMeUW-wWbhLcbeWlQEGpcmPFQZgHK8MZyqALzCLXybS8J5eY9tLeOzd33xg3FwrOWCUQKWyLkV-emUy3csVcIrjkHreAzJp03Swdk2DuM3k7LLG-J_nJKNHClrSR7y2T0bISqOK0B3iVTGgqSRo4yRM8D7ZTjtScCL6YXZB9OzI0uo7ln5h2Ve0xC7PbG4myvPkTqxWJAxhrFCiEcn9TR6DC9cXcJiBIdHpiq8mkFkzJFszrXKXvkLpI8M9Vlay2-b2yyzYl7zDpB0GjfloPzF83RoMSImAjxwTE173xa5ntpnEv3w3bBAZH5BXb64loOIvi1eyBGfu3yLY1dbYyzk7-tcF1ExkPYyq0wEZ0kOw5KeiiEaAZKuq81u2WECbUcAfJfcwtMKWbKJzdZ-LouCVty2ERI5lfsuDoWqbfNmmzxrui_qvChYxI2Ru6N4jaF-Eglqcyv_Cr4fvEnYnwcBQMeSXR_KxGQ2-grUB8IaHdRhXCmVcSqYkDxI3WNkBdVRPoZAT84Fs8JYJWnwL9qnubqWsm0W7Z_y2HUrH0rDjWG0PGmRqp7XOoVxY-hA6tDypCrykxhiy-yBKoxIgISnpa9PMlgZGrhotlYT4jvrjSeaUgoWgikuBBqavrTEPNSiNuaAgAj-4YohUi_-RxFwrWBXo6EkUtfs6sfTsk4jILmK2cvoK0qCGx9yFT-ATCqZlmCVG4xVZIBguDy2N4L18bDgjApoQ_oIixfRFAHuTNeU4-W-eq1CPFwlHlmH8kl7khXOAYmyRPO8pOFBKUO3BfpFDckjksEXAOv87fHO8CI7xByKj362nWK-LXze1h1cYlWWnQVbxXtUSoDY1_S9-Xwtuchu-P0Q0s-aWWKrtazo3-nRHfl4aNix1ds7rsRQYXd3KHlef86hMwwmmcYrB3-MF-JwEsKXeCOxIJ1fYbbhlnmAN27MCWAzU1KH4-kLbv7Rb72ZSEPlASkC8_S8_M6JAmCRj8wxnObFL_ZxRVJYZlXyiPTJM3kylEMEkC-TkUNRanp7dgmwNBGLt_bkux6CKVHwzyOUIyQZhS6YAUyNGgDhBqq6HWES50E1vk--4YjM2zS1UpDFP6Y50O_8cfhdEURc8psWq2CWQ65GZNweCdIkQJOF7cFaSQNLNVPj-5igddbELxjYgMLK7E0f0xHvtb8CRfGOZtq9z4oweKbFCAKDYPipEqmmFfVcOa_fILAMKugxPnRsyLk-6ZTXj0SkMez1aU4IBy3KaqWqHY03hJ89smQsWhYB2zG76-q375Lb_HqfkVxZKST2s9ODQ87WgHSbbpBKUeQFcfz4UOLbharpk6HUDQMcbONRXf0OWHWVk2P2KYZfq9L8YHfXasRRi4N6YhzEKuJiAtQ6FCd_KokN7c3D5Irp_8CZN_JLsCEi9DEFPx9Ct7UTZuWuSkFHsI9fQfIkya7a9E3miLvalHt1X-tv2Qe-6xNyIfrTW2q2xyhhtC4_FcBeWTmY34ujd8olS4ldKt_fR_HlF7h-61QnG_b_dVXWq73-c_4_Dk2Z8_0rlYi09ikMaPzUjCadshyH_t0HDuicg7iczZiKWmpIy396JwCs2VAXTps4FAGalSrtYDe0S8RKsChX0lE8wOIjbQ9ssXxfWKsLUtUXfViO1uTeGjy8TIqvCzhyI36IbZtuHW_IubZvkT2y6ell8t9QhEW70y05iXLC7WKd4REOi77h5tx4bJMIGxvD_1Kf1zuG_59ug2qJRPbtoqWk6Vz-b6SwaIUcTSBExf_bIiYTVQpGGOCzjCWJSEO-kQ0ftWrQVPf59vHvE15aAz41UobfmLZHEFcVC23xhmhn1FG9DIkGE4WDEdRthgLQYWcAJ1hkH75eZ8dNxEs7tCbysawD2VFpDOHy3DsK5WR9nDoROwaDLYUgqxU5NobtYzgorMSsTLlp9rj-HOey6Z-mm3WOWSry1eaizMCHE4cCjRUg20LSuznqh8dzEnQjz6xUEWvA2ww505R5aIBuLAd2XwtqojDWMiI73_Ts7I199FLzpNXwfESAP8hlToDqDBGXIUmr0pkwL2ql_D0QPri6_63oAMGGoDi-7a0czo1tnrfBbQGbU-Zi16jygWMfHrG8t0eVqmw7jV2mw8XsWLcdWzrwotkqlSyuAbrrhRIGdns0x3Cb7IjJ00mthC2aENC3DKaMLatn5o92ejTM5i7eSv5JSEzcNaujmgSJTyr6QHXjfJUU9y96yaV_1i70p9iNZ1jXHsGXLgrYAPvh6_3dq1E1pty3eKLy0VFb334CeXQJqhK7D9BKKsyn49b59BCJ5Ii85q9KMKeSmwbM3ReuxLk7iizZqaQ4qELBNky7umvY3tJlG6sX5onUDaQYXIhfZb2scfc10eUxwr_dzVgbSvC8IMfkKfMMjCnOQgh0w33Nxy5iZ3ND-D3rrKg3zylFhucus3pI3gMGFGbc-UqzX52vbh9D2UAlfW2IrQsR9vTQTnKtlh5rPpjOKwl5vf2XF2NZ7zzsq9pQJO3_M3UY-CRDvkkB1M2Hl8dOnJe1L0ANY5C0P_T5RXppNeEA00xezucD3V5Uxf5Lm8gQo2J_JrHYUB9MiWKl9LvgWfYu3g85-8fgO6eRgJDpt7hovZFFuhoYGqYoCftLNkU-LgB0bD8GEBaivocL9V4epGUvmkJqvMqtGbPOMlGbX_sT-8rEN_CJwc8JsFmb15hjCxdfcbVu4WfbEWpjPKExe0apE9_yBsU2ZQx5O-OgmpEDb8roKrqmuiLTUpDeu9Z7tW8i5TFId44xjhJMsdBWCf2Z4WX3m_43PFoNwarfmhGxwaRmD4bxTUpZkNRKZqm_rPtUrvq5D1XArgai78kK5wJQTgWmHY5HdMv4JfizdX8Fc40CkfaxvqAyFCm_r0EtBTn_WRYQCBjfw82dCj5GMtsnotHeDiL-aidh6_4DZ_efeFshD_NkAw2rhGMh9iPTgM75hD_-8m9yTpkAiaDA91fPU1fWVY8_WFaOiqLzQUrrAKrXLKU7gqq57TJTdNFLq08FnKhCM7EVsiynJWuAtLyTcs93wm2urbldVHStlYIKG4j5O9Ydz5NCqYb4QGB2yl-3f3VPaKXAYTaAzGZ9Z6amDC9i-luQxGLdxKO52JivrsCatpemr1ScZmdeaeOY306fvlpGsQapMwvim5R6oFsEYi5_lNYgxygANRlSUQ2E1JMiUTeppe7YqTqjAcTO4AZ8RQfpYpDvRXIBkyGgyVV2MKH0DsMyz6IKYX6Kce8Vmggs3dTzQTSU9UcUMCtKCL1KGaevAiUedp7jcIHAbEjxEPjz4zmHKbTCH0jUAqR48FUepQWApJvZZNerG2OBa5gp24jjb3kkcMV4p6ABMLBTQtnfua82tMpEPdUKKU08Gw_Jt9q5iB1MKbYjJoVINc10qqp0u66BybuYiHwCpF1Itwn9Pbkw9ZltT9-mUbbO_ryMlD9ZmhHIPGKGVtdjfylDKtKZBFgaBTfran02D9MKVyZhtKH5w282hyfsZoynovh89OArU6Y2-1CrrQymGWt53fvz1EHPiaaEFINUi7UfiN7zwyUprlFeCNck8hJxFhT5-STsAeVnqQOirxnXpkBnTvVIBYQ1FLhXFxQr4GtzMUBJVeq0NrswCgj9dyIo6hVrjKVxSxwC5p8aWiPcHqLgXAlrpvDH3uGtgFvyqrQVXa3XwBYALV57tIjExoAsaf5PwjMAsURaMu6xKhtI6QZl_ACuiAmG8xOqPvOmQFzrHO4rJqolfwUxMjk4K58Iqkv_YZTyq3ZvzjjJZAOELY2E3nwl6XHem9IaH73CLJfnQpxABNBoJp31JqDvbTwmbrM9Rx6vKg-ETJzWVYZWCCFOM-uKP3muAVuPL8vi8imj-uPz1hKxQ8PaSc2DaQVVFrhDBkfSGgrCucxmIzhCZ_zz7Es1jC6XUZ5mNOhn_hib8fuHZFz72Yec_w8KQn88XudRp7lB2ncdr-Eeuw6Non-Ew4bXIFCIdNTc_Zzq6rpBCfwF7SumhypTQZH8FxbTynGWQPbIeWiDMYIM1mdrGQ_VCfGe2Y3_h2dsDJg_W0dxGlYPzaM09v6l0awMgxqF2-mmOWgrmsh_yFZDR__tN0f9eRazi55e3H45ajekcPBnMYl1YAkhykd6beAwibCKhdb5FK-5H_qaD-PukGKgnZ6tYCqDR2ZaIcDydHj3ziE44qHFVPPZDSGDB6PDBbI-pLOf8b4vrdwzun83CDknZV2ImzhNNt3RFGsjbsAGGoen1PAhGlHXMUkNCQD59QbOJpaBTLqZ6dB3KpdjBBMvKMqvPFtbnu4eIrXjmPmn4P6vl6r0MPJR8BxAKJ_Fe5yZe3P_f0Yw1fl99dQ3kc_W7TptFK4R5o3ghXu0kIP1REP0PxOducsP7bk0pfDt337S9_QwS7qrGUWpxks8wEJwkMaKy9TyL3mXzJkFDgLZY23OSwc67IDjPgNPR4nhQclTIiu3zT6uTsOJdFIPPqiYe8HPQ6hAlrOM4wiIDBOyTykfgu2S27Yl0L7mSfiYOtUXHSR64yTEZ2xCAocVPwnzI1VBPv4vP_2zXjRqrV9jahnJswcTabbu4yHYmySbx2D1UQ-6pDipN2Mj95ci8m7slvxJXuIlq0LDgCIGMWHXL7Um8U9OAmbYKu6P3lBcEZXxVXFQN0LsDp782p_kHxHyJ0gCwqbUC-e307jQrtRpI_AsiIuc-ohpgBey6p4RQzkmAJiU-X4Ic6hjbO5PJqMqNM7cZzYjhqZpXf6wjrUj2Gqvy93ZuEOSNIb3cBdJTV9IRetIPluEM4XWUZDd3lCk5bAT0_9AKKd4srkDdVPEGo56E91t0ME2juxbRILiFNtrKwSY-anTTS6ND5-nsRtSYSAIE525uWl8y6F_mSuaSUQ4L4eJhZeoS8yRMe3wAGkePnTLHT4zP0WaHH1eFXaEmLbVQajOmEq7TYOoPQwwcM8TPke44vU2GDN0cFFJAx4IgKnK51QRaY9meUfJ27vAWSytz8HFZSCSCU9bNZxQ--MIXFK9eTaCdptp_9FE021D_xz6L6MgfHrQPwRcLm1tHttmwhcXpnvf-uDdUO3iLXeoTIJjkNtfc5-WLYMOLrUJyYpq63LTnrgyMfeA-UDsrlA_beloAzKw5_V00zChFN3AzX_eak_wQ4jaebKeVI17kTUbq_C9EBhvAdGvPfNe_Wl1UZ0hcDkra02CTL2GBCb--qll9fauKZXPB_2-tRWTPwo4Yfq8_SwMsIO72cSmLASMW1LgGy2_UJ7v3dZydr-CIUI45UE2LNM182OEpxDNrEBcq-NF1FHSBJTqSlGcm9sOlcY51n6DdusioiFC2y__Mkk7VpwNtNTp3RdMzO__FjOQtQibVXtbkUz9yFDR2SKpe06zQ_vfAKR75UVt9R8xW6ESmJPUQk-Ygt6DfB_PN2cGZtqADuWhBY6BTmBQpr9OGNsC9YV38L-UME6GhqQA8SddUzhZLwOpJ2lloW_dCQZgEwxgTRigZspUTXgDQDyTYlTSlR44B0JLCucqTWlmeEnlguw3FQ4v2hHVbYcdwhu4plQLjdECqVCFaYslM4YStgpG82ko3F0RPX99rwf1G6C6Enu7W_LRzdoidt7GncnfiS3Ueffwz8XXOhqBKGXKYMLgfAntIBFo6w8vNfjAsYLLTnlCriLahJBTJKFaqDJUxYOjRA0Z3NFqAQja2xR6MfWU-_1XL0MU-3aAJ2_3u0U8U1rzoiIh66SahmWxd9xpecVO1wCUq_IkK1bYHKyAIQOPdY6Ty3k3LsKcRX_TT39pTQWNUwpQ6SP7HoRrgvd3g8NVJ-DAsOayqRZL_96VVh-v3SQ5OXGzClw9UWqeZE73RM_laHOilsh9Ph56toXYOVFfnOPGO-5DgkAT_AcNOoMNjp7krXgmGfNEPdX3xnDOG8f9RWGezyghxXAlQaPWeWn_AEl3iDLZD90281yyIE-kUPUQljnJNR-EZtVIl85o_VYFD1a4Hss5wI0ZHsubdlVX8c3oxWnsOHONjNroMJfxBH2gG40J5bztvvKZ7O5_7vvBeJ83DHN64sDwfNLTWl_zibEoW0vMR2qLy1jbNcJh8F2iR0HKPixVEUzukbBDoZZ5G8Ph-ACT_4gZe7nqRl4GwUbrZqq2hYRl9gQ_onyFuOQbGYQy0nMRhDCVTlwuUkCHzN42zeoufa4aZb4XgpVq3gxeiCgKCwj87odp-QjB_LJRiU1H09tu1TxMb0CBuwzX-oHVDT2x-7c2thFW9Iehqv6u0wzc7f5iSQv1UdzMn71_O870cEX4G4Adub_vsXodCWgXqALvrnkX5rshAHb4GHMk2OfZys81g8Lx8pCNfPjzsTgt19VoQ_xRdilZWY4EfBbnM_TfQJdR1pJ95YbT6bmQNZXG2OQrkRwaPgDZnec3m1v2pA3VixhMogHhmU-BuCR0LyNfsCaUmqJYH7jSucej-TfviANYtxk_Kr2oI3HLA7yX2H_Zg2ROK8WoIJb1LkjxHjI2kdzpIDTinlYUWU8L9UNyz2HVEREgGWDRFgr-oMOxcixxyuLr7kJ1Y9BUH6rnnWVs0OANuz-bKz21l_ORBOHYkm_NV9JcFJeuF3-mT7Si8QMEjVJcYLUPA2qUWBkitETrl57Ve4ZntEoPze8jvu7NZpYHvOWxKuFQtLFM__ALw6G9KjXH79rQNWNxTUHZG0i2Icy8c-gCWIG7i-RTIpQ3L5UHvoIsesT8ZxYsRc4gN2NUHPo5ADjneaPGfO_visIXeYPwH3p2clMrFBVsJ7WyazzkQuCJqeEs0y0DcUSDE9It_n5nDEseVj2OmvaM3yg3J8mjiuCUxanrbLAVCgKZj_kt-SItQ4A_4yAYIn-xrHYcNikYzUr4VrYmXHyK50I4QKlvFXwIgnbdIuh57ezfioA0L-Ss_cIAwc9fYzP37rctELZhMd_7Btg3sEwBASwN62hBtoOnnWUTq_ce0nok3h8a4c38VYUrgtFona_ql1j3gMl63cSaiq6WVrCrls69eyLZPBQIkN2PKIr-wNQwh9CcQyZw3gwECaJumo5eSPslmtNCiCJkvJwaVbgxKbyTJvUfNHYR6UadfpBfwGLKY9KejN6y6e1gz4F7OCa4b8SrTtE6sQVSX-AW1swGGXj6kocDospetahsCPz4Mp1NvjR5aIwuTki57n3oVbsSdaFBWb9tjEvaHzia8ZfNqYyxZkPwOk3f1u2TzOt6h_aUL_eoyBltGlg2RXL8TtNjQdomgNsEUk246yzrI5nj3mc280iHmRcdRgnAgNEsPSPeOoT7o6RZQP1F9QrLziU_cTKxRAzs14vCWbNFGEPVz5aAxq33l6_JON3df-DvFvPOe8gpBZsEd4fLY9ohgJs7HQJn6gla-BE9x9K8KpsRTKHU5FqKMtIYNo--CuyhrAoTdKzLQ_VUfgIYXKE2o5PP9wX2EIzmpdSsSfR2ZExgWx9WXDIf17N__3YRUOemlnG0DfpxBGGGdT7MxHsifwFs08jcM2BJ5ZoatDfNgcj0ZA9Eom1cWtbGvyWGsBGqjNKx7Ukj5BiqrfObyHk_mcoISoafUO38MTruq9b5QJSkpwh0tIr6dh726-Q-YKLcs7tLRIHllVTpb-L0EBB7PAVoI42hJ13_pwrEgHpExwEZugQZ6tJNjfPt2xYnkaLn8IzNxgpc7B_-9IWnSiHoLFM7pExRR-BSGRMUJKvNr9osnN01XxrymMMZwfpYf_Y7Uviw9vKq8Tnatk7BdudeJwB77BIXcyGwU2-h9qe60ifKGKDUB0lEMiTB2jPVeJwDjqEng-2h5wN-Foyt6vHeWp9O0pdzxLnOz05T3yyZpFYbxWa-uEWk818LNH-RdTVe_XcX9sGtoKfRxvETrBX4KcfdjeGKi880jZSuigZC0mH2bsZcWTXX-DSiVOrWxnOdDHL3nYP-inSLnROuzu9-CT26BYQWdhFnJhSpiC3pkQsJ0-x3ndcz6mKL0_8HSj8ExD8FD-1ztPMYm2FaG6-CRj8pX_rpr8lMMBrDUstB0Wjy6cDNYyl09W8HiogajUx5nX3QuEflv1glH8c8eHUlz3ZXwYyHA8jR3PqeO1h19oh3Yar_FcUMH13tm7w7vSaAC_iMPJKn1FaTalYl5q3UPowEOu_JZ5aoNaVSbO8YHueoxkCHerxAjEYok1xngGvi60Xiw8NZ2IA2Yq_9DQdUYLas8J6Vy2_GtqwTGcfmoEQ119PAk3Qt0FqaM_pGDk9EJ1oIIyjIoOjjmEj82baFet5CO-ZS0vvfKAy6Wb1ciHf8xp-AlCnrohN6l1jBRh8075xGlJ0xo6zjLIMPvhwhzZCLjfr-xeYJiT1XDcstsiYF1e4zrqoG2Ni1AsOMA1Plq6EzjddbKDjSnGQec1BYBM44_ZGRbAE4NIIjsDzKNeYYYB-2TFTqrWR059nTd9Mu_m1fCspbi0jwpjPHcGjjTdT2NDgi_Gz4rMNJH8nvl0aal3yXqSxuFGAPLET6jArbJ25Lsn17GWXnPfCd4k1sxvwNSL2oSAfukvHqfj5lpMYBVsgZm9yLh_Clc-3xx4aVMJLEgRZOUSwOZOcFM6gvhTfGuIFD1xzIZ69S8BJR0gpgqwOmMamKBhPyZ5JL6nVDK9nEdMoZEMEn0BpDuhEiBblU8WdU8HRimQk4_4p_l7kJlHa1vIwMQGHLw5NcvcN1OheCZBimEieZSCSPfmU0beJ_2xhBhMhhMa4H_izVNszkfzzh8GF2qTFmZHJOVGmPGeF5c81C0ro-62j-21mZN3cIoZwbCvAbfK7ihwq2sS2QdSJRNwyLg3yFKvKgdE99_K-YPcLJ9AaJ0l9RJpmsGxr0jafQxIiVxRpVJvl5qzRvr38irIGi8ipXXGbQoyrwSMfrF_Vfxgs3vHixYY90bMvuaM0ffhdYyBbGg6j4NL84CiBzQox6tXXY-hZnHsW2dYkR3C8Z8W0Jhrj6KSyX__XygyISBS2-FztZwlyI1FyGKqMnNBoZRdREpit4e6cx6F88UKPfNtAaxRNULD29RREpFdZXC097ZppCxIEYlv6IAA87YwM9yRqBJjYpMZ3Fkmo5Ow2h6SrZQtkCZmLVnbNCUjvvadzaiUWw84gGSJd96c6B2scNBVJqPMYqyn6ALmFd9VZlKqsMMOz5wO50mhr4wnRg0esbI1tE5sb_9cGowV5crYgxy2HhYfACbIoY-eN-Hi0rGaqONadp6TltP3fmw06q7V708j5sx51Ws5LH3GPYHg35q6nGEml7MKTp8HP9-d7eF6y0eW_Fw88rC70F-fenbgyDEpz86k-rmafRx7fXAvoBvburkRIT_QiG7vR2TJ-1_Gw7HkIAjnQBThertrn55xyM9LbbUKACohLvOlVe5eTHNu4zdpvbNSD2g8iwxjNpsN5Yb__s4tpyNzEC01HW_VnyZHQP3LRuaQop6jyQ865J05otE-Sxc3oxsZzJoXUrboRd4ySNm1nmv4c-7X2wXpN7e-bKRbusrbb7HR44I8-O1_cG82kIb2I2nOuvXj4M9whEICr5MVP4eminBKCTeMgpOZ118H4Ui4dHuZHG_4Ovfu3Idwas0XmTXhlq3Xlelm0h6Bf73pyYnf4J0UtOi26PzRJhSa-X2uh3QiRjHCdrJm8EyKVwrEATkkgOzuTZHKbPyhC1nSEQCZuFySeBCaUTFuT8bzR5ATkuDoK6rpgKMiBLD0Fcb3oOY6cwUBnXMecCcMOr9RbNOVge-P8LLdkUEOgPYwFOKqDDHkpj1N8-kIElM7AwMcLAkrEB1vHzlgULhi6kiaYZ2U7BV74jpwobwNx1N_eAClhJD6God2ihky9xLmM2FWQgcgOi0ETciBhAAoxA-XumPk9GNKTtNKnTIHIBCLrUTtN8LO5N0NSuEhJre1wsRfGtHhL1J4pTS4b2uJ8tqDvSK6ze4J6vV5DhvCZi-4hzzG9o4qmj_Zd-3uWvB0b2xz2zT8G00QVD-DOwbDrBtKaUqdZorXYxV9P91KYhWAEZ40Fy7qzKpP9qZYTH3ShkOLewkI3kvinvcOfmtg1oAtxkdFOv524Qwi5CUsZWnFG28L7Ml8NPhQngApfhgBjTiqteW_Ldp2GR5b1Tx4p-S96JNxMq0i5CvmvP1XV67CcHFVmviMynZ7J2WM-o9R68cPXg7EW-VvZ6AbaJFeQkP0HUMIQKPppEMn227v2GEHJoXl1GAftiKUIf-CLXks7Jzw9cKLGHd-2Klsa04aKhA0knjXCwHel7tdQxu74XbTOvXGWb_ZR2NGFj9d6HAmZtrnNxwwvsNNM6lG7wpaUBp49gjhm566V7SlfUbNfaj8UA3fpinD4idpHK3NLqBuY3FD5Qu1fs1m6RMpsSPxezrZ4uRZhGthnn99T7BGZdvxs1epYekn1D0iDKjQAdhmKoAdM3tPTtsGP7uzA2kZoi7uTgFplsVZVpL4Q23KKrWJ2g1mlh5Eno7XjRhDA2RjtUTuAqxMW-t6Ka5hDVSpH6kp-kVfPiXpJwV_Bfgrypn5sLy5-alVEw4nxwDt0Q6GHMoa1wCGbciEXICcRelUBAJzOlUnbtdNGPJ3Gga_PJig8nutXIoRA5QTipvAHCz3Zrm6nyhuZkO_ECsjn7o3BJ_Q4iJxA911d3nWt2jMAi89j5AVz5uBwRdWDRiwA10E_B8nEozis6C40Kgh4PuZ1-im7WDqr4Q5VAumB-1nhA-Wn3EsAufGLR5Y84cyVXheCwFeV9xfVBJ-usX8GN-5ZONof69Yjp6L59C0Rh-Hxq7v3T_KUOTFex1XYBRV095wM-6LkN--UPMODsZvdJ2QGO778rvUR44ksC-Oy77lE1cOCnqP496jGMVLvlTd0B7INQQU1uPje-lDUUEjsv0urSX6AoGDyX_YgA9VS4ToOySCM1b3EchBNUzG759kssv8jK6EQApkXql39Y0LZPN812IlCVHYFkBUPBmisSvuhMLPngU9IhG3RYUkVCw_gIf7EtYIWcAFxWF0xapwZ0kTKIzz_eWe0w9HKIVBhLc4wEyOtRyU3sA1zUlxFrevb2JURiDD8PhZbuHYKvGL5loK_vdO5CA8lp3AFTbVNfvd7HOTiy9iY1R4TzqrPiUupkKFu1sqWkcF6Aq7Vj7REC8gsQPpZLYj3vQbM68iUX8DGhT5VJK_0OH7WSKoxSIf6SEIPuudsPmRLOMgyaiPpe5UznO7H8TztK0otXXA8l7p0srJGvYvgAFpGg9ECtOatqr61JKMdOMbP5fd3UF0r4kxpIDxX_792EZbzyIdbSAbfVID6TSM7y6AgUq12TKnWxOnXQ1yZzPKeuQohQtM0IqjcaNYcnx8--0nXbZ2YhJUzq4jYjhTWi6IbbzZLUYF2N-xaUs5-4ACHR5oWAN9SKl9C1sikMplygS01Tch3QjQXVD9fQb_yY-_zXxg_xnZMOSG_oHFz9Fyi0W2Hjq5uI3fbtn6cJx6Dwrn9MFL_j3up_Q9Ivxo0TC9xR_U1GJAwkOItMaFgP3qYjF4Iy8GibyNU50J1ku53Ey95iclpDNmiaK6iQCaA7u-W6QQ3su4grOLnlPVMKtDwy1iGBtQHKLh2CP4fiovgsYS13IiJ2gWeV85LWHGbIO_5Bv5zQ-rlwKmHAvPK3rBOfhTZAbdP6GxQB__ogNmXtJGUWao5h61NDM0dNLW_LQcScSD6FKtLj66d4UWRpFINlF67ldshvrlxgZFsdi8Yl294lc27n4lqFDSpu9ZxmFkYNTi1wqvbBjYjXprKsK-zAo0RmZSeenBCQS8H9cDj9o5-oUzdRJD-MoMXB4BClkUtvcEsCGbhS5uiyUs7v-yAy4TZcmJIxzL3JmcGNW012Dyz1mnLAP2ZT0BayTXBSF4L1U8ny2DOwlEYKT1h8oNwgiLaqFWnfMImwtOV0h4xKf6bjU0BWhjnWoLi78as170ZaX9M5sGMCAW1uGQfbH9GeNojDmaOi5it_EA5FJY1AgbvATc4LhiORq3avAl4GPXyRc-J5zfEVrj3uezPbn8I3VmuTLPxmVd2akb_xlefyhMF7r86ju9mANkeLln5K6KmkQXUJHcwYRUOYCFUGRxD3eq2zKOZ9InarYvYAEWOZwWc3EH_HJuGL3kVd2OMz5xzMMGROSJqOTRmKteNJiEgaRqONui_Bju0MwKe5PASl-SFZwcxpWNrJliPD7x1CdjGys2fBex6fsX_jRHorZxZlkgnmmV6coQsr1S3shH89H2hPFQQfqdCYUpjAXPYaGp5vI3ZAIoyueJFbqfttQn_K6PefKDJPd15HTF7VffENIP9hm9jx7FIjZywrGeq09tYGTmpKUa3Rll4DCKjaR2EeZKdJEKWMfTExW5xoA9hI389ztL5Rr_udn38wJevBS1QhDqLKfF6W1LJX8eLSO1Wfm1Q1xjfU1Kylhz9wY78BCQ8IP77bK3tNx-ArsncWOWSrRKhFgrOwinbP4LY5TaNhEtvqLw-BzjkIKV-uWaf8bHtDiPg0d_UZc8btNwdsMWYu28xf43bDBCsvUFZCBrGd0pGK_ZdjHw65MROiou-tZcTmTZ0iZIpe2FHUeumjE8tAExEQEiFKWeGX5G55QlsNwjN1iSwJ4XvqhkasYwntpxTq7_z8pNXCJP4nhi5dL0UmHo3LfdCEZl9mjY9-WQUKlN74yFZq_gDBvAUP60sfk7FxEShktHwJOLwjWSj1WdteDtX636Vtl5eUUMOoqqpoM5Af1oMXe1ewi00r5Ua57rTIAWdunN07QlFkV43g6MtVavQZGXyq1_dsZoYWfR2QrkhA-3nW-ljm94ZiOZ8fdFstVdncRftz5jIgelTHULwoFb1h9D9d2tKgzNRnZ7LEKaMpqN9Q5HeXi6l1c2CQ4juQuQpxODYI7kbu73VVg63nGoFbgx8-AMrE6AsxsJiOywLzWkZLa_zLrbhugPcURVpnckWzC2rCd76BbAE0VDCyg91eLySPAyXWVOYBl2mVZQODJ0KNldqTj0kJSybKZG0La0lbkDncHyLAzlMPgxz_Imq2zN6y426hc0e1C1TJRBa4oIzzVq3FR2HUPZw3xl0TtquOogaLIJa80T8Oq40W9SrzvZu0wDqACzfR75W8kEO-p0wpMJQ2ONF_-gh_ZKivRjFoNOM7MK3End-4S529WsexjdQnZgLWchf4nw9MLLauHGT1Upxj8QZTrR_MLcgKkAN1qlgBRRBzHVj-TwKL4mTpYtEd3ywOvc33ymjv6FuqMW16v2pWsmeVu5U2cLQ9_5p1r0w3IRKifY3h4fAkxuNb8N9QsmEqrzN7wiq1WWXvVvZZio_QsD15pcdpuUG2Xp7XMlOyTGGuVTX4baMEimMUbie3GEg-fdpW6UqChGd2BD7TwqUrA_0-Tftoa2HA0s8X3I7qAsJ1qxRQNWsl84WvzJAZiH2-mwf4TU8f_GqXcMKIA4_qFiaG4a8sd2t6RwW36pEozYICLKLtM9wcTxW6vRVFXSA2Mai1eIijbKJYYJe86Xn-fhhrTiI8bBGjj4uAZROnbve4TZiQphRjUwRgYiqn3DnmT7s0FtNuxg7x7TlkIZZvav6bgwdvPS48cqMs2gUBf8ZSaORSYb24ez9uBU8E-Gj28p24rsypxveL672TUk6xpfTmmvasw5BswlcVOy_PXiT09nHROoFSL6lQouh8A-XgqbjrHniuc6i1c78kqfvH1anoGCdRbzv4UP41Vgl1z4Zaiv8TPWN03-vBkgAstxNcy-X7K00QmSUfroUjOWDggDYiqmSO2mV9IFDRjh6jMukHzbkltrCe6_bt_D5AngL-rHD5TWwypL2gmth9pP4CYFd2b0iyrNCLR7Q7I4OW9B-Mn8ptzEOSKAX3T9YzcyTsK3x2XxvwEApPbQvPAh_bRaQcpN070QCwUbLVZQrDWW-qNp6T6Vx7ugNlyCo6Ke-JCtwUeehh_UDNmG6KfZt4lFtjpo0Q7MBGRFeoXJYyvfa45FmBl11sdCEmXbSM4wYJtmV31Wuky8VNkspWq2V_StElN8_yajjVVJbRNqVxudzfaOSKTXQUh5GTVEshWpxPUzuwWp0kyPaWSt9q6EjCqmpFZ_i9JrxM6zSeIse2DdjbfFowfGWBNuNW9iwafHCd7eLcOXJOrP-F3CdjWZ3HpndYvEeQZueq4rJjemV5wii1I_E0Zyk9EWBMj4DUIOuxWsr4Qe05O8nrUdc9vc1xdkQ-NfVyuassCvaiq6dvbVvjk_thN0ojuD7JMJkZhVVecEkiItW1trCVXZgBziUuXylJONzDCY4F-KJCxDpQSbMJ0PXkAAK_p7egeNVDGhMi6FbWUTfMvdZJdQOwP9c8MbH25eWDxF5QgJfH2f6ufWkAPbguYn7LGrra2xfYyGwghEVMm8k7C7WdWS55OIcP9xw5p_YW5LW0EhIirhwX1loLRq1Du3r83dM3IlHLbojQHN_AjLuYBGgayCtOiFt9UN677WSbZm6aJlpnPrROw55B7Vslh1IKILuuXbGpydHtWofNmc_R9VXFDVkB1xcBsOc8I6561adnV8OWyGbDYKkgKf-yTM6vJm4opTc0JM-aPxkxPSj-MY9WrDp4VjMvEKfOjz8g5UptEP3GY3c_AtWjmS1iX1E02M3-d61kGZv4vKdoOPglT8_VAZh8S9Jjy6Sf_tNNidzKkRJbdl4IJ82vfrpBLo4oN6xORRE9XmCtRQ91B06DQ1J0U-uPjBXiigoIEfziOKbpzK8xV6ZzpkItQhXPZ5jiBmagfHUlwM1v8ik5T5EDLRuQdh4Ikxnlki1TRt19uS6bVmFCEqKFoC7QzUl-2KkXcBIfAI4YCeVpfOfQxT3cuIwLyfg8-BOLWMgCIBvk5ECYmoqc9lgESgZ-emdU4ijALD8_oi_Jly1X7gG_D8BlBy2FYu1c4uYQcP12f_HQJyg6hwONlnzJ4jPr9Wbxxkl2J0cKmjHQEIg5VH6h_TXuTL1ozHMeknmhgd-edsUm7IU7vck3JSlcsWGnYprDnSQUKYwNCBeWVisaOfSV5JqDVaEBOuvssd5qj3-_hm00_un8dP1xcpXf2qKna02VsqXtmfMPBxJVAI8PF2crWeai5Ua5HUnIP5rZfokGDREcJnDpJTFtMY9IZaDQFGutAt6bdgC23lpeTncPkya3DLqCBQYOCeE5sqy-Q6-8x4FRY30jT3oWE03NlQCK0IfT9Cf4dzYOi-Pf2vbiZc40le9vQjDciz2SgVVag8mjPnUPEi7VLzcV6IcwpNR8naeB82hJ2FPed3vs7ex1kURNQqsxE2z5YHW2h0WrXldwhRzTrLZcrmyZWg4U4cp0oNC3GQqATCo1XX7E76oM9UpvnAVK4a_y78rQ18lo1AdDkS4H-5qN_yfFjN17hMAMEIWTJacZHpkGX0QuqUmtvwc6Ndj7mzozIcky4jUVHFTV8wu9jZ1vYTDn40OLm1XbC9zGJBqQ9Ihg1I0dHzZUOJRWGOsbF9mBjRJN7aE0ni4isDg6wgSdwUYMWTM2s6U6yH9yuRztjpHPIzESxb_DahUjydmfSp5qxa26OCnodplwIWWAniFhcYOvQbJ7Ug3qu4kTnF8seJk9Mwp2OuO_hESIec_xLe1z6fpolSSxpfaprs9hcbQTOqHkxxzkS1jgWLZ8ahSLd87tQMxL_q3Xo_VUiug2LfdzC2QNbOZf6IGh7Z_bU09a1-OpyezbK9DC5MxX17F8eBe3qsCvqu1PywgXjxkRQTuNfgr2-P4fPSlkRUVppbcZ19nP0B5C7QT1GBIz_TX6-Pt66ZrsTE7UXlPx8ywhB7OlOV-jUX4I9mYdVoorEDEj3J3enb5hgxN-qoWryUVeQ7eIthENfgf403aOC0e5Jce16tCMxap9Um-lplb-fVJoj-Pv7AIkmI-8Am7fwFINgxeV7KznZh3H_pP2dnkiPC56qqcR2d5zuJULQUfn4o8NnuA3kbKUCNwKuYHT3gCODoN_3avrp_dw_9_sVKLmKlYfxlOsEUPpc7ygp5D1ZooySq2NqK7oKoQwJdGwMhdjmhL3kjl6FSv5_nA_kmQ4ZaW5V21_-asw0lQ83UsQnnX5g0D4NTikq3I3027XN7-znzvg-mzZSFRi0KdLRjEvQmz7hLyDfBq4YH_R8byXGbfxhlEyieoI7zivFtCAlKWvMHTdN2He-r2CY9ZQ91780omMkTavz9uPmE9nYBMvO2cYK1oKai0DTIIw6rkJi7iwFdYEGUBj6X8Q2A4xpbErKqGImPiYaIjgLC6l-cpeFpAeTYUSzpmBMIV6g12_GnRoL3zgOVelBZNmYE6KZqm4wYWiBt7yANPCTakIBCLTf49TFkh4YO-CUudTE8E1D8vfzh67w81PCXNVXt990HcMP9bV4eg3i508FiRa78B81-T8G6t2spNtpsaYXqjbGdLWnh1oW-s-glg337ujsM5iSSwWl-JQxDIyzTKXRzppoKliAe2NS41MMZtuVeSyuEsyfjIpEo3WflfsLKjCf8bFAw7oP7SHE3SxvpxfEhpiJwk1n2tn52h9QWwBv-sEyq7-m6LZFChvjJmeAabcTP4hNoyvttaaC8JtzO47Nu6lwSIjMBYEI0zChBwkdddHbXB7NRGuVJtJ4dYCw5-MQmeAWDWIFS7n3wNWTKRZB54plnWoRddaehjLSrROmDCuQBUGbwTNgdZ660Hgkf6HxAgbWg1tSWLv_B4b2ekryuFm5zeHhEPE3_3Ze5stTz_k7otHa9OFqHIUx-g3oX_V1OpfsHU_xon23iTKJetJDKGvKcWtYbiEmkVlQP217eKKugWEgDg0fvPYCr6xIH6DK4mVrmfilcXQq1_V3kXNLkG0TxkvC12nIM_aKfcjlsDiy8CxEuJwX6hyS-JOUARFgMEYtoY3anwM1L6XTY3QlvzptmakZOQMBHEv8p9WAz4uDSr_MCYi99XBMn6u0e9-BWnjs3oDnaK3jXj1sMgW-nvrAqEPPXrIcz-CJFUNdN-pGAfwf0S-_mOllbFxjZ8tRxwUHlDTg7uAZMpRV8XVzaNUEGph5gYZDwbVIq3taaicRqKXAxmKStBj_YLcdu-sMGZ0A_knWZJKEqsYyXjk6GZapKcVG3SvbfCqdc9YbyOOEjmr_6R82sAvYWT8-EV3ajpUaBYIorA-wNtCX8j8ATC2waIGAY_9cXWkiM_atrrmJdk786IZWvc0sYweQBvCvTfpCm0L8mTACSakLYCB3cxL52aOh196oEKaljw7QiIdBGsFfDkiE8Vepm8ZcZkfw-VUsebpnD66hVLDOM9R65is3IN7F7h29Y0ph3F5PyaCmvmDtVSM-VWmXUGPgDu7MzORVD9hkMH8fDmpePdWWTFpB-cYQI-O0k7zCyOWgwxQfp6JvMFyZtMqqqHCsEIirYZ5mlgBQlIzh9CsAcyFvdRcrD5cR-JwGiNr-9SCsmuFgD4IhAhjIdPPDCgCIiqUKut686zhMrI76P6uKalXJjT2W275B_FVGi84Rit3jX4f-3RituwKoXVxDQ9twyETRZQemdMhV7KpSaJlNlVvKbqVtUx52dkORkqGebfqxzIblIilK3XIiCaEcCGsUaRxrAUsZrmIydeoyMt3jL5FSOxg0oNsSMMBi_LW7pLXKlXEk61qom3HM9EFQr4aRIDZFRjzzm7h81FLJCYX9LU5yCmgWze2D1N7mALxkdKJPZE6hMsu_dzVRDYFCRH2vTk24yZq80X8xhBNxYPEH6cqiyzlbjyKkG6Y5wNlRBuLGvFUIVsNBJtOxlBiOz_jza4xlSD-PXg7msjMsdXxcpzFZQfBfY9ye8vEVZpkzP8T-JbdFu2z47ILE_b66OGZ1e9sZ7RoMGB7dJJo8BhWXX0sBAe3eT6ke9_CafCt4OH3em7ALfKoQ5CHQvS8poxljZCmMRcNLz7aeSii1VTivNta0tezJnTMLv3MUpRsuLyBCEAgJ4GjuS7fT-A2qCR4RbCSk8p8GUWUP9RMZhw6a070vn5n5bwhXlWB9h61pahE1nWJBi_didsOvOPY18KcKN2nl_zX_A2aMq9IYSTVWD8JkFsu0yeS0ekas0XZVs2SFF_dx77LKjtkU8LTrM_RtyvCCTXQxUdXg91Fm-phhtP6rJO1T7t-E2a9oij_cVKEhcq6FuKXlUD1HJ0MZIchAbkJewA-2JnDKZyWA9qP5dpy0NGp1WUBIvBPyEZwn12eR2-kiEeQxEZBZO4YqBng75YNFBvWl78iYrMLZqrI4dz6ETHhx8fqhoiuBsdVtafViqSwczIohuVCDJzg2ndKleVkJWjoZNJn4aA2vyJFdBx0nnFFK_z_A-70XkB_m1GBjcccHJdzt2MRnOu7MRiI46o2-Ub5eMx-ZCRYheGhuhIbVGaR1a3xCXuOhSCloe03PmLwlop1ugEYEWSvimA0AuwsSR56WCg9zb_KOBLsEvnF5fiVyheNL6kCLTJxqrqlGh-uACvjCMDWa5XEQgMDqZDebPPvVOR9onuZu-P5DhcDWeEkXOu6N7f_GACWzvre4Q6XN_QRkQwYNDBCNziIscKvosCAeYvwuC8ZZCd270OUXZBFzyG5RO34SL0qAUWF_0ikSk-_Qm2NAJTDs_y6d7V11LI_ycgQDgXwaMkLyojJT76DfQwSDpUqzJW6dhbAMW5ht-fx6PGYZ9UtG23UpSkJRpsKXtRIOyT5ZpO1mAMFjkCbOMKNNs4pdAMq3NAW3g5G_Gb26TUIIVP2SQo1k2MPTaMiL92BjKV2mgggSMd8qLzsLOwbBjPqfJ_4YDT-2v8LFJDpzp_qDIKQfgf1QOlTw3a2jQCru990Q7uodM7vpJfBIVn3GfbufFphhr5UHKP0LrNlNUEtMWESDMHeS1CujdHFSkxopUxBr90fMMNnucQK_FLqv52MPGkBtBjWhmC_DPFllKA5b2-ppSFfAoxQf9uXRia-36ARz_FLCnh6NYHUIoJ1MJAxO_TBWdGZsa17o84tS6wrJKipnjxvMz3mSECzYjkzeYzi_kIq2sh7aDCpM6b_atXjg2KMTUK7_ddGWbIJ8Yswl08EOhPzA10Ag0gV94MqoI0-lvd7U1jY54jKOmY_0l-lDGY7Ndf6ZuxcisEJIY4XlbBoByns0z26kbUjtgcD1YQ0TYeJADkn2K9hgQpwVcfn3bXMni8mjaKMjj1aDvhm6eZqcy7M14y2x9iio4HVz4x5uaiW9S4NEHrxJq1kLdNHYZdOids98BSm8eX4eilsh_1j5sdyADL2Rxkn3QGEdOaJmj49MmOqFFeO7amJZ9MEbRXSlSduZOxVLEf1QH9fZ1XCRWZxLZDRyf3m5WZ9HiIzQ_egXhn1sD-ZZSnEkCqdzVBhd6cyURxJJPph4GkqSThJrC6EEePa2jol1D8OB6FT0Scwh3zEu9UMQ91wRicrbSeTkfGGyVxesA-b8hVZJDzUHnD_LM0T33vhjEuBIVchbECFytYt8Vxy7fVymx4TlBdcAYyDaH_vHk5NqpH1EqHlTwX_DD6q92Teq3mBVf3TQs0jEDE-gM6AfODSira4gj2HY7RH5udYJaIDYqID7Ra4zwRFtgPTP-6ZJ_BcjayTrP-TG0d3PdbMBbZWgs2Hk9kfmzH-2ntnRZJ0iHcrwEGWR1tiGwhtkjqSzF82UDsmUtDXF6qsMGJkCSmGfdMLHydP0TDSdQvWpDLTsovl_7VQh6Fnik865_w9k2d46UyoMkUAYIVKK2YxTWgdNTUs0q6MZGs4O7hznGmdFPV50yU8924aHoLb2CdBsSMpddR3CoEiDcqr_DvjBap8C_FC9GxT_BVpsqk__pkx70gr7t-vYDksU4sSrrVyhUV7-QSoAxhpe1bQFk--EyO1jpqdf9WFrDJv5H5rWdnyCYisiHC8N7QYTM6X8oKxJw38qMlkh986Kf9hJjJAKa2R5NEZ19QCKV7J_jOu4PerwHEAF5UdBfsZg5q6-DGLCvr8LrDE7rCYyPa-StRMYmnSBv7cET2u7mfrRM0ZaxE6Cd8F0Xvyj_NULfKU-OLnReeXpLClXwEffyqoOciwtFZnYR3enYkR4Pxhk4W2Oc7agIoprZibndhKQMycTCC03jR7oOFGFZ5BStZd1C5jWAbGXpUJdtKisGZlccHS2bka8xZAXa1RjjFDdJVsouUZjrucEG6lLTmOBPovYxjPTTypIWLMUfEw1ZDWOFpP_l8fuVHqqA3JVSDUkNrvDrY4BYQ_D_SG-JH4txOEvIvB-NkSI_xJueL4WxP1g5G7txeHzfplu_VQNe5CHZxKPBhPwYNcvk9uBc_xiMooPHSztBJxZi0Xlm0tw7UxyDBIhisl5G3qysebu2yWRQ_yeXy5VuoMkj1wci5hiHmjz09dOfn-2LW8LZjHx7UIIWnPrwdnNTO1HuSnl_J9VRKMN2e7JJD_gMOxr-KM_PPdq8HpmRYvacEeQ4rgVpR65-vkt2ENf2ueaB2kCjipOLloKUSTd4VTrSLfBMtITM7F0r7wxrBRatjkQqhR3t-1VBkHx3bQGNKDize6CTUJGWoKT2jhOXf67NDbm6-po5FhY69ucDLI5H2rjZFp019LPfH_E2bNv2AmW00GeRNtknnWc-UUXVV6e8cqMzaTjB0_It47V6lEdyH37_06hzIRnYC1mhPSskg9VhWQg4wDjxtO6Do0lqAPqLkEYnRicYJxBGM9XkMqal31u06x87UhXIa2AxvRArjOkhu21y7XjjNQtf3EM1UnmZ5KHjJ4VFBX_9WY2nGiTPAZvl_kJooWkDURwoJmSAOF68NJP62MJEHDsNDShzyXaQaZ-q6-L5xw2YXfb4U0L9LM7jVep_rVajgR3mEfG_2hgDSyEXHuGLpFyqxiNLeH71CQkT13Xk6xTFj5Wbbxc2Upr1wNYjuV6WKTdv990Sz6g32kwJelIWkvXuJezSfRtHVQ2XjP24DdKcRNxnGulrh4t7R5yXSGT9N256MTKz-NcFtRFRvxOMF-E1wf6CNEifE-yqDaDvH03fTl4dG_j-lu7zeeH8F6d9acsu7BhLjMfjiVlOIvH5kZ1UuQwIBRO-YyQ2M7jAplOQqEoFLxzQG6TxNpFqFaIlA8841PpFjv_Fa8elvBomo7R0CnbTbhFM_bvrkkWuuvbllH2PLtpb3jYPxGg1pvuFd3uNt4qAxIKZqneli1CqZT3idG5Nnxd8NJxCZWujQTrQkrwGBZCjhow_VF2uJ9o1EA5_wwnQIV9kXtVrxEUmLSvluupk1dkmQQtUG-tJzG1mYLDg4g1KHvm4zYKAWfhqwqiIZQQgiiG0tKNcngYSkFCfFuOhhVzD9yeg2M2WhJEQ6KStdaAujqabawi64pgHanmBNaVJwQYoWHRWdcR0IYimXYDJOSMPOuvNVRHJooMgzzrJUB2fg1cl0lCwWEazNMjxY-w-gFCE-MhTxiNhG0EKPm6tqtUCm7FcNiHUBoN6mY1oLomeiFMUwNygbm45wJHNG5Or0ul0Svl2CZ8lPuz7N5QqeN9XHKP2c4aY_ZFqCoSb98Xmh4gZjgHQvdliWMxWPI4LWC422PT8C-kOyULJLsplJhdQX5fFhQOWLh6Fjha1N8Oa29KjEKsbKnP6yBytSbvuOMNZ6NHv2BBdgTq1PzjT-9s7OXhiO81oQ8L8Vvb-9a66S1_W2guqUAzbQDV-urLQ5tWYk4x7gV2cNvdB3cpJvPC5QwdfsA4dBzq_CZ1aqpClq7OIfdk9FS57hSvT_IIlivCKr8z7iyd3rtaumM0mtnzOPmEyi9VU6cojDGcnPPdzEr6KdE1VvSHriOJ04oJlkR5U0Wga-f1qythwinoxhhdsk1VAZY4jS2nIDqFzss4jn7IdFoePmlgqEXFhwEw3fS87u_xRlWRF71MAhXsfiN4lVZhSLVIq_QpKflV3wVHPeEtjPp37T6iYP7lIcp4p4frIfxxScPeTeExRc1MayfksgaFiL27udIzaHN6bkofoT7eEbtrGCbIh7rNJ22jejCx7BjuhCXSWXsu5xDDt7iMwh8xnE92eGy2r_cDbfDjlwPOswA3_Ws7RK_OGlZMflV6TrhE1i3Z4y_--sUwgEXlgo3fsZudQBmlTklcgEQsbOYaQ4sjy1bAfW_SNxEQILotwqg_K0cS4N0tUeYC5Y0ZoGIhcFkUKFTp8VYPHXgGNWl2OTGHB1ah0rbtb5vQxFQou0x83ek0Qcf5SXnK2J5rdtppXGLgcQKp7KfYEkra0CR1ll7Xi9E1BbhB-Q7RA709RWLDY13T9k0XwDV7T14wboJ_QpFvqbCYp6lcAJJVWUbN16UdWhBPPITsH9vwarBiRfZNjh-JGK1fwbZ37UTVbQ-QKLwWWDxqsrYk6z-mVXlc84fqFNsgV5EODcTinWIIo1bRQEaOUiPg2ec6_IXr48RJq6GKnHT-PUhSzmD_jCJgHJNWzgxbtw2AWCtMfYt8pcWIUNc9M_r4RLknoteUY356deO1tbS1fS_lrZy2JywfSFw-W8vylllJS8w6FWQJ04Mos5MZyScORSDGUVuhg-9a6FcvsWm6Zbuh0tju2Mr9S0Fp-BVPAGNjV_HouEfy8Co0Js-Jme9ReFfO3QVpvgvR5tnn1hO0uiKdwac4Q319cgs6EV1RFRbCZf03BpGBhkhGUnW84WlH_GRi9jMvrTqdGgrQuboe_b8WoKOqmabGAKtcT2X8IWQAS3k5m6TznXdKtWl4rUSxDa3UtzBto50f1MRAa199zB4QF1LVU8KOystW1Albi823PPxuFEkkz94tHWMXbItPPezLE-Mnvws2pF4aK0ZVSM5kx_e0nBhAvQ963xiaf3ViK49xaS8ghr8wLCagFkJG2wNyTUMxVs99-6uUKk2aCPppIFX6TvuE9WV5YL9ZWQI222-pgKm7lJys3crSLupwHzt6Tf-7XvN5YlQxeVzbxyah6WYF13Nsf93nUKUn45CpFWBnNJcyj1uDkUxmTjCHFgERWMrhSDB6Q3mtzsmmP3ttJnd_KH0JFi_eb_STNa-0JkD8O-x2p2J1BQ5GG4qgeGpNisfXn6dvQyRXj2B4F-6enBhaGt99tuQznkKLSXk6tJLrPWvuRZWdfxL5THCNs2tz5KzOMZN1f0phJ898xXuvsUxApmrJcoKNgwI3o_JrJc62evOF4EoJ6ova692pxAEKjKm4SvDZ3tHqI4htfQueagUhMzJVqt6GIh7vAlZk8DgMETFJ-z6qcvcOi5f46aVMpfKMzihR5Em3jogyUL6qc1aPRf9LNDqf2NIwWqtz4ZzcBD_SujW3SrAFNI4byYkSJLSHRT20a5Dl8GwRnCXo6tDzALJ5ABgn07gu4Flso1yDEa-VuyB44HqFT7uBSFP9YOgT60yR-_lGPJi1lfuWUqNCQADI6Qo-dT-1navG9jpiN20A2IUTPGg9Y1j3dq4Jb2_sHBqLXWLO18WVWjLoDec38L0LlKs4CmtK22-Sr7f5Pto5igaqF9QzlghF9umDQs6Aua_4tuEL9RPB3p7Iddoun6Bya9e1cjsSBWxfkCfJkktjE0YPDbMJt7Y5ZqEUkCdFnczVHuMLtp1-SMnUyPoZsanUKdBmTJeRxY1YK3e2IJ4rwOit_fU8dao59m8WwUXkW8R0O3f_UFDpTNWDFX7FsEohU4Fg6o7uHvpbOLtT4bEapPuM4sGZZeciLWcqPE8LWGoB_-RzfJ2Du5G9hmgs97bHa17lzK_8k4gjmFyUZeR5tBwIxAGOcrv4Gyv2ie16UAdDNYzuZS8jFuEEyVOdTRaaycFfrC9zEIupIRZw1MaeiuDSxUmHJ3DpxXsb7TDnOxNMSHh_E06lIZPPqwtXgD2FXQ0jA1qm4p33InUmNUiTPApEri4XRANAanLB4bCwofZnrxnUZWq0B3nvpaU3SBjK0-sqRzO4lVW91MdsHe0RBS4-MaZtxUF4AG4GlmigZJsjteQ027y1HCwA7utSWSgqtrlHrsu90Ul6zGkYaT8abfBRI2mNTG7ZSHeu15P-73Bqqwyq20ZO_f1Tlxj2V1QizZqBElcalr7V-6WvfX559-vTGCtFo9HunbX1TWryREJstvyTUc8iOGXhEJkB00UXsG5zLcwRthafWs1Hk2RVzQcCZio5E09VdngT1uGYb39VDtnQnYONXAgoZeVL6ddl86Zp22vNcXmhUZsavWTREqDJamCrBXPssVQwHXmMqbr2xA03f2Y7EhZd5-dmjVyX1V4bEUKk_8PxYUIVw_itERxfmQV1CeIQ56iE0oajcsaY5eR5_20aUy-5tsGOzkW1Pf-cW3kX-9i7b1LRG7kczpTobnHxclpCHjIYoQ84mmXjYWxEmgNyVPAOSVYeuYdpI09Tpcwu73qpkMEnJR1QFNUs6WpTW0O6H14j0VNePL43Kk3I7VldryF9k-j2HLWGxlYRR5IudtbcYnBbdsE3kbsKCfXgqkkNZbBDNjGjHXpU52Anf55b6lQcHS27Wqi1mNslD6-sgb-XW1kPuX_Mn_jODHbelhC1OQey37y5ecDw8lejfQPzjwgrobMVBJjhCelaFc8Gs1M6phq5IQ83VD4btPBXPd6jBIbVFXlKxxE_gFL3pU547Jlc92obGYAWQNWyh2y-_vxkfaPHCmBW7_YBNnWs2GcWV0dyvU6rafVCuxQZB8Pi_-ISqy1rWbDKJG6_4WdsQCwl2r7LUVzpRlNSUgS4-CnFCaPh_47eppxkcwHn-tfpa6aYovv7zCs3mZLeFHz8jrowZe08ixzFf2UzJvkkY3DwX3UvZEFkyHLjxTX10z6MZ9GHrktGbQuPf_Q4QesG477ka8wbuoC1YuPMOldnWy30ibpuOvgM1-TUY4XVmkB3NRUvHVsWQRvpPjRTOXJzBzzVALBzSclY4NDm7uLrpNssVwF__5qm2Da2LXsgj5RT00oMdd-KVBfhUtdz51thyfVwFbAPTeeb_WtoWJ-rpMRPZZQ0Kpl4wxVXb_VEqoTcm6mrtsFnYuqRLwRaBEWh67ZWJQICZHjIOLmynMtMXCGDzPOowqKIQaGO-Ro6ay6OJypZ2eGuKTdMtx2X4SIfRygDkfc2zFyZnQgy-Y7RzBtgj9ilIglXguwCju8ZCKFHoqJwW5yjjLQVlgnjggL5KNQ5in5wqe8x7mzhuG1L01BU7QLJAhRP93vrMPeicDXpCM5s-AVbIve5KdYDuEaNaou0QYdahdZu-_0ruG7aNY8JdCTj0zNIMwVuaJV0YRDx7loP5JIn3aPb-Y9zlCQIppgDHwJHY7FKllQvfxhVSHPPpTzIU6p6NrjnWIv7X1sYgcfaREVX2-k2FqUiys6YthV1LNkfnNr9mg-lJdgX0cHjC79E7iKlnGbyE4jK-L6eJM5yvQq-vLzFIPZCZ8BHrvCBsMOCDvAi2nx3k1_lvuTLTYJKgUAPLLkLVTE5LAJIU8jw1SMsnTZrYctgGszAHy743ZRXqvFBe28YT3Pv9vtoVLwVzrG43WWcK-PA3m2n5xO7NAxmyFJT4U0_GqaL88vYuFuWl5yVbcsYlJmhKSRnS8Mpy6_kt5Lqrri3HClpj5kilrQVRlQlCTITE4kIl3I79NrRzF-N23F7lVSM913o292fbik_J6ZtIlJSPgyBwbPR3Oc9vVDesRIzfs5uSW_U14tar6IEMbwsZTnJUfHN20LM_abUkzuuw5JFH5cmfY95oiX8sqRNypour26RMU35GU0P-kw7eJDOVU_atC1B16-9-28mhpqaI_x-yNLM32nr-rwLUOfICBcgWJLwQiB9MdAAppH3DBzB7B3eH2hu5o71SqnYZ-Xsj4Q6fNM-8r0PGhCqIqc1s66JhdxhOxKYkjDJ4NSkFiOOJ2madkszQlVqBBs_8cP3g8P2sOdX7DCXe2TV_rsmroHcVg9MrrqDZM3QwmLo1bCl4jb-VRyPRma1dpnIumirkKP4TOxfu-WIQ7HlBuRO0vEGwLaTMap9dWfbBd2qAYybPVlWMO2xZVY3foZNP_XvC5y7l2YnwfKB1bXzzQez2uNDPgRArRFwMNfq0JameK-DuLkrYWmDxv0gPGtTqEa424w4BA1I74pB2oIqF5iDYW7lMi8DNZsPXicWpEPq5rQrPlOf5uLrt-MhyU0P80II4IE_RK05RgoaZG3_qjU2Qe5eHQFrQbEXskYoR_4OEQEPzoDAO_wt35JF8PyDac6XDmofcuks-oCn7WbS0p_42uuPKYHaHIZCRs9mZ2j6xdKw3T-MPyfaB3wyt7XrTcmB0jCy6pAj1wIKnPYJQzvmyIo97gqZJ2rAtIf6L8FFENDEsz0cC6IYstlinBMCgS16D9N_BqNQITV_xodn43yAmeolwV0mXJIdiXmjEULmCbZQUzedxFVZGo9qmk266F09k8zxQehPlRtbWwqkNwEnE5rJrm4aD4716fjMiO65-tj_w82r74XyMmomAmtuGJsquIkAWPDXtL4GJAKO4y19wJYOhOoMKF5RICcQToKPSV7BK28T9r8ywX_EKeLI3B_jQxGIhb34Twd_vCJn2Ozek4wTgNlRWUZ_kic1EmcKaMozm1K9Y-LJnyftmgbBfBRL6UBv10rlZy_tcpjZNpTF4iZKL4-lHGQvKiPMW7KOdab50U2qN82Hr6s1v_Mj6vyC7y58hu4jP6vWnKk6EFvmDrW9augwGmnOv6Kooudiax_yLAVf9slLWwLNOOguCx3ojCWbdB4Gx2HpFa1vTEcKce3iivn_kwnDsd0HyIZRG5H3xbQCv8a47z-0OHO_hrXtqP7KZP51qv3Xe3U4IS5GCUn_D11VUVhA-eJZI1HyqA4bRg05W9yrEo0XXy7sLUGXUhZonYK6TquTL0VMP5Nj3aG551hShROSBWNquSz1XBAFPaEbl7SN0t2BL2Iz-Ltp6dEbNJS97EkyNAAO-whURmJitL7c0QlTc5ndPT4p0THtohfqg2RcRTwQZsmHwGZbmnuOtr7Kcgbt2oII7c42ehId0n2rUXho1o5HJfPFUxdAtsoOKLQ_faLNt6P1CHZYXAfeIYfiIsE3vYbNCAFaZgJUHGcfe4VmujC2STswqWE98EUk8hAWfl0Q306Wz5N9HbkSJzuDyzBjyQem176F-pqXDSI_9SQNLEGUpmKpgpidyiIe5kKK9RH1Sdmh_kTN6SZKyBMAUXnpUjcumiCgE1PfcsOuasxBntpPlTQVOJ4DIg7nr6QCmErXXz_hKez35AXQA0Au-AgrtyKPlmTY5_y8QPWmo3q5roJaOVk_ZHz12Mh1k2m8CV_qNLEVt0VHam-wkiV0R-7QPvPDfMHO7fwf3HIVBPGd7yGZF2UC7FISKC_cZiGIhjkIUKzAS3M7vigIUwn4IB4PftkvxplUIlNN5AL72vhITjc7R4AVHLt2ad_ja7bPfqpMA26vpP_qb2Iomx7Dhbv6VCfJFAnWt_D_D11Q09xJrqPigSkJmsNtBn7KyLsm9tv0Kzz4GjRAJvIsWShYT-mkURPDbwUK2LjM631Xl_QMlgWFl92gAsFjANOxKiCMhwd9utOuZACiBTK3MH4BnbP9hg0xZtMENXu5uhgVYmAQpxrLs0OFscozeYiWSO_Zy77OKrC5RJ2mNbaYtU60dMwxdC-rD41pifnMvjsrKF8HLOmjWjm9GWQgNtwQtbd2n2DtuVDYJMYga5F8vKO1F-RmFJJC8g2Q3a2BAhULtY74p9Lhq4yT09clvDtLUBA_xH6tchIF8HpfxVMC9ev6a63igaXjqp5v_cJBcNcR1RJg56pOdWMn_bwc3tud7767TRIPkRooICvcsjC4rP4CJQ55QvnralpBywUHKOJjjt_N8owJIBfNe2EhRgcGHsQsCm37vNhsnFzz78c2cxICPYMz4pqP5gMVTOYyGu7lXzk_bMTvIk5_mYJ_qJ7E7iMLScMuzFCk5fIYb_5B2lvg7NZjFHcB8uCT_BxlF5bm7cyFt3PFFJpguBik-KCDGd40dqV3aW6_VEs_BCBp-aVrvu9R9dBQnjmioTz_8n7EAsC6pk34bZ2pkD-j4ROcO_HTx6o0h-YG3imT_XXXYNjVct7lozEUWYXf2OTj9YPueh5atykD_-p3RoF27D8Fk-jPjvy_y0zY1B4--n8QwI2CZqV4DhfVIQkAo56-p7-Qc7VKAhSy2J7UH4iYWByNUF9B1dK7tLyITJ2uKLprFKiSinPL8BVgt436GS1qlShfdfQLXrWzsu308N2YERZJLXexLyods40PApCrfsfjhEUV_J16BESzx4VEDhCYLqVze9722oJYeWIurDERsmVUjPRlOWYydBAg48dztEblcIEveSfzosMAwbBosWU_JYA-khDFBAos8Qa1KNyTaJ1oDwwxogwKvO7azXTxCGh7X9tKiR9XViNEk54vz29_90gMxTKFf0TRa84-kLPDQhUfm-EpPG3A2HPJJL9RdwQI_c5bN6Zr71csh_voFNaLIuV6F7GczuvrrYrXY0bbM3VDRy-CadpdCa7qcWCZ0nfuTUYAIodVIhc2FsvkuRzuQuNZ3h4npEL1nq-ag3pWQuhJLKmCqAfJW_uSSrq2EgWH1TqOjKmR8F_TeQMZ7e3ZMAIrMB4VbIuXUkWeYqB673NHTQ7DjPYbfag99iEpQEgtVRLur7NdnhhPN_rN5-OG8RWKp1Q7TO2TsgypJLZFV1zE-v5HAo8QDK-A9vPR1qtjI6hxH8Q7BrexFlHvwKCgp_DXfz1wndXRANmb92leYtKNWMV1Y6dfNmG6sgftczQ54n7VscIF8ymJ87TKni-5765TQ438z699cw7p0T4tJ-nKMfkGPrvGmD09Amhev0AgNdmqyNib4gH3a1EK3L0FHlJPGgnf0mTBGHjZRH8FnERx0ZG80PORovc82YzZC9fC0q6oPkl7ncQBuIv_yq2SlkDSOqq-iTheXW5g4GBjF6WZde5pNog_ozsh3y_kiewvaLAJwgLalwjpcZrBE8FazZc3hqtCoIWH2KBaROV_dVNfMqV88KUGhumdUlYvv1ID1xVG2wqJCgI6xS7t5xwUUDA_6E6TgSkslBwZvqF8sbQ2abFIXmaSiiQhLAsXOCDYxpT-f06NeWG9QVZpNuVpcLQLX2KAycxoYw_C4g8YD5hD5v4fMaaUkxN0ivpRKIv_aP_YKiw1i_uFgvrpztjZq5Mi6s6r7xDnyswDTiDSyCjomxpx4roCODAGI_bRCb1RyKaJBNOGn7BotD1P-UhmydQDZPMXoYaWLohPrimHPzJPxFT-wFY3_vUmYPAL7pyqlYWHAV6kv9gmrmUUcHAYK24mtjKUzzBwsHkE0L7b1ND7c6EnEwLKXi5d471Uy0s2tQBHjSmFWEtBxJ8dnBO3nIomNYqPYI7CT328F_DWT_86_fJz64wEiCZTpuzvtC46bcHy-Y5INH_SC4rGbf5oK4q6_Vsux-dPOq_wh4oWDBAWXOILYLYa9AwS0Bwye9aKbNrLHIGbFpcTdky1VdGoxk9gu5Iohz_ncRI3gUm-yFVVvX73l1XsntkstokgDN2EZbwYKeucXUxZVaeNSEnMazpoaFoLODy3jEe8DGNqr5mQYiw_5BZhZXaZMDu9nPNpndRTpG27X21Hkcbq90DM2NKhYZLiO8nZPkHkpaJRNpFZ8ACVp4ZfxvURpZaNwS5sWH0Xz7roZJGYyYC_8gChOoA_dz5Q4t3Gg5AjJLe2zJ69M29eKVWctehHik-uFev8A5lOwiriPRVLXgPQal8z43T5rbtRqAw400e1gkVJgkhPT0XaivSmwKz6galJcvkmZem55tvp_kwchRsIqp6ZWFTDDQEFuxqb-vXgSOwE1SHGiaBvSx4FYFxFdw8UOuklysgwIuoKe7XsOlZhr-4FMrOEUOef1AqVcSDkYy5fGlpWIISwYOHVvRgR4-OxzS9BJsyei50N0AF5pP2oxAocLBpraYN4C3OncPLLNkYShAMYSvfuBCx3iCoXUHLmIQ3u1RcIB1xc_2MwuYJ3bxO1UTtHmzCzFRrzszJitIYqKPGd9ea9sM5eZyQ6xl7PfGNKRxk9Ba1nQi7VG-3HRo70F1XG6TMm_th7dMX_F7124RHbTkTW1k-1yHnzFG9QUjD_MLT9bnvJpYPYadkJ5zZ2r5GMj16wi4CsIu6JqfS26dvaX9SxBinTspoLqDCckguMQDaVU0XGH_7zbhMKlTxQ-Utdfer8UnityV6woZLwE4T1YEr4g3eb9qFqZ_D8JLf2yKDIzj1mu9rar5dd-riJk4EgHiw7pEfZ3n6MDM5WaRn4opHjP0GFydw3OWbvF85RQhLkoN2yHhdEGnZabp8Cl3-FyN6bYIfj72o3tKqq8TiHV4i9-40HMV7RVDKRVNLVTyIuu4FPf7pJhxEXg6tiLWkQU6Q1HrSZ0yMu-QhOiW8MCHmn29yfBuAN2qu7a75eNIHIXRQgKTWRqpNeBrad7HlvSoVbbl6p80gfTfzZW8FCOmgrjCRrk9l7yzT_N_myb-rSGR7I0Vc9roSLCPON8IUbVvSzezCKM7Jt8OyzqV5Qt7iTeeAKKJpl5oXm2Wz9S9jCWp086eDoW18SZat_5lEKaH1a_vBqeAv33jRrgGO2k4v5oMaNt5FR-MC7jAoFsDGakkJWkezVzY3tm4RcU58WdxRTXD0C_s9FuvtyiJj5mpFm6tFaNdpL0pdCOOsTe1vDKx6vRVAVZ2PBwBgvzUMfEcQzOTSmaBW35gg4_NMskqvuTBCxy3QjKdVW8xgnPXfdUny5VRb1N36eH6xgDjbXBMj3iSm_zktuS4a_RZbIPbycj4fg2lgVhMrJf1dIX8LrZmCLmPb0O_99JbbcyMzF7NhXEkD_4LHG6zFR-_wr0_J9vXPCXbQKy_15uogBw3GiInvffnysIFYsAdTDrCAJVAC49PhKXjCl6OeUxndnJnmAUVBNQqbJ8aw1RvH-tJXJQA7cYjJRh3d5qnpBzlr4X4BdszuWKzYrcM7hEuFM6x5eYZLTq8xu2uyNo1zvv9NqvXC7jMelCkIIzbfkLGK1-GjPEB-Jyxy9W2RsKrMipbLau41cLjw3Q97sv8jUiF99Ni6HFWe4k20vQMPzPLbH4mrSp2pGZGwoe28kiM8JMHX_mDGrvXZ0wrp0D_ASHeEU01lCJZyNT-48P4wDVaNo05Yf0rhC73DcsRTfEefb0w90Bfn8uPUgULJKBZXgb-2lu_xlQvk6vkUZqIFXK__gM2PGyqYjybG8EiG4ggdMCUaHqsjvFzX0ua8Phi9X4mm8oP3Gc1V_kkM8ax8boFHPUqDry4hNlKEx_sP9sAfL0ZkXO2nIwzrzRUu8ufjUckjQHPw4coqz_90TdXIZdX7Uu--_JWzRKzH9oeOilWoGCHZZKzKpQt3FFaC2msmPn1LnzFGXgz1fia03YcZzl17Uti8rR-q_w8_sbyunLo86A_bKRtIW89pgkcEC11F7-OSoGdW34C0kgVRAxVg7_Ge1kj6hJlss5eacx0yFBi6GOOKNK2VQ9FpUhRSTVPDiCZItmQM28IDtJMtV8h5bsN7zU3_vVwHCTq_in9A4KGu3siYnLnoyHl0qnbeaxiladVu0m3sbcbeB1cepfl05cvxypKNYXYp6dCa1ovyyKvRkiJi_4v_fUQJ6T4K-4s8aoJAaMFutfmVDSPXx6yqYCqiwujCfzW2_dDV0NvYQdSq4c0lY3RgSOM_vEoclMnegLWgIDJoLbY8RWTdHBr7-GYtgyravjFCHRNcWg8BRfjEs2hJGciJmle7AiEpxCFUBu5GCDJrLiOyNhxjwzUm25XlbmfJqYD4qLUxu1gF_Cdn0eRM1thdFZz7W3GBD4DBf9RmSa6IZi-eBuBw5nZIvnwiIWW_ZOoy62vBXvAbxI3CvEbKSsUtT4xU0H-AmW8D0AL3jSes5WLJAYTaQPrDusg-fclLsmTmkOiodfUy4F_StqOo0AWtlnBIhoq3VW-nkxUDODxar07LzTYc5MLUzjzkhtB2UOOs4MwDDh6TeIr37WAOw8HDEaB6cbyNCjwHtXo6t9X5L07LLerfCGRhdxybZCPZJHXtsGNqENSQBUNxrxuGRYC4-L34XcdzHz1yMfGvpfL9zbJp01PgFQ6CeYRsV_dl6at_CsQse6JXclILQJRzMk5R-T7EFY0em1ipk6w_Dpfgvf0KzhohFJHxLDfJ5CZ_Fgrz3EUwpl_rUUv2ClRTPYHgaYaeAPogeLwOAnFVJY8F-K-Ba844bIxZkLAqrd_HgsmoH4ydUZ0Wx1ixdNpqMyr4ie37iZq4sONTYSHilr2NrGcE28JVS0f_tPMMtKwwsZRtJqPfv4JBeimY2KoRfA2KlAXwx1l0hDNJ4x0ylR4UJwI8xKFSdob694wUk0HZoMytQ609vmoV__NyRsqZ_T8RA9rfvF4Rccom7u6JM9WHtMVyyC0qh8ocStib0mzB8jgqHPNNetciMB3WpInlEuKnLpbsjlMj8EhwGfLZYRdxWouJJV6G2q50y-9t-NrcpeCRDnfmCoxkacnt7a2LvWfPBQTxOIoYkE2xvaw9cPV_KfD4tN2Ht2KoDlPNy1yX_YpVoHrwXsEZjfjVrPFegObveIsnQIUpn9zpdbYpIs9Eo1F2eRlf6rQKQw3BtqwFXTeOsj2fYeYQ3z6BuvVEOe_i4Kdjx0YkUjBTqxBRIfAmFozWr0qZ_z2V2KaO2HNyK2Z2XGgMp5eZfklfuL7c3Gdtc3Ig5XgR-HTsvAh1HCtpAww-z59GBBLPNEoGMIhm3csgQ4VeN54D8NZxvGnqcfb7NZ7CaaloTeOzIclPVorDRUzilFlwQ_LhKPod9QgrbWqayglvOArtQqRqbITCZKlV2ErcjdHSY1fvLajcL90YYQxrIkQLS2qS4R-TIP8SLmNSeER2rrE-osHh520ANEyCXAkCTgBcat36C7LPFaO_7N2oO7RE7Ged_fLQ-8CIGit8_40N3WcSVYW38H64fu0oYrLHpXOb4h_4xr2E6AILd6SSYWxjzvjT0JGntd-Hm9TaCMdFVNq1SVLbJraYnzfYF7hO2KG-C4g4y2fXN1y2I8v9Dy4U_pYnOCfy2DLeSvZ11KqZrPhzdbmxnG_6RFeQ2hO5hL_tpPGSU22vqfZbZQT_NbDO5NhB2XjczNE02T795uKqhrbifBXu3hxGZQx0R7zncwdqk7k13oT0DMSdgbsdaGkSsTgZy-JdmIDBbniFXf8kdzLPo8ibXSIsSxBYYkOG2rYIbqa9L7hOj5NN2LLo-oWadAJLzYVrnmScLzPbi5_zksLmy26tnxhPefuNUaZV_d0bbnFT-TVxJcCOVne0RzikNliBTjweqECnThAszO3P-Jx4SrFFh19V-QGDPzdUKmha0jLqZz0YuDIdr5Hfc58YnAnIHsKdBGDYOM4fGetZNXSnIr8ElUHA1LuwDW0AZzSleGU6UEGI0ZAup2710zIuaJEI-ooTJER5SvP6Xq4F_Rn0RRaurQlNTb-iufWXo_vj7bbMkInUev4NKnp_SdazH0cKlGQ9tNkjIwJQsKXExkvRyxXmSl3IhXS6n36q0RwsqDOgaBz5SUNmp64JJSwfOcZAb2tXPNsGAdpLQcvaXEa5wGqJs9Wem7IcOTNeYA0Riey8f-ZPmzDdvZ7EXHZMf73-Uwi6T9hS_9pPC6nJBi45O_Xey3TgMwjk3N-Fhe6yNI4q-GW1H6EzD8JCi5W4MKke58ql0vz-YhlnYzIRl0g4FDtoZeOKl4wRy75QuirwxMctFo9eWPgTlfdyMljazFJyupv4ydRY69-C26XKrUKfFGYZPadOXW1ud2OoIYUyvMMbIFTbDJbRR4WCgF-GwpKmDV8pN4qChm1NYVaoInLq1WS-unx8POffrzA5cbK-U9RafXaWvAc54NE9rvDoH5SH9R3EQqWHH1NC1j_XimFlS3Ku0gjWQHsQkek7ZJM_7BK3XIHn5YUXYGnd74p8xOxyef7gE_xpYBQGW1imXPRyes9f0bOSz8GIOnh_1R2ZlBYhFTRQwBFWaWTyXKNj0Wd_UcDchO6m6foOGHMhA18eZBkM_mqo4H5d3YJAst_qOFsv2q-052GI8qRdtuvOIJ_U-4wRhueBgwWcMSSW2cjGIIWQX2UTVDWvON1Q8voSBBsGQLprCYJXFtnr96a7hIlNFL4VeIjpS9XExXaInT6UIcSzISQ1UENT3nJDhLE2dkYKocKueCmHdtY0gSLBr6YRWXxNd_Pn7857F1KomRg45L1vi5zve-pEHB8z53uTrifZZkB72Dq6mBlXm8ly5Op_dcom1iFVmaMgce8CW-kkxSam30sz8IICMX4jyM2_WW0jbMlmmbFusuJqnuxG7Zb58k_lBNcrRMADLU1gTyDkku9wL-wdxUWI5157SbQlKXYpGl8Re_FcuI36ke4yrXLGUf3ztqIWapRvVjSe23fZUvHWtwPSY1g8mISxDM6_tNsdKnuyicTMUayw55tIwxCCYC8ns1XvdLJjN_LjhwdoATI9bWX7TpjXR2KgDpi6sdcSkn36DUFAOyorSFODiKDT8Y3J8tskhPKwp_cgiuCFxBVEGVJHgJuDB15Tqsba61PPqlYlLgC0HtM44H8G5frKrWOomAhTrcP4Bw53TyOW8e0OIONNM4R7rjhsPTttE6BfuRIxnHnF9FFDa_eAoFzbpUGbC8EJriNpR-Vb6xWnERlY1U74HbKCj70IcyfUMvn-sxMfzQi34ONoJ5cUFU3G-7vbm8Z2p4ugJ0eYrwFtuJkZ-dUG7l725bFGniPOhZqJ-oI0oTmNbAZi77aNUVO_auxPvfn3V1qIEbsJOxggIcx9N11YKYge_awzLIKvvZf-wOHmtiJAQX0hkpii8XlLafqp559xI9MJk2IJqzTayvosQfLWNGeJpojir5xEGQCx_Y-JE5BPNbdTx-XgD33hNXEw9hLVNbxoqHdIokvM4iikjbk1SYbcjchYvIoeNZCx0zSlT6QKbyiiIMF7_e_cHHh7ogqUEWFfqFJWJHKOOK8Mcr2O7H343zZi6zvw0_9QnL8jhx2XwVYCZBu0K71TwDrqyU_l-1x7x1SSzUL67Nr-zymsU61QHO6q1Ddh9c8PTG3DcNUgVzg3qyeH2brgI_iomluv5oRFH0BgYWi969dldbMYMX-8JsNJzxAh1SrMhJcfBWTuUcGzvoMjRqtCfsere2IJzQEZbYEXclSfCqEVib6Fw8M9d0b-XxCEh8IFIjSw3dVf4jRHeuJTr2MXH1RpNbPHHR2rWfvGIJxOx4ZAboSQCTZDqB_PevCdcywC64pLSSboL2cqZEWK16bVwZqYM1eEh1yS_d5uolYuLvEY54QRldnlEWcU4ZZsvcdHHFMfWnURcfNZ4VhSIfht8N16ccTdvGe2kgsVLuQKPJvESm7Zdk2s-navHUKZ1DNyWEzv7pNC9JN6GrA_HlD6_otbRCbsAB598t8naE8kSYbLlS4AnNQB7rL2g8MvF4uyIVFBZnwmnm4ztDP6CrZPTrNKeeLMKgIHYQUDpYK0BPrqQ9H1NIsr9cQ09h46HizKo70c5AT5osY5bcelCF4pHSTDSknsoK4h4ruvKDEPxmo8jebysFrjYCjxJIDE-VSRtXM2_cmRjxskvREm7y2u6Mgi1PGj_pK25ioT7T6uIKf3uQRITDLrY9HjaT8flO25knveUy5ZugD1q7BS19Bz-Q9iWJhJ4qmniPR0b6CAJanRgc0w_5Y4ZoK0Z4CmMl0ndhT3wH1CLcynSNRhinaDash13s5OsxvYgXHi8ker-5_nYJn-OxdDQekS1xQs98g7D2V3RKL98RmoTbUD6OO15rSiiU27Qs2UGigxTpvpittcna-adpO_aNMBrH43zJp6--NoRTQi6gU-LSQ3GGWxhq1t5phKT1dwCs82lMGbxKYA9n1y8nF5kENUBorPEr1uTIHkh58vEQoluDRIGiljpgCVAzEEwCx65IjDG6KK3v-QxIyT1WeIgy2cAHLs7F2-DPzDIr2mGTK5BN69XUSA8GJFO89TuuUMCmWxs_zDLANNfmN5t0Yp8SgK3HzmhTJbDsZs5bbA8eLBvy7xR9yGCDryOXnIxzi85NlP1jU9kzO2HyKsiBOIOjVNFFuUvMMTw3n9J8N2F__pXKsd1EPaMIl_zS3HNppeRnecDm0OQBuQBI8C3SJUvevaxvXTjDimNCv4vxQdWzCIRgbvBrpivPmJL9jmS03NQUeqbR2G5Mp8_DADv6MzGpKk6nsOfoL9udbeaNHVz_yNqR0oqTSIDLEu2x_dxgefMazM1ZIRoJ2Z1M_cA3ld18lbFQvHn2b55TYXoG2OQBTADiV7Pab5EylpsaoBId3FNhZQya3YRcDCJpDkA1_zGZZfW-sdrLe9jrBaTRFI6mmnjB7cKLMI5IwS_6jODO9J7XgIIwijhpvMLWabLviaGWG0XY6DjjNy5_tiXNnR4GCwHV2Xln639U1mznZ25XUiKCIEtFb6-6AWJK-s1Uqc_1dYBmeM0lUWeX47GIkZLzWwd511Po_GWSU4XWHVEJE_aM0n0ir-4IX6YFkoyyp-zz5BnXVGC1bBjpL8ZVnpj3-oIHxWzzedH411dpf4qU1dKdCfjE_iOYD7HKapnZVkzmYSBY-A5S5nNYyPbgi0JwPFsJDyEELkVn_y0I2ouPiogkJplApKzyAcknpoJZAc31Fb4H75UJVwYfuuypIF-_4qQBzTSmpoSBPlggiOe0UQkjDAHKtIPCwfr7k7Fm5P_XusFavH5xwGdCku5HxIsJiir4Gey8PA2loT7q_XHp50NxYkOavzXnOM5_1l_Zlz-eZsti230-_lZGrqQCiBC1FBDET2yxY3hNTrVurWJxtZnquRnVdEU4BPgKnf5JWujWiluU-FZQxR9shg3mQOFvgejkXUyKpnFBXbYbuAKRuexrqV94EhvxGkXuNT3hBk97lpAUPP0-3IyvBQoINAAlLjdk3xGPeYNPgbDleljwKrtnAaK8phJOWPl4xbA7UXgEv7Gqjv7uLER_J3VD3r0V0k8IWq6ljwf1Eb1AxVJHrY5ntXciAOiH6t1w_F19lA1n3Ogciu3JMqR5stntLcMFmDoN5hUYl4Nf0KMs_DBaDXvne5KEMcN8TstD71IbHZeVNktrngSbNlnp-11_dlL0_XmjH_sc-Le7s_guCS1ycssLyeL4D6KsGlVfkwBisjN_GcnDCwlDhd_mlLN9LKzluBmvBowc2S9BnZEHLLXaXrpM_WzVJKSjWZfHF6mGZOiW12kHbanot6mUTAP7XmLp7VWx5go-rNhknSQ_w7L5lVBjiLaW0S7uaNM3DPjA4SlajZs4C9IZ6mhODUM88O5qMOBLkEi14vXcW0vl2TjxM_cWShOi278ZZ0EK3x9rkIHwrCKFhL5uCKXmALbepvAhk76brrv0BsVmBf50_ZyLJjjU3IaLvTRb7vmFe1g6OBU-UBxwcE7pMFlBW3k_V1hXbtKGTKhU79uaCjQ_7KlgBg81ymwGWMh4WP4gTubxYKGLWb1JFhIy5kQ_VJkDtt__f6xBU_cUr-qxnfrJC-vBLQaBjKnb2QMEZi6tjmpnuYXohSTXvy97JC0w4Znf5b34mbqE1kpAquOHrqe9LcRccnZM2ywBKxJORyIWpbN104mtlryPZ1mDMiA3S_cWK9dDnBeAU-tcCPsXTeHT3WYLRVDsvCOk2khr7kPZme6uYAMCo9RDaSsrr4sRHBD1s6krfVnK9KwHJ8Dkt9yeIzvufHmr7TTwMWt8TIJ8yLgu9dtTcOGIto279r8UBUucg3vl0nRnz5cC4Rn2pk407BGat1ILcalL-oq6PGAgxgV-9JyvgFPN4-Kr2OiPxpQp_H07DFlUg-6RMZA-7sz8oAs9WCIgDsCuXBTvmjyySSvjp6n5MQ4XluSOTuWkTNapfR2_wLXFTEHHslvJ3Ubu9RpiO4HE5Uyu9Gb-CnTS6C3oHdBIWt_GkRqQ6AbLeyg1CLXKbFnsarXCKSBhSOorPl7DGbAjMzSK_7ZykD3wsR_vs1exfE1z0rDiomkuqNXoQGQJ14txPiqwVshCOHlcnHfzvSJv2vAFLup0kjAyUaRRvdrEMUuPs-G-UYALhwySLEfLpu6xeKeDWl32ZeGT8Luo1UwJfoyrvAmWdSGXqjhPXXljpggsq5SNfRZhOvVOrGuHPa9VgnHmqtRSReBmuRkThZItE3lyJSW3heWicJH0OVdDdH_yNPaH_88r9mL4U-Eig3oQm9J_EtXLHKiuDKn6yP6sbOqtsxuGhEIozH8V7ZSupP4XiyG0rOtTMYx_kQEFqsti16hTL_Lirh4XvkG29UDH4uL7K-F28Aeb1B4-y5HUdgLMHw8m4sV5ZrInTP5Phv4ta818MX4BEtHohLew45R3JdIgcSrKOvAjbv0M05fwQ2Mcyo-bsCDNPEP57zAaifRxefRt917HMqx2mIZYslzRL9HZ1TdtqLYj4c_0QksTnTk4MJhlqjEVhzbueCqho-gKY5hq52tnuFTWc5IyNsS8pPFUt7eN2mO5tEwIWI3h2UO1FTC0fPh_lN9OxxY0lEfhVEWY9RQFmkGD4rtG6qhctqC4fC_I1yWheQrFSqXYErloFvthF_8_fwavPkoKH_yo9kbqNEnjCZQv_VM9qtKOxzi_dg5OCZ3Kixn8NDH3qN3PN6LGXKaI3g0KYVAdCtfUImcxhzg6EKoedWNsmb_o-hbWAlLHNKjKZlf7DVZnnZaS6V6WS2QV1FZFyXsyLjpzrCP7crvoULKxxvpDYlBDdRi7asU-86eIrkeoVhk3lRsXbsCK-U1JzMi5q3-9M2P1K0eITIe8SUE0L_DkXNk3scPz297ogKybkm9u_KV-uocMTQSnWjIj-WyS-0phIRApxuyhlDgWL2S1udXjZ_mdLHzf5BwrvWvWPwZFl-NMpJGNLoblqhRnrCMIbP1tQw0xkj1tS2Xs26FH0PZNk16SA9k6jQKYIuChs6yTw4QM2d9_ZKrkpuWjaTaT9685l5j0Fq39BL7LsuCIDP8I8IyRnQ1Cx_ntN5QseBQU2AAf7KY3eIo6iueQfjXxf-NZBwE23qBzwg8u4hH2axBVL-WmB953tf082dTVZZxsh97CxmuGu2gngPAX7DN2m6uuUDmhTfoBYug3VYOWNUpmHY-JGe5wIYwwfO-CWW8r0wM9_2BIt1PKuEkh_9-fQnut3RAfZWw0N_wglE39iLiucKd-HBuWB21NfHjce7Xk-JNtt-jOquf2FwFkU4Hae4cn0MPrVbxPWL01uQwYjEs5kszxfXGQXMncc0g8kZfVHFnJy9jDSplodyHOVakqop9PRvf12yJkdDgKhqwRoNw6WAYuegVMkVJsZgDqAjcPeZOsSn_np9H1CpAhlaz-LBFkjiSxUCKlz0CwDjjTUmp01fLUs3Iv5DnMDb_SU50w61Fk50AvKO7kVIKQMiFNbofc6wwRHVJXIRMeOOdjJPkXH5Jg1EUMHcbC8SPXS1JrnpiGYLDyUMes7F8Ubd6kNn9NV-qzfibSbwG_03IXXYiWXWktvL1wImdTGviXhJ1y-fhNCuZBvVrftZqCenV0keaVlIGbD4S8PEkMyFBr31wzW8Yb0pDyCPXS7vV42h4_oTDIG1YnqOe2vHuczkT2cPFinZo5ikWlU61UVS1f7WfcOGxHO2DVpQatlDFajG5NcqCnoGo7ITP6RfuBgbu3GnQaYdjpl3ng3tosFLsiy8uBKsE0uDQ8tTrvV2CTqK7f0C7Kv24hs9bbXUfgqUD_332SSkEwpKph3wIcV_itXAAUZVRyQGrKPz2uiHDp5pKF9axynRHBaDsBuXxBFIzLag9aQAnZCzw3tU-j_vAPKKETh5_iFOWLyGZ2sTxeO2yAcyXW19Gy-JTWGFUlpDVbJ8konMNVysQjoZGbDi6qpWEUeg9AH9D6yIyJi93bxPlSsyDnV7pQ2spHh0TOZrmJtPv10dCg_q26AxlHbeCzn7Pdq-YmRH-PwaRzIYanWf8jQWpHm3XVm7VLX9u4NgG0vIRV5pDPo6XGdPN9WUHDNH6jndkzYJy-JX2sEbiesK-syZUDvEVK1px_fjT1w-LE35UxUwV7q2rQHHJBX65p9SrpNy-rq0aTfoIg3-fuhS40jg6vMVY5ztjEnTtH8og2cZHwIBoiwm3V_7HLG6gvjvmJaRjU3w3x3lALwe3NTDJyQJheF68_BsRofOwwrrghOUer-mf1pugEZeuOlFw-MyhY1JPGyNDAQGl2tK-FqOCIhyX_eu6MEnspe-XcnCaW8gRVTwDbE35ypI_XfRoPK2aKEWOTSruRLJ6pu6QPeUe4PnPx6gNtTtKBAtIcqs5AS2rCSnOqXABRc9i-6luRLL54fwPCoDXR5P6na-XvXA3xfOc4CqP4YnxupbZA9_Q10W8MlCaAAICi9pQPw7_jGMo2tjORwe_-GWfR2VMUa0M3el09o2I62mZZQ0AJi1zjkHeGhix-qGeQ0PaW4Izde2rGU8dh2rubhXlO4xaX-IAMTh5hqykLtViLLyBsWlCf0IEODmSyLxgVyQmKK6sti78mIkGX2jTRJ7oWTbvQykrsajCQCTBmVrZ1_MdaqxX-ZarHok_NPj4G33BOCDv-gZaqQEB80KgLFmZvFyuEShaQvxg1AP3R6hsQYXlaarTZhD-xTluT5YZ-Ri7SSle1SV_tcwLJqqIKxq_1DUgbDW9pJQ0gTDsANECQD3Qqp7AMraPLltGDpOCJee4xjm21I3dWuo6BkTNXpa15y3p0TohOMaudgyv38aPlqfm9uZwr6aMygtfVyxW6lFge2m0BPrmvlLFWcm2WlBVWcMMOjo2AsIm5bCOEtP3Bvag2QcoaQ7HBBvfZEuPY7om46b1yVhxmwBtwrkawDUCm45haDfMgspyuQYUfV0O0Z9q4ftXPVCaGo8-SY9kkMtj2kd6yqOTKuBt75IuTVZS_LAizS4A5gNLztB9D-aJiJgydcBfGNoUdfHaH-FGK72NbYv7jHV5AV0bm4uDAiM6o1ghaWiPCkdorOiNndW4pGjmpc2rpbBJxPFy3W0KeQPFT_GCA0eqSBq9zx_-8S4lT0Pw5_EFGN3X2NvwU_6A9zk4FxeX8juWG8Y41I5sP0yZ6_h-5b2RQqPe3BCY9P9K_CG4ZE-sfg2-i-XrAZdn321qv03XnDbSUmikQOc5Bi8BEhQJ_TauyykZvkdfbtCs-hUGaMFF21WgjtjXnktTnbPqyV6I5FD3hGTox0ZXWBTVQZSXaHPYOJBwuxqjWt9Mj4g2PaeVDehLWeaPNnpcKe3fdjbkmidT_PWBPX7IatcMLqCsUB2NSL-2Xpwywf1BmjlM--SQzC7b5sGcAM-EtRsMoy6sf9vqL8gFaE4dZUtRmyNA7OR-Ev-aa7AQzhXwuwV0ssIOF0JWEu7vbf5BpAKEWxLkEavMmTkjy33FqgQRYjwH4PlArqsQNGQ18fcrCvVkK1syyRBZoVwx2GpvbfEZxZ1Ax02G8GYzmSY6GoBkCY9drxczdAMGXnDQx43ZX1JokXRCMVm_uh0ankcoF0m9YGyMHG1GzifjBeOzUKNbaNO_1Hx8emdPM7QivIvqfZxRmYhn66athFOK5DDzzZkRBO5KNDV_Ud5Ev4devWjURza2nbCk8_ny6ZG9YrCjL-gj-d1-ub-4khrnzSkoJiKzdvt4jOmhKKAqo7yOVq9EnkF5HOCZf6NQdBx6gfKd_0Yf26-om21grDtcWgTZ5q9ZCBjHASBMEcBs3lmop2XBcqOOQeYc3tW7S4d2Uop0Lq7mqDIBA1m4hhS65OLqasIciGYADYX0msjBY2udY8EvrO8vm-qOHuFtDNaC4Ew2OtFE1AfuWOrCpSgXGQyIoEv6lSGjb4C7veyr_BRpgFobIni7pfu_lqk_UC0nBfn8_EEvEHHFGDQdCXIWwsi7Za2O0iTpoXMzFHtyuJsFpGPfd8ywVS6en4-88ot-WHw90UtHBOvaNv0e6oNbMYM_cYm2ar7OqcdsmDwKCWdnuXGr5pX9-a52WkGL5O2ybVj4Uht0zSLYZTbuvVBhRVfwa2sWrS4eKexnnWOP0MrfxCVcWtNReOdnFEOuEy2BZdfBt0x9sEnCq45dxjdPgdOtI3hrCA0T64hjSv_KfzWKzpygMyZkC6QMV4pGx1zWR4ou8gOZzGMUfZbnuhgUOE2a4fCfsAj8HZi32QqpFhMtD7AmK5WUrHwCJ-JXkKni_q4yGz-cXy_NUrgD84nyrWYei8NhyKJqknIiYrwQ4FnYTxOLuxZUdw0h-m3iyarkgSQg7iaktRel4JXbnYzpOxs4yi38MyWPFO48qlPU98-Tuc_22e18oAYIDSRlh-cSSABqW59MjFH6NVBTF1H3gEjgDQa0rO1seGA676orLjRqNx9ZVGVe40Mw00u6iq7ytbR639em9ZDNtQo0O3x5Tir6bNUUx595eIoi7U7q_xzGSz4bmf29jvKy6XPYcpCpJ6tT9xtE6JdulUgN3oAIa0upvzoHY3-IXUl9UCl78DZv5HitV1KFDyj-Bc8HJEioWckMylVRkUNoiKnFAtf_OO1cqa53-MtDqQXG4HWzRgYS9y0UO0Qoln04c-wTSFBa4c8G4xmbhLYuiFpITA807vS7-62cbeMyNMXBN0IdsNoKJ_9RVZAy88Wrl_xixje3UF3VD-aYTcRGDWDzLgfq7fv_ExKgEX_mm4siQ_tWnqzASL4YCOPFUQVyQu0htBv__lH1kfup5CZFM1GD8jSxS_mEh8VjIWQHOSqYZBlbtxqg93fXtwsQPd0LE2WewSW227EOkQil9LOQith_FncDsI0wAj4yS72-UX-v-AKed-LEVtYqzufR6ohuy_cqYBDJTSbncE2SMHXUtwG3EAuSnX9Qfr87heqdzXLIzSIesuwm-qTjFBRSNg5jPa1fBq4ATEFkfTFkgJyn7xbmEBuWAeRK5qfY43sl7gM4GHXUsRLReT3_M9P3Wh3eFpm5_2lBOMdB8NrAyNjuzGHlyX_OAXWffCGXzu5BcbbEoA2SIMg9oDWfUfaOhB3Ph_Snrd7lEIvLueyf5_cFf1hKF0DQ4f7o-GdsrLl6ahEwSF5nYhYFNJ9i3Ofmd7yuVGwBot4R21jcNJaDJeW8gYrWhvuXP1ZRGX_fYodIB3SWqQwnKb6zfI_kVAzv0lPzKMn4EEASERTA-yryYpP4_80LZDmIOCkU7ISWnLJCpzR7YPs-M7e1JTaDS5O7QoC4fcUzpbh6oH0ou_9OHoey3eH1v7Y0pDqLTA7gpr6wW7gpYxVcAa2xyK_EhasvPKvxkRb1cfRf_NrjseYGnTpkEYeGY2Uv5GJ5dVlVHGKkeR_nQ37o7RG29JbFGJ3V0z7gcznHPZRlI6eHXo_EC0HKDdAJ3XAhUwq9WVSMcVKt6rvBZkaIaYPfqcCNmh0rwTPiH-u8SIHuQQHPRNFLPcS8Q-JlSTWawGGbabqajzKKE2MUiRiN06wbsqC_kKVHLahPLp43Xl72YhMVTWlJQPaKxpwlajif81z5XHoL3zQgsCotcQhIlb-WUiqN7NpkxQvvXN45-TzsFyNi9YvzlkCoVBHT3JzvQ48Rt-GJKWcWo7CiGvEDmTK68rw30i_LwNQmKe8ERBMGTRRePKJTJ6k_j99dHyHSxzusZPDovZHt1-M8f2dws857kSwku95i7hqV_FiNOHpiKXiG7UA1qUsapvK0Q1bT0PopuazszUSzqNuTChSWobVRMCDhLpGJTXq9Q6ZA-G5etHlJ-n9qcJl_IByiwtl55OQ1JU2N-zna3-JsQ2FmAOdyONAhRUqOaQ4KajssqfpX5co2Yp9DmZL2UBVAYOYteASRGUISrXa5oEsfer3wUo8TSQRJMnY7u1zZzitVpK3cwijOdtZALsIgjylLAy632DwXynIsC54qJ2SiHVbFOyke2vkKz7uL5sxD-HuY4KmrENTMdcPhyuzVjgdyeChevH4172lNfdZxNJytp5d-sMf4ewgwedG8J8V8Gqq0UR2i0ys2lDSLRA00t-8tNys6NsIlIlVEE9GCJM7zm8weqf32K7UOtO2XFUJJC7Yp1mXvi7Pp4sxPTLQuBpAFgCZVL2LcN7Cpk_4EasWUwLkbFYXhl5M-LNHh52TW0gbiRjgC1FCgYPHlLjouv6iYNxBwcyeNrZZCAk4jY2fd_ebfCA-J_5ymskLjPUhR-pAptiYogpLUppHlOOiIlKqvCdDcm3WgUmFkylAQ0goymqXBoV0vooOiDg8UkqebI-yYF34aAQdHIvAmJVwTe35a9EwKFNZnv17HuF2HLDLW6GGFaPRTNGo7LT1uwhPTrquRlZwFsRxX2olWxarLSuqxJQiuzUyp00YG_FW7GUzWOXjw71ZTVRVTQLzPO1RW9z1DoYhHiMwdVA9i_1nDEsTQ89yFSvagOD-yvj9Jz2aGLyEwH-i6OBgd1AICbYQX1pLILcsFmuJxe1JJR3GwfyJp8os5PcfMnVAyW6F4WgMQwXhYSDg7tn_HlVUE2Y-H3fvNVe7vfjUkLE2kJ_h6cE2uy2ZMX73dBxwCIJXgJeHo1xNabFW8_5G_WIdafKDKBnpsjAv-DpzvwIgpuHKTnXwNL5dcffKiPNI6lcqgRchjwY_YkoJraJeOn-78-YybjtdBnK4Q5N0qFC4dlYyT6hzD2s0otuVW8_ojugCpaQjSWtEm_swvfgHxqyXI9gFOXHCZppXVNRQGKGJsRd4u7ng4nyEEWC9hKO_z6jbDzHRxjfkbGXLcpy_HkJbdtemY42OZg_kaVj5GJTt-RwkJdVrVexPytnHBXdFz7XzYdgQYhlGaeu8CPQ6zDETmtNpDn-kUDAjZ_MLR1pwTdQZVKucLTmsR4xq6E6UGGu1VMk6l72QHIZcQ_7XZG7pb86MomkiscuTTeTc77vLaJvJZNJfby5-w4cBkoET3expgf1WLrmfrMhZBi_6_2h-Ugphg5SxpBzWHa8YyO8udd8ECYrv4RDeD5B9GRwXvh1XZYeo6hDtambHwvjmOLJeKnERSRzeBDHQVGpQjMAf5UxK_3j-7CvdqANHIqgMQsNVEp0wfBZsCZiYiNdhWNDcx170dzVU9TgxLUtPhENlqAK4D3JI0ZUPmShyoX4wPlASp3Wd-mEH547l9m6RhJ0OBE3-1hTnXqoM24_lUa1S0hcGKhR9XOswN1-A-GQNm9aWeY-Jg6umX8eTpOp6BnONTpiEjp-FfSb5H1ED-XCh7efDA72B77sr1qvd-NLD9_pb6FiDCDINSaCuvFyxumEj4mp8w9OriGOQjozswbo0Mt0Fjr7BLSaRzDsWh_8nKas1EQ7qiXxibZxUpSNAnknf0M8SUq7J2s6j7E_5DvzyXoQwBt6yUZqKz-3tPPGGwp3mQqrAt4tnF7tvsUrzgKJz_tnhy3uP3Sgattw6tza-DYMjRLSdzpK6Q2Qv0RvLOsZc8k4hSX5_njncUySriWM56bdKwObnosvw9YLcBJVi4nmftNnsFEjnOlbZlq7PeKlPz1yxqI34m8_-Q8XHZIA1HEdnquW9icJXBslWwbeWU2StVcCsUfIX0hE6IHQqMbF4WpuGq1xeZF6fRkyKc_-ENd8dCHTxlXup17LD8pG3xCxjnremRRIBYqwJnk6BTkULqBlulA19-s2T01F4ugAhJsTP4R29aaV24Y4233FkqFM9tGly4oEs8Oq4NJFrcbuGmEQiQtuFVFrqJWdDWhv3pPEbqW8-h1oibdZfV-7oOFtEzi8kBhskb4GYXhWK-ZxYj3bbWK8FA7LE_1dT0eWHxrTtlpAIRBfwBfgD0Ujvil2ryGOnwble4QbeUhFLkTJP-peXlO1zbjlIEz5Lkb5P29LLIGWgXJHWB8_6xFK6DUvbHqI_8Gx66GhL4Sh0ApvrnZ2FK0eo6JgJipOO4qcTzz4bN-pIKqQNEcqEiqutKFzwTDwYC_HYIgmPXEOwKtdZO5kU-lW2GPrBM5J0V1gwdZXJ1snsPZe-zQ-e5qn8Brf-VcWRBxvBdgBdQ3TzPRDOYfWK-QkLVK95Gj1uS-nx_UpcPlfpQcODJxmt8Z4WAUQ5cRGzMPlDRfr9w8uidLBfUvI6pYQE9XJ89IKAUB3PUZQ2Z7RukL1WaxRdsJun9584phToKyaPkqRUr5jsBh9N4zpSMHTnZRfcl96zjmvYVIbC8fmBO6P1tFt3NIQq-jRLSoCUFWOumsyWQ3DrdsixENmzpZ8a7e7SWcuVtyu85tIfU0ot1CCXnC6ZL-vaFiC_s53RrZaTIjbXpTPnNK8JuteglYv7DhWU1pztQlK84TV_fKi_wKa-Zb67awuFRHvVQrWVNN76QzyYEn_VDbFpmmmQ9VuJm6KySb9Yv48_YjIlRBeNTVJloV0Wjv3acYe5GYwl1jMTrjRiYxOdKRMDh38Y8kD5_2w8jMVz-rvn5F2eBh74iEMeFggUHyVuAGKzhd-bwiVPRzHwPSanV6yoqjVMuNYmK_9468H3Iwp9vEHPddfPOTLghPf8O69ygO4GLnuz4VarosWGwW-1tAb6mY_fADFi7pAjfDmrTHf45Hxf80VHiWNMtUPryoOBEr8oyAEJqweMtFLqJ4PFNAqwOys9cqIWOsPRbopshwSugM0pjeoMH3xOw0gqZYRBaHHGjgmRmVrketAH535T8s9qoeZesA-4UMw-MY-1XRVCgOsd8FAy0CMb9yfzCyrPYIR6wnYEfOU7o-7kbyWGOdF6BSnP_8hVMlUW4oOHo9uVj3Bte9UycMk4VRln97zpfLoUe7i6yZ2K2G9ROguD2CJTmR6Q1BI2IjGORvKJdDadX-SFvLx6koSIjhVZE7EEIe2JiOJ6OXzpDPk6BYlF_Y_GwhZsbez3vwfpgLmpusLKlXgsCC-kMUXcurPoPXACKtYa6S-Bz4husfjIOaMCUXAf8r_7TSGAndTWIRriRYkYvitqvggrWGezLrORvzo_i_Tg7K-D8gN6DLPlLtvQAP4fbNWhgvicQldLfofsDbBDNSsPHl6wJde69CxFPz9yM9IWk1WvsOAImkRHVx0XgpZTqQjgJFFFDS9IWvBVKHWBIUsObNdOERMClPkTjV0_iTmErO63Zon87mwQJphwsTLKociZ87wJZIR4RzpoHe4f8ddZowX8l4zEvB9lLtwPOVj-ZUYKsT7fZxNFdjllx5erircFVCUlCr-v2Lw2zv3hlTa5itjEEK1Zom-flzrO8oHlMlqalevkN9HbqmLteH2p77GW8TJ21KvKeqNoLVQ6ETz0ECmfjHKht4gIJA9zTKpyUwbt-FTz_Vl3Z5EhKXtbzXoJQl-X9rMKOvMde-wyDnW0cZhtPAnxlKMg4aaCTmyi7xrvxy-N6a7qj3gpscTSyaueIywfi1G5tJo6Oar-Lroz1DJ-uXCtQYsQywX8MivvAfBrKT2JTnfB_uMQDjcgvY-BKfNUiNRCd3ab_lbVs7Z-r8Uf-YDlFRZ4JelaJLdyyME7e4fMnppkrbNxGySvyZFiHi4L0WgJsMJbVHbM8r1XapCqORea-lUYUw80mBx5FcLPEHl3ixPG3Z0VustgmHBakV9Um-JJMPqdEueyHRto49SOmPd7BuAExBVUCLyan3-9UrEcHuChzpei83z77gZbuRwnLgGpsQDjn3AYPJcKPXJJejz4n8Qk73flU12E1ZoBmS3nFvRaM4M2LyFGdPhOhh2Ys1owZ9HVeBTHLSt4_X5aknW4K4dZc006MIXrDAC73BNOaIECga3DZGDyWfJe0RI8YV787lQF-1mroz0qjE0Cty_iWU0KpE1LwIYS7RT79mKMEAAeAeUOSiI-gO9ms68pmA4HKaeSabPN8yziHAVJob4n2esBne5Fj6sUYZe4L_RFfKuB8rlaZEJpFRdh_SnRBwoHM3SC7X3nQym4GeNobf7_AlRE4DMu-qeEBuHnEP-i1FH81iBdT9UOTDpLZBFc0ddxQUTijlDiQ8RUKF2DpLhSSMjP6f8Uyv8ji9pDCfIOgvFapORoeuYVQrvLeEI6HuE00AZhTCE4PrrId8ykeeETxq-EKwGSVS2Mo4ojVjYuriKIWtl78jmRv6E2fLLL6JdCY3RaI6nHRyOE3zcf1AFRQ-8AJVZu9iDyghdynUSWS6GRm-T4R1Qj8NVC4eSTScoI_9uNW7de_uhoal_tSs_waZdHyJUUAkgZiGSlshRqQ1MU21ldtNGu2S4MxLQSQj0ZDqapxGXUIgsQ5CrovTHuVVSnRwF9wSn8H2NBJCWsgDNyGK_-_nzrpF1MdtnJKkSp6tmoZG5FV3RlOCISLv__l1k7_K7rK_MccHEcgp1-Au3tk3bTEjiKF-YV0ahlnUNH2al7avngROnb2c8xeRH3CHwduEUL71n65Jr2P7uXNm3EPkOsUiucFEzLUeVusqaqY16cz6S0YJYawl22A-aeQL88XO8RGLec-2-gmykPCrSOVaHKo0sYquncAFVPRurdAi7tN631dWFM-cMxsvA3xg-EPDY-SGwmdPsvqtTWxot8SOpQhABPGiNKlN5OOVjFQZlX4W75JUX7-ArK6DmScYjiNf4b45kwyeuhXescFc8ZVF8EAVlfF9tpQ5wAdTgYIns4ze01hwaF7CiBhf_vaL3ZNQv7dmnGTzlmpadMa0-mIOdSLsKuSWU5R0fXWsYUL4cnkWX5aURu9EIWpfKMW7-MnzeP6G-INCOxfiluiSCzpxDfvrPr0PmbTdyRe5Ps1aAG4EUk4-fbIaMHiM3LwF84Lj2-HkfuMytZXQHx_f94T7Ij9zNc4DqmGu3sm7GhkHrXJSshiDb4gS_Rzgi-cq8WmCa7o0HEUzJ-Ajzco4lQUXixTeihEMFNCn320mpJj20w9w1NqtDIm4Ie5kpwnp7qwyIelc_AiPV3_snqAiVN-B7hc0M6JjY1tG17piEAl_AQcOV8WvgEkBd4xAlVX5OLnrctp75KukaN_na7Lj8y4NEpB7UzP5577feL4MA_QFnFUfNcoQxXfzOjshNzqlx1rvIm3H_yjEozC_0D-PGwxainj5bmvk1kxwRflTNbz8UfgV00-t74DbZVgUcDF0hkUuY-kWSa9w4b2TBygkDbqxBkJbHKTtDaQu0GCnFOodfs1oCHEbddUf1HJffFkNTlilXP1N7OorMEJiPwi7spD0exvLbZUAdpnxWAc_-uxryKMRPb6QDhpD4n9U16WtYPSqAC9Lg5uD1BpA1-04_NKqp5HXSi0AQbeDjBRJn16a8YpTBBz2kJ-fm_lDfmTD5xv0Cut6Hb_sJ09YUeGUDWpI-bljS8rqeR9ydH9HZbsmVfcaIh3lOkFAViIyXSKW5LQTncbaDDzRWzuGKj0G0oKCB3Qfsb7OvUtTgf8QeHzPyN_PBSKdcLmwyC4_OAehU2yMeH9ZKocY7yUYo5eldM6WSARVJueX0FAbaS7i2H6NEnd1cu6zeIibPo0bc_U-Bm_6w-WWs2QrL9lbCAozSHHl0kBCMpqUUh_xAUErTqJn7Q7rIl99w3EwRyA5ItWF_xiLCUYfajEpkhd1o1t9f_ga6y48PLBYneziBNUI5B_GDdPJkiwtxWWatNNrFUQObU9kkqjw2Kg8R-5pbWb4tCXC3gzEBlbvqanmm4qMLIAVgEYrIp76FTslLm3g1hJouDWfcKPy8RcMK2FScnzQ7xQ2BxNcbzLzp3D8FQ5TEwQ_KKToL44RP5mVQGH_WLuy-3fPp41oYx3_u5dIGRyCN51Rm03kAPwYYGkexJmD4G3eQEofzSkuOD6SXlUmDvqfOZWgKPHObpY8udusF4DBhX2rrhY0Vt0FdInV5QO3EOMy_WobnpMOmswZoIIDqWnaBy5ew-i23HkspEgLbKAPIgt06FiCijcCMk62YPyiO9gseu_--p1IsjBIjhTcHFyXRKDFwndXvcyuUccA0FvHu9YCWiwlcX78ScR5tyM5K5x0-TjcQU0TPSCnlAmN52-XelCdCt144vtF3ECIhK6b1eJG85uw6GnBjO4oJUez6m9BJ-rVF_g-BwUGFzE8Mztmhe0WoxmX7qVe6UP8AVCmgPHR8j-Q9PTpX8GG6cDY9sN_2fX3L5O2hHX78EshnXaSb7q4S2od17et8v1G9oHb09oWMHgUMSyM8uDcxr0SGs8Iep38doYBEl1wxdOqY1i9NLSDvv4xuzw0nRuULoxjvqp2j5g7vgqAqLv17nrTXFJg9sZQKq6EzZI_NMLD_UlSJB_nldKn2qq9ciW1sqGk7zxrpm-EB8GO-4hXAd-4x638Y5wQGWAbuj7zM61ENVdsDNWbV6Szt_WRfpblq7CjY6pq4lFGsVKx7-JuoUKPKhL39JP72LpJCGRm7s_XKJ6AKClrsB-K-slupI0Q_jHVcGSp5YiiVDx0IYpXfdgCcohPxMqE3UWzKW38UF0A8fXaiXAVmpbOirfoA_P6axAD-vVbGpmcivrarU9TUXv-ssY2i55evUOCFsG3D3_X1-ISqTe9fQyRY1_DqkDvdKn1RG_MubQpTJ1THPvrUB8W6UXzjhDY26IumK7vMre-Kuv9CZDD3VRBbvZorEHb0RUoAT2hXLD__dgI7gSZKnRgpkl1Z-b010tQeLN44Fof7ZSaTg454Iz6DffndPwuyWs1GgTbT4RwoeoMoNYqYjKXNy4NOHDFkowYDF5lnE4u2jSSoOkg6iy3SAaJACGuCvkaXFW07WxBc92PigBQQv9_TT9pu9Jt3ZRNkZUB94n_a5uK2oLUCXZsLd0_HslDCl6OwZbfhfBVyjUQV3f2v4z-J0B3iSQXL_089nKYBpPFuo1E_SOgc6FxITJ3AN0TrGkqzXnBCCDa8fjNJLzImpmS64YfHyX7DnKdyO3AkJ9La_JolNnH5OhuZbcmURR4iyJEfb2ALrTikuBpayULB9TrcAXI1ZPuzm0qzWIzXsZwS4M4pqSTMSykxn--vjrp2hoW8FEbZdR1gcQygUopP-FEBR2UZdX7CZ0fZL4ewKs5bFSC2fptazjR0n5fXccj8LC1KnUhLRzFEGdUqMW0dJ09rzYmbMV-YUPAcpDjebn52ktrv7F9RrOVkDRFypQPYpov7JGKYoa5QtvsWeHOtb1aF-gLEWuMd8HClEzSuK-beVyzn8J6EXajRGQsRd5DK_6UE4Vhi_JCcL2Lt-zzOZgR2y-5fy06pLQCoPcodlhbh7-IzsJIDj2c_OWc4B0g07Z1CPcrnvQiDLMH8jaULiAYvJCcuPga4T3HnM9hCESM63UiVN2RtWTNsZsbLsJi2IwCDeFzcQrHbWa2YUVyBvxQ8FmkEUThzjaFze5Z9lnYIhzTVh-ZNjsIlycSGxIgatLsgxlsU1dBQTVe2n-ouBYqFNTUwjvVnmd70ReGr1divs-QnOEFvaQJzqIL-8vOXdKm8XJNi7aV74KEKmT84ZKb9FAU-tGxs6lFd6SkrrbNHpXKYoB0qY0J4DPyGOuXMqY7hr6gstLYxH8PithOkJesKfJYZpLRWcjh6u4XE7XSL9R5mB8ZE8-ILfSKVYJi8_BUZ3xLde8UK7dy8GGERfDSSt3oHXTbYRhEz-GRAdLfZDQdgEnnFIgmWGydoHcxfxbWI0SciLb3RAvvNgF9yGmXaif4QnXFUBbohu2GcQ5O1yg-asgXD3IZYG3k2nFn_oPxMX6V0KrajzZ4yXKN01fM1aXDfpftBxEBjfxFjGjIsfCdIKFGsvLN4s0PMDm9v7f4c_7hY0Kbaf0XTzIXTrBat-x6m5MqnyEvUMOUIsBeVuITk0bmNekm4lIm9IIG7Xv2jyfKx5C_jUHzi3T3jKLxRoAu5vTpmnwLqrKj1lCtvuksKVovURUDA7M-6FCIXp0SI1pjwKu6TUQyV_fr6-UYwTw7quLElrIDmdMgDdrXzOjboEsoRalW-T5rv8rCkv99dhgt2hbCafL2Hik6U3we0MRjrezVA6J9WTBSOdwA0qeWG1RmckZHZFdfD_fPV3zjK6GdbZ2d3xyGO1o9dlZpArQeqBI-iF9QTyiP0pEIiYZkaVJ0keEtlca1Reap8RZsdT7lPKNO37gB3iOf3PhhZoLoVgaKs5V4Y0LgQh7blZjc232EojV_W0chDa7lpsL-h_VaSoXQhvQBTDB1pm9vND8zeZog8rY5nFYa8wIOBcpJL-kTwI9M3IhdqlThTo60du07Wh0smof7BNVA9mQjC_SsCcQWYZM8fsYxeu0v94gQ52omrUoZtWNzJX5yQGOrhDBgJMobbGu6bn0mqipCLM5NNmin4zdgByhmF_yGGfAMlwkiwkrhvhtUdIbhspiFakfdpUlDkQ6FqVNFMcdjRGRB6-O8yQz3NxGTXt5C_p-_FpRfaowxUOUm6W58owavCdWWUsHlDpR7wwxJ9ntbJoLmUKIzxkGhgigA9wQbIIZe90TdYXe8M_rANQuRfe9EWlPo3Yq1yFqBfYPqJUb8ARF0ixphYGbDIrd0nr0RAR892dTRW0VPgQnrz9U5kRHJJhNEr2DVmZUr2llUTSmsPXUbsx7e50pAC5xvkle1DIN9Sy3S-fio4pfwunh20WhfCcuM2rFPxtwF9NSWkRWyNJM8TInp24U8aeHB0ikEMzZv4bFnC3FexMqz3ETwW9TVyJl85fPkxFOFf6o_VzkVm0QnO9m2spHJ4iPEMYIWA9utbNXAETJQQAK9DVp411ldaeCI6ciqAqnfg1566UygptIOM4888k5938QJ8jwLNOXZMjJoBO23eEje_ZeFMheDO5hR1bA2uKA3PSr8EtVgsRgoeXEd6ChWk57M7hXqQTew6ZWWVmV6BMZr-My852sXlII_67t0dXgvLx5dsR2HCp4im1Oyjn0yLKVIbUoiRbhTtGmWHuK7NxvNxAF3UdgNfXLE-A05D1aKuvisLg3bRoO_Gz7vl7Ti-KRYXHLiN-lrhA_WHY0tfLGm9oDvSH-Clvgb1JZoyozIwfJ-IJTaNyY4IYdfkBrkXGCCi-IJBcWUqStvrbqB4OT3Ev1N8GL4PdfMwCzQknDWcMJnzax2VjzudkGY68u7tVKG5XF_xp_yadzZdDN3yQIRmmPNL24O0BMhn_0nziwOhXL2Fe_iaXz0qa-t_dZRnwZtSrAp47SsWQOkahz-n_KjiJZYTKIxggxPSlvLlHAEhC6-fLeggmx6XTmXoVXXT7w-LuTIwtTvg4MWK1qfjw3aUjON3gNNsh0a7DL9_G09r7mIr92zefnyeTgZacmRU_wo4Ft2YWHiCgU3Uph3NW7IhuT3rGsZ-Y7zC-Pi7ExoGKn_3xllLoEApvmYimhJ-slVxK-Y8GV1J9pLfBVt1wwiR57XwNVj8b_LHUAjP4aW6jWNP8zfliT_eAx8SZDX9W0puWTbj84D-mdTPYIgvL9fH9p5elhyqmASwx95BiaZeamdZY9qjuc9bRaDbwWSzHpoaEW0l8y7ZX212YmIYjJTprpksgkkJtnsfFwa4wD1YBMFItk4FyPGgDJsDwpU_bIf7AKa0nhVIUGWxYSK81p1_jbXSjSiNTrYXVPQw-MIluCWhGP81cAf1MqDd-w8Xv537eLJapToC8sRl8tz2f2-R-A13vxUuzaoJbJ6at_wb3v-0AYAkY19I8N1mG2470aEpmxv56QzQXogyNOz5ZzLqG4GcMpprX-wvW69aWrNBh9K5sDRvHHKXLAaXFIlY8V8JdBB12LxXjuwHoOqLTutMcVRiu4sKXqs_qdr1Kq91aoIrbbLTIYEpLylcftvtxSMtjtY_Vtjz1xnm40PTHx2zSkVrp-Cfb1f37m29o_t6ytErRV2KifPHYcRRUTMWYXzJA3lXDuESnSivzW6DUr5PWpufIBhjFOdBhXUmiGvyD-B7DgUWRHtZD0uUU8-BTJHDVr5MEjwjnkJqCLcHLl72-2Q2AQ_W4I9n6y9ACHzz1PPQmZlGUPtu3mopT35VmC7hogIEu9hu8ZCsRTR4KwBDahp91bIMd4P2-2_lGwncYYgqXyS6tU9roMFhesgjBf5C-9lPHNq3RewrG1F4AeJjCfM5fpcV4J0s_ZTG4lRHucSB-dvCQwIihDZ7_a6qUHI9hczuqHoH0yupzwz12n-gJLyRLrq58v8YBLceVJLVAfob91UkVHK0Uacj3gy8GPVhXO1oFB-y0i6lwNktJAEFwnuEdUmBjd3w2LoIW7TTxSt7BpueuplhMLbkH_ApjA5tXZ2JbJCi3-D4PPzSiXEJ84Ggky-c7PnJSeIUAzZz2Dwk7Ic7UKhHRa_6ggyCgAGHYCCgrMg9YoisE3O4EI3Ko9P_FYVGJcmaDp3FFSl4rcAWGW25JH58mZXdhR6NEZtEFJZ3xBEyD4G3a2w4kvDobDywafDVbpeLvfxlQPeb7ytsGw6scgql-YYp64rkJjvUxtALsDqP3M-reuvsRCOlPMFNn3PQwbyAcObXncWADnNmNjpS_3I6ZFDBAMMoI9zgyKFPc95eL0nzUmxDELoLA99OlSE1jCzl-ZLlnXZijRIENavYC1aOm7PYo1XmzdQFfUfdn5Ng0856JQP0QOMPw1ahN64ICZeBG6JvDN0Zv6RG9-s0zAXVeFDb20XGGsHCUPcjp-OV8m9uvjfFIIKmTweKhnXM9d5qLBCeYnbBtH3Ymr3lxiPzAf8sae7hiW3yPczLriAlKekDzUMMA0LBmaPZlGuboHS67IcSQ5-rVDt_AXCJfQ22-sVJPgxDXpOQSQuEjeIPUrhlF0x3OvDXMXz6bPCciZ2AgQw1USU7pns-v-LLQJu98DPFSAv_kfYVXvZEn6vS8mybY9PBqDkruRXHIuavlgRjj8WY5QWwY2Mh2qujG-Un-3BTgxw9KoRD6_26y4Y30Jus3V1DkTbZkYFjuPtFv3WPUIusci2045phVQXbpub9twf5HPbOECxX2syn7GcboBy8ZI7Pt5dx8KtQ1kvQHn5Y57Um0gQCWcFkYj5y7KnVYRo60F09UYyryR1-soFuq7Em9bZfuNHIADgHH9Vowtdqv0wA7WF6eAE5U45sIDwb-zLWqRD3c1ylADS5YlN9oGviwh68IEJEriSCoKCyt7CSrSMmN_VZxlDpNnXylzL7ERLtuTBZO0cLz_zI3pavpCNbHhLZ4yC9Eq6sdrJWsdZrKjjQlDhyebKduWY13u_iEsWxU7VCXEA5wnCu1hcvco3DuDwex434yHy7IV-dc-PlshI1bDEm_xg1OZz8JRBuVv5L6FW_Va-24DrPbcQa2pzBwLAuO_Nnt6K6uqo2F6CziJITr8eYE3ITfiEMh-PSARtBa3QTf5PDxymh7FwnrXdaNVcG7UEvdFWIoLytueMrkPVAj8mkdgLONiZKnASWEZeVKAad7U04QjCXkOzyZ-W_qbohOMoexT7dXe8_rqO4Lq7Q07Dr9KW2QH4b-ac0RmfIybU1Aynkr1XyxYe70aZjs6X0aSXmcEdpm-ttO1neimTFiZLJqMz6yK0wnHDGNR4VeLODo0wYE175nfnGf3eCdG5QJRxB4l9l_keyS40kEkEErNT4frXVtTb4LB4gAh1eHkq7EK16TUVOOLqB1EGDZHBoesPu4slm16zllat1_lxwGJN7xHHC1gPM0rkeRN0LTbTywxUY8vl-YOX44Q-Q1KKvYiLT8y8DvfwRQcJcOj99UozGeyxxRq0n4oq-LMNMBUgpyMlmFx0g5Z1PmU4TS0ssy1HITn1JLDZ6Rbi8uOuNYVuU0hpxfYcbbtYZ_m11Q7KZfEo4DP9MLmzLjjDkFK65Pkigux-3_8Tb0iunCDFPVXVteoCncpC12sMZ2_l--_7VllhNwbnfufZsQruPnb_iG3CBFPJ0Fx7qJEUEPhZ83m9dtIwItP2BFsl-V35KdAz8yTSpC6V4PE0bTWZNm4ZdDj_pk72jUFgbmcg8KgHwpsB69CjLvg4lYT2amzde54SYh4BlRcddKCAXN7GpxpigkyOYJkRyFzS-5KxVAb7km2Os31G8d0DbE1XPhnrPtsDEIl47S25LXY0obX-eRcU55uU32pcYAglXE6-6d191wJAezkTeHmQX0Mrd63tGR93cSXkcniu2qbSCvt1dA-xYak_wme-K45l5I3BCH2Nr5L_r-sstMACi5fLesDx6p0T9zYNXrePz7seV6aqL-BhKGSojAR-x8reFbRPUixD-HvgX319_FWF4lid7Mb4ogm4ZHNlS_0R7lcIrKqiU793u7sYmYpU0Z4L11_cDInHDW2pPACTnitCJM0NYDyUblIYe7jOCT3jvK9-CFXewEKRCw70Txx2jBCN-NdHk8C4r_cnY3LRgKWxGAS7fSu_hUAQ1tToqCfswwoNrL1Xw9xEeUQUicS1LpWCeULyD72bBBk7i-hnw1lOyPirctqKLIMfIxgkeobuhzpFAKJORcz9s1xCH5GD_XPU1_xJHAN9svL2eTISKaXMcEyGAitZKrIIrB0jh3sWQW6SyR0DfJicAWopR0rZJdWStRtNN9-kWzK5emyzXCnBx08MZkadJ2DjwHqirfRfMphc8HdsHZSdAWN12qd4CuQn_VOu4FWTaXUBYwIzdrCMKtW62B-LJPdw2aQgRF8DcDEqeGQDv-2JvyfxDn_qPNXjQkhZ5pP1fyxQpO1BiozD9KD7rT9HXf7hJBBXiDvw76mMMWpIIGFU_f7nhZwwqbKs75S7_Lt2DK8QES0tzy7kN3aKi6WE0YxQR9FnuLHrkYl6a_slx1TMuMwejCre5AHY6-W250SOqja_HBPPDevzH_vkInLhN2CpIoleqFNmwdkMZV2z1Kpl2MAyL5LqDVvq8IroRAhao4CEXzWeksAJkakTyGcVfEVyvfCemwLqw6SpspBWiSbdTDhkcsjhygoRmwXD5b4BjXBS78z_Pvtda_lQkY75M6xWmpTaXAp5LMspkV0G2QuZ4DgbjQ3L9K101hq2DKNFVcBXdzRiuAo8ZuwoEGMwzAPsWqWQCDtLIH-wSnuXh5Tqkcp7IDEWRR7_ouJJHikMJyUulV86rhqSASltLvm0LGPwdClDMaVZnM-epJpmgFXvvQUQ-UQd4uTSLuUwPGXZYk9kFpWzQ_xWhuaGAZrl9ShJyFpzSFiTBY3Vj-SUKm1WYCYOMgzD3DdbeeDsB-EW848vruUzebFym9GVoNu_yTY_4zEYm2tT7uJEGgnZJ6wVj3Q-KkbMXWMjfTHrws2U1RiZ36HJct8tv9AzFqwiLyHml7-Wm8emtpzKcRFnA25lTEbuKkbchhzRGvrHf50gxCk3WvXASsoYMBhKZtKK80KkG9J6pyiJVw7nHKIamacuwGT6Vsxij5tMy3fH9fPJ_zfGzTgKJAkTiYpjF07G_keP9VfQfw7TFYndQHBw3UJZujegLCkjEqcCOMYxzMLLob0Z2omHD9UCVGH9DewcWYBzthTwsCyNs_qVX4sLxy6meSZZH6mLK3zXi7hJGoA68xcqHozTmM_xh2aGWk6XtNoPaEZaDWadKVcuu3CaMRNHPQkbsjQpA5oH5lGkN4Ph5f1H4lUeY1DN4I9OfaszKPTneWEF2YKVsM34aQnKB9DO_6TqcOAWtzRvXyREAKbFliBZIlQnuc0bZ9-dkMYkE8tHNDCc0fPIV-_EAT9S8UHbRWT0E5xxeM50ymRyAQsG8eG_BEL_ujKJYWf6Jh1l7XXZ76QQttVBVXk_8u_c50R2PKbuAm9rd_ZsL7ogy035cjQoFVzAEi9VoshxIQRu_2Bjuxi-Jypy_39c4XoXkQof75jLdi_locrQBUcVdfHw1ZfF6mP2LQFGe4dWB1UUQ1B-OsDWKHRmJQq34G7qEtlSkoDO5q4K9iYKypcQwC3Bae-jOAnYiRNw6WfzqaLSrOm1skWrO_QCAQj-361w7_Hy0qTqhWLpWzRr7WLKiZpVSInoZUHb7YExqmexnUeY2I3Ku5pPxUo8EDWCsImzYFQ_MXtduT3T-hK3e5tnKLcrrtD3gzGMxtrbBapw4FakXc2V3ToFWru5t1rWYGlY5S0UAcD4455o4PDjU_hpUP0WcKotK0ljamq6iqevZ1N2q2yVh7zlJW3itnIK7QovPog3litWQyGpyDGkPWt827A-tVPeEciuOHFfCpNYjapYSiKS4jXH0TftDOrxGQcNnjJY0cFC67JdRbySXubrm8r4XLa-dr8Gh7HEZXl38t78BxhsmPZ3CxLWSh6bVwsGrSFhW7cMnxPNUG67rkqNksPn7sg-HGq065sQzcEVQTbtT4YVqslcW8s6h00I5B-s5S8K3oASOn_8URKwK5yeba3rj6f5TqdytZkydj-ckuynGG4WMw1LDe6gweFHs-x2ZGAOojEJ12abhbSjjBaA02Cl7PGnOBAjLRLtcz3x0fQBpnVELV1NglktZnYWeSvB3NTC3T2j_qBv4B0Ck3R6L2fMuAbUasFP_POr-bSXDTSVrS9RCTNaH9pLq25pvBZNs0tjbugpaPxj3hqIa1-RsI-JKfpky9UZ3gPNnaowOjJhDTzR_sJY78QTa9JFmD1YLAN1URfgWYPlcK8PV2f2DIBsGkD5PPRnRX-_BRRrX7qIHRzb2LFGFQG2Ko4uag0rXk-d2zxP_nK2xG5Q2Ui5m0dDFr8hGvxQ51UGJ5KExU-nLdOUmzSjHy6_z-PNxUsGOstdZEjfpFdW7_fUqIUhGkQ6fiDgKBCh-CCQN7UQynNfoX9zrWgh38bsFRMzvnAt5huVlvzKYvA76euvHg_oatkR5RlxzDGuelcEHgAHCaNvWMlEJVeDCP_QxgXVuRi0uteIpWQYdxqB5eZg16ZTWloPx15w--qukGq6T9_gA4P8rxfnszMHV-4I_W_62mK1fjyJEc54ndzXMNIP_MlRm_t8SVK9PLaLA9uw-4LpC_dMWbKPb6oLNTG-5gAjolIOMxS6XO-B4Y22Dx5KanB4DmTFXgqavbPU8Bbsmv9UwB4WN7AzOgCIRX0Tp3yRtbyqJHe9FVToaZkunB3OIIC8h3HJWgvHTqm3efq8KzlSf8AMUOJerLXYQHN8d5GvqKTgatW2aghdltlY7F3wZgfdFBWRcPwpos3whE-6irQCxuJ19XIxocjD68NL8nEZfZgX0zqA3-Nac6ilUijBV8lBRNDg5Xy5xus4Py-UU-Lr56Z9kJE_zCAbeI02iUSNOQOKi0fvC99RbCbDKH94yyxGQ8s95XvM6g-lRuVyiVresO-POWDvng3wWVHlkX28Rs_EcUpzQbyea8VWd5K1lY1WN7GntdNcONFVmr4rZ1n6Xiq-mXsQFYm6jZWhyLLy93zQQrDSneb3HtwUV1EuGoLFG40dcALsuEKXz4FrudIhg6tLrJ8Ntyf-Wg00WHtZCnb7VvLVmQralSfUsm4TtWHs3Y8ZZeAuxwikHRIvFVwhKYhhRgxBo7QBJJlKUKFXJU-z-1y-X6tStMb4P4RkDomugPXcHXtddtK68E1ZpI8DltrsxGw_KT2kt3htNbl4hPyYhteUToWyQLzfSZ16ELyv3QAcY-txUKLZyfVVakRSo2YZJqXXHDugKl8YQkUkrfl6OT8qkxw4DKvXtu_7vwKS6-Fm5VRxyJrPr2FgXMfAxhBotyfsPylf9Jdx4rlgSZx1latcHfvWdOPJ8yks-R-3Eji9E_eEwIRb9zL6TL6VZu-Lbk2M6kwKDIooUzTk4EA2vfBpsinc9DB2nSM5oqV3KX9ySAVJdxKBZiQ3S3CxgQ4qo4NyUWAX5ZZxixtdocqF7u__PYPtjtYmYdB-gIpEfmR1YbheUzW8C4uHv6cdjZ74tpR-ZLMzlQfHR3tvCmp4kJ24P9mTOD_oWKduB_UFfFQyOy14HCHBMjsl6avs_7b6muQ9CysS3bUzB9ILprLkK-28hdCknrQ7tKYRWgPqhVidgBWepGuWLQooygXvAQU1k4WhKIhtik75KmEjNclZwrGhR47fladpGihjnhb3n97TXYEYub8S8ta8dNvKshVog35qTldXInG1k7i2vkED-zt6zEbB7_Yepfz6xahQWhWFQoEu84Ng7-1M510OkAhcz-9hInyj_raUB9cVdP-WatHTFWhzHZQs-5DXePmmyaiFJCv6waf2t6QcUbtIchN5XWGGca66I3a911lVBT2yD_o89CG-QTwFl1_txoaOJr8Kges53B74g0QD-BzAQxXudGkYgqHPICbyYPoKFV4G95g5zZf6g_ZibIy-JOx4dVSOK-WjF2q6K-p74Wl00IXtZP13RTefpo-DDA88Qsc5VEY98qvV9GDtyviTZmY6HUqqnaxFeTf91K-bTWSo7lbjdr96LIaewR8JWUIdV0hi80f84JMEoHQsrv4tYAwNHyBrhVmsbReR9-5vy5mIh0FIHKYFQdU2SE2QS56wc4LGuNbZi2pKxj89LNeMcK8KoqqIXv4qngYMaGRDSwLD1kkfmMiiGqe_En2t489Fu2eZNDlqzUnNTptrOEW05GTeKNcLrIyuYTCnOCU7ry4zziaNkcgiEKWsQiGoAw04mxX3AobO_bYR0Rh1nSXT7PA5LpS8M464jFs0FOxOeyWP5iMthUYIOGqMV0U69k13NA0kC45iKAFHqZe02zvCAYebQpDZpkdTDyacbJyJjkT0sAue6TAw8v6Tl6rfkWMMswfiMlwfu7BaZPh-MnzALXfcWxA15f5woskJg7NhqNj1bGo_112cDbr0qIv87QkuA5qtKpX71k6ssXpGjLi-OtOMpderRJg2eYRHCrLJZuRS6acOob7dVGBcDcyXOWdnHo2N4PMmQKlvTB5qIu19vgWu2hMx7tRGmUQxYQfjDi3wtbo9o9wEK4JjterjXgUZE_gmcoZVfz8x7V4BXX5j4IsT-vluVplf6r9Q_u42T2hqxJH96i7O6Ah1XaarSI2Bprzr-HY5dX3ywtynM3vMhxrmqiHAKrG3LIJi-GZ3s-2zJjeMlUOfqKCqMJxfPSIL4EMPqO8c2c_ehYbwOK9kPzTdtPYFDT24dJYYpDk9eujxWfVrnwy7wfn_D942yDIl-_QWvpZNanottUjcexqf8vx8qwFbf7RoAsalIOp88rLG9VAUY6LxUlmUdzLseQN9L5qG_Un-8A1Ak12KZeanEGlGUN66dBeFXyLsizCrPmueW1zVHYX27MIwhdlp0IAhweNZ--ki_w_LrpAAqMNUzFI1sbwkJjrylBaPt_c5Ek5KvG7Qf5HGrrOu3S_5G-xSKLHNlSlCuxduUi2ZHSXdEgUKS0y-3Q6s7Li41n_froU1kN4Z6bxRo9Cko-Ovy8XvDrvSO_zpmXBCQMUn_qPCMHROOuJA4I8b3tTpCwTJjp4oKS7MH0zmkgloogmlGGfkXRMze93bxrLWQeR2SfZzeDWIyJG0kshTEiyi757rU5ee4HPMRVu3cy7Q63fFnc4Q3v2bSTsd9rSZr_w_dfpz11rgNEnQYUaqJnMMX1AUcVFCbLAaGFTaloxO3_oR-Eh-JD_Yh0loJvw8c_DutUBPZtEW39u8dj106Ea_MxcZ7FM6re2C_WJ-WECc0zmeyfvSMk_0tV0-ro5gtAAK3--jGZqDNqyBBldv7GBWOWL-et9r_2ozZzJtZ2LjpsV7430qPdIu82nTt_d9Rly31VtuV-Fn8OsnCTd9YjrLGbSF2vRfcdeUmefgquKTOizJdVAVZ3e1O-8WDayjuhsHgtj5-rjU_D3uDDcrLJmIOVvTzRbH53NhDoORbgX_B1C_kZoiTzkn-MDryeMK00DIp_S1u4o93-6BL048-tNc5AtAj9PriKFgcct4zS7q66h4FqGwYerGmEMh1JdoqiW3QiZlQgtWLBSsqjE1MKRrxVU2PbTwlfW3AWHWLnjRJnhhIYQ3F4vHQBGpJXsOxucivN8i7KRigwonWoGNWCmoK9HL3g5Ynnb6uNsmeXfkrMBHCDadNwT2PnW45ZtpRcKScmNxFIRdTaThOSwZpA0-7M5K8ytMxiKJu1Rlyr38cJuZm_gZzsKemePCkzCdQDGJq0z_Kz8h_tS5uBSr6K-KYKf66qDclD9NVPzghNlCcH_ljdI0i6SaamaR_pTm6tTbH99TlMMGRwKsfo0sLrhW2ZA1V-tRUBxcXRXHyhS0yf9eejksUduwfn8QiVTq1FhHDJoJA_gz6b-LgXEQDvEuOJMFSnMVOFsqbW21xnGwxVoqbhsbacENbQbtsX7Ojldp1l0b7CF222CK9zqmGLMzYzbuoLAYQ9jNHLugTdPADaAEIionix_XsdxkMhR3_Kzh0QID1GonO4Jt3uvuJw4GjcvD_UIlqngX6SKLQp7Rh_GAS3lmSB8FGtSGj8FyNLBnxNjaQ0pWOGV_49ZXXj6vdC-iCUa5UstVHski6bVn7mrh-KTmKyFUjrztL6c-xhYRdAsHW0-fbbcV7io8hnT3TQ3py0Fn9Zr4dOwiF1NlFk6UUU2dRDnLEkpnq4z2nqMMhuC7ZcOxIDgJG-M-S7rslSNLvGzwkql7ISavgps8a7TID5m1Hvl4gXSAxA4wQeQngQFr75Fsv-AkaZpJmpl9-MNo2uUNilDhcO1oPA4bgADv6kx1RBWR5qwzLWn01incy3CHDR4XS06jehAddg4InsrsBLvt7Fq62-Buac7uallznee9a09J5WACagEu-fBnOK1otkZ4pQBV_rr5PQoMHvfGMXc6yTOrhvdiGt2wkIOvJ4o6eG0Em9gsqy3D3Dwm0M_f0hjdwQVSZZDwuRG4bK7_rcmohSIAplr_U_a-tMal58TibFkmfwQHGYc9S1A8Asd9b8Ptt8y6rCLHYpm-nLWxfe1WqkZ5MSOK-TSfDdBCnkEFwmutiH1Vi4ppt9jdxuXzYD6I59F0tYIA107zt70eCUt3-U5hElE8U2ZrNufDUTwAFUnpZCmQRHOXoB50vB7k1fL7pA5uGqPw4zjYWBuY0LEZizvNOrrtJiu_CZKZJn6dVIg7QqRO7flYZhOdGsduPD4IEIoUjELyPrVAPEJJvtuHzlx7xykyj8TS1dLeCxoSJ8zBN5Uvsql8SHpmiiHLts41MVQsgGNuAft8SgMJdjecZzWdn4ZKk0BRyBzjL2J-7NS9E5qc85mrXpyfmJyxCA8hQPhrQdP83H5yj4pEnqVbcwCTNlIBq6dJ8Yk4Csa6sFwGtVrqBUV789F5HEo3XT9LkK8x6eCNWehoWMHRtxQMwDzR8We7pF9DmX9XDuo7WFQ5oVUd8HtiaHgW6zmgj8wCTt6hXrv4xvkmNEqK62nEY8LGZ8y5vaz-e9sgsbFCH1EruqkjAELEDA77PJHzVRhKutafgwW2jBQJ1maqXyxKj4AiMdjS_w-muFUTAF-QJ4-fHNiuQxH9AfUYDfTtBwnqqcTrIuY45HLQjRvvo2gzNEbk3r8oyoEO6Iti9undSsAL-FIT_UlhkzqZiSsr4Z-uO-fw7OUPx2htniwScixoSkx3cIhC0DOX78aeB2nLdZO1NfumnrONQmswyUCmIkjaybEMAu4XT3HmDeZ8WLIySP470SjiHlc6D35fQb2Y_9TuXTvPk4BR8CYMkZOzd1sM2w43ONSymFvEWHOQP387juDZWLF86avPWyZSvwXZvNCW754CMK2bS2OfZhTFN_agHq_gEKZ6lUDtcGmgQDRC_sGkimCPL4C7m555wQd4vcXU6hwW1Ks3pqDzllSvs_ieV-BYyiQb_4ss3ikDg1e4bFS4mf3yyhZTo9MBVKERbXMB189r9efI-zH3d6CYgZLravcJ3N6K1s1aoZUSetGHPQ8hMuH2b3iCfb7xOo3NfZLlMU9VzFSlPTaHYugc_rL6RoNz9gIRdm0l_kYPcVnJngJahzZbFkOG5lulXWZ-K-VYs2bYsykxGJwXEBzohla31KNB3_KJyj4novwmxTdqBBUiTqTbNjV-9kSnt9BEUvlaBGwdahMEiJrCd-aOF_zMRnmny4_jquYIve811Vzna6MdGKIeRiqjwKTb-Wa8Z_gJgvUMWBjVQQZrAWw0aoRDo6bOTrNDF15ek9Wq09RUEDtBYbm2-LSjXOEfMbhngBMzwGng0Bc6waBKCnEelgOgfIjP2xjs4QbAT4RIqYkWpTfbVkpEp1_RwcufeHL1FMsJsmpVdBf1zFCRGg5cO32kdfdXnuCsLR8wCHfq31lMo9vVvrQEQXu1SNNeF9QDr6zriDDu5QuZmWANlpxPcP0Jut-JdJoEDYcc51Kq3gDXco3hJ_deeHmzWpJHiF_eibOeFoQPu51EKf_GNiF8mBHUA7z1QYCDw91acVEcUuSFcbJlR2viE44uThr19qrGpk6g-8zivujh1X6tDUKym1iMAATDeyN7D52r5EYid0_E_0WfPht6Xs6I3ezrSNweFdCG9hbQt_oKjSRWDLlLQ5jZF536xP_VfutznK0VACzx9aMNwPNdcIAZ_BtcAiS_5qFEGMdnUHSmU9PHqdSZAKr921pAYjao-I3dkhipMG20JPhn_CMkigEPYLUtfXmg_wj2UNj6yg_KP8rylpw2XcfZkr3OGoAKiUWoTZaRQxacUkzFwQ9l4L9VL-rcywjPw3ushuq5A31A0E4lCHlLAafT36YDzMWdDDQpXo8tmIl74-bRA6q0sZ_dqgX4OyRB_IAlX7DHzsWqkyUNTIBKtZLdQAS5Sk8rC5KbuDFMegh015LH5c2fYYE4w4eJPnUZUHnMXm-qyW1EEAldWoBVqW7KAvNdh5_Ku5uKwMhezKnaccCbQRnySmj2G5o3cHErApWGC7zsByqDfBqqTch1xQRVuh7yoFto_vrIyHUdxlfCbX-1HSzu2peI2XX5scdxkhdoP1F0k49Q3bYHxObuBojosZU6PdUq2tyNT1tImmzhNqjySRF5AM27wWeVUFS6-_PxI5sm7Qunbegw30KbmYlauJ7PExmcdosrfFDS7v49ucseZ4CK9Mr-VogSzb3bjDtRlNRBjncIRiW4ksVFd6JngkXdBTvuaXWhXALCJQDfD3NWa74NMJjqnfSfHeOCYOE_7035kvEpTPsX4uyHbyUxo3tYawlD1fYHdbc_wNubnATUqfMNtzMCdVQTg_XoUl7dpH9cIAlQNGOcTZF01_I2ShAWt3pNBnMlNXN_vD2flK_xkLXis_qd3TtQOJP7rC39H9DmrYsMffB39K8RKYKHCNNhEgIOX54zq71rLUNctMJunA8TEYcZcZeSdPDUiF88Pn8zb74Fwux7GvbUvjkN3A0j433x3WcpyCZtEOfjo7N7HjlkB3xqVH0M31fI3JiH2MghzXk_ce0o5NBxPWB3jNNm4zTT8_jrTUQmetGFgxI33M4zMkqflk2B0v1Bii8bdSCiXAjeio7WvscIxlxvZoK_IXkkHhs3sKUAS7QfMyvAHrS3pw27goCmUU9DaJ3hKkXgoMdf5PYIBbEEC48cXEGpy3RMlUVPv3F-cw6euBlGTmmKjxEI0e1EEYcfXTDem8eLNt_w967Nd5QurT60CIsS-4-smaNTMzOWyfH58SZ3d4cCBuv65h9dIuffHTNBpHFEqlUHi0uzVQd2jr47G3_3ZdSDmHbIvkwoooOflD6vhv3gh3Y46Pa2jF1KRB7d8DAqbJCTkdEY6el8WmCtvsXozAg_iwVhb6Z4TCg8mzdf1R54kwBfboo3WaQrwy8Z5ZRYCzR1YbRB5FqZ_kmG1z2wuHB_qk_SyT6O30nhD7q3xg9F3s0SvmMTJvEWk8bC7RHWce2OgxtRFvLyiSw9a_W5WHf0dL0EpyGegwGs1cHZK7-l320yLbDf9v3yLE1CueLz5cKiKn4A5pqfDHYGAssWbB74MFGBgKCyPGLGzbO6J3IiCY4cAYDrp8Nak2B1t0FkSBcV4jeuHNgpqTOV1xXgLtxaBbxNBqSCXoIzWWPdFRKQz5lvVUPFRKTB0u_JyS6Wx8Td2WWtMJ9oSIOL1fM-Fp_BVEZc03NBm6e6p0mSrtjOGrdRSF6yuz2UppoSGeqlNdIrjpfA7rpKDI7Q0zV6n6Z3v5_Q8TFnwAVwj0G1RON5Ghvkf8Vki5AzXm5GHTdaFBknBiJtepkvbZdIde2mXI2tUpAtwnH6tktIDcIXiwv56wejletCzDoZtA4tqMBSY3KFMDOhRpaZ7JZVaQ_al3pOf01R9Yn8rAkS941uHN71zvZny_tztXI_G9CaPXSmDxn_oNZvtCCuAnIxTvq8VC8jVqVQdefM0yPuEwRVAoBRH1GTRgg8aIEKmbZhKSGs4DrU8MEOMYFN30TluJYRvgcHGh-s-nB77B89uY-ZFiAhs1IUtNHteng6eXg3ct_xw3KxCc1xajQFxclwwhnXmcOfwY8I9cml3xL4NJjTf503tICpI5DZkh-LFT_gFlRCmb-Dw1PWpF5gsE9WT6nyjEKtQtwkwn3tHt8uKbsxVKIo-AndaKxX6R3ymgGx0lkmBhVDKaM3TQOFmzMfl7FgNiox2qEuvp_Yzzr1Zzbq65WmB8cVXf8SVv9oD8w0910kYmnH1vWZLr648kLQ9U9q2dPXSy09CxsGkhbPdhXhGqa2SioOmmsamKx9WNb8qgAPGxcy_tqOoxMH84nKSwClQm4fXCs5nAKAPuIsbCLb1c7by6FsKvkhZksJuQH63SwnF1K99lPxmwVgK1KRvrOpKBO6wALfcYKmbd_yauRvgjdq-HsF--9xpk4O7wjocIr5wCM7CYo4CQXTgrWkYFnr2cIxMexz8wXP8BoVGVw7JQ2vdK7WHVaqvACTUf10mhEg59E1R6qzZI0zu0q8xC-lnv4-IjfVHAszkgCicnQT7tuS7ZtOzc-kQJUD9sNi_B5BAW042dO80P3PYKwmVQFn9JTRwNU_fpxtDevSDA6vCnOhOBPvlQbzWNTGcQLSBYuATomrh-Oq6Pt7Y6UVKnlb1SBi1dw_gMk7Xcb_dd4ZEEqnUgAHwqDLJWpuCdbxdlPxctQ8_OjiVDQpyczaCWiZOrsA691VeFDS9BAaAaHOy8Kcbr6Kk3SX-2hoBoszRiySMAf34Orgxf_eVZGmMfE6uFw1RYGsvdyBszy9B5cdh9ezLDcZs3-lA9GM41MGw43ZdcU-GbGGGjcEXk9zD5T7gFa67hb3lobdXnTjsR2RmhvLy-ZRUFrGtq6dNtuObv9v1sQY1pGFa766dtVzooy2tZQ4A9BKuwLNZ3m3RrcuaQ0PYUAek0DSS2YQcrgg4a4LYM16GrYRpfUvCt9dltHkH5yuaMrdRVqwwaajMv5UtGXy4fbYxKTnxK_PLrl7adKY7NRasjXHNLzzufXu7oHXQepw3SlYGZD2c5_whcbOsFVed_Vz0d3z7_d4M9YM_o2n2RzOKw-IaB29Ik5R3T7oeq6v2Icp6aH6_7dJYrqmcHZTjVdNjCixqm9vU3lnFNbX8kgrvFqQIP6JSDqdiFC_riboHB5HwVxXEwPJDT4iFjswCDpKH42Iq9obz9RsZuxq-RWaiKj5txEAjS7ZrWXSKnhxuKq1NcGU8YRwDUd6sU0ieofb_uWkLuutngCTQgtwHLvySECdby_G_8sDe7Z7DgeXHJ_oZn3BsspYrfazF5QM4h64w_SS76Ib8NbM8b8wP5cFrdU_mnd69eS0MuZO09z16FtFEEm2p9O9hqJOqT3bg0g0nsiXJnBL1jcaaIz_XFcLGp7oqTs5vXqShC45FtWdRJdzhD6a657nLshSHhrOwkTLBzPfvDN9GhrRu1vWVHJ1ZLQVzJWYy3truhiBtT3JObX2KuSUNkBhE7iGmhLEny1bZTEfb5oTEou1jvM2OMq-GJB3tSTevwl_Jktek9E6UwwRVUb2jrIqZg_igUE2S5xxMzsGOBJ4C1yin4SrLnV7qOZMd1Yl746FcIZFdMVbJhjgKeDmnjd6NFzPH3nOJ4Ou6-_fVijvMJKOjOYUuyNTSWtrpoCG5xueCKd4oncC3_gRemU0fMPawhdBYA5lyImI4g8Hf8x4Hs95xRJaBR1JdGBVEyNfhDxPZaBMWT2Z2GpDQGcVfSM5VUTRFiq1ezOQGgq3FqillTmIYpaEjh0gKlL6qLfL-Dhx6T8jca80AhshiSB7H5WW1mgi69THMyLwY526KZmOewhloyr1ZsNs_-00wo8qjGiFPxA2zsBRsSIb0hwzNfd27k_86e_HKSDbTaLSdLUUyBdj99gRxIh9NTwn1eLacst5g9vKrk7LdbR8OtAim3LIMcWKmC9R0HxBiN3Cftp2MBE2x0MmKZ65h37YVWw3YACqqta1sL4u70U6aZBJ8_Yp87sE07dIkN_G2X0rGHsjM97AXsASVFBeJvaan6VBywpVlo0yI0BwK_X4JVMLPsVT71Tn08YclYX9RSL83SNtRJWBJYrueOkrAzjuf9YOmcsHD5yl3vikMBdlPlWxf30UCWFjigdpSCHtaLOk4xzTbI-4wXrbi0KkFHvyzqVUFL5yZRSXeQJillGkBJefAmsOEtkYEnEDQaDBd8f_wpcFSIJ4u5hDZF5sa4hTVodCdbrFFkfD6fR2rYYoLAQwBC3UnuP6lb8ecockPktRTHwCsjb52stRui3-OCkrEav-ShJE-FUEtSwJW_nuQkQSY3-vM884kRKrY6_oPui9uquWGfie8kIxST4e1zuoYMe25Z3zd2y5WGsz67gbnEpEQuYtD5Q0-yE4GddVzYUORmZ_AEZsEyYQ3m8cET2-7RU09CQnSu9YvxnNeud5_0pXkJBmEaY1oX1qTHJYGcn1Elcoad51v8avfHLFiMLsZfO6Jqe8yr_n_EZ96lk7FQ7tQAyzDv3If_Re4PxsErmtoOfXneY6G9JP4tMMcmEo7URWVea2m9o8bqC-Zv5H-vehVTn8u9xrLSWCiQeEqbujVKFTmvvnTq87VwqFUhtdMj8TCwHYBYXMeXn-xlqosAvCU-5Fo53jgsgPreWBfmobH41uaxnQ8L-n0-gwtwcHdQO4CLpOX0kWSHSs77r7gHfeeL2AvmdTeXFHOfBQZuF2sS22EEZ_Cpdg6hg2GbFYfg9-8exLuN6wjybG_WFnW3mNKsdPiNx8OTmPezCrCvYgI6NbTUEMr6dRonYO0wjikq71Mfm_lwl2ENGoIsSOIlW5Hy-3xq8K8IVQYxwp8i5T7Ym5gbC8e2SVvmIEvSwQ21qg9CnVN-F5gGaYFXzg0j-ePAJDFP9MbXxI1lhSuVIDxbbjm8Vib6egW1TOHZbgMPSdpL1YXNGtots3_IvGeE2XuPs7pJmhSzbfWsTeMxPQ2MpI2K6JDK6thpWdzf7kLbnqCi8YP17VFc_9evxFD35Dg4WcFnHnoTO0tZuM4oNlRnhGoj7ZsU0KQv7FVYr1iPCS8LK4zOGpGKN0tSmCcN7RMaaK2n3ui6lRMZo_JFNP71gSmVXuZFnNuT-2ivWFzr3Os87IuwreR_mMs4dSU6OG_okT8PNpY7noSF7HARDJpLvavJof6LFDPe5H7FO1dSfotttPqn9DtgZrLHqGZur7MFGEZSGt94P_jaJDC4yEaj9b6S7XpU6-Sxw5ez3TrQ_RhIIoQlpeOZUw4pKaVYWLUsWj9WithrciKEyiXZjlfCFEShs4iu9z77GGkCO6TKFekvooRkz8whPmnzR1PyiKVMcpXGX4nDIsz90MeinruaBQ4JfjvyH1W_731nfx3WWMyeYEXdiRI1QR5yUk8Rq49pVh_N7BveMY8bN9R1K5xfsShXS5nlSrg19kJPfr5szRIBJdiRDNGYdt9IqSFfBtqss37cJ4xU8A89xuFXEjIE3A-mr6Ka3OKCLoWyx-llZZ_2MuxHfio78KePqTl4H4g0IpEKV0MnFVywjFQzTyt9piXSJ6qejGitJH_0ERy88f4_jbEoYBY-2JQyog7SSdZ-GgyLVCzMLIvesesl_cOCZbiDnxB_FMtOSDN9ZOAqgPE4djs24ofimXKGed50Cw9qf3Yst1ySMXdq1khU60NVcEcMuuDeGR9c565RDSMjO8hfPoclKnc2IyqVNJizDKcNyer9_xAJQ9p4ouqSpc6by3uOEqsxwyssolc0_RkL1zo5VJKmOMtcsSC49rUOQ6NugoWn3POjhItIc9481cEHxvL_koHuwQ6IPvez9aADBXwGq-qAgyy56GYAEENO73OR7cZlcfbCAiiFRDRZB1aQSpGMWqRc4HZJlzLdn2WgVrsM4KFGN1f4jUz01HlT_pcdiNkWevDNZE4Bu56ORrRwND3E08_iLCD0xYP8IMRSEGd2OuwxFRtrSr8nBcvRx0zPOgTUoQu3HaFWtVOQbyOShBA8T5K0IdVFizhGAS7Qa0v8Poh6LPU3_VIuwIOE_FRQVZHSfspiXfKZaDhewFYTYqYnkKhu8xkkuf3ffjA0S5IXzRITazrrcRiON3wUmoHoTKo71BgBBVnodaSTI0KXXyRfuMa7TKWuO0iJ4FBD3kLy1mMyzj_QH37Hmw16ZcHp8A1iOWXDCcAKtkvDBA788GWDsgrWcFqH0c7g3PmIsb-UdrUZth22vw80rpqCp5h5moeQp-wvnALK7seY3aDJhhce0U2Ce8eZybeQcfUSEb6hnwl8Zjr1GVTTN0RNStJOJ4eC_Xv7lz6tr_IPWhtNOL1BmXrbtbzZ-CXMsgEQ7ZiUHXCYREeL0cdixxvotbyNNBNR1IoxopST5cGo-zWaIPf7RDEQ2zb3yAYMDA1EoCDzkeqyAxoQLaBhCdL7A52aove1thCbUlSCwvchP7rjtAJLxhilfiZtlATNY_nqTVuLHJfNwe5I78n68SlsLgPHeDjipnZJ9PpVGb6iWedx5Vhyy9JF5GjOtXpYWdwn9fTkxq-_sOQYjk5cla5JKjyI8C1AdDqm3hYMdY1f9pFHs75o-dnXacZCF3UR5_chObXGY1cpf7j8E0bbTgsIqqsXdhRWVjNnkKspgvP2LUC-9xdAaU_5BsozLBsJ47udqwKN01kEtQTUw1i-RXHkRIr1sqK1mk7cJSu76p1ltD2aCN-C8f7CDjeccMUfXgQhe17XI19iO234ScyzgvMVL7OaP0SF8CWc2GffV_yiD4QUlLceuhSwoMO9y8V8YLvpPrSY11S1BsVPU3LTuI-gBidSH_X9amGLeDvygeT_BLi5rvh5qQQMjHIieM-EDdJWTnx6YXvDMqRgo4ZTrH49F53h1Tp6RV0Tg06eV7u4TXHXPSSF0rRkWTSbqgDVUZwj3jsERUSHme3VZqQ01XuRNLPaq76SX9_5AjuuWVVzkpzkucnErAfSCCxb1-KNxWG2ehEztmpuT_SMeWRh_yMCsl7OshaFqdBr5PuaI-T-wE8AbSj2LPwA_zrssAlv4O2-LBtFJXKRte8gFfB_n9zxCoDMyAYj_8Fp5T6P5Qui6W-WV5LeRCBIk-2qr2p73IEnh_dDyJyRYVkAg2ZJtB86I2LZafYXjhCC1NhhXZSJK_idzpP-nJAYcF_CJTkzx2w1OMeILFwb-Ls0AHE1MungMj3LMbPVyhKFPZliKSZKkRAaIN1ggWOW-QZtPW1ST8HIEUjENDdhNPOhU4MZtqOW7hNWjivyFkkIxXxaxql0_1G892X3bqkR8Rae8SaoBOXy_Xz8kq6emigb0y3MX27kkTIBLjsXUTsEn-Fm5PXf7uuo8XEvtuZD5k_q_60CxLZdZwENh0rt8RVzLJmQa3Ki3m23UaCK_6KW5EZVyc2_lVBMnqFujTNbyEnWfHWaCpoqgZtawNbvb7TuNIr3fvctL8HT86gpn6wut1HI61B-MYheVxnrIXMW8QxpznwkQ67AKyyCYrEzOG4sCk6MjcFRjbA19sKJ7QrjrC0X64xNpP2BWvcE8Sy3u8aZzO0X9itcUpEEw6z79eX27fws3USVUI1njnjnHAH9dky7PpnTrl0ms2lTXWE2Yc3oTueO5U8sQDw190QTVpidyssZ5da3CKwwe0MzPxQizuqkYqcU1Euf9u1ArUCLTK_bOnUP5FGLJrWGw6lqM1yfMhEWiT9_QE16a4FN-a0Eyb6jKr1B_zFtGbyWRzjpg-0MuQR2pLIsLZ0LkO7sBBTaqpDRM_wlnSVFYALY8jXzr5lknMzyc5HE1NoSZ4i-EHtnLqxUiVgfDoTpeRzAfqxiuQDpLiKR4-va1FLEsjgXwk7oRo2NN1RVAmRhtfK-WgDxUWp9B45W9IdgmCrKqntEUwOeaWkW0eepIJUNcLk81nhMZo_87Ke1kn9kPkyMez-DECnR-AQGTxTZGPCpheYQFRx3qpzntkZVKWy3545xmHhyB0Sqo7e4HjL9S5HeUzoCY37FsW3Chw4J9APJhLHBGjZEpCGrNxXoNmTFIPandjTm9qo4NPiOA9qUBHOfFKs8Lcg7v_h9t7rZ5Em_-Kj3A9BKLF2hFbD2HoN402voA3RJcdNlSpPiMxwswcw-Dd9i0aeZ68oRkxnWxYvXnY9Vq0udKy-11oBQrK-RtK0TAd_Qntrm6zi1_P7K4hvg3bG2y7IqFLvvzJftmcClv80IAbj5gR50zvxljQgpOlU7BoQhUZu4GXjzM9wgoH3_RvxDNT6RdM_CCgjeYvJH6_pBy19EX6iVSjXzCzgoiW1mbHpofdjjUR4b_KiuO5nxt1t6jQU_hrpqy3tHOuVqP7CYFH3ve6b8Wa15qrTxNkIkhzTiaB9lgDYw2bD3S3oZG1NB5DNKZXrXDIqgwx0hmuxFybPDQj-pIS3ueP_nH_ewcdlO5jWn1BSjl8KqcrNEHTA8sMakybYMVTOC490c61FavRrqLqIW85KhqXNWXv79rTjOodW6kC6fIPmOfi1HE0FT3AGBWqR0ElamrwhzgEvhoJL9Ou6HR1uhD6h5aeQ1fJbM-Geztl9tHar_KAFoQNNEsFM3a9QY_JMjmTAR1nC_y4iClJ43otJo6pmDgVnX9zH9TmRcRq9Gd76nvcY7IXymVw77gZ6snFLY30w4_df2tsKiMc_Gh4SFvbaylO9oUx11syTJlnhdoQP4OrAR4U2iGFqoV0Z6GFJznDKXpqGS6MyEPDl19LXltmUbSXfSY2lJHvwuHIAWINcvRfwImx7nIjC9f0FHL5gfL9QfgcfrxmtIoK2hpFraE5lXyCdXt2Ul_5Yk3Ar6KqyEeeErbiCQcmotXHWLyZQ895jc1Oopp8UiNOdIBDFdzMhBhVCGX1ylbloA5s84FVjDWYGPttn9bc4uL8IBXzSjtJgNZEfLwRAGcPGGXMIxS-FsPHJROGvyfU2_nxNCZdbox8Wl001BT4W_YK4rH1f0QtWs3du05lLBPpVbHIB737Afg6FUly6D8_-XmdspbjRZIch0tk3QETHcry8RVvAkePXf6BjfZDpGjcnW37X2W63ZroajMZ80Yq4HHbreMhZg3W4qEQrIj7TKUgJ2ofO0E0Xf0kf9TFdw1M5yrAlcg7V9cPatFIaZn0Li9v1_D0M0gDo2uB01gOVW41NIQ6uSy_xXuEDSFiqATwA4BhvU50qRMfMGPZHdlvTIuCW2NLS4G3WtGY6_FAfSiNjtiLIJ5YSPf_B2YSt1nWE1cMKbh2kldRKtvkSevtrTzopLlY6tRYbot_0ACxyYhsp2keUe-lyMuBdmTy8Sz-pQrOUcWNnPcPwJ6O6deC5HvXQcGQeVe_3VdbqbTIb2XTAFGJc9isio2fIz8EDUAdEhDrI6KKLvxhe-zDYDcw53sEgDE9SsaEkxzrWBR_RSZTEKFkxaY6Enp6mDhOXIU2XpQQsjk4hS_JzfyNjxZfEn6m2VQcaMxB30HJpYXQ2l9H7dN6zeNeeGPP15rhZhPrtRRYZZ0C9YlRrSEKsq7tgPLCccLW6hUdgPU7rTiVzc4XlLO-HK0EpdC-B05iqWiZLmrVd9PrVkzYb5bH27rH8zWEHTZaftAA5e1a6eF6Wy38OJsD49ewSfM9iOLT2-dZRFc-gEP4ZrMhmfSg8U3Syeb4vxUj_7cpF5Ij97_SFHKO-HUl9Qa8Ftqt4i1fLCj5lNtBhOZWSOI4SmYBNkJd5plPba6Byr0YCB7FauEsPVu9ItK7STWWiCR8UKOPSBv4iif1yRoaAH3-H1CVeFxhI5_9dfrSh6tZNrDr1o0ymimX6eVmUYVra11QZtj5cB3BNrJ1gC596ePYhwRy0lvxrzTvugJ3BSh2UZ_BcXtxq4pmavuq6KSID-fgjGrpfNlx2T3g7uGveh66_ZIgU-KsktD4oou0WMhKfW2nslsJQNMiYANRa67v0uGlstu3sTsTrpD3c-RKulLDG5bSAXhUpNvRyteE8dZzc7vTCJnfzvbNvbszPflolzdWXKObJh_F4sw2y7PPkNLxzTrLjKW7PXYvwGHVQr-cb02xxtbQWM3m9GhdQeZWCN7KPbrdM0BPR8UngNfHCs-5DbmJqK9QLz0fb8_8DaWv3s6VhNd-uZ6Cx-5l_5QcwkJSOBl0fmnDQKb1uopbGdXpwWyCFTGrayLFK3KMI9bOaOZ6W6jMqdCvJfiZRZkVnfn2y0YGNvbmyHbSU9cZsufAV2650E-HigIxEiyFJf03PBHpf0pCA1xvr7cn-JiejsdBNh1A-9_E-zHDv5myjrgxo5nVb4UJsdC6xFk1weLOf-vO2lToBmZburo5QClphSMOnWhN6WAVAt_Dsppq2Oe4d5f69Pkt1UbBjJkcrvPB3otKXpEPvrfLI_EvLhlqBrjm8T-DGcv1wWrMq3QYes9F1StETwrrlxfcq5sGN-QjJirOFYc1ZlxB093MCAQxhR-lxuw-j7TYAS0qZYHm5JagM1wSTFDVJn-xuiG_TTzT5HYuTnD4XgYFYngCK6dgp5gIYLW8fs9KWPLT5BvBvGL3jhbDgA-OGlcvN1G5aL3v6WxX7VAXquQZxIpTOmU4bZgUDKqRPnoiNEPhJNaE7fB0ug8Jn2px2AYag-k3oDnKdmUtFU0EhbSTtcRBe3I51xRpoAewabTbT029HGsBAiIqUZh59M13eN1ihvLZXE_hD0yNq3pA97EyB5DdGQfIoemTiYBdUucXnLQAHP2me1lY-b3IuY2y8rSYcIRO5C90ELYhKQtVdEkSQIYohWTN8mvAyCnP69p7B276kpQVSSAIJ1OExj42Y8va73jKR2j9A9ppM9M04rBH-DAv0EL4whyla7hu-avHBown91rDOpR1y8y_5fIo9aN_58sYmhV4toTVIMlae_3yncUPJpZ_WQ9-a4EIbhFov41AI16Vo9zNTZwrxJGegElFYBgJ03gGshjUsYVav1n76jDKiokBCYvy6LhbRwzxpETiptrP8b3D0GB9JgkAhX3ptnpIx4_39EObqGYB0QE8HmCo942NsimqUWGvp3F5VgsBEWjg21G4lBa3gs1qQRe9CXmFXK_PzK44AwOHr-dRdewKef6WGzan0HyS0W50obFZ6h3j_dqCbTD54j1pbmGXiDoFtmgBy9wt1iX3hMZlgiA0bi-I966kS3hKlCV0rYQuWsrhOn5nv7c1DxHtUsYYXfQcpu7DZmEcigIB3WXdGTbOcrXdu3b3MeouCm-fJMzuuaB6GxjItFEG1Iuo6yvabp6T-IGwn2g5yMOvUZc-r3OAfgiVpNZCfZp1xGk8cbZQhC1obWU5L9B4P4cRA_z6okKtp_0g4yMJ36i5klCTEoDzNJb_E9zz7wo3oXcR5UjfsdQCPcgLpUwB17KKMymobb5NPCI1w0Pm94hzQrQPqAKbtYsuuaFIWJoH4ggGYMkEz-RbN9eWsy292v8vKXmoAPQUE1l-YWAfL7njdV-VfxiNVkgLEbGAuwDCe5-l1LFLiS9apMpOB8xk2ETjWwLfCyoGlHrqI_tqRmtvM-SHRlCtc1MXCLaCSADdxr_SyqzQW-E9TuwL7DrHgGvwaM3lWonX3B-TmUluQ5TJOpbj1oaaGCSgJnTdzGbzIiQTYMuaKifI-WJm3fdVuoZQKkI5HedCJQVZEK4pxq4w3Q0BlWFrkSmy3YDZKm2dRt1GcpLOLfTy5qkk3oQ_gA9KCRsL231Ab43LHAzTPOstNRi-QB-MX_9Kec3Uou33-tMAjKHxN9PoKHbSpgc0mH3uXPn4ZkFIPz8tnynnEl3UvLueTdDPySC2poG5RQxbrDrNrye2usUsX9eDvMgHNPSZrVuhZ9OHGbszA3xF7VucPL__P2gSncEUeu4Xhkl0yz8d_vc6rXw__b-ApSGzIOpr_k_OS7-o9X5RkAEU59zhEE_IGjyiA-g2bMYBtPgW6uVhrIqq3oSIS8CWr08DQcLUOZyTdsdVxyCpx0507CItYG3d0orahdypy0YA9mgnxPOkFGU-9Din7kQ1T56fbz2KXlxq5Sn6l21m1Yc-GfbDgwon--XcS-btxuOeEziQSKC9A6eLy6QREWJwWbEmsXXqf7a6t1EK0RkgyRZw0V73NSNrn-vI9iZjdQuOeDBRX-8ypaCMHAY_0VQGITCFZxOoL2L-rbA1U7FpzLnYuCHmlVFvGlZ_KuLKCsESvu0MBm72RLgujl1XhRv7jIeyO4kHnBg4hIb3wa8Eg-6s5tNUETqR5Z4zDP-lvAgWrQMElaMp-2nWkFwR0FdDosoM98yQPQZAUGMWDWCoaS2UJ6cqczhYurXTSNvhYiBq2Bwj3ZyKM8JqP0o6XaKOlK2oIMDdRyvYfKIWXQU7di-7ooR4m9xTcVFq9I9a6jpjujv_EzeA7siidcDJ9b8HztvoxzhtWP5f9CsYk4kBb47RHbdPyFF-5jv8_-uoFx7hJXlplEIipEz1FA9cVm9lVubZBgtop6n4xTXqeR5cSeFXyn1YNaNjp8BqWBij6-_B7Oqro5VidMcPI7J7AIfiWk--wbrkH_qFw2dyFvobyE65ktHcoxaAIcuRaJHpQCBiNW7WbyI7sfe-rX1oPFotTnTZ4-J1SphtaEA0nlsZzMBJPtLpoWQ2KPO2YeNm9A7XiOSNab8XuGDiMJHSo-Jc1c6yMhKTAVeneJtmyYGqxdnQ6EeS9XYpXbrpufnJMvR5SoJqKPK1CskqAx5DTDtNtMaHLD-QIUL6PlMUR3b44WA9n50bhXR737pbYW4knKEL3flnLWFO1V6-EZUYezcHWNNWmdUuJfOL2e1DVcZXp7l8Rojt3Mq7tqdIJHR1SL569qMqZTt_cfYaqajnLhYtwVFO5oRKGXxopSo2_z6U5Jd2Avbg9Ag6K4oZHnnd7bzjHvavTlboh5K9qbIWS2OKoDEeba8U3zX5xNmEkWvmG2P0OL-9ZCI96D8y-fg9SGQTL-Y2pQRDhKTBacr4DpIldVUJ1ZfpJ05feoB-xul6Peuh7-x3XbJy1hCLPqU1yMqryM65GQNvnYCpqh36Ew359qpNYZDjZdZSfMlMo8C4_VCyS-qBHQsiJBgTLWn7hc46cYxrv1J34BUY0HKqtk1oIlOVvZ3tzzcpM8RRyjdMtf-QZf-5e9HqdCAsK0nHtRHG70yQl5ZMZCIsTufaQzyPvsDYT1a-YrLtPvpExcDYWrn84puus1Gn5LtJCy8Dpd9AruMKCi67vm3EWqZPvUg-QgqNOfp29TgxYLlxWYFAeUsXItJIK_Lt65tGayjElF-L-BIenlgRx0kLWmpDzmAjs2n8PV2ohsNUT9dEEyZGGhzjnvXuv--UKJiPSRsQJZbHiz3Z_CaWq_d7EsIF2w5mHhG7Xd76GWizMJETjEJ-CcaivNca5XUdmbYoXwDmOX_VRUUzFqhMUVKnR90SyTPrZvnTKaUrEgRnmJ4nZg2GcwKEuxGGIlMxYMSG_7_bwY9OYpCJ4zdfjBBYZzaNeT6qZcPchl15Rt_tTCepGzr-25Bpe0Z-XwWtUZ8wGTKGrhRO5HO-BKNnPPRPP2erFj-uWa5e3_hcpic6no2tpv_rHTZWylo9Libh44rU-atigjkqCmVHM4Lp6WAeEzn-wBYcrrEpJVFYTMZpj-DR9RXHmJuo9P2c6QSvNvF-2nK_jN9Z0EQMIh9xISpVb2EGfc_8UvV7Jp5zmbVLGCnPa7ooSnWhZrU96Q-ajqngF_G6TCWYo72YZ8SUnXsxX_THJQAGhMBH4Tu7nmmLfaeWYENn_ZB0aXKhYvJku6YZKks5dfvvFEYashHtqf7sRAwjqzi7azvOkzHfCEGgeCxHdC2N9hRiUVqSIGzf_A-WHckWI8c8oFPhIgSRkbMVSKV1izrW7FZbzbb7LOSZKXcQx0KCg23hJ06cpdSLWvFmuNq3Nx4vr_2hvZ91ptuAN0l2oa8oQvDdqOdOTSTLNf0HPlgIQf7KTIkWZIxs9druCKMSBxYm9_Gf1jiuKt4ZdAthdk9hc-OMBxCbGqjugH5FkdOFYlV9I0uud3HDsKZrgqZBOrhq5kcyv7_MwYaQt0hDkGKr0yuzEhENZ8KPqDPT0ZOEuG8e2R_0au8ckJjnY3VOnro4flhvrHCZ0xhFNq3RLX_UFnFT72XOPvRMuTNAIaGUWwKrE4XpWE6Nd_6_pXlErpkCBPUWMZhCR7sg4lXEBHENwW2TVXykTlbPSFCtprvYVA8kgfBpiwM3B-BkE-WiZW5ezJLyfmAVjJcE_bHyZS9szLJIz1MUwaR2w6l-MYBbZb4goFq6RzDVycSDFiinSHzYvGksXpPQH1zpozP3koqQuVDODm9oSs9yfwu8IM5Q2x4Upthw2Ej7TpouI9Xa3JA2z_Qn4-9uD5MrAk5WuQhE_FFFUiWrJDcYMbuavp8EnuFSfTwO8l12Pw3FC8nQNTG0CyLu9Q9VAMzYZECiB2D170mWUD8mvZ_G5yRYNpksfPpJ370PpdnmcHND_9k9M3HVAbZXyLamkl7msBi4RzMhwzJ73fv5ofy_Mskn3UtmdP3z-QFyKEfGDFzwtrzCHU2LbltoxuTZW2mj1TTryXcj04rA3S3-f077uOaJRTtGd_07uScdaCROlGZNM5r6TeltDUgjRY-KHzVEUOl7PCRe67cpBdSJKN_pzIiiNMNyJUsUDxdiGMjcgbCRyIO0bDX_u-pbdZmfHuQDQFdd3ADEmq_3pG9nP9mcbY4t14OYXFBYnAIcBQNemadvvNJQSSIMLhEeeNU0UmTPs7oVPkjE61S4keO33GxXGTs0Q-UHVFBZ4taB9_XGbeP1OfT_rSR7pCCkZKIDSk6brg6V7v4xy346zAnqhxe54fAej92prGqkSFAYJ7mTUQuHSTwCTAfjBEaWxSvWX_r2ycbDA4-ahtpsrowrIDhpx_KUj_zzRQKRucMlosKBI8DzTO31qQl4DtELJk9UOzL0rHSn1UFy7JsjWY-p_vOK_FmDCElkRbcK8YqkzvUasDDocIzBPQKDZjwLOiI5v7_bEkME0z1jv-ZZ4tZx1kfmnFND3TQ85Vj5mVWcy5-QHiq_GCnmYwII1wPh_HZWgaGKBxvQ-S_DmP0QlioK75qbanvxfxnbMuMmTqHrKy3yW7ma6MGZkem9cmfpBjuZ890TR5yJWhuZ_9boKM-8k5Joy75-0hc3LE7IpiRJDL18skWSjv2HMZ-oz5o8wCCg6KbxKrMlz9f9ZMQU4EQUNzU2Unnj2IFEN54u6vaSfsGpIsQnVJrzbw5E0gTzSJfUjWY0ENJrhYkSfPlK9MThHAfU9evSOMUFOPPvO9t6-jB_G9FjYsAZFx28SR78sa2sBpKEW-9rH6rsa9o9shlK46d9VQoQ3v1lbqkudcyVLEHYjxPfQyB_tDYFeXzp3dAphCjL3-yVK4zvivOCG2qQwitOgI1Sm0ZAyiNGbsuL0qklg82UYo_RK1zpq6fdhmNlbtkdK_dO4IJUGgobD08GUvGnd4h06dt52MZDSYUReN-ROkh77FulQkZzAtQ3G6oUyysCmdqMx6eJzqtOfwuJFfOeqvSAo2jiP2nn_uH5IVgOKr0sxNLEUHdBARiqrH4MGTFXEwAZ2BmO83wRE5LNArNHbmF2eMtm-PBjStG6iiJ-RpiI1T1aOzrWRziGBz7unqXATwS-DzQKBRIz3aY1BParoXDXy3LtAUxfk2sQ6E9hjKwP2F5Az8GUYloJFOFDuJEwtCY8nSbITb-EyMMEnNwOB8t5ue-4j1_8pefRX9VzdjaBsWQ9nRPNBjKCspu_WYd8m1JSFd7G-iTzo-xVxSR1R5nJPzPIgBh1sLqjeu585pYnGv1ZXf-bVbuyfoQzeiiOwhY54M9Xqjl4xejrfbddFyPM6dIjsu4gKTULLgS7w4xvP0xL-lZLrQ4vyy6OiL-plpIcfktuXd7vHprOD2qmAF8SiDQKXkBqOkDgO9dR_QNn7oJg4e6msIjBL_IhPY3KQgrjskhBxfRRPkgFSFvtGvnMFyo-yMKUFWkGU-zIoLDootyfVuL8qpPgDRYLYqWauIN5RAgYucoQZxSSWiH1ArUUZx3IJMSodSvVpvswwmeDF79VAlTjAaO1KSn-O9w-PKTHwLh5lacf85ctkm_JHPIfP4UigP2gvOOKcl1JlRjtZBokOkFWD7uK_zvgv7ZKAG90y6Akkzb5orw101fd1NtK21cFh1gFKMpcgos0xLF_Q7vXAmvpzE8DYCxyT67s2n3MC0lGmxsqCcyOBNOuqHkRJ0RLOUnrezX5R-0d_v5py0as68a3_-5GEH735_e4fTv8YUbr9puThWjvyZ3KTNtSwxGo_r8q61muJmroRojI7jCT4F1aHCPksyaHvae7D0Avv5IFFMiEB8ZKbSiwU3jiNtkBjQ8vKS69gvk8j9mY6ak2rPuIuykGvTSp0ze-3X-oHfUKtyjf2b72LB9FGp5xQeEOmuGp8ZkyXotXtD5c62wIZZAes39QeOX0Cxh6H1QY155sbEpZ8AcMV3t7TGj_cjhCj7sAggRW8qAyPb6NFoh2Bfhhw3QG7iW6zo5G4mEIlAr31TjGUQdOlEoz16nzFJ-GzEISZKQ22NnjeKZpza7x-oUym4p0rDb01uVR1tG2Wuw-AyHE01TkJH8Pb0BrwVo0rZOZW6is1wGXuCyPtF_Cz85GuA7Vd9b3qRlKHaJceHfBzYJgBufu6ShgMfvMSKhppdXkxfZwa2W0EqBvu8Okv8MtO2gOfHVUuzt589n9dlmoKwop0F3bDNZxgk0HY0J6aAh4Ct2TAprN2p2Ec8EX0Y5K-N9Z-CGrQlsvd3e6bjS0RRomyNkA7tXkCtViKxp04Mb9QlFPPZFx7gNahovu43NThB3pEa8-F61YBpUT3jyjEng2QrwY6hZZv7O6eXdrmQZwyEw85Dz3TaLZxRQH_ay9OSWGu09aiUqYxh0YK4mpJaY71Qi8CvdhgD_l_LjsXyGzNxrSpEtxkdine-IcOfjbmsSRrvl_z7X-FVHmGsHia1OQ_S1ax8t6WsLSBGbA9Rpd-bbHssqb9UKTCl9v6vV8n3GkadbzgoU7UpnTp4u80LgwlwBqbtYN6M3liWY-isCTE-7q1nlTn8xuxyV5iURJ6NsCeoZNUYymDjJdylwUo2HqZIRTzg62b1ki4AlYUR4Ceda3WM89nTBWmroUOU5IJFyDR27ApUNVnThW2sdZTfqPZxtfDICeazcZPdZE0GoOC1ftSue-AcfmV3P2tQbl9_CUtkGIGUCajQighmVzFRkwDIj7Bvyk7Iqfm9zvBcO07wWHRyUu1lNEanilraMNOalPXqkHmR_Z5CEa4B2q6LUVwYd6BOrzDpJYTSAMLXC6UP_gQZ-hMbwtu3SBrbnOj42ja2n4laR-l_v3wbpJdF5Gj7X7z-QaW_K3cQmcTh2jV_eaJNonKK4buTdq04oMcc30WMgsT3PfNwVQoyMZvztayre269ocZyEN0U1L_88b44pTkNpk1UzhsRt-1VfeyVEAQTyI7AmHYsiffzfVvrtFdzd8Z-HiLl9OwlBecdqCvHmzmnXflK0ArjkqFePmtz4ti2nyg5LU6fz0yYJNzdBGp6xU2vxCqWd13x2QT8GR3Cv4eUukuBSKnHFxz4EQAg4qyC64VCcbTY6ekveWe6kqu_FGGJ5ISBQRLvARqbSGhRNTxwsG3Ksan4VSut8IeKMqvuuW_OgnKsbh47Z9N2WR_8-_kxrFTI1R4yU7ukJ0y88VeW_Babh_4LiH-K7igh_m9jc8qIzUPqQ8GdNanH7YwXLfy6WTS0RVsIjy9e_hEFuyZpDSXQqqHnUwaQWbgvAUxo7tCXux1REwrQem_Uc1qHCuW6Hd1jtKuy4LmXKyTTJH7iAKfD_fNmXWhLHuI64zhb550rm6DoxItZvyedNcO857NIJbG4OGhEjRXRIjYul0eRhBDgv53xNIx2HzaQIe7XrwwALZrqMzHvfjWca7rBHz4UewmflZ7wcuw6Rxlhg_2OaEE3lfIyDFUFgOMbkwYeaa49XT4Ip2f2BzEZDZz0Fc0I4Xb1QRZMcwPsO-gSbK0-yH_CW86E0es1nSplVhcGX-AAuapZfkv9TgrQ-Lv74131uz6TJ9l6SP5Lc9I9FcS9_gQ6wwtvEiwVfgzez8s6ROqboDpHofzU_CBzXYGcUxjYFfEFd8q5efNwB3ll376vXBW1pfnRYePF3a9-a29Si5QhHLzfizwa734H3rhMa317YAMJM0CbvJPmJX1qJJ1Tf1MZl1AFvT-RuEwHiJywvdAa7IahFtO6360JRPhg_n3rzRfEWFzPemWGyqjjOYT5QKrOxLMfypGzo0L-EyRpJLazeIWpv6W6jDks-rtugoMJLdMr-B3t6SJqrvVYTejYCI94Ple3OdnVHzWnToe_cSehhJglT9dHdfK0RdmXyAdsKcLOIXCQR_jpJLnEkPfwOetGYkZRn_nqZDBUmG3-ADAy-jKqIn1TX3R7lZSJNj4SyTQ8MSe2JWcYW1cOFmKz1yw1WMPrzBh1O__xuNsPKBfo29GXbw037KYbJ4j7wvTChNirJ9tqR6OlyYOJdq0EsZPMeTiJJEHPjiMs3WJT6M6uZsZrSNFB7oQHvfGzdevoOJaNQ3A4Ro7Uq9IbI-5RrPT6dyOzXtx_Clo4Jj-9ldAy63Mfd6WsB7CvTfB94910mjFoepgeaXBel-s_5W-IIb39w8XGZZry8TuuDEZihTgBdPlV1C1piUlRamVJgmdCbXD5ei45n4BAsxURPGmldx-o6Pef3Mzc-GJZrLKYebZZ8LyyRHqqBF7O4kK0dnYa-2_IrPmjCmczyA4dTMo5bTVKpJyCyj0uX7ASvvsQyQEFNNFQG56ePU1w9yuAyqHqS2aWiSGW2WERK0M621hF4ZGv21gOtIdZMuh0jWfBn8SN058exLB3tiPyfE06Q3TsrItLDaYTtRzlUR9Zy_Fa-V07D5pIP5bMeWIr9A-hN1Q3_-Wz8_ItWsKsxoZeyqEB9GTY620oXPGw-MgWsSaYXvJQrLqG3ZhG8qOV2TtDTho9krTwpmkPMKd7SfOy-MxkmdIpLsYrqU5K2WsPQvg8sqCkesTJ1xopd5i-qwgne0g3YISosDS7kEWnuP0v6fntY81m78utkajl6GpFOc8dtfCpgJgsT1ZIitlwDTHTDfpISTcvjlp42IARURWzTX2R_dXnjI10CeMd-S_zkD8vGVPfUZid3EQbwa2uLmUUq9grx8NqL9jEO-Ce41cZU-n26e76ii47sjIhSgXMUCYWe2vte1EVfVD_TzCmCO6dX_GFXCEEdkfefoIPHI-zS2-UNAYZTjFPmJ7waP35DwzFDUazSPu8T98h5_fpTcypeO5jlTNEaLrjsqJNTNRqLXusP3wPmzS8ef1LsJJJgQAGbaEXc9C8wGoq9REnyGt8NXh2T82ywUBIxKcpQ3jwrF7E8B8E2VpSyJEWHWeWKi6_Q2XwrBBreEby75avo7sYig15vB5guQVL9_0r8QLsRhbFXWAG0g6908BFTixlQSXn-mkQuoh92Ud4HAWN3iN7GoauuS11Bheu64LXO7LOg6tTPmmBU_rf-wj844CrADVcTgpk3SncPcOktt46QCPqOwEspZejcxmkPl558-4GEACVPEF1lGhXlXmK6Nw-eZqurRod6NhyLggem9nAfv0NYL0ELzpQYe9vL0j5U2R-UmPp-l8x8awvdoTHMPs7czGJ7S9kHy7zgiYU4r579AKSgD_sgEisB6DPf7h8hnoPrlAZl_tTtEO7GiI31YAvRgx10Tp1Uu4roGrwWQUNoouaOPyx6uNZ2z4OEYY-B9lk9UeMYTzmsQoxBIq3H3UvgEPN8YTG0bSECqlFuthe55zbLe52RI3Wj01TuEm9XJqyzHb1q2Yf6Ui3QAkNQkl7M57enexQuMn8mqVwGjQYhVURrl4BZLalhsLuKDB3Y0jMmBRrTOCDKDTvI-k71Uzp_apqT2PX7DzxiRWZgx5TOkjetoXsFuorLD5U5dulVO2zzuSCetic69EeV9FLiD0mi0INw-xjMBYgBkZD7EtCynHsSPK9p1faB181-FYr1QVePvSqwEoOcoz-XnYGApR6y4RxYHSRjqAxGqI4xuXNrN88ERTXOx4MwbFsPfLy4JTyo14nJ-4-w32Bn6a4_iez6epxckE0N6-oNitSj0Tmm7O-_pTIfd4Q5lKLcRDN3ZQQTJKxxKO4czdgJHOmf57ZdHkpSwH6sR4d8vtbyuiDmVI2zlAVkUySPmCXjQVi3cxJ5NLxxgc1VjMIf9N6WKGY7eQI0B68xeCmfuXuvL-Tdru98RsqC_UmnHYkU5QI0l4RCCK8yT5sjg07p1hIoQ0nrWfQQpIkYkvmt1BDhYz6avxX5vR6EsaEc4VphLI3dT6A154wWCDi_8OsD52OjgReW6EXsCU5f8FkjZ4TbSMjFexJDi2AdvX-VmbqPJMIe2vZ_IQaHhJrwPWcYTb55gDTV1LLtb5KyfhzG60ZEUYy_Kz5gzrWjmEWH5RdwsF-KkFL9boyxBIRqAumbauFnlrPD0vX1_jdiHiznKWE7CRj1nD5IwS_PSgkwxCteS9STMlKibbZSoo35th3JiPtxXTDgxNGay3HhZ4LT9mySdYrkjpdyRnT4wxsZ13l74n5x2JN1pqplHtV3_ZTT0glUfgSdM9azjNr--ZlZ2N9kp7nyQZhy4JnGVx44sX0DB9sTP_NosSG2_AXUvDF_BhCp0apP12hcb9yQz05U0KWAo2AX_K-6lsJp3vwsvCINImIsekFkjj2qLvWtUvGbFQryjZzeNip7RapInuTxFrun7mG5guKUvlqxpzU2VSYcUQ7O-S5Fi5EIOZGQdzAAeC1Du8_8h57belYN3h30Y6t4-uFpHnkLTtwRb3wiF8wHFYZgX8VNOP85Pf24Agvrj41RsfKaHRdtMFigc56e4PnmO1HnbiWnhkOZvmyeOYnSJXKdq8i-Xg2xUoHXFEBTmhLkWr-YcT00j653Xeq02Mr1bGsv0ic3LnzfSGy-QccJNpu12VnwYZp6MtOlUG3oWiuFNGdPzoHgQVhwcunv1Rx-uJyc5wOq5jHrBSnBedonJ49uFt7qQ5xXb55dzr-jrw2lbnMC4UXY98OsvzH9CZyrhvnftDalUO4et8PlQFgG4FGv7s1yd22ZvcB-Wi1t1mhnIUJ_ARp459blNZOVq72HshLW6YnKt6F54DoDav4YuaP1SV3ygJT0Ym_UYwh9BR_jOd6znXsCG1n98DbF8X6Z2C_4j5raJi9EwpgY2jHYm_Jz0uophZiYyShGUy_heBUf11le3QGnwBnKcFlUrGdwYOKADuDp65ycUl6UMjrd3HH-BjIhnHHTFKyYbulKuOKWI_udiqIK2P8P5nPIlukHqTn_TYsyu2mw3p0DSjauPfeu0OwwzdozPU6gUw0XnX8Ujwb0s15y1sYT748k3U1oqAj4OcC-dBo3Jqis30EZHbaXRBIwrOVeASJHu9nPFYXIvH4By8eq4AQhsY4Ian0H6tRfypOaWFoWjZOheK2Ka5CZt65XB3tIefYMm-M1vth9wJPp2terdv071-7B2EZYfy7Kta6QIfx9uGkBtJplZGK98Drf0-0d0fMUAKCFG1TpWKn_YPZnq84s-q5yPAZXkiu9_wEeMYdtt80vNnuohEQqYKIOzaxMOQhsuscocTGOOmPEhDteiyZgg86DVOFBAYG4hCozT8BxUBXoFvUhMMCxPkoVtaMFAQCacrvMvtk608GIxwX05EeQb82hAW2ynO-tekxMvpEqdDlepYeuUH_AJ_bZI9l8hIvRIbq7mh9L1709X9ow8f9jiS9R94M47mNTXtEz2Wc_f3ODpFwUtelIfgf37zNe7CL_dFPbOF-QrXcnHvHYOA5j34d0nDXUODCeVHjvSsxruMFvrkHKB8-Mi3tXo_gcRWpZw5tiQVa-VElow6M8vFfOob5O599rBrRLUbhpFj4U17rKY7C8LBVO7VdDFzox29L-9HtKmjq0WcmOnItV80vABuGxjgDf-x8cKw7xFIVKPX1VmM42v4osu9eL5d0jpLIYxz5VoH1WETX0HRUotWHIk0F66PQcRhE7RqdQ2UjR9O1srn_GTtNMUVXUgO1yGSdRC89srvhoFy4QQrc48p1nmXfjGHXFU_vsiV3ty0id-98mhAijSMD1CCIdismO8kaumGMAXwphOWMnIbGf6dNBOIchbhrEe9Pgkf3k1YCD4LKgYpgQqsTH45J3lnzzstAcPgoUIs4DOX1bpSB6Rg_0wFYfMrr9mwDJVZkKK8botAY4V5ZsoHYbgs4NKPt0knvdPlethZm0k5wULBk-qgXYnt4gLxpdOc98O4rqWR3ORl0VNXZnxF6rWrhrqWT6WyqAF_v6bjG3y1L3NT7EeiMZlze06qATt2tnN-13rxxdZH8vXsxh2LUeyPZllW1xQ5DapGZ5KUGEWC4uwagzZwrNUXfgymitj2NqcP-sv_e2OVptrcdYjAF-kEBJB-ed8DYjO3y6cRzpMv6myMyw0n_HY9eYmrxcCHhaUcEkQ1wzzdiLcE6vxm2uiedX4ymc42OrcOXavsa4JlnXLMSQWZg7nUCFi1RMAxq7M8cwsP27zE8g6XCaehKkZ4Wfu4l5jI_6h5ZnJDXSrbYndtFlmscwLFIA4w-PEyYRuR_mAw8p6Ynyu46ABVP51zFAbXiHsa-VIP535OggBJv82O5k2THyDrfDcboBxhaYnjgu1432LCsNWNuWT-Gf42r6i4DkdkvOHfdOskbL_M_LCBpa4_3cJOp8BVQPkWOJ4rpfiXrEhyuAULgVNCP2qoNBgceIXO5I1QVt6AQMfOH5A49KsjL4zblcGN8aJ0EQ0Y4mfFe6brHOooveSjfBfkNHUUyzmrZ5liqz8K2ID2v-i7GAMJz77mrwjDJF8RI5fCQhGTvb8OEnWpUggezNqb5GiVbXAUwDTE2gZm2eq_Mtn2To8ni0v_Wf3iTsZR0YvO0HWleakI_s9LXR72fnBPWdj0xG2dSC9sjTkpQs_BnLzANAcolVWRy8k9iZgEVpv9kW6-vtetxjV8qaGro0whGI-R-8Qv4y3dTe1E4zo16Dmz77b5VAxTng5s76yuGypf-KXIbJl5zSiiBuPgHucq0tHbVr1T9KpeAP8IdpInpZQoMBT_F_9V3myqg78usucbBtJfg5RLVwyUTlFOoux58yWILXjX-3LThFlxchgNgE5EkFYL06ZxtTAhBSxGioc4jOSYfviVlH7jJzX67_2TtvgokDkQhj6tG9iWknptcLPyHrUNFQ0tGnC9gvKscx_0BOm8w5a4AC3nYPe-n648PHNZEb0QWQ46VOcwmL2OVoB24vDXfWMX5V_u5pmiGFJyRkhtwUaqzj80i2DHkOWvxqSCtGMV0A2ZOnsoxWS8O_Ott6T5364XHSjxeQMgA_cDJrtNgK3lJee4nhtpW4g2Enz2Dg7rWjPOKp_rHO4OeuVvO1PL0aNx6dQyPChXKTu8CKyH3H3rbGmZPFDtl5Jz8KtiWmauXiTFh33sA005_9befmgX7G6jlBMmG0eIvFb4d_g79ABedcJSx_FvNYs39SedyHYboxHeNXFkKYOyAMyzYvpXSPkfGdIISOlLVe5JUxeKrVJQbu-sYxeYShgMZ_90kU6Gnd8RYSi0GPzr9nqy_uAgcTA0HFMJ5TBapH-D7EX1TriWpUzNcvfBK2ntP9KjCtdc8Duu9WyXkhte1cENdmLfn09SnwG8JdZSH-52PVFQoP6rTsyMxnaWFjMgrnQVNDshFwEpGloVghl9jcuxMk0sl4kifOqHstt8xRfi7i_qG1RJm-hpYw-VYiL8hwpOit5f4ji1KNSbW2YlEmJSwA-I_I_dSJvJy1yoT17IOpx50p-PagnFEbwfv5OoY9nSJqT06MQo7stYf8yLcWEKtM_0l923kMrKPJ1NF6DKqzOvkpR3KjHyrDpncO5RYoYO5NjJHRdO0XbnqOcNKNdvsxoyYIJ0tOuLYTrEaNoi8pYBl5d7slyYdGmaB6v4ZW6Vgbmh770a5hBQEJeiiqH5FfdUB5VPlfz6ZDpgFM79oc9j9zh10UaKhccyExM8f-slP-doXApzXhUVh5Kt1fjZhhZn2Iz_T87eXhoZecdKGdm2dkCDKxrw8HvnvjY0Kh61a5EFFZ7bUT2ST9jlkvrhDPnB7-rky8xDo2Zo1mcXeXUXEyFyR8YYsnoQzw_AJwu1N-WdbOJODxY6ujkGUUzr5MfVJyJH6GyQT5PqF8wmKV3II0RdOhTEccfnSbzqR4na3DW7Cxd21suJ_fOuRyaE6gkAV_Of0O5yKtGmlpksco1iysO4_iDQPVc73lYWhK5-NzHHY-3Ru2SVQa1jM60ms-pDP0E1csb2rfwCqasJQxfkchkHTTQgpIgCYM62mAkM2Tj-B9GHXJR7YydZ3DHb4Ut3AEB_MnVH5oHHAHPnp9FeB2tMMcRLB6K22emY9NiJfLjoLDupspB7HFcB5Usfhcbagd-LBRGggq5cDT3ncB45QcRf3bPhr4SghtCPL4JibyXUWAMHBZiUI8D6qT8YhZ5m4dxr6NTk6umArGKV4nj6IWWwXKtPkTXip3BXL1nfPrm44fL4bsKS1jDSfpT8lZHVksQcLHjll5Ata98pIlZ_eTASln5KkyAzs8XJU0433oW5OE7ntgBnNmJUrAFNPoDWHvO7ob9uVgG5p3_EsuaYPjmF2yRrv_3b8OLWb_xa1GJbunea4NwQ5u3ViB5RAMC1yITo3IQw5l6iyl9zCBGB61jSySW4EIoaApc5x-jvt5PVcdrRZxsRFVfG4zOmogRabAu3uv2FUaOtw6RwhM7cudwHux1shLeo6UJ5_E0X1gtcqMOi8XzD8i3jlDJcSZdi6yZtaIlmcfTdQJ6vqfYfpPTop07JZlr6DR9S0gK3mhrK84xL5QO923Qn_6qpRhQTzOwRGncqGFNwjBd_X5v5F3Z8MneQVcIuY_o3vz1GCN6j9qy0XUf--9LSvWl_wUBooLR9dlPVpHwpqjubjePwYcOon1ab8QIQQH2MD14S9kTiL69hlKo_d95LU68UcwW9djIyNK5DO4B8ziZfVLGV21PUZ3DUJ_MvFhcd2ayA0doXG1s5gb5740c0F5OM4uVTdXUTY9GqvHh0fL4aIVlPsFG3hxbsltZsjTV0luTJvL0xDpBYHMnvXgzxxAwbJrgii0dYFkap6JBwBGdb04UUv6X--jdTqqGQkNO_GsFA2jV-GWdnWhSVLKt_9EvDlNy3_1_-Z4omYw9WVMCbNAQ01IeR3onoSLcmdttZLoR8XR4KJzYe8pHLrGP07_qQ6GtuKhXqXhSnff3V1ed8_KMI2b10U5FbVWz0eZnu42LIbCvqoNcd5Xpms0p_JHM6jN-iJ6h4ObjHZwH1HBfP2VeypApCZXeQAq3Wx9kYs7UHb-SjrxWW0n9z6ysTJw0aScd64Oh6_0RhDN1IVsNHKE6i-MD9O23S_rIpw59q5DOhyyVMbZ8znkbrwFbAcjjVSYtOkbu_TBrn45waOQ0GhjCn0tugNJSg_QtUgI76PSRGRdvPNfKPhovF-y6PNg-F2c-u_YvGfaW6-WdrlbK9rOuFCvzPmaxHcmQS09ONaMI5nnqA8SSfC3oliPcdlWfK8Slf1ATL4SiR1p4ir5H-tZU6vcGbcPi50I3XgVDifEUNJUqwEh74dDWXYEXRjaTg2hnKo51OKb4SEw2o3YlUlrZ9QOZQ2mcezl_FnbRBri5VKAM-Bu_hQGO_cKZ1KVHDqWxHhsNfW6VjK6nmCkaUJg5mK1X0Nnfjih0EpVwNlqT9j_jmJkLyz2Pzg9_LKrW9JVf7CmaStlxIbRdq7NTA6zDHYQOSKkDkkPtN7aOci801v7ZSpUoZ1HgZLM_QXfFDjN0_O1lViLsc_NjQKfA79_7LXHo-P9ZUl__6vZVfS0ssoEuwcytL6yfRnjWa-Tj24u20_m6gTdO4Q6f_EUOOdYLAd4QFVKNH8rKkldqYxgLlFIYB9ThcQvCCaOkBz_BiwXRj1YamVyVqvVbM0ZhP9rINJjacNYVCMJsqmb0ZJHuUlqIFB8JLtLDP_YHiZIIwIRQ5Dwr1hDfDv2M-wLQYVxDxmMgdDvsYp-bfBMrH4JI8107iD7rzyVLyY4Z-ISxPSSVmhs2J7HXqW3bL9VUgh0-oCf2nHiiHJz4L2QMxj_VqfI34Hv-20I7NCd_K_2L1NZRUPJzMEsFFBF_Agev_FlbhuAX27N_ZZdT2beqzWdGPTwQgRX0UCD2c6cyJ5mSuyVVvL7F9xPYxlRYjy0f3rmETM1UaLgb1SykasUCiENtd86GM1x3GHHszjJuTxuVpuFrVDpPw5wgAldT6c9jjrT6dr6bctc_lBiGfNUYbCD_SZGVslKpH2oyQgpAizvVdes6snuqr-sA_44pgZpCXiAJ6YY7ZMTbVViol9EgQi3s7ZMZ2YQD9tybiVprgv0gd3BbavKsDdq85j3YgJ89-wJ0YvXNEaVSJUyqYwsitsjWMbfgFZeiXFEyFkGFxdIpyoNaRrtNVodedv6geTkQ7xdgtsiKSsTMaVucXHK2tBVkelMXGJ-P9aJZMUcTqx5ivMqUNs5Ebce0Ti_MTXbjhy9JaaF7wPkn0AvKbhynlZKd_rO1qOE1imJ8cZa3aQScSaFHTy5wUTjwDlFVNLXfpO2raQZpgK54uz2pTPbDJWsrguIxP1xtltHmG7t62s6kRDz4FvEtxjDAysUVlcuisKUXZSkhpPS5d4qnTEfUCTieO7-SlY_2_8CDjMr-7Up-6ChlVa5yhEkEE77-n7CaqxidWq48OmPEQ_-ci2t0qamJcAfRfOG8VSwZNi68m6McASE-hQSQ1flZm7gozNamLAQoNhoy1G4YWx-vWzjI_CwyUXqZDuViUxp-mxq1XQBGhPv6AQAzHc_t0LmZenjig1kygkgkm-N_b650p17FqzxuZKGgStRH2ZhPwLITbotgXfvfGiRqbDtOHZWvhuP6IST4B0pJTcJRccQvN2GJo4Nch6OL9r6uUyHaKyE1wPQL-wYLOvvysp75L8S9TGpjp10j-sz7Totg5ZcvUw6BT3piwWiT6Vgt5IuDWLCVm3NNxoSoC2v8bOtuOdYbWCHljLIPS085UtX79chPQka0irL8ILLyNK_fHzp-0UixvXQs0lT4xVjJJIP2uxk-P3VEkQ0En9ZnqeHbUdoCuJoq30v1FjOvLANHvVx0oY0YcQY0z8aNOXwb5WkgVi6yhXV-zhPL6u6KD2fGP5U_dOmNAcNBTaKsjxE7phD6whGYNEu69t2AEP9fwNU-svwtGkM2pgcDkxx9QDVEAlECNR9iWNQ7l3osMUYTIdpJxvjeO4jhl6OpQntXJqmcd2mokto6Z6F0ewlYywTz_tgw4NxnAytmb8srW0cyGCzoD97Fd55kvKBW_iJdXx3QBnxZQSHnnmeDoqfAtC3mr2fkaG78_m_ZDVjsE-BreA0Gw94No93MXBimPWpLMKi8bLhj7J6UUkVFBuyrHuMjq4jRVtNZFzlOGQrxCWQiT6dDkCy7BSxHX0dkp94AOPNx94hPrdU5OXS1OO9evS7d2Q6ia082iaRjsLr-XHBVRVoTR4i-ENxUNo0ykQbyZfr3Nz3d1a3SUDhSuIhLvs6tLloG7POQST__ENwejzIkFIpHY_yl_8CZ0Y-e0UUhjS3XUbsPzYGeOvaQL0qVA5dL7xW10PhU3tbpxHzX3y_DDK6z3vPpnxqTg3W5mpHrkRMJ7JGgcdsZgNlm0VD7lstUnokwS48_faW3riej-IeltI4rBelHvdxub6GMey1LRkp4drvpyWk7_ZgJXmYh2q5rcwcWfrYcP1-3HNagU1f1PkRm8fuIZIvBnncXHhx7GCDBC8znQEqflAdpQkiiMIJP-qxDNEe3e2KJHc9z3BiCgr9mBRJ8jZ1g8ozjQ4yjgoQmTQ_ZMP5bifVLwXFh7aDFr2Cxb3U1WRc6vHbQqeMhnYmruAVnh9FlNlmHYa221kcCQlWHRzjy_jYYyhBc4OeZFeAyRlwHkuN0P5C_zk70UwHzfm6j-sLKQxKnS2ys0cfjrjdT7pDEwT3WYRna31N3s-EijzmXyt23vXhSeJLeN1LgAISKO-XOyWH9EmplpbjRJ29niFOHdf8lxAIDdxlbYGnm5FPk-WEoDa6BcQrOQRItzxPP-kP2RU0XwJnjt-oQaUPqYGB3a9pO0m5GFGU1sJ5_FMJUTJ8VWk0tjv-OpI8ZL1fpgyvefU2cFSBKnmBDvE5_BNh9i30D7ck-HQsU8HSIH3FapQhD2bMC_NfStwk4q-t0-6Eej_i8-fLyo2CEecZOBOKgNXRC7seMAFtbnFH4-_xrZ7SjYnzssEUL5HVx2qBF4EEedS2vyFXkfnYo8cCdxY-uWq7mWQpOurSl5Yq9CoaKo-fMm5c_YZt3e3f43DBdL9B__z9a98gNnSUCpP9yN8KHfQoxgtLM1FhVpkIgze_tm8tRCkPMJYjcWz7vMoZ8Lfv7n3s4mIfi29oluCLaj4UrmoTir6Fxl4Xq6H-rb0P3QVLMfZRV7aKh2HPMxW3Zls8aWNVcGecPFoDZYDZZEKpondYX7Z7lxQ3-tLfAn1dvcnnu0qlK7dFqYTGvGaLJx5HL68V7xbGuwt-oHNu9AfR14YW96vfueg_cDjXg8w0j0kMBhF0UHdaKgPJljoZ01p15FDscYrfAMSS6lPzGwVtwFQX0l7rMyLy9u_9wu-ldwDsRe1RBWDeEugTbsD0e1tLzTzcJ0vwMkDJ4mHmW04DxWWYMAC-zfD8Cghte32kqfODi0D3RS-VD_k4wszOvQf0gBwmydeeiBpXCaxeQkVBtp6JlkLwX-3trpLLz_06uteoi3qYQTrCj7d2tc4UpOB5m8Rfkm09Tq6MtXp2G9wg7mtykNHK0A0ltoNKkGXqc9EZq2OL92b74HiuOPFq47L90JHoXscq3WMZ_HXx-dXvsYjnTnkVw9CFV2RsPQ3nrNjNaGr1GWCrK2CX-MlC8UonEpSpLd0-So6fXW4LAlitF0lBL2v5AaRy3r0gRA0TF4VwtUSSaPvU0COtnzX2gQYkfiIOzP3X9xByTHKB0kXHHzEGdGKtLukjiT3sDIIq5R55Q6IMN5QA8MH-_jm_tzLYqx-QrG7tOmvRLYU2d6x03G8m7JwLl1AznwI9tgnkwf_CioucwiyO0YZxDbv5Wt9NB1j-2jwXA4SnIWVG_znYJ9i5qw0ZjBXloKMVk1RN2c_rzRsgOKRy5qdfD4E2L1BuA7WKNVgBFffW3Ip1ljElzgbdMlWJAcYSLZCZ1k2SDyJurjMQV4sv_IX0n3zFtRst7DwmiRqhPs0v9945JraF6_OCG3oMupZO6Z2Bce_b9aVpUHfuLv6KDtXkm1oJQ-XuCsExHTDEGN08BeLbpgmm88tiY6fedimPjmB_HRjqRvGs9zdKIPRgRx5TUfpMccsVGKuvrcYqPhoNLjkIbORXS12e3wracd41JbCEw9lxU-JIJHU-XvkrCvIIXRpk0BCCYEKgRQK9TnrdBaW5kOui4fNssInArgKvhDxIxfurKxb_OLjSlPqiTqHQ3mpfidVdIUq11sLpbZKTf4gmFJl4ur46-hFwezSaYO7jkI2KCOpV9pDNSbdpB3vrpPGFsiouYk_a2CVJXRxtq9UlnYiiCnvIxSgnF87EC57rBYPKp4XsHrfjt62x7v3_wJgvMMaG6hZ1LFOPZ6lvYA6og6nF8yKpzKFgzh4k8Z8lxG1eCGwbW2Nu4TVo0Q83H3wJhpjSGIQd8t-yhgFdnHo5iKWYKV4THgUoIrEN2FZ5MxH_Q15bhbtsf1jTpscyYH1I2mr5_uki-LqjydDSNxbfBR0VaYmduBxdS4cSgYf9LiYb-Bx9vaUl0RYgGHvbAPJmsHn9sTrjs_FRw3gqEYUrQt6HbA2DGIt8Y8Ul0uCyeMPketmeEk8wA9KrCMF1ybUuyYQBCqT1W-HqcsF0NJ4BDQp2XAJ80PuPtfliNgxWyDbEspvhTw0XqbbMuLbPsh62QKrdr0rrDmrpj93Wnj_Ji0k94XETPwGW1n_DKzFc-6wSLqYh08kSsYgrldJsaIWoiUoLfwzMZ5IbD8LU0QHOP8dnFB0tH2lDIDA91Ije2gLmnI0ElK-yTnbT5y7_odTKCFTWwBfNIudihbCWJ5WBSXrweDqFeb9tQBIZ3TaNIt2xQfGRcuYdvbmwY7cHkHhYEhTzW-EQs4tK2vXnjiRpH1enj-6Sdkg2zhVYytJTyom-bPiebx0x2LWrvsLS6PM5NovQWr3urb2kiunXfF2FH66PEXg8t5GvUnODgD-Gq3o_YCcS5fwbst0n0_hij-NyAl5d-M9lL7U3xKwVtyrvL3hFJPtM7LeE7LxWXiu8O0tbi2YJG05Gwu9VFZv_PaaSD-ATs7_6ukWYHM8lcWJ3HF4qEM9et5XBLPGPm2BYHaDOI4lps-PX51Z21TU0mUmUSsDfT2ArlO32aW6EV1Pj_v6ugg1dEUkaVHExlEnZBEok0zi7rU9t-pGGu3W6w5ahnuZbRQI57zsMyLt9Db7aGACRERBzyx0zeklRDZJaQ3kL_wv7fLHGCjZ16o2CTU5fZ8dpaeIqMfYY13UOQlmpmzmt8xGqhBuYi3yaH4-UDE3b0MF9gRv5D4TLxeO4JTY7p4aO_P3hiwi_dcTuSFIsuLRNTqp8oKJXPwjZSopvCRCg01H-sDLEHZbANoZe4JUOOIl4wxqiMxc-KeGFNn7NOWJkSO_NgLyApuSSjQbAd853IrmrklrO8obsA3_jGJ-swt5Oc7CK5urq0mDueNbVDQUSf5ozA4jXx8JVpnM7u5LhGKH1sM5l4fKt9eoXYFEYMnKyD-Rl-W2pZrIOEQcQGGIfAz0W53cnBts9fq2sVfQCdW9AbSMxuRypMFh_EiaD9Z2zUjKQkoSiwiMVIUO_4r9K-Hju-_-Za5ySDsFFiqwG-FtpzvBE-xjn3Ek0n3Uu8vZR-HJnOteiQzNHSTCwlOwiJ8evjYQEQsSqV7Iwq0JBgW_ks8-8_pNu1Rs-LTBGPgRdxk43CcjEprdMrI4pqXrxuwQYVCT1qrMsITCEr9AVup7Jdx9kiw5vD1xPfLxdxt5fvlh4CHMeCccSiCKd-QAuqKIy1HsOqK5Gq-ZBFVJzoYN64fZPXFR12aqCm9k7hBWoVFYEo6w_0C5SezkpeuGbY4yVwuH9PiY11v0GoVnp-FCDovweMnXQuxuW8heoiftYaqIzZ_QbgZnWzwF4QJGiHEpdnq-yzLrbNTQ2RLSGlxIc2zPcBfzd6IEGIKkw0fSYhMGucCRJlECCDk9jYFlj8_I9RbmW4aegAQao2KymuhBabP8yiKemGJlwY60caogvC9mEkwnR9UT0D5YAm96fRZ7sBWTADkPUfMDez9AJLytOXi5rA55_YS0n6zurLtVG9GOxZftRty8JU-xxIh61-E5bdBwrdz4tuqJ0hVVdhowgJfz2ZmjQJm0KzzfyvO4Imx_3iU7ioMyhARig2YGahhIcWBZEszbjZfFlcBZEuCqJ-aQDDpQ4wXdwvh-_Py3gmG0n1QH3_b_LhtSCVgI86ZX8oav0vZYePp_HiaAlTZnPdK7McaUKqQx6tcLQBgHAO2anZ27D976GNr0fQ3ubyKEU_3wIwAovw2UiASOE87Yhg0ws4V_tFGtCXuuXTAtpCP1-WUnnASWaf90V5SUhGuD2tHetZ1QcZA544xCeHMeH58-go2tYJIq6YaptoZxTSEm6wsFD6B19pvO4hxANb1lebE1HjYHfe6hywd_PJNEa7Qx-sIRNSpw0NDL5s1M2qtnKKVN1Id6-QqzVtxMBigprPaWVQ6T0cvGqtRh0Kik7EMxumiyO_QO2tdZSuSBXyixf-9CFICqFG0BWPf2k7-ElJNkRvv3ScyEUMscdHR_wEIuCGGSw5CzZ93oxM6giNg30fIj8owkugMsodCCvMGLoe3FUXKAU7_YM5kMurbyfm-YhY5EmqUR9iDAzfnyCVvL-H5BTf6tOFSqa8BobKFWNvlqGZLtMbmyCwZJHjHWhJxGeibuMD7u5MvFsQkQNL9MBliwJdxcWqtl1Y7IEfj9G8wv2aC1A94rk-ZN2xpShjcCuOYdLzijb-ZmeHQBhYYtfpPbBP6TAt75SmKjPNDxfg75VlCdh6wSF5XpSe_XHJxuvt0A4ARX1kZ4QaUIQ4eghL_UngpZNy2s11nnAnfa-vkjzVHkfPhR67F1l46CG4hxSanymODCJaFTNKAPXiT2_LhmPGFpkDJuLrgiM4QLhxg2ljv1IAjenBweWRd0fwLm0Va5-NGp0j34TifPiznNpDxAsBmgiHBsC3Cdm3iVPCnp9GpgdVjC6IgVZW9QCqTsGVHfpkFnL1qQhIVpuIFEfT5fmgkI0g7bjjSyUP35ebASv6lEVRE7U4cH1ucVhNvWrjifIf-neN9L9A8Yf6XzLDEGjlvLtVEYYDbVl-fVB94Dne4VP7TPNrtPinhV3a1xxS0dJu0_E1WRBb2MUyCofL6btvSnuEZ2l2DMAzE9-cPV5sQeoTukSW3G266sY3iV7kDjRWgNFQGcVqJq_Sw0q9O849VxCquNQgLD68gk90ElZN-gh_LgD3oolV0Dvyo-YuM-qXaPD_VSC5RPzZodxMiXm0unPnxChyf0I9_zT_pal6CjP8VB-725KzAmXHS_pwDuQmwEnrtp5qtMDOG9syIDy9zbDKGUDOvulbjqsxOgbnMo0x9TI0KUMGzXUkWl2VDJGjBfvR4j2sqS2ABjqSf_ssdadsbBkvRKPuLao9uyNkbFuo9t2kTsmTCqnWYu191PReFYjasI1XlaUcm_VGhAfrEF_mQm8Vj0srF9dPo143GaOTORPIjolH9vKP3d8f2ktz3B47WM_F0-DBs-0YDajIxxGbvNerZWshc2_SinijgabQAS88KoiEL2nlZn-t916XeIj-b61_4dLbZUf6Vf4oSEjNY2iOOYqIauqadnAK-gtHtQdgghl9trHae29urc1Zwv1CbNmYSsEFsE3d3vmOPAkiLJMH_v67EhaD_mZfinyDjU68U9z5ThsXQDbXiUIdYbD_VRLA5TGJiLD84B12Q7NMCbRdYr0LCifjeFsIDH5GPJSrsrYfw-tph73VA74Pohp-YYk-ts8URMSftbKqlttpk0m9_6VX1GssnyAbA_u2ZC-hhjlGhxfIga9rzu9qDuz3xT0_EKkpx34ANJZKTApONqgKTf5XsA4RTCBzYiBvt__4yUk9LKyUguxlSQrq8HTqw65OEJhQuXxnm8mHb8Hyyf5yy6JU-lCbKp7THJMlLlrX5NsaGgDoPyI-3ErRH8ou9QdNr0G0Kze1_rC4vJgHfDAGxIKmcT918PqjsEzT7wJFxN9KDZupyT8ucquUTAzZDxKAm7pjzhm57Gg324gCmBgw4F89H3-TCtCSDDnBTIaxnoP5I_dJj-l8gcuJTMK5K5d2fvd7YbDiI_wRr-pkCgVXmvJ7fJiExqoBMqr_wbybUXZymyykgUwmF890NoKxXfyLcd5S2frRBhGUWGKT6uEwhTEd81JbMu7xTxKqbh3G1LdVGiTAT8_X7mocXQTxlbWr7tCpNRUBIqYy4yTcGfew0beaYZy8bbz-qCErH46OhfZc8h-U1eACV3e0gG7QmmLbDI-5PgqL4KTOtJUr_jsVKb7pABDZfoq4nXXeATl3diwvXl9G9kVsNbIan9x2_Yh5Al0OR2uTOzD1QEgDwHeGGp8-_vuUQz4yKOGnTFfEULRtIZkWtNBFXSwmN5T8PCmySYrSSpBintZLscPQfIuopZ4R63lPhfcgptCFpA2Hj7OdY8aBFXB4IsNsFf4uxZ9JvM9Dj4dKc4SXrHWsI4P9hBSI6UJ7BVmetoNy6jNLrDn8P_cNDpi8H-Zvxq0T0UKxD-tbmh-gPtnFmE5afOj9pMHsBFiCNNoC_j_NUDHa_Hj0XZpnbUMIHIVEspKlfnGlFUeL3gAiP7wTCZ2EB5RZW1AKqPDLHLs71ElHuJIb9sgQ1adByYEMEBoqCaLHW1OEYKZ9vs3YJgx2_q2G63Qx8L9_6NP5-0kRGAEunT_AhzWOQSiO4Wd2N4qIdSEB3_XlyWcfMDhGSogPCzhRAG0oC4pT8f8WO2OlUnN3bW0k2_w98eKxyg1DE2UoXV25SR-OZWs0x-mfjCFqvOl7mBRQCTDb6GnxcoIww-nKrUjVgiHRYyulf1NL_ksaZLoJZCqkzqIArWIN9usEO1AIRpw6158ZpKz2OWzVaqeFQET-6-wZ4Cqmp0NUNH47Co94vOhKGEXKh99dYQI-oc1SjChq01pGTqbAiY70G96xX94NUNs2nqCDvLGmCvDzyfKv8KfQ2rmmlIayyFbXRHzpbAxQeX687muuCB2ju33Jc5Py2nEQIQMs3Fhyd25bxrsqm_ZIxp5ZV7hFphm1Yj-RCq8w7K0KkGk1YDJQo0NosH-mvSAwKwpOvlNmENR6C94tlyEy45N9baOnkUs7Q3XohHQ0-dOesbcwfaf_VQc72Hi-gp2xngxApZ-EjSTj0nt2czG5q_GDenzzHgLdQfFfIa0P786DgesD8hbW-CGY8WdIm5wlJx6nLoMiDfmVw6rrJdyNpW50QykqBojtGlMcGNbkaf800PSTmsWlOCc-FAuDt2gF3fUoK5-ATGLACFPeE_mK-M_Z5VsRqcOvB_U70tTjjxIlorLDeAwAALpzYadoOGtHNjWLXvzFVHZzTThEy-ZLWHjz9O71L2zvK7k-yOd8naSoSQfSOoDJMh8imHGwdeI2MbhKAV54nRImJWWzQkBvFEdbFWq7itFfCwNM6h1hHzbk9qYRJ0YYU7D8m82uBssihyCDYoLBkKJJXWLmJCam5oBaeYUUUbILuGONEYEVjQzEOJ1ktA3_Qjoa1OQqlD3aUvXansY6VW5szl0uJxGWUd1dbOb6emjhRlG8h_g3G2fmGOP7WDzpBN-Rn-F7S2UIkisja5UWhDA5avPDLQU6ctyKjTJQdE04ersjHeSyu3QtnUHzstNJstllVz2PjYrCifFun-yiE0eauLf8JP76AhrgR1cEM6s_ohxqu6PbWE5Jb2sMYcyvJ9tuoH7Q9wGGKM6td5IP_mnMxvZBc6KYm3i1CRCEhiuMbOAmmkDAgmXCXSL2S8NLJs_4zAgRaPulmST30BiMKPgjm3YXkwa58iLg2Yx5eEur6Dqn4K8BWaKwJIcIsKSRBUq45QAzzsUhZ3qjZBUMNedh_lHYxEupJwB7g0rpr1jKUJsC9Jw5bynopcsG5ODvoNL_4smnE9FEgFhRwa8ub0E3n91Vi9R4majTX8CDoS8u7dDZ1B6bZusvCYYyGID2Lw2U0AegCAlGklKWE3TPeScQr0XLvJJoSmLRb39m_Awl42l_VV5e3nO6nEqPAyw2ttExVsixTcQwdRmupJijdtCSJWGgskWsepe_WUdCdlwBi6ItgoiOyqzR4tPSTBWctthJPN7nyfvOErs6UzjgKpmO-X3wAEwd3UmOPaAntQn2cMKDQSzk_DRKO0AHZfTGtlxQtCGhENYDuZfAPqRbUUduhjdSGBXr-hgjFgzYVQ82njumIr0Fg0WwCSv6fj9ttQbbwSw7JPRadARHRPzMJ1WI0uNaA_5wkU6-EU8tn5YTko05xLwkLc2gw6W1uFhePE6WJOcYuB8B_nO6sDtbvdFocrLIFQmqd14Xh1RW7NQ8HoqBHraDSGfFXUNoL0-RkzvLJabaMj-q7EFXA1d_f-fVTFvGsKqd3UGjuEl-I95vwq5zam0jp8v4taLGCKFppuCACmpDnGJJouXvzx_7Lnx5Tv8nMNU-IpYH6QKozF_l5UxjYBtZptfpd4I23Om5O4fTxGoP8I6fXHsLkVbVvh4C5c646yPu38W1RLA6PcaIEgBYJYKtwS7t_ZOdp20zEBGgAdr0rY7jD0AjurAh4sqi3RfNAQyoBOCY2qs2ZUcEoslRTWokX4dRzpREsCnop-oyyFbHaqSuHOEwwbhTpkEOx490l4HGlPa23rxLIMnT_B8C_Z2tMqjxONpn0c4BcsBRmUZFqIAeB6V0u63cwc2puQVC18hvOQq2y7xt4ZXcP4DIWJ6Y8VDvwuaG1e1JXkWIpeT1-DqDW1OfzFJ6lmeJuL2FmNFfAzMVIQMX1EuijvdH_b4o9xb-a4qCoiSNwqIbk7iY6Q4E_iT5yKk7BQrosdUjpKsb5_qzcrXuCkkmjWv94ajTJjHstbUcgin_bgvczqmDl_nOpXX3ruqXGVwoS9TChMcEcJ0fMzDg8auPOnWLZsqFvJcY7ytGPBm3roLLKPWSL55OVTzlkn9xJPOaEtBPG-PfaJqM5FdLiMXNQDqHDMv_HcFP5MwJykZOTtj8pPIE4lV6Dca1KjP4boAybiXWhGL2IuZpurMpM3jy-9Sd0E3_fbTL83QOzjjRyUREgQ6pNL9ht78lu4ZQQWv-T6NVNumDIMcev2NXnjT1ag7_JjsMiok5BBp6vNeCjbPjciB5BYwCsCqPWZn3wDY6GJIFmaUsJzrCy4inoLWS58zrXvkoo-yoS4QE6pYrFjdzznEWynGDw8aC4Sj9UyXxmkxh8vS8XQWo9fVYXiOqcqB58HxWu1EJeu2aJGvOhn2q_a70-miNezGbiXdK9kaXJenus2Kzu6M4PRJQvE7fOHR-UoCrZbqJA04_ASrawCnQnWv_L3zvoz-13fNF9PB6C-waGHiMl1opn2nABLqkAPUUGLxfWN9QfSGlGBlPo_xfG6YKvuTZFkLrga60ENZU6SsSBarexITW45NorZxxmZtgTKW8Ud8BR1CSa8Je0UudirYOGePHj1hRKSRx1Q_qEWIPWGhYYrnuBOuzkoHbkPnROVrEmiDgFUWDH35Aj5awSCyOPnnbikIBQewCgdT2XjKcXT9xVpjz55NuPajNpqKgtzmfBhDpYr0iLxI9_82boSlxon9htGjBymBv_yeRqdJu_7tWG75__I2EjCNiXBO6lCoXlDJwFP_4IctpaHRzLAdHCQz-rX1JyYz_bBQlxwbvVwn56yqPxPgB6jCzQvnaGWW7_qPeYlnU_xakvTFaJAJdi3yjjfL4GY2o_xl-_MDnQZJM5V3MQpBgijjM-mKfKjoMIIL9DF_Oz6d2onL0YpuhwhJitxUUoL-pE1tqHuK1H_Qeruqs7V1Hqsxd3qrG_cMlYWDOiz1lFoPeckuiVI5mrWDltB5_hMXwAPTn2sNo3kiT8zsI5HOP1CUdgd-QnmgeaH-Ou4RMuYPHzx0tPTFdPJzFpQ9JYU0gXff8k6QTHnTkLxgX3pCgj_PfsmL36xmPV62gXXq8rISwnVCbAznn0zj3dGJ7tVg_s-BhMYg7YMeBeL-ri5q1yQWaIIU9CzPlnpTyw2R8WJpFt_GXocHelpVN-adfIBvHnC93K8E3qfCzdTD254nhKyde1awcdAPCs55EMZlJTPSgcR9iZRl4kHMZaqeLM147QvWAg2NvqIE5fXNBqf8QDapJPiFGKVuWXIUvfGgBXLsOEpwnPGPwdllUQ0LZIJ-Ql_s5y7AIjvSASL4CY0rZEhIzIg4PKW5ivpUShA8VjoBJ8XCR6R0L5W9hMcGOVyytG67_RWSk10aQX5E0ZfsujyE8LJ2O7CCcWa_g6IdPvQlQ5fZEM5uKgttnR6iqxBm_NRyfkv7XsSiwWLvKscFLT6XjhmdH-lPcOojoQRiSSvziYUoM8pSfzU1LRY-1vf3GMybOR5S_XfM1oUsyNfJ6DLdg1cUZAIGFs0Na3MkvQ0YbG1MWYOfl3ZElce1qSle4im2cZyZGeb2luLs0e39KPVNpMo-l-5HS6S8_lFRt12tUcwUUkhxT37EEcbUH8ewUAUuVtxxFB2KhefgaP-__1NmGvwbVXkCuDYkHUG4vGr3lFQJ791H4Qsl24OV6cHTvK942b_NCvxFAicHYUQb38Rw-JKWTKnal0uJzIoYIPL5myUxiZOxpsjZLRqwNb8LE-Rd46_Mr1fU0vjA6bWLO1TQdAwTFgdp81SmFOLahw9oYE-fPm1_cN1UPsznM4eBTT2-_hDBb8wfjMjpKrQ2gE_SsP-rZhupnz3q9UCnZG3JJr-D8wb-o6KPAZi6ZTbmSi-Zn22C5615YfWjHO5JBRry56-B0DIrWlULY1H-dSfpO2-PBPkPP3V-mIG6OuxXGfYIAQ4DbByUjqmbKVcV8gpDfnzM-HB0uZ9AEML-FB4xPkbNK-nPuLB0rkhJFIWHI875bwRFfrTOM7xxkZzrlUlobI3wx8k9TGfqiDff-LltQWXiBYdD-oiiJQk9-uI4ULm0oLERSNZymw_Zx2LWH8_fJObcMjLiN6vpA6o4vokWCL81eOYvAh4Qj_TVj-CwlUZBxPfSr1d3P0_KHvgPacLZ-MF0Jihs36YXnCfIFhNSqDlXfJGY-BxzBWbuhE6qSsBZMw64HT4RQi5Yiz_vJMioD1xvJUeGy0cbMEGqA64lgZXItBIuHdFp-rwjDV_52En260RGwFR1xu22AYN1u9d6UHjkdgM1tlCouRN6ky3k1J5wt7bxhhwJowcO9zQ43sM0cKSutgwOLWbzmVWlV3myHxz-lW9yiqxRBOH6sj6FXw-aGtRcathpwE1ebZE1aeFStqjenimo0cvDHR6VAZo0CaFkBfNVCKrw3tmiqtUNfQ7Z1faDQ4RZjuqG2sz1caOhq_elk5XzonQvKRJ0-jZ8JtQtR8yOlepNT6fpGppxIs2w_xkg7rbHd-8Ah0rR8EOzjviFZVvZU_nWY5jQWCTKShaTWYjUERjmCJ3wRwzAkEjzQbZEBFDfTHcqheYxnS5SoQct-ykF8UMjwfgoaHnP5Kh4CpWDZqFW8gYMnspd6xM7EVoDCLLPJQKqmg5Gj8GubzY7mU9z9oio9JnNJo0wSOghCwp2L_m4E6NFYwYHKwucQeRwgfNLR_P0CH3_YdUWUjvX52Uz03iGlEqIRhqPnsyVJdN7HV3e61nnYFB60_hOtWieFaoVtIlaAy21EhVVRi7Ryx7TOatSPYMyX9M0WRKUebcAg_p3cMHKJPEqDN9osVqsAC7xpSTHINUEb7QS2lgLIn6Y0LsoNrolbS_6KG7fReLBWXiWFhVW8gvQXBwmX1yv_2KfxoR--uTxsCWpgX9yrmFc1U87O5o4w6PIzFEX9aIrYcsg1GYGdDJZX81gwpmwba_Z7xghusyCDPCRJb-prz6CK1vTKG21Okk81zyHFIAjPfeyUWCZsyVZNmjUj_oZeot83MET3MaW3Oqasbns6spKyfxDYhvYuUvSt0UN31VJ1PHRgk5ERogTFKoBERQAUzyhIpoXDHVWgHJDVa3_tqq9x8neGar0UPqtfBfLLk75wevJg1e_6SIrgTK2Dzt64Rdf_y1KsOmFPsrlYL8smlY5QJolLPvqmQasw66yxmfx1GfMoWfftJZz-IEs2bj5WWkPxS2DwaXxZ2X9uP0E7VQrQFklKwS5VN0FSOXGT3UDni6l_bob4g06PxCz5IQOX-T5ft8jDf7OYLjFUeKyBRVUZF_Ciyx2WK6LdWbCFvnSuDY9akPjStVUNdVl6pt9qs4q4_ylpFxHSj5MX0WqHEsOHI5M2YtVZ400mk__-rXGNDTq6fLNN3AopvPnpgioxmmEQOn16SV597tGDkh110LHfvAfg_Z-ZnneLXY7GkFBxw4ZOJtBiFXxFgVvmiPyByEU0ssu3DAsOeAxDJP1cJvJGds29HNKHQPcbvzisMWoIdxJQoi1Nk_MKfJNEAJ1uSAl7wOkIA1C-mSA0wPWtf8TNI4Rb4gwG1eHB1QXrOXmOjJPana5-b0FThi-grmThVOmL50X4LluaP3bZ-ndsXpBEle5hQvX63eA-fZLH4mMni0nSmgrUpWPIP1h7JNecJqmpouJd0sLSxQdTpz2Q5WFdLXhcwvCE_F-LKxAgZ3g1rJQNodypaWhPNnckjHDvkKn8cbnuoCvcGEJud9It9Mym5B6apUcX00X19lfZWLggp0kCcCmGWhO9XiaFEcvoD_F99BLaY5YP4JHJ_GG8Tp4MZiOazjLXkG37WHik0tFlsiux7Y8NmBPQsFutkkMnGA2SD5a4c5MZ_gWeMpV3l04BMrRkx4izUDK-0o2wWMGyM9JWUOBjrjnUFPiby7k4evUooavNRKfSqK9u-3rrzbfkS4PRUe6ZIAQhZf1Wmi_pL8p5pJF8IF07yiXyDLm7d5DUZLK9ZfaCoODVWl_X_YIz9xvmjkkeyyMywoG2-fj5W1Af42i8sJxmzyYzPopGzw8Z0Ddpz9uzvtIAZuLxmSSgaOvSRwtVDBp-F-k59HdmFwXIOeK1IlPrcF4jryH26o5aQ9WgJn8ngOIvwBjyE6y0wJsMfAa2fMKpQAL93W5uvAgPn5Syux6tLJy5KcMLJ3wCS2CIe06xga6rFe2rFmi-3OUqASlv5kGPlJI01o8gZDFmlw6lSm2dGk8RW6kW0LAFDrwt8Fh6x83PFjZec_dDkIfcCvnl-CVaGEx-3n5Qb4xy6NIhByNeOx-i2KMT94GmdXjFJv_3cGnxtL_sGHXA9ORu79LjCXesC05Q0bk53WC89KTKKO5VY01oYmmQVXOttux7i_jTzEQnEcMctnLK_aSxfQ2vnX73gWNFhQxsjO7OQ6t6DDee-Kzs7H6tG8MEZCiqUS_7gM5KFRqUIyHvk7yEDnBW0BOjmaWMIX0jANpGYPpjpKNzGIdexYe33LzO1ARtrZd4v6YX_TOzrfemuU1XsBqGYtOhXcbnjHGBYcHQzGBTOMaQkGQYVLXd-TZBMu5USBTOytoZZeQhjX3opl6TfBPDsAYXnFf_xUlC5ewxK3_XNjLJuDcVyCYeMDftI9xbCSdjwJ8eB789aDW3cLwPWJfa_GHz7fRydP7YBzCiA1e66CI09gPEc2OOGsimM3Nii8xNHF0rLsFghLjCc05twAqac8_52z6JdLUn3zX1HDooAzaBPMh0KA9w8ww2Phm5wAby8kXdB9iqZtxAsUd-PTVXB8Dr1rlDtB5feQRGz6TRsUTslJXbA3c5M-jdhpY67KjRe4NqLHKOkTXPX6X7X-MNiGAV_Cx84-QSXbu_dNjX4uz0AOqFeBpqo_0efNjt-Lu96h2U3ANkiJGmat8s7U17CqA28PVHVlChDoK1zKZ7Eh8W086Ia19xSYUOUyod_oel4nte0zCkNDqeQ2oThO6T5sLaagM9t0iTRczpd4lMkL0ETR2fza9GuSgy6GlRz-EnH90tlE-FZ1KeNux-0FrBGaZ7psIdsFZxnvaYYmRpeFX9a9BeJh46BhOo9rpS2bok5_A_wcba-ADoPISAWPXdzY6C9V8efqdTUNVoyq9RTZ7SM_U6Rw68JyiwfizEDHbTAvptvbSKA51LgNxlq8B3I2H4zyalPSD2pOuZ-45NylqtIh6PR98yPgAqBsKu-5gJuakp6u2EbSj3kaFT_QCCBNPpth_GD980Tamp_pmxw1vq9PIDUvWtEG211qRsn9Xl2YdDhU0jUPQipoffvPD10VyvljGMeNwtNMslPtj8AMDMacW5ChkcEyJlEIlNOQAJz7jbUuVRHhmNYvCeu6yiFqPyeh7p1FdPiIMqm5ewsBT-uUFHfyjq3OToGE9SRyD5yfBdJncM1jTazEv0tOL49WCE0BZ4dTkDlBzcMMc6PZ40sM7BwVgHmW_stpBjSPYvdpm1_d6ifclHj6NpUQa1qyQVucFEXVVlR3oucftTznd4B5wUhlczUinGn-g70ma4pLIZ5b3qCbUoMpatO-fHleSHdfZX3c_CE8CDR8lKHowv--mAwNCScROde89YTrGcRORPNDNeOc1AskvqWzDE5852U10ns4W05XMk1RlzzX4V1bhU0bTAFCpxo1hr_URjDStLEngPMKANhvQboGhOqHtne_VlZwHfoDvx13xT4pHvqnmMwgKVeOBn8lUdVUUv6lEfvMso26fFbRRJwFnp3vl54Fn471YkWGIYKO8GnNnXsTsHIME1qkkZlV7rWRwHnHNQPuFvpdVJ-8UicSFzMNxzYOd2jgSrqeNBfMEjnPUWHLriRbLd3ku0Zmgw_8VC50v7CxEh5GX6yPEwCHh27FZkBI_ocPXJSombBK9-_2ZuszAoUGV8OaCuwHpx5JnQt2CwtQqIHjaSTaTukwOKjoPFM1tZT0HKR4srrAdW4tAZzn1QE9JJ_Iac_Ai09uB1qrR0nW0_gJpGoaWWaxTyQQA8etHgsqmld0aCbC5r9G6jgWf4PCpst87LT2xSpXy_vKjF5beFbD5Lud-zYfnapiPaCOZktY_Ouv-yEDVFpLk98FD_SgHoX2e0EuS_Z03tEqpPGV11P7nnVqufVAZu0wjpEP4DCibdG1UZ8P-CIGvGMr1-VOwOJjY7_4-fS2fGJkS7RXta8JlKM64LQIqbdn6z9o8_4bBka8FXF1it7r4N3gpaRgSGeV6fEjSTpLSuPHvg858NgNbclmh43bDT0gvfPizS3O2vw5cBrxx0DuHKpD9KAoY4BnDPOUMEmt-U6Rn1q0BIHytjMurrnsTe5kdi1D8MTx7ajpoKSDz8t5Lq0XG5F0OqSy2kGiv8HrDRg2em913uLVNPpN96lA7kLXEkHRXMaNO_S2O2fD-4WR6vnDBXjrFKC-mT8EQwpfkALTkGaDel4C-fjYeO44-rdKCWe5_DQ_owUY3dUM3OtKyBJBEKbWNsdy125vlM0AeP2d0_OJSLYywnuQbhuQUDeJIpzORNw85Vv9k9oOWfaJS0fzu8Ux1tJ5NzeIwYERp0y3tw0zGRmVFt6Yh7cFu9hRK_GmB2DoqsWYGoOW6Jn5Q4wVDNizsZKz0saGQvoQLuOB7kKUxRTnYVDMYhNtgm68beE0PI-_2mhbMejkIBgJWY6wCHOwUnJCdVoav5ixBXy_vlmmlyxtAHXsjY4w2aaPb4qWQJDCNusStPhLgbTy4YoQQlinH1pupeuzDQQrqQMRviTjuw21Ibpu0KN_YlZ9YgkFJj3myI8Ee7_oy4wj7CPG6NYKmiKgJYWja8X_JurvuqkjnhvG4iJSmwa3RcG3_qUgjWx4mmkp48os07rB2xRpUnValLFFOJeYedxlKZKvO1wUbCqpboG6OqCMIbEUiaAvfjqBcF9ASGmzvsCc2yzG6lq3T_-iSEDv92Iug1G2nnhYQ5fgDB0_v1LL4ES1x9-EnqzoGp5JDOaucr-r5Z-ZiRrMGI1eQuOzvOu2QhXKgK6bAww2kiY68WGV0EuMpGf1wztg_H7KBSTj2aB1SGEDLAGw2EJqxpyP-DCFTZqPjgDGhhBlSgrz_huQcDODUcocNnjNkROFE2rmbsHfIC92shKtwrdrcxG8EDT4Y_a5JxMwqv2p8XH8bNu7AtZr49G811IEinPOPStlq9guTOxqin5j6JSVeJuNeTMbdh7bP1bc-c3n-bt5c6iPfjkR1jvzHjRSMwSJaaNg46thJM2vTPGN_J_UwKDspaCAGm5drCRkVpAuBnqRKgNZfOxKu161Stzfk_KF2Tcm8iWQKQ0oxAIuho86ucYRkTphbIRIdRRtfUWyQOnQTzJou2JgtlmpsqzPy2zJmSXs2j-GWjLLsdMjJ8hdmE1j5InWpGXAT4t1PvWoi-RwpMIWdBY9_Oj8nsn0GygfGSGVlI4uJSHhORHhEFTOcGcz3rEU4Ai4J9UBxaCWmbrD07y_BUGfP2ILi9VcNz4NImDGBPIZY6ESw-g1DlX-oWoUs3cUyVpIeRbmVvdZLIOPMQcAjEOxoJWuE_1KRS1Ett52JzsG9-pr61QZAvjAcoaLd1rG3sZOgMTkE65M2Z5qAXoZijKUEbsmRNNk5ezQ8mIuKVmnvCVfuBeUuj1k6yugxFsF8Gt7doWF2B_kyvRrAoOlD5eB6zv-_LojPuffpBRRmws-p3QT0acaA1bWmzMb5o8o1Xmo198GMDVf1YHSoN173Vh42olI16zScxCY_zVjbhXAs2StueSRF44jXpx5eGDWL5ELfXxvUhxh8ltot7pIHhfuURomcaxd5Wm6GxhvU654l2ebbKKr-k2OvXE8_rml9nACVMvZwUEQ_N6RSTNZ1LXRvp6RRBcvKCZhyAp6q1qUieb8DoJ6hPlz4Bn27zBOegDrhoR1w_DuJuBJT7tDpSK358LlXV0IXwGVfyOSn7KOf3vg8hRcamS4OpuslDBN-ktpMjyl81UM1e56jjxeaKoQUYU0SEWGslhjj52-uyHjK5DWLmYQYlLNH2vySVATo4QQGbjkAM3mq6WqpCkKPhGdN-i-p-N8oW1ROj3Xw4iSodMhbr7UvEfqxumMbDeNbJeXXyLH2PSHM_rVEsc3-R6VkxpM8vBiInNBsHSp54t8w0SW475eYMssalBCzsZI4MVAfeV6Xugj0b43RmSafwbh5UEtjdJKu33fSp7SpKAZP7RrCTT7ggBS8niatGyi8mecCmiTYOPtbzp5BpWE_zuUYHhwZMpKSBoyK2bM2wWiLFyKfetRdZwCjo3wgqG1JZuuRFA76l81YlRfnga0Ru_bYmVdOhASwDFOYRSxVamMZW521EHSg3prPdKOjMiw-QQoQnRvXEKKyO0-c7DPADNizY9AvCZvKVRfRaXUCPY7xLLoxKxrcFxSqSDjkC1Rh5iW_8bjBOW8nZVGNGw-s34GlJXfjKOHvPYPZETBCqCCFLGuVvfbvGmC4iyiKtJRFJrOkiYq_8JfTpT-YjLItsrfyU5wRgoUms6zxNHfgK-S0NsTJEqUbDKbFFu6L8GSsPCyIgU2PmYbGJxdHFdlh2_g61aOmx7x8OhcS6Lzth7k1HpCeaRKdK2qLLJibOpDEB0HN9VF8tSuvFRqJDte-dhwwUxtxLfIo7c2XE-S2ckKh7JqwFrRhrDUbt3NYhWM2C9AYB9AC6UZbjfR1LhhnMUDHJLOGk-cD5ES5c6U9rGlOT3pfYLbGaXyF7LYWAc5JpoTDluzPNrV0BwEbC5hanGUq1u1uZE0Wovx6eV9yEs9N6L_zdBK7Q4L5HAsERxSEpBVsLFp-6QPNjdXg_cmga-y4DtL3Fu9dthJ7zfserJR_3W4C0yHDl8BNU9jrQICMufukR0t5wg9NBXge4ZoB4AE5WSgUbbEwJJJ6NDytrJD7gh3Mz1H4ZPsRITUise5OikAyci1WscrGGFEKURONpigxzGKKQzihBUf5VUumsDV3vgkF53dVziEEH1JnmYxIRhhBf_dGMTAlXaYqnzw04TiM4NOyAvGPG9mgu1oTe7HLvYoircVqJnaEn7aQkpOo6J7Q_XjkDEZYrBDE_dpK_mVAXLqYvNW8VRHEvofqA60Zi8BcJxsAqx1CHBU3jyQCSzfpDxegI8BX9UcA0TeZ3soDPjkCpSiSryjke3z_6Kt4N8xIArBZM-Jc6AN6qsJXTAgJMO2pRawHFww4KWRErl-Pxo9El38RKWWsHvR61JmnnljKs0zlowW8qrIvhFFC_bYpiFHScvGdDT9mGDDRreOi4Wzf3_3SO48Xj4gx0WaaM9wlVRkhZQUr4bKbXKp60iQMMa90P28fKBuY3lGOjpJ3jrLNBJbQlU6u19xD5XCAsxHj0_KLBhIbNZHciTzIPFtdjyxufUhmz2RJ-rUoXyg5Dnr23qYPBygHj_SJfIZwGikmtABXbUyH49JfZ5N8pXH8r11k4fN-47B4OMXTzQMS0PhViq31mdChTIHBpfkr1bQGQMdSqKadr6aesrw7Wcod7Zf_VTFPrIeR2zUKn57mukgR2XyOJiI68mp2SoOAktkq9V5E-SO6B8GtOQiu4tMqhkx_qwCoTnpKHkO_ckBavCjuNsEj2NxxQ3RUSjK8-NlWBP7OgevlaC3G9qz-oFUAhk86su7Pgm7DLnIAhjsWsxIRj93id8HgTD7ZzKO4wqA-1m2Y7pHMh6LcQcaSkKpMC7uQi46UAZxBA8HlsKUeqf4D_C5aQzUZrGwDEcov0lf0gNJSWfsWhP2tcboSTAt1aq5WqSfhWK_3EGfPGnyIR9cSUcmqstnhmz-5POk1XwgVQ28I2OeUhygvVLUoH7TfbZmPgEGxyY2RxHATBOYvDmcbexvQ1pljw0MS5WtcNrnSUFHPPC9X4CUYiKVT5AZVL8LHHus4ofEyoKCW93VSjf4XQq4PsAwy4vAIeyd2X6DMa7StZz55NrYu9syV3RkpVOlqcFKcexKif4RwAUszL-UoXB_D5ZynHUr1acL6UTkq_vaFolA0lwJbBDJM-XPskvZXze8zcIcmnZ1EcDQRpFtE-TaYDperSdkkHsZFwAPExu1jj5AyhIGu9U8U62Oc5v5Fa7boX79BxtcinCHYLSTVJFqnq4Dt6L3Bhw5m8QHCsRmU21QnCz25D9MaNA-uIBYL25IwEet9ODcVQJWCMIHSGYUvf8PULyOVekJ9N8dklNtkfI8mZJ2RtB4TapGvMulQNv0E6NxFi5ebMA4mcXfIGGQs_12Kar1AhkLxH7B5m05VwujPTYtLGjCph2xPoc2RHzGaq974c1zxA6Axh5g0QRtENLEfhqq7_pmcpDMoePKgkiyAiXOUGKmynjVIOXZmjVfn5hzZ5CYvHcnLEJJS81bliBslZ8_duDAI5HWXjJ1HKPvEd3BHbjy9Dg3lvX6tWR2ZJUHadqlpfSvzrQTvRdiEdqLWoXvjbEwHI2CUfOqdY2yW9bNDuTlxn1rEiCvCCBbTFk0BQh-n3GCCgt94B0qBUUvDkCo5pwyE7a0YICDrSmE9XokrFNB9ojvMnZ9CiNI2JOUv80-VevdsTqQTieHKoj_vjqp8G5kVhdL0sn2b744_92rA3H3xSt1HalBsKim6rbZzBZHTXtvPlfHaitxocZNMZ204Da-wCcH6PdBYdAUD4YTxNRaKcmthKoj5CCsCX2p5LcpRt8XisfGGQpoiogTCZfog0LoFy0HaoebjG6XTLDQWajCKlxamS9wj6TkDF7LCppWs3jLAODomoCRyR5IX4jXBMrMUmdHf7RPCe13hp3HtmOSjdPHqGitp3_lsZFrdvNl3V5vCTHkou_rRPfSq3fHAa7_ApHCc7ACFE2pF8ap3SeGFJACcNWz4o_iRe7219XeMGV0eRhracgRUqf25zcteF3cuCFcj0WuZOHlApni-Cn2j-WXA7LFBHq2i1BEwMw32z0DHm28_zwJKOfTgq5sErV4Jqz2is9mV5q9Pd6e-0_Q7i8_GUbNIAYK4Yvvt4xd70LOJLHGVejhGS3Wm9zY1XFwNGYEBS4y3tihomv3r4jr-QD4BIxCYyrYGCoFo-mMyUzwS3UEfNgp6np6T6GJ8BGiueUpg2XGwuutUHRTHINCyHz-9i_aMA_Dkjv4Rd34ulGvLFi8BZTGxEpCd2tFv5KMm-iUcD6gSkRMPC6Tr-FbEupoCj3dwJOYfh7x_4-dxKHeQWIjwktf8Gb3lQhNj3pjByPnHSwD-EjpLmeYbpDhb4AVuhk_GhH-doy02Fsz0FL0Lsa2lC4u-ETwUqcJnttQP0k2sr-2KOfvkwzTbLaOQ0VscjqyalYK2OeaMGfcuhjHOMp3mWWUQA7oYCbzGG3uYspbE6fXbOdnbjcbQEXgiqUmRO5drPoG4gTH_QpVwDvZzSfahhnY-D0mw6UkQHHU8Tz_WJZH0q2-qiBbxleWyC4qwARrAgrvFY4z4MtRTf-Qm5WyJ481X4fFERW7Yfxjuk_bb99FtW-QvFwk7dxNewHTSYwJJ1sd1FOmCIJImHc0-lFYdyH_ibh8Yy8W59RQARCdw1KfyAwkCPuissNTbM-FxgDfiY2gM0V-TU5T3XgRw4_ZLLRoE8fhbVh1FnEbTIYzwOBc2b95eltDwVxHgGZtxW67hTBRx5PMWRezJW62g66aj0uZb2xVpO6ZWVC9o9oKgLdBzhnF7Zh1lfd2VyrXfNSS0qyjglIax_wdluHeOWkZ4Uv1qxLokTtcXDxl5s80Yyurerlm2BL2AcZfhSNJLwtPwnbeIW3AgVVKa39wVPtlMj3KoVoc0O2liJA7k_kgvvhAQA1snSABKiX3lE5Ivycy7yInLgzeWvLDYepCRUjBr_G9NBOnKRWfm8Kt66tdEHgVk0UVl9ik66vi2zJfD3Xif7TJ7EMiClpHTyU8VqoibHzUfbncju8-t3rV7Gt_tLlMIDnhrBo5HNeMBcGyi0u8PSadhqXAMAScgtGLbLjEryEQ77oHaghWoX7dlIZ15-z_Iz5qCbTn6wV-J45YLrH3CEZlTwmzGGURL0mY8BWLU6072x-w9NcQrfCoLdXngucXjgii_nZ_L7fsGDTFdp-BxsUZXgCnD_TmyAK0GsAXdCcqSj6PQ9HATRG3sfq-gAe5wTyYR5Q8OGYlCFmdtJs8Wdw0jejagrQH5vPKKLtqBBSEf-mqxkhREp7TwxEw13iMrpjWqLaoSbCa-vdvAxVYBCj78m58plvSad0ZUEpHicY1rh_uS4Fzi_-jUT_1ONfXJJpVMXgezb0wuI31Z0AfwzOuxr8-Fi_NfdepOP7vjLpHYpeFJDH51ohyDAHLVUj9XUWYdjD5TuirzP5SuqX-fYByNq8npGazLghGdvxUFpO8zKOepT6i9PeNiVrenCXqVz_4_dIoxO3jX1adbrSq896Qwr9HfGtD6bVWSi9Sx783xzMaxoa6WThDpi5mZeYiT6RSDj-Yuw-MCAwg7Qaf4Ky8No3GWNiJ_K0BfJpPyo2DszkVCYND8DO64FTTTaVZvZRPBMuh7JMpRiC4FEk1ebPHxVXOabt3XXbSrXRmKgUP0jJtOUzsrlW-snmzLLwOXWMwLhj7nPO4XLtP8Db35KGTz3UKZR24eRFGQFsv-uCBlDlIdqXzoPE_Rs1oZdEaw1-znfrxxM6xFsFfAQS7UhumyH9_GWG-RjTdUULOKiD1z_MYYCRs8xPlzLG8EqkFnQDRb7Yz9cUYaUvNHgwoj6VqT0zl4mGuQQnWyWuBtYkrc7PfJKyP81LAF2i2wd1P5PTxxJaHhxS7GQ57S8Q2XldNgTaQQJ3fim5nuELJdxAdgiu6YvycNZ86efQ0lxYQfcg_j-T8V7_UstG7CReFg1Z3cnn2OlDePgoc0b2ZwM78U1WPFJfgSlE3LanwerTM3-kI1Wr1egiP2_rY32a4I0nbyrPrTVoB2wt3eqC5G57nEDAKfzi73a9XBVfp8yZWr8KGaBB2LIGu6m9LS7b57EH7ORCEcvx3qZJOpSV6WO2izzRiMeCPtKGk5NMCSuIuzVltrG0WhVHCg5I93UQRN4W2yc4sLGtqAAtGAHdDySg1c0b3srLUCdFVI4QJjZsg7-4dYlsQUemWW2CJen_b5gb8B58uiMwF6icfaeW7otAxeYQka_4ZK69QPKZXflukObcuR-7UNZBkhjO_zirn25rEhRz-2RmlFoLnekxmFqFW3LjQhf-hXK9IjlcGBN0peJ3p3hz1TTtKeQkkhoHCvMR4c3BTNslPystaqFCXW3w2NbJaJAbUb-SErfYf4VT9ptFxfEQnaPiRc1TYbaGxlF8xfnjdkkQqrb-tNdBIFMSBNZyc8nxFTOQ86UiV4PKZ60TfneWSd-y09bq6ThvhlE9DIp9Zsba6-7p4ZgBRBdgnJ-_n7Bitm1BGZbVjA6Fg7piBtP5_CS690HkQFATfGvAt3eu_vpLq2fZcQTH8tkFA9L6HYwK3H3zKt4M7ixWJ2q-T8cPY8WTCGU61o9_gmLrFWYHfBPkZiizTYMscQCDF7z3hngQDhQNb0suxg7_H3MHkMt2yn5UAsIh0RJgfVyWP8D4vTG9KiixCLWsAN4VwuH880xJDXdf183nMW1EGWWu12IbK1gRP3D10cOwzx_bC-IVVtUHMwvJ65KoVpM8Pf6M5iVsDZA4nKSdOVG1gF17_HYjTL41x0zeD9_AUu9ElGBJ08Ae_DdUEi2V30uHLp7cC91_OBUd9ZKc_uzIkln5LGWdPX5OoEgTb74gjpY-clserEalPj3bZVRRcqTdsXtOfZmk2GBfD-n-srn7YsXG6Z6RrFxRBA3HGp5bzZY-K2eInk273-pDKJj16pk-KdFCfVL5J0z0x25gaB5tlZQgtoYn1wJE127NGRPETgU_D66H41GFZQEA7GJ-dhE65kOozbN-dXuTs_bM--tlkGH6qIgt2b4fQh9aTfwmeGpeFgkrK_OlMPVAXcO3oPAVhbqmQKh3jadTeTpaKuVnPAS_Q1-O3vY8KCkRO-kW_sYFtEzfTSv--pjVxB3YM4FL-fX7XX4eHLrtfJXGE5XgldbQR-1L3IuOTw2oQGIQzh4o-fgizVQ9ferLJm2Va9nvSgKdM8Z0wyL4PZreve2EUJ2hmIDqDz6y5SGFJXrOuv424FsEcy2BYUVOUxFQ9Aj-V7tplDqsFJOjif0Zu3QmT8Q19fOOTZZkpW4vfyncei4MAPR3aKKhFMEIq4a3uRt2sTwtEMeaspCOqy-_1SbZ5zVBfbJUP_2i6-HLMG7Kj1ost6K-tMdmrM6zwMS9MCa_HJYh1q-hIKDrXrjoxEPMxLNU1ZbUjsMMlXQwXUNh-BEmQkDoG5IMVtb3h_yq1CyDggWKyzYPSlmKV0ioli5eZOXwoh0yWazD6lMJMRfkcSoocUrf9kCYKVHb_6JmMTFu3_sT8Q9sRSYA0OyfaV4cO35RKtOF9QtkRuZz3Pd2wqK0rV15O4L8EcJB86Yyj-MGP-8Tp2PTvSL7Ky8JWYdfGM9ih3jqKZ1vL8K46jHtWEVPFMXIbEGsmzXYpFrLDZhz9EHezNjFRQExGaIS5yO1i0CWNjrLqZ9I8hizCfu6XgsgZUpd7KMC0bet5I02Ftzozxdc6g_6kOjabfCBHspBs0wf8bo-_Y5cEODJutuXATZ4P9gDWvfLnT8o71BTlEDDCza_pfwJkEJeVwoybF05670cJjPWr0g5Bj94Vl89nY5EMACmDS4k2Di-3dkLE3zs7GIsfuNi0fHNrKIPrilRiEcLt5XzZHLYUonwUOJz_oU0edPFcSxpIMoNJRA5MgqhrYPkxpoJY_-NujqcC9xVHNmJvprXj5TW-GED6o37KWSO08-WUvl4CzRDOUR2D3pCTRjYYe3TTh6xb48ybKfKofdS92gxFNqRib3mCxCG0cPhCJne1U9uCsvvaehVM196oCi1XwtOU3CfD5Y10_2R5ZcM3G0P6nQpdcI-umiktYQKeZ_J8eUBJDWEaa6EVk2dNQzkIm9-a8-a6bKYKWx2SMaVojBEV9cbvtmHoXV7KpziIIayD9hnFl2XztMijXpF04-xLRSxXC0nU-FwDemK9hU3OFrPzP4BUyMQMKh6J5NHt09skr-XkxcfrU1z0Ld9g7GyHaFqx_YuArLiMNg9_OTEAvMsA6NGb23k4vHOelALZuX7BjwBDl8v7OzlLDL17sFLFx4e2LKsL3dKnYcnEe35lDGBhENxdjo4bUyEHj6iOmF7LpycLg2O-0qkLYD_jO1fEOCS27s9VOCo4QryLS9ekVCtzMgdkdzIb5uWjFNVn7t_qqmyhwq3smkn4NHFmbyJxDIOFTTQkn-nnoSpCITBJZCKXHm9_e9uRi0epiyiduPC9P0tO6ClajzQKfPu9Mg6POpIAJ6I5-sXCbqYngRJy9OP_9BD7aEmP6i9sZ1eCNdOrcZWJHny_7sq-6_5fYfuCgFDzZf38s9YV8PRbIPrP9_o9ln4s4GRzcIlAHwJq1bNFqCmbgqv3aOxFfy9N_loJ09ZOqMJSMixaF5PIG8wz_qDI_9LuukL-aA5C3f2w2_RvF7jVCKECaWE_CTOtidXLvfwGM-uH0ZD8es9U0Nvh4tUh8Xi4pzWdJxVyuWENA_aqcqh1K-xuQ1fRsI-YbztfAedQYQMmN5-FJx7tsQgTPzmn71DaVn9fknxVdM2J2CFtTCzD2xEJec7_XuMscURKpnPQBSpMGREImvQM1ApSW50gM7v0qyu5kblhpSbzwFh5VqI1gCl4xM1VjiEQoauoF8b8nUmc_GpGWstht62g0LQKM4lKxEW03u6otanzLi0CkDkH_-B5kvyumS3p4YIopIi3cRApL5ki1twNovFsQp8X0JH8cgJfowkXtNi3tthtRPDWoBPiY6yXqmiWTbhOnOxGrTJY21mPHihVlnq4LW0kcn36ZuSCgd9OJPPMdBPQT4s19ItH3vWqldXCVQXwaJf9qg3ZPcbBFqxXCTrYp2Ndi3Xh9uxgqKAqTuhM2DRY2nzeUkAFhzq-bXBTpBiN0hwieT4SRzk6V5uzgdS54YjCPmIeuqtN72VxbldZvj7hmYEJCYbKGQxTKKUZKxGLu_XXNprQcmM9qUs4q0u5fyeztZRxCutssE8Nqn90fDtbt85wTnEv4Z8bwuthabUeUnMgZbLl6x_bH-psjNJKDfpBa3Swy9ycjnxAWPsd0zzHcqu1kAzhT-cRSC4LqspxQKvoOxX1YyMSupIkSzKiVJ1_wGBfVMM5s0gA_w-JehwPQ1ZEwsqxGNGjOraC_afUqrRKhqwX5hoopOPwyft3mTBJ4c3qFladnvBb79_jPQv7TMCjLwmaDwuZ0NK77EszFanrDpl9L_TOwDvBVu4C55R0Mmsf1HPVB9OhUoSWYvvVwY3-xaI_K-330S5AKLO76NLIi-5l1fWjCwwon1kGwZHMfYwtPqUsvoX1OeAunZBOlSWlRsT8JdhaHmQh9HTv-x1l9Np6q8Q1_BsK3p4q2bMZDeExktswdusaQeZ64KZcZcdlZoHFqY2zHyJyDlrhnJPw8cJ3J1sQvd_47UKKgej0sUttMX-pkMjrHhTFpE9X4z4WXDLMkyYAgZk0roglHhS-JPcEy9g7Dq1pdgxtt1OPINNtYTtQAeO5XwOXsLrIvtQxDcnj9BM6a-qsdxhybVZlVvfPVb7jg86W8KiWI7-o9RsBTW9ZYbJ18hywy7TqAxmPSYmU3a1nyBbfTjvOR8KLots0OKnF19eciSiRTj2MoPYIfQBfZHV4h6lwb3y4yNfvcHrIsaPt5ky8vQsHbwIanW1Tkjw-OETeKnZsHJWKx5q22Q7aAZ47MQrPMQKhNxmYAamzUNCw7Awbhi4rxXz46fZsjFL1mrYmqYnKao6SEKs3YcdizPVoYK0TVrSrfebjw17hOna3nZgTp4iyGr86fPkwVN5YS99rdbHKrQcXDR7sHElvjaUbRrxxwqKsRjMGJoqSinZkGXi5CweA89J3He4lHsD3SqbD9hD0X4qETTB8xxSg7SVDpa8tAQdJLvDedGy7sF8jE23qzhip08ZMO8rv2eXr3pnPUx1qfrqWpF9sgUG9m9PpQe2jAOKNvR-4NAIEgJlpcLS9GHEQTP7qw_7o45_SLvqbSQIKOgcZwQ5rktnOZlUVQ9flbY2XL9_UX81XZkdbFZmuIeQ4zz_Vx-AUTl2vosSoBcod0vdrCMiQMHgTf3nXEwTsK-nRnMQbLaFnFCQ3Yu1tDvIRZoEyzNEZgnMGVZ4Gw4dxHGueREDynDTNdPipSbNmmMwLoSkPQms1PPA2ujeR13px9qGVdHGqgdgzEiNaMGck21jgIM8vfl1QVbe4GaIYno8U5AHNgUPV8DgU16hp8MwpVRfk7a7Adc1VsrLR31NrdapiVxjvCWr1gWGZZpRYRllhPumeNGsjTKGLsMPpqKq3_lmJ93M-k9Vax5R0STu3L_aEgRolm3Zpx0EpB9Z9WZmlE0065XbS51PdRUseWlihcxkDazCA5ZtD415tCOdfpfWZvfYQZyVtDHMbRn7NI3XUUvbt1ljhYHRCL7Ifi2XOxy4h_zGjq9RUqHUH15WtXvURTK0-f9TSWftMG2Va3xvJ2OdW4t6SkmPWhNetM4OUT87QbQFSSjw1djxnxiYWlqtDQSpSLaVv0tIs4OtuzGnDgsV1NJoKWM32iYXrOAsoDbMUczl-0zMAS4DDkYj9T_OiR7sOW7nQNUgXOgFBrOY9VxMkr0FWf8CDBst5K0dHP-rKMPpIztSsjjdWywXJ5bGYbDqd9OC34umBDyqVx1Bv6jfy7lJTEE7EyM164WBJbI7OoFwe0xPcmnEAMkag9zEPZIaL9KbZmrIcilSzGw7NtmZqp76NbwfySEjzXOq0_wMxyaLbSYl5G6Bg9pOaaeWA0ddyLdtUSXfPaIWDXllNJilwi7u-IwnsF5fzhuyq-0tIy6PZ3wsn3P3vmdxOgviDENxQ2k6ExPVbU5fe53iqyqO2D7UZ2SaeHDm3PsRKerCYBlj5j7wgR7g2N7ibmn6pqmSFei6tNeSgaXA4Llby05iPyENkM5WKj993HAA4PRnf7Fofjdacif4lA-q1Q2ogXO1mV5FhSWYgxTZeBN7X88bbr8QD_fH7cVHIoDki555h7H33wRhfCi3vjB29f_l7qNH09kJUaPsUqYciP8K_6o48G2R9JJ5M17WkUyPd3UZPZZguA82KnVEyLj50AhezZR6hOLinibUo4wjtSkfUNBCjdupgbkCKeYwnM1HAWLT3DqXqEQMkxyyRVyYe11Pe4dMQe3tVFvhuNJ4ErCe9iIdVeKCFcIbEDhlN15GgX7yvY2P0qhz22DMN9eTwOd85XPWRn-Ou-7qZHfI5aDdQ2DODsqJCbQYMYlsv1MQbR9qruwfhNL0smwRwiFBFHVk2Z4fSmUw6eyjQd4ZbKGLEeHOzCs4tpEwl2Id25vMezl5bI5JSUWoMrY0-2bbmBBmW4M4lzlh36IJaSPrmYD1PT_tFERcTCnbJpE3kqlgTRUYJ4sFOsipbilc9P7MWehWWasUGwRkiB2_X6hk0AhOg5YxdohpGvbymr3Wi8FRI5kURRZ0ni_MWy5zm2YtxWySawq5_NCEPY_JTp63L6wmUgqwHjpjj3WpZ2wvuLNWhqZGbrwQpuu4b4Gnanir0-rzR6Jyk7DGT6igaSCwzNGaa6b1NThoc1Jjina_UN4nmIV5OiE6jiXQBQCiTLxAEK8wfJHzOwPStHYOmakmKaFJz4_gHusE71LyIQ2c8SKVWplYMwOrXWZQ_A9Bw7AVlro88ccRbpl-69FvMWTnYNMlE-FMrDUGAVYsSBx1s2PoNgzmR1jaADru0-XNoctL7cJH06ijngDgddu2GSLQ02ypLXSCADh4fBNLfRdarAN2NdElpShSRfnnHRXBKsPdPyK14wPTAX65YKS8a0XH4xQV7Y2bTkVK0_0CdtDwQicQRML08ybXwX7QIUCABJd9_6dezCmJAjNCEiBRbJMFzHiJrk7WrEhruWIBJe90-ixSwAU5gbY0vrEweiQENUkALeG-sSbamJBcaEzMz9yBOXB4bKoZccnG225sMLPOp69HDePVaXYtTmZtFvy6N0_RWBDoK3UBYdFslWRZy--Mri5MAWuzunIGt7Q8gWwAzNfEYroeo1O8MAAtqmvjXxilar7gwja9Bt69bQyjzw0XFZ0g3cWcUShs_Ot7O36AIxEg-aq8JW_cEb_087CfzPX2TgX_mEL1qGW0PYV6V6iHfUP8oA_gEwRtA4TOIXtOqcvkC7680DTA-fF7c0GdFmkBYsYMuqW_u4_4TIfm5MHoWdVlSVxqRe67yz9DXAn5WS7xj6H4wxz7qLRwWx10A0FPcdrGNmFQQvjAWf-Qbbuo4htglRlyDIiZb6LxqxwwhY5jlbqAxiA36ZRz2B0ib0dgvAKOFl6kpIlEBoCZVkYNq0JaNiXpNSsB-MJDPDkX7CKp8YJuNsuO_EyvMLNm4-mOFZQz0u7VqHOY5iXF95xRQFeRUDfABDPMiYD25ksTjDfmyYgwjfqe7RKMCIKS68cayueqQqqBQUgk2jWtkrLlLev5VoEROn8rhfr-M2kofsNFyMRZBKOMOKzVa6CyCKd0W--S-7HfjrmJpXCuZvG-wBq9nTcALv7HSOVMQ6f9Ij9wof4ga83VDxDx5zbrX9XL-mZvsoEE1PAbL_I3hXPoG8M_yFrgGpxmp45OJ337fJsfkfwga7IaDdieq9EZUc1kOkkI7q_ZVahJArLAIvDJ0ayMBv6RxU9vaQsPPc5NJfVFlvVlSPzCXc8Kevi17CPYH9CyTOoFwIUY_sTbi3KAqbluOTGdwnDb5oTy4QHtzTzfvdo38qEtwcJWSaNTVNOf59xx3soMXVDCBSgaqgBzEvSKr1HV7t20vJZ29WHbRWC8V7WTI1IsFdQdvM_UMJj0fHi9OTd7RGlcXyqmmfJwzR-ExwpsovJ5j_ly3bXs53Zv3K1QKCxgG22rbKwgT_wMA2oIpeLAbj-vVQJWBilVyjKUA0r4urkV2vIz3VogB8cgVESJLugMCH8d0CZRRJalZudrBvSMcShotua6BRIav3WXmlGVW_joHFUYm0hVLFP5WZwk7f-_Cj9lVptZ6xQExQB0uBAKIXRJf6ZvyObXcU-6Q-qd6j5HjHeX5IH456_5CduqGATcnaUjxrDAyBNxSVZ81ueS_ZAO0rqAsihd0RTzu3Gne5NNHxEmZQjzst91DsMqIieU5u1e0V0pevQFIqa8-9ncHbszQGB52n-ioeoWCymJfrIyvG4RFLo-02buxtcqPsU6VPeAYZ0qO5JPw24eqYpvBTp8K84EQ1EzSYwUePqLaU_4MUod-y2s09wgbaismEkarjvrVwbciFJYZGUSWNoa-9kp68Y74-VsouCPIc0NS_c8OpLa9BBhjLnW2KqsKt6T-Gn1kntZ5uogsA156i5rks4LR-Ffv0JcOiHkYoQLfcIhSqZSugNCH4tvGMA0d_Fr2VuSpXoAU3gMQiaXzEzBxhjc2KQgxBX54vx4yewdGrhYOLpqd4UpKxogPldcR5faTd0_HzzxS_DVRihbLUqruhtTUgMPROVgFkLXiH63j95HCsJN_AxI252p04NEwHikYNVuKrIE_gAv7Dr5Z_K2afSXZEM2PVVoDcp9yMARRY-PP_Mxt55PH23xTCY7dWucCgugZSLJuRgRRen5ssTMMAucR3xoaRXrN_EtffWp23TDsdfcOsj9i8SjEqRZolqZZKnpSDG7Wcfgup142OHGI4sxurqGNHDVVc-5NHTfts1RPcFC-MZ940-_pZIuKqiztXBDkOE0tAnxG3mS5HXg6ZUBSj4M95dpg5uLgxZyv7DrpBH1io9K9TURoO0AnoKPosuCn3-5pex9JU_Ho6Ql4vWbpHNjbOctBCa07c2v9pxnG8dZ5B9YUap53rbCoctsLAN_tTtevFEL0D3LkgJa0WqavRAyki-DY24Mx8e2EKmSuF4X7WLoHl1Bhkp70PxBnUHQ2m0Wshpx_OZxvk58Wv1CcEQj3oasD18aEuttMFi0oDbnMDUaX0HapsQGgVlmWwubHLoLDCtOhKFroTxiO58OimTKLF-RdBTAzmHgEavsMY-qJRdDufSverET9F2ODBzW8hMV4yM62-rSr2CtTqMmJ9_-LagTw70A0JUNNnkPHHMVI1oHZVyVN1LFBb8gGYUl2RGwTKVL0u9LbGGxFdvC5NnTVnyoke_YGtlLbbn7uuagE0sVgR4DFuu-djq_wJ-46Wzo4C8kIgxAwE5fuk_GmkzERTscFyXMu93cOMazy75EiYZZAIUhS1pLr20xct6oLZRlAjPRFGyZbGfcMpAXrFi03z30iygOfkt2uUCZnn8KDJLOOfDam_Fr4tNF-qDLi0QXUEwKYgYkB3BAx3sD5wGS4C12eZRI73TcCzKYsAJcWsRiWeHWrdPLqHO2VQX9cFlyP_1EG1N_cowOx1Ulrei_Te5lGSxoSlfUYGlJiDuVauGdXZ1eEd-QR-xD9JsZul65TzrYAdrdhX1ENK7POArDAdbRSw_nJYJsUSpD3oFoM143OFzYeM9Sf4buLW9F8bPZgoPhQjFVk-sV7AnQWdFaUCiViwfoNdtcuokqKR3IWIGIN4Zg9xEKK9TF-NyX221aiiGo90yKl8D-4h1oHqNfosoSTXfQvbCdQDVH15-ArJmnwsag2hU3F9ID-TN0ejg8HUUFByyA3JDcDYSjtj3haqrAGzJYrdgrt-mLiBWeORoalcSD8wf7-bpHA1W6s3mQZsvmWO_oq7OuRt8SSb-8U3BMKBJv8IidNQi0Ot11qAolqeCj9ldetcUVxtW6baA0qu9SiU37EGK9xlFwbEkuuAWA5dCMkw7m60PZHPAMYzVgby4ivzmWsGXHOVRSKcm1kcDhSq_AUrD4JGUQJrTdmU6NtAwQXBmwof3f__WOvv_hE4rtHgXe6ehiYPAn9cEbhN1iIzeLg2zwfphlirW0hna2Ir5mlswmEjcl6N2Q-zGpnIYQwp-_Wu4wrL5NTytBk8BOTunueva5wY56r3sfc3AJ2Njswhlt9lAOq6hbPDS8N4vO0Jh7bAAEeA3Ye0i8HkuTFw6EFGoPjusMD8ke9G7aG2KnRgagMZPa2vq4kVVLt3HiTUBfBwro--QnpoC3LkuFJ4K6rNcGWXvc7_aCsd64heGYRriqT1BumeG55oopWCAXDJa0PK49VcuPNlbtfIrao2xP_2bsqBMhSJqNW2qh_e_xqpst8pBJWUVvrfrlHm_fhhbRlYOH8XmrFezO_lGzo595McnLM3zWUIJAKYJnLXjitMyaxlcYjhFm79Ytn0KyiOq-MevtuzFM70dNpOX1R9Y1U7LL9_A9yUENVmpF4k3D5JLZ_QxE5Y4NmJharAW2tV66Z3u6IXXv9Oo_OG-2XEW1e8oo4YauWNsVr8nDTc1DSCAXgxSKcthvO3P-zyhmdolBi8U58IbkQGXcbwew-Y5A3ai0Sc3cck24jIrCxGs2B4fK4zOgxqlUuJuzbRWveweuY_d9NY26XOGbQvMhLPObLLe0sKjpDnORb6M-agLjidvCy14zl15HbcGOp37sCPC5QpzEJaPLoXEkdnlGPw1Fa3DjYF6qozhjaSHT-GPZr0IS0oM5RdFXgpgXknaKjX7C31MlHKenCo4OKZ9jHTk3JEEpodTGq3ZBoXct52rWpUDhzLkVCqecMamV9PfQ_DptOjZr5rRQMG31q2oxMvDxWvsbLfqN6m0Rfka-3dnzm2_YolBloFs7aqyaNEKWdXY4skPRHFb_2iuUtChPu8MApWB11SqRG7F4LucYTeydOeN5HodCUgME23jYp6Sn9rw362yP0D8ybMRPWzPLUJi0QRyrB5Ix9w_kdevsEjy-AA7c8cfAGKX3EfPZyK3Q0LF4JwYjbp5TZqQmKOdUY4d34ODefLiHc6_NeoBFMd8pe1tzZ0uLCc4Zm5hcuSjmanzew8rUCrJe7lakwuceLDOmHAaNz7pqzedyFwNyIlxb_i9QYW2xdnWUh9eUGWNPplamJMqUeDupShhCXq8WON6VEaGwnqX2M8izaywiepEjwmoUyZKwwTh0nWjQWwgriKJb8m08HIHPzJwaRSM4PbxVl7xIT3bHObUn5hopAOzh65Me5FfKcTAgCKEa2Qv0G-HSl1lVdwaYu7RGzJ7rXbB8MqslFi1NSWKKtC5IcXUKHue5_iOLPQh12IRu2mwYiF1oYz0Lih3SclB-Wqf1nzqinpr4I5OcPBFEUZILmuFss_Qsd-3hEUrE7sAA5FaxbGYiYz6I0KCSzYdedh3gRAhh9TIxL_9awRpyu4T1338IXHloO2QYSEUdWMx8V95nsxooGSFsiIxp7We8QZZR1hkkaG7dLPoyTSowt7WyF0Grg2tTI_UeTykhQ1TJ3FiU90rXdlgs9T6mwDuk9ZGIe9Zbmipm-Gix-Fx5I4xFaR5n6sd7Js1iANFnYa4vQjx0JDSQXZz3ZOEKtEtWFe3xRBtAgm3NUUAtnAzMa8xhC9grJwdQB9MfBRLoeqi8vhYZKUVzhe5iAiGPHoNyiN2Ilvghcux-RZLnd-kYhjUpqc5lfP-WcUnsuU0YANrkTRC3WhowRIbRp5SS-GsKTAyjrRKUcbAFPS3SmI4ZhGjiV4YJIWbh9xUW-xCM0m1e_SCKXPcI1-2KbS3nnjL4YrdO36nG_PPoohNGnRuKta0TwRE1QNGZJTH6VhgvpcoDQgXe74QUnFw288D5DXtirj07NtG1NHoRJ1Yq4HYF1qQ_uO8hACwesW_Qmji20MYo3wA9Rrbm2aNoV8H4BkMjH-_coDIVb6IbtVV6Dxs99U4R9V6hhc7rw6jlVPiLjYePqKbkOJicOiMVyCXgVtQyM0Q-aLXoCvFap2j4ATFYUUjUEfVeTbvjyHOV89wGC4_1zpEzIIyWVjIaqyGr607vdKhvXICg0k0M9vKDZp6nNG_gPyLvWOQIJyEKwjo5hB200vxR7LnJoqaEeedCxXlkZl-c_YgJ5WPCHWxXbm5-3KpgtZ1_o-5OJRbw7PC3w0dKw_h4OV6rD5wG9-h0eU-gncSfuRUCzbYZVSRLgnXI4_eDbboxo8PnAuby1J4Ox6NAup2aAxl3ZYAn_K51fZDDtbZ0ZIpot7-dPcSa22TdisH80pOTMj5n38CJEqQl6oTOQU0uvSmc1txTcSFPHcR6Jd52Xnw2VTDIAF3g1bOFFunGcItL0b0HZ75K2dK7rrhy9nMNnFXF1dMzgpBNae7e53KRv6w1LEeAz6QaQumQ9M2i7nBu__tOZk06SwrW1ZyMiLfrU59w2UEPASmDtoQzWvtA3_llxISDcAcsw_PQv32InxflNKfyCU8wmoiKdcsDp0l6Kfe3cova6LqGSPUlSd_s7E3e7JCMeXys87RutY0uw8yHo38fuygEYK9RQdkm_31jyzvVX15jRMs3gS3i_VribgkPuDpjvZ2rVq2B_PWQOJJhacybIHg6U7MDDzbbdXZUedv0NnA05QnPzpsYE5IqRQcHcBXas5BzpiUaEKsZM3ppAtJRxLlS484rWZi-Zj2jmUD5RkQb99LVxAkLbYvmc5krTb_0kWIEAIH-hznS34v3NmRAVfYTh78kLljNFFitzkLgvUTKY3sWr0qKrf2N4JCYzNjcCYM8sPNME7d2hKr7VB0XV1YVKrWZOtFzxukjS7oHcRJC4w0LC1IXTjIkEr88oa6GrA74nw0NS0SEg7prburYPNCR_WgGfxrscu_qiV4YPHUu-VTELvbqgflyZFR6XCV5EFQ25MAhY5byYxMZdDQzvYqYy_3chADcX8QBQUOJU8aYfUPfJgV1h3lS6GTSAmN-6yVXHjs8krnSkDkjT2ZVCdneXvul0wEaV326VI2cIAjv-xeh7EeDCN_WV2e2hTEngfK9tJ4hHNBK46uUDl4ThPCoFHU9q2wLr1CIWmK43tQljg4qb3TIQsUwEZrSYnUVb9_scZyxCXBtGACLS74XaTjiCvY75sbBr2GRdfc3AJruXwcvUGaA4tdT55n6Sdkou71-Un2IT8dlUKXSfIPZGqvrOo8XX-2prSXKQZ_jtXSZzuYe8LFXeI_B_JhXFMAD2CG1exEd0brNLXXB2yzvy3pxio5v6PidIt5YizlcUAugPI_3vdMnVuO8gAsihLD52MUjVpT83y-p2mWXdgfvsuNJC1Ritl2M8cLN3lZjfCH-IPI62yUBLcQA2P4JKaGh93ALivKYVgMEfwiEokhWe7P48MgSm_hmokQfNpj-MSWXyozjFdj3qShN1naO_mh9lXD7zGj8NzTwhtq5en8k2Ks_J0egFR8bTkg_FZGbxgM3k7MT-OulK4ilru1VDw4fZhjJ9zdCpbIOZ0-tyLZyQDQJvdL5N1xU14yFNlNFHb1yi6oiG9mDoqNr3GFFbgzZK5o_mSnDlkHJqnuy0UfQklshPKwWziLpQeouwUZxZ-jIe-QIz9oF9QScrI7mzge5_nR5Tq8vBXerqC6TBQk3gQbFo4SmTEe_FADh5YzbOZ_3-hycGwmYBMOzGaEK-DETA0XbcBtW9y0wHruuvyunzNTOBN6W4aD9jPruyrtbcbgp6Oyq8NZrjDWaePzs0iLTthvcUpRLCj5UNnvFWZizclzPKK-pN8gwr3TfoQiEysIEOCovqTFBPgEtEh61Csx--IW7R70trxeZEllKQdS-hYzCwCuXatLoYk-M3gMK7sn-gdmeuXSfkMJu43OLqfg473e2pIrJB85XyqsmPqWjeQbShuwGfTeWDJBWT-bg-iZv58uAk6rViFfNJ3a0uwrwr49uXkpQq_xRmRbq6kV9yIqtQVl5DAbRnuE0CIttpiRXc3NYac9ff6T3sWXCez5obfWFkYNXhyc2jZrhcI9BLomLyCYJo-LBliOa5lWFOpN1WyS3VFC03VG9cJTWr-Pvp2rI_5m_jQusM32Y_WIFO2GYyXImpfz_yrvAYbTKC3Ulqf5X8Tl6cUAjbDWc7nIt1NughPZBATAq-0Ov_5tUVSv9DohrkhpizeCVEgABhIANjpl1rML_Bvh5czXxBmxB4w-qBgAI6fKy5yA3-_XKR7klUQJQGAvgwa4yrfC4JMKuZyAKbn3ZdKeJBcvUXSUecDAfOxuChf16M8Z5L7Xf4Ktau3qsYIBG8wBD1tdZfscIwI7QgRS3cVc3dC9KNZkegILVqxUgeiPEKUHUgQNrBnw3fz-9fVcBiEdlnpC-DFCJUawg4sKfrungcobSBjLOhz14IqkScshGQ6FI_k4iYty-UD1jubTdlkjyWFxFGu8nOiV0oG7zM9c9RHhVL2g03kQmA7tWTlxRnxnLMI_FZ8RV4mntARY57dPuMRvY1jllEZrG_e1b1IUU50Dk4Rzw6yvcS85MLBwzOdKKDophvy-R0zHCaXaTFN_BuGz7gm4leBqgZI6-zOeF5zYSh1ctv_RcKC4V5rbjoeWPaW23ykfxeelFLSm_Nh2TDGFW9OJligFvAbi0LSft95_LqS7EuiL5aRyn_uwzJYS96EFzzT2c71xWNgr1-Ye9c8mN95zEvMMWqp_lU2pY_Z6SUO_VN5OMA9wS_YOcP23TEAoGGgetLBNTvs_CZaZxNgj0HJeXABHwsPG7OfWCaG81cj6l5dBkDh01_EjERxLcvQxCDmPOuTCswNzfFj5t-mAfSfeQG-8Txn6Z-ptnl22K4DJxbdnm8BWTPQ7vl9VFhoRQu3hBIvp7bMRJ3gG2AA2tGojmjFek7GfZ6A1JCAe_pO5NBCWpsZOuL-z-tQEeB8Ca6_HNhfPzHblHcnSL7XaIWfg2JBIBLT471Vq4YYG8utzYxTima_ondUa060YYZPTkKiMG0fsi_HYBkRZGuX0p8pNVCpNsgODzS2KQZEWyElLLuVb1264shLlyTtwdI_67Ud_lLNAc3K6jxyreBBKkGwt6GkSxuLvEEQ6bqQUwn4qaOwMvy-ZYA_F8Y3V_RQpVzUZUKhKG3ihMIY9Q-JpEaE8IVP75xctbR6Nv_glqczMZ9oDXWLviNzGnp-S92jDaB2BvrWL6bnqQ3HtCuSeMJscs7qlvLUUIrG8zk-1Ar3zUO7kvbtdqeBVa9Xb89NTLheSxVlYsxu8DFq_6x3Q7btnkdjtzfVZUesFCgB5vMe8FHQlvAM_kbvoKqIyAQN1e0FpZOomb36zfdn-rrYsimfl3nCFGHV4onWeE4GT-LjOXI9u5fA1zZzwkLl8xdvaWzIaQyEiht1MaUYQpAE_lbLP1AtBRGeKYZ75T2cl9-1iOlAn8sD8OQzVtuSMc_0rAsip7fehFQe-C4CAGTG5JpK2KjodfsG7aN2GKsm3gO6OGTCsjtb3H0yFl_21CrAB5YEJBSvSK8Ta9_QZK4rYX-i9siB92SGT5AolUBKj5hyPe69uxDoEmLLRelqZGAolCup5o8jLGf0v_JwzUFKaX-GlQfQMz-n6manuGaZVdKnMfBN60HJOiQhjhtP_ILPd3M5Meu84doYnuElMaPsCT_jFwaWqJl-W_bE8fViEQNrdmJgmZT--6ZDDouQDwWJegqEGDwW0GM8OBtX-jNhntFJUntI7j-mF8Q9Cz1oj72sXWBp7x6952GKscJMJwlyL7uD__oh3CHa1IkdAopWUw_0PKVYVq1mG8mRwN9c-zB9IeQ5Ny9Ywly2wUBTuyvL9kqm7iSAakOlnfzIFLxB-jHpZklJ-SJ6PnImoDaPsgaV6mkhqaG2uf4EMyUhg8MvUXcYHd7yazKld0Kg4SExLiyCPQCgBtzoPCkpOJqfxAqWTUUKQQHXXUqq0aFb7KJsglPDxWg7Jx5At1Q3OyM_4AZL9Kf6ZtywSi56YUFkw6W8bLfnWQ2_u4jBjhi9FPiT6GgCf5YtvPCwJvYOe0KU0gUoRVttzLAw1qBieOMnOP41FnaTB-EoGJJjHVkF3a6HszJiWSK_bXgzy-BcaZEJM5rDU97wvazQZZHo_bEXMeDPAmBalWgeAJIyZXG1vSl3aSiQwYR40ReQIq7nYI2cRz3dnvkDGXqdYxEjoJDR6VxiCtBlLtNuxbwVLGqlTAd5NaxSr94-AL4-QbzRHjlcYHSnQ1t2sUMSA-M15Lbj68Qtokqv8rbCA-0zVriPR5fXOJxWa0Q1TeMb-oL4tnWKYtogcOMrEV4BJNOeP4Q3__QP812GQZb4bBpV64g2eMmYDi8oDOABYCoidAL1y7Dc5XBhltJzV3h1r7I4UafXsWRE8-B7Fcq59Gb8FwyKADndYlbkK88bHCl_GQ5WY_OyQ0NvPlq1RQOYereH5QlBY4K8JkSqS-LCq_TjbItgisgkapWUfmhjar6y6Ah6Y906lCycKlTl-2SRM4Gk7L3BTpBV7xrw3zFSMO7E_f3GYRv-WrvzCXGCMJTgBclTKZlQ9qmbcSqNLkBz-aUn4ttBL1UsIuREXGXLBclYm8xOpkW6Iu3a4dpZe3EoGigT1cPtQAHJNMDgEjb_aNP6oi3uAHV0hqhG5UkAd_yQ-8zj9g2tzBDSQ2k7tVN0ILFXsttLXSAjAoG9d043muwBTjjn5479CygAf8gITEZnbrjyH8GhEZhgkO4GSVEkeafMurEZYmeuN7jddvk64Pc_k9rGzJSx18mot47LZjgIT3CJd1KLC_qvs_u1zTKdcNhLx6T1S45UuA_b3lA1hxl4fbe_SDy5BNK6lpJ--4q44jAhdS46h1yriYCK4Lbss3S8Uj9t_3v9Ys_lgQat-deeOwBhgyHm46RteYTlpCYVYBFE7fmji20O4adrILVcMc2Si8meg9uUuLifBBVRxHzwdxDs7Cz8AEdpglfxUvzqNFouG4aYT8Q-wF-zfsKwqaZTMPio5qQSm6wGGy1i6nm_YPjhoFQ16ZiecfDWIpOgDlaAnOYWnLycZPO-HHiG0wFNClc4uN9_4y9Z4yj39ER3RNqIBgJ4Wi_7vtHpOJlLYyxAJL_r7-tUAEYvBSAPZrhEasQm7zJkOdJwibpg9S7K-VcWRTUGdYuoTgRXkbbtex7Z7sCEYxiYW8Fs_i9cs1TVBKVKUu0WXjBjwH1SX8elhbixe1wDmUYwliJANUK-RMYoeL0yyNyzN_lYS-4gRUn_x5CJ2dxBd9Y5QIi1ARc47pfnFG1_GumrWMeSgiQyKUx3iK9UsfES3zaFczhe_ExzBvMtpLe2f3ohU9OyJ07aOwVs8woD8r6t3cqJmq_L2l1ze6iyQ5VGP0T-Y7lgxL7cEZ4KMn56PDrD3UsGUnvY1tcwr7zo6-XwD1TzPvNsix-LorctWYHLfRwwoNE30Soar28x5yZwFdx7RQ5bQamblSx7I4xMCmxiBS8Pq-_DeKIbfCriuliEIDR14aUvzP5-AQhb82fDCt9eXdlFFjrJRpiOIAUJQbUmIn5kz7j8slfLiwBe5xqhDFEEHPSc8WLvUMH8uuSGo2c5OwlyABerb8SqjFax0KbXf82a2Nx6hnHAbC8I5od2BBifHXlijn54i8zLM6TjCeSUJURs0y56Qq0-X4l_uKTQcNV9uMv49SCI361uWp0bCyCVT_OPG5cn6MoSBIyS6lWLSGeJW5JPY317GbzAoI07UuczkZDdJGzfqRCmHc1H-F98H9UbVgD2gtlxDUz5dCTNTeCLtOA1WoAUnlYaeu9ZNcqWrImK4QkW3aKDzdEsNzaRGAGQqX2P4vyj2cB60yhdlwTS-LjRBfDTfcwTioD7omjdDxlAbLYAj8_JkmGEnRmWlQNU-8xGwdAVV7dWzwZhzSY52IehUU_ncj1_z3R8gN5R8YMwMCUyDdjhRowfR08K5KVxerZNiKnehWnzVWl-JBfa8_FbFdMwBmxP-I4D3cjTdL-bAamOi9f9iMeL8HrjzIKwl8N5rdtj4pcqgaPO7gD3c-7N-Ioi3PSxzHU9KBqQYyj849-uOCY_BTcJBfGLtvh9HoyLqbZuR2QZjOXnjCnF4gZkhm8gkm-inhKLhRdAXjrarCwC8xOM8PcWQKqdB1rehB8nrITsWS7g0Xt8l3ao8Tb0JxJHZxL1t1gnAElWwSZ0FRHVXWwmKI-7UkAZXGwThsWCxVLGAnkSYF1LmfMMmNM3D47hkYYOJI_gaFVtWWSNWsqTbPXDy4IWHhQGnkzgfD0pNRs6xN4Z07rh9TJ7so90ze5UvFLOtXKXh1fGz3lrgQV7vbY6HEAx0_pSuKtP0zZSPy9xavQOTFe_YQVbeUhrNIjfJdiF7Y87zT33-eCk07I47JysndFdlWpelbl_L9SuP8n9ADsrJExfg867lXD7l_QRwp8OczPB_T4aQ8PGbMA0XfYy4FCswlcaT1xVcE2sPeyJVTcq2y92lGR2YNXRS-_EVKhGZg755y-X35D3U8n4b1kfqJm-Og_KtGZoKlHJ96FUeovAsH18_sAlgEzpCdH1wT-yTbKPzzN6FaePa6IRQgKlVjNu5f2KtG75iuypc5rLzsALlMJo53o2UxTndsaaQDQPLyHwvtFtNrxxPG0VdIiJV9GSbkmxjdX6YAYxKvQXLSdwcIe5vHXdPh4HMd3MLoUAhzCmm9gsb0lRU1gtYa2vscoBi0VItZkjQj7TVjxp25HRnDcc5dkF9E0OHYQXeqx0AWnwtbVBlzNj6njxktK-A8sB62Yz3V69Q8xAUjNdr2_XlRYqLrMwiXnjcDIxSjKkE1N81PzOnENXtQRhcTVW6cf2LO-urVsSlSGXUv6ok0t4W50DnIZgNl0wKwKb8x1QFeCwUFcxyoSw6dNm3B0Kbw9aI8-l6WMJU5s7rN6htMpbDDl8rY4qjW_gZsPFjgZEX0uoBeTD9dk9VvWKxEy0x-V3-W-4nUHZV65pAbWpWyLkitfsYvWhM_8pd5Nuga_mcy9_jIUgCCYZcASGnV36kul1LOelP_5Eb3jUdJeIITNIgD4IzaOP8sv7a-FPqplUUBTkWY5Yuk6TaefL3Cos46uQj4l_AVaWrHx9vsYpo2M_Yp_YvX10IWscGVOOUBHuwcJBZXu_Y9m4zQ-8IuV0VfN5_BuaRamkKQx3WmIna9baQhrXB0dHboStOnAoGYuWnwUh30D-0zBbtcXegBw4xl6RERmkyFE1vn-3sBkiR3CzsfKhkZ9hL1eWly8JZVgwagXG_fPUGjroU56_ZCKnRlalXyXwp7bvXWjGpSdRyRotOafOB2L5kzx5v60gBNmVgVxuqlAjoETLeh-rhKWg221dxhgd52t2uZAPAb-bH47KMlY_4XWJ4hhEmfEi2MJYuDKPLNW0all9jMr6s4b_HbwFje4YymNZLL_gQTo3AtfXF_KuQHiyf09-HO2beyQflxy7k2p3LYXXRSZlzxLfto2BWHMgE1wHlCPafu-qibAuvf06LlrXOmYEXp33IZVNneFjDq9upuQCvSpeCsf2Q24MJJANCFYrSpaXtAjC1q4zF3trosFYF_HTZJVFResAr_CMIJDHrgpBs9P-cHhEJqOjY1GYtYecVI2lDr9LN9l3nGucXQIsLi2vzMSUtUDLByqltubDjvMtWNoatTjF8nSKpb1jFpmafTJ5d7_k3krbKJ2bLF-42yrJXXlha8kZTrfYK9heepDGIzhQ1wFGKEBCAIraGKmUyiDPwdPSW5tSkI3w--rRpMq8pvCPx3mdD2eqQgns6zU_eOzk1j2I28TTExGWu_ymOTlQYtAJPqS2KyzmK7aerKEphYZKgtxIdof0Z3_sqUzQh9NPjVwh6ip7NSzKOEbZPNa9w4ItRntfAGy44AvWbxj9w8KX-GaKkk1GUW4sGKbiA1V3aPx-J3fv-iEF9EeudnMEQ1PC_GT6xYZhR9IaqHyfQX_dct2wOPiFbiQg0jIv7CjTbzbNP6KdaVL6-l5f3Mc2uSGSk7h8uL85z-NlkTpdogW3e0jHN5R72HGYISCkZJnLolILavrhHCas23F9dZMkf4nwtCFJuIpzyyb28ooRbc6wuXPF7vYdNTFUZxNZLtcgr5-TC-ZwXf4Ut_dDg0k7weVdd04VztZZrsvYN0dneAxECCZJcT-omJS4KvThJ9nen1wIUoq8Rsq6I6u5MP4tB3QON52KloXV05K6dLvLe2nf4rhniXiApL1ezyxPVXeNlfRsGeU3CTHCSu7xhTnWXg-BGxrb3ITztdgeG8y_LwVNKMTk3g6qb-EM-szxryAZY3qu7fpoku2RAMoj_aaLfckUnQGQmGLe8VlbQpJ2jGhikaoQMeJ_spEZeXn4X20goAbhTch9g0LEKHtvXeerQnLt7aQXi-VezS_Ya2TrnmtzMryYVvCJ5aR0sp8pQHJoIlKuubpZY0Dbz64TOWDlHj0ecfGxCxG1hXkC1QyCMKD2fI0DuO4ia_Cm4EIX3k-rr-n8LU14kvK_AplDXrU2y0ZVtxKpNSF4TTkk1mQ4adCWcZf9Zmvd6a19ypDBB2B-jT6wLCWExGGTJxSXWenN-eJXxHfOJ1cFQEstosi2cLak2TdY3PyvqndTrdBiLkvYkooCWedKB7i1o01piaqf2GQxHYBxIvaAXBb7TNf7gJpDdOoI6lCC83pM0eCEpwojEmxnOPsSTYEsEK2iy7CLAwMa6ZfWfM8S1ojz8KPcIw_E1OUAiIc92KLsxw_f4eUwysbU1EeQCY8Jc5D7pMvuUFU2wUIcXDLyjBwU8ih7F_B0OaEQOk--T-qsd_PKiNvk_1LN8d44UryTS13DEUUHOrgjn6lp3yr5i8rl6vhGcmLG1y1ZcOd2Q5LY6U_9u05ZnsZ5Aa3ISWFvIJi0twyU3JiLt6ycnSq1mXt5Fc7Qhe8n760NIP_bvOHafxw5eD4D01JvXA5vYpgRrR7AxNcZClS5t9h_7AjDIp8ziEvcBBZinP-jEYp_EqGC8QaaqU7ILi2wFg8WxAe4Gm4bqxRAtlzpKJpJHp4fiAWgcQ-zPuMFdtL0Gmii5qiTcQH6Up3_W-PK9hM7ibpp4d0PCQhApRPzpkHjKeiNFlG5wwwYQYnPxh1NEWjEZAjgSvk0GuMEQ5pdGR3yRYA743ktWum52REQ2Gw8Ct-7e4fkKd5mJvlthR7XxmNEWj-COmIwdTzJVAUdzN8z5U97ee8Zp0HQW0mYxGP32AbYrrOn94nGNoCjNJSxNhSqYbGdEHdH4mvJ0bnNYtFxjBx-t41efIpPuCUsUbylfnlgcdvFMNosVPY7ZtrenYGubJEti1QmXc9gSjMjuxpetc4aTCft210wPpAdxfZOySGPPulIW1MLMlOvYBvKLT0t8G-rOLTMpfli6qUFAtNJ8YpqzHvLbUwIPOkYTwZo4uG2VOH2KYn_xxabzfhoX5uG7N07YLVwPS5u_xUx9sns0dYo13eQ_aMwp-Dw3_XqXtdL1ejahm4fvSF2DFs1ceqFAGJVgXLe9GNH33lRcZzrwsqmPJN5RoFOT7zcgjIrYNnpwchaU1qbIkQx2zMuvGz3KYhdQRPEQAMkAkU03jc9mA9sEm0VYARBz4S1cUXWFVGzgYRMbtaTwch9LVVHG3fbSFdkMmu5Y9PhQ-1l7BqIGRiN-6FxADg2YoXHtt9DVqEThuYdYS5hftukwizgo3wtlG5_C9mILwU2nhhJU6uT4wLqnNwITylN1ZBvLIgg4LfpSl_HTeEgk7Uok9FyF_MaZTtWvgehcbZjslg30qXi6g4Gj3X_tqF_IQP_s83xR0jfTddVPspcTdLJzT-bJTMSQgdGxoTpid2EcT7v46UWDHfWeZJWyWT6weJZwM9pzdNirBvxD7_0IeHQIuGRvOA9dP_MYaQnV0JLVQXPaHYnUt6kJPxyi_HzEA09CPcFnzMaLUKL487qqXMQTE_F8-RrZEKJ5V2nKdtO_-mjLKVr3yR1vw-bvMyCnDTHvkg73wBOzVVCVZfrBF-krdUyuHLGhgOr4jqIkVVBbmNW6tlPwvXaLl6CA7x0-QbEa2nKzr4aUJhW84S9VdE1WAnpCqvPafNYIAJl_wrwUynPzpJd9Avy5VB-kemEPagLt3VkZQ9LmStdx9D0OLLi_YRqWZoIiHWVLDTCN5z3G5kh6G5mmvDSzFoFucCabHJG25wKzcur8YQAseQY59jjRiCiULjoL9Cv5DxhlUbff2nC3QgQ2_JXuDYBOXOwdMGsZ74GhLDQHRVJqs3mwxezHunQf4r7X74UfgrcCuDR_BJtS_hQVXhWb8MsVrxN4svHEE4f1DXSoPPD8QxOYhUFKL523oQ_mRxc1GE0gMRtItBc-EWYhepaALZqC63bNtZiTjOy2qf51dUaqTTXd15l1c8rIuVIMIay02C6JirwfAFhzn_zd8DCDMywIkKrJwcta4bCQ2els9mFt3eN9awam1HcXcbzNQqrM9ELxZhGVN5kWXNJ8mXJSWADhiklWh4YRrgbeN8V7U6BbrhNuvDK9JzTtEVjtmcSOrHjJU5r1uIBOYO_NZ69zYMkszRR7eBa1AiMQozFSzLBA67R_b-vtbrqgrUjg3hmLgEZL4q2M3vUJImLzHruWdGtpEniwfEuFpkJgqyWh-ezUkOoZZE7gARO48wWmT4X9d7Kx_RGQaFXvZGQtqneYLp97sxfpTlpDzKGFfI1zzimNyTiBUPWQiaSwzOH32aRvMSYzuZU4qgLPYF8hb0ptuJd2SyfrAdZeddfqcnKEyQJMShL54qflgJO3zZ-L6GqKMKk3vbplMkS7hdQvhtQZZlqtPignpIogCDwkwUglMZYqyDpgBhohYnImAkoeeVQZb3e2dyRTE6KtdGXDEW80RE0xMrW-VOlozz9HJfQQqfjuQjKVtme6Nz4DN4pmk1TKM6ztZKK43_6YSB2JWaC9TqzgASEnfcDVSenu0_gIOoZ5f1aIfiQRQQKjgschq5923XHJbhokA7kOfjvj-DpyABUD4pQ4pu8Am7CLU65BXKVyb9_u3pazJnGocHtBi2BC5JUh6E6K0HRIf-YDCOtejG_Y5X08nr38dpbVDgVBKKRmHfwIFTK1Qx5XuYFxG7gteeWhI5xieK-nBkQF6-WQs0KxYTblwc29PoKJqYYjKRvOWUhkAT4LHuKtkmk68g-YkA2fda41Yq5xM6MftXhwgSKfS06TSl2HzuUAaqrtHolW0SmD-f7-Jvl27K_r292Txb0I5MX_GZfcam-p5dixKzhBJTCqOa3hKNTvSWo-jW7ufg5hLSIehc0aRs2BP1BI60MhD3w_Q_xnJD5KKHYMW7V2Rhs0Rv18HZZdPGDGjvqsu9wbNPlnFOvAUsLZCI5SkTQ_3s0BVLokT7OTXL3xYK1qP73EKq57oJXm6XxeG6gCnQVe4cFjQ_7j36v-ap1BAJhv7qyc7QWtwGoUdjIjdNfXgyjbhlPHyESkWh_thgUjKYTLo4WLXvfLOTj1-NEuPAUf0XstzWwu-j76UprC3JkJAweRGyhgjmvwf62CnTncQyArMfcrh59bdm0oMgW80WQzD66sdDC20GMhjNUig4-mpWLu6uieLz4A4xZodigdEvPN791NizOAisM9iDVTQOPDrbS2PksB_XtMo6Z4cw4oJB4PeXguzxsUA89w5b7MO3N1l6V4tQPmMWHwElehKLN0PnuRAfKco_PAvRWPmjFFXv_Z5YT3xPVkXvVUHiUpXH3o7lenrhiSSC7sHwqIWftTdGVL6krrHGY0kXGTytJqIa-EoTin8lWmLFy-tbGi8xqxumhOscJ5-Bs-gYptcQCx3NhrW546F5EwOHA4fbrsXl79jlyF_0n3VflaSdYJOePzBf7kOhm91ssJpxV3_0hZ_4JEQppFoonxf4SVR3NEqdrCi7QzVNtu4IHBcgFUzaaLqCbJgmd2NkrgDvymYivxfkuBe_S2Jb6hH058o2EfMUUk1hZEfbCtxo10JbaMoJhuL6Qhbuo3NHRB_T90jBWl04WaBvhE3HVhGqDVO5RrZ1kLSCqsbfe9J6wfZiL8RTPBV3E8wjB6t0sLrcQGgtmRK6OwjPDvn5-vVjGHoH9jbp0xAreRG7lHN0_aW3-hwQHsQ_8eE1t1NeCdUJYdIPSoYKdfU8ZlNL-RFD0mvwbJN-683Sont_RK55Wue2os318vulUyc6tXP_rElStf-Wm95eDuOEuApQVaIlK12ffc2-K2ZRZpNvvY8xqj8t562fy6JXi5jcroksNCxd6DgZSulrLwNSx4mDBGFOSLg1HAbFKY1lytTAMcnFx2W7d8vqUdgyk1RAQnJr2IDrnQwy-SkiPRkW3LeO5fUmWV4vYBLdooUclPUEmL_ALFMMz4mq1mAFubTz6bPsss7H3ByxA1mpTTT15onT1ptPPSxCATR2lzy73ZCPsZ2A32kiWvg2DdG5OtHZXLKFDZS-58ro0nICjHytwXAcoYnVg20YvXRKUPXl_KuQ0RwtOTJJKB9m7llWMUNI3ibGwiI1MEAHyqFVbRNWYkw0kLwgYI83odH43iY7-_auo2R-hgaZ8JoErP7B_DbrizTM-n82s6fVCDk7XvcOpwmxqb-sxH3XXZbPfSSyF-dwXeAMR_cGGfqravHCjahS9VScmA7Ez2YtVKZGuiA3-SW92yRCRXI_ol2RUuNVHc0hpAGFE01eY-6YqsCGoz0bL7f8DBDA6pTcAgWdahl4cCxZdcP3NTzOGTsI3nIxProbvjDWk99f1iNaPfVIp6BlzV6uhbr8-tBfNxvRl9RhbpZ1vCaWjt82CkLXYgW31OZKSsYnZbQtM4fFbJQlZPCj31XMl_zpFjT8Klc2S6Furz0yLbX8CriNyAzvq28djCF29U4oVgCj5hW98H2O6PnHK7gOeSSMqZF1Ry640gkiintQH7v68360sqbyCmniusoX0NBOs4TFaUP2OP9V7qicQM4rirz9bBguvSfpR-N8yoxS_HYr15zY9xtUDfO-fGLGs62WbtkVc19lUdmXSaweSNAFkOUYkHkPkDz69HRAqCLABvT98eCPwDxkmjT96aypZ2TUUOzzqeKeYWkGrbb4vBpchfeNn2pWanuAaF2trTmxYj3VH0LzAncplZIRGznb7bQ8qyxFfUoq9y75X_HZxOktJbDAcZWpizgwg1K5bPb8NSMqdEyeFzNd-TJ-zk0H-dzD-Or8e--2zO2_No32PaiwocRiK9cNGaeEG5FNd3oZFLvB7aT6Yq3Ys81R9rCmLrH0fSuPKckyq2xXX3Yw_me6bAERQwG8p0sgEK3bxH5nP-iR9CrvdhNvtY1H4vNmre5ARXOK-BZuWGcD5T20D5BGEu6XqyidJ9mJ0LCQo86r5umHDbzb2tB6fcWauBN4lBlqMNu4Wzk1-VrZWMTlCRubOuQSbny23y5W0pfBbuMl08LuZXkHMV0dosQWHfkIxM62yuzn5HeOIYtb8wlVCMPcgjH1oEpR46SI0XWpAAjk8w_uepFNC0nOp2zvxSiMo_df8PR_qtGxxv0eEu-2fBlVPalA3Kabc0wjVXIpxQsMyQl0sqUebhmLM3zcaczEX6YEAPdpVaaGiD2XE8i7_zHy3HdIGAkPteDoZp0EYID8bPl7_se4hB_f_wVV2k9U4zqbFFBJqvbw0oclueQffeVCxyZ8IyK8s4rDhqShbo9Rihiem-cICx7SjR3H7BjNqFuKaScIjaNhpAiEmbMYyw-9byXgZ9B9g2SBym1ytfwJu9H-USAeiODtEf_I1EGiVzvH0gNGBjjgCX0U6kbCX0yBJBdQ59-eZKc3VjV6mbwJMJYSGpuCfBAqVigZx8NTGIKjO8ekVc7TeGpf39LFhrmCYKeHIgropjJnrJ4hU4KAVwCSe6SrdNmeh2lcr6sCc6VoHmn7Z4hBHtjPz2xZMbTrbjIE7VKMdeNdKkJ1ImNxRFgiza-7Kw3fnK-ls2VoLDOgsfc3va1uSrGl_z0CxEt_1FVHFGMWszKU1BOA1iHCVKRDj5VLY6CXFgl5GHtSiMvjPsd-0FqD9M4qMkLJW2qqkUXYWNOy7HyDP2kf7uD44BH4s_EDKZhhtl390JlNYVmbdURT5Dh2atOrRrbxwt1iQCInLZpiAgYeNHIYGWI_gOp-6hMtqxS6ldxsqZTpMVkOhuXQh8JgXvyKxumBzgim-uUZBqdQmUhLbZmh24tXgTBdWtdsT0x85CdAH6Q7QbZTWcRl8n-qqrcz8OTqXOpGt_tXBGKMSV9Yw4925o9fpVxTZErhpsK0ABpY-pavVSXk0pLS2UFmAwGdE-pHPwxUMNo2_YyWiCJVm_3VTsZQE5-iGCIMVq9KRkCJfblvpYJvnxKdtfRv7hz6r3ZFVrjbrbxDDFZEiDztthEf2vD4cX2qVgZB7sUrr2RjJHQY6e9t2jVAja7hYTeUAV_J57WsPRpYhzcxEfS4fhIgEshSiOaJ_h9UmPNlbex0IYqOQx4DyTRpqTPIhPZlBWLHaWYinrkNaB6c5j3lhxk0-d1-voUOek-z1VBOzRe1nK2Ml0ntkC0JOtKHQncrF8L6rXpg991oVJ3TDyALqC_2aBcLJtcUg7L9FQ5SeZ9Rihlw73D66HZweFw30OJWGpR0Tx7uLP7mk6BGVVhCzxpgDWcwDJaSUsBDEYHDqvTEyPhsVB1yHshIH_Dw3u6EvCdlpUAyKyILO4q8kvH_zmABUuq6Q4XyUqC6D3R4N4onlsZtmX7hA26ZLJCdyG81i-LUPdzk33k-DYJ-tY6YYc3K5w4PzrCcTDHDZQJatJc6aSMJy8iOAAWGUQ6as-xKl3pePqFzXPCAKa6ThmOqok69cdseIoa0gNlL7fq4gtYCel5AvHbsLntrBfsLrHabkcxq2Vn7CHfd5sWrPqfyAH4UbhllttYRMpRaRzJ6W5GnjzQ7u6EmfO81gZL9EiLv8zxVnwprzFSRL76AB1jaNp4gzZWWFSUdMDDY2UldtZMrtElSrnuQS6LiZ57pUKpaNrVaB1S9BE95TSEjbd72NU5UAOp8gfP08xR9hUKSRnYJksJIPjBk799z4IlCTdPJKlP57qWsFNyVMlulOI7Y4taObUQfR8oQLV7WMtb0UdjjujkULpxxKZMtIQL6ZSaE7vMd4C2JLmACzzHaGHRf1X9WLK2bHXTO_TQSzNoaYnqQ9ol9An2Jz0uk46lUyshi5BT43BTFi1Z-Arn4NmPyXbo1pmewedHCRwm-hhyvdelg4taf2VnRE3CM_L5ur6hJfBZl3svFluFfIxb6404qEm6WTETZ8_ZUwBcaLG0-s4eHwd9a9VT-Azn176HVdQY0goC9jBEmKO1eHQgO04_SiiIzDPsYJHja0L49kmokxxQBG2q1yw2IY3GVJQ2jnZs-adRIIpf-_K1EkN_wzTm5_BwvSjgWUmYW5KVrai_xH-5gijO6GF4xyzSD3COW4KRcIZkbdA2FQQhaKmmnr2nzfGXqpG6qK-1-ct2DgPMve8D9QqsEkyW4LIGxBDMPFDCnPN2i81riDBl8HN9J3cMP61MSED8jAVPuU-NgkuM7OWQpCQUeFwtPg9vBONn8QDChg4VQXdj_CfF5FrUz7ghJeUkdSmjSIO3WUdbvncdp1ocxZnKyVec76NfNTxWYbUxTlUVIn66GyppoTmqoHM9BvUrkvCBWJObNWnmMA-UqR8WM0P3svbWNqCGoKTwpQKHgbhHcB79FY7ScSrMxR1CmIaOYFhpEcr5gKLjIVyrxnGz7zMCQoVxvnzmtYMqsWbZiM2au1M1PYxYCtqaqjujUF0IEDI8uibHKW04uf84glXntDgyZ1FoweYN28d87QMwxtOmWu3HyvgEKfXj4EP6YBgBB7pizWJnW8p8fWfG_KT6xWb284qk2qzn3yi4lrD8hZpPm9qFslyLEUuiZMtcOfW2c_h4qy-irODAlHgjPAjJCy1Px50eQDz-ib0yY6nvN5ptFRf8Cte9v__VsJC-1jWBNBnPAzjk2beYO-tFUSx7p8t2Gjng6_vXDutxO1PIlAK40Swn4w_bnM0ei4krW8fdOSABB8yWDZ0O4qaxiuHDjBuv9nwztswtbSBny7lKs12mRYm9glF7XXcEsubkJyuN6UyWVBmBk20_4kO1_eDstPHo3nTCFrTEneOLfQHYTR3IF0OAtWGHFqtS_qEkPLPQNDlhUpjUvhTSC_kkSxSY4Ms36zy9NSUeTXqExaTLD4G8N9LnIVjhjJI74_ichPg6rR3Yiw68n3BWQzyYSOjv9mGq4BZw-JDzoAuveGdt-i2C1Q3J9YXRh7s8TllgRneiQq2FEa_m3C8PjbWGeslVC2KvsQqjcRY7ISuoParv0cqBI5dy65HGFqVWwArQzDcAwQLMqarDQkhHIX29h5LJftcLaAY1jsDmf34Pfa9lyt0CKFdOF_nccXEojwFePTsMnSlXGu3HasPrGD4N-vFJA8O5D5XPxtWBGncvVpOTnvoYKA_-on-xTrYwP-GhQxpLfYKUtWDaIL36bFkANUlcVt2dsNAZsBNbfwHvpoXRzNq3ICnrD1XAtKHS0FBf1yVQcXW8pRNeOq60x5_hUPR150cpp-2r6R195_F5A4KG-N9nh1q2CSCS76x1OhW2SBfr5auf5UlZ7YYKy_6pc89ecwXMYu8k9HAVIIUMp4VIak3p-lSqOecLKMQZLMQiYoAzxRH8Z6IwTiqjJn_4wTKmKkAa8_PxiqKmpqCeR436ESm-dQRN7VD2wwtcCHPn4g_Yr810_EcanWyKBLPs2DMvEwzrcsICfjUgvruPk1ZFVGpV3zIJ8NGAlNQ50PM0sDVnj8_6GOa81hB-v12kgN7gc_wkkaYaxCTRFOlXS-EEjUH47SE5QJsv2MOHucC9ilTD5x_8o9P7I4uGG4KulLwtys2BxEstKKqLXiZ7UqL-V0cRJhhPWCB-q6IU8bqz7iWcy3E0sCA_5af1XDWdC7zSY40_bZV7b1AocC5kgRdLTeYOx1PNqZ9LkbCLWL81yHsPEYWN9a32mNi4zS3uduc6hVOeDqo5qpXNVrxfotRViBgnzpAbUFNtkDuoLNmpnY0K5NUmJBZKfz4aXsPbT_hg-Qag9KwGUBr2ZqnoLXGIpu3U82_-YEuCDxicPnzqJKwWkReUY0yf_5QsN5r3VsP9gS3zOo_gEqIRVQoeMzQuUo7JogRP-xH-mg4CAcF7AHZQJR3vvMzUlG0kfJXluad0RS1G5gFaGq1m1JRNv103iX56LQjyf5sOpQIjWzFwLO5v4TMSme4j2G2NA-pt1YxiwYJFPfcPwcIlVuqnwZ8cce66t90qPe1ePa_dS26-X_qn8Tg-tbnmDUVsB7HR1PXvxmRgxRfB6Vnkk7uThKpq0Iu6lYxjGPA9epTJ7laWP_5SblURUGF1PBErDLXUZ3pu89Ae4pSl5nQzjygmOWd4P8JPwI38nhBVoVbZlOtscvcWIUNYvCjAEphNGRIVuq4zbFNLAtcgaKEqM3RA_e4xz09sSyD-txkFj3YbSIerST7KvAT-u67QuJakkDEe3jzusPFlbCeKL0hhpg5RWy9QEbEv0Z7ZngTBhe4cBibt1sQMFJd9G5Tt2TALD1YCyhxm_iFOV18SFPTi6uD9J13J0cxyVxZF21zqfCdnKmLtKzSztoLX4unjBoFekINlpJ8votbr_40XQjFd0nDroTL6sdqhLsXKMzLI0dYX9tgKHxSASzenvWkhC-LTxxaooFMumTpfuROG1AWFvLGpdfgs4h2Q4dK86aleejdQm-sorVlk0640qNKsl28Fcz5ie9pOzurlEY-OTg_7h_UUy0ZLrZRvC_NmbcZ0IH2Wu_9vJEPjvoshVSClm4e-rn8w_V_PTnX6VTBOGjmUlb1t1jrOKVWHloHKfQqx7RFWmsFUaQQa23nh6us_CtZGYUVe9L2Nxig2MEKuTn-1nn3llKk2bSwnX_nMU6w8IT9JKnY5V6Re3plwyqZogGqqAW85G0SxjsQhEJVgzsrN2LogzQuUIQiiyinslp0VIM8eD9ceyr035HtgqxJJV3R_rm5pU-_gJPgkINWB23pw-8MbsOz1f-9Op2l9L-8H7K4Jeb2pKxQqZ8Ybj0_v3FRZx7DoxI6WyEG2O2azeee21yKVD-bmTVcG30B_PzH9JdIaoR1di59mnvhB-HfARfR5VFK1f3EeqSPcwtMQgvVNzCbTjufbPW2GqaQ8Hu2U5y4pt0e1e8eNTyXDeGvVPbWbkycLgLZXb58rGlg6SZqRvBhoB426BMbKlK16UbEaxLOwQOKky3RHCMjvTkFRIu_Jl3g5EtSxaA4HKEPRSAlVreCQijd44gDA66faa6SaD3RqDO4_-SpOUGjTkkRxjZJ9QbLl7LDMivFALDJ9NBYaLzYBV23xEL9DqdX-6zX18IC0Y_j4x5U6vd1P3P06CRPSYQiKryF5DmbB7kplwpXNlt7tSbdtM5VncOY4Vj9c2TFR7JbRAHEsv6yUAgzIS4q7NX9jXeDntgw63yRYCELrLkBvstlepXhJLcau6R9mEOJ6Y0NdrTrVsvYX6aBkEUuEnbZApAzVIGp4Jsdq_dV17NOdXqSE2i-TJyl6ht1Qy5pEhqyN8f4GM8qvBeX5APDhqX-DOpcGc4S17xjBA9EDIzY6c77NVxxO5jyJCFDoN7gwydUMr24MfP02_DMzmlM9TN24hbWqo-um9dAp9ni37LeI6ZItmAfY1KvEjN2NDQS3Hqo_phtgGKj_7HmG1kKjic98JK4SI_R91gqZ7EF0QiMPo0uo6vmSWS9h6a9c8Dp2g8JbOOk24ubLzMwjOOmme_bbtsy88m-Arq8wD2IjOJwofGkVabVeP1UtUG4lMarDzJQYgmFVh_WD_da9xZdBYFgCflSq2ybTQVMRlGZct-ToZaB_MXDcpUKXNBtER0EgzVPKAH9c7d3zzWNKDBIza_uUzDPh9y8BEp3SMfxTEAQsgitv9tStSjHmkrktPoc-NxedgKVAfvjU8AO7aePlv-Tz6vLCQZOCIEGr0JoJTLRD8jgqRaOKFSlA7bqi8YLfZ0vFbx3gvIiphc46sIyr0IoHoI_YsXpYA3WWpOQIEbUtMrFTO1VbbNOWPQ03fxS9V_U0-qys88hSE2dh-xSLs1eStVpx9kbBrsiObPznK-LJinopOIkTixc_2dxucYvtb8Ff1npMjHS0qQkg7VykaniicOrr0g9v26dE1IEYIArgFArlITxJWJlN2mU_bgGkqd2G9ETd2LasN2VtqLjJplGCgQ1jdpmDVh4lNZXRYdP4nWs1tQU3IWvqgX3hK3sj3IsABWPrIwDxjjapDVW-xxoQupKM9G8sDr47gqJvzPGthlzAw3MA72z6MM5QQ2sgMCwWxc7CiFyM1qgwmCOdGG0p9324_UOIhhjt9wnpYemWTQYVeGZ3wxSJBwq0k_AjWfokdJgaG7M2ujkPEtozpTSnGS2Dn0SbpvKHNNFcN6xW-uoYIrr9xxb6hrT-l1R0zEAI_J1hsoYxUtWEQnkHG5Pn1zmte3iNYxmav0rjdiI8pj3B1ZfYKZuPW1hYmmA_PUWQsI9bigFLw0kFR9D4KZ9Tbv2OYJalC6cf2vrff9SiSw9_nh_alf09bq0Seys3YoOEeo3EA_J7zRQ6koQC2ekKYuV75QZ2qhX_s-m37vnl6FWQHBnuGJzn5o2mFwKA2jinFczI37jTA3_mUscr15SAlFbHUQoOvulm4TQ5UPizpDKYElxzp3Hum9nHye5N3SzvPF5TMdukfa3oXbKakN3Y62a_HkIxfrvubcevZuf4vPKt7_BLYSLqRviJUWwIyd4fibtA7gW-Jp746x3JYV-_nsoTMAtw1mGX9cKmAcTf_2ZZdHUbsYXkoW8wGuVDRmZ8d0m3fd4RH8Ds7LzRo8N7QEZQoBTUj0iYPJZZTSFzFLb4rNbpzrULfA2wiijVl88EXLPneITsUV-5p5R-LQGOBKOhjkIvl_bbPy-e-Rzq7xYZTm5hzMCpoaOGwJpTOFJm1U-zH_tmQ7S2EnuL8SNu8cOS3Z5htB_C6sKOGxu9bIqk4ZAo90fXKUPdCM43z7CdR_wXNf0eoTpH2P5_cy9JBgRq2rjryEDg-K_k4P9yIV8NnPQJmKPT1TJTuf64fnXpTXS-1BD1bHoWpKKvjaEuvLRwH6N56feWGJImCy22ldzPAfcFqyjp2_FRKLz0O1UeaQCk43GQJoyVIBAqijMnEJOiXhA1vH3PvkZrsLwL9bNg1vAjcHyqidMFtKzEQr-dmgpGEuaLc6_XT6RBmhpnita8NdfDXXIKEjKCCY1nWHFzXvP4itUAFLmUb7FKiebsIoLohfDS576ClpIu1ww_XQ00S6xZ9lH0EC0eL7nrVbsGD5XxN6TxnOkb5TRYlm527i-qbM_ypuk53ada4RW6Y4I2uoNXBtw0SsDrlyp2FNsmsmzV9ag-N4RKcYkIRKZcCZbtQCxOkmf1tLXvOV8_-Wmygb7Rpr7xXrQmd8URiZxgKwVu24VCkgoAWrmohwy7USiM-oS7WAlJz5UkxfnV9ofMVvyT4xZWIeL9-ygtG8sdm5h_bnCqQfRTky9UtmmsMDDw1FQWCCtHlpUVho3ga9SWItw4hKXgAKb5zk_SrOqv2qE7uvqfrPv3l6-Vzqvg8FXJFmbZRPZhdTDY3QhdUj1qj5Qk2WK6u94JGGaUAEMsRioh1kVw2wGGRU2NMXaYhz51lhIorZs3AyGBI3YLLQVl5EMQjlcHyNAIys5VMlSu0t9WDXZhXDf5496hgxiMwlL9pCN67hZnDxDFlzAyF4CwJ6i6kfhrQaTzBaltV3tswsjC1fgu6V-nLiMJC2bNBBxdXhA3_25g6aRpQg_DL1NhgKF7ugrQTiD9Zrcm9ty_g--rcd6Cb9szREz-3cQwno8zrPzK0KVuXGme3sZ9GuOtTb0ytJK4QTUtyQ6W-aDFlpxUfKC_yu-nK5n4HpjZGgqXwzzaQK8CDKtxFMPRv2rcOOL2Zp7NI_r4JwJX3C8DVwi1rdyZlBN02iyrin6AN_zJpp3rExEa3thYxQj1jjCVj2_WxpY1OrKw8uGP9d3YT2Z6lVxvaeYw1eRLkvkcg6j9D7-lYlCpW8Sd7VETZkuxXoLTvrFtVE7uRs-n77wqdAHBzlcTJqJB8RxRCM8bIlMSnjzGhFBsGboXuR8tQzRijwD16JzX_PC8kGjCF91Gi4YNwgu_6yqxEflC8J2la45Xe73yGJ7OaKw2RLWzymiD1nKTJoT1R2yHiPFLFD3zWOWm3n8C9vOrE1Sz0-wz1MF1eWepauvhV1JYfZhqH5RpswKIRc7gtLI9dJqHWXGn6e6Vls7GOvEaiaXFj-VGkqZtkCPDSIKirgAkYaZ5Jd3M9E_mgDuzg049_2kxdyzpVZyKagF6oa_izVRXPKM3OTepKAXxhm5degpUd-SDTF-NzPnEzruZ8ZUfh9OcB3Wd8jEYaz-OTaojfruvB3lw98T7TFUOYA-BDmecFYcMbECq10gZXFZG1zdEeES4-c1aKk9orOFZA0YFvi7VQu6WBRJp63rd_ZCDS5XRT611zAZKOARlmLHLU6NLPrVE-Vb8TRthrmtJX5Zb0oxOJZVRJTH5CvuLpCNF6BEUYP-NMmI3SIJoiqWKvKBhsmVi-6TqrIJ51WmzuUwX5SubQVLwAsxYKxYkicc-_zs7RoAiJt_XVbLI336UTBkgOCrcX97QV5wdHvWZOysVF0EW_GrJL9BAQG0q0Hv0EadkYo664LYKnVDcrB3CVzycDhqQouHc8JI__7ZC6VNoBv1E7MlixzRSID-L2O9r7le5kMFpZNDciUpCUkIKwNqowWtKQMWvvABk7AbdwUjdOL1mcgS0XHKNq0dgXF_1P0XVTPdFr6URMTG1BdwN6rxoOfbslRS7bnlGHvfhssCANyRInarbT4n66tdI46tL4T7kSoN67LuH43KS4LtKs59d88BPsXg2qtK6BpQ4v4XAAvDb62YtGpLpwRXlPmp3Zwgx1TrNXGuX8bDPL740nOUCvr5WlwsgXVc4ZjPiwTaYGnNka6o5daMPEeJcq__GSYPx1r6eIjK_nDwZlCQPZaL3EZpG9wQCEpOM-JRCz7bRctD9mUI8p56z5s-xaJ9L0P1Ap7Xhxtm3p-TwejDHnXu9NdZeyS2jxv8-dlnaEMlnP_m7ucKD9-S1iuHyatkk1MtlT1QUSs7-rEZVYnTv9huOJVUMNkydWGUFEDdwWNwI-mvYcjDIKxprQ5IW-Z8P9WQXnOA2Hp_8fuGp1NtQK8neWq1cHv9eZilV-HQYaOavyz8bNykwW7_7Ui5b5K93e_iWDJWk4_rlQu2Fawo_r5VMHseT1eSC7NPnJ04xG-TJ2AxvcjDI6krHcM7qHPC5gKkz-682sP8QDuIJZ1MqKYMxjfwyZmxwvssHZN6APQdiAJ_MIsIkvX5ZeHHez7YtDFC55Dr-C0GdxjBANOD71F3T1t2-yJwXO-ti9Th8Z_ZYFniY5Z2FqwHQyJMUtfxvt1oYEzNJEI5J-XIwrD598wlgMmCX1tEJKFn8GPxbfImUaBnrvzqWPy2s2jerYK6VTmqZHkGmKyxz5gQuLX5LQl_MzvM6eY8oP_9VJukpHgKoC0v_FluNeMNp7hxP5A6zKBFJDP2GLOJF7Q406crslOjj7wPqzynNqC0sOc1rPn1PPOhEzjinzJo_SfGaefbVfmlGFku8P7OHW5Swy7NUT1S4P8au3StFuKtaPi8FfX4UxX_bXCHUd8K9Uf-FO6IFomHytolT0uVJGnhS3ogPW2mTsEQhF7jmVMgQT_rAxpmATzMs9-aAQfoi3xGhM7sH3-k4XrHM_FEjM2Z9fUfYS1w_MzBwa7y2PvboOSWwaa7lIfayFMaE_oy4aIPe-_EmjZKtl-EyplW7VsOfn031e140qrju1_Wqy9WR7e7-pxE4iB8-ZCAR6PJIC-TxilLlGPGeEmzPwwaIb0J4_rTvQaphd_Qw9UxL89dQ2LTTuFLNQeWI0MM14N0yPVwWp7xhSvvjABAUdLQjkA9YvsT459i12iRDL-uoHRuxYem7cr59k29iwGRfHmgZ3I8iYXQ7zyUmPdaNrXc08r19maQ7JfYD6WFrYhOK73JnxNEi9FZf_HmqTdU77v6Xtyl7gHeKk2A0-DN8e-YoBgVlbA4iDpiSO4VsXcaAGMCkEar0LbX4ril03xk0eLGur0OwgIxQzoNvgYQG1Ayyne8VFGm8AQ7hi8j4cQ5Wqn7hbrr5dvGOz6H26kC9CNZB-2EOlVpMAWZYRhikfhELeydDXgoHPtWFJP6JEecdFtt0pNni3pn9oTq-w-NQ5eE7Dguf2HXZH1n1E3njzolXi4Gyd3cBYXj3jgVI64eVMc8m7FGUs4vaGb4Ifb4Z72evVC9owLgJMlaCcKEx-U6_LDinzSWHrCz_nGz_D1ndL7s_Su0--k6gEN2pLYC6ugPv7RW76BtCfk1IObDPtgqG1MxuaNa6E02xT89Hgny2cTnT1GW0PrB0IO-8ctHX5cRs2FVQ9z09THEv9OLTj6ZtNxMZ05_o4Hu11IAmhq9Hy6xN1esurikrbOfc5_GU0E_1SkRy6xcLPNCYJ7DDqlmR2_XEtAV_hajBRC-glauuuzQLJmYSeUICggns8PMLqcBoyLZ30tV-59YUJ05Q-ZpsMmCtj8nT3ylhN-3meTtA29AFvuKM5zYFAN-sxyFqD_E45aObRE-B4M3zq2U0RvbBGaqjPFn3KMBgYTABcQl29TriZkFNlhAVAoEQUDzLc6kWEqpOI98T7lMYsEyX3G57fGBV6_EZhjAZgiR687SJRLPg-_wY-tmPTXsKpAiejXFs38W8GVTUdfc7Tn6ntpVcjavTD9GjH9vcJppPH1FeEspUuFwbDKlKTQn3rj6eYJQyjc_5d3gffFUQUNG72f-KMSGOiy6FF1jYURRoUHiji4lCZ2KBNdln490snOP6z0MaD54725yaftBGqUFwoHUWPRFQUVYqEgGhRHrRSNZSbr1Oqtxa-RYXzYnuUlKqxI1eIwvQcVjKvKVW2b-N9C-B-fdq2zRsX3wEdlSmVpNMbIjEXCyqakksZUrrEWd4nIW94Sdk8vagE7ADCBLEeL77IV_aSQIVRpMgPY6X09gC2B3ZEWV3stmLnZtLQRxy65RZlroXp8_w698yOrd2-wgkxREVTAudnSVQ6RWBxcDv32ieeoJ7kmLHJ4a_VZaeSs34hc5esOGCnbebqOh__wVdw2b26u1ySrvoLGSVZAojAp4Q3g4CGt9S6vZEnsMJOw5xXjy_tawKXUwOkyBL0m2IOuBeXZxcJgub9DaHWnmFHh3-fpuUTSBN50FtqxuEQ7bhwGmElWJXu4Cr_P2z-pGrBfz1FTbOqsEp7pPzwGwYnBmU3yaQEki5quLY6Pm4Z4NPrVqkDkR_uRM4_yRgvUJ5nKMsG1SNrZ8gbACT0f7By2uFjPZi8_EbhA26wurHK_CkLovYyBnwK_eGlrdxyNOpLqziasFnnNQTzaHsDNFY037mN2IbNugM__PfXCxM_UrWE_4qFvxTW50oOi1Vs0LKBsvcqZKMSsbf5CyE4cZ_5q-wPHPnFn-B17iMlJbpLqlCq0J7xOHDCzIpINqtJyzpRca8D4_uXkrZUPUsx_UzmVYfL9YQZ9Fl6B3TILq-B6Dn0WRg_JoFL25dtgYUBT9W_vUDSLuCcL8pODmPq7hERUuNv23lynzNjcdvQh9Gjjwc0k2-rPIpTIK2Dh0R986uGbTAhaidCbjbouOyIlDPHEUPyCj5tlHEw3UoNg6aZktsFrrzAfdu6AtM89Mr853H-fxOTT2XvE4D_IJ1SecYJ5U3C6Bix-RA6tm1RWwZApMSImZ-tyxwYTfK1Q2vdz0XqmHF2giK0gVWWqpQu2HibYdc-JZT8BntoGSJx_b6grucfowv3DHemkHcXIQh5XF-DVh1b089aJt6kSdqwDhlaGxkPG89na4_zA2HCLF-cSdxj7Y-76z-KG-m7M_uSgfgBU7E0oj1onsy7YKD9fn8bNaK1g5Ys8nh5WaDTTGos_0oXtDBVL5yh1mmqZs5v6WRlsRqE-TiyJDy2hUbaNx0kDD1O7d4mXPW2enWYTfabshR7lth-41lJP6Ny2AIK7AqXDxqnY91QT2VC9nW8bVmQ1tvRN7CUaZs7gr0Vdm-xqKJHqDpaTW0jzRDqnPpNex_leY0KXM59O_CzymIIk0ddB9nkWydUy3FNRgKZ_tujnqwCHdCnguOmhVEEZzJFFgGzOTaW5fwQekeXnuwrkYeSMuEWgYGf1fM57YZWwtlxlyvBxUnzu6CmtZEM-IXx2nIxAWQWantwzXa3iw99xzFBPwDSbp4M8clMz7bQTdcchBjtsao96g1kubcXxk2SwqhIUMmw6ZFeEaOAB_Yr1I2RhGSJCX8yUJKZaG1cJ8Rozxwm0IZYHNiKhxASm5APKgs72SU4dqKApLpGIjAVujTdGmg-_HIcIUSTiTtFs6ftV-dx2CT3F24VcO_mgH7EIwmyhFtcEQFBrBGQPOrNcmsUPUDpoNvw5K0HPsqHJ3_QK_B56UwbwQMub7F8p2BQvx_nA7WpNFDWt349Ga5WRJKLpnp4dZ9lnmbxrZsgHa6_9FgIV-eozVlEdJxKfSZewkyiiSKQP_OzkoCfES1XktPXMNM93WilGQSXe_6val2_PI_BJHMogNpPVAXf2Z7W6SWun8fjeVRYSxcgvnMNBpHgy3sok-Ly_JcSINKORxfI8ivULEHC5WhCUvokY3ooB3af1KhqbNqCV-NckSY2Nt-oqtwLGsC963RshVMYHmb_GI5TfMRWWAd4w5iEfZCeS2IeQeTiQ1WU6E-fufHMNchyjpKr7_90eIZ7WkrBo6GApXL4xgTLhWtcic0fzJbqRXKStLgpGTvdF4FRb_2e-ezXgX7jA1NPGOPv1CC3frMYXSLFzTxJ7fUJdXZ1TMwGMfXpIvtG0w84IAKUoL8BROxsPp-eOIxS4dGBz6d_FB23_jEgOSNObykea0TNqwz_mkkZFpIdWJxueRG8NJGDqHWERLlJroA5y_5lqodNfgpsVD8UgwMtup1HHyJV2xRcrTU8rI3EYHdCyzUdH4HvboQG_yCQhFhl3_w2FCYMl1h1gs_AIW2aCtpQAKUGoTZnBgMK7dKDbcwBFuk8iyFvVWnGCH4POTxrdg4Cj-ARfsvR--X2CeXrMI5cdXOBOFPNHMlkrMr1j2VhnxMKZJFSfSgo5mVnt1LOaAOH28g38kQYTobu9-aOvPCkjOx6kmNiAQFE9YGk5xN3OjGz-CI-mZN4dm0WUhYQDRxTKIpz_wiVky6lVlRMbYzVyQJgf3wRdCXKpIO9QTnN-mjuZ9O4Jp_SMcppVRfDFtmjEXZMJObBONkolUZLKw06CgDV12vRCnu-nFQ0U4zAExAxoGm8Gto4kyZDWCWlxz87B4rXaoFPHMQRTFAUrLMVxPokmC4BFfDTpnf4eXs4_OiJ-496QyKQ5kCh2poDitya4Ibp7VBsWa67TdAS3xRjDI7j9V4dxb8sONXStNMdGZfSmADiAX-N0SPmz6tbz1gUc40xVcfboPIJG9-iIkg7p3BLnHKeJjh5DkzHD79BmZV3KvAAI_cVt_cU9dm7-4eI_ksgAD5ZhBEoRFEBxBraS970GtdRcXi0KvddDFAOOgMY5IizyRnShPaKMRhQrvjMB5ZFYXVtWuAYpY9r_cyByihDyKLOlhm2Yi-91HbdhrmsYVljO_ZY_gaU6Dzy_p-tA7-fMvf791j8TwLSDuI7OccAErO9HAMBXIx7w7WRuRRBP06s0IX1-6MSqf4GWvQ7m_pZA233gds_Ej-Uq0mTcGAc3OqVCT10Ogzvll7KB7egvhy_qYai2_iyAEGR3kcXJ831PwSAqPO40bEIm6WJl4L5gej3Q6ZDw3iVpLJdXGV49UgdbDX8Hw78dhPAiDzEFIl7gj5hFshLIqRfOf6qt_oSMbvuyThYan7aP3awXy2ekV7WZaguSjQ-CCNMx7DNwBf95GGcnVSe1BhDe05HqquTxXeWQpJexPr8UtYrSkQS--yIxFdd37qzrsGW6tr7cYFskPljJVao0KBrOQXlH9VAyTFA3cgsk9Ajg8nnkb3q4JLU36dy0NJpWmCFHNrv3W_BN0qxJpeI_kI91ZB-6EKOPjFpPii3otiyQ8I9tSIjKfTWA_t4OHr9_z2mxR_Li9uZ69rESUcZjr7YJs3qMZTTElY9YqCppeK-r44p0sloxrA4iTuW6p3PPvB1Hnh_41pzEh6iDQ8uj8_Rj97ysKT8RtKAivz1aAWktTPTwe-uC98uDvW9FqFK9s7LLTW27djrVk3KsCoVZSkg3xtesQaL-fzzXud9KrWQFFExtQFVMkFyRWaffhp3-O52DXbYyZ1v-P-qT05DjPvhrlchIEgrh3e9zPzhXZWxZcYnYIia6l7aT1eIzWCYQBoYpszZ_iCchVR39LA3ZfpI1lmUXnXGgz1MsbfQQweiGG1HiUhbTLPIOetMmAMKFOwvN_EinD7uUpxlMCSIrk0qOcmuK3zy65Aahvq6OF3grb70z49Ftl7NFDQWdJAv589Zj_qs1x4koKs6U4lUvlBeGkcGAwSstiQN9rTCwiZdhqiVRpqpYwzh4Ri7hy4bCt-KP94O3X4kuO2X3pobAnnrA9sUPXosPrq_kAGTa0gRb76Y6tKDbv_8ewlgbBA_sZxuFhkkQtRwfiTDP72W3xgobxzlqy0kNO9I48SjrYyabARysH2ajXD5eUWCRS-j2NC90PNddNT3kUaPP4wy1ghTLeYb7IFEkbc5zCPj-8PRrrDSse-KfcmpNx30duHayY9sVT0utByy9S0MXChEzlrh_6Kpf4xUvg_9vmb-IMBUMQLcDoE5D2UaRPlTWUYIRhPNOgqptE9LyYhTDyK-al_POyJnGmLDqih_-b6-VE8kz71jyFlWb4RIsZSeFRmjFwUGAw7wW7tAP0S3YFL7eZm95rMhTWbPnfcIPLhFr4wFodGGQ932wYugSFTsvQDNZ2elIeYodaVurgpbd8p2No02osXi1bRqgC0LGVo7Iz4JMQr6Ov_19slTmrRMjMBFACVMdZStoYaK6_eUUH7NFkywsIsSJpJ-TKLgoIpTuak9uKdYj0BWjjmdTnJYNh0nYXJczDNJcdgGeboOwadw5I8YByLdDw4y9J2t8ehND4Vx7hNfbzJaeN3bRn3r6CLXOFKyjmNHXuaDWp6rcBUTkuSHoFnWKbsCImhtAckOdMhx0X6IJIjhgDnlW3kBupohfcGfv2r9H3hEe9z27Z1c7BlvO5cjXZ9Hu0MKGnAQHqmyNJqzXQE11n3NJ3bNcoxWTrryehOLxMIVAwL4b3rPpu6jpDxUK0NgwvFy2iIG3HN0TRdf3VUGn1UjI4bGYA0FaIFG0zxe7DL8xNlyVQHQcXWDC0MatLfUYyWTKSm1n9ze8r5EFq7OkltHvFjmfYAp6a53kE23-oyEH5w7k85ptXDxOAfa_iUmdj0Ch5tUjo-vvzP0lCGJifuQfCsWIJ15DMCbe2vkVt7R6073qblW1qzU_CxYt2w8LXt1BSKKG033S0tVdnTBePR3sqEF6UFTVeO5kBQGpL2ElfXQqJHIlr516cEx-t5nqXp9s78Jsw9JXUYmnd2rMtfDyL0fIYAtVCG8gdO-Y1b6GnjBpMzktXXVL82uXtHW_TeVcGJ9L4Guts_PbHR8lBB3Z3_Hq77qNF8KIRWsmdcDY5sHG9J4oL9lzOe7fuivOr8U3v2Cu-lJCu3J06EPhwAOMHY0sIyaWB9vbVSm1ut3I7UkSzOiNdoDM3jbAiLmz4vsxhPv-rkBwCKHQcmDV5KK-AMwL68F6nQzq5NYxuU4QU8IfTzuaCfXWfuE-ON6CLtcaoTwykc4mzgLSTjU91WTYLH_SwlqteBau3X04niWmaHTKVksNPQLO3mlhk9Zax_RamTe3cdwkUsSe-pbiskB-2IdLl3n4mIoc59lzhK60I9bzvvQgI0Lw9j1YO2rhQc-0U02vdun0z8LxdI2F2Zh2u2UZ9Xzp4YZdbU8XN4VOLOgzTXJoOxz_L9cxbQTbzrOv00WhNS9SMePzFNW2I7u6pD74q-NHv6r7VFYcNVNcde8Wtap2XUAdhbQAT6E43NxvG6jM2v_mTemO1QiBPMG6TM_qRLyzlyFSUvppT5TZei4n9Wkj2LJg7j1t7teFpEmuCEMBRha4x80dAmvWcHoTfECsQFqCIL60dMuDtymsJyY4bQtCY4OXR51S28vhqCkZaA4pRt7lL1mI202d6Kexz7E4r_tmMhDBk7MPMay8aYQAQKVXylUxvwsZdMxzRoio867L_j_Oz_dpvlfCVMziD6B5vvCveP5IR1d5Ikyh6DHB4NgVD7xWi6yUvCjkk8IVawCWPXV7Ob-Dsty8ZKfzlPH2q1u-MPzVpG2YaB-mFh68xHBkCXIfGtykimJuDf9Bx5qlixdbcoJZdTuydLZe4UZ7Ylf2A2VPrPTsheRTxCxFOyUZQTPomnLw6fgHSw-DO4rPKbZr7VnKiD-YX8F__W2KtEBjfgR5VL39f8E4Hg4ffIDDAl3YR9HOXEdCcRjyelQYVqfJoYpz4M6R1gsrtI17jv6E7wKPq45y7Ld8QzWMG7m9bygOftcV7LZ4k7_SgAnAlSsJbznoqXx_hicJaVE8IqrIRhJvewbfOObKUUOMQWK8F-FqZSvQMCOhoRqeM9foRk8NOjVgmvLTvlO-TavDO4pd65P-f6cbkvNw5EKLN-HB6J-zn_ZeOequXj11hVpYSP7MNNMaNSHbE1xGygGnWz0E4TJUVPyuRvwNQ06gt4RBh_eirDJSRl3AMkVA866A38jDs4F3T1hHB51ehM6CODqumq6LVRMrH7UY6pn8T5lW4bPUuWbphRS6jkOtFXeCS_FqCizF-GVasGGARMNTjWcwVCkXpKUEhSP0vd2xsuV6XgtaHP4lkdGRB4XTkeUypolNXFA8BZ2tu9aSn48_E4cBFu0hUUJ1h2mwjjMmUddr50htgWjRJCR3UFsJq7EAPqSXTyvbgIFQxY9CtpyWIdJnKz6GsLiSlSEpDcH1i6e2GwuWW34jrqgxg222ffDgIKk6ieOasxG0OOECw96XM2QruwJggHeeFBnehYHi26x03TkFy-7S5WUd0GKXWgoV2Ff7lCdGefo-RY8TEYrVd4NY7rcHzJBnytUz4Ev9988F2SPv6eN891x2RTGqNv9W-_X_k4aTaWd21OMM7UzgwhqwhttgT3R2kcceg5_eiUHZMzBARLLH2JZjxp4RmpjUk0oyNdYE9Ess1f8Jf1sD4NNdN-F0HUm28ikVNoFC3DkWXgCUVaqsozTJLYLInbnYHljl3jWxDSAiIoZB6aqUFN03fhsDQVKKA3ztHbTQtYVN4SjAF5Qfl786IdD7w_lTtQqfKNcdeqSMiHtmhBP5LJWu1ycY6aRnDHx-2Sd-IE-HWwJxtFno_xxSMTMHRg0krJz4USlbtkC7MfaUrc2YBDAAN1erT_hzorKxBN7GRiWFHaxTX6E-KyhsRfLlBFPP8UdeMQyZKIGHWnVALZz5kJaxyRJG-LpJJu01YwcgxBGuvoaOdVXiyuA5B-bomDn6lokVOws1_o6X2foGxhOuqY0QiJtbge3CzK3_OVS5tN4VDsS2PNEZW9d2_kCIV6KNx0oFQxiYw0e33TFS4q1xtoYdXTqJZtTKko3M00G8DjVE2mW_JT5K8dvB0QpWM8EaZMmKur466Nw7QHakKOY44rtuNmPAyROcwR0tIbuvh2f3WFnKnmEsWR0bdS4BnR_B95-vaiU5ekTnVPP41tRWHMrZi4mUjHwDvdzNKxb0dFpxv3UhIJFNE5bhQSSrtKfDjK_2utaG73xrK9L08r1uD3V0y8Wt56O4YWWHjWDd4ECZPAPbJhoQQDs0182PeFVScGn6VbwKo71EI-_UW-fvr9T0NB624wSym8kAzREhl9iNNbkKGmw5wlJrEzhRc2PEdMelhVNrMSDRI9k39zk-YqUMz8asSf-5fylSUgojMXfzX28zbWOr61BshwKiMvSISoNYSN9bOGLaVeNmkfofKT80WPGKW88qNRM07-lBgzk6KHUMwZRlFScUwhBZsBvZAQ1sm3dPSzSLpSR5yczLK2TnWcx0IdEZQ8xFHa3wouspHHhFbAPizswGxo9zMlIIX8_Tu4wI-AWi1WByIgjME55sycpnANLHGNI890zusxK7NZe0f_B8VEkZxRowEQPALB1Ll6qVNO0Agm0bIEtqDMqT4J4-hrufiJWizwg5ln6c0vzeQMEVk3-TCHAwUhV9w9roxVBVgNL7xYqcwcYVaz4ewajjz6OY6fMlLA_AFctnRgPGrhvTJRW5idcGZs0IwU5qP0GVT5OADzxSMO1--b03_Fo-fBmCzTnYRQFYFz6jm6DOyYNH7EUZ91ynk9ucRSx29uIg4wpdxc34oMuJGKzzZk_VQiL6Wq2_l7ccgRvUZuvcQ0qz-r5jfCm1ScwisR7Yw2V9w4j6fg26Fyv1NZFuUD4YjClkjb4XdnYQg_ybVHLVJuK_iAboCoHV7v56V33Fpk6KmJMuNSs1llCZXEUNl2RdPuK7s-3QCXbGcSNkjBF_lGaKH9EuAOHQefdmzlFQqZt3vAWljopVdjDzLJwTKWirdennz2SeTfTcC-YAVxb-FCy5V5aXsROhl1kuXrGr4v7csLYjrdA5pigV7OF2GCZ0HWBUCX5rxtX0IOiF8G7_XAv6JbGiU02WxZXL8CPiCAu_CAuu_Xyly7pBvMGlnIoTFFWtI46vRd9qSqukuHuAQXxJg1v67IcZU78iCcIr-ctcRNsPrcSp5q3LCx0jA2pzoNYs5IfPYCdn9yQG1CDKYQxu6nera0tnRYL9mjPSY_OigK15O1GIj0rkfL1ghXxm6kk6wd91NqR15pstrFDK6N0YC22AxnuOlJHFHLULi4tqVgcJr0AhdnZhLlr9pOwr2bKZWzKxhKPd-RTiK3fTv-EuziN33WoQMA8WECcN-F9ZjBe_igcRFlB72zLi3QSB5mUK0E-G5PW0khmUegVwk9aR5V_2Ltjn-NJ0bAeCzMIlxZU4HsY93fXFEB7YTxGI-B4mmdg7cITxVcMxwG5tUA-imQ7f6F7q2kBNBgbcXKIOYx1B28RQ6LrQbHXsZM4c7uKC0NxVy8ZDCWsK4tUIowc1I5liTAY3fCLNLT0YQFT6khmPiZgkZTQRSvbUaJPX76JOpbhCzPL0V11bo6joGHYfG9PK6j4EIbaHkygm5tnHqPLaeOfyEgOPwEcY7zDmhGcuk8B16VYsYJ_xrYx9SqPlBw1dFsbWcMFFvOYVh3gc60Q1hksSBsMs9amdweg-atBCtVhTC2QqUzb6Mjc1S9HuOFkcJXvF-HXGbP3eXeEGoaZyT1b8-ORMESkjKENSxaxOqkFXv2ZxYgAxBVcy7VcWDgkuQ3ResXAYbtCJYysicYTk79Uay-Jvgg_WrLlZ5ECVAGF8NRTR7qHxOUiiBycgIrXr3Fl0BmMOFezLvro-mHKrW435mAEveGyzM-2Z7bmz1XGKva6E3SX2Zy6EuUU8D-xR_ivdLXMBayBaxvLHHvZOq15kE7nUi9qQDORC5W0kSP2087pFMToAnefzFseeuNcqdKJ36uuIbc-EKuV0tdnRiXp7ydh6wsgdOiL35_-Y4-YMAc7EjT10rZj4_ZNtDDoRLVasBgHgxDQHDrEsB_B1Nl0C2S8lE86yJ5iknZMonBOLa57l7iK4EGlIBdj8zxdfiGMDmNI6fyy23MK7KTJsPt_w8bQXY3ZVRFgcW_i_p5nb1uFVkkQr2Ts5iFK8fIQtc2FKt_eYKaqEvK_Nacb6YYCvKUMicA-YGJD6fQJ6gEVZ1uiwqBXtgEgSXYkkXr5uRtP3JSO8BAbFdPBIT3cjNgt09brq0M783szJtYUJG3kszv5UDi7Yh61dEZ7OeAhWbIJxqISA6oNryQVTan1N_BBKYfKjdQgHMMJwHJGMLjZqvcVuEubucJxxoX0VstzO4n1ZjFOuWxvjEGHL6vGDkOheefHFkpRb-NN8uQQO-2JQr2r5TaBJKr_Tj2O8wbXB7n-ZAzDZ15jTvOAfdTNrUvHmbHe0kcFRf6557x6mJN749NVNgtFvyrftWFu9TWCqj6XQ7UWPmWVXy568UnvA2aBKLOFJJD9puLsWUneviBgR_jUhb2ZTd2SBiqptgvJwj6KrlJ8RF_sd_1cOWz-z4y_5AXioWJBmMfylBn9cprNOIKroIOECrZyJCUfIw-ADyjBkVdANrxOvHe2eZNTRumnJfx2UGH4n3SrGRNT6H379E_jD8DSWTQ9LH00JpiYr5c0IQTGOd8mN80k9WiwWzLh3h8vd28-lSbDpk3scbsjgbKLcuGucH_VQauZImoT6mlQoHyuFAHo6Z2HK3bEFrhyxJGjoOYa_BT7IfJkFubuts0VuawF2-tvVPrsCRvNTJwy_xrNoE7lgiLX0ZugiESDDhJ0thxe6pqkTstGN2ZgopmjY5yW5QyV17CVzVrWV7-xYxv4D0kqICkhq2qbUxwzrsHidSx_mUwem4Fpjd6PPFuO9BzX2M44VvhvaC88QJwUDJwBlCrfhUHl_BCL1Dt3DJRgRjVmZ7oGS5viwV6Cjd6CV8JPvB3raUGmOQEgq-XhS4R9D-4ahyWaLZHxkNbxopkAzFN477yWAxndNqY1zo8I1S3VjYAjv3EYeghY_BcN3gMVMjW5SFfybPvv38nAmVHZJ84unobQRs-CU6oBJvuM8CfneW8OtSeXs79lauN-iEvj5Jp7Hx1F1iH-M3EvMrrlcBxHOIFwtw3eRaOC6Gg01EoDDVfwXrfBN5duVB7KEbejFRY1iecVgMlAVRFBCGnYiQ9JP0s5R2niA0QKaN_OgK6aXFZbj3aJ8-tqOYRxJgv1peyC0MhWGSrc_u-Gu8iOAyR193k2pgLMbi58Eqsct_RS44svsc_1HIGzh79IRfYIGfc6A3MD1xS4nH2UaU4CyO9eRWNRQ8IU3JaAuJmQ-Mt6Ufw89u8X6GL7VTqr0S6ofIoS16Y4SiDd42LrEMS-wmfrBUx7gLxYUsDla8n6Y53Ga-10ykSGyyTu-zB5hu7x_LmxN160jrW8ls3LFLDtNzrO8ArSpQthNEVNusqldNb3Py1rmBRNAVBuhILR8_VZK9syeErVoxcjTiC6pb31e8GJn3GFM0P7Q0V3Kmp-7Sekv7nsKp6zMJDyPBRQVchMEAcBtfu6sGeGIpJ-BveGMy8nmtpgqSA0abkotHRbpsf33l3ItYo5FiKm4806FWz9wXiiGOZLbz4a2x5l_0x54UdNcGEtVlAOoVyZrjuA4D70n7fgOy7kKWHg9yHh0PNeozWG2-m13lvDUINYGje4Bnb0Pz9vnL5m9pcxVGS5NsqKCSYEq3Wjtw6-sD4rrJ8vx01MEk-AuXiYVt8fy5wGbSz6doonxUwU4FmQLbOqGfr4NtCm8gUA4AqbXvzMeXDzTewV7euF7W0ueJAhHJ5SiVk5Sz5Vx4-s7aICaU2AYX_ymPNgKz2xFnLiQ9JUg8iLPQqP1ukr_oK4rEOfLcq0GaYOCVkMZzwkaEYHS-0fXhSZTYJhPu-lAUXt5eajmcoXrSRf_rJhmqzqDtSQI9GcLO69D4In0N34WLO8Zivvr2vciwS4Doh5sgn_ZoDjNnksFij4v6rAdioooRl0l4J2ffXElRf9ZIfmNGXMy24CC3Oi05WzoGt2U3g5LlPIuOBT45DopVvkJ3mZBIO1b3iOlQrsjWSDESG-Z-rvOKuLpNDkgWxgtxpxlx2qi_JknYsIsFYoI3O5GDezGJcmp1wj4W1z9ySr0eYOzKRvV-mp_8epKA0VQYRH6ze9YpfPFapDie6SmNMt_A8sw6e-h54qPJ0CMYpoHnaK4B8s0BjYVM3Yllr0N6TusCaU6ikZWKS1e5CuxtC3VQfPT5O_ky1HHIf-U_rzXnbYFsZEfUtkimzn1ZXRrgatArimpcjBvq3TPTSkXckR0aZN9dev0z3uOFGs7xEWFEIrKgMymX7nWlKYcT9ywNRgE4JLtcDXX-qQbsyhV9DCU8Z1eBWWBtvjqWYIgmqwPHfSJgT4kGhR4OdBaVz-vz1Q2rks7qJZpTs0ixaRkklBZ-DcDyYV9377Ox68H6DKFNv_cmZV72KAGsRhFyyGG5er6S3KF4gaOb3K3d5LP8nd6dReeIXg-AtUv_Ez7Rtzapi4XXwUBxDhOwQqyQzEbBEINRJLPCZqjI3fyUAH1x_y9t9k3SpcCdQU1jNFLy52CzbNU0z1zMtbHHjD1MtnjnDG9Tjqx7_bMUG57Vpe0U4SlD2zRoMUivWkkK9atys2uk2ppdBMdo58j8XxQ3dcxHdphwXg3nA7jfwqgC2E2q30lBpzg60HaZKNcw8Mpl3RZAuplb-v7_VzsW0-nHA0Bhi6iLgrHhrA7rrw1q-sCbsgPNZ24yJkBc-dSKt8qsDuGm1gChkKBLZqYnkDjquads-q1cZs5xeCgVwg8ac_P5qADwmluxKRjbbZ8XrEQkmrRXpNN9T-dLOR6ODF2uFOd6wtTfbXU7Ja4d_3K6iA9d-rzktT2YYV2IFiyiIPKTe5ctA8tOd1U4Vfz_zwDfrIGziqp2nT8wlHr9kh5A1yqpJVa3f3THLd3IeK6Fc3zQjOBAcPgU9_IIuYFahDMlLfMm3I3QqgykB1nF6nuVffqX8R3a297gABcTkkzAfV4rqXbvVcRb60ncoAqLACNIJXPpI_Q_tpuvDl2mWnhqeNvVgKzzgqx57bM2KdibhS2TDNEPW5PYrvn_fPUA9osKi84gbwKSLjHd5ZT5FAIXVq7u1hiilzGPtxqBWVpLd6uzoh5Cr0OnqDDD7QgJktv4g048A_Vso5e29PRZVnPnpt2t7RZkgU0HJR2WvdS-bfcCEax1bIeQLwAb1iZ0xL4dzuT0K7UbVp3CZQjUc9BHaQ7vddMUj2pQ3XldM60ZNk1YQe7v5xzEEWoBpIvzH6m1gLKaAdvqYcPOmCb7Ol6E9BWxadbfRJJAHXzN2JKi4nIQJbBci-Njy-ZImm_NtOeXE2joCOPqNQ6d7fc2aCubBF9bypMr0LK1O-h9TC6avnylpUfpaZ5QRqG-_gGfsNBFvKRIHMWoB8Ar-p6eP6VmsuxxdnCIhKyBhQlOr2uY8BBWVvxZZRteDOQAE6MvoQDMl-yEJ50ZLufxy36i5CI9s255M8vAbW4PBat4gf7sZ78Cd6_AfWeAhSEpjhU8HgHdVXoDyFy6bzAGNeTg7YCV0v4cd1bJBUyj8FdUBbSjvT9mJuaOU2pPElyr6jmWAWlKiIvXSaD0skjZMTUyFobgHqhjW6KEQmFonr-oUPRJcbK73cfDSyux678c0UrSuoBRhjng_MtSE38TKjIzm3ot5UZKQfZvMuni7E2nQsX3QOhkD1Op6lhhMC2Cv9TBS9oawmrCPVhwInqTdpGYZQkWtaurMs5hKaZYb14Ni4S5nbyCqQLx3tSuVxOKPFNHV5VROBjP-SibI85pMYHf4d1dtCCRsl8hT9KmiV3vjKSwRIrXG1X1yWBn61SwqKA__BgMV8NYE-9MUhm7RNT0oRpr_nQUdqeHtfTXmtNH1isyDbo6Nj4mqP2cRd5RiGR38kF9iTcO4N1VFl1QyY1uc5q7D08-l8zU0eW8AYVIuRemkDPFlc6jqjlOMzuk9HWXMtlkK5lpDD-vpLJu5ZH59zax-39oJDEl8WmFeWyII16n01egYeEgCvG9rXHjHUGQzZMtIjWmANbE-_lge7jVTMtcoxau6i9VrwJr7ysaqYafU7hPJK5zbtHbsVNhSqKIUGAxEy0nwHYPam6Z7L4HWU8diXNIimJ4BPHUJc3gek6LQanbAEUMFprIKGKYMyhKDkLTTGBSQWZsUFOjLMMb1FhXlOcqxawFDbRd6oa4QAkfVR1NdnrDUglh_wGMvfkJQFcKqHFDDpn9nhdJZVMciclihKLE53EeH5cmIRcQb-R2vmFl10FxfNE-Ofsr5YDMsedI3SqDvJOSVsnos8hVRQPjPjymivlxI--KPbBLEH2k8liNjk2pumEYbzVg8ll5AR1Jo3TTLihtOCfoTxHc1GSB67D5KATRU65uuG8g_IWaMkvrUrPMqhGjFYG49IRDJBW2J4sTJB8c10mpBN_d1vyOni8NOxntrB0705MY9xPHcXVRZuuAcZzexfscLZ9ip09DNC_mQQ0mkkPgHSABJ9vXV5ranoe2YVqN2u5-7oy0KoenwOcNdhuqTazoHJ5hFqQPUy5w9UYGZsy6ZYO14AFaDAcL6bTIZWGNiDfVq1-LLzryOnfFSsjn_UKb7X-jM718_IJsW7EAqj1or0nl8LMDXyN_qVh4KERAWi2Q4XTCyMrZO908R0CDskCcIW3OTtnVuTYUnfU2tQ9pOjaWgUtOwJuvFaLiVaZskeEwqYNA5IM5sOXnr0YormTEQR1tjqCj6RCZwCglZ0NRg2ISFXTWKPC8Ldb_DEXD-SM859Gm-dPd5mFNUKYlisXyNqgTz8jUw8ElWBzEcYXU2oCaC_w_vMhuJ-VqC_eznxfb8OaPp4aqOlSPsranFDBg_MWHI0qGh56LSzTdDlqED0DETJHNIp844gk9SOs7UMcaHO6RCmv_EZiYoVwwJP9UdhOzMtTkcMtlqV5gebxvXqrc7LErOO-iwriFHms6KmrFhjSFkKNJ4pO9XtjqZ8TsZDGl7Byasn-mawpU08x3xxpLzxYVyJHXWmd8JTzB4Vc9ZT6lHkEOzWnxi_LkqWskOtGvIL0zYH22Hh4GAtpNbwFdnz_7TTWSYWKoHKVlbCvzM19LQ8CyYo7Yppic5m_29qKw9FE8or8KmIZ9mj-jQZcEWWsPDyYDdTXvbo7uKJO_jz1LLOLeLSrJXX9WEDe3pLw0Dauc3J-NfQ2Yb6Cs36NTSElUGXbb0sQU00nr3psGtudbU9w6U6NyC5s0345mQ8NSvlgY_ob6jTEu3ad1YE3lrYTVgtVa6irpo1cSfqH15G8aaOCVyh3yCD3x9Ms0hjPWan4OgulH6KsFh0mBPE3omsldd43ILpeEPuZ5UJDGFOt2oLLG25XIKALgCg97ot8p83hQ-HyCnSDbgfYXO8onsywQyf7RKye1ti9sMKU0yQFChU0uwgYjmS1395Csr1PwJyRziOyspeqZpaI2Gpi6n5MmF02LZ0p80oxM9cis3KPFxlNRf79AX7Lwmc_O8koAlxlZz2td8iYFXkZ0GzQUvwPSo_eZy265uVRhW4XdugXFptxXPHa4K5O2_jkPcS387vkOIoy_7PoynLtjHgsWBfAzKtxcJm8MJgWag9ma8KPR-CtrXvcGUIw2gVJngrYydZP-eVCoVv3CG8H0Q2G_SgDLy03zz7kxzavfK8VuK7Lm-uzpjnXeaw-nDBgeaLdGyoE9aALhonHCgXB4KrFDBPgTHv2zuX-4zCz_E26RXt8EldHdzsQ1kVkFofFwFkeGDUeu9A2jY6lBfzSXc-qaUYRgORNG4FdsYTyyvtvg61tz1IGzlnhok9SowAfOl8EaLbe1w7HVRdPrk_1xzVZ94bbgwXOzZGfbCV_YIhvGCplCc49o40ExDGTWQlI7g0SWWkGkwBnRC5-morw3aB76wCPbWrWph3zzsvQrjiJSjuQVcH6gyaumJ6Xw2_csGki2Jvsw02dQD37Vt7WpYpLh7w7oppJv_g_Cuuh1OOOMEmCEecWvrPdGfxBZozIFP9g5kopeSHE0Vi031ZXYTyjmWM8MLWWGOaFfZDfzn7sNPPMqhFP3UE1gPsIjECPLrJS6iVhae7l22VX1rkklgHN-eRd40ZE6lG5YoBJiHnsleDnOfdZj4DfRQwLBHTxeZwX1LVE2Ipmk-e8eoP2HFPUEB57LjvOU3JRMM0JFQCzwUZUiKtC-vwn5-N4Ne4ZU5aPm_59E3A1kNsFwTnCgqfwxoEDWcrScKnakP32ESOOlmiIGHjPfl8icIkQw0Lkt-yHonXwKjWdoEFyGNg7MGYRE6hT-DgGNOsr_guFqnldeHSQj8Qz1STgYOI2AAHr1eab4fTk9OhePXV2YG_SRKRn_3Dla_iJ4GQ1gcIH33AzXHI5EiTNvIMT6Hftv-i187JEsrr9HXmTsWWZBf__IufF2VjaDPFwqC3d0X2xAdmRyzEAi5wfbnf-DqIVycVbC65tQ2JswRyEyUmWkmaZfZAotD2y9Gbst55hpuu9y5uzlOLp9i0Tea4962gZegxMDgRccOOtCIoy5B6cU7ydF-IkoWObOH14obsyX80xXY-0KKCq92unHHvI0mfSFgQQcL3qTTmmWAJtXt8OZr8HH3n061aLHEX14Bw7nvijk6FsqdZFWicN-EwcWypMO6KjQ5E3sMUlJllW_nqlbIAG9eNjwj8vURbf46UGkffH9D2hJiHliTSy-3t-y8M4cS0QOs-U1lknvjZwH6bGPSt0a3IJk-UwFLUuwqHQTeNog0x363yxsXRukftG6HtYqWNR-d89q4BaKulGqlya4KtN_Rwgl-kbbnSx-cMu2-zkTeLSgtHdTBQVg-UXoB2-fCW-7y4G4TyKDuAboAkEfXbGezw7ISZbRtHH0vf09iLGs6dRwKUTdb8di6mgFFd3i9-JyEn8T3uSsPxOXbbPvprQbklNzBK1omSZnqTGQlhhFpKI-TrIBUaz23Qv5AbO80a5ko7Sg3HxTN_WtNgIfZ6FRewTdPUZepfA4-yLdmdgc3mAQPC1co6twGsv4WhxjQLkhr8wuU3wsRdT0--QlvqUPN1DoQfbpVAPWGsAnbG_XKLhKGMJ2kycS2zXJFHOYmlu_RwjtSYM9DPT6W5ugjgglTggusqTCJtEvBssQB9LSy4vdOadV-1MN79z4K3Vkdigu2Y-Qdq8LEn_N5wQ3vd9LlDgNFeSAMeK9h44TLtvyTfSK4JOaV85RnelUdH-aQ_B9VrvQAUlCAlf_91BJWoXUmz-XDR5d6ee_XrwypmQAvXrlewGuZBUo3f_-1QpSmJQ-yAShiujUK76V-5Ug8SUEUkMfaVJS_Sk2yWJ8k_HfIQH6oa5yUCD9CMlJv600iTK8Kh65dkOcnIyg4LdpAflXmKPttFeTImHD-Dki4X3GwCUPtPKN8b290FAWacyrmpC4QusjWA3-3ZUU3NxcIEX4O96OEJqmMKFZmSERWI1Y4lNVnmRHhIOvizT6N9-8vcO1GCvDrtA0JBKg1qGl6IyrkP1DxBPA_UELJJxHX-epIXOS9ZsXdW1L_fPjHJAmFLxY417YpPJGkqMTwdSS8yJmT4JSdX1YjxYsmzQzLSfVoapiDgOXcs-ef5YLUHhlrbTZLlAgw9r-iFSZpErUE0yDqcZKgvltWx6M1yEKq_1NmfE27JwSsC3wEED52IXzxxDtqk0477r6N3eL9RIm9jdNj-6nJccAJ2xxi0onZZMIl3MhWOM0IrSlJWyccoRn9LQgMsSoZ-8bRPCe3DJZUgn-JuQOR5st75rsTKveZr8r5-q7PTeJHiU9HjI5-owRb7ACPnmlZwAbAXswXDPZhHDHzJ7QwclUdWQlzN6LtZazE00r5CtGTmvPdZUdxbN1VrAm40zgEEbcYEHYEGytMjgId054PLi0xo8DbgCVZuGzFwKpyOet6H5w5SS_xWyQ10YsDtBjONCkpVlRQhgsRk4LMEEyPfhr3jkBoVrUYeIZXTWC_xHqp820yQCnbjF-hTbKOritbRP0WbBdEdWjhed7WrhI9AO_1hrxY5yqgQ3r9oPXOy6domqy3euLbn8aiqQsjLm-oKFoYUyQipZLY5piRwLN3IbR96qK9MAjYZs-pqWlNQvF9ijv6paBda4IZ6wtBZruLwHB6W-x30t-S6_9MLeC47Li5CoXeavMUBml4gullIwPFRzECVQTnHoBAiEmYKGAieswElUSZHdDbVN70OlvKI-pV3jgNhdVBJ1OiZ5H_Xen56ArTFCLJYExiOlgiHYPkiF1YfY6rQf1vNeH4HEsqH8wRS7GDHovhmhopneo0EMCgbgJYfvhllo9gQ9-Ag6_Ql4K3yoEAOgQtEhA9DwpmrEbhJobFgcAwOwcW6mi883Sd-G64uGn2DkGsZKequKXdER8YBKd5pNHXjGO9CaEGZVVCqEiSRN7HGWdSSJhXvW4o0eriiTDnE5gC0yRH94cGT_rot1t52MuTOoWMZiEEDS0oNd0llhon1DzYDsLXAc5O_3DxgruhaBosW9KUhywY3EWrEtKGU1szOINku0XcJ6LHH_rZFSZwfgmkBRuKLP4sIERQ0mWruHQBibObhKnMm18RgnoHge-pT1DASTpH-3MQHkRRBE381xhTbPvWab9sb64wM-L9PnMoMZ_X1XARODzO5atM4m_bMyN6v316ZQcjXMN9pKw7eq-wRjkDSKvkNWTPTMhs_OLAwDvWOjQQFCZR-LowZ1vIVqKVmMe5kSfeym5Tccx76JKjqpOlGsxP3g_wKaU7V5GYU3lvHv_eLvpRGwZp8YWlvF_7pdcU80jmtn9yQkXKzoNQK949WPpow8H8_m76BelSPMOufQTTM6NBS91rIh7Xj7wuxGF5WXNDxAKaP_QzSq0MsNtCS1AG0reQImmDvomRqUFR7Wf5iz4JiDDgmmanpub6y7ztJKQd_fmXPPEJwQ_C3bDZSKmWkQM-kxfynZgkGrBL9MthWV52iD18gZTSPpWm5IjuuettPPMIXrcVT-1jRoxu3BHUF1s0RqYle6uOeo283-NOk-qq1BcaX06qEB8ngS15nhi2B4-kgtLDep-jS6dxzIWT6eFASzOyq48jolmlrk_vvWbZo1ctJDec_l2DUX7kAest8VPVGCA60_3vQb8w8f9mkCSAs-4vx2H7_GKlXvVABd28kay-RPAsFwBfqzx6j7aOQLJ0oSSaWf6FKfkoL6mD3Xv8nX26wnSw7GyZpP0uEaXa0a6P1OUJ4RYqyEd8j8wATdz_AFhm78S33xUKQWJi88jtrYPmJjW4qobghTERCKVBxk6UYyNiR5JiOTgbZUvRiVOQQjtIjv7SgoxSliNJwSJ1gJ3cewNn_pKMJTmUEe16Vjk6snmsH2W_D5IXCkVgolfg2iF-RDDYq9YTuAWNfl34JHHszrCikW-mXQVvkqpHO9_C69RCosQpXzuoCX-mJc0hPILWQxiuRkiV4VVAcmg63n2zxSqwcKuQY9BkBGkCCuP6UXQkIyKWDvzTtbFbvxmZDtlCop90db6bttrsi99hQkFrA3lPiuWDgEngSt81axYpMxMaCiiYhLpjy0x1yVsMW_YxxH9-OyTJsO3MXqKjEdcYOM3zBNAp6RYqqeTk_93EFgpuIc3MYMd7eIyMYkzVPFHM219eDvMItDmeUPua87ILScT-QuuQUAmFMjEBwSR__zQh_DwU2AfAfD7Lba6eCH4vYQgx72rTK33fDVtEjJmFxYXI_xAIyI0OScUPCmi840icbGblheoX7ncZnt5c2L0x6Z0c4TNjTs7PtsJmDvRKbNtA1_tWEcncPcEOZYnboGJY-oZLgeDO7ZIHyKdkgFUoTOSWfVd5lhTEeuQN4lGpkQ038Ougu5SoQDZvMCR9iGZM2NTlg1hIvadzY4eaWIHhmnKm0cmPG4Ndz-lzKXDBI9zYdTuwHACjexKNzPP6Zlupaz-JtwO6UfKDj3AWrfVYHBA6JbS2EYxK5lZXIXiCr_R9rd5pdS7J02uzkFzEa1jLnfFCf5WusAsGcDgu-m1hCKMuJS6G4Eo-BLMrlb8Ia76SklKIoTPFXfHIfewNa3LY81iioJMwLH7mpIGdlxEf-fJt3NdHYltz4CdI7L7541uaZOWetLYkLEQeH91daVLv9jwUOyShxT7ZrVxheRGxkcrnVD_9ZQleEKYK4dF2MhHCNMaO4GeEW0YCDR_Z3AJ_t2adavJWDrXYGbr6E1kANH0aLTGL5KUdnJmEUgGCic49qgWW2dUwtIHAcQxLkIFq4fhggvTzwDm2TjS05boiwVp5WswR1LAB9O-eCDQui3kVimlw3UviHfNEyZdkwM4vfjG4SZc1xGpdUd38K3-xyUnx-0TsFoJSNsWYGW3yw6YFoSkKo8qNUuN3JZKnW8fi582ilw1uyxs6KKRL46px1-6RxueWYTO2qbb6AAG9e_GxqW8tXpssu4480pSP6kNn8ANDFI_m6ggkGEe7656ZBVlKggP20EIOgUDsMTsnTSOp8H5n-LzCrhVLgN-mKAtLxqkGKhrWB9v-lqCJMS67bpng1OKFXOThKqdomJYkTOfO2VXYBVst8b2aOMzqoz1qYJ-LYPQ-8jtSZGaf58bKsP62Eogb6Qu_Rdi1r-czKLbBugDGEUBoEYRTXrgM9Y_fqywa56QWeSV2yWZKjYXpLThMwPGhmF9onOAptQFrEuc-q_g5Y75Ut_ZM6y4UQu-uGxHxAUhSJbB95Kg8UBWCXY7PWg4qxj5mjDfD1zsEhMSaxSIYAT9QNc4Ym2OGnzh9SSdBdCgFZT7Y5LpENJE1AuOTDaLv8MxWn0mzS6KXY0ZYojXd9gDpkDxKaFohYNsa9TLJEjymiNN8jlEPEWznGMl3Kdx92Ge4OPSuO-PYNbaHYdM4Hu1T-KjhukNkTedqpsmMosJdBORV2icBxuwc8SvqIU8sAUGgSsWGReib6cqx_khjC_cejwEC9hSqgI0XJK_uV9qFXfmBgbJcMUbMS3mQGPmBAxBA2zCeLoH1sPReLOFjhbaGknpDaK9FiBE1u9A75hj5lH2amK7V2hoTcGwnGNmSyO3Y4YEtsUCS7W1-8ogrNlnxQ9GlH_sDtJOvgQ2D57HgP14DXNbz5QBGSq_JKGT0t2XBRbDfAoSCxu8zBEJmfD9M_B4Zs7cjdTbZ9c5fIBBVUacIcI1NhKbiuxdXxPTCck6Iu3Q9FpZA6jL2ABKFCCqPMxuJTAK8_NofF6X6sd7KseSO8RZK9o9h-ct9Po6C4G1YgzsHuk-zrrJrxcy9GHzqsT74ITqPI6ZGpmDTMOjACqdyRXb7nAFL_Spm0kSTgFwAV7SmBX_aFCcbh8xSO9hV6WDiebqtSc_6y30COITdAzFrrdiN0ZVgH4fM-nk1omL84VSAMbz1azI6dW3Be7aUkIUxqemMh7cuGLYyywX8uo7C9F87VyU9VqEvC4x5Cih4Vg-TfrcHscqStaeagVtXRDgrOfy6v-IkldkKZHnnC-l-UDsznv_DzCenYHpq17jTPBi5wNkYMZMm_Iltv3mnuHMcOPL7nF8quo7LiVIqNQV_I2Xq7VRDp4Y199EfpXQE1W_fNW8Ms4vqhXHvLLXIX2sfxqlVW55SZ2nG779SynPDl88Eiz7ZDQSemb73hikZ14YckH36yxQMKFkPmPmxLhuhJ1iMZO9oKxoq1Pk0s0QmlKOlPJMDsZqeIUsD7R_7yyajN-s3oop4_1g3hQ_q31E1ra8ZNs5MEqztSP_QnxYlY0lkjBfKtrXNNvIYxn4k7fGGIicd1QgAqEY1jtfmU5IY5ecYZp4Dvaet-Rw7rM2bwRFuUtqcPT-RLAMGUe2-HdGfUnXBQXcSvM5wzCBhJqaBJnwpWl_CCpzHIivUjs_kcuZKC1W3vOyR_jiEo253RT90zadp6WujpFnC_NDryXzR5cs0FQFs2UMcjZluHtFfPDykH43mmzOPJESD6smSRGCTORLAGQvq2eXAYH9ueMAOHynr5SKmPx4cd9UXPimcTbe6CD5Do-rgTAq9KMm5Wfg7gw75PLHKn-cpGlqjmykZPQ7k1N84cp106ClR0x--N0r6WTASd9hPqxDG54qiP0XmII4rqwLHf3M0dVBZc53Myjg6sXgNziedFxujfkhevnkwKFG2IIiMfoBsXrnUJX7C2QZsQmVLbfSbu0DpMAGv_IMF-tTiLBVSHl1qK3QnLCqG3rgUbgVhRA4qnqEdsZKfsKncjdNu0uZXq13qDnuDS8K5ASXMzO89GemKOwQkwKyzTUIqsovTIqfLI_0uMMxQ6KIUE3iwNgDPxB9VYjscOGemc1r8YLStyc7Y0b_Cnt3XgKQHoembTeryiLtyERQKJHogMzR1CRrRUxScMIFUnjhnGZyTd3Z52K0Q9viLTH8k8YaeXIKneMgeRBUBhclFPr0NTKFqmUetK29vhBVsTdyfQ1Z5fDVZTnEilIXcdelIr-vMQEjCqI8Wc4sezGQoe57D5A2ckwGmYwm17psRfzhqDEsDjkJUhP3YxJu5ps0UdgpHI5RhCYAObM37WxhNiuvtNQAZ4tBOuhD12UG_E9sS5YJMk_TnDffnjdg4yG2T61LrpwGF6Y0I7hOL5XScwVyQgZdC0xVwxEJxrfS8_xtNa3fqRucA0lax2tPpFDrMv9msNjkgec7bWQkenmRMNV3c-mwVmhRU_lbBPUeyiVnM9ciU30N_YXw3Cc6_ILuOIe5GvY_pnXjgZyhsuMDjDwX_NQTz4lHSgwG_ZQVCer72SXyrfXo_u3ehFa28EVR-iJxFr0C49mvIlRYYbdpV5zfE9Zp-bfhW5qfFXxdrwORbUJAXFKdE5HKUD_Gv8GNAwqPfCe_FHEFbjXyQBf4sJzYaoEnVSGF23UzVmMdU1d-pWPubc0f6dVDlcKls0_73y4QEJdITfFF2uWB-wnHubxKwjQGDZcbhao6d7Jab7GSeNwCwQhuO_Cpk-e0-WE4PtWFRyxLRrKwiqWc-zu6o-vhYTUW2R3fRBdLHUJdm233kBIDlkhb4c_QanjxzI-3teqCqg6uDiVd8pYknUXtrYumQQmJzLQzaejBUuZtr7G_XZZBdnEK682---NKXRETGa38qIh27vLUTQwpc9lxNpZtRILrn91L-3ldMRtDh903gnYafQuAAboBapGeJ9L0zcuDtas-Rt1lP1i7Hs_Wr2qzrDMGCHQ4JHnwGQ4SA0r8C7-qm3lzSu4uHzFgQZ0w5lP21r-xRiTCtcZ_ByYy0s-YqewLZS5gq-TYDymfGT_jWOOoZGOcF_Ck8DNwnvNcU2qhR3u6VM597x5t4i8Rzcrmnz6gNTUHTAYM1XfG_mhxAHrms99uH5NlAaOpmiahSx6swc6Tkuj138lvXCQXIZ8-sYyhxvcaZLK94Qhde1-jyuJzP2iozj05TJieQyd67Xi0VtXYquejBwEUGGWZnuaXd0grC73mhsjlhpDRzQifdFmhCxFQohEnSEhh52Ggz-EKNYf-rrRLekgluz1rWfm8stU7qgezhJ2Gg-x3-WZdH7KOuYS7qjWz9EWO_KwagGPrU8unsapS2TlsqnKchejomnMaJwVotOjLmAvOQ_XhTU-ZvzyFIlv2JR65USSOkole5uop6A5hi5sJVhmf3j4lSlePZl15SU4BNBVclZ_XkEQ8U5hR8-_Wnl6WMeOdpb4ymgDoj_-3IRNrxbKt8k5CBIh3r2Sdbl2A9gGeUSmVMd8Ye6Os92iZuN0_n4f4X5ssC3rPD6Tx6OFSeorVWi73mBpfoLF62r-wYci1Fqns7_GLzdL1O-nRYN_HiCVZ_--Mx-RZClJjmSUyDEQz-0hmORkDOMSlvxD_lozdnQIKTw9p7mWV4rWxxz1npquY4jC-rJLZjXy1fdWHtddJVp-KOiJlpY0M8bF6LHRq2PRfrSjyv50TzWDs5eSyDT7HBXxq8q3-PnDFxT0zgKxDM2Ag76LSrXeeyeTalYtDi9rgPtGWvTNBTX6vaWC96fJhygTIezCsEqiOH9d0EZCHaKP-lOE5LbqYVYwUCIg3aWgF6yBKcCU56gfZIyV7ePJeTEnc7Bfgs8plVFz--B0sHkB43Sn1OlKde22TZL4Z-DxderVM20TWNI5eQc4dEoeFJ4waEmsuQST5CaDBNpZ5o6SfjxelIotNkPcCQx4x06PZ9VFVvODpq8bUbaMcUGXbCUHqGbZTox0jTtNs5M-F7nu5b5WhhqW1v-tMURwopEz41CR8EAUWqM-do4jgdY5dnADNczn-s8eergiF2QX6TiQZmV-o308uQKD1TRZdMMt6pWTypufZRHURhIRHbdP5e2UJNHZrh1BAT3nFpKqRVC80GDPxZxguomOE8haGOZol1TV70ZkAv-_rmIdZbAVfwLPJG5GCCiLxFVHknHAa7QGad5rIbPLLZaX_SU4hAzWXUtQmhIJDw63saj2c_h1L_YPnEXcNnNoWuTDgcTzOGf0hW_m-9VmJlUtOkofD77gj6mNaxyReDIWUq8r00qt7n-K88MsbMKSOk3IVahrpNQ-kgjRFFnOk-kvz-mu7DmQSWWyvHz8OzT2pTLQqKHp8rRMgrHuTbn8-S2kXYlsd1z9h01QaPdIZ1wUFLhg_GeKdg4Vg0DHcg8Sn0Ib0hiAjQxrXttrY7nOZpR_cuVQd-IfMCLXWQ6xAjPlEwDXF757rio3iunxMZl7SgmJHzj6jCNr4abLybappRRrpLep70ewqhtco5o7e55iQQdxiUNIYFBdf7i0ZSoOwijaIad9sPgLXDhzGSUFWonm7yOSpXWmLq03ETjU6BUyMLS0mWo5W0UesFjwZ5-CbkBGDHWMe9XWD06MGOpnTkT_k90J1H0dSjtjjNXufNKuuDnUkaAvmp52pz6aZs16e7eKOyU3MsDB5BWtShfNMUCpWxxqMZhIKw0V_QaS4sssjZpBh4Dgk66dHbbNopI9ggb9t9ZMsxztZQGD0Fyhq3s9YtDpH6_KUZ8brBb-T2Ld_Dc3Z0ZMMw0pdG5SvMcLR1vJjamzsYxi3nZL7SYoco5Rk3_B8LBXP202my2Y471CTDlZuiIgymjLrr09pvnSMS1BbOQDh7aqpSyqpwJdOL6yikmgEsy4KBGirfkbavn7wSGqx3eU5mcKQauJV2-WtzQLHluGueKqLsZy6N0ExAdctPGuZJxaA3WR_hivYBn3Xb7k7-IZadFiQF0LPuNHA7dzQuvNDd1pVlGwLvwGffjwWRXhXSKVOHLe_-1suiiNqMSvpg0otUPjUlVm1NxAsPI-ayxG1rtLt7lZ-FK_rRD2tuRkHqSZOP7_QvV8cPGY0Y97MwcGQ7t9nMMaj50-q1M96CUTOnWebPBWEx0Wou9_QCSRoI3wPlB4UfvP7sa1npCHxh2lh2W0lhwhi5KfkcjdSbaV7QgBFXeefWo3H12U4yoVM8Ss428yoBhJ092KjWSVHayyXHx-ms0b_QH7xPYy7a0Z0rafyaQNIU-rXES8KiIRLNsjm_Fq9d33zuXPgnucJjqxzfsnObJ4CZ5iqNrAd1STBQ5N4OJwbF-wapxa2s0liGbLiMfiLkOMr083S9OD2j8iQ4UUO3PB21ASUzlUDi6qEODP4Usvls2il4XNnwc44VbCxp0pio0wdtYen8Gb-F8Z5cl4RjV07r5m0OyAA8d1hXhMsAy_adPcjowrDqojiEybAk0tOse2pkc8SodueIvCesYsmzznedH36ZISaFKRb4tRvCVJkbJQsAkZU_C_yVLXJfpaOfzuSrs1CV3mgc7KGRUWcrC-lMFyixL4-CZklqmxj3-e2fwNvVIV7bdVU_l55aioVUyHZ4yVH3f6nKzbEqF5ZRfhamuIXoysYltnG0oFMMmO2l67PEAwuxn2Ui74uZ6_qy6bRUwM22xGSUq5IAqlxR9U_6l-bTT-NInj0b6AuDquWwbFrXHneyZ714A6RsVaQZCyHT4YkNI0IgtP0qjgjCEkfJCeZC3-CdUXps3NzRiKksy0vnm_8Tapo4BVjevbVifcBAuPKCl5KCPFcSZ0DoiK43jrvoNRAJuVmj12hT0iZIFoa_W-BjyZhdXqEB0BJvQxGSONBDDZBnoF8X0fWhp_PhqacRsjJcdctbBLKwMyv_LngdAyi4YlJ3wE9Dl9rwWxmcLE2a5W9diMkXnVdQyvv_ohzdWi15D-apk2jPSYqznsKOWsiuCXXRP6e0YHSs_qOMBdheZqNaX6A5bDJZtzyRSUMc-YfD1E1VSqAqZ640RCIb54uS-_P05wJIItTYEoIxjAh4AhHkp1TBiV2qX-QKciHaUu7EVVr1KEX0VOhFBeWfwyj-Xzv27gBXkIlvK-OxD27qCjDPov6pXInQc8p4i_lR7Tws_YwlbilnzRVLg063yTXUDnuxfzhKwNW1Y88DuXKl__Ky-AaXdDSjs6_WyzmM4djpHxGudMPaw_0ZARMhWif16Ro3MNnCxLcKtjMhmYqFh87c1BppUWBP-z-9IInok1jzdHEgYxqIJVyjXDSKJkLPQCWzKSXpOroZrHKPNzf5NpagIK1w_hBFp3Z1mWV4JfvweKBpelvcDOAeExrNOWdVtOJX7inht0S8mPpCaZySz_W1SM-erS0K1ltKUN7NcU3V1IM4Rdpr8ws0IdNkgMlscUBzh8Rb6h429sx0Tw9vLdCS0pMCP4h-s9bES8PZSr3icDzk-uax4qsy8wAhVVzUuy8PKmNazyfSUT5gjRj5XOgeI9ClDr8BsyO7qJsKc9eLWIq0JWtrsiLaX1Gi9SKu11PRV45iepGt03RG5QqH7ITXlyUbFfjAd9ZoL_rHKIatKrCRgI5lgWtNM5AgTOGbjdxtMHL9QpdBescRdSBnSessTxMG4GlOng_q9Ms-nYQO8njOqd3RZEftsissxOp6ZU9PvkQZHrKOlgNYmlV1wdUye8vhqpiY-LlxPrhBLYJe915yjnScl-gpyZj6NexCdEST6MtDgDq9d2kSR4ylzD1X1JkQlFTBwNG_2cEEuGlzzD0lmL8MKZLXD41ABCobZDmDnZUYJhwhZsQqxGsm4RogQ0ivyhBm0KO1-_iajjcKrUNmtXOIhhwtMgOquVaSVv3L7eTvjDEG2Fs_a9PXqgfMnUk8cdjIQrxj2uPv6oE2HBzRWKKGUmW_1VSrNLfhyJbJvlJYfgQhRFRlo3eXqYu-NRWcPBlpJEw7Ng8oXbtILXsIx-VhJhGSaUAR8fOM4nqWFsml7Q88w0i7fmt_vSNr4npHBNip0iqg9TZCQJSaIHpiuIR6FWNXAL97mX7EBiFWCDZwsK9sTmdmKIWHJF8V4NT_JxU28U3eHJE45dMVEugdDY8g-q8pMH2_YFerX_YYtPfn_X3pKYFybqzBL_e9oCoBikcGmSejBpsOfjOuFuO9UcASyQdynhpiEjX21BVME3T-2lhP1db6vSv2P0CVvIoTa8xAmWu4ic3nH95-SuJOhQ-qq_2U8-FjchCyK-bmVoGKuMZVwLfAQUtjSYfYjSGUoAHSbCSocf3_C9LQW2Aiym1hTUelOSXyvModjGw7fmZXWYh8RtrUWQtZLNKK6YhOtX0DhDKf7VKKrwiZjogudO3KVCLLy6e2BMWOrTIr7-b7T6Oj9O9YaQ3aN7YAcpX4MZ8M6N9H9RywJ_ZXOXk63zJB2avvTrmlXj9t54GHa-rM6aSun5z9w8DGTBlWvkJdJd0vWmnDSKH7evf05_XhM6Zj2Kl7S3wipS8cq9S5Y8O_m-y5HFC3tPfYmn311hI155L4b8yyDe3dcHBcwfrf5rPQijkwuxYWKH3XxygFRkc3f6G6WwnvWrqBj936BvgSMP9MgaxA9gUwNF2U4MLN7-E5u9EpP5kTkYKFF5bRx2paRZZM6JLcQegmm5kAncBqq6GtHb1ULfiIZ_AGcRgkKufUJvkK13VSAy5QNolJ75z8QCH80CEofUBLim-2p2j1FWc3bYXyga6M8k7AeLBPHZw7rgZKi6vEMAxuUrPW5bwQspNTPJKS4xSjuRtnkqtdVeosnnNfAVLV0rKMggA1a6B6k4U8AXXYjt49UZg-Abp1DdW75v4D54j5W0yAfgJBcUDrmOn_xv_K5o5ngN5IHOXJBUJph6n9kG2CKtEfgs8BlXYbbKFV3nCL7Ey5s2xC_2FzegSCUb_HkwMP2MZwPQ3OEPp_ZeQp4vTYOZGW1QpOBA8Vnzki_BX6oXM1ggCrnrtWO53cPP951a_g06XH6hqk6DYBZGtFSq13H11FTQluxO2G6NxmLD6BSXsInD2dK_FrGWPafD7Iw5nhMo5Wul8JTcKt54pXX8wrgiDlC9cELnRt5ui1cR25ggEkBS2lqwKdNLYi_Lo2SU5e2xpK2NcUjlI7Zja6hTaJ_t7iPkZa8flfqSnSv8rGVCV_mahWrW78mDUvd-V0l7H5dflJuoiILTbreIiglymZRl5xDJHe3y7yxFSGaQZ9FZY8bSDJq2YKHxm5XV5VIomLyYvbrTWEBjIr6AqzM3Ne8anaG8kVs6c4EKLB7DWA8fJokYNHhy2I9DtNdaXdsG0B2wRYjMjjzzUK_u1_cYY7-99Lerku-D0nxihpwQATAQZzSIj4ARBlms_9C7Srm_l44VgXeKqzs5K-nsD_kD04nJyjTtsVqXtMkEEJesRCv0rVdjrdhpqbB1kWHNhaylTTUSnFFQuiy2_LKpVOxdgDgEyjV7xf86JPOeTp9UQqFTKLDVZoBY0NehmDhCJabZP8NbGwihH2Fy9rifwAu2gcoOcsLForxgZY0ZB36S0Y1rMdWobn31ZrScgohdRGrdrGs7Fn-dYIXTTpmFF0APbFiYBq8g8xZL5HDLBLEk8gDeDSKaZytCI25vGuJIMMcWMNRoaL3jVGSEWAq5aSN4fgTIdsOrEkIn6Uin_R6yfsATvfzMJ2tVnR4me40hdTWvhuHYuwjOs5HIuMLt7NP-jQ_rBlDG_m2mcDEKWes0m-fB3rFAMcTd1AXNcQX8EwCvzY84JHvUNlvF6W5NO1tvl56qOD1e8Mqxl_sOCRyUpB3R2kgF2A4GGK1gIcefmAYzlX0mp0nNBxuiyOiDf96FqTbQjy0y6Ae-FRlyEgp0FoFwBz5QKTZ6Bt6duZwDb7xCSQQTIPKzvSHykXRk1lCFimObuzvVREMrOGHElin8YYcrvHLkdE-jxKWWpv0j5OfhfzoB-RdD2kE8AA2c1u9lQjrL__N9GtJRyt6-EQPEh_eIveU8sEOOcCQ7o2bXcf1ZqB6Qp6jzRpdUI0zSpMx17Y9VXdNvGkHRCEKmzh5fSrrzl_jYaMI_tPrq5VV6cPqdasK2AFBrOzHFWLZACQ7QksXIsS0POgKt2QNF5USalVkY2k0-LzeIF8wN9Q6oqCOzH1c9_Y8I585_A_zOiMKZPDTqO1an310UoEHwRs6RfNXDFl0psz5NoDKLBaKxq8CFu9gZ0hvGeR5GPNWwoedFlPU_beS90jT12mN91NqCBBQQA2g84tMRVuyTArrT_i9QQBsPNxH02XNpNE4nFQFEWi0yeDPsW_TjEtc28_KUCb9dfRqTlGjIm_M_1ZALl9XHsPIYHlvuqSKE4y15ZFVfFI5qL7EwobgqLlAmvIcE5r0uVYwvv5RJfuUBH6nGTc3hnDv0UYqya52fZt7Ch7MRWFNas9zBUQH6LNGleWeo5C0Bxgyl-tZSq3LPhWT8yDMRuhYa8f3mjUcMQkupJo7M1j6-V9V24Fiur0WhAC2eoMhNfWJ0djbsq-gA50vZleooEevWNwuQribP1K_zu23qKQmGxVPJennuU0R_02IK0ybhkdrHYL2N9ahJKeYXViO7x9fOsY-o9_l0AnU-MLIfwC9f2KHrX07Qrhne8e3-fDVcgyHaCQedOrw3mP90a88-a-LnZ338PKaaetwTBlulewhu2Ir9R-trgDmgHYUd5aAGMSxUecz0m91ztNRaZcWacckc2d2et8oWBoIxh7pg6qTeEeE2TeeA8hqb6EDMRUsBVublPy7ThOMyDTG8W0kxWnBT9sZXfxMBJtcX2GEwLEIa-_ZVZrEBxZJcsYVpzMhP-H6IXdk40xHI_sIIx_h6SzjT0udWBRhvRWuMbtfMXAVrw6wJ65TxEe3Dt6IjWKekQHl17gRWuZbjdoPa3utF-3XzodqxmhBMRKzeW1iBvVigszmlwl_VQr2oS6rxK4--wVlSUFuKsTP4sXMFExE8mUOQL-m73-k3XWZmjBCp8laq0itfovkk_3NaKOgL4bxyCUhJJ0KeEmbT4SAyBkp4jZ5je_Ajl_PRb19JjWPaSCB8xmVkQ1M912ljHqvou4ottVLNTGwA4wyP30xc5qHwc8tHfMDBLlboLUZfSB_hHVdMFzg3g_AkkZBcheLn7-YHLznyHyFZ3S-n1THDeDGp_XpwcLO1PktwZf6aRe4KWmb1ERi-O13s_mhfu4R4qDaMUrr0xqWBU8rMpu5jXa_KF5OnyyXqxLvWAjPhG0EpXUF9HnlX6fdyNoxiFPF5G8Luzj3fHv5omHVnzJpp6i1Ipq5THuWzbNFv4VU6JU-352wuKXshLd5wCwrPxZezJagtz5s11yAnvTfmTo7aM2EfokAAOrnOK0RpUBnFjX3lVEqGQbMi91uRgBVCsbACZOVu0flsRTbg1hmLfnnfUL2-qf8PI9EhnqrrACrrlySbn16TcvIakWqw52sYqzJMN5AliPFDct4uLG4W1zk4Cckp0_IN0DZGnjqZvDsmkkQOIYCukbTbO5bnEYsVrG-N7KBswb4GH0_fuuQq9cX-E4KnPIoEYMjp0We7TrCswwRSgOmaGRIyUBYCPHFfNq2Mn1IO_wAmfwbvvKBjPWAFhXIKV8Y8Uadmv0B_rPb8EPrwzu8lgxadxnayQALKYjf8Yj9ITizs0ZCp84P_Bs-F6QBGD-uyv5Z442ki1fKjNGdbV8IFQNkr1G5nZk0_UAZpQHug6WDVUUsQzChb1tW4hxfZZq2mjcMDdAudFr6qnsozfqe6SuSIPvAht2ZYXuQmDZbUvClm6vTUkWVHuw_3ZQt8vGqGES76Uca_GhoQpP1gO44D58hbSUDFA1_xrZtS4Q7ZU_4T8kPfEzzTUlQuUDtcVLWttQ9F6tPe9tlC3tY-B49PzESNIudyhjNHnwLOvtaajoJJBmZK_NRbwMeXZ_Ja1yzoSY7vbyB5AezCyNwrstsBRf9WgZtHxBaYtRQJgLxb7drCJ9BDast80ACXUuxifx_ZnICB7xYzwHLMeTt7-X57Ijv760Twa1YuBRKDnGxYpziFTlB8h0ZjVy8iwNuXY8pxPKWovhI2s9VUjW-W8SSoqBWcfuNk0Z0TnmwdM5xN2mZXl3gotQ15tXGZOHfrse3ptCDYOecr18ilTnoZl_AxYobEqEkFYovhOqXv_dgr90WH4mn8MaoG3SzWlBfNF6gbSPdCsZTQexKI0qwEyVpPIch5avVYP4g0y68aR0Gipb4BiVqXUkknIfxQc4DrLDuk4bDw5eziL-4kURtzBYCbke_6fBkgmfalXHQ2ZP-5DbVl-ynvIEElG9JkR2tITJZY2fmWiC3TfbzooiZzAjwbKqJPNKt7HrRZQrwlimYH7al4U8IIJ30QTI2K2qoB-5PAKrcsyhbAKFBDaqiOJM64HBu2Ic7HBqAi-LI0YLP0bqSJDxK5GV2o8kcdrqXq56FpixTvJAKALlegp4LUudD5FoA5GInki-zacDQS9t4C2OuvIn2tCjBnbLd_yIS9UJ22F7RNiIh_UkxA36Y23iwnZTif8gDVKJ0HKANR_0Y5-MlDYeFo7JXI7OiZVoBL3R6DDnniayYE5xjciMIy0FVZsOtJ8a1LNKvE1Pelz-lxHy9INZecAF8lLsEqAhXnv_p2pUf5C7_6loRUkJB1WZJOU8ACZ7kpmECJNILyhMMVIP6BEOJAHqtXJG4nLY17rByFHvIhi4vnE8wudxUy1wR2dkd7gooHofECkgiD1Uw-TfR1KmnLLrgKhZmEZSI1MYDLI7nckI0_TiaBTQAIf4hcSO4MjM-piauwTmjhzRCaj-bsio7aNuaPv3N8j5qAiffaOvjVOiZwj4irPsMNE8YFMSQk5UKGnEuudbOGajJ9J5zQ4CmkQa33fqnbAQ1xbuh3CB-wPo90BVQmdERIg-A7126UtbbZNclfYojTtCi7973I_Vt8X-Htggp0rX-CdL6pBk89DER0eeAkVaxunVgns7_V2CQ8LBZX_azsoNUZumZJlyO6vSGu4yH1CLGl9QL74Qswkrur2SyRP4abXetNhnun0A38h1cO55cYamvfUBiUdwDmBUKaDUo8-Nh0IN1zTAQVY07V0wyr_d_wpXDjlanmphgle_tbhQRxhoNmlotoaKVDEXmnmLtcpJ5FQ-azROIwYTZT-Bozxk7mrsAJ6yR4q-JHkcS6G1JmO35kOoTbilDOS5lcuxgWqNUN8fgM6sAX9EbpZLtUhF8pPCj8XB7FE9gDdDPIokYWSivLzVx5YCOa_Av5-Zq2WdJ_vjE2WV9ouZSqTkd-SnZz1isum7JKYwTzowgXWBp-zFkF-4hfW5of4aj6_tcNVv1QlzJaGYP5vpnoZ9OQecNFfNunsQUY06mhZZ1nut_YEkN0u8f4OnVosq1fyGmF5UMCrAgSA4kzzN0FxU8cNQQpOkUsMRpX-rOnpegj_2m9nPiaqlPcYjDPoBiUyJZwmxx6X0O4uU53FiY76c6aLTSws_caXHP7mk9z5vcD6_pJAhMid9ywxTz39dFWtzOetO37X6rqIToaHr0Nhveloc4f14Vuxi0SQpW45AcJPxtD4NhimBhdxpIF7FJLVPFEzbLcjpz-4XOO8M3ZnIPuEiH_JgHUPT0Jb41t7RbJzOwldTrfqEbJqX-1XVL17tNH7qQ5IEH1aB8boExa8vd9Wv6gkzWbXMmCDSf_9JYX60YF88vALPKIJkckf_HiGH28-Yu3cG0JAX_4Empyne6g8NuW49cw-fdggrwLqGFPX-1jBLQdetjR-DR90rHvlzeYR5uh-_PrPn3kYztRr6P_5vVJWB9Bj6aoW7XS9NvCbE6soc82rVgWByi9wVacWVdVYOjZ3CNEj9A6EzkNaSVI-UrvPeX3oWKATSFY3t14x6MbjBcb_mtDbnhNs6UnMZjTdWG3I8k7McdBSQrErRVKYbALMHZoBkluxM7lSAmy02WrZvCgTrM7sxmBFB6d4Ar3sB1pGTNR_wLhV0KeTBOmZ-6DciAZdD68LrDHRN1yEgeqcfFSvvFkcOG1OvXQV2e9D4UkAOQCUwkK4XlS6FvY_u9MshZgwuxNTGc7TK4zRTGdkGXrq9L6hH72iXSvj_yJgG2ds2sKp02Jiznh4HWV9_BEeT7p6fMfuKcuGznvpWR6FnXOtYGKrwa2cCtAHG5xYGRxen8TMa8CWevCmSPqFqFEeGHuI2SFO4-U2uTHU0A2aPBoFhvGSFhR_7PMteLZLJXcXb-Zro6pLZmqZr3a1MPP9yQK-_vWQIh-BDwdLwB8wYa39NK32Fz1woz5DOauifSPzydwdYb3hFxSZzrc9tyP62Z4oaJ2ABVuRVziiXGfbT593h0UuYB9UvKc_ImHbMBRdZBFtZRDhkPZ00SMMVxho_ZYPL_SRDrNcNSjX1hvpQlc2s5qWDJhWVit-S2A3YyEySvga21Vwfy6zeZpIWW_YzZpPvItOZYrx4Sqw8VqjvQzH4nO8wC2rt8aVNChlyOT2TPIQ6UK8sx1bqtrjHIblFZN26Zx2hZ0oOg-Uw6CXSkhFOPoNASLqYGA0Bopz7mqHLOjpzJTCfST58a5j_tkXLAA33eRkiIANOoFqqcDX1sTBg1k1y4a1Wwixud5mANL7UjgaoQ0Oz_sCeLpNA1eq-PEeIZvia42aFPPL4aDR7ZTX_cgW1VNEFjOfoyoyED8lfolVWuYzhRsTi5oGkMV2PkDJZ2kJFnAn_w4EXAgac1dsLYltvz8o7V_-CkHsoUmLX-jTEHOQjW2-TWWX8VawYX6L-BzNzD2b218FFH0-GkGcw41Yu7vxDa31NmrN-R94i-dH6GmXWk8Gbgolh-dWslSAq6ZZWnd7g_5FX3-4KSHCvlxzkV9_NqKX6q57ScNwBN6VaLmC3UFmOVqGpzpyWIjl5HNag7fk1jo77qWjJ2szfr1irI3pePDd3jE-sDhmNnD8k5TgMF67O0-ni80LRZb6yCsRy-7D1PEgZ3cLgLSy8uj_fmAOpsPxmrFU8puuOqfheq9LZBX3zy5o4ngPT8maVX8PqMHMikMkltKvJAMNbw6racZmQcAsWgI7wd7dX0glli6Qyn06gLcb0V0neeCM9m6hSvfoyXdrNFDsXJrXWw2L4WZHHqX4fnBL-Wbg3A7APoSY4XV_T6OPgb0_D9o2nOR9QSWI03Ent9Iatwcyx3BSVr-I5PYWj-Gqd2KbSUcA7rJAgBRyNKSMykM5p1zPGh9jagR2uqEhiKYn9lezYQGVR3OcWD1mtXeLHO3er9A4Ic_HO2cKIkBwusSDEzrZNSiPtO3axeDy5t7dausvjTtegbUQVVk7lFZ8qrVWYHX0Pxxh49Qn3084Klfb29-freVgr3zYyCeisEOkJpHzgYWd6yzmgXhfHsNsc8TNPtEab0I9P38LYDKfdZvC-JcXQJSJ_EQ-yMdNDO4LdQGILSYsrOWQMk46qCWA_GaNzVQfKNIEqIoqCt-CoeUkFhd_Uw3U_Ibp6FJr8chbjbr-kHby9UPGZhxmWjEpWa9Y8DpvjXExN50aLWWn0EtZhk6-DkS6_6Xs9xFAEpXesgMk4avIRjmeVo6BO04JUFH4rOye3ZNX19Y_IIUQ78LSXZ8wAkweCarlTwZbu_Nt0ndjydPImfHW4A2_JmGQRKWVbFYEaQFKmGvD_wcgjsU15AlgChy4cdcBZPqbAgBp-P64XJyDkAx55kp5uiLMBclb90kRENeHflD0Dht4g-wUccsArfkC8-zm0a7WDRj0yLGyeTVCDfUrQjsXtnrX9cfzUNU-SDrYRKqaJU77GEJxKBwUq-TQKQoGtB2jzZt8dqyMkM-hhSLg2IdekdlDKjd5GOqMHQ9UT_SRNIJjz2n5jqLVH25CgooIym3isQokyBaNIhjX1jSMQT5yGJpmWK8WjAnhswwcRmV87XvnYwdDN1LaJwVQ1Rs6SEfZxuGO183r8GtokzauRMpU4q2Pbarw3YJ6ha-So_ZWrwjax-_2CjcRYo47-1bQeLc5ru0HOSNFltNpYz96g9q5ut8scSsZ_QK7yx6AlPf0S-SXH_5cVO1jVEzEjiw8cT56oD6wl04CUA-wroGRJXQEez5yhAlcwNloqK9DtDeG7o-dV4yrjlb_FchVTSEuDcKcp9A5h6Z2cLV04Tr4dFI4fzdLdCE2GyANLA8P9Sc_O5Jy0bVayV72dVNuCngFJr3c11dbAIdItNWeDgauJvwJCaeM_MSUYcVgW5JObSmNZeXz6sU1U4bEycKzfz6Xt079V6VnhnYqJTLyfCj0-WiVF1sdkHQbI4Ua9PtPd1_0L8th8mSdsaair4bDisKCxcYFEBxug4guIaDwNsML-2Kmq30LX_ZDWLdT1cIwTm4k-dzReibzXAssIoxMiluIDy2xEmT9LaP96lwBh_-S07F9bsyQDrh0UR9V8RG29y31GYxo2cQYuQiJ2bR7U3BjHvzT4no7qhZVB647kJAbByp0oaAFmqwjHhrpDwQ0PlD25n7w1dFdnf_0Jx-vXpGgZkiYT3wAEdeMQTIrpMIADUBBVGsumziRZvxYBS8ZW-XoYdK1zg3wV1xXD4wh4jtTfudHevVGc7hwry8KF4tFg42uv6r2rc3G1rNYowlKY8UCf66w6Q7oiTySz5oB50cpp_udEP8R5r5hkkjEQG-fAKVIaojVxrMIzGdTp2L5fOftmbBbX1E0DiDfhRL72Dah8CM1D_F9iXCRn-8YybqZEGmt07hiIQ4AItDkX2ug3951oU2aqHng3tN0bM45NHgh4eREg9WMj9urGKGI_AuS5A4LmMUd6Ra0ijOmGIhZA7cMPutVTdnqI0RF0JvKFOqZ5wdXvKbRJE4HCcP8BXh91EICXce4BzExiIABN2a5pwkmlw35JLQqBFuurCVI_nDlI1LrcQEB8dP3MbtbIPRBSY2LNa6DE9ivZ9I7Cqxy4OB8g1Xxq5oZaUrqf009YcwocwfxjtJVtJJxGFsNs1TMZ7ToGJBgA9G2OLM--kUbuvzmcJoQFMHZlMzibM5d2aKKIS75kIKfsDZn_p659jel4Z_ei4ZGC4KaiUz_M3P7zDdaAHS-Y3THgPD4BOdxBQPeDSKdsmPVtj0Au0PC91z2tRpjZM0LYqgUtNMl1xVdRsgmmDdODeDJzT4GykJHc2BJ3JtIHW_geyAZJi5swnJP4VE71xd8k0ZVWu2jCHARvsgO_GLUa7QyqsC8__XX8tOAgOHOm0BLD5rSdhpEcMJ9gUQWFS3Fh18SbRCuJc9K1Oj-NX7XD-NiPM0s7ghIrDcRzimMRllaw4jbD5bPQ6l7X6CotsAZaaiZeVyv4LXihlqBSHnCfvDsHCfc-8jLCjbGXnOEgPQ99Z8N2kLooTypEeTCM0oLdympuujKuH5embY73WUntn8OABvd6VYRTFUI4Qdj7bPYo8X9sNCjo8rTDl7CoPkg5c6KvoJmIOuYgs1UX5nFj9D7JGShccOhlSVkB4Fr1z3iXdCNsDqwzoVZambwqTw5NDR_c-_--kVoe7FtwNL5Lg7bZoK6geA7WzrtFxdGChc3oiEmqizq6OSwxrPatpd7a8i4gO6dmvQyGyYxINuYDw6Mk_UJUu9rbplQ4nwlRfCPENY2Vy4xL5_9rY1UqhjTDBK1dyW0hYP08J9g6wF_mP0jz1PpW1Yxdl9cgB44QKlFx5szNUaiO2Suv59q25RDUM4vzZ6Gb1pPeshYxPr6lYLOxuMTkmeDnMDmEy5VqrHpRGYx_RchZ2NXJL7fcXNx3Holj3ORURU8FKEg5E_Ce7luuQSasUusDWHIaJhfUhFj53iG4vXPaLpUtdwTjjuUeWCnoqYR2Se_OMMfCDcu_7usjXVegBbqBCkJ6XQusxxiWmw6s5WUMxtc31bmRQbpHP2W1FUvYqUooyeICirkXeabAQcIdObOnUF0lIFw7G8yq1Q1dRo_fzXR6VxQfHjW5gvKiU7MRgyBgKunl03TQliJB7rGbeBRBJPu8sy6-FxbRy19kp0BNbUkm9ub717jOl2hQiPLEHBoFFxg9WcpUq0oNDXf-dhN4ANfXJV8kgRaf5rMHKqKCP2s05GLTwgOBQ95BcW6ON-2w70HyUxhML0jPrjItCrdN_we8MdwlBcCqFtE95_TkmacZ0RhLEdm7MAD8fIlarwlAXoeXRwg14X5zLiyEyBTFHK-YNCh6be_1_uim3EGHTqAvN9cZfPcY5qnJtbiDNfOuflqo131jQsl-PE6u2H8HrIw3aSj1yvVEeDebqgIlvrSdSoVQiVN-X2ypowMTeLr6hGdjChGbWMHNts60UZeAK-lBBzLIjNkJoVLsBeXp0cjpwii-HkTcypjzvZJHIh5xe3dVhTqpVmqczV24HLDrAVJ86OR9Hwc0DW1Xd513T6svV8tOQUnj8NkzO61X0NJQUGSMSdLPwA5BxE0owndfywjooIZsVYqkcB1S1Ki9hhkQ4G2OcAT74g1bi4RgR8owAIIFm6uqEctQq8XPgecHIBUCYvcBjYyXW0Ih4lgiOpMt5J85raoTpJGuOD_37sEuxWzQpdY5yaBmjDMaZ2-klj2wNlrGMbyxDgPQ-6Nu07sDvwlKb-sVWJKpUf8_z7Mjmw4mAZ6RCmz75ZCHUWUq9S8hcDRHghNsy5ZabxodGScCJEK9xN9ypbFmU14ZRaAzkq7wjXLBO8I9lag4WrmMxbG_9j4SIBAnQogNmvQY9RSLYo9UT2cckTM4CokxYL8WLG7XiwuOv3E-Z8vb8n6ABdyMNdlngzl8YYCt2mYVEZUJM1RfYHebaveHey5YzVADtY3J4YReps3L0cd_DLyqVVl7m7voCUMD7j_I0-_A08WVxor9s36iJ-3XNx_xQMGJsaEW8FQNBK7HXkchlhbnICSIOoNQwHerZ14ElP9aKxGLaDDazOkCdjPSCWxpAdfzHtJCjvidCYDeFiRYp78dr74x_jTZ3oACvBxWgELTonsebqpGnbL7vB6t94U5tt2OP_bUXuAtFN0zg3cEfIFtRJKoDMyHZcEeS-gbIHI2l6Ki9H8DXVpx8wnHF4Wtv_8yHnnYLDryanv8tmMsKzNXGumXiGqiYllr3FsSPeQB5d9fD1hC5pt0WZU39t7QIpNl2Zbx50tUqdc4b0hcEw5AikOD-ij8ANEiuJQmCDAxLc6RLO2WzZA_FMyoUM4mqVREjnQCW2mkKTz7ye1IbfL0w2rly5U7RRO-gRw2SiXB9FbN7vzRKu4AJPpr26qDsTS7DEta3ENUFk4V6ya3lvQ5txdhiQ3cB_uPqvy4vZ11DAmwPFF1W79AHo5iEC_XjqTjdA89HruO3eOyWIRwhmvhQZxj5WXHH0cWcmRU4pgX0XyvAiO41mRYwMfXcXo9NXjUAxOkaGv8DnEyz0wuTKN2_maDPu-OaS4UXr0qZbGDYl_r_AIkmpXtpOx633K5vMHE2fyabUuZEMGhjoQ3-hLjKhNgFr5UvM_bHeZ6PXO_2IqWj9MmhENwhX5x-FhWYXt_5oYXrmeApksiQqnQaHvr5QqBxW-5qPoTQ7BKz0g94vmhGbxK_vS6sCCx1S9km_1HN-GXCI2dLxNsOcBYGci2KNtG__MMczQn_sc9EYf5owSeHMOXU25uvjQYy7phnKykLAwmRo0czBqPFkZsTUVNU8umC1CP0qfTEOrhrCO1HlmfBmJnB7OeuMf9bW6SL5advOKzOjk_ORHaX7mE1aU34vAx_iAhGlvvGwYJQXW7Py16j48aNSAtoD58OYMPs79fTtWCIryoh0wAIEwC5YA1i0ufxCjqGM4r6VuNTLK_ArrROQdKD0io7svnWe7NBCRXUsHPlrt9Z-RWo1MxW4RYyZU0cPMP0_eP3tCfsaUROjIKLkkW_ZepFIYUYSNAz3k-ssS5SEpPXtnz6-USxqGQpw4sgG-fJ1m3JGlRVdbt05ZFvZGCAa4ooQ5S5OXaBMJhfv2i05z9qWULfp04AFg4EJwrreRF6cwQ4ZcphckKR_WeAOolckcC-hzLcYJVm8sUNDqADvG7HlOv4Hai63ERsGyc4ROJFdKee0xTpJySIWUP5pBG8Ig4Z71D7y3wSQqVhzRcL6SONAKorAyToOQq_aLAQFtn4s4N8fFj4F66Qw5nrkuC7X-wVjnbeAS1tjR7TAo7dGMiRPHL0_KibuMwlMSKhFzNrm5iryfC1QYS9NSTlBoSp_EL_PuBL01e6cwZRzVYJ7RaU4LbJf6CV4fe1bflXgVodK-EQ4tKiCp5eEYBJsVWvRBYA91bfRmmoNkz8CNimyMVWO94KNLCpNBBE_gkDgu6MKvBJchW8imAE5uX1zz1MjumpUDNVnT8QrQc31zRw28fcYA0to6jAeaSszheoNqtC28cqUbIC67jJqTU40qQureBaWJyZdpGtjo6_JHlW4jhmJptiP7Ztbyv6b55ZRc01Lfp_xiYhgkyeYa1mOXf64bZaZUmREp3y-AUebut2qJuxpuN1f87-bDj5iesHK4rI7y3CaUBxLb4Y6p5TKA9cXcFZ3bXMD9d5cAF_hSgci_eR0Us-YzEpCBnRXYxqKsActgAD1y2tASDqzXRL_gO59q_ltGzGfwT4HjQScKB9aTm9sWV_FAz03o0kylsi5FFox47LDi5U3GizORSP4f-TkTPOuyrWZOiUxVn1kAl2c8QXv8VS7etNX5PBoTS31J2oviJfvv04eUY4n8jMDY-qJzGInBtFZjGg7AmUNu4MhWJH8IXJDkqwQHsWZvdifJkU0OkS1uXPEGinvN38cOmkhlKppXk9poeKjoAO0Q02qYQFpru5UabpbhbyTFYtO7fWezkgJb7WYfOVQUyfA9iRUOs03IBAcf-kWUVfmlSHzMWgVV1EIbSSeE6BYW-pYoyDzlETQYovML0dgtWGB-OtbxQFH5tnE4LBs5nVwHOPrrWZVObrTIE_EVoj2v0LeOs7PVHrK8mGclvkhsmzf4Ga540QAaylJTSrkOhT8y9fjT3dMT6AuiRdGi98-TVIh1BjDIvX4uD5Nh_irV0221d0ArEeHotKBXuqe0-Gfyi0tqPwnnPuHmgg3OTFZh_b8_mV5sdq7qciQtAzSbG5OuvfSL15a1K0PYMclAPSKVJJ-omrI0lxcwjhbF3lDXSpC6Vp68mjfxzVf7c2JQMjKE7FrSMWoVNIc1wgnO0q3XlL4TV6R_ud7pTo-oLlNnBYVD-wFSz1jR6xh2rrcMTpQnktB0NjyCRXIGk-Ci67MbFLNBQlRwF6wfL6nc8WuNombHW-N6EXP11O_liQOuHMFSG-WuKLesZ2sIX5XTbS3QJ5rwzI_v5z8_IxQjiSAb8CG_NXci--eBb28ZsUGuU-vvgI9CgUqSnvYWtDBtFXtqKEOUO0EuCQmqAgUMYpm9GLqAUXhNdVwpKiZLPPYptCnyoBvjAx0_tgjTDMNlcJXU5vRrQOI2I72XR-n_4Ll1jVJzLxEL1CxRLfaieUrIiNZV1WYQWELhBYtmYinDwuwkgQP5tJp7O_9KJn-wizjwIdPlQT-_DO3iIVxHibJ0jIohJYK_QSFvcLfM71_Fa9wcVuV4Vqck1btZtQ1gIUgSm_rzS5BtLh1jQ8khsgC0nBXFzbpWYoV-MXajuFMJiDbCCbwTfgF-RpBA0uCq6rMFd3yp-lMSu6poBtEehUTAnb0bQ8xJOa3pToJRhsxVHgGnEYSqZkc5Tz2oYcEn8TIYnbaojY4-l-thiUjEIFRsXs7t38sl40ROBIHzZ3SPk4r_57GICN7v5W_Tv-_oB9lkfGco9yGEWuyWqyTR3M25rE15NA5-pCq3yX3uKW5wFGMvBfoO-FmrJW32jY9s02sHq-DId-dxAblLEuEHN2l42JempqjDfv6WJMCEPqiDPB_dfdcrZt4XkADPh_kelmwoQBuxDd3LOxvBIcMjcUXpWeQe-p6i6gMwf5PRyc1g3enYOy1W3EbAbyXug55NWMkbiUXxuemUi6QFIm27zFk2YbdC91rqcFi9lB9pfZR8EG0_-_huNkVzyCQvu4h39dRVzOm9vYj48YrLcC7ZerWVzRFbiAo1XMB0CkXJPZ3qVS3zMR9jFNHgV3PN69pB61MtOhg4UaXxANWTczTOUWjqBH1CVxtSBfPldKLtFq2uEN8YILh4CD-4VtfrUwWkzr55uPbhGbCiqIeYG9rApe5jeIF09-VSCIrKiw6HMpTe5IKIedknNALqvGAxfKn2jJetFYJdlxR8BwgADMsggGQpYMXl5QSSu17_C019KIBOlRzEtxfOeV8ZbHu42uz-BalXcGz3MNkN-JRr93EUs3NToZO_I0v5LexbElN7fesHgMOf-JaTiUzivSlXFiWti4RDmBFU1VmAR7FHoCzUdguyjdibu2Tc1tfCJlA3R0kn-nooVad7sNEifXJOtpKR3HlC1tys6w3_v-QkAYBRndZHhxrKAfGhpTeVyZB0wY2N02hlM1aBE-5U0KajuLxZBNuEhBxD8eMz4-r9Suip7p_tJ7DdJbSoVIcmIn8c80OZZZatCGqdFJkuxAIC76KdMphaqQ7FlrB9jEvA6LAomH4lweTwxYtnpHaOqVZ8TMfE-7AWTXMLt6Tpf6Wc7fVAdOC1FnJ24U_YvDEU4j-lehKOBmHwneVz53SFQHEmGgmXQ1MfL_14H_cwqaTdEk0JKEKtIluQOUjViCHPhNEfIjWuQKxGdE3dHix6jMBhgtFWra_R_K9par9w1Z7gLX3pZPqFaEDPPPa60l6XREO1X4Rz4bN9T2j_mhd40SoQV2cvyO7T100gCc6V1FTOD4BFok-HMGNkq-gzpa9HORSvNDqPEfrexs3gT2OEpWm0fiEL3V6xgnsCv6Y2LrYFdc3WaYhasbAtjut_PgkpaKDwSs5MISaB-bD0_nUcuU76LdNSbHe26k1zs4FW9jNZRvuJ3Kj3FNF0bpncRrwv-g4x57wlNZupyEZY6O9QqBiQ2YW6sMFETDn3U1YwusnYWPgOHHGAjpXIv87gv6LLG2TE-ncLBPVyTsBY7raOEGE3M_DjFIIR6_U0XriDiXhO8fKDpLksZNuKBWwxAmHRIc6YiCfS6fGKtXJIPT-d2WvM0VDWSxeKubqMTEKnt7N0VIMxPo6e3YMj-P6zZSX2wisUudgACM2xdV4KWwY-fsPROR1Q4otpNxcGGapIkfR89yWXxje9e4kyGuhrps4AiZwdCqw9xSymfcI-jg9G2OkS8wppVgREgL8Q8-BLCkrNUzknCBFkUvPnSAUaf771wxckNWniozftqye3PDy4KJqQvIK7MnPb7310N5DUvkL76fJyPq1Y06lzUJaU6cvShXnUA-nMQk10V_P_nD5vy9Q5Pke8pvKG8GX-mmc2HuqLb1N-JgJRmodgVUWkH_L9UOZg9uEF0t8stcntjT6_8DjCKXjGFlhwSBzkhLyyoXbnFfMXQx4c5UFMJ81sM0XWZ9E32aATQwV_TVe496r4iMDqT2N4jFecdvqaiaYzLI5FN0YO4VotIN4QBffUyGhAzTfCn_XOqrevvwsd12DLToxZBGRNWr6MV6lssxU8q0m5RY6Ff_amhNKwObqTZVeIx3jCvID5SbEgxQ8wElCVNoA9vbRkfzA1JPVCSkEO7x7OICCf43TyYM69JTwgz4-fk7dbNwGKNKamtsODBojYftoA8mwtfgxk8zxKT6k4Ipz_zcneZVKwRrBdlLzcS43SSbnkFfRafU8YhNwUic1Jw_9kNqYRBR_fWAFGW0WwCNES4pcACc0gaxsZuuzUFvAlk92D1aut0I_wJ2p1yXu3gAzaDb41D6ulBdsbWPqRzPFKBtcOnpgJkXsAxCPa7efry5GeYtczkU_UvvhB6AHCaGJKt69h4PbF-254le2S9W_WG7WJqftu3K7_U5t-PzUisMWK9XlsrRvjdJBcry9J5B9adO817djE1p4QFtUNM5SRsVwCVeL1YE91TY0RiniKGWRD9wHqRoY3Xf7G60rcpeZbA0j8_5RaD_GP1xNjTk5ZXIZ2k3ezy02VQZESvLry8WCtA63YO9VHNpRwIAXJ1Vo_V3yTyknNQNV5ejPqK40yKKLfK-PneZetLTPFaj75o2dPKjWYIWKHlUMt1jBwn79K6av3RjzIJXa7XZlToWww-gDyjLM0Dbtd33exuj_j4c0_EMYQomk6TtyMWN17R-wBMM1d5nPzcfBLBzIXvn8pTVlvQfWBt4ZAkjKhzUESDCgVWdswzkrW1XQYmULkMdQ0Ib5LzTEU6uxlHiIILpamD_gFT7QGg__IcdHPLbqdwex-OFIJCSNgPjRoeDD95GxuO_Rx2aPlNnqrVMmpZvlYJJXO6IUyFyTNEiVCbdm_8TDOkAflbJpn7fK-J2d6qG0ZYQCkld_Wf9vb8JCOH4J2vkX9VvKRwv1OvkEdZpI3uJklvRBwEC40t26IdeyXEYYf3Z7V6EP0dh59IqwN1f3_02tyA6KdCXkug3cxHEz0WveYm63fZu_ZvTurx42-W2TO9bQ6M3LszlqKXEhZt6Cdk-J2N9SvAveWPDsAkF97lJGZLQx6R_hO9Ez900_wgig6_pEyY6o5VvUuU_MPDglYAMg04jcZ1dh-Gu_FJNlYSZC_UVIBhZxBQe4-b_iLmEHiHr-UruTz6UfVu2leGMiCtvV4Rx15j_VR5w-DCYEwIUq07U-VTgC9w5qJcJIR70GYFxah_XDwNH9Upo4vFxGbS6mEnYTcz5j_DQ_twlukt5f7Iv-MzZQSmuC1S0nL141nlKWL537Q2MSjKgrkDVoj_5LaQdvPdWxs9ZWkYGTy7troxLB_2Xtvwp1HCoErTCl06wl6KH9pLEKq_mNP8Dim9dGV2AcTyNj4rNh3bsYtEQUDI5aoaGGFrtQMk4MdIQn8r-Pv6l8DhrrepvFohTqtL-uWAL30WVqb4bnDxa81bz6iPLBBiItcFdl9jy0VKpDZEXmkMMcf-dRVpIzFW4wYLmqi54-sfM5SFxkNAE7mXeBH6dcpRD6gfm3k4VyN_cin_ZuiIgDmczyPVzqHC3pEJ3ls5rn4V-VhnpASBLhK8zHQpCXHxOzTJjsqe8jwSY_l_eECnD9J8Lde3aKF3k3q5xmdUCDMBShFEnce0GAW7APY7rsR7RCwCTutpVE6Zwk-RUVQUNcokf0JaMRPn312HgQade4WXpjBZ0MePXvDvp_G2b5mM-JiMfJWrNPBE-z1Id2W1X96eRp7stqYyF6rI0ry9Gl28bn356rydwISRjvQCabvcIIuT-QxUBgANpMv0tIl89svDb-J2vz9PdlHdzpu-R5bg6jznLl23yaBU93i9rKyJqlGtuADfn1twE0TRjyf9H94K8_iJEKS9cShlJGdKnATDVWWnMWihxBbrJwEnaD27eKlEkuNqbMP8pYVPUE9L7UMu6MSrHkRVy14bGs-ul0a0ubZPPODQqfPHLJKipVnrf1WrhhA2_wMxSWeGjVfjnBiyYgw4V5Ye-3KXwAn8p6LFPeK44HPlZjN35KPXb4eZ7aXFTVqioCNwM0F28VcyOvo-DQzobKCXJ5Kiwce0wPQcZ3w1KGy7zjZUu_2hBjt3XspqDvHj269ex2J2lbMWefLIivrR1B1lp5CvzkDbpumAOaNadNycWT0ImPOcPWU2DLdBNvvgx9ZYl8W813BbnBPyJKCqMkAW8ftsBR5iC8cWx9gGj810ycTecZTBTvp3eu930u6xPFEPUnx1lA3lQ3g9tvZy8ewnUQeTWSm1p8YQzgYU0S-pvi3S8xZ9wvyrZf0koEV7rN7TchW8sU62luFJ4kUWSeqcRl3nmBKT7TagSkTBFvKL1nrWt8-lZzPru88XklsBO-ImqnP8xoj_sj3r2qKdZsaFLiUrMe0cu0mMC_QaaMDka98PD-j6ekBMA_Wy4FLwz7KhZa6Kt4518zfl3yuCavN8kipE1N0Q6i3eZ0aeCd5w9wO635MYCwr28l-T9LY_y2VsdXW6G1vFK6Uuv_k6PeDW2QlE_yX_Pz5sx8g1wTPoLmgLqtJOiHDTEEfKIBUlYA_R-Bje7w7IZnFi_4q_zGTRs_POQbzPgMX8Iy5ChKcqKl0jlCQEO7vvQN9KgoNqkBiGji3SBV7YI5w7tnJ9OyoQtv9mkAFkUoXeop7JNv8Na3-greZ3M6ssfVD5uwvC8o2UagW_jZn_ykF1f_UmxzUsDN5dBzOf4Yp1d8ih3Qu6N32N0IRYP-9bsj92wVRNjurFWodL9ff7La0Mz9WUdPcxe6sucdVHvjcXZ5SfFu3QgOG7K2QRmeJ16Hr-HRIAcEIAaCqG4Uf1xXELSUiddwzPqF_huMXCraDQ3MFQUTCxhwsI3-jMavYPv-26un-Iuoj3_kWnfrAyupiwuUvxBbb7TFp_dV768pbZnr0vZdVsBRZ_Pf7LRZJHJF4NhHlxsAVaP6tjONGhVmNXh9_9p95uD9ZK60CDEVFFwU75mKXCJKKhQSWxIPUayLIMgXFUtBsjUoHkZi0BMoA0BzRq7u-_MneJmZkmgGPlo4aMpa2QjfQgt3L7dzqYKjRHmPrF0WXuPmvgOOlUtT4gNVPmTgo0zcm4jTDyhvjD5YvHYacDu8VusaNeBTokXS0OZ6toKrXh-L2UyLG-sCJTDNFi_y_Sz9XpfTpJJef7WLibNLyJV5uzRgN7hoQA3DdI6ycrCsYtGRjo_T7v_1-NHz3cua9oMx0IUWwdzIWVKqB11A3kRJd9awdU2QLlpadO7P3WdbzRF1XE2Y0F8poD7f48II9vP0kWwrbVMX9at03DKliBsPG--et8k8UNFaaPW74nIkemlOlSLmCT9EdtUizEXpmM1Uf83EgJqV3fO0u0ubYIgv4Wqat6NLn5hVZMGsp9VO9XEZ_ud2g7bEZvCrvPOh2oOECqKu_1DctnJl7_eJ1cIO5thaiYMExKvAgMFzzaGk2zXPLcXz1jVT4NxbHzz_HET-X35gZdQu9WF3vR-89Dxid1z7l5bUJgtGTCXZRYmW5zzkPBEzMx5UO46WpsguGN2HNhmUE0y9WdcHLjhUZMLKLZB1BhDb65A-NIhDXCnRK6vGDs31fZUSR47CAr9gQ_F9OnOeCydz5bGP8GK0_cdqXQ15lpI3_5L4I8lzv6Mrst2oFt_cBXhU0gXAOpnnv00CuMyhTM3rm9n0I6jwWlSPC7TqNaG68XDfISS9dlTmtNXV6oVALFf7DQmxHYQY_0Uwz02OYJmFQXPEdsTdI1ZYOYdclP5phSNIpsdB9DrICKPN1ZTIitxyk59ExlQmOjMy07QE1BS4Hvvijaf9chKHC6uIkVrBL-GL5708IbKKyZckyT6a6Ay3uP-qH3i-m8BTHQ_9tIj1g4UmAlIvv7Pf93s4sJXyd2ZICmCLMie6TJnBc6c_gQWttSrcQ3wpWXW-V4qODvqHsv4yp-P80L7o92rRUXunSfqJyORICqTEAdkM_wYNkVJzxTBCA6xIrv9zhND4wg2skREuOSKNVRrlADPOTPc2rh2IzNmWdUBdZLdFYiAhhXvA_xC3tAs_-WVUSeP9YoUO2GWZ-bpvR7vY2pasX0LiPN_rAX8L_v8XAP-m5JtTFfcNvciHBldQ5LAk4in1_yySUjKY_J3EpfnumzCPcQDTmI1diDfVl6PEUIbqTNdUGqyqb_Ik7LcOiXLJ3kmYmQSUU8qI9rSqsrnwEiuk0HdCucezhxpZW0lR5vCitC_wFlgnC1RBonh4sOoNqrhznVduYAUR3S8si5WDKGOaXgi4DbcaOfu1CZmkcyqfawzm2Ld09GUpf6Dd-p4Az87YZqBIW8WQVZdHzZdSyM8mVedF96EHtRwij8lsSTdzdE45BGnzy9SfVpTmPGHYXpd13iQnNTJ2mJJg15Lp_fcpVSJaj6A0Qs8An-gRB4t--PJLz509Ri1Ixl8NyR9tCYf3QOurmEJaeM6-Mt3E_FlgnyvJjaNFEuY8I7LlUQfisptQsHeiKJFWLyr5ubOOmLgrk7TFgX8_EPqRwQnhB_rODq2CImi_gqt6XA1V05ZKUQ9ySHFLuEirzSpJjxd7P8nWQ1_xD_mhwC_h-PThXYloXdQn19vARgx2wQOLcYaSpSMnoJoI2eKVv9L8lsgzzlHikgAHEwDyqRABT4I8AtJ7w0TuDo2FB4yYaTRECdV1J_4dp-Fwo-8Chj8jgG_5nStXFUtVPVTUSDrUYThqznzKXU_qoydcsz-i2ub9nbQ8oOaDEEICmAf-XzC4-STskxQkIWl0yX8RKVN3tUsg1UXTKi1s4tz3K2nhnA4HhrFFu8poGYEABkldWaavWzILXlQby_qJlNomjjq0E-hfG4nCLRV_taoowcZ9UsoTqzEkSy--z03LOXYqTFEUNvbwDl32sB9iP32PY7w8Trdcmn0Z8RvIU0ZZosmNV6Yv7ZC--SMi7ctjAIExQ2lbBKDOkFchjj-rVbga411LfT19vJ4mmCdYm9F1J_tW8ycDwzuv4INaExA1q02Wsr2zaVqZB2c22ICLaJRMdj8cOExkvRg85QrXF_SQtcFBTtdOVpNpwHS0y_QxwVSvLyXz5Jykbs0XIlGTEGp-owzovhQBUL-S1Blc-9D9th2lGK9-Ip5Vtcn-Br5-ZRSoeQkQJWdoql2oho-cFiJwGySXmdWVpaQn1jFYMdvDhv9ibMZ1KLG_Z6rQZsbN2VH34Dvplfw197srDkFXCE3REEHVmK5z-5QQxCTX4dA1B0yO3VF4hk4mqx0zOcfn1sdE19cM8ZBJEj2uzyd3_l949xHo8DsCQwE51-cAFsYZbDXkdqUhz89kNo8GeEGovq1bkm291FyntMpcNny8lwdN9sg7xpKrFinyJdzldpahoaZP7ozbR5dPM78QB2C_vmK6WZuWe5KXWneskD37uMSDL4tsvW5pnr53OZYdpFhq81gRaIs6OfBBTsl6m7lcoe3Ps3AlDuKwrfcbaR-Y5zetXwx9dkg4zjc4kkPxRuRP2uwYlF27-60KXJJWz4wVGagXlialKW7zh5urXN8nE9HdaJ4Ap6O4vfUeWJMNi8DC3RMBhakoXf3sZgWxuK0pKw8KwJahVNNs3JS2_l0o9u9Dcfqbulw7dpxScHFBuR3CuOD6FrfKd3TvGVCedRIOYsM_nROk_ZtONoolKxpqyaze_vs41PB9QUGcMloEpnRoatXZ9JTJ6qnbpqH3NtaF5MAaRkN-cJjCWb5LOeqnc1rJCrTaeZ3AHqLqQyCcUAQV0eJmkFstelg-YGcMB8dxljPDbB07p4OBpPUebGKQVuwtfUmUWRT8vQJrmcM9OFQ7b8V2j41kWDFRXVlFTGgTR0tZue4xi33SkgsDvPbGswlHUomBE4jhpR3rfhmnEI3XEzt6XQjFrd1Xukuk2ZvABlvGpIFfPHTrMqRyCAIMgSYRFwprTsaXGzWTv4fWO36B4ZsoyUoMeDgz8DhgihqFxQU5tJX5FHMcREpMOTczVQm8jKqo9Cw22621-oS_79AQpV3ckTRxXE0ctakhWhqqXwHyjNqfsYyqxsYqeFNInnW1LyOQ603jnUsSYsSqwXJyNi_neY0YBqTftm_4I99sks-kTVjhklJjFzvll7Ji_BXVOdvlMAERZ8K8L2OxhVFdnGlooE1nyGtaykbZTu5hyu821x0xSrENjTmNAdyav8deXtK-mc4tGMQEyCYIqtSvHWsLajJ9t9HzGOZiKuVmoTsNO-m74Q9XQ-t_t6VVwelc6n6M_T-lQl8y63dfO21vKgtVLRZNciX_xw7pKY1XoIn0W5w6EX2UZd7Er6ffJfBCwJFOZLlw3YCsiEvmzCufXjUEquK-g696yJoJQcfeZ4NI1ldCPOsz5Nf1_t27wXucpO7DLh6aAWMvaH4qrJxTquvGSMireHBqjYlMO4yGsC8Qi-bh4QBu16SAtt1Opr9y0ghKv7FsBvmm7RMrmjHkvS2V-WT6t6jmqQGT6kXCUtKGJw4EI54SyEztqrfrFzLoeTlSt3BXl8GOlGzsMjb1Lh5Hi4wqkQc_ImplBJTnPcl5E5R1krPxS4qBQ1mvLD24z0LxC2r45t0xJJnMV3bx5U8CLyH1XUFh8B6jI65vSxlTuztWVEIS0Mbpr_tRGmRpzAWZ8Bg2azY0edpt_FKNPwj4NZn0_YljpKhOVLhOjkVkrsariJTKtnwDM6B3Jga44brkEZxq353sBCr3jUqRnBlQ1dsjCqxf7uj80LIX74YcScLqYoP7a7C2E8irFBCq_s4IWZ7252jGzErYjAfzfqP86Qe3zYA8fXgl1CjlZ5ZpJDvZwn5JcNkJAGWVivRU1mtH-hpnyzMUXv35sp0-gAKVh3tl6GaVWEoHABefFkAi71FQq1kBFAiQxHxYGildZfLELsh6cr9Bl8ZnPyngjF51snzSIheh7hjUMy5gjjg0l2VK2_teqDJ8P-Hg6GeShUrJUfrM1LCrG0WRyDNL_Wez6OBbG34b0mtWLoY6drEwDQsVBI7BgTswFbmbkfhOKtdmlYh5ecs36k8eZdzTskTB2hfY9fd7GLz02VXfulplYcQcPs95Dm5Qnfs_sfsWf4gcVRYiqdNpAy8auQ5-nGs-vUgYSdClghof59G8LPqCSLGQ9_flsCpFMA3_pXei6vS0tiTWP2Q3gH2ctq-Z_x24ZTwl44gVLJFfwoIR2HNtmMfSOOM5kT6jnEPaTO44ZuMfvu0n3N-DJxrzum6vTvZL8OqWpdDaviLFMdLNN-Tom3R4X5DICIHD-uz0hyrXB47PyX85OFVufo16C50gEJKoe12HBjZxmHEPxMbxDZpD63kzr5WHfzcr31szUV0lsHJR1Rt5k2168eCRBA-aclvt1OUnQ2Ap9TgVchWScEz0ZWrXT5UsPiFy__eG-87LbFCLjICsHvfri5uP-L-u2lg_xy7kgrDJvbnoKFE1HnCbMfY-wIkZkBbOHjotOKYrOjAW-kqI6-ZwLOaDAqns7nB-jIrs3nerCcpimcqRkVTL8DyyNZ2LysfG0xmUW_kHEEaNSxB3Y7ZCvXVbI6zKKt4pW8MbLRC5RbgoSf35oS3mesR8can2lMGq7cUNx-2UC1kfBkiFU6_6jFQDozWWBT5DRtF6hYSkzeAm61jhYcle5rnLgTx3Bc1IEr4w0UVxQrxS5GlNez5VtSDs4T2db3lpZ2rCGnWn22D7cPIWJ187uT35bVxRVhpswEVdBZvlixV3_FlqwnJbotSFPL1oEHoTKSA-BQQqaxZ3n-U-pen0zngTStt1KxWehiYrQU-THq4_BBQt4VasNSMhPVgbGNHQcvCHdsMxhAoGC_3TNfvlAR-4ylpDD8kURIJGLdd0SJGa9z3HdLj8x-hPl3-O6ykQOOu_smcXI9bngctzAzHAJu2U73rd4e2S7BNawuBULQJWNifnEO4CNZKMCATrqbqCsfbmloZCts6_z9oyvmekwjoYvZehqjKbFS7WUVGn-Z9a-X_w5YJbZjmRXex1O1gRaEQuYAdu-TmebniW0zPJ2rkYAjEJLCVpKe2w8QVLdGNDF0HnKm7bWQF5v_LxUPlnqyymprModakmcyAl6fdoId5S_bGSYntCB_DhkW5DMESqtUhZD4Me99Zd2Qdo2qfPC55_qSWJ5atxdRsyhUwB2_Xk30BpbEhQDarI5DmtgIVvtjkky-UXMIDKFAe6DTmQk-2tZYBHLvsZSwYCJaPganUUD8U7aeUFLJ9btxgQLZ9iOpFIN6cjfb2D8cvBvzNP5moUkaIM6LMBx36soWw_UGzayiCwhvcWPmNDWs83tA-lv4bsTL7gUt-boHIUJCywShiZsN2zH96_MxN8sGbp3NKxzsxtrag3444y4NR1r7jw5MX9sOljOAOL-2JGq6hWjVYb9z08mGnRv5vRs_0H5SXKpTF5a_1qAphbhWTL2g8iVIgnjVew7H7cnBE4tJeKHCcAwl8Wxskri-iSsvZVFeR036noj94BeFBX0GOjNogelwwwl2eTjgP2kAys30b-NsLjbr9FOIX78bniP3RXY_ENzdAwh87Yf1eRdyVQDByu8ViwcLXkQbWrjN20v-i7EzLmhGaGzj527Man8qZwd7CNTcV9XzUp9iXURQRbvImvkJ_lxkssLpHQP1D5U6-mUKKc5Y7IwBrbgX5cAAp-flYvINl3934OXaQ_aHAfZf9BHZESZKCf2ZHK_t8Pb79tAyT6K68BcY7lEIUln5iK5ZeOuxFPRwkTfmtqxyxlfQxYR2Mx7Y6Akuf9tP4DsWYPNdt8bgmJY8_3g9lfC4BnKqmvXX94OcGiImTRKsSyDWKiUxHsp-C0CzSjYwTMZm4EbrSZDFj2WHTn6tZm-w9HyLHBYEV-boM2QTOQNdDaydLCSkbFS253rL13iRSYfH8ZosqGullJvw_cqQF6-Ibc6xsH6IZiiRezFWQgR2ruCA1GYleAIXFq_riWtVWV7x11IR70xr4eUQpNzE6dhf1keMzTKEjuHGr-QhHv2r8FE_WgJWK7zgxgOzVCwnnjV2R0bxYH1uwBj_tv8f_BJiMRnKvFc4SFD9aBI7efcvEMmxM2hou8Abftk32MltYmzvYvcwF0fyJx838cLFmHJMCkn03p5rqgWmREbINxJ7HmFLmqnXs5rEIOW8w1cRtUtTEcX8fdtYGWBrHB3qesZoXK0b9cgYTqBo1RGL2DY9PtsB8NgxUkz9BvqNrQJw-03Oc-QyqNdDlHz-9b_du5CgCbLm9pnvP3tqHeJeIC0Z2hPN_6LGQlJmMNf-Rtv9rXPijQZRCOgqAXGkPVGsi-bNW3sLLAV9EvQGnl29CGiO-d9uURQ9hrq_e1EYDwEEPdWOikeAHTk2RvAOM8KGEk-iCKew3iAUeKsez8RuNymjW4fd9j6H3hFIaLtAFFLGwdUmDL_P3eAJKsK_UL4gjdwI75QpMChq-or2tw6I3IYIP7mqwgI3LoR9cHdP_pOJcIOAcGlTPNVK4H2cH-_04M99lPnrFbb-f5I-k6DgLJOzK971GvR_-S3QqDPVzPhqZMq-suW40n6lGUmcdiif_RQ4i3ouqFHpA4z_-ITnp_ekrwSCf30bIkb--nOJ7CJgVsRI4_ujZKRRqHeNgrTrmROx_XVN8KkUZsFU9R9-hI-UzkVV9auwduLM15G12sr29FWrOLPA6i8WIbMcbq0qLbG5uDXip5g6_hKhrLgnlySx12gEjDvYn0vpNY5uJsWGFVpePXKhR0UBAgP_3zH04bNqKtuO8HK99UYE0wVuGjvS3FSBgMqw90hZnclTTlIrZSiF668e1y86dcaPIM1PXEnplUCUqkYZ4JGXXU1WUlFOcu_5_LQkSlXdTvSwR3fSPGZMLEpAd8kd5KzwFbJslYLqi9u63tQfslBlrPM_fRQdo_IhE5HNSCLQ8RnK0xMSHoLjweZW4gQ9CuO4YD4L0kasUBsEoEIG2Eh1ADRoq6aNZH2ybZsP6slV8s6cMPT4TIE-_VV7gmPoig6zvJv5IOYJTh8NLTAt46vw8vq5PgQV9QlGdBrSZ1y4oQ5aLqN6uvNj_g-lKYSliDlJWqlR5Xf0rngkIu71lKU4dqaSj3ddxgP8WVOAtINaOlgZwUZN1t3lxzqDWjI3553OVsz2-59xd6021DDm2SRSxBz9kgzPM87Ltt64liZ0LgLFVfk4ChvxmCUCvYC_2A58D07gAixfZMiVQbs3oG6tuTs8c_CdjnoV1x9nScBKcQ5O5A_SKhs5jRs4xc0QSx3LumnCqhL94wIvQ42feSYBdS___gDwBEFQiprt5Kxvd3Ce-pKPhNQ7x0br5ORBnDf6hifY9fUvFGQLtil1W4tFkS2N8LlnzJp6mU3WKdif8YZ5uRzJEMIRMRUXEvAVFHLq4PWOq54jgMg4xPbAcLM2mlToIkTp2c9xXw9w0E5e8dsayQdG97dM58LBJ3AiYsd9IFH03FvYGlRDn9KjWS8Xsau_FQIhbSSy68fmKoiH0tx7oQLzsXq2Kd0fXg3w7wyu3UjwXc5ootkSw06DgvUqOJezvNCZRGfKrqQB7O70Gl6XPs3IJR8KyJIdUhFNHbM10YmTcvNFGIUvpmMpHN45QhLOceXVD2rx6mBb__eb1HspPLmiUl7Bj-HeAV0GA2T4Kn8kapNMwDVKMUxRl36jwA3QDpt3RYmWAyOfQzTRN1yv-9b_iJZBwaPFMFVR1mKwZCx9KjiRSuf7uIojGwUsPWhRZQAjU3pj0EmFxs-MzLLO-F2mjxvfM7o0LCibtoS2IvVROVdsA5vQd5XS9S7YTav8xQMLUovHskLE8FjBcE_Qk8ifZRekhundNuAPGCSDgY2dwnRPr5-hTePcWn3eOnSh0awNDAXVTM85fTwbmCHsGtCbmm48K5pMMYh5kRMwayw3IfcbWmDHKN5U9_wPlKzHB0WPozj9K4-C_EtKADMCMk2zoLWS3ppleD5Fm9-78F3478L0C7lFWHjE9PZx3s3rL_bTlmUL_ukfj2pWCYQsT_2XJQJ1Y2j_ozlYtQw5Dqu6mg6Ry0sNj5zFqm9EDum_OT40RWMNutqGnPpjGCidzfnBigTqYRR8gtxQ9ehq5FqRTlaFPxSWR11gYhuEhxLD_5I_Cv2dDfmgT8mg9kUSyLuNKxoYdIoUrYpRs6XbP1WallyXlKAAC-vIku63IjLYDJm4C4trRjSiQAb2m0bv_7uvryGRcvtS-I4zlWc5TSVIcZ0mSsEKxmlMJugHRCgklXcK9P7nVFLkLiARQlDG_3MP2W64IcMm8RiikRLSSAGoaP_Ao4SuVYZz6dJd9nI3w5lPJo8kt4gEJizS1O3UzsNbf_h2fiZy-aF7jTRj1oo9x7XMn_2Bx5jlA07FN8dAxAlwE-TB0vflujJvmLLL-UcMZcnN_20mVtd2scAGPEIGDghEosUi51NLVnzqnvMBWnGsr3Fl1mCI8vvlsOYBRH4BV5vu4WIRnmBVVL9yTir8Oi13gcACLtbOVlSNWde0wLNhJSMd_l640MmceAqaXdG6Ufht-NpNagoYMCsEQb5FQvjzLWmMK2oyR-HSQQHmzthvs_Co5u2WyHwWZYe9pSuZrv4SHT0M_ZaXDz1Fhtg41Cvqb5Vssem_SBJJJnZWmTi2bRCg0hdO_g1Be-qSOjVc2gDzCpo8LXkLNfV5k-xxDrvifCtxwHtD80D1xycQXJ1p5FLobieX2HeppYSKFpXsYS0g7ir5Rn90y8eF_mLQ0yhsgsHCFqAu_YW_4MZeprmhkRPPfsN5A7LLEFhoNmn4yUPRtZladYD5n5upfKNHpd2InQpbzGXWcvDnVOyjY69WxpoGAaZgcvVoFRSSRiRY08OewkiTKImnm5qskwgcZpsctUjL8SyUcda4oz1hggtTpIu6Tnos-zwV0gcs1XSX9xR_Wohxyy5GGnH7CwzK44a_bSJkfkhd0VGn23d5H1-QwTpAO_RHlACdblbcp1_P7fkFt5E0bjEPaOJI16fPidiwmiQmz00nSsLR9VkNnmG0nskCXuayj-oN3u05UNNGdVenHHDyIQSrgJcw6gxzRA-RKy77y11f1m-l5WcaBDpvb-Da0WprAF3rBvWB87IIH4gVFUSsMsqLUP1KLGdVHvsjlrqXUYeUtCJOYfeN2iMnX0PX9YdmDgkb2uceHv2e9KBmGbYcBa6ABmTxw5px0LL3cSXlpa4LzmsNY4j460fzuGfRZTNNV5iA5sB11kNxzgl5BkAof-I4FhE2yhI7YeEbCba1q-KJt5Fc9TsIkJPsf7wvWRDXzJ5rmMAttL5KWDOHl7dmYldaYdU00oQnlPo04mhJLX4slSIaeGBGOFttdnNR17FeujxGZX9osI2FHYMFm1mMZYm6DTyHYLYAHWLf1v86sI1x4owuiI3iphVq4I9dzIrDOOGmwAa9TP2gObrC3bSUo21hi02V7lIMmFGOLgI7C1lYdZii4cJv5w8obQoX2dSoB-CpGldu553oJxotehVx4NbBseoHGcHoPnn0KxMS7UOaLWjG3mfQzgZpSmPl4Wv5r6ldijI_8U905w9Nj9itp8SjK2CYFoI-aVeQ-h0wtkYA5ESa-Qg4GLJVnIjbmgTDLQGmfPhfxCMHb_XwAhqqUeRoyUbBPBctgJjJIXbwTWgvsAK_Wa6qEvXUxhI1ib4pTCT4itVhMCDPq1e3Bk5zk5B3VA1DLA3JjlMmpaUqENfeZC1XTb2ILPIGyEYRV6JGii4cJvQLSBeZXXUJd3OuFXf-if-o3RS-rN2ggV7Lm0sYTnceWEcNvJn3Lo_w91oalxblM_iglQkGNa9Ihr74LK7YnUov_2XyH301nmQ-t9ekWePZRnO4bNkxjGOmlx4pcPQ6EMBhh-43acPbO7_MIIomg08SmErif3bglCtCzZEwZI17kEV1dq36FljIX6SEhNNMRbmnT0x2tCYthTlLiUqiwdlVr5xcHIusHM7KMswzzjKLZJUAB6K4oFBEzX_ywWXD7yz-zjFyajqBZs5Muew9lGRU98m49Gmo2Ow0zLFdVFSyzTh38qQW_E9ulycfbKj-89aEG0ao0Wgx8HEDS4MppofS9z8O1GzmI4Md_WjOF4sEX5Vy0uafZilpp8fvYb0WUczcL_Zwb0AOWQbntywLxA0Rtjvj58-pTfDsBq-7C36BtA9evmw3taKS8cHST23FW51VQbLldPAEEJt5Oy5m0q3jxBhXa_C8Q8iEIl6QA9g-OiQ4gSJcIkcraNDbdm90jCcR2SXhRkh7geNJA0DGSEFmFmLJcSz4YL_1vUV7r8CrGFFxVh595qviUR52ZtZiWL7pHWRGnnB0lZ8suUwvgw5mazue1127sspnUsLhjm4z0LJsspa4O0m3Z3k5tC2tvVdNZZExA9XVzSm_57uYU75nVUQgwBeMlqunzBeU_qdMoUUqFRWIfxAw7HUSB2RSAcjlwXmDSrT2ploxrywQ0HeNts3T-hWMzhH-UWm1yxRz22RRNy39uXaWb1GJQLgh-10Nvq6u4XJ_ErYuX_0H95H1GyCjXX42igImBttK81hfabzD2x7R4aMI_dpomQnYMOqWsBKGVpsDhEPtjLLFcFHL7vn1jLbBg-GLaJBSj67GrYjKgY5UTH3M5_Oq-F54gHg8ylqB0-DfugacbeEEXbQxrB7abPV6w_85P8E45UDkbPcyjyRe4ABM3Lr3Y0UPzGjBvIhW9xqSKcxlybksF5QvlEBwSTzoC4qsqW79dgWHAfq7CzQnIbT5M1ynI-dqabAHm2JQeAzBXHNT9hUP3-HP1KC-3GYym4uP1t5X8QvhbEjckBXWBEet8MBsc-LI3eOK1o4pD1N8PLyDBSMYfMosO_roXGIe5pLVbMPqDmkXcfO1evHfmycV1n0mZ0AoLgSzw9l9hCdxlK__Nq4yDj83oORGyUTf6CdZHHRet_EM6hcGO85JxguvmP_x6lPxwBVCMRdoAMPlgKz0F6y1zZ05CmPLCT4vVH3hU9FN2IzDlZ_d9GfFlvot1BBVjCOqNMr_4QCeb22BpSiRkZwjomXSkCazWuzDneDHVc7d85KwHZNoRHIX-pIrGoL7hYZKXCtI7mUNBD-iLSOsCpntt3tEyiUooEoZRoWlZk0GIoyTmmsGDQlqx7zlwP-3C-JwKjxCCkG7O3ZsziNmPHTFjyYIM52whe0f8Hqn91REIs13YpFobjFYZzwE6Vbx1qQx2_UQTm5LjkLoPPPdS8pVsU8KpjO4PY7_lWtQBhMUCeWT8t8gdlkAY3dG23NykTnmZx3c5bBJu2nCHUqf0Z4xVOdkqmMlr04zbcVHq5-614QmoP8GsHKhEoLCUfczUEI11PC8AXwW5IFz5jQY9uQNmY01mgvms8bvcICsQIsaEIKlbrRYqXEiEEdfSW6OTRyEpCiebgnTvk1JUlZUv5W-kApnpZVPFEXWfa8ewvdbd07CEjNxfxriQgjPcUb1L1mFqO9Jbk6uWGj1ociEJyhZUIx5Wl00NT-ocOHj7HU_D916zHktEyUpU-Rneye_ZHP4ed9qzWvA9mqJ56txGHbUoz3MY7RDo33DMfKbUnOPu78PKgAcKulAgYc9jbHqIjptX3d_0eUGn6M12iB2kX0cS8qvaLUajcqV7ZagV7BFsxLPzAi5jgK8BqXz4ql1ma8xq_FquOo6J2X8ErqozAfjv2Lvcp-whlVNtseAyUdmiKL_vOGkvq7UrWSRSJW-TtfS8SVrucu679N8kI2O38wjxa-w0BwK-cz6_bgEaSzPp-TSlFVeXRLqxyqdwO127uGfxSgdb4Ly5jJvVw6FdYXsAXvxly2g9GVTBzj8qnsJ1BnmOnZ1LYeg8Ud0X7cVp4aSJDwZS2EjsOmVvrTfZWT6Mmh3PmVaAqKumphXSyx12N3PM9fz_rYAZKdIUM5Nx5o4JvG5VWosRDyEMVcDk8tXfVvx6Gae-ULS4Xd-ls-7asa4kIJ8kd2xA7xjTBEarrelZ91fuvFBGrO7kcOfAw-jHnu97is89X3Ye85F4kSWWlTEVDNcvhxsxpM2K91v2d7VQwdVuKpMiKKSmO7wecFd9eGyM0lPNAJ0_hOfbVL9myU6ShXSafpYWyxrStsm_0RhDODtg9OGS83z7_vMowpRXaYEkGa8CPvtDA21-wuz4xynFhtKopUJlaw8KSarFUTBCIGg5q4ZVeA7-H-fYRb4s2ri71ADFCmFLoZnPIBYW6bncjiULB5AOuKSGuUipZwBxs9n3xFfb5tVLMIgRLGZh-aoljluiJvNjP73c3EyxeHb4Dq2NWowfe5bBCnFkQnvcShhFCGq4So_tPYVCxc0g8wUHtwcFkzzFn6yBPjeTFN0fQE_xDuAmCaT9gdxbhQcUfVPUxhToMKG9QPCxMkz-9fG8mqQtRlLsO04-KEikOglHsOvEXTIhLOIFJzSjXgh659MQCNb21aYeectCMbr_KcYcnOkqw26q8bd7KCy71C-ZozeOKNUHDYj3KqhFBKaEUsE8qgGt55aTcQdgwAZndqABlPzA0e-7TZOdeYVjlxkIKt3x6tLCwkpJWTOg7JqegMFz8fyz3TLNn5btPshIaqXF7EK9RxmF_WfkfbXqkV9HuwE-lkNr_rzrzpycxm3wivbuZILsebMh7sZpJeIGY9YjnCs8EzmYve6Hjpk-55tak550Ba3_IZ64mwLTwAT6sEmDDGGk1Vly6BIsZVHPjxoj50zppvsYvTtVaHGfOp6-Zksu45hF7Y_v2_OCGNKKeuY_ipQ4aLW446uBAJWcd7bMU-O-ky4jtD4TDn-_wM-Zz7feWrKgYo3YbzGu2aWt-1nQqHnWXS8xyj-L16KrCTOLwMcJasp85SN1w4QF3Y7aEk2NzvOjy1RMKpKsjjqb9Oss1BFgoFAcBc8wWSEVm1AOaN5CbfQGFCWVnDo1o3ot-3g8qrqJ2bdFUsaNxXZdpnEMzC8EJawtBbQ8DD5ETok7rhkcB1cYSmw1dGMfDn5pDDRkQsXMTlR9Jhv397GDH7d_9wEjTfWzQtt_k3pKSLc2d5X0rFvu4-mogCI6W4ppwo9s2RFdWlfSLkAwIvF-lzjUQecsbose3Q2h8PQn7Su2PMQeaR_nttr7jxj3vOP--rTk_2LeN6QInSk42GkqBD5hWnR9SyIaCTCtgniESrvB6L7ckBLlGaChZIqZMDpuh2PFtiy6atI19CrWH_--ZB2ds94ALBU7IUn2KecrVCbbjjtQoAf-CJNAfTLUr41nxGF6HFOxKHD4vlzXdMEm8y_rIUea37-Xp447i5Tuy6hE4sMaz3xo39zi3cOz9G6_auXpFp_gmevwBm7HVE9F3MC2INdMl1F-5g7618t4fJYFwAZlmHBynMhLKEEbFAEVwnILsH7WwnzKRk_m5oREaAfWRrNniA_VPZ-9Lv17DknHHNpeInrWIULwtoXpIG-T4QdRgfvGSTVAYiDCZAxpv7v4i30JmCW8ZZ8nK_KsoUiEK3cxzTgczPiaQ1QajO1m8G7Gadj6FwrheIDmVxlP9aQi_kP-34lmqzBzebCD6I4nSaYliAPplVWUUyM_lyzCX26RVv1xxeyxcK66hosqKJU9f7jtDxvdlmMUhk10eUCKL_gLR5he0iRiOURQ31QYsSBDCVQUx5LXmI-hr1hzhqhBG7n4IRNYYfldEoE3ppJ_lnAbPa7fCYK0o1jx2Aa0Fe-8wGawRW-8QBKBDU_Ew3Ir-M8Ui-oubRCSGPbuPMX-gjc7tRvflJMo1llzE4kqavVvFB6nVv4W883AuZpcub5V43yDucriyBp_eboI9wtTOvJ6xouzSnWnYuba_Is5zEiwSpKN0B2KL6eK8Ywj_9ulmJKVieoEEo4jEYDzlNNBj2E7EWKl73Y3jLmGzaS9LSEO3vIcBHmnj1Ve9W1qDrOlMCDl3HZFk6DHzRrxcaPyz5vO3bJSGdpkoF86PnA447_au_ljBdR2NzaSjBUHVMrMjl9sEM__PCKJCBNzR1IO5P4xRLQn0GW1tJmT2MweryCDG-ONhV4MLKAosACv_HhxvSqXHN-911WjrZpka-hcC1Oj9a7TiAk2uXxz87_u7RlveVoqHn-5DOHuZqsOw4b5yFg31kVXrdCNW_rNKI_tMA1o1qw7e2L0kGS882JNT_rsDKinfIv3s_aQf5gbCsEKz1MJ0w1CO7ErG6syEIanpuUGiZqY-bqFsOp30JxcpbiSZamT87BF59Y9qQEn9lSdrlzJPv9RXK_Y31pK23uHfdByXkDAD-LQ9QpFE2ntujX5dBTdEeceup7zlzEPXeH9yE_2VN7-6t6mr4ImN6rf-iuJskmNvpVtCkJyRXwrSnj2pAmKegy_PVWtIj2o9CBkkzbCCTRcB01uZH3aJC2Y2jXyNj6x8CjGwgFP12xFuW-IeDZo313qA27MXaIluCUr-vQ6LoZxX9gYlYoxHx2j-5rDNYuBT2E465BRaCymqHBRNat71u5GMb0bQ7xjjsxFC-6i7SXmcd-yAZUsCfS_QzAF9mVyNrNBOjCZRuiC-g05jsfWxn--IMCy5oeB1RjEtMlDgaocizlosLNX4N1t1lJOq7b_NmVP9q4gFXOIjQ38vCgXShXFqb08JwM13XHLPR0vSX1ov3Gph7ng2jj_ywvpZkoYJSQAA5VtK0DZcLMLOo_yT2PqXKdkykrGYCEo8I5cv_0_jMyp9qawBXHh_Q8C3StqvgF199bDSqfxB2-WescMY1uB_1RPJeSVptbrCp85uCqCxFK1YoG57BxIEGy-ucwjm0O2up5zVzUVaz0YcFKrOIzayRQpalX5ua0w5QCU3p5mBoLQ-v3XH-eXVoFS2ARQvVRj4PlDxC7t7o7LPwmyoxHNZDZlmVWkhk_wg1XgD4lwdz89zpdMLT06K5nsPI3Oua1bz7DEhBSn-BvHcPlG-mucVDQb8hf97TdqoPLnzTzR79IubiQlh9srqreLTk0TaXoHSIEBIWPNhien_H5fhbykHdFBTEUvEsZR5PyZRQdRTXY2kgIqdgDnMVXhSGIC5lmbqINCmuSrFpLHSrZppUtHCL1oJfdKbg_R2QL93s8cqq0g5jTV0qRvOl0lo_V2bulDmKqd_cFe7RFb6zvF0PDA125FS9yyCA07DY7En6ghhlbi2i2ebGG61qv6IIwWtm_x-s6PGbi0-sHe0ki6cG7y9dxMmRHo1KQIWp9Yr-orpzV4fHmX7Vod0j0vY6JKY1tJITEgatJtOyItb5_hhcgtQbWWYO0A3y1WCY18UzAUk6fM6IMeeLKglJ4FIFiNm6pfnHSxarDPTDDzPc0i-giqNDDBgAYUB9qs-bf5qaG9BYBTMJ6A6Uv9lYcSaNGuxNWCKsSxpRpZ_TGQS7x2lu9vlVeprWsKxu1SQO_ukbFoowG62-pVC8CJmTi02Asc3xRWKeJo4vGAVftrvGZPummXqPpDAlG7IAkJV8LLyCl-0k03F8is6tF0ym8VykTCZ7tvo-AqIwe2qOG4fpCeIqC_Af-JBqKPBkLAvQu2CDCzGm8YhSQdx8aJmuklw_ugNH8M8UEjgHg10dxjXNg44z3DXbjdwo6KGa0Qtv0fs-wGX9zmKx4mdq3cs3ZcmQDvwSw6qu4159yRNaQ6oB6jvjbr5zSoAQBvjxnzC5ifu2-VjblshfsKqW68tiQybmVzaM4SQE3bBdXC34vZvVQGUrP1Ed3fYaSnR8NV7lGkfURgeJholccujO4JKzvt0q7qBZ9WhoDlK3TFONizgcuzTIzh0P3B-ZzBAhAyWoKIgBrUB8ldb0qF2ge-sY5o_Y0vD89E5AhPw-NNY8nJbA2U_jlCOjpdXKrkZpO85k55WePja_PpXaeChgVhV0LdZfxlHGG3jOfYRoTuezkCmF9jYWp5euEjm02zZk8l3rULHJWFWUscRrLC8uBhhvvfjTpxWMw7exiJrrjRSBvWGTyyFJ4LA1eU7MPGTyPNKfABhL2FgVAuXNVGCi4K4vcc5WUeNX2sij3j6pNZmlehfYDQ2LAu1JEovqtV_-cXS5GtIbhfqgprZqghxKKZAD1lNKF2705ODDjnHt7vKU9wjfRdv8NuFdtIpQm0h4007qhYR0-FOVUamfVLSGl7eL2ZjmF4jhrnHkLcOzt4l8NVevRY7XvzwCjHapIguePryFrb9gobl7JyKo_hXGw4kpeCHn6ro8_KW9DhQr9VIJFybqss_GGnVA6frvQ4QWstb7lOaQnGlhgUMFDBBpN--DZIGKg5IDPstDjzaNugr2NgK3dG6ZPlIPPqW4LwsUy11lZymZ8dsHvx28JPPgFXsf-t5aeMMv-xFRIpsbqRpEija5cq0FCQXs2syZt_AeqPNJtb_R9k4AiOAwtqom2vequ0-AC1kfTlBo6TSOnzfcn9jNiUCoOB2AFQRczBp4friJKV3i_uEG3qzJmDNM_5JTM5AtY0MJMDliiCgp7kRDETbw_6RHB4V4lxhxnFSJmVP1ek0GQmZ7h5AAz-vjPWIflTUXacm7faQ0LjL5jZ0Ri-UNTfWZN-e9HEcV28SyqiX1rTPGsXEDj-rCuBhH0OLzqRK-DEQbeClZD4vDInVnh4fjyVKHRUHi-URZqPD7rIOpe_4jFdUU_PmHYundEllaA_kvwk9xD0rwDPOk2eL-Qn3sg2-jamyQwiOwmXOWmzu0OBn6E2zgxRhyaiAlUvAqEkg1jjymBxYMIosgm1_30nNhsQgINRvddb7kD6XTYCE1ush0b4oY3MdSCiXIE8kXZ662yj39eF5oUhtSHpLBVOOOHrS3du8erB6p41pyrOSMvwbkuuK_Z15Nz3dD9N2A_K6ggh3HvF5ayNRFSkqyOKn4jDtQTiXm6fTOilMB9x91lbSv19nel6p5l4js4PNaaSCMfoLt4JoMvF9rOH5AAhkrbBOIEY0ugFddWW0kyH6kaxGVFpZRh0S6q1SgE4dDgkgQ5OdSNqyyO0LS3pAp9FgMu7c8Asx0xViQsI8WDEP7QI9FWd-ZVuBRvTgT6koSKlhuwGvGBZdAbiRPky6jzNtyv5pGIh18S0m3Wk0EE5cy1QRo1CgADVKy-8lkcQVrYt5w2TuBLEXgzczWe5qi7Rp2F3k_JNMNYACGHLPms0wzZczB5E4fCYtUXlwWEWKW73kIrj-dWemhDuVeQc8kB582Q0mEAa5qrHRDG9wMIWwDrrRzQKWfcp_EitGjTcYz1_d2mTqki_V1dLcZvR17rnF247_sZAmH3xnZ9vj_fn_opqTn_KDREUBzXLO5yPOnnE5uqDnHM7wLDqIf-yfQ7zxuB_eUrsbIYuIHBjAMstVWDhfdklGno_5bVwU8XjPwEE_ReU-SQ8kbdPpB2AKH1HySvh7YlZPemTZthFEfs3_uhuKCjVExUuLPCopQaL61WTbAJEspoOOs5QPLarF2t8hQjktHniYHK-wvTfDcRaCbUIbGixmPr4PMlZPi-ABYp967qfg2keG9n-argd4VtHLF2U1sifpYsxfKAJ2YQqQ77ADfhvThqpIh65VigGdJ0-lOKCeakShXKEmDbJg4cOGv9a5V1jiTJPbo_i-24X7kNs_N04k2b7ch5zYq4m15KCc14PIPwPFCBArIocCB7PPT5NMbRrfyxcd2f0SS9T1OCPlGT8Z3JNaHAhN6NNEqS19BVLRrLOFVrAUnE77yZ1OJGkrI5P4Ur3cde7lKZ-ncQ30H1dTyNVzWwVCNw_IQYQh7bccntrwnhNPYswBu4v7YxXSkOQDEYozTjaSQ6VEsdL92mwpAETvUhpU6w0SaZkAHOjEhYVJfBM1k2Fk0TCaR8aEo026L_u2MxCfh_DQDVwYKLWHKwNpM9Bf0QK67BRHpJpth4RE0bbWoP74dXRcf0EqMBmrnOlzDS4XoHYI6bKGNNHRA1pcmcCD1AJA7MTW3ZBBeJntkz-KhRvtFHe3sEPt3xjgzigi9GWa0YDSQdQsBkhca_mJxbQz-0IjJmkoOYvYLrMm-OE8cGN71KKjNXdhhhTWy3mQBDc7r2bkl4ZjtY9l8I6p1J-4c51LqllHHiWYb3RqvRZKmrmxWu_-vMe1B2MK1iv2OpiqbvpypZGzKQX7bYlvuQzo4urYjL1ZBRDegm0q80JW7b3MWxBsoSLi9A3PWEy0OEY2sDIyK57Nr2HTh07vp96MVPwuz6ZLRHiIhoJUe5OejCki4fSxa9cUwYTM52t5FBEnrdSF7UTgK4H3GxYYGilJCcouFvf3epxYIxIDvpJvBUJLxwBPtpMrdVYyBO_BoXnqRe_sszR090_mnw_7R_3qIXNAWD6md-zx2jX3NlVzjJrY505JR4xWeDsjD67gBpblLcvYeNaGC7dxMZfLeDuirSmDvm6cTs5qvdAziyZZrRgN1N9Ch8SFFxqWd7hw4VwOSly2YhSnYD7261EwyY0CHGwL0N3T_9ejYptI8mDTKVv3n6rlog0gWLN5sC1vTgZLKqlnGEZnqveQcZGK6m4uFck0lbfSf9cRCU0jy8k-jZx30n2vtnmh7XctgdhZgfCO94njg8ZfLvV5fIDHJfH4JDMKNnQQx2FfUEsd7mUquqbnODa2IORv5H7YNRc2Jw_lZmlv8-ok8y3_E3f5cNSyksiJTcUh3MPPu-x-yoV4yzeX9L9Wq21GxKKzROdzVfBprtFDw_KUTKgg-7jy-9VuSK_aK_ZNvpSU3n-Dd4UpNPJHM0VQaIwU0RcGkuy3_IqCqWBo3lcX0qjsh8k0AYAUY3jlKw8CCPkbkxyI23i7OUcessghDlAikxra0OXJAzWXosdc6s8TObunjJt1Lnm6SCNccDl2Ydh60sml7da6O1Bd1t_R4O_XTa0wG6qu1eOj8BrTrJ6XqddYA2nqV8t9dZVa71rmrbKDChhOTI6Z0EGZ09vZCjIm2bW-mGrbps0_liZB6iwbhUky09m00CyLOi1bT7GZLxlNWdPmIVb-Nz4a35hEJnsuvYFDq9DCa2v01QxFoRCvpp1zJ7RtwcvJ0sJx30byvXWBbP5vAyq4atv-Lhw8ycZHXINSIpNi1bJ2jrnov2VISCnn0ssKVQPz65MDJgovbSGb2IrpShnyPGBDGbjG8LDSiJ3QR-jnSIhJSZav-C9bXWa8Eqc5JIl9dmWmenTyGbU8Vyt2wMONDM_rIJDE5SVQNlL-aVXkfDncYmpg8Le0TzKAFwYWPKUi1kjd0TW67hM-W-urz-FtR-D8O18THZ1H-bc5-boQUXgufBpN9aNX2e1QKv7t3mZW88qPJeHxO8q6gpmIAHQphyjPUh8GLz48lCFi0j1ULX476wG4mnFdXLtxMCqYq_675gXCOksMj9UoTu-7zG0wu_-yYLacRliOtgyBfGG4zPrLKcQsj7EA7V_Gmvss6HDDEVnUlrLng-Dtgugf8tc3vfE1jbaRCqA6Ng1RSOXEWBbPQQZornJ0xRlVJg3s7FlImMnz9TibOoRsNjFB1j74fUFcYODHpv_xB_Ynn30EB2mbObiZsgxLLdqrGRXXZb28MdPuYlxCd3g6P0f1vkyDjcUC-4gpoB12tr3fieD0vylppduJXwBjLwN8maKWol4gyTZ3t7iP6GlAu-Q0kI1Fw0Ctr3_UqHZ-2B3qN5eCHfE4VQXxdrz8hW0y6DN8L3j-bX4MDGEcJi6lSd40VJqWV6HSeAOdy3KHpVkgZD6B053e-RsEnABdy8OzjVa5LK7TEQasL2WQE9RF9V6pBucf8BPqfJKMitM8fIjTbgiUf8gT8ISck4d5eY743YC5ZgygdHfLaLNWX11dp-fUdyb7aTrMerzvICHcVNoEcEYzdCy6pEXygKnuxlSXJA13Ar8VwDZkhRL2l3qnb2KI53qp-aduTd0seIdLIE0qcqe6KwTnhBcSLqV3lYxNCRC6j7nSVzgnLCm2vm7Cw07ZaAlqxETgXZQWJmmS6upxYeUYtVIQL6VD7eIdMq4TAxAPStiU2F2fMHuUjXrxj6zkXEe3HeiW0mmGc3SJzzbOlJHv6es7lA00EekpQNBRjo-lo0Nt58oGr3qWPS80XqgQhIGqrG8k_guLEWfvipc2PAyv-XyIKx7u6VOpaIryoeLZjiBE3Um2MCnXlvhz3n5zYgzpR8qiS3nEXxDXB4Ffbw2-idgUtgfRY8_EPySR5EJr-7UG1jcBDp-5Nzo723cOjZMjT9NJvVntmIsx3OlWJTZtaYFA9F1JE_mnDtfTzhdwSmfunP-_RlGlSw4I9bolyZCpYnHifAWX4rSAhHR026OQrkTXR6XVsfoM78EHPYEpakJvUOvflHiG5fU_J0am60bgPhInPaovby5mhfGyazupLxBFiBpXtoE2VHU7mQXD3p6LaxObxpPRkCLijTCeQXPUCdnXGuVynNo_j8zXnBadPAsUEUHygMu1lLXrKwvpzNEelEYWbkoMqTxNEroJ5Mcbz6zQ2cO9X8i_sbzBJpJXqjvQ3QNJf-A1r68GnEGqzxkBFttqeZvs1G9oXmCjqQspaVvo9MnndmR8QFcMhkQWeOt1aGYWsbo3yEx3Bb3XO26sfZd0fR5iyS_s9n3fbgEv5jNBzX0M6aKbtDG0QfG8rlzIzAelQQ3SWeuCWXZcOjQHEJJfjw5I-QtoDakHDgw4duSsYgFvpoAfpQNx8TUxMNr9MTKGVs2Ybms1nhgmTLtl6HrvAdnvrx5tAFHwphE_TJ3qY1C2xmwC4puWeF4hVaUlcbq1b8mFF_tgt-Jd992f9dbqYk66HmbDihIApodQluTXGWPuBzIiMgYO1OucsaawgjtsD5SXuWjZD22QbVvMWhFz-0pE_i0eo3GG6toZWByKl6opZoef9IvCQf_sj89-YZb5VFwlL_0gaykupmg0pe1xHpu8mEcn75FNTDj3_BXBNx4j_InPCwIolTXnAPyPzT0oyiHgJZCZXvDGFPwq1ceetFdDGUJSsvIGjaFphX-wysrbtCZ4Wf4EwYUcKYII5MwHIk7cCSlyxcUeWdS7Y8d-nU05us-6fNqTAqe9zCVGOET_8RR8TuPyTmBwwwywEwYXIFVKjLc9ozpPk_zUtMbMCIP82x0Pf6po6QSIM4jcoZvDIG-g7SSeYvmbMcmNjI7qYp6Xc0BcA2df6fZvxaqcR0QAnShtMmHTkOupLIXf5jPlp9MBYTL3vGSuchU7h5GAkwVH7-PYjN081d9__mavuJfMqtXwoovvBialP_0BxoYdD5jmWj4VkRL1f8HLLZlx8yZsfNaErkSx6XxDRgKS1U74ANWlrVsmZ_Y6peiZQXRa7U_0_fEieIIxJEfsd-RxYyLf4u_WoBStuYTHJxFmPgGK6uaQtUwYUcOs68-gJrdxS09RF7gbDdsfBSDTZOa2EhMQyvn7ECkggWArOcgq9tijkIwNchD-xNjVOb8HNKHJJjs0ufsUxin6QTI4Dw1HS5cWMcmtZHhVcp22R5G9CUyN2mYZYdqJphzUHBsExb-fc4h-60DBIhVvEHZm1MVM_9YLMCz0U04LmdxLXGQGXkN4EimLR-2hvuTRfVzZM8uymqB2xu3cPyMXQ0FWbfokOgH8pMaSCuKMJA8duF0tgKtDgdKU0r4bqHQnsjCdUZF2f_ABYmWTvcwY0DgX1nEUw7OZxSTKAt0KT2tu-sO004euOHagayXie-QNoqmIz_HSsggo7uK6VzU8JWFJItffVJXpzPlPhmWtHnpMFHAQnjCCbouQBFLZOcGg1k2onS5MJGJ_tnUxNlj3UUaMyxCb-iisz6zJrcAC2N3fvKbThrjf69zvaAnuuC5lo3I_m2jsLhbvIQ40STqst7_mWh34eFrwJefvk7mIj6qIVkmUeNlDID6ZsYCTibFBMPdcgcQTcixEbUouo6vJfVG4nptXHxks2RYo6EbVdaW0eCMz44cjKVNgxlPYRb1_fH5KJPvc4UaEfsKW7Hy5iPLVJ5ydMsKSlD750Kjcxhpo06afToQ8IBQ6ioSQbDBS2mBt88b0VZBUowem1EF0z5qynOlZ9YNFipGY47_trzZm22NeLoOL0xzMSkzA3ouJmdlmjAh-S-NueZPDqIcCTu4_v2LSN89tjs2-r5ejrQOiogwA14Qe8chqWespQQZUYYQAxw2LmenrsNWlP2pNpIUWN1UzhIZEO6QdAYEm8M383P1vO1_brjoaISRfDMohI5nRBzyinIlzCelitBDL73-eH9aQWjXjNp-kH7glfL2Fvd3OWmFBpHHNL9wIWsDMkC3Zk1HcNf0UQpkR96o5np0b2yX63Wxyc5Zu5EAh4SWKmsgn4znpDgOsPDdQIFuObwayUJiF9-oAH4D0sy32-DltH7Irk15c1kKQX6oFeh3frw2qbDQzxzLA_-hKxOr6OR-s3r7TR_zzV3bY8XKgZTBbcjl-cmsqaJCx9axMRIf-Gqf8L2S_7N9Pu0bs0PcceG-qU78dB9hi8KuryB_NSUFVKsL2dLjTIVqPeti0K936tbOGOeW9j66mxtCzLCjo-QQJ8-HeVT8h2rH8G1dpFveYIWVHi_8RHlx70Uyj-B0v9A8J1r1DRZnaoK_fRVAKdoVPqo0SijkL0-E0JR-5E4G-vy_74WX35xVoHM01pueYT4NvNEbXZugh2ptKfrkwaGbTPUfZ4MQ3bVJX5SdyoVS_ZBYPCkSF7G4JOgyREHzKj_Bk6vibayesFgKHpR9Dn9LeCVfuGiIFf0jd4GHz_eAwsoXZPHDfS-x2IYYOFVDoSUsy5wtyRl5_e4lK2TjL-FBgRJBtLgTyUw7FryT7KTrtSOxsd4CCUQwdC-mP9MgEq1bnG923C-RJa6EiMiLgV2Wyg8WiUxXxEnAvtraiY7_fBCOnoIqJsJ6IKTq-FVUPUsT8dzB9bcavl4xWe5ipd4-f6fivTrefG2586mnlHawMPeVqduYY9D8w42u6rcVpIhObzlPa1BGw3G9-RNUc12vf21AYFx2FuA4H5Yf3RaFLvJmj8rvp9r1PlpTBvZFdrUGIFq1VEiyHVps_6fTP7JEMJmnDoGzBpNglLS3e6qZqK_hp9aqBWhNwRnbC20YBAdLYRBdIHEJk-Ogc2Ds7Ld7aIxor2koUk_7vS6GPmfdzjWnp8QG3morRoCPyoljC3cVGIcRhbdd3Jg9Umm5Vs1prrkGAzdyB_0bfDmWsj1V1FNHCmROLKoZ27iTbACMrI74_w6D0P7IIRLSqhA92rem4Ptbita8UiwsdhIVCbXZ0GUYvo2drWSw1yqIkCzCzAnik532dPgYlQUSkY-TfOPr3Cphhg2WCewkiH3BPWwABx90jZGhw5nE53yVqYhzhAa98lBi6Wz2ef8YNsh3KkbmnZSgQRjEBa0quDrIzZs0kKIfyeyCEG8_jqwCG3kyaS52hX6rtSfg6TcN9TpACqAr70qn7qwiGQhAjMRj2y_G1kbyKIf_oj28Izvm8dY5-xvg4bma3bj_MPPeOTHpFA3T1gUko1p0KRCKLBZ8lhzBDgs_VNmr7aky4MifXiIgE_twnTMB9pltIkYud_iklAQ6yrA_3mvOYqp71ff0zH7JfGO1W1WiG6G7NKtc8DLfqGjLdeWk_X2Ka1q8lSJNxcMjbJHtGgA55eWIxgDHz09f2GisUkJfeAacM-ImvDtJ1R4zoWYlJpAW0PdlkiycAQSKmj4qWFHyJabvJ87cJTuFQNRsRLHd90EpEGXZnjce23CFWfCtIb45mRGw8SmbKONCEqVOUy7hpCdrXXfGYivo5mv0VDXF91xLu5BOMscOYF3JPPk4y34az1-AnNXcF9uft-ZgCZ0jMMcIyNvO752i5nEIqaVrkXFvIKK2XGurmqQJv6axEtt8S4nJwXKxEKWIoLdtfZhhO-DF3WmcBH4DMQF-HLDzeBXyuZNbvpgGCUZVziiZc8KqFdqx_xzIGgVU7tVbaTJHdKBWyVEHkxrVfRLfMmtD3Vn9BAEXvQDevU-8aAwU4tAH44CM1jHsa7Bk6jN7fBLBKk_PpJ8iPagGOLz9bs2mux79kulfaSTJsD8AIlPmVLfaqhrrkNcJib5wYWNiap6SCmUsmi_z6v1TfUzE3q51kvDhqFmmq--qnVVANiQyGNzrZqUsMTLfClwsEgrhmyRN5UcAnqywozs-u6abtN9cD0uzgR0XN17hX9AadCeKOqR8dpq4zycgL9-82KO5Z5cHbTgenzWftpAdhZDdBYiNfilfIXSbomqQ5H3Mv68mFnP_qo7uNgDxL3f9VUxj_KwSQ-vTqMhRTKk3Z8QZEFsaFbVYRHa-v9d46vHMTS1aUS5k-qBb2TFKllsdq_nzMkvvqTZvaNdXbJJ4dW2BbsYfFY0F-lR-M1Hi7gvInPpeZ6Ipp2vtvgKxClHZkD2HU8ZdJRBYNDngvlU4rIaaufo8Xax78tUvmYpg6BPnw6Nvy4VhAmJHIbypOq3phkWYWpJKXv6VK2ESmz1GVSQaNt7aaafXgn2quFfR-YU-YenHEVQjA065lxXn7_p5t607beC7dcGSS7-bFwT1MRdy6dcq2-oQpHxVbavmBU9zSDCQPoM83d6CU2aieQLtJ7TSpCZu0RlbsETBPGqyPF1f-sVBGPyNqdf6NW9DogfWyp2VjuV-ZWAbv_6njVfs1Sf5Dkwebyn1x_N6XlfnJFX9slYpifEuC3_yi05liE-49xgLq5kJhGH22t370G1xQxsJkT0w1F0PCwpSSKzMYJtzsThCwJ--nsZeetpNlKdVcqkN0By4FZg7MfA6_KlaEPmz7IKCs4LjVyv-GRorX2w5iWtr9-ARzV96hG5v8uV83gRM632rNRaEUKQVx7ZIQOmGogfiN-XLBNDhnu6XzQ4IWmeDnDCvlDZ45d8Uj8s85Pmj3-KEb-Y8Wu5a63RBLkd4SKWbaR05pK2C7-mLSbzyKd0Dsr0u6A0pgOtXbItmoX6jrzpkK3DLciVb4sokOFCrDrt5Q1TiEwSqrTe058JideAsrj_lAN4M-JWGtAZfK-BxkEh_hQLmcnF8bl5qgoQm2BCBODJbfTaiZzC1IxJ6kPbBs-p1DgFay_lctTeL_rqpAOWDssFWMYqgXesTSeE_xMlPxcI0QxCtQoopBJ5f6evm6co5eiJRWZXWilgyiyWBua_uWQvtP6pvaerSfbkMQPTpHCgzdn3yQYf4XhXomcqliOanNm3PCjjTIpKoAFJodEm3g_n0Gyk_u9Rc0C_x8afhFZPluJzpk1BVashMQzjeM9TLCpJ8EzcEG_a6AUk8pa36ColCkqDtCmxSIQ4IUiBO8ZuZ-b77aaLDUD6F4oIlLSasNiZdUcgYAYytonAk_VywvgC27fGqK1E4IOwfiEiEmLyCiVTfkAIqa_8citJMd_GjPOwaUjtBcQbrN864AZwdFyyMpw9ld99AZK6JbYTWssGZhXdCAHuLB3yRXlWMAtOJH02JFeFbhs0aqMpdvSIypy05ZZQCqRY4WBAq_xMuqgemWSHJomP6ydZGGDxjGA04zJ7ptMm2yr1Plbu0mO4TZ048Rq_ealTF983I0AZFVNY1CtrbK3E97alGglkvG1Cr-tHmkOKJMM8s2WEIHL5hm-MJT1D3uKFSvwQ8NRM8c1xsfYnj89-zhSXYRuY9_zwgTeLXpT_UCGr2m0LN9XF0qSByq3w0Er-TYq-bef4Ti4ZSQxNabZzjGZ5LiTN3cIcMrGrvBOhqWJ9qBaTdjPZOFhQeG0RfNIJNgG4DRqEavtmtXIRJfqwc_lWQOpStD4dlrqgcpB0ClnO7lpdM4_N-gLDCF0M5F5K3QeY0zt15FiITIJhXx7-pmpTXfPOWeuH8p2VwwiU37ifrKjsyX3tn65H53vUBwSGiyyR-DI1THsC3OUGtjHGFXoriYbFIeseXSssvFq6SWDFDbvpKwY9a5RS__jXPsVimWjwlcahYkyem2z5YZKIEKfnP55ojwnSi7_7IGQQ4Wa_RNhI1zsQ7xTFnzDu5XR4VRe9W0ROQ1NzjlqDhr9sYzYNIcbIC6DyVFnhu_JjZ3e515O4QTtPmYyy8pBvI77iFgpzlvkjLCzG7ekCSFbXx1zSTJ7qmTnRfWnThBaB3DPxtoDMCGoRFmpe6p-9VV8TFKsPhdQj7p2M6CeW7eH-GLu5AJ6Rk7OdJ9kgAmiomOqtd4VrhFIBPkLONLAyzn1Xc2QREt8O-TZ7B6uA90edc7_ww8y33IKK1NEta5eybIyvZqqwAMNTOxHRNCZTjA3n1BvyTGgvaCL59jDO2a6FJhK4fHR_Zbq0hLrpMBPl5ZyK8t3s7w2P3P7DNaoiGU2IpETtVTbs--GdazRKHjpBsDdi1XTamnutVM3rgYP2UE89_ZtQo2iCiAgNBPG-hZ91CYJr5xlu5z6jjeeujomr_w7KFFlfY0o6J8WF1vQamfcQccY02T52ZNnPzVPQqcBwVle4uIdi9b0n4D4m98_AQGZo2m_3uwh4-YP5kZ_GEyEXmFcFmI5Os-e4e67alyV91cfLtbYbbVbfe5IElbjMnMhQLvdQkxmpRiImcVKaBW4KguGyQIMfC9Yn5L2l5cwzV6a5F4zZ4U2CGcaRYmiD8E92zN8MCvrWdxmZigtqVwHbxHJkFJI_SDF9pFVK1ExBWjfccnJLkOlfkq9Nr5q-2H7OpmNqCddejwgEJR41ChyHFbcpjJxXyN2BCbAbZ3f0YIXH5cV0Q0gXpUC9r2xap0y3yNzPweN4-_DqSEQsbtiNMgxRGgKr0Tjb5v7-l8YjmjJPUx2v0KwjCTWoPfhSPVEbBI2NejzLMXBOOstk-P1bGduMlCUOmHDCqSw7A0DbpvV09_sF9FCww1LHrMHX9Mtv5ooMoDiMU0b-RppiLsBWPbt6A0HGMsNnb6b2N2sYwdkDawivXzpsnOpyJvVmjPnixDwSH1hpODSPXmChM5SFZsvLfHFyvbmOfiHt8HL72BsJzUU6czLbsp-tRvDOKAyu0t5XcHhWdL9dY8CChVBvWfnub0uN5o6CnhCtec3PGsQ6stywV1GbQCeCFtg5pv7PSIDFG0FvbNifFXja-5MzQTHZ23f9jeZdN7W2mm9tytdZkgqQlEoFlWGlEfmA72zvNMRgxclfOQTHrAOJtBH1e3BuQRzz0GDaTtaD6VfIM5hiQJ8BcdJECDL60Ivk3NcA0_fntvzjVW9bUO_1Xy3zpwxbt2lRr_ia8Mqj8u3Tgvd6cvn7UgFpYiluqEQTPZaKVhhA3td5Kr6OA50RQdIkFXI7vozYD5uoAGHWj207qs8-F_waRvfVUal3uoRvEpXHLo8Ssd6BLNNtLJCExOMOZ0QGSfwQJMSxRSlf7F51AQhY6-T9Xl14g4B1dOe43e4HaW7WACu17D9YQO7mLCViXJ0pYWpYFz8deKLGaDfQNOlci97NJ3Q3NRfLVFcAnqrE6vhZU4GvOgY2LC7F26JHbOGAVhzAUL4Q-KeeNOa-NbWUkZD9_y-lr4VSuKn3ArO0rwNT6wL9VEirmz1ro-bJ3ioGStTu_ouYSypbyA8OhujjpljCO3ftoVTq-P9UNGwUEuqS5ENTGZBGJqGMTVExJWN6LnjzRGDavpEdhbId2umzRiZOGPddpNYDGha8NLNeKGFnToc8LppO3JBJ9Oa9aRGqklNI2j1Gyd7hWpf2KkxRXdsVolvZyX76idL_4Hdmi66gHXqxcvdy40o5TvLGWDCNO5uOPnI7nY61fY33Nlje5Nv4Bx00xIjvoCpwGsTaw_ktLIsF_fzpc0RWEEi9fdLc9WM5fEIxVyDCOH-wzdBEXPbPtfiuLIRx1MYtkQkoOe1j_oongrT0nD2UbbGCbxmN_yR3Fg2L0wnW2zttOdvF4l8SmF0o8DUTgGVQr-I68rEUOjtZAPytHf_PkZ1tCKfNDjV-UN1SIAvdVVkBYUk-B_fGBh4E1ZdQHp1jBL-1t2XMTLGQPi8ZnAK6rNgAfw_yfLayzojcvGLGFwCwOIg-dpi9aNAI41sD2f5MJjmQhacfnV1lEodcdJgUFQkTPOAecistE4YjXidbJSNO2X8GyKYRgKxsOwvrhh7Gr47LEzrx2lGEs7j6N2Y1fakgwx6JhbK-xc5ENHhslml-u4c37txIbhzMl6OdBpUgmTpPTBk6z6vs31B92sa5x95zDBKCgl8WW1ujHd6GFL8M9BVOBfHyBMcX5QZvWR7hHr6dJNPDR8ryDR47exJmvFafSJ5RfALZbnDg5fU5pOEuR84sgAqEMvJIorO_zIgJBZiaZ7vDANtvj1YPeligHHj17piRbkRmXxkU_kUOr_fQkDJ4hk20Zf2IlqrJkWXauCLrS07RFyervhra_z7OBnN1m2Cdnljz1dOwrnhAZvoaJc_9Byc_1Ylh9NGW13Kp8QN-Le59x3YydVVR23t1a0MPHOsRrxpuiVAQ_KNh93EQPXJSmDXbkt6zuvutT3JcrYO8f2xH9Zol-8H8BobIKM75uuoz3Cye4lpl0R0cjFV-6BPCuCwvxXStu7Kn1DeSXplMr76YZ524_7giAPcqaiuQRsH1HV_FPnbp7_HlV83P9Zg1urC1jPhnRIFlyAmhZjCOkhD12Jc5Gj4YaUIzQY0ptnHrFbfofTbzALfPPXtgiPbYYt0rLA1J6At9xk-Y6Alop3V3GpULZXqTwDyuAq1e7flsK4jrN5cpTaneeuFZxWUMKLf_birkxwu2YAODgjQnhGUCTo8Z9tKFTX8WsL3J2XA_b-nq_vWiQD5gL3a926ujPbC1djLLt0tLLlii_JYSFEn_ij5K7OukeaC_TJo6ys5SHRuq8TmW26QkNEhxhiTotbjBA7EnTxsGv_P7vi_rfreeQzTzj6dR1zpexIC_ZivaM2EpVYbv4gYIWnnQVx0nkHFkzsSfaQM9LP-xC0NQcOhlffBLmg7U7DtN4QsQt_BhX3uWq7QlNyzZ4OKt9M1ElK4D-vOK20bt91mDB2brZ03BjbyBA5GvKjIkqdzI7Dmxhoo6clMtR3x47v7hF-HUtiDZzo7SKM0xzQPOHEgYUZOfUWFPPifQ_nkdV8mwphQIKeMspbmtQLy6dVpwieINalZVuax5I5hJKMfJdRK-V1lDfSFcyOrWd2EVMgxcISDmu0QBvORXDzfXatUMTKCqiNaEkrd58MKBfQN49Qpyw_9XwTy-Nvl_YiRljyAdoyxyMKpPciw0DENDO37BWajegN5JKkRpc_mfYSzD8hdqiHBdBKLFQJYq3orPCJHQE3nM_I8ufr2U8S8BcRubVEjYOv-Ft_KJHw3SsVbQoaveaPXnKUtjXJkHsZvwKFrqCDNrL7GGS1PWKb6i4rhh8aJSiCsbIGrqEbHRvALjRWDUV1uA51lu3kqeiuGx9mqi4rY1v_vIdGSjpBingL_eivtdU3tpXB4p8QAAa2lstgrctwT31w964q5cMGjIWZANm7snwm9py0lZGkh7A7i44wHwJk11VU6UJUQfkAmB-owRxUEqY2JQo-n1YPoYJtmwWCIpYdpJix13dlDCOLhxJXsuLV0hJ3CYN2rk-RYHgpOtgOVSlpiTl6wPldJPbLtA5YumZEjuYlJuZDPGkeqUSBfhMXPdc8dIT3T9xuprRkZ-hyISO0vwnAenlUQKBxHH-O7wX85sEfy3bSJYN3EZjVxJFbzQVTbEprA7Tko9rldEeTzGUqwCYW3AdfN1HDTYIje_2Eb4gJK6Nk0rh4_FnTeKeEbE1Dw6AmDEDLuN6Ko5ZiH3C9wFNVEJSoOmK2vcPOPgmpnzQFs9j9x61Q5Gsh_ZY8qyQu2VY558M9Tu6cgJdToTRG6_QAQkmQAI6Yu3xoMWKU4wdHzq4bXG2PoEhgukTNlaBLLySp4Kei2sK-dHihCdwMRPoWwRtATM4v40OnRUj_xdincUcrHhgNgsqJ7RDStEQMd4W-LSi148kOD0BARZdqGkVhSG3N-8WFYIsyfCq2y4yqmps1o4tLMZh-6yr08XJcwx7MTQyWFle1IhC2vbCVYNtFDRSQ5HTLIei88JD_vhAtGcTFC86CS0j8Xmr2J_UjIQOckm9I9qoosuiBX1tYBE8c6LkZimxwAEud5aB2uPqVzuXruJU-SaPQEKEoLP-JfEQNv6lIgZ1EudtngunLSUuZkincjjFfLUsYb8J0z3547P0N1DQxo5OvchvmupYGR2IXJRvHQ5zSeJL8w9LHS9eWTlLgoY71N685Lh58Amk7ORWR5T_iIRJWa9pxrxZiPXYojHynZphBGGYtHjidkGvysokoFHeZJ4Ao6K2syhBFeSSdig7Z5k-TvihL5S8OmYBJ7lQOua68RD0PNcychIQSYbKbaCmyKxnWLPpZhNR88dpHceS2LvZeBgsgP-c0HobNdijKJlrur_MLGhWgGhobEjUN0LldCrkpz1xooYjXAhVS0dRbhVwzFydAitbyWn5J1QB0TGyB74yJp_sbG9CgXjDn5jZJs7K88R-XSAjljOepYl7cWXd5utsys3Egqy6DeR67fy33uaE7mmGPe44hXLjuLWMoblbeK7Y2AhJgEThWK-RAhCKaZ8U8N5bygl4eHpTd1QQV6MtE0_jA30F7wleQrLxMZnSvOv_OBbllt__qPwRTBAGf5qQwI6Ej-8KwfmabWrjJY2os0j-l3F-kxhvDQopmPW6ocJkU5I_p1nzLcaDSvXFuwmdMwPydDGEmYiNtJDWz4vU6IJP4g5MQPTq8Nxws0G1oIIN-rzSs2jIwbchevb33KXQO45Ov6TH_75jU-ZcfDZwBgFHTfSW9BQtYspAPSz9Ru4kfeJ3oSsjd_nDBYQ7hwKfTB3gS-nDKac9J3PXv9UBI3-XNKKTVIDHtCzxiFFICB5G8r8OfAA4Tb3hZSrxs4DGmDPrpCT8kkuP_ME3mOU5H95RLH7bOUqpd0CImJiE-nhWbloxB8YAp0Q8dzy5mZGPC6UxDfRtbMjM2Oc1Zbqpcc-c0_z0h5WWCgtvUUwe4ZSELqqfsFYMgiFwZGU1LI4BPu4oGi3NcuR2tpwSiSDElnSBMHXPtrh3AXRUsT-fGbcnDKFaxb3R7E9kGSH0B12f42vhIwHEwCQUaau-U628Vd87bqyqfKxKMWQXAQbGCUVI-utYoU-plH-dZbCapXAxx8EEKeAyhzdXX4MwF4XlXnAsCmCw5x0QkR_2wtlDux-MaRgV7vGmH4Lj3qMs-hmGOV71cYCu_qfo3EjIQe2I8ozAyCH_S8UB3GOHX_7HsBQnIk76vU50SxjI5uoJgPckxVBgZeI_0ayLOjkO47CWaMT0oCr7AjeUJ2W795eEyhfy11bvMRN-LuPKHAiWOEkvGwHBkK9u33DLX67gfNyV4kd4tImxGnIhjVqCb58HUhfBKK_oZ9ol1RUkgnK-v7mbGrRaAjLyRwb3Kf6vwZ23je8yr2GEgYKL9K9rMG_swZJ8uZIoCYTyI7SNBGmV-O16SDT2C9kQxkBmiwbF3l8NJmCdSajA4u1GRmqOCbEuuWOtRrpDqfaD_8s9oOUyz0I_KumtVxXzWliF8aA2arOg4TtEIfdFUOsiV1kJ8qVaZMs29QAM0CxkDbjmfJZR3pY_l-JTT4Qq4VaC7vMaz3Mk_u0wS7_6MyIgXNY_NpaPHOtGjwdqMxngalUGJ7UzSaszyvPfC1fvBt1JCmWFrAZuEM-LtrKTaTbD3ElXqNs1CSbUdRiiOPomaCODy6BgDzCvsa9VQiCsvGFHTEsEpN4TVedfvP2OfN9vARhCvGI5Ndl1wtflhk4u-du-icxD2etok815t3vAL61d73fEOK5zrKhAIdzFJh0HQUNr0j2iX0iEDrlU8xUds3Ka8jkokty6SVazYmbuPd4qo06o_iH99q8E-hh1MjGpcFUIibYDNkJi2vmwNHKNKRDVd4iWayk8N828APxJtW6J2ULkb73-GCqv9bPv7Fuy19tQ0PRYtJT8JOOmKYyhXG37vMe9zM3Kfdab403WxmYNifFHi_pubdrRB-gTyQjfUAkl40n-hxcq_rfcwno2IzIs8X7Qbl1Tm0CYyb0_Fv9nB7RoBSVZ9zbF7Sct-pEYusdp5cYQjAT1xTsI5uscHZKyDnG8nsCrf7ofbxoxiO8EA9Juanr7PXuIpxvbyBviuVM8eDCWmG_cWeGBB1Ep_AFY8KXRsIP85KEA4ABvxG9wB5Y2WuTgsp22jzK3ImIObQDn6Rge2MxbBU3b7PRPePqDOAM_rI0VSdvezAsSfahGRi4NL-2qnJcs2dwd7HXGMBzFldxRponXK0qi3CQYdYoHlvSReoQRpDhnPg8oLhgiCHZQPvFYz5sdCAx88NX85qq0LCX8-4-zaNlFPNR536CDYxSzq-QGSteXbGpCP3dsVaVOnbD0fe8c4QwNlax-Q2RlzATj24bhwDj0pTbmRhqq5YkKos8QiB2Q_ebBcXP39nG_VUBGS6_iYbytUwXITLmXua-FCvpediLs3N0nPob8V21mbOYFCqDZWdv2R9EQIRPkfqbhMXHMRi4VwUL3u9ZO7rZqyKr9BbwVAkjp4zb4f25IdRUe3SpyxwGDRDYxchcdCObOWQAtGjiegHGh9hg-jWlQMcaG1u30RlojdfKzM3T29XNthZD_skxkYfRlaXPgr_8eMYkGlslpR0o2yhRO63p44HVo7vS-Mm6WT5UFNivN0f95mf7IyTwQwpk30kvE1ZPoVpX7cIutVkk0cNauhyuTNLer4NHPWhNYPjAivqYeAi1BO-x2vgzv2r1Uk19Eu9-TBdABBqMxZKE-WAj41iZQmDDucJbt3DZCr4KpFTcwL4Lql4KbPdjL7BX4qPK86F_dGaLSUaVQSZWDC93_5XWgS5KW1Y8PNhZ6pqIm86-UTaSGSxd2CBUudcDtwWyyUQHyFx6aLBW99PpTO1ytOVBNF2Yeh9HmM1oYEJqvwU2ZsuRsAlYl3XffXft7TEbsgz0b4r-4XMxTWpvvKQ8Do-QCO7hiE0wYGvTNORnfyQjJcXWuwgx6xhRy6U9ndikV1lWaKdhMQGhwa0g71MfMaqob-yCiPVrmi4qb1NYSXFFHSWCPg1cCZBR4ZIIITGqkK0mDep1e2tSXIAbN6QSdaGaKxAj94SXjMNkB1u6ztHGqQxWXS9ixNMyQ35qIKh3Rfn9fI4n46C1kBD9E3XtUiubzQBPRVFVejjZaJHmEe_S0kNXTp78vs0pdwk5KXjg6k2zI5OkZYVsUz6iPeKjiIR8bLrCj0oWp8La5T7edMcx0eibZtWfWPf2sMJvq-bvrtlJ_LM5bySLGsI4M5vcEtHiTGDjNivLw235y6jfq1mc2k5E9IqPNSbEnfakTLcdS3j542-nsDJMjUP6_2_r9vvIuYJsRG2bmwsGl8KD950MvT9NfcoesfxShRzig7BZBa2vhQVapSGw_CS_tVg90286shlvRh9jiGqjftdqt8e6ra9asDT-Jg17JXsAwamhx3hostlAtWWCxXpqFDZ-slhuxOvV9X-ft_EvUQKdtt2WSlTgGL4OZ4S0BUlldEDVFOAGvJX_-mWm0NBfcydiadM0X4HwJVNAk7_bN_w06Lj0utYORwVarJyLgaBOLCs2S7hZcq87sjtuRLPCrYYLMt668HTxZ7UJLyXaetZ3ZcxNv-SIGsEtxS9mY1XiIjWPaiF-Edj6uJJXU7usfXe7Prho8ltaSmj8WsPAyQdBtypCm21_46fE7J-lYW2xdoiQdnRXgJq0nooe-SRsbqtEBXt4-jyCOB6hwOobqfvIdZDQSSwCzrJ8WuYMcPLmfJ2FoNtKb9bfOFbd8jD3-azWjJ6rLSGENe8sDjUTIGda2bjwiJZe5UgDBBXJU7yzVtf-DO9SRgBzoeneIQ8OEK1WVI7On0t7n677oUBL73dyP4ik9ZXn1fKvdqlm7_IzHD4-9riu_q2GfS19hR2v0mt5AjHMqVC2WLqTIzur7rcTWeKbx6VC11gJSSN3T4lToTrJYWo7d9P0rvEbdBlQvyNQclkV9nJWNgDAEeA9LAEoBArB_ycT334JhLiVyfxUGmUw8BXAjCvKrCFYLcq6miLvtBqHQt2ehVJG4HS5EQEPcqVboo3asmQWn838FFSfgz5rkpR7eUOAf40U0Tr8OWSLoBsTwRwwE6EpxzYQri81rn3GQZqnZh0PtkRhZEwqXQPr1pb2RHXHccnhynloFnQxsGmCL4kStgOU6BI5ye3Clb7P3JFFepe4Trt0exJXucpC3NAzHSEbBP0a8O7vgtOeSUW2TjljJI3NmKiHoz14Yc5_6ZNniuPsgvJHJIr1R3Fe2DqwCTd67VpOzyGQdaLJMwESyY8Hqr2oIhfwCWOf71aiSLlz3fYNuMzDcu0aDNZgWL9WJ7sVIRCn3ESe3gOS91KQYu2k7V4w00UayMZFGRCJWl04fhmZfM3GtPGErjbj6qSUajucLSunFPHVIyfdGPEdh5Al9olVmoLeZYp6wZktc7m5cNRKreebLUZre_EKqFCew9YJDaqQsNAQUHpT4TSN_x4OvivhgbFDdNoz-341jbeYa4D-oYFnsd_IRf6vwyEfm-GopqsGDbZ_iXfwVWVKfbG4gv6xeGSH7z2bcz4A8kvYBiunHYqMKbBAYQ06tqsbFGLLzGeJoJ-DWajlLT4vrJHqjFxtxINf1ooNjFKo2jxPEPXlwLmKcbSInVB7GY04TCAc6OaU0v9KJwj4OurcaV-LpdNCyKoIwJJ1MZa0pPWQfkWnIoDQRE7VZuvnV9EW-M49Jb77Chig7S4yX-jmUNtPrYgnfFDNvkldgJzytkd4NnS1_O6giNTn5x1ruDwF-YKYhGYxVVlumSwQS2UEEapqBOwOf60DhL60zJmINdUNeW3vJrO5omms2SxqWKy_HZDu92P80URlzI6CcXarolJDwiaCzxn2tQxiYZPuIB4vdtsvDR6SWSy9mtd5YmAm5TYMt2EIlDNX1t4qHsYxIiigQMeFdkF9Kw5qAu7ZfMQcUX0010xwG0LwS_tPA11o6bXmnVf-H8H8oXzv19mVfoJSeCfR4K9JQaztFnoLCU0qVpFFR6dk1HvVfoUs4O-t1QzmO_eLlVbTpdmFkcUXAFO1pZ4eUxS6jUkfQIaq7qk9hpZ_WOpASWrgewKjHPl6LcYqSvtsIqpCokzOkwDIKPrXH71GjilFzbC3xH2h4E5MkdTYQephbf4OvgAu-uwHVyLC-7Kr10jOJjiu2ciEqHcEgD6m7wgH-e26nem0zF6booHVDu4kcg8MkJCqDzuNIE5p0uW-uQeEMIATdG93U73l1FbYRoITu6VRJ09NWAyjVpEEktCaaSCeO32JXVYFyKQokotv6Mntq7z8E0vkVDsviiRgC5OjhSqcoKkaEcS555-EiPjIglMiMO7W4ILnfVtIDryPiy1FvNUiNgsSYHQIB1Ls_L-m7EOm2KmjI96ufnY_NXWrCNqdnhljkThHZNb8vX-sxT9ptGan_RBcxYe6hjT_MeyW3phpm7VAjrxEnj-9Mez8K6zFEqB6HoEpPUiFGOlUgpxDVQpA7H-GDC4uay7WnD0PqXwU_pK9RZYjOS8Lyn63pz_0PpJGNCUxFn3DXvGrLefLRWW7kO51apEi0zJkTNvTZ6T0SUftvmvDk9dHb-RymDhxhALJycAwG9mK4AEZmXs_Mr4vDSxfBDgQvIDyvwQ5EROBdt_3jEBcwzZovXjskvmp6C6W3ROAgOVQ_nTMwYnmSxSgZliLFBbffFmvRJt3dw1Xco4AAMAJxm7UeUUctOyI7AsARKStdzdRej1VYMtCup8bz_7mApCyU7-yf7OPi06uVOKrNaME_A5ZYIZEN2WgdDBe_KkAh8bxSeG8WlVG7V6YpJVNS7pZbba8yrns4PNMcfnORJTqR1DHASVoki1CWzgsn_rnJa35jJ4jg2FW2MvZjP8ODreIqPvVfikv-mhen14pMd7tJgGDBGuBIy8Et4XFZwgGdWZ2_DSZ0ruROGfjff986g67ztysw_cyMSKbfUCdrA3UdeSciQ1PJFHKfQIowMpHQrclZ34hLv72D-WyFNh_wL0bTUtJHVMyF9wAtAq0LBoe7bhd4YMbDPW7awqfCVZ9b3CtSAvgNhEHizkt2xHxaot81VD3vfOs91NfY7ABRD44B8oTV0vUqCeb9Q5BwqsFuoV2_8Icd3Bs_7YWIvbz-0qzewAuM1DgCfjK1imEHrmsdRW2IeO9N7sNR6nlqs14yO_Mr3TGkeaq07Eyhmtl-Fy5eBqnT1bd3SUxbXnk3T1ggv2Fkxu3yfCuleGBKBCeWYLicgdGRya8AcDMp8ZScvVwBHv4Mw3lc48jAFLoGoE_P4ysoqPtS2PwGDp_DDlSSBgzkCjxcsClxdneKMcMkaYx5zdBbP1gwsNuex0HIpWJ_B07U33oeTUet-WtdsMwUjj3a5YgvJBICKVxGPYH38whzZYC747bW7xv0Dw8EzO5t3LzYZwWg5fFUBpMx3kjS3UnQFlnK-wZNi3vI2Qa8E7l2SQTEVbO3W7wXzq4H6oMJ6zpenBXCEY2nxLDVtWR2K2YGGkf-Rp-5kMffaT-1a9-mmM8mwFvIw3oqEZFNVrVhny0iYjOQVFmrY6ERVXGqS2DK9Bj37i2M6jWE435OqxhG5qm4CsrqZzbHS6g4r4KMxpxYbxq91eq-EB24fnBdJazNrVS1xdnPAqHGL7jS5M5Z0h79gaLKjiOob9m0DjhsO3NEMtPUtMuGZa-g_cwhllTI0p_Bk3ZCiQMVWTXzdAacz_tHZ6N7TaWxJAGQw111uq_q5vHNy3qh0GfXi9aox25qPc-Z7no213CxkcSZuj_f64fMIW1zFy2f0hINl5nLs9u3shjtKswmt5g_VQozJwBXsc96wIXYHRG-Kg429f4usTqtUIdWANdvwMKzxi-noxP7y6kLKXETI_8veiT-oD4KvgR8_hjx71oyud4x12ONV9TPfa6iQOJdOoM5oVPb0pzHKHiB8RvsTr78qJ4sQLNdnEBwg6OtwExuNiS6etg7Fm7a7k0Bp5-xl5Jx8MrOwws9XDtj_8lSfBUKRGI02a41F-JztogKIPo5mMxnSUpFZddkkigqYz7BqRUilWjXe3stsMLjTDvfOW8r1ypVIGGh5XztbPdO5n5_BvNuS_RDHstpZwberikoz7r33j286sq1VFCD8jTOG6XTBlaL-xPChZPQo0A39Gd-exYY5Cndryrv2xfNpDWl9g5fGhrkdmzqzIZAV2cajOZoRK_dU3Y-XYsn9BlrturxeiQZ5yHca4lwv-eV5PjN1N6LblTHHGQ_l51426We1KjmOoDg6Om3vXVuysu00Ark9VfFO8zgHANF_pmIiwen_pYoNY8OEsteWMWVa5Fh-Scdn74rIewznJtoVpBD2PZmg98LmvCNDEzbpg2f97syqHpGhAiMefxphpwb4MoDuUknwA8ShZGxn8bLYYlNG_an-So_iKKXUnUssWdJzAi1MaghF0g_tGwaNSLB0-kzsdyXCxZzlv5Up3guDBB3EjSO-f3uCArZng3t3FB_kSn3gHtQIpvxPecd0Faaj4ar2TIyUSdZKhm22pTPkGA6nkYN_otcdv-t5NJDyatwp0DoHZry5xkPlz-9kwgkNyYTFzKt-2XdqbUhgQz88BX2BV05oh7Cv2yvtMgjgjxfDb1RyBLA5RwGDOXsqtCtz1uEGYNCGHQ9zvEBxj43OYeWPPbgzLKty89A7YLE4SOp3xL1D5ZgqDryjZbXOiy5iUTWwT9ee-PjOhoecs-dYccCfAM4lPGjkq_gionNScyGy-OZQDJMnUBbXC90WGr2wEy1Pb9S2nffrDukM8xvIp56cdgfuHNCVwCu0BdGXhD4XZkvU_gaWrKIM8ySVb6xIW5pNnof7tUWJzJuQi5lnq9Tat1WWHZ5okYP0VN-83fvL2vbHNFb8nyxutJMx-jkJUPR42mZKrvRP4P5FlGrqvTXNkwbxd-4sjsNsi3OmNLQwfCdsbcA0MLuUkV-D4B6FER5IqTBReEic3jqh3Eje4L83ODNzVHKACCFKeZukHBoJfgOjxF09AGrxznUJuQDoloX-XizY2uqR4xJw7047ijcNrEwDScLJhglynVvK-_qh7Mkr2AgiA28t4MUtSQd46JO6ezGK0imQl_ZScKqDs3L5hwUBROl9oBzJwiXJ_zExG732JER7ACCw5IsrJHCdyLuU7TWrCNAL8Eu3B9k5aMsXlxQzqr6iIPFUNBSNUWugefJG8bvD9sC7SNYOXwt0nR6XTwwfS6oUVAqkDp_M6ENXQNovyzVIU7KdZaJ7UkXjXV7cA9TqbPRFEpx7H0Z49UQYlQrUziuTYbG9tqRk_Sn2dJpsx77EYaK22WWSB_d7fW3u6OeluRK8m-Aqj11rgR9-KrpA8vhp4SniT-OyRt7HFQCOsdtalzdtJOuV4hDxhM9Nea4UtJ4zeLSyZ5LAnTBrmC0EkBcwKJumN-rQu4tk8jlUtgFrfSZx9KcnhUprNxZTYL2zUhbtHvHWTkSD09aZ5Wd0__TY1UJg4co8yr7RDWH42UFBc2cdibcmgarbll1z3DZhedaRKWIJ_OZqawuqzj_wGfIQiRWaLFTShGVH7xW2DuWM4Ze6mdciNATfV0xPuSxYvRDbmzTv3eLOg0jYXT3k1Ui47vQCQxOHqXlvh7ik3Wm6jPFLda0zNCvnqOL_7DihfdTH_65bRb2qKJgziKYjHOTHZSsKANPJ8Fwj-ZZ8jat_Xpr7FIw5-LBwWzVB0QCmycFd-fPCFhj_DMqDm0JCyeXjnc-WECSOAJ58ivCNqvRgLq-ree8ju3rB_DL5yZIFGJzf9h5t0VewcjOf-psO1NtEhy7ijKSqL_7vUGcLZxm4Rn0TN74eUZYEnZgixKyhcwuzfDutFsCTTVQP9jen0BcPtkOsrWDoNksJgSxZQ9xdztYkVUtBuN2OnzxZxw5b1wG9ddXf9gbFzx7tXdQsaz2IgGMBF_BdPiRq0GtgeO_TOkr08lFvHVe6DXzTJjrVkomXPv5Q21gQbrlm9x1vNmobJWyJZkG9BrVd07CKFKjfS1kJTysYPD5GrKnOzJpohUSa3fN46XXI3Weh_NSIoVL3C2p1O3nDX5xe87PXrUi6G0vPJ-Jbs5t-RvmIouu1d55XgZfhd3nwtklHLuuKisci1INWz8JYn6FaoIqd5pvXwlCXyKDdvzODivvRZmxYb-utpcFWncsrGKWcdXE_LCWgoMZHhO3GWKyZhCGAOFmN2YlpmpCfv6LBfrQrkzvAmbX8HfjdQ1ABeV6oNTcf8zamneXIFzWRPTIqS1twvzdVYNjPCTuffgMsGq_Ky_xLKrpuC3DiaTbze-D98Cor4owk9tdU-R3L8ozs5u05QEUoIq2jgvK8pCh5EUrqPKqqSwxHgPNyxl-w9_2Uetzwk7Gt4TiKLqmSBbDKvkvBXHGSR9wlzYO4uuI1dddJnYzAks9NX845jYlHeP7pFvAlpgfEwHV1il2nm4IND5DQzCNiqWljIkGCM63nVEuGHHNCXS3mMiamyOyaR_LXCSfFIgyBoBfEtEMtDD1XAY1gTywsS2A1FLTc7AtUKzgJYG10cjJ6Y-36C_JQ58nhB2cnAUv4ee1tpC8N8ZNHrTIZDhEg7QZQEYdhYcBF-dXFQKJpaa1dLIScFqUohxzc63pEG4a1jDB3qiUoFwXxPC5--TVhAjKWjqHC6FiOPGhDIWxqaSJ3h4DqoCw8lRPCJsG7ge2aknLipi4o-9syH98VJg5DNljAuO6fG7C9yZzTub34DCRqJfUBanjS7lMurQYLZiSv2anoh7IGkO5U_bzCsevbYetcl1IBtR-O0MiTNgcG-qWtegR7AHWzwpydjGJnaXdBWVK4KIGqheVlUOCQjNBTA0-4euMlcyib4gP3HQSXZHz7IHz-UsJPQxytCItTcTOth53G_eKOv6ax_8wa_eEoJTMyEu8ZlGBsN2lfEcc8r34bsf5P0ASAmNA-4dmT05l4ehvjwdMDsG5guFYkDz_FDzpPOmAHR7TA-oHan8ELIKW5U_xEhX-Hh-erGjknc29x9VpRuRbZyhnfQHQ17zItipq5Us8ZNoB8mkNCX5bRCfx4JDw5uShXZ0l8N0Gin_jo7rfnliZo4d45ML14VhT9r9xy5iNqH6Mn2qNYPiQh9BOTRDM4jBLEiMah-_DNEJkGclaVxEK2fS9EqUoazL_jabEqdS-gEidH4eI0GwlqEh1RGXkWsWcVYwYbhF2qAe3CsnGrQ8Zf6Sps6RvjkEB5NsNT8xPFDqm0XlnPW9LQQsOgD-7-C5zNzpnGM-rT_vdE8tbdkfdB-XorDMjDbc5w8ZtasDcDw9VXYw5gQdX6N6r8Tl3NxxQ9YpdU0e-mAnKAbioWqu9yEjx2LprukV6H4XOIqh4jDt9SBKFWTlMxPZmM0QZkUZmKMTjyp191iwYU9IIpm6FBblRQNzavtGvCOdTffeaiyy8pzIiQF6eev_0kd3Y2uVUa6m3EggW-2ePaF_MdqY3D1hHUzSJI0S309tzCB_C7fMTXaMmoyZmXvpNdRGVYXpPJN5X9eItky3P8bP5EVHkLMrqGOHzdNwmDR4101pFWuwlqFv-Ss4fswzN5Id4oSzIinz92k2IPfPFNuPn3mcrb8LFmnau2BN5WvSqoeMlUud6HvipaEa2nIqOWcLwlYJm9X1wLyXZl9g3mzjnzPSW2EJtexusBvFUkF5i1oedM16i74rOIvZPAvlXw4hZTs4qugnUQQkWxNJ2-Xxi4UdBPtzQxdhc3EsPR7tia3QQK1ODVchQpf9WxOIkJHtpKCnaFEWwJMpPRDDarivNaG-KFSwncoVKCUNFv-9LbO2ITjZDpMkyPclzUoA7Ae3Unh9GnbvR0xK4AV84roOoDPLSG7F4iAnvluX8uMLVcUg_bKECKYj43d1h8Ez1hOOH-9NjFWg9_fxEgwTTJsLkNgMzHnsQGfG7oXOez1z8eNgWKVPM9sX909t4w23x-FRZ-SndlSzioIPVVN9WnyIWMXxI8NR9_cuYsdk4nh-jGukCqFYLNxwhfVEE8mb5f6qcrf-9RzVvjm4bjJD867dZc1pbvye2kaUqTgtqyVj7CuLiBeKy7YTmSRowVdv15bckGXc70J3AF3c_qJN8Fa1xC40vPXjnk6-ZnjFE34_PUwqe2yU-zTJNZH7S9oPBoobxTFgoAPxjHQSOGwkrQMj80kZotfzk3ndcp4tZqTMixnPYb8YIyGo7QVWNtqqxV19o5q3E4_zlbZoYplMrZcGYAhRHxYJ5QkKZ04ZZfjCeoN9Ic0mCibwbV5g-086pmq-lAtr3DZjRJy-LNkatvz-TOKzpOjIBoN_hBgFosmKXNBXSrrTgRc13JzReCJLi8YG5N4riDt_aBN6GNJBqIBhiQ4zIUypkxHBbNocuOE6fTt6JJ9fhaf4ENkQWkJkXTHBA7AkvPUWBWFuqyYDjuGW4FnelnWudZjuGUbAJTmRAQjKQxMgHyqwZvXA_lj61-5pvVRBaSDdRLti6-r9kORaxPu2LvMovOqufgbw0GfHpcmxPDcAPoU-54-s8jIB_zVb9JTiWrifmsfIg7QW75pMrAl7Xx5FL5A6E1Aa-LeT70xABGaBFFXvTrYM5nZBx5Ue-wyxg0vGyIEYgyfIKOdrhL9KzFNaLMGBYIP5b_9k2ZDSR9wkbk_t-A8uVVJ8c_wyKVwJy1BpqnFlSjL5wnXOH8atIYOeQDha5514Bc2Qnc5-hGkyVrsdQ6OGAZ5IfYqZp4c2P9c3d270jzt1VUdkNY34tUe4JP_34Tges1qkse1hu3N1MfTcz6TiGAzvN9_zU-QwgSuT_F99KEPYIcl-pkvbHadiIV14Ng4fNa1BYfn-K70_bTFs2EBUKo0ZyP5sYn9E-Ysc2R_nA0B4kh_fUm7dztCyOd3CtkRjuiCQLn2UecZIZ71WqmOVXHBGGBdp3Yyei9RZ6mxzWjYUxPUlFJ5QV-FhnNrHZRPHiCQdnxVy1_VP9SUv18ejqHrKE1TbWkAlXQPv_nKJbtAY9J7xsgMQG6pJ8f-d-5sa9dVzJCVu-LRLvTOeKQlT62Zm59VtCJrbbJLLsCoS9Keb2qI8tMu8r2kYJPRBz8-_6Ai8_lX5IKGUfXG6NZY_lF0As8kUdoSlUtoPTo-GTq9SPBBOqPjqaEIGS2macgp4h4yUiFnR5_QjN_AZ2WDvtQIg2w7LYj9_jl73y3D-vz-fqT4nHJxbEAc1Mh-Mz6WW_ELYCVWmzQ2osTPgZ6tAcJ2YMsMBdiXUjXfCQY36iV-tEtNv4c66dG4CVh-fbmRX_SQTqez39o6jmXfx47bBvz1fhvNQTGeqfmvvU3Xl1zEuHG__5GDOhLUjHIs3uAv4VCp9-5n0-xDzJMoTy4cCNmnEruoKHeK3qembK6saFYzOHOKexc2DCJ8u3FqjrACKMqDVOJIVC9Cc4Rkw07Ufn97cVAIqkAfFET73DYgsVJrfzBhgSFO9mmz_X2UlU-HRyikspY5POMPZx49tI8SlsJcbf_2zv5nv9f6t4pbOerlL8OpNNr6pAkC7ZsLdyd3VyTzvAeA_gC7SjU59j-6pbAQvFqo-FK2tt8Aute4ieSy4lRwwNM6FVGIZqUhsy8H9S7vDF2uc2SeZ_xGmZHuyyUlTmL6JwhwxtIGLmQumDcBW7of1bW0E6qSRJNfOweFxD4Y5RdQvfv-ktlOKNF3HlJoBJxFQ_PqGaO_cynSauJtNho9v9iMZsjZQE2QVEklkspJe5SwkMvfFFy2oqowJLDLCYH0AgoZRLHocAtdKYD98CNiH1YXWrcy6HqGFfOqqkNAGYpwbmYldGeExUaN3JoRkosa5xelxfNmdFBnPjIPYIMzpR1ykjy5atoBjiJlpJO9pmhnQRrlLKHFxvsl3tAgNNHnrm_EVoZgLGhgkp38zBQynsA9BMbgIW0nNSvVmOcICPCgIRbnSAqWeb9bcB9HuTapC-7VmG6XEIBaMvZY-OaGAM2Sx5ib4iS1zt0fpzpdtH8J21QDv7WwqaegLlnlDjrn_3-hXv4IeCGHmDSdpyxyCTlKYqACwrTkDUfXp4T8bU7yXYeddHUva14F165ABKKdc9XmFFsIgg_Iq6Y7BKHACYyzmUmAVsWypCGXaL_fSI5-I3fnfH6rMvWd_m0y0XEfFMwcWCMVxVKpIOkFWRncLqzr83aVC6r4L1QmDjIf_YaCklO4onWdJwByusQcMDJca-gPGMWXL-d03jEp6eoFWzztoxDQybQJn7lihz8MV3b8GGxPO-d1yikL6v-uhZsCNGhvjdabilAT1sFVv3x4_mCjpyq4QooRwUqjya0DemBS_NpR7VIW7uz6UsCnVaRvVxuQr3JZne3EJfCSozIBTlu7mNQtz6x32yntl9qAC6GFNyEq5WN7eQ3wlTJ4vGf6bw3Rlb5NYYOokr8tMzeM5ZquACuMl0hJITlbfkYXNwmBTtiwhq3LZiU1UPGa3H0p7WbSWLvkf2VFHnVlevuY_DgyC72RD03W7w6JtPqlLqoMbEznz8xXAG14EW9YBiq857X5BGHP9ALWXsKO2oiLQuj9Xo6UkV1tI_GammEjnwtE-eGVZepcmbMhsgdB5EBaS8tpj5YIc5clCUEgL7_LCLUTMUB_0Iy4pOwHfzXW3LXgFtwiG7rb6f-5dYFhBfvqqWqXBGCaBjovnrI4jzCjxG0FtgKqjkm0sS1DvX-KX0WC5LL8NpLK2GDvuG0J3RE-OJPISydkQMgUbPn1TUyetBCKJA5Rl0nAqTrX4-vIQjQG6meaw4bzg39GQ6qQszOrYzhj21c9GQ5D7yB1szAQAY8-LezXljp6zzePRyPe1TQz7rvj_gRkfzUKSc0GnVd0_H4MItPO1fEdnP9lRiCzrwvelv2BrRoR69m6VEvKoXQaQY6kmvQywX7C3AP2XiD2lZ9R25-OyNPdx-hs2l5wo0DLTIQRpmGxZ4A7mHF9BYavaJgQaVuSzhloyLfdPWmGb5GhgUGI1ycadYDNk5ErlFTqEH7h-QsTJpjIk5rC9k3Ku0DfLOzZLSHU60pOOiouE-yxWMLKOssbOgXQ61wHlr5QD4U0fVvw_OF5qtmg4gZzc_4cHIyYcVU6f1bwcfFXO9bbpcD5jVZclxIDGgeBGSybGFVYh6pqrBvvALCroZBcJw0ijTpkZEzvIGsUvmmhU_ZJf6y9GwuQlwRr5r_lXncmd-gvAX2mDNrbJLwnPlcck9iLUk_1aC7JTz16-9YdAzRnkraWSnd3Go-74VW1yXTmebjoDZgXNKTVUT1DMJQ3MfXuuSPKQmMYP3zj9WijOyB08dDO8KPSau9nhlZ8OlPX51q8Hm5MmfQMVFQKjdccl4ny7W_w9Y7m4WnDPkFoK4ySHFOYjDtenjVllwk0MJIOVjNMtNcTw8e50YIAQiX_aRt3MdsZHc3nYK__KJldXTpLow-O2PsaIy28QTLU9pxQUUwjX5jUt3mdWH90iX1vIRhhrMqFgIY9cjhgjoD70mY4Yeh8x33mSyAzRaFdslMttTND3Gqc8r25421V-pKrBW2RWh8obnQLpyaB2priniRu-Qmo7pYcbq6HpttviXGtx2B2bbIN4-JS9u-arlTeX9Z8lSXTKqhLCObCoK3rYPrV_JT49hhHH-AfnkyFk6biVSVl9DLO6aX0fYob0_07Y-bvAqHtGpcPLbNSe5Ct6JkzoG_4i8EidPvtspqGTuRhgrvwvWS8X9iPp0JiBMOO9HvsbGYNczYNdL7E73ZkxDD02iMZtnF1NeS1Mtq22FXnWu6Ft2ynGzoxDwNgC2Eeo2qC7mjy-w-rJ1TJ3bAmZGQZqqW5S1Do1r4i1I5HO1sDT15YJ8jeuFJVTLZ6BJATlbi1nbgWfny5O2Bq4MOGQRClC5-xwlxlCiI_ZbOMFrGGIDF0PzuEoCVU9CxVYX7BTyVjVX6Ure6azeSGerb4F0qEbnr_eXcJfZqVPfHd4kSFJd4QeIlqnkpL_TtbMBpoE-JW0l6ix_y3WRTFPnsZtRjGAcg0m3lCsfbTRh88WP1wStx_JV-nbaDty6jyxYAYOtw12Bgs3Fw6dCHGawYcPNFBvFgDp2_P1u5VPYSiQk_MLXhBV6K_w3PlsCx1B0FdgXuNLlP5KtjpPC-Ln-gshqN7F96NyyopXF8-GpI2Wd0lwkcPDB3V79Wg5LNB0Jn5HEqWKhDTEjYaVKG3PWSzQ1zzb-9yKjHSTyO1Ar7lWWn2dlPxdx8-DZENEFP8J9OnyWCqQPk-CA5wOqat6eX632mQZljXV4CXNK0Bfrm4LWgouGgDxSCjKxQ2mCIPtwT7I51SRqLnLPoFLhZqcwU_zkiWGBYbJD6L9eRBz1NNrJhCkEeyx831A7CVf6PniLLPP2yOr7HBxbLSF9V_FSPcfOHV2hAp3JJ8YD-U0AqaOmvDUdAHUbcqVd0C395pAr1aWXxFqHHrtA2oFfKtnZX_1My1SSG49F0CymS0rj5vyvamP2oWAsZvCaRmzZvkqtdi0bVXsLrAHButcvUcuZaV8KdbiueheP5Ghyh6pJSsy4ZJviIWGPXR_Vp2hOg2GpjUvXsSZe4EAOjKczX9XAP71Tza-Ze7G2tFwJgptLz97RN00IsYhbSSLVFQv4he2gZWLZNqwKocDsw--bO3F6JD8EqOjJWwlAKFTsMV0ZSnECWJW1Xe8RmUu8665ttD-SdWpL8graVDJy6hlSpPK3EHOe-uNdFiWp7yPeyUtRXXm9lkg_xa3Krak04w-6dKc5OT9dhQnvUmgG10GqEB78bIOYMlq3uSH59pbjzeuKdlai38p7fLUJuYUF6GQfMY5zdIy2n5T6tni2s0tboSWWTXMBWKuRPRmhW4knsxqWooP0vI6eO9v2hNm1PP8pmM3RYoIsdrftQ37T9PBJLQ0p1QHEaPs2P5XGJvvoEoGieQdWo_14i6IDvyQMVbxAIUeYA9cbvV1cxrGwfIQj91rszZf__C_LVRvTGuMxqXag5WMtJgO4_PQ8CxzwoaYd72xNb4R4fBeX3dvI9OWNNCHHXD1QLhWIpAV4Hwidf3qPPwNC2oUr3O0lW9gimA12hFjg64WS7J_RvHPSWzLHt4-vNUp-szSRbC3MjYFA_oezf-4IxT0T9HDKh6gsye5wH7nJOjGnk0ApVMVTmfNKbQiOzsjYxNvEsQ9f6pY3zpQHbcq-sX6YCwKSAF8ARpYUww-vifOQvskeksL0d_47tF7rkK7w7hVwjre6O5-pkn3WZqBgW_Rptk01ouwn2EjFp1K_mP7qVPJLnQNORACG_uGh9AMxODpYDkzzv1dv-ijkNtAATD6qRTixIdHPmIgXnxGG399vesz3psllLt__LtPVLKlJWhol7TnqxwK0wHhrZRaGcu3HuCVjIWFiy80DzxcTZV5GYv4KgdQHIy8ezWKTwSKVzjb2KCheMsbCkKBkg3gtC43CH9R414KcxJfooAcm7HKzhNy6nu4DjnqmtApulNkJGYFjOqyIsuc_eR96yXX1Vzj_LiPeayWYKdgy4MXRMbZn_Urvz8_nMmA1c2STkSm3pyUUTHaHxviv_sNbgikxYld1E43xJ-qG3U1BAhrnZfsuXlSQ-cGWMoAl4xwRqVb4Kie6TuV_cJi8x9dwK-39-luqEOqgxCttNPGxFL7nzNHcqbm5lNDFcUYTqVgYKvBX1ydx2IPtZBAWqry0HtssDCMrqQrrhqZzNqv3JVaZOj8LHEPa4OaKm_wmj3LLnPpHs2hg13MsFwi8bJS61FaNPK8WgqiC75OEIE65wn_pqVH4_XxQC-xoj6eHOqDNQlTig9568tmb-wpc6g91jH1ATz1ZQUU2Da5eepX00rWsLxtqR2WgbnLCRioln6Y_N21bsg5zIJxr1SUrGaJGh_hw3LhTckVSL6P5Ux8FEDcA_dICtEjh814g1lBse-h6KCsnF47DgthC_5PCu5bnTSofIknxWTjbbwInjO5WlcRxyMIy-pXVA0DsDAqgS8qoj4oi5M_tRALA7zqR94ASttYmM2dRQL6jl4sj0c6bYOLxPW7RSZcd0BAXoEuaPkwy4T-iDC3Jpm6D3VDMPH2CumfvCtdCuncP-TfXtyTfi90jaiBw_ohihhp_jvHG82fWjJyyBUdWhXnaNgEbZgFVQ3ccqqJPf27Ob18-zbvKZiLxpkA7_sPp6Z0fjjBvAHuYkpjpdV3oZhgub_UVmLzGLlIVCJBADUGXMXIRhcXGUZNKOepELJu8lVdlgJSZQ6bfqyOmL_4w8oki_KZdplc5E_DjWELCS4OaWoRmd_xXITp66-b6ApATl2WoMwIrowkPd7R9A9N9Z3gjg2z8X9dQb2913iB5S6z21gcX2CiQROUC7Rcp7yaWf_zAc1EZvj44HFuWdIIxbmJkPqIxr5yGNwQDQyjV3TLbjiZndtc9TGM7KbolnXTXNybOlFN_aRRX-zGz1Sk2oEleKLalaRCTJaomawU8KVg_1NR3mPTMMXtyAk8hx87jJae_B8SxRe47_ZN66vcR9TO71e5PzwgF_Mg7Hbu5gfKUOawql4dojnmYpJVjpe9_fMk-V6i24W8eozclqO74BC-ZajZfwuLwmbt-8HkITi_orjHPIuymcc2UCChD8SvQJneQZoCnkVzcnx86QAGDZsdt5Uz_tmdOJvy10pCWo-jC9VBTirwdGfNIvztE-FGCBFSJLM3NmCcoqiFkITY6K8rYcZd2rS_F35t0R2s5thbTZFiu0MAdoZYeydmj_OIg-3j6eOhVhh1DPw6OIkGGxEad6SRtT9llencY-2vSaeTYTcr-5JWfphgXXgDSRn-UJwjy4qx232810A5n4re95KxNirwnfx2Ky_b-dh7UMhOpMDu-2qG6WsfGeRSXtqeRlC8Rcp7gaByMzlma6buELzCIQI8Gc3DfIHeXwd4tyTMWqz6mjy-k01k72Wy9j-TmCFn47dKm3XQCBftNQvgWeyKflRwZk_xhi1p6gVklVPN04B9HOS4lffEMOERRHE2Q-WJfgfHgJ2SyNqB_VUDJvKow7P6UgvcN8yRdFNfCiMfXZQ8yOO2RHimtoHCiewxIz2ufp6n4VeKoGDFQMPqS1darv8PEfbcLgw4mLo2SnJMXPE1VQ1d2SuL9HDGO923_6Kq1H6QZoWTClmXOatkqeMn5kvvZyvgbvn05nFv3UxR84Dd7JjqEZm4sanhM_iasPRnTZWVnTMKTTIDueldjJ90IIJ9Cb0dT-4SnHcjP6fhSeRlgtXHNY6qJyrkPI1XhhN_5QOTmQfB8sdiChp0P_M1DcBA0ElbqElMA6hqVH_3B365CQh-sOn7afdtdOiUlyUmr6-N7hKtJaI7kN9-OOFxuz2MDu9FEjfdutrmA3uDD_2wEqqyDMlXTCP3zIw_FDXCbrbFVfBklZjkBzFmTWbZJucVxW8ddlAvlED2PmBnstRB1kDaBii-tknUk_Vafmbj7G3xax45x8kswHS-OCxCJflNHyq_nc5BzyayhNesbO-4c3BU4gRPc7putQmmCYfrn-IDeqpwu840ug0Wnm5AEwi2dnbA__JVYlMHus2yvNMyaAexH5OhyLS6isXDoKhExjHG3cswzSmTIlk5brYD6jbOXyZlxyTPlmPoLIlwrcSbFpD7qGVrK0_6rDlaInpHNgA8YmYH2xRb3dAvR4s3DrOyuvIE_7GV3it85paDqT0neNiN9RBj2tAWFmtNOnCEnkJ1xinN6kk9toih9QsbW2yBG4ebwEI_uRg8eKPPJoAqD1P-_7aNyTWfCuDHCF7AL8yWRf4tL5UcTryU9z39Ep9_7Tv3qziSV9EHEAC4AACGebPQcJq18Hwa6XAr8HXec8kFJ4QbbEXqwhZT0ITrNq6Tiwe7xix6KpqFPJIYRUVfJQydjKaCTNVRPL3J9dqJNVZi9fsbUkZahSiMn2CmQQ794EM-x63bjhqWQgYnmRce0dbhBNV7zEtc0okG2gWGiq3ztkqdjmXgqISBOdFfK2k-lRDgWirj9X-olH4gNT-tAhwS8O8DVFRNwlfcPGioDxIyF7t3SuMSJPBHMmZ4v5w30VF94iHjiTMuwz4hb6SMDMC3P9xCPs6X-6eTMyD_FCad-1Vf1HEEOqJ73dAQdOOVsCTk2bpGX7JneYEBGcA9-NQZ9MY_E263Q2Do14t0CLCzZ3HYQucbhJVueE_p4pRVzkq6VhGsxmFmJ52iTW8_8I8r5wDSBto0FQ0mzz8i6JPyfuoeGKaX-Jzli8GNNImjr1PXqIJsw769BXDr--VGsLKrmw61z7SLZJQ4NEPYpJb7aq-T6KAVCFuCCHphye4qQgG54qH53-tIK7fj5-2JOBNGwFFG1hnKp5_L6PBVsDeu3u9ihU_f8ZrUtqdttQWTqeIgNmATZTnIsTdB2tsd9OiNa4RIkjomn9e64oS92oP08Cxrh5xKiIIUysqGm2cFRDe4Otv5ovdwvJT52DIYvY4QkhLemzeJNnFsKqySr_iaGs93t7kbSpZYF9cXcllAWg5mVApVeyCcohbPgD3UbdY6Z_sxkHpqP7fFherOHoOWz7wZgEFp4aNJgZ7SIXnkSDL-WWdYjAVKolF-fe1qbEJZByG-birnVqTGMKexmsBGh2ANQzHmMm7krDZa-pvyPx6fRsZhkVP0Lxx7cD63T8wcx8L0n6NMenLwSUTDI1bE1dOuNTnD3VJQa_m6LoSKNSvab5NxRLI_2SAzl1B0W72W_IzPEzhnPslnOF-UuGJx-5O0g-4ENx_JSSVXXDLKPAouYL_rH2bjdHg4JelmocTWgyVDolzzZTC3lFeFdQwcM1GBy8n5KUTOLr4NJ5oElZvplfwhxlMAQ8ySpNfvjYjFmlnuWA701agmo_1AMH6mF9mD9BCQ90cIDFHCD8D61UXy-NMok7qchAAR5bsAJ_OcLSMN8KYC6ZQtnFHRuOZrDndu8EfZZEB5TRahSy4LVQJfmr7dHHI-z0DlFwUmD-C8fkzj_-isLNnf5hcVgaNHK8obwGjkz2LDGCRP7PPeC1DDySqxbcKLXE_LcdjiSZZKIsf-rwjzADHqeOJ-y-ig41V7ChHojaNrXzaM9mycnAhTwk40RB6YdIbWeyrwvb4eG7BA6tmwxo8tZgMf3dGriu3osco01mLiAhXfJFXK4BNsCG806ZLcIZDzm9d4LpIp71qSTmKcgbBCR7IOXiy5fuE3U8NDLfEd5RjtN1sWaBzgPcJllAxnuQJMjhPhvycwseWVUvo_qM6Z0DEmSp2LASESS03ufAQZXOB4enflO5b6ENhLlTit0pdqlrLFEW3Q2-Sx15KSgdJb11NKy6wkpgnqQP7hMlcxNvC-65nSHd0smftWrTv6S_d27KmZVO09LWTty3hdERT7upAkKhnEw8vve_wiCc9MnSL2gs_q-azpFXnD0zAjGLkT86cCENCMvJ7Ik__buWyd9ZSmsbUZVobR9ZaGF9HT-KKmxDyIR9_xRM1yBGLk22I9cMVc-neK-5X9yyZipx3YQLofJWhTLTM-plY3QZxXYmuc13mtqr_QhTq60v7GC-Y9GrkXWYZyS2otkoSSgb0JTkZtlGfX9ctP_u2_0x9lEM7ustJmJfMjvDtOec8ofWrWRtKA7bh1OOgarz9yN-DHKpNMr3hm3eoltoDjfzLXSjm8PZ6vRQlSPVVoTt68r1v6BkiatyPXElsbCI8qySW5EewZuilT05CafMZex4OTPQaq70GbXCFlohpUhJSd6Ot4MNIajZweAv9qe_tz7e-_pBYqIo7kfY5png5fA6ZxImW9J9fZyiwReaMwjRvSmxqD9tk_jIE4usIjGqu00VP7RJV__ul4s67c1e1ghHiJE1q_qvPeHVMsfXi-Bqj0QdJhMVJoCWfWhPu9u-hNIrgHBvO-MUSs8BtdntDIDqJEdcdL-BQIGABbhVyCS2-hzZkQrhaFjehHD2Mlq26EcXL4FP-vZfa3zEekVF38auFKPzB24iftRAUo7LunAPPQ744CXJdYsnZTWO9gpH5mPs7bekjbRY5IMT8p7UBkuosLvyXyFIieBhAXrJ5J8SqrwHCpwHeDQ1Q_K-R52PH3TVKTs0yi3GpbFCsbFwEMZ0t6dpW6YCh5pPa2ZzhHTXHLHvQvGcdhh5_3VBWmu7CcOxuf6V8rF_spngBGbvEncMsBEqH3S4VYZBPHJUHuXFtWxx8vEbBFRxyOHl5Cw6Do0C59laVWrZ3uOz2yYXIHAfZ1qEjajO7wlVDZbHjjEtOe5eQElElTD3d-sNYiVx9-MtDTbch6Pc5J4LJi1cLdfVn0e41xOJ2dbUu8cumPwn-wv2XD8F0xoUeYCIZY-nTjxflBHwKq3qH5VNRYJn1eHQqFeSNI75iIgtQ4DwJs_DhbVXz2Z_jr7xVnunkPoMCE07t2R9cRxzOSk0NL7NM9sw15FLvHotmWaBJDVRxW39y5ANmz7dUP5gVZY6GfWBXAz-uhgm13HShxjwEdfa_MOGMD6MO83M2bNRtKVGJ4MnLpqmqEID-dcHqVD3E6-HR5TNnSBQW9ZDKpIlSCr1tDzqqG49O1iQVGWRZXfYx4-yh7tCbPkjuDhPGVWFt0ZW6eE8SI9cK1emwP16St8DT_5aQuvJEcCrYmi4PeU_vmNErllbXh_7vwwQMVu37VQwO9dHqCw4xJnmUbks0Oyijb8EgEO_HZvgHssGFo1g3QpddlJrULfQhxg59z0KMuLSyPcCDO5VbkdcAf0HpL0ajJasOaGHxsTETGWOdXMUY1YBJeBvCuquQPaiw1hDHLzgCHZuzb1xhCcUvuXwFpxNDel5VKwAM99zNfFRELg8iGlb4NBLohNIxMsETTb15wu0VmoSWx2gksJLdgNCYin3jPaCYDa_IjDWZpgXGMniXd5iEpbwJAsEXd1H68_SQQpqHDYeCFSgJIcvCkVh4TrQmeR6NR_ubsugjeUN5mGPVouZYHaLq6kS-5R10nJgtHq6P38UV1WUDXdl40a264RcftFSY2eMsPOq9aYU0FeTs9RVHKBHQSejWhPk27cKKGJB2XfkcqWyHb58QdFWlZMW9H_msf_j5k7YmGeOShkhvx505DH64OdG3i-6RiSK8aR1R7jy2j3SLUBqbemJpavlIF4mD6JaimwovBmCcTwWeebDLm1dlb0IHcRc3IV1G1Xx2KCTnA84pgG1L4q0ESSFRE2wNwK-QR_trAil7jdQyWVYwQlZAUrMWTve3n5xXA2yWYLy1Qtre-RywgLzfWJs4tuyg6SqnYIN_YDC2LysUkZ2qHdq2gLWpZ1vaLZuYZal-Yo3SBd2QOUJrYGhUx2WubYu9D2cfPlEF27ZueZMVwIIY4fdd0M2Pzg4RyrunciNyPbxJaOniMC_Rj_4r7LfHyePUOJi8C5kWZ-iJ1iA_srtR_ML_5S60Q-oKWY-k1ik_u2PG7wEAvy4A8L81BBwoNbEiW5-lo21pl0F2rL-wsKEHv7sOAGJ5T_j1FHz1uhHAClSejNcViaNfeeBvX3N9rD_CuWai25ttpOIBWCy9ARLdZHoI3aFul98HD2-FhykJdsWD-zdz598onRmfZreCcsZlkSKGayFdLItSk5rRNy4oaldFog2issLqxE1KqqZnKbfKpq-f5SwXsY0MIetgLaOdw8n6N8uiB-1jM5heCygqSoPZqJIV68s4EHAngvNKM-GjspaA2DIAJ_bOXo5_h5E4_qNbMTadRJ08epQOwxoRk2oZtHkRyqYmw12fcos532RoexOVJRwyWVLgxQo-hWf9cfV9Fsr2-hoc8bm_zJTaAs8y0Hqpblb9PteXtX2f-JvZu1W_LaRoCnb65su1pp1y8wXm2eQT8VlHZwFLdaHVz_uQsNao-wob4N5e0jhXqPqTZxzCfn-kMlerdVq8F0uLRnka-YMZRsqmp-9pyqepR1zsq8SccJgo8-obk_YH93C9TIG8cj8ZTWGuwYgsV-pZTKjs59wcWX56Pp45RXJZkQK-wjmD-8X_NcERGI8tKKTLLkL0eQ3FN3YujVqkuGtsH14G10tl6vLS5JSHJN4HCyM7aeeFBao96uyAO7xgeB1K_n_bxejzm7vyJMsJvxDs1-4E01bll19r67QFXNrJGZ9tpfet3ASVvqyzgy7L50qMtlvTt57fxC4iNiyr9MKIy9J7CsrpzYb3nvIca3ke2Y1zdoU9exldql8qDJngO0AuY2zC1IPtxmGeGiiPqnewzh8uRJzs0AM13ZpFQzIhEqGuYBYp-jqKvSXgucGNhfAMGM21DQyzLCJJDEyG7Jc76PJtHD2rAqtvL3uRjQWvUaQDMstMWBSv1kIeyWbcR8_1SWkHk5E9gaZx_rmsfWYhmpUCfNGKyoXeFkOHW6axZRrQsMdcL2c5mQtLLRHYRz6pL8MbsvXXMrQ2a6CpNI8TJCxWJP5h09TIvVO_ZXkyzfPzOy9eWdVWDPJZjXGmGDW6yLZP-NGy-mi3wm5-8cWXFlr3v9pfDN8fENPLR0ndKTEZswm5ZhCn8P7XMr0Xcl3dxwtvK2pNYFrxjYIOiaxxs-NtJ6Fsd2WQ3lF-qqrZ9TNPlYW2kbjlkvd3ukuDnA78qLA6DiyfCFrbPh6Emn8-cJcF77iWe5Q5awSi7A5T3RdnqQf-NYSW1sf3iAUA9CNSZyNLe29F904ARWtaDf5fT21rz11QuPpP70-bluhQmzYilkwyI3OC_Lwr2bu5bl4HKv52JxNzHRwYN-LFuNsrtsyVdSy9-3xMeInVuA-PTeD095MuMFGP3A1f1OcPjvpXk_qIHoUCAg7peXUKYvTOeR6IN_aKrcOUvfgvFaEQApErVvMmtBeEG7n4-8wK38FxFpIWt_bvNwMBoFJbbeN5b2eneM_Bd6hN8V3vownS37ZsH88mcL7IoWwOZsuKMUr20Syl-r6Vx6ETptpkMIHrruwpCMGRnlRJI7vNxuX6GNuj10ztfEUWiNhn_Ce4Gg4vdcuwnjBAtRp5s8mMXacz9DWx8YMWvowGVqDF74-Cvn6uHGAmfy5hKQYf6mUluhY6QVYJfHRBAmwkhJ5XNN0_7fDEnCQyv33MyhMveCWYyqHyKDcDyVpSgAcKSZvV5dWgYb5XDrjBsUCfB5L4uLxwmX2zJCFevHRAX81jIAwoYHkCLggNWoQlv8x1R-aBcwrdewIxKuiUL0eHIfh6kVsJUDCMsuxP-IzGMk4erPQwnHyrwLnP0N7DLfvdEchP53XaYQFnTyLfXroRRKa2ybaFDQ7lndQQyUNQ6V4zFWtyDv6uZocMx5Wz7z6KQ-J5TaszXau2_NV-0Kwg644gLm3oaBAs8RzsRrUkxn9P2EYAq9wtFhjcK5EJgig6zBUwoINj8RQ7oF3Q2JtRHrEDs4fqmP2WpFK7Io96gufsl_kIfwDT0qHeJu7jUWisnJPls1ik-1qyxOaYz27od795m9f2loTEQCUVR3BGe3LyzCSsLCGJng7kKMbkWjBsVR9DK2uBJ9qbRCIBCu-Sgw2_AWe_akjNhGr4IpZm15h8I3a-AB56KW4JQiKANoAnsOXHjvKHQXTmfLA1MQTBy7_8yIYClBKrYtijMjxQEPgfrNl68--L2e-X8wbZatK63leSMGfAW8PBM2t1fXlmLjYHtlt2TPlGITeB3r-o6OW3MOyWamndcPezw8ueviF25CYeTcf5Mi5lzk6h8FVWRdT-5ZOynisg5cQzh-Cab1Z4BlOf8uZb_aOdGUY6i1Yk6UIZXJAk4sXB8AfZBivvbyY8Vs_s0R5qkshJlW73tO0khYQMX8B4v9P0CJTY6JAd3TERPorDVyWzHeAbxnmo1Bpjy7akTOXo_4G1gFbTy_VTE-ThsHNuOF267oZIhHm9-ifVooaUxGJkAXcIbdMhZNLN9D-GVZ0ikDoiNSv6VxwWkqUH-345hqo5BrZLa_ybpXGP7ycoPsPXbFnPVg4j5A2luIApiSk2adS5SodOFxBaqE9ejbf5Fy7fA--aCPyc15_VD9L09lVCpWDrDaWw3cbuc0oTSoDL1yrxZh49ogSscJzOnjFogeJBt6HV4Emjq_M0U4STE3ZHiHurj8RjkB0t28I3oBE5BrqlxYFjyyBVSFESWSNWUVkoZWP0afnrRLLOGqVPWn9KgcMw05qFWef74e676DsbjmqWFW_fp30YW--KP_4NTxToyO5QZAG6Pbls3HAElh2o-cdzKxnQRIKunLaR7XK69J5J_UCvmcP8h4zL8ZF2q7SjkBkmCfrSdowG607eIQf_Glsi00dXq5bqhcfPBL42wb_K2GEjDVIn63-YhSeibWAyrvUMN09OiYzALFbgLFZtxhPX9KBrvsffEgABrSrtROmjvF2zjRd5Gfme74G0DX4W078z2-1b-_503wKLUqo3n3oAJ1zY47sQXNvDZxYub_QWdJE0RUBLOaRVkl21J7EwQDlGB8ifMSVo5N4JRnJKr4RLh77IXWSXqCs7K1MNKeOCe8k64LNXRyDXqi50UaQILq3Q97X02Tmb8oxc1pIqZs2ZWglnaE9c7UOfXsGAPB1qaDPlgO3mKYfjLfIHr0lLpS1LZ8lsR7LNY5iP5xDSr-UaD30Q-PWUtViuZGKPxWNRVPFRheS225Nr7_GhxIwcwx3zqsj3F4kqsmG8suyVLS1fa98WSaRrdUtrd4eHwbYtpL9BELs2MTvu4ghzQL9LibdYo453HLWAjRNZHZz3Cbiao-fB2QAzAXg2hicTFOlmJDQHeuN5vu5Yx61yFzR7rnm55JXu2N3V0ISYcCCnbCfMonEE1RxOkLkeBVt2an6gkduvzbVuByQhs-TbalEg_wgOPd9BXU-6V9J933xFvbXwcFD-SITNRZRkPonIr77HWCgrWDSwENiUsVpgHWmIVNDL-hXubh5sakDLVa4N_vCViRrBzJ8e-WAv2AUeOLPr8OaYqiKne54xuc3FS5rzrtacCb2hDALOE_anPypo2hPWX_ntv_Y3KCJEazOkpapK1W6vD7dVLGx6jbnXEqhWI1MF70h-iK58VnV3hPS5i0mUZklujOILePbk6sgRoHlvtwirzzMLDdx79JiD4-e9qNuXhVAS-xKaHlxuL02GZ8VZkB3yrLbqo1IsRKo00QaQjo2C78usVZOcwBZyLKGIoZ85p5ipo3v1dVVYJAXJzKLCyApXcY8p6Zq8rUiO9kixXFKHrtS4s5U9lBhEy9HpDjUSt8tDmNoODoT9FGNcZuder05f_QW7t7AjMtWp40-dasVXYmy097zjKHpEtKVgZPKeM8KlYSV1HKl7ANkAY89SdE76DNuIwovtw888A_-hizSmwfNYZIehyvSzSSYcz12s2yv8uC2MW48SJlAECbwyCAXmv2CYrjf3zVLp7mY7TM_xt6-f61HIO_4k8x_EsWUTAJwqkvPARxRCnhNvgzIyYXtJvmDkaDsnA-jputNnOQY6qcWqUuWETQMcZP96qMjsvAf0pkJ1HyxS0IAwZwdPSNe7LGvWveAEKBpBz_2W4pS5BpPbZ0r0gBtA_9ZbxmsyV3-sAf-ePuI--oysYEDAx1MOHXDuOo6S5BllfkqlnnIZcJOX39i_e-l2HrOBLESjLcNWcRm9Ej552YHZmGNyX7V0P_4ZHuzDa3iOAu-bfeUu36E-m4h58dfidZsfSkUr29TMwA4X8mB_CCywRapVeLnKQnMDZwyEpcH07IjesBB--btxfacylzaQi7ZT9v2HJv68R1u5xAx8m59PgreqbTfRDBCi6_672-iqRBNwlo7ocUtHxI_PWQ5gw6cfB6tRxKKf9zhRMhoAcNJYoXpCxGWW7zGEuYWBIN0rHHN8CrPjwYcNcIKVcmPnQ427c9alrdqgsHodHlTTnNBDL5L6JlSBFYPojnmixU0v_ovH4TbykCdU_zKxtD7ozfVZSllMwvn_K7AijhixShve-OnZPzk_I-JwgX7S6InKd9JXNyHvVUcRfl2EmqDRqO7DXYZglUBTowRwkWrV2IA1ty4pNhrqLCbu4Hh2MGSfKuDOFLlFERKCFc9mpLEB9-okeonEubbnR1Va3SoSSY4ZEGRvj7YNfXDpjm4ynP1Qf0qg4YbGYxLxuQBucI5sU9hmEguDHQM8lXXN0XESkKZf85wcwy878lMncDagVjMCVjNJ3rQYwtsvF8MJ2-NvIUzdxRpQ3E8Zuck-i71ID0OzApqWdqpc_TTcTHxVrWM7yKJez-2DSMmTcErapIUxzqKmltFDJN370z6vpQU83isGosEanl7oNGhlVdkOEWlQ7nuSCFejorBSaKA0vCiv5Dqx3KszhxkwiATrkp0exMsTb0PbBHBsrWiHdCgXqSwGWukU9xWyj1xBJeJzbxDEfLWMgw0_V7JtJXSgRhvQpp7UR0tnMCU72W1wUDZxY4-KLEExO_D5DuwO1L2oJow7aoBUblR9MfaPPSBrzGfzSRKrbObA0m_287lQTsLKRfVtUnTpOxG2--sQB0lPBeeUy3IeA6qIXQIFFy1dl7JUCUwDiGHu8JWBwbsMYuH_RrrhCaxZ0gMzJIl_zjegW8xOOMUYC79mCBkfQk7UJ9hpbZiTdLClBEb7imXJ0o21XOQrktOHQP8nhFi9ojeBsGny3_1m1y2CQVrx2ZKMd1RdEH5xX0RypnDGgafx6t7O_7Gyv9vm-nT2IbH8v67eolH1QznnbrHiCgH8eFzVEX_rSF_yIYT7keogrow4HUTIAkngGRWvXFDi5jKLja-ZpKELimrPROoEAVikI1EB22IwinqyUcYr-S2PUxK0Tk0tYKUyDphyqyxgtLZtMHNA7Um2H-zOzq31U1nMdyw9YBA5VePeCpFqOkQ9YB0NjZm-pHUr7pUxW-6spHyBxvqVzzlqStIXfbVcUuP0_1IPkloc0esgZJ1a5nKebYIbBx5wVQW88R4dnfs_uunJCDDjfjCl2MOmWdC53GgeOrpLQmaRAO1evbIB8Yhi1O_mCT0jT_8l94g7hAsASNyNY7jDClIc6fmmtcdJ2JjL8yJi0r0mvGFnMRk1qW9hUc_VbOPW_jVDiRwGlMJMKscV2a_UkrAjPKgogbQaWVJpMqhb7ow2jQNwVe1TksrAs52Eb18mb6q7ZCzfmL8ze9y7CJbk-A1ecVkm9c3hqEKwBU2eOvMOTChOu_007_MP5G8lTxkcvRvl-2EhGYaH1PoE2t9zAN63Cdtn6-eelOP99kQpc5lGdsep2Z9oAatqJgVUizZjsxv7yOKvVAuy8hpmHLevfVydXAZkeeqjSjRlT9BOqII2F9dZF4L2qrvsDbh0yBj3flUeFfitbN_IrcmbwhXDvXv0Vq4Ca0SXL2rI3dJyKubT86Vfx85494UJX2OeSwMT1xyDz_w4HNdQb-muHiXlNHKuD1l6eccZ-L-WlUBPQReFM067sOvN2tHZELU0zO1sM9doe0GyhISxEM-n0m7LyjotfrhLDIzuac_psznxjLw8WRh5LphI0Iq_AFDhnjp37lZ-y103inkKXvJS63j917Qi_-Xo7ziK015i_rExWL40MmihbixJyODJUQgkfFLToqYj_Qq1X5Lhd--Po2VvQRO4Yec4U4T7ubbpdODGjoiZ0UNmia26w_jmoxn6PkXBRTZfe2MwMQVF6VduDZtnt3r1avSRYu4YcE-KFcBqZO7eM_46UWrQSnUc8yDwV4D9p64scMyBaLln8ZHaIw2GJn84fvweQD_jZk6RoRGMNmbTEdswPh7Ic2Gq0fN1N5CXSf2xfFfSaF-1rlzXHWkcSiPDkrfA-h7K0qXQLurgSQU0p1ccOwpmXYplKy3QYwnsoatkCYAKssREwOVZIr81iqddOsFPZcnx3i9HWGTTpaUvrKLlJ897wzH7-bavu_7ZgHuUry7JVlLDkHVnwWKe8oHyKYCVfp6PYT6bkbxp2GgOaT4lLRW-4OHZaQbogtMU0aHeSGNKTE3R0mam8VkHe940XtmhtE9s0L2aaxSNbkMYROyq88m_WKm0U5LlFB5V2IBt4zpQJvkPmUgYKfeQhD4oJtS3s5fhO4XoZhITr4w_uIkcqCRIKs6i6iLYbROB5PGLLar-XJjBUaUQ5Ytyc2hiv1QypyIZdn6lLvWVEnKxaIwXLN6L8GRYLjmxYTPD2kKJ4vijwKEfd7o98FukK3yDKEt4zRgRLN5xn9fDYJHAp4c2pxSIbmv2vnJ04Tge7kSrrhYqAKRh2r6kUa25vkMAThEHohfS_YB0ZLUSAvgsVyHmYM2-hfh-2Xuctv1lIR7uLH281XMtWFz96bd6TtIW1P5_XYFSeLjfzMWcZI0dZcMPdY0Q9LT0wmoEuurjaWU_L662h2gSDhayxfzkgX-s0hEw5CJCvg7RWbcshWNwkr50-sRyFVXaWt7PT55cWVqj7Hd8S-VVa4G9LuQuJytnx_BR95Tk5XRYW1AauUqlh9TjT0bWJhFtuHr2UiJ-v-iu4fmzSbouAQOHYellCPLVVP2ika3V3WP7YPRMo4yA1SO5XYd0_RFcwIXSI0Xj-zOkJpbqj2FonJW-uq9JccDZ1WIhv-jWYL9KZGL0X6klNGOphM8dGYMYXmxYWKA9VWJnbATQ-tlJ60M7p_Ajnx50Gj9I6dI21KgifHiqOaQqsSjy-p-yObnpTqFiuk47nMakGSCoUV4slUeLDx6o6eFOoWyWb5O3atL8DLMlDzSND0jOF_CsjSqgQXFOXb8N2IXRJZ0bN8qAqNOfOxU9COVosNSSkqVJBper_oEqTw35-wrQxWcIRIERdNr4v0qGIwW3DwXuYFKtzDdW_tP1_tjEHmfJdcyORxaqOcDTnx3Bn67fbymrRhz-hpkO51F7T1BnEwKOjd8cDq_AZJdiPGqXRp3Y5r5oyuhK90j6tpUKaLQUI7CTm4t7xTwfSg-m9fvl0DVIh1jQqKed1ntcN2sY5yPu3SylOmrgeY_aPdr-U3cSwyGnilsb4ih08xh04cw-fKso_YvUlKOHGlPFE4QV759ebFEabVxRJZgnwJ_YNtrohGoosEdOoPwvmnNFnaclVj_1D82ZyQdWU84bpvv-elPDgw26rA2DNXzyvGoBqckUcHLpch0_aRuLasNnEnG_gprQjErbZKnagCx1FVPuT03aoPpvbmvyswcN8-CJtuUdisHlIngIlNsnHQymqWGphYMhdEu_FFELsCw1OO98K-z8wDDdW7bJ9g21MDOj8jvUurYg7nQzvwwA32at2s5n0YDKTqvJj12Gbsy6x6Y3KgokTJYWrIOCs6YEMNs0nmijvVtgMbKXlOdnKmBxsVz9AJUQBSeak8SjEGhhAJovhGUfCT7qurWT9k9yhE46QF8CGarFPHLXP13whaqxFV1eQGLT9N9iKe4Sj5YQR5pDs6OgcPXuwCcI_SsnF75aqGvY0hbalQRVRUqYFW_eE0nUu8P2kvFr4DcNORCvLDDHuTFxcFOcwGAjGeFgJdu5W4BfSOZwmpQMQM_TLnEwmcFTd06xI_H6QjPv6Xie67W8cM6t-nF-4V7LZCqIL0sudQZ30FISyKw-2LwOHkdQOBXek6Ohrvb5RQg1lq1s8slRXeLTY4VNZVBR2ckseDzde9-PQXuko2fILXAZxhmL1jJkKYi4C_mYxPTUwElGj3TkEkiAHKGI07pPluDZcCo3ZHCdrXvsCHrLpOUtNfeBvhNkNDCLGOFQd85k3Ay8ngO_-y8qsQpPNIyU6xL-8b3o84_D0b-tggGv_zvYKPjSW4k97ATzh8WWay0ca107Y-8qqLGoK3yoPL2s-kORrsmtuy4FDVuOa8l1nkTy1J8K3q0KSl_atHdvqbihmgc4FdWXzw4VOnRgdw3UUQRu9yY9McbDycu07RVUXe9RdnB6Ltk71VD5qEAtnns6THAcOyfQ-ZqhuVQmhjcmmhuTK9Bb3COmMuY9ouNvhg1WG4S9RBQ6F9vEpzLRvnYJVHrMrqlfC4fQecpU6oOPHQv_-JElb9Z9VD3nc6ufzGkHQUYkoMgboekKkIvquqCiqKg0QKfOh3ZfU3aOYc8nCkouBbbmT-Uiy4qIbXgZclZEAMVJWdoQvU2EcEbZhzyHr8Ts6VHZPZtUeFvU6kNEAsTa6QtFGxCSHTNg-cgEfvT6Vvx69v0qVltIl6HD2dGG0kwJjAp8bOMg7ZfXcDbudWCVmuIUSgLy8OOe_v0UrIbUuJUNrfGJ04I-5-KewcU4hB_5dRUjiKnvVrm36XjErb_wWImWRFDGoQfgc1YsALEng1i9lThXfIOhWDTYd_otV37G0EkWnDnzW585XLPOBS8b2OwnPW8240D-PJJxTQKwUfRMJjKVKtWlTcwgvxulZUmqekFxHM9HfumsvkQDnTwMbEMbW4DXFNfO8uw2wtSm6KeHNtXEK9TNgorO6dwBeoCZODD5Xcqja9CJbC7isKVK9FQE0kRXAWJtCLPOZe9U2xRQ-QV0gv1d2usmN3TIp1K8VZgx1MHRhVvWLYuRg_sLdp7qD3uZ9M8WM_xN1IpYmGVVKtrHWXanFwmw5x2YbHwqO2aYWv-G4LAg49K6X4uYGiSI7awoZM2kEYwjzRBhG23Wi0-bR3X4KnzO3wXVpUrZyqpuI9o2wmHkc8B9c3ZfUP8d0Z0uvYvn64SOUGz99WmGED3EpUW6WtIWkiQ0nOYGRO-FVaVV-NQUeuyQUyczNREX-Tz7OrPR1xqfbJxbLcYPhYewcRl5yz7B-v257oEa8xcqAqRjyhR1z6nVx4hufYlzR4D0mefL2rBKJS9q3Q0Nox6taYeUUaSlEYlr1_oFiq0XEbobvXaAn3bnHUTRMZCW3MXfHrE_Hf_z2w1XBRpwDPfeUEiwHVAnqbxWuFlJhT8a0ddS3fId3NSW9qmaROylCKrkbWJMiz_ZkSwmcfAImG39Yqf2rzEahHerrW2MdXYnbfG_Z9iFFMTQfvjn1CmTif-HYnnjgRCNBcTUL-hesqNZZ_OJfEPSZzMoWjEJzBEv9fwj8pudQkpoREb8EKCktOG8VSKXuGMfLH_UrJsROVIIyT-_8v1_p1PN3ShkycaCMT4S8e7Z6LwfPs72qD0TPV8YboWN6VF6ohaTfCwIO8CapSyVE1dAbKZVmGjvQKLiYPudVWppb1fsGgfbudVCEjqgwbArr2RoUU6-agFLUa2U-ySlpkLMjRZdZB0karXgIsdMBSgI0zrPNRg6dLzTnZwZtaSyIBbevNZwaluhNLyNOKqbyeeqHfpoOiqzmM0T9NKlX2PlTg6NLUCZ-t94vGQaARX5IDsKs6nvepDi_6eDE4YxX8Be_G7HLBJbVXmZhalYu9b-eeh_KbwDcO3rRRvXJrGC2bpODEjzM88eS3mMOWc28gkDLSqvm4pTreapbU-aQLFSlH4N20BZ5eWw7Yt_EuQ4xKP2qBBenYhdhFxP6YASBWPAGCyTCoeYs7fu-Qzlhc9fK2YuOLG-GpYgpgGc6DFXkBJUQ_-8g5rhLFMkirTRcQPHl27IZfCGvs_AUIuL2O1nH0fJcZlWSqGCSYYn4aV9SRN91RoHttW0NglxGGzHx0M7EGZGkuIe3HBWtvI_WCOudRneZjnFrb3knvnhFJU81uvjdNffqIF04375iyPkwrP3D7Z1iCFWIwzG8QZuZjrXGd9t_9N8OI95dRyGBhBp_Y3Y4DhWRgxx9mselmpMY22mfY5vHtfBVLLDMBQFsCqG3wyIJsOPu4flhIPSV1Z0cD6EFzK91SjIZqIJRbQ8Q514BpmrwGZMrL7_5lRfveedwcmw9QArmvILh-IsQ7ndEICaXzkWXy96biaIRFkS0s6DcJ0XRfb9ReNw_psl8w3S5xa6xz2gGNoOtLiecv8Y-0kVxKwPbCiZkLnhlKvwcigByTVr6M284wA5ZDu9rvS3W7eUNycZYy8opi08vtmbpyNSlr1UEReZqkJfRiBbjtVEQiMqziUcteiGHmxBBsZoTMlx2ihGaMamg8J_KjI-IKyRcHDBPaTk0X4vsEUx_M3lnTeHss38vkbcLfH-eysBFJZW62M6KhS4hjw3mAmUn2SxYCH9UkUsw-XHQ16kzMDUtM0uoqLGVKr-X8n1fxD9W5Lu8DcAostaWOjg8adzGReo0zR5fxr6M1y1AtiHOjhioQWA6yQoSL9flAYM12MBweDg9j842nPoVmDJi6zHEZR0kduS5l4jB7Mp1HW3U2lrAyFqBgrFNbjEr3Im81tZC5Sr_Wq0ZCQxagK5-OpV1Z9EBd0GLbZQ9EnFeuMhfx-gAwxoRAQ7ZswGGImRvY3SJH-GZBPYicHKDuykqOG37Gt79f7zQ9nZnPPz8n6E0b-kNw5xe-gBLZHyoA-hequUrPV1EEMKfZNKmxFXFHFtFiquBPmDcBdlgJslMrqRnifOA3fN6Gc5_6BF5hYr_huXgVtLwPCY4kPvYa2uGMpT1hztmrqldcA8PrPCkARCDrWaIhzkvKm2OpwS9zQEPKiKux8kFHq0pLAoNaSZWibEt8CrfOGAjr1pYnSJvHkHKr1Bic84xmy40LsEn0_d7FfgTaFb6MpS8N7wYsUcgsziQ_oJR01HYW2Eiy-3ZK2msRUJG2aULh3fqeMMmifY2Da7yTyv-OiDYjGaSWCuWeqc-pTiKTfxu_LGJDUW94gVa3-w7rZ3CHLJY85c5lwf1N0r-kRDDX_S4w_1Wl6cO95zLLeaCEEIS-IzVtUl0TPSJaj-ggcRKAFKAL5xT_lHPoYCVhI5RNvTUiVXhRAXRjVf0ypAU1SHD5IOQqayysDheS4aPEkc2BaZgmeAjxobe32OHT_QTTaSlQShZGbYUjJ3W5zy6Gh7WHmSqfI89MMBEYVCbidZkpH920_bznoC51VrzM2nfw0sHJEV9-aUQJhmPBxqfRyXgq6O1Bhk3K5Y3pRBbGlU_Qwii-mhAZHl66QU6bIzv9-OiAZtU10Ilz0oR8xsyT1GkIcZRF6h2YIwbH-bqz7O_vx_h9o9ZE7y9WCtsNdcUcT2usL-S_3Vz57d_yyReoxg0KaxlF4J1-pzLAISww8Qe_wAWKWuzYk80G3J5gE6jIORCivYiqcDWA_5qImwWn7OKIHEB5vWvLR6E2ntyXcTVwIhfol2glk9OUUwwyEoWXoSspUKRxPNm8yar0SAOczWXK0xHoe9U8-IyRoQ8mJS833o5XVUiFFDNtayYxHY5kNmftiRMVXRdkCTnPcMbhiW7b4yhQTG0bbTSvG7THJ_oriP2AzNWNSMbBjHfSLojXsiTg7_K36__tT5bMRVaqLC0IteqmQ6beQgJChu8-OqSdEt8e1NTNI0JK6A1tSGkUcnWiVpQsmeiY2GKmi-0MrUgxYgchk6ni3BZ3X3W8jNJOYKyAxcAXOJTNsMBkv6JEBX0FsCAWwm_0-Je6Nqnv_vJ5m5_3UgyPe1C-5FJ0Fk0xG8Dv7pTe1_JgYP9SKULk0px9LpIxJijWAHEcJu-PNcI5I2V5M2LimaRzBgXJOwbft2LVtgVq--yH3YPHokJ6C01BNMnql2rzumbu657sPQMy1h3qOLQzgAsR3KFFDgOVDIKdtFtju8Ht30D2-ZEH8Jnv9uDwFP6lbIP-79vIjxEywRcextfdX11YOzSXV9sVaE-kOADWit73unmYXTCFrzq-kdIse2Z-clpEHDKSKxfgLzkRjeuy_WyRXj6SBChRIterPrPX74_QMUkrsn_SyxPpcoAAPI0JTftR-_dWUwmB-Fnj2_9ZKzKU7DNIAqRQcVhWm5Oje37UBlC1tWjVuP6FYurJZi9di3rRTs2SfbMxbMwLVyrRxXI02xK1nJEeaze1r53B2GA41VCkmEJx_yjwqRksbqI_i5GZHCj_vNFtwIwCs9mPSQU5AahDWvr7I2dXmykg7uzK_8XqeRcLm4XvLM3kgbRL4AjEk0z_lKdWwGYp9OqdM3k27NHhRDfOJCegmwh8Coui7qfoRYRrFou-00ngurrORHyJGJcFEDfFTsWe7Okt1fICjWkIHmubIH8Bk80Bq7NLriYgYosO80FjC_kAslAVoeGeJMFjRTXkOUHny5GmpGE-Y8ocRefSx6HceWwHWg4AqU9R344e4Z0vlISUttQOHaWgmZlgWBlO_oKbVJjlHvitOAfBsMoBAwtLT8xMHO1QUuBE6A4LW-OWudIwmSUzs5Ad0nlkcBxvL5QBJzcmn4Ek4tH3F5jXedlbadbU4nnbHo8NW3WPmNFuyfe9WMciZxUIhg4q1N3deEM326O0pVSM8PcBmyd0wdgHYNd_aMof6YkNQ4lbPrSri3ERWfL-XLbdNZqFkeEKG-iG3FUR4SzFQO5Os4Q4dqWWR4yf0jiJl-Xvo5-VOphICkHOKQxyKftWj0g2dfbycKG_9078_oFf65iX3k380QSd3Yxlx_6-Wy0_PHegFSfXCHec0Qg9IV49UpTHO0l7-otqM5Q5NJ7FTpOeOwFhEIj2f_NYjhW50M7QaDO1nMkckLkjXW87bASeWMnu_yGvKTCZaJXGmuM7fjrfyJoU5IxPs9ek4FTn6ErjLvVNVbZlN2sd5nhIW5RAMA-3_zHWvCCy-nvcPgzi9SjLQLjpyHqqDpU3COjomAVj2xs6w8kMEdjWwrg_J4k9R5_qDXVghz5ACOYfJKb8AsLdzP2xt5W1Avc3fwI7AyZLHIMySkWwONBkVntM2lsQxdQmjdSiUuP--8KvhqhPnkpuFnhEEOt8UAuPY1EIsiiqFpBHGEBtGtnOoXxaI4zaQ-7jZvs7Lb_s6zs3DCGQx7gecK4NgnZqkPay-yShql_PmLa2FIoOnZNXYZz5Pw_BrmhUuFpXLQc3KqJmVkRHgzuqob-9M6MK598EePwzNikq_d4eT0a8ko1ui5VjBpMByPr0YSv5uYzqcIH27vrKO0_c9rGfBy6CRfzZZ3yjXwYpHPUHkuJTw_JuwQgLhjzQ1e9LtXPcVMFZOHs_wNxJtLd75j9KaJ0bHmdhgdDOcd5dfOuwSO9i__shp8DZXPM32ZhlnAQV2fKsneA_h6HOuhjEXV_x6HgxKxH_Ky4rsT9KIx7nHiHj7SLPTLAF8YTcWq-Q0CbrO4F0rA_SWCCPwUoVC0lb0J5iEMFvnwksf4YaQR0YJIpM8IlUT3CxKbd1LqO5c76DmNnlgJaVInK2DfC4a_5RorsVIZwvehpXhWN0Kt4j98JwBBtRO-1krBaMsR-7_DOYo9xBDqehp60ezVH0YZX8nJeTOeqPywc_eYW7ahKar9VWbSwqOmZ4kjpjIKISHv2Rpl8z21MtqMdCIq3KoQgq3pYU9Sc6qJAg4h8pD0QH0WUO3tzGBzdxIZY6umsJ9A4S3P5O9gBWGFpyK8aW3-t6NaPNCSEgEZ9UAbN-Y7ScC7JxWBtx7zxuErsMduFDbDjX9R8cC4u4dHLB6LwPmNsIr7ymaXzMYWxQeXZwDPCStGECmCEeBJAdSWa1aqb4nihFkByZGO2pHNBVS1O_K_T_m2UFlzUR-BF-3QCuQYX960NQWJdsUph8WW_uEZ_DiMrhqD_OcBpRYGa4e60Nk-xMvUUuwHycZqvF30a_R_lMSgEfsHpPMUKhOB6F1RFoR7m0XS45V3wI3RKT-WfVh6Nx2GkTb0aUMrM4k-9IGiSnVVADABEVK4msIbtKDXDpJ7VyKziX7BSZ-Dh7_T-b0qgDW02D9PqWZKCL8sM27kAsEjVDs49MGJtUSWU8DjnVD0fpvB_VLxLpD9PaGjqRdvcygb5oJdGQEh88Zt1_epdrSjU2iXM1JhGaNC-4aw4wmbssBb1YLzWAxo9MQb6nwurmawlgbAyt-0NZU9n6ji9TfzogHwLRWsoprvt5IOnDvijAmHUDRh7nfWX6VbpYjT5eAAwTJm83KKEglw1BVDJ_Ip_pe18coGHYgh2sH31tS_N0GTbnC4BQNK-JXieXIT1grVhmefkDBt80iFSf7CV0nlCenPhONa12WCrZNTxC61ZeB6NGFPZEsCu9t7ISQ2STy5FwqyBsBquiw4WToEm5m2XTmoFmUJdosjFNkBZmdW-5ZtMO3TB6M9miYUR1kA3EeSYWqSUkayZAvZir_hmXvUH1mRGE1t0iNJgpePF2IKTBSR2gJHwHQ4QJu_efhbmIA9ZqmLJ6Qln64wqRfLtVVo0OPGjqlTw6_1zppHikv9hQAjnuecSfn_XJdkgcVV8W8LeIVofCP6GvTMbdygAID-VKx18bIs3vntFG4_u5J9Udom4hkehQy3BAZ-fjMH_IqK6JyRzTmfrMLji5qFGHNMPxfLdGoZ_6IE3r9YaCBC9RdQcgihaJB0GBkCHU-7aVnqvrptMloh2mbmTjbgvk7I-60kJkd_7pdv0876Iyp5IP9OoJv4c_TnSCkVrzU5Ejek3SDjk_mLdgxtxgHkU2xmcDltnDr0s2_ZLJTQo8E2ZCtdoyt4yX_d1zqPNoGC3jEUmXlZsQ8m6tV_fPdu33v1VRNJk9UW63GEIzcEbwf6ug20fQm1NIrfxoC3gybxH9idDVsu2eADLmZiTWgnOuE5PE1x0B1bEXGVyLgMHeljr_nAlPVFQ0IfCsOLNhm2TFYoZOZ34ZLE9PdkGiTQyusgNqmCQ1bUKKc0HjJLN6nCD8OpkVMN4SuLzxvqSb_VQgF2maNWO85CT4Ge2BtsBJWuK-ltW1eNq_dQ5TW2st4tfHHsixf1ASNdgDZaBpU8uo_Bvh02f9IL3hLpRYkDa8EJxHMf55i7mZrrUl2FXgTO8bH1J4WMlJuIT68UwmJMlqECbn2rk0wZ95DLd83ltqAvT8H44LHq1pJtsntysxgPH80BMqr9wKle8wpNkq_1rQ-tBcKK8w1aAVBKHMeIiAtgJtzWnNi7wRkZT3T_U6Mvndu8AnRO_CTpdN_SKsAMGIGy_CG7k0c-i3gy5MhD6Nwpu4Cq95xS3x7sWYLqIX07lJPB-ZWBjE0k-Zin-5Tar9RBEHb0Zd4lIeURm10L0ELxWocH5PCw7s0xOnAXgD5lR8s5orryzMXpgqF4AljA7AWxhle6J0hhHdGZ1GjgaFtchu_5zp_fmrZf2RYQuGH_YUueoErxwkqggJHgddDfRR42ATdGOMDYxoAYJENsm4y5Vocuio4DfumCjq3IAKYzokBIZtcYxDjI-EmkaRxC1UX-y6s2aFDM-AZQtRxx2DTF3hq9d46sZTC86c8e21Bxx5EPLX3x7GcpGu06VDl2JYF_DAH1rea6Khzp29wYmguKwmM_M-9ATPcFpsYtX5jYC3oUMXG6Q0BcVUQ_xbsn8hZUdBLgunDPcjU_w2qyebI06WQg0YZPj6pd1p26G6pslvWoteg9NMv7OrhwArlqWmZpTdai-XWymgupKaFJnSAAqwePQD8WtfiSKF_P4ybWwwKRP9a3DNrFuVbl14_BOHcWjkp_8qRTXpd8qLfN90eW3MoxAqv7LysB4NyXBIQZ3q6nV-BkoKW6ENB5qmBsWKFNVOK4-P-qwzCOfIuTJ5VO9oqrrDrg7mhpL4FYcRsR5mhtaWyalhdVwFI1ZhbbLuQ77RboMihNTmuvs3GRzrLZE1O41vm2dqy3zn_yQWo-38Gra--_a4TqWooaOX5bAj53p6X27rUNNmQxlK91Es2RjCrULE_JUMxR3pvz8DFY5vJt8x33fSdXUwNAYOOl35wd-wpSvF0wRJadHsM-Bb111CQkpB-bpRfePLqj91qVH3WH0XZNC9k6YioPhH_xLL9sUKStqx3zhx8fEMvXxh7594r-FD5pHoLM7480j_aj0YegqmiJvKOwglVzWGt5v6vX0dsdeqi13vqe-O5x88OF92O5_Cd7XDJ7ZvEqps8jvOp0C1i92KOnKA_oyrr3y6mpU58vgmaclMtEv2sZit-Vxc4wB-t9EoldMd_CMMyvjO_tNmhOW5mjBzLqdeQkwAT3eb0N4QECgAzqDNTN9hMHKlZVNx2izmAS8gMPYgWVTrk2Wz3U7I8uqlDYYUC200QkWtpo_4EbUtFjyLJYNZc93Xr6tYhJrn4vkmix18heQobYElBIAmZ3Fm1S3D-Hm9vlKyCrbL7SDq3-qF_2Lc7KOiAbcuh77uddDl9SxPUy-_5aPlFTfaQ39JydhRLZXReq30qdyf8YbTsjgKXb6ihAlkWi2EUGZmX14LyeQ-aahVobYMwqjgM-oealEYIdtsnY23VnYTB2AnpkwiuY1CvERsCOGj4ij3bo4zLjUP8yKxGs3FFN5Kgo0uLI-9cAagSavGj4DbrUnbbaYGUnYRn9OPiy_5SjLbcO2Tn2VLP6zGr0k7ipBspibmT70AD13A_b71jw9nruxEOU4GBsDF6SABpmH-zpKwxGjubFbKh5kZG-TmNUB44oizRhMQbM76zo17W2gaVhO3Fe19-g8LpkQz0NQCME2MuKMXUUfKwLx-gJY_uRteb2daqQLRYJ0T58rzoZ25iPD9v1IQ7ZmatuSZOiBH1GWrzqhCP1EB8Wt_AXx_DLaB3r4eed3GCgXPw9anxcJeiXVoN8q2hu_9Hxz34_dxUcUKp9AHoENxLuLAefoSbsgWSmz0rxRjuVNUWOQgiLEaHpRenMoFhEn4P_Kya7g1CXktOrqHj8PrOFwTqbsRMhuLhAlai207M9mkl4nAcuXuX4Q_RnvTfGlkXJ9WOfj0oTp4tlFxtNQJH2Gia7vC8NuS0ChnEJpcGry83SsqPsluPs7vezdstwx4M-vVsStEcS09OByyU3vAqZyw-Ygt5b4nf5rHkiIIVCpgal9eM37xRv8yFql_7r9RfAxh6ve1VF6uVjs4wSnc1WFncjZDS-ZOLal-hIRsAbilfREZ3mpPsOmwG5wQi_JadG3ASC4rtOrxjGbkzqfz4bRhnlfWqcQVW3LcnEvUVYJb0RzL1pqaxI5O6Xkj2KGZCNJsmerSFsKGFXUL7MiIGnpEpaLaWC3xQUK6H6di1qD7ML8MxJdHV3fKYx9APbpT9g1pEDZw8E3uEFCEVecT6QvHeyBm73EWC0tGrzzRhNbMB0SgvLC1qKww5pgUeF2DZ2DQsf4-R3PR47ZQXQU5OKJUm4PerhK86GWc-J0MXdsXWk_LzLCwjgiAgUotkACGWXWswrLNpDQSvQeS41EkXnh3Uafu_SkstCUkD3f5WI8hTWtPco7p70ljKgNL3Awbk0CXNRpn-FumS9aNKnMvr4ERDC-RfdrhSGiGYz701bDRRRCZ3DSK8DAMJ05J_ezcvO-k17X72o6mUKwEbgsv6x0ohIH_Eku1srlEUJzIoUOV-QTddAiMr9JfTy0YQ9BceHzttt2YdU7fm9eMVnslhkpQJU8AZ4l-Chbl6zBFWVrS_TaVBIeCQKm6_oVVWf9HkoLc7Q3i4zYdMvLha0FtKbjFz59vWdQRN2Ww16yolQBjdExLAOtSv8YzGVSMV60aDISOnbhsv0UXsIVw4mo1_aJdOEwVglBYT0s85k83v4X76ttMhGFe9JYocLU8xU-IRrzss3tZwMi02VhxgBQXJMYlu6mC1DRywcNrC8BTEknmG0LfdxJYl8jdoXMyvpsOdM3vzN06wBrKc_LgVuwkFqhDg7W42YWyYkMdQUav7D0H1PX1n464YAIgeQ9yaLNPXVYHjzTJwOSf6cQOG8TbeTKxvCN7NftZV-V7_pLPcJWKe27RTZWgwGlvuaGYOnUpmAifzn25vYk4_l6ndHBTF4J7b0jmf6U3SAHrOYCGjHYMK217sKjzdBTIiDyrMIsI2LuLfqKeAfuRv6Ed3ivlQVcBOJi1FVH_G-K88FemSg9Qg237_HZy4W31wgdAJhbtKXf6yw078OQ4qPLQvW41z0DLo1bhCtYwBLyAN6MK0ZD5nJHjAbhV_U6-YuAxydRuogcIEnDIk_Rd0UDQgDc3I84DV8zLavnJQGFj6-AwDYhWJsKRpl1d6it0jlUCYQA_c611jafYC4OLUrucxU3Re96V0jnXfCaMPmesbK1WF0KGdx5f-WxWawufs6nXmntyX4yoa-1uQ5d4o8qwZOJ_qrDJbA1rwVQ6pNR51vGl5g75KoCOZF__sBBe0yKHKypTHnW2xyWRmQCn-qnI9f_guzUdyC582YDLpkIy0INSY0B4SLF3v5qgzIAuEwKBknXb820ORM9xU9c8y5nzWLt1BtY4Cfs6Yg0k6ted_H5bWM4MqzI477602W6KJLUne6ieGjSkHNdG5yyIEfraArNobxH5pgBycS61_adO4daYpDR8V_32FyNbYK8PU6qArQ5wb9n5ukX0SRpYOeV4UlaVL6S5vPzlxGzSOuSXPp7o2luIkLeWNHD8ie2_0r8uI859qMSALN2kzxYym0J2rqAIyBn1tI-wPFYBUYQBufEt2tAnEmJGdx0zzge30L6GOLDxwJPeNotqO1Z2a6M-MNFmhq8W8DWpBw5UDYCb7ENRbN8VHkBchVks-rtCaAIi9wB5y3Wpu3gqcj5iPxwUyZX7_fgSSp6-2TQVnrJ0wGxcPJ-7209pDvmq_bZiRMMaalnL13v0Nqnt9OfYtoPhDy4LgvQdWAWGb9ui1accWaroodgd02hMTN6Ej3joX4AOOLbb7vLf4RiqTfBccpZBGcDyoMHTTmi0bE1DPOUbjXP8hRSHyVdy65BhVaE-khk7ZNIS5cjJA9EXqWlIpjHZQhFXT_x5gfiqHVuGpCdrOA2d_fRN7_2saKdB1alUr46NjVbJXoEkmcXvcc3eXeZNKjook7LtaqcEzq-Qsn8HdIlSTqjwSrB9i-liHntdzAd6tNCftUAhiamEiypI5jYhMLCDamI7ZK5jPEWWg2XJoCIODY9pGN8NeOCQTJoLG-EbAENRQdp4mTwIbMsq_fkrdHNvR2KGmpjApgr7P-00VDAlBPjC8G0mBbifBaPRpabpZFgv-OqV287BomEx3l4oOsq0dKs4CiD5ujIOEIJGFxpZ4tGXrDfHODezQYfIf3nOTVT8pCV_HEhVykzfqyxPKkHtGdDYDkJBXIF5BZBXa5_j3CaG8xqVaBpoS7EC8RNs3jlvG2dFbiAviubArS4l89b95xXOL2dUVs0rvkV-dBP_volggoYLm_U7yEZF4xOP72CnTO7oEDKGpkF_dnkweaocEVgD_8KySdCfZbHGfFbIojk5tk4xuWaYve4CQUklGcVHDc2Y-AWUKJPuhHxNa3If75YZLpK5WtJrMTy2RZOj2HaBpGizGOrPWBhTtmr91c8HuyW3AzEbHbZBDS1ZPFxUWQz_ZUpGBcZAoCzDmd9QwVHqxP48ZTd9S0ytN_P8Nf33cP0ntIOEHUx2mNqIgXQT0j7aMzXSYZtKdLAJ2vFaxLMUtGI4Drq3aIguFAel4afCm6MkK3fBCcsse6KIspfWEkd_GD8nFgO_te09hsCxJNioRM5VI7UgdeIOd4mUZOC6SPuiW_BIcAlOwT4-gg8TgAOsAjfNO4IWMSUL2jYE38PK3FkifhjvO3Mv9tqKUDc2L2JyvtKJ8SSmh_XutydFqc13UWYOxkRxl-DAYR8tBA6_uGz7IVIsOXQgNmIouzi5E6HKcyBz49XyTAolNXvuji3GGj2k7qHOfCExLYa0nS9E6m07igB7jrN_tEHCIseaIiVh8Z22Q9CIZ6fQec39ehyJl7_0GesppJbVOUYxb21cBJ-LOnzHqMAEyeAyub-zeDajITRk67x4Sv-EUxbC2Cp_QpD8CKYj2SK2TzIY9_0mcypiqsuxzhwmVASCb5nFs_Th-YdexiLMSUMdUeFmmnxExTGjdEB9Iiugs3xqGGKXOk0Ox_AtdrNSYHx45m-8T4ZUIK9Ka_lEVT3ba9ecam09fYSWAgORYhC-6K79C2s6vQfjwOoeu7AGznI5Y3FdNdt2pAffrxANtiMAPXz-bV1NwJqk7o1iqtIXxLnpNSP0aUGbhqzskwTCVSS-GwCNFQeLQUgVD8j3IPHn8-6Pcq2zei6ooZFfdJuynEshD_ZsSFsCUbJfD1yzB8NpYOx7ckO0TKTqiW7Vp3FFPnyaAz9KFbIy13wYmUeSbvgb4yO18hWvqnxeuJxE-jGWDqg_H99aZUWxjDBoeEryRNg_m4PxI8UAbvvWvO32SlAwIsvLKw-EIobK7SnV_6BvbkaI-g7uUQeaG8MF240DCPj9ZOn1TWTP2spmlBjT1HGPiEqIuVd7aXfgTvJzq5Ld8cl-89UcBZvHRTL9Y0WbIyeWQByTivZ-RplY_KBxBKoCYmvuwEMbpMv4LG1KkyrBDaDtRXh0ZsI_X3G66g7qFJs-M-4ArQz85lHTGxaoD_ZWpJHhXuGVFi3bNyhw5RHtZnuO5MmviyYVVXz0Rnegv7yOCry4C4UMfM8JjLqLLElMyNAPhPMEr59rWQubWqPesapLzs35mM2-OIbJ_-w6Gnr6lTaPKepf9CtazPaeQK2Pl970mL24v1y8V7uf_p-k2Mq-9V6NbzMx-QIOchzoYBXtbMyfCyUI6azT0dulTF-t7HDrwcsEwetGJVZIUPDy0GChRR5EzGx_GdM6slEjBY4UcCOWaJRka5SFFdfsuxgSd6vnEtiKONgwdqkhumqDPeH9cyEl3BwWY57fIPrz6J7tMIvoS8rSSVQ_4TV8bOKlZCsiVXk8kL9c6dT9xo6hJ9cz2kxrPba4zN32BVo05rvZbS-3SwNsuqojUe8WVrsHxpWJznnMgMq2usv8evf7qcEGbHaeBjYTElvtRPKexSKS3ITiPIlnqxP37bqAdi_vBKNySushJkNLGPOMQ1s87Xll9VAO2fntDJdNAVoDjBz0Twq6VWndrz2I6-aOss8seXMHfQfVs03xNbC0q6L0U6KY0mIIg_-fO2HaGyZPOOhoooY0GOVw9fS1eEvQx0aSPC5sUdEYiP1YsAEyORAWGWvRCPONserN82Y4ftr3B9-1Q7ZwvnZHZYngDbT_ZgVVSYInljidS-E5zoNy8FUo7S8B2s21FU91j5XsVuGLnzgQF7l1gGkunDulSb1_EFjiJA4oBYklfuZ5LmWKD9L4hWg6TyE5q8yYmjOkrZ0f9SLiTJmCOk_CptxF8WAGbLNJzoLb0M4km4_8AgP3zhKD-w1SXZLNfHLljs-qUTviU9U0Lsm2m_PWhGZwz4oPAYh38rkR3ogD6wodkhcnB-O2PG4j5NuH3GcUgFoPp-ek1FgwDgS_a2K7q11okUMDe8P8Gnx6I7gZ_1eoHAMDaBHZv2TX9i-oEs54LgV9qUiW_uJtLMYyCS5dryUsRHKWv9xxCwKT9ESMt1hCxpzZUnWWgEdv4pNZ_JMhYLNBaZd4C4s3Kgwx8-D_0mc8rZjF1tMab7U1Rt0dVd9Tx4KhgHKzj3_97I9zgGPQLjxoiG0RyQgJ86w-MKmO9tgwNossAdHOMwVTNFSAaWMHmg82YZrccQM6jr0npqzzZWINzhN6BbtjQ2Ms5R326lN6Au3EArytOidle_HIVs4lk8wz4i7BPwg1DQ9d9MH6_joM5eKnMYQjk5pPZkkn7v5ke4_ohM-eA3ig_FVZ9pSxmzY_9tRWKTJFBEIXjPYdMN7FMf_5NqKegaSXI8RgDzoxcZaWBNrK0hzJf3sy2TgcPNloHiqMW45tsZ5oDEiuKos4YdU52wkZ8UNRwxLL5L11gqJxodd1TVDnQrZqabqE9rub4Zq1ml-c9wMvBKM2JmchB88NoQSa4pHeWX1KdlYSBKYIrRq4CyaozsH7GRhSADxGBaFQfK5VvjY_oiVfIM_Uk0l4icJEBb0P4PC1cntAuznaFN5XNBUBTS0DpXs3e30y62ereDz_Qswra8DI-soUItu4lKNz1hX8pG-qOrXQinh8F5yIqnkGzCxNjhZqfMWF7EhsKiRgcKkgofYRQ1rcu5rXeuzGC9H63f-lPHgORwFgHclTXVo3AYrClFTjUaN4ZRSWPyqQzBdiZ8BCB5ZPaFWFrbWBhEajSQJ7UI4yYe52_kB_xYWKbkei7fZkqCP4BjpsUTFQRAhNtpVKnS3xO6k6GNolzsroZx0Rzjs5ygpeo8Z_EjflnlgNxQTYztfNsqz4biPzSNxYjtjKasY4L3rMUs6DqINJd2kYKgw0tj2YyD4NAuQWMdWaKqFTb2xvsNl7pa5kqSTP0R661oqBYsip6ZOW5odCG_WPl0HI30Yya0xyM2urhzrw1WdA2DBnfUJ9jNklCmZAQeXlleMEyE8P_0Xp7NDDp528BmmkXB2uAyS-kdcD_tzAdpS6bCqaylsUCLOcKctfF4O5LKBHxJMAbneB81Psv7HzHffii_scBEK0obYEbHAajep1t4_pXq4THrFhCVLTcqI4wJwW_hcjDntKu7ST3BXMp5B5fh0-Sd3PBHvo_-kBOK1njD6wx2Ow8P07NjsvujnoNrqNTrKhf7Fwtyxuziu1b-nvqKRrgJdGpMPcZmgm0GUS-R_u84SefF5ok_zD10mL4FSaUeLIT1ezcKZDqsJGKaxqejRJu4Ix7O80YgDBusZdHBGVjZDfhMIW98xukf3ZNER8zr99ps5nqleyQ106UWzOg9JJKksfFwXqiCOHJ3VrkkSHJEa_jaSNrlEh0DSYGduJoZJzwHQU_fUs4qfHNhzpasxZeCvqyc_Dc04NYsf4tye95wENikkJZXphjZbD5wrDYGXi8KqK6jKaLpVVWsrywMaWW-a2xsPLENB7UzqOfQfh5AasE6yHS3Bu-caZ9xN1Yangv9KMeDJhUBSin51f8bRlwn_xi0T2Eul_uHWnJm6Sos34ED7anbSdCCw2-ZNoNVRnKS-_SrkRnMcup1bfFUlhXVD_Ciko_6rDiSKgDJMJZGtxB4ajjML17mmhzn1y7Ofm3xrmwkk9k_1P3J-ZVbNcIooAaBMvfGkWIQYyDoIQFw8vXhL8in0ROZljeWc1SDXRXv0UzQYWKAHkwfVvLCoHzWxx86gzYXLBPU2IxYprazmLAniImUmQ0E9ivv1zD80UmrnEvjrXCCVfOrTBgk8a3YcvY3D_RagGh1VcneWDOt8CJvrFpRLGPLQzuiuJWUD1y1dp8a01NDhFA1Y4epgGx8ETPPqYKnTPyoxDzYpLkZKMT72SIbGPvLE1UDAnC9x0K1NYNxD6p3L9oqNt5etiGvfhZVD3HYJEgso9BiGaJEc6b--9Deo_ooPVISD_FFEAVB0nE0N1nsX4Muj20ACOkBUuAAwxnn9iYxkeWaExzU8bpdH7cZdO_GSMiDeoJ2Iw0ttXHv2Z8kn4tOt7fHTMDp3oJjuHi8AcZF1ekUrnJ_8LZsXrfb2kHoQ9oUvcbMxODeOdv37aOuJAi-HNkHFtnKM5o3yy6seRSgD2IuJ7_qnMfUPcf7OrkZHFy8QoWUsYPlUTvGFHRgbfqtheipiGLJBHHbK54KGZvlZ3Nrn7v4djKU8cLL0megY5t-_7I10wNPPG_5d2abyq5mVxw6EDEZZ2d81kzYMIxN2SjHdS1vAQa-XmpE-3lo6aEsoBNG71CjAOw48zgy5IuuZSIpYkrGpSnSKg23plI50lHNolC5mbG7r567rvCZc-BS5CpmBwbFx6mR9l4Y_0stt9HlEyN6J2j-bEIIB9q-c4j_zR2CDSP4Uev5NgC2GznjGSRzqJqwOMKmuTL-7ABtHiX_FWxWd7GRYvozJRQwaNoCKyiJAF_X6iY4mWpo-rY7KP0nx8LojkppB9FbRiNLRRhOtn4DjSl2ZKW-6_0AAvTvdQErUzUmYMof5UB51JVjZoCdHBQI_cQZ8IUpGovkUOBfaLL9PucA_B_QzL9UcYaoeF0KMnRBHG3nBiILci92bg_nSoapo1jb9CLqMQgz-wtYhyd_w9RhH8mFrkySgcldOW-nwkwakw3krmuPxJX-lmmlUYuxEKiv5hMGXobQUxUf076UoR9kTDZWxH9wDInQ0hbjwBVQuH4FhKyAcksH4QewgrGekQ388TbUMsr6S5yOarAVsviJneXqRv16YsMPWO5v2_z4mSXGQgGN52FMWJ1q8o3eroq-STnlgh3rAigiEl3sBhwcxZ0nUV8WHiCn4vRtbqM144CE4J5CT6q_wOr6fuWH39r0wivFWt6j0O1ZRNiRLb5PSiDTEfiDqfY1W4nMPxfkC2-wXKpkBAqT6w3942KaEdJ2qGPle-xbRQPjSkF0JxIpDpapiyjImTaN4HkIY7QZY1JUyOrHgX6heNrN-_ECNZvgxlCrmt-hMJ49a8AHXAHkqK3Su36dJ8ou2r5OlArCJgwWkrLR6upXmHWMZM4xVk0WRjFujlRyVyQ-tfOPz6hQFrYYI0xTlmS1R7QsXwQlJsQo5xEQ9UmEV1DnYBzKRdOSzh-mGMwMSTkZ-faE47da8-NUwfxGFZFp5EdLFRDLnuXGbhoQYtS9OwkEjlJ_BHzt-Jwb-8t861w5JmkXsu4Yux_GvxsW1GyOj4Yjwu1KjXedCGn8rHZ4cavGKgyMVSs_aWlVJKHmLv3vIufmgSytGc5UePWdHDOwH1zj6MQ3D62duEKj8yHkxSLAwDF1xm5t5BCTHBx_pneVZWHk4eRc_r9KWPaeI9XNFyOSdnWTMgeHstWyqdiZA1y3sXTz8tu-eGstS38LrCcIJnZKIeaFoSCJAC9gyr1RmTPR3uohnYAQwe_UiGJYTPKnXXdUMQJywfGyvMrqcUJPw5Qifi4XwdT-j-jkz13bzzIjwJ5pyLXbQNlR2whhl0K788D-3M50M-gsYHO91BSh5w_0u2dFU3NE5JdvLtsWcCUS2v3kRpczT-MtQC5ZhEQEt8Yo98BkVr61BWli-1dGJ-fzGBmLefu3TENjNT7HfJSfyvfLi5MYeSMoJaBHcllSflmTYkln7aIik1df1tQ_ZLB9SY1NPkB_B-cnCI4daG7ZzPrmJu6HY3uSvMsBWkyEFrUiN3_gwEHopIcPr6CkuUFK0_ybCz4e4aAo2ymd6FU43V25H9zEoyocH2tHjcXtQ0mROqQwy5fLNUMkp0bv3oamiDXd1dKyHq-MT31ZSab83F51Js29MYM-erlqaCRnWy4VxZNtFkTqwLqsKD7NKHkjg-3SXflSexICuhgkGabZXXIdUgcvEXc-pVkhgPz1_3D12ydFnnHEaT-jg8tO1EXrw8U9QGeMFjdEpDzryxONGvlY3ekxYK-za1vRtKQnp4o_eA6x7puLN_rGhBEfXbZAKBo40n7mh6IOW5lK09vP15AFEJIKOwsvasdKBHrgEebBMDbqoJwC3C2uMZEU6Dh7aaaIW8Jcs41P8uYUk4Prz3VIz30Ly01nnAnbNY7iEVoXx1noRBRoDHxo-5ROWAL8FX8jv8u9VtC-sGaJlrRyrxoyfMIBKH4-EaH88-2wyUl9HhxHuQfSx6vLgqTNw6o8mf0fI9RJ1N6yQN_wNcn47u9QmFEcukghN1TCLmOZ9H9ciUbB0vpxb_IkAOhz_I070oS9SLvayyb-W5hbI6YyH4sGZ6rz9E9WnmU7O2PA_3xCCCA5qdhrXTxTQYkNufBAF7iDCxFLEsUMx9Zn3_XcqKnYJqncgpbbv7ILcSBzE0o6BJJPst5bHn6VxEJZjQZWrjXtV_rbQGzLHjw-lyrHmI7kakh_yQf4IlNZAyav5uvZZbt0CqODIf55o-RdAkkrYM5SbqTkfGuZzZ-V96rc2Gn080ICqvWLQrlta7YO6O7fF6OmeoSjFinw72ludo-L9rYtSMRFFo60J0W2XlOZqZxNOkb6W6cMw5lVzOxWvJx_7R63ibxoOil0uF6DRDFPSJUW7YC_5fKZgxTrrvVPNFlfpqTQu6e5gEuqEreS8lYFF1L5PdQUYaDHLiIwHuSJ7HJE0rpJ9dGHqhIf3VTf9zcTWiSmtyMsZPZ__KQVyLhL9InEChNc_vL6WXTku5QI6GjhGeaG8UwGl2a9JjOspTpLaiFyjI2yERAcGamlXhBjmhqFmduxaWwj1aA0tsgkEp_q1oMk3FUV35tj0vwrpaXLDKpE5wppVMuF952uXLrSlmWTEVHH7DAXvMkrJqV1P5OAENAaskgnXvVCyfAndsVWNjKrmxukmg0op_3PxMUQe1oZfY8JOcT8ydxA3SCG3bHNhF4xH0kNC2XH5bqElCnUrBR8P9GEyCYlmqcdms4lu5FTfgzQWKTMOkTI7iWZH32b8j3yZwUzHwcga1mpLNIKGifXrWjp_yhTqVWZrrByRH0PBi6a_BxQpP-7ebXSbxuCEEz7aeAn2IAihffRPHCp5HNAkbH9dgVGlkbce_fl8LpyS7Yya5jAeo1mM5pYG91uwvt6mCpnPC_RADsUejre73f4QRfj80QlFcT-RMzSqymm4AxdoogVwKWb_okJySBvFGoa24KmaPYWNqzqFwzkeRMcN1gVyO8sqrFtccVpC4mdpUXHhcoWeTIbrX4_ndbI03ESbIHxR3-zsqJ_UPtslRQk3SCwf0EEeyq6DcKwLr75dpPoqeaS9G4v5PrIYPupN6wpqRQ_IeSOUEVDIJOV2bziYpLZ5UFNx8yaH_xQ37fk50_6RSL8CEM7Dp39LLyGXAh--E9cMolGnCuR8UiwAjtUvXjmlZc0Z1FcwuY6z_pilgPj0ayilFIO_oQlwBopQwS8VvI0P43gPwShibQxjeqWUBYeuHcFkFnmRwfhM7wgrEXu1OJlb4MwWDargBGnsgnw3V0JuTmfVR7lzgl8bYYN1g2IbybI9EkttSbJEEfzwecKedEExxV4W706HeBjPb7bKbSsOCbnNS3Bf77mrAkX7HvHSXa3AByA2KHjMh9JxKK6_R5zL4HKdIWZ9i6JCyXtorcuiCtytT3btnhRvFKMwkUebj7I8L43M9Yg8BEw8yuar8-g8KQSYCsgMZgBTeNyoZpfJ1d0EwO25VkiC2i6LyUIsz2tNdUMaiTDbK6bkR8Qye3vxsDclDYMT3__UOP_NqnZVVwgDywiuVrzHHdDfxObudlkDRNbAcTjbdTRboR5aoHZqa-2WbjKG0cOuLjS3Hb4g5JxelYIiYTOxSxTlr3TCXDvKxLAWWDyNXtqod8P4S3auj6zPCfyM2-NgXbL_HzL3h_cTLxLSYLQA0geER0H2_RMSUOqMkQJ3_IGHlpy_OpOLEysK_8-Da-ISaV58glaijXZgBEex_AVL5vTR0gib-kFDvWBk9fgzGwktRIkQL0pMKikfJjsiX5IWCs-Uu7i6g-Y3PGgnOWAA5HCfdI18glrZS5qDNq1SkNG4sNcNZoLV28XIC-7KLhAKkpd65EKqe_GXfaDh7GdogUNzKZbDzbHi5dampUk1uvtKeUs4cR2VFk1IsAWn6TQYxhFke5HkInnWmt2u8CL4AF5qxh2FOeP1q8XVogVzkhAlf7Cx41gZ9DkCGGIMMDxz1NW-0SCKzgyvsl971OmwjMHl0H12cVCdnd_G-juDZRSwDf-VP9XjOVPmuDBMbmsuVPHpTR5KwbT7bZbsqn46qbKAL2Y_se2vwuMLRAnVArHcrZmHp-afxel3grqqx_yqgzmF-AapLasizlK5R3Y6LkAdWtMsnxlwAhSS6SwRnLUMne35IWrt4ow-F6W7pUl8Y8XgE3X9QFjJxGMBe4d7RRYx__NhHzAt0SN3uz_Mg4NcHZmG6qPMdB6bSRA_014iw1DaXAaIwPn_4Nn5PFsIT6_3HC4H_cFvI-gw3v_l3bMaeSsu9-UfuV2Dw30JZxE_qTwJIrdYRgYZPGnZ0wlPHjvTwq9Kkz0tUH2S3cRN_WyTqVBhFJIgpms57Tx_SnZE10aUiU3MIUIewm5oNUg57Kp0d-O5pUyEYcYgdCWOWVE8UUKNOZBG3blzp42yO0Y8AXl2ma7nqIYAWNzLBdbAefWFUTaQ5WMJ0zKNeZWgpr-0ixoaaU9VFCUTzkmiOEb6LHC9e3scNPWueRpOM5M9DGByQUgixb6knJOjetkoT6VI0oWdD3qIounwT3Gm3uEqekyFbTYR_0As_uGDZ--PUeofLvsbTBAPpWD5q1PttbOVp4GL82wZUNFHl8wQteZNvR3x_fXO-au-95zRo_GBMooTqiULh5Dpd1OmqrfJ3TxhlWL6UxDbjnQY8DGR9xZx3UwBWIDWDimfFlhOGuWll0NeifxuIHyn2hpVQEEECuZtQnGUGqoSgkpegj3YlBNDziqy9cc2sd4BQDkQAF3ZyTbyWVD8TrH9oIrHzebF63xsB04AAyTC6d8W0vu4PKcaRTppwDGuL6WqJ4XOSktM6xJahOUSVaj7iFYS4n0GyArQnxqK28MllcjHuWyXBlw744pvR8ueBkbSASMi3IgAZLVU9TVkVWijk4oVjkiHmXJHqSigP21JUpWvK-pHASAv9MlWSNeBi3-sJnZbASYcVnwpfMSKuAQupqxWgvMdATT-nfi-1udlrw-zDkkmOiMOzNn6Zo_b6tBTP25arezP-XVCMC3b1c9YE7fXOd6TNZfWlSZfLK_BS0eKtsID31wrEf82SGDKFUP2KI4pN53fxrqUlUise2UgKY7F71Pu-XWmS7MdiIpU93zW2grW8bvhs2O-muMy3n0uC0PWP1pwK4fH117iSDHmBG6UBZKQB7tFfo_MevXVH8Z6HlJ45ydMzZqydm1YvEm2Mw-ArgIGjA9WvQf_SlOoTWtzffkkMdEeVVPJZFd8JW2fbri_qiM5YJT7NahknqUBkarlVINoIkusQ8zMkUyAExrJ_wGQCHcaFPanJpxL7Rizk5HnycFv3qXIRGcPVO0DrTF_2OqM-YtcSCs9ayj4CFBzatS_c4Sli3miV_hfJCP8RvhI8x8nQwGhdFBTTks1UWmdtkpp1WkocjJ60EE4iJIDSOA7sRjVrN69E0_ktBPjT_Gmwfc0gy2ws8x4iaOS5CgFH61w-aUKY2dlsnALcvr9ntaZyfaE_thBvCzrgrD03pwln3FKHh5gHG0sNpiFi5TMI4U51AjeACT8M7qvLkYFjeYZrCtK3T3aVkAT_o-Rpi3cBmSiv2Mxk2KZOCc6Ldi5Zf8Ve7dk1-eSJ_4IfSEAPIY2P1B35kHffEU8I2BkvMyB5g3SlrAepSyAzxLu3CSfVCKDRqnbowy8Zok_qlt8pJikymVbHwlHxBsaV4lkvI2dv7_Wgnel8qB7TdQi-8KFWmtD5wyTQx8XjipN0IE8fZ1GXJPUxO_pkRt_-fppX5fRtfWeDlTcfqZG0HMyCAOvu2eyaJJTsAdX5OykCirON2BpmC2hUjoI0xwUKM4Jk5AL2OGrmPqbY0pkhRvM72Vvz0TU8H5qKN0jQjU6kVOubcpznNn3Jb-Egmpb1rhrQpsXqVc1jn98wrrB5jbtGx1t2q84d2DNkPFBRhXo4CTd7_tXDk6lGmRpfJfRbDlh-ZgMWnhX4oCA4sQr0ocUEVSyM76nfXbPKgGUCvlvOEP8AIrYPX0b-EgmsjHG21z-WAA5mOxII2cqq4B7nybH0bYXbdtlYkEip9qL77R1khdU8yxIhG2KEvqacMO6xcG7QpDDYz-Z08CrsvoSHwzVyfs6y94kslKWG9waPYbl_jtSNHu8HN8pYNYPQKtgMX5e7qFML5meeRwqgA2T2vlss1Koi7-Giw-P_C8t3Bib49X_-WNNuO0l9sRbTdWZmI3CoIEnYS6He-pT2oTB-5hZV6OwCYcFgJ6iD9VL7OTUcNNG30zL2DbzUKlTNQTKNHINnp05YZ0BRcxxoy-7yARm2lVk6MzaFzpCcMio-hopoH-5AHj2bYFIqR91MhufjyDDcHWGVfZEITUlJMWnweVxQ9n1-WK7M03hvb32gMrpy3JilxxWe2qSG9XKYKaKnggqYzHWhGFkI3Xo7qgRiWAiG0Cy2jAomFeQIHejjp7SbYNiY05-H21UFdMbn_op63K8XhAE3ArCc0VIvOkvuL1a6xnApVHoQ5I0Y22hl7R2oBk36RaZ5E1cMsNQKpn-X_9SOHRBUvdn9bCoGWBsA_z6adc4IYEzEiET8O0e3PyZSJ7fYrhOWba-PBzr2f864gHOEkReO5kuEOOIqwNsJVw4fOzmC3q_nNxSVpVqHxdFsNF1vqdNcNKxLj5kcwqw9Loi3sTLB4FaeO0dlRmSAjUtWaXkxBNLwKxMOXbgca9pXRj5iLFqb18Bdm9oaPlLuF2uKrfCfLInAx0knGZLcYljVZ4aOGN0HozpIx2tdI60zG_8S7Ag3Ss8OEA5tCcpQ3SrMe9wMo270z91sFiFQWSDpdX4p_q-YdhM4gugTHqMXuJOjS5L0W2aIb09jKifPD57aGbIXz3xKhuFmtrD4DMlBfeOZ6GwuVMOyDZJi7n1rS7o_T_17XbwZRF0fC1jCOG5_NqMU-VQXfUS3NWSDO6Ib30Ft_RmrbLPcMnlpsKnFVcBXjuMoPrKdntZMOlNOBk1CU2YcfsqWnQt0wRHMx_HgIxGWsv7Riy_D03yfXwQOKXHZnBTuaalSOFemyEx3Xr53XDyuN33cPJpG28GPaB0Ul_Vq4v9WimXTDa_oT-V_AyUGSp5RTufq27rdRazbmyXG9weM1E9I010CAIjlW262M0Zij7q8F_xV_n251VDXT8GlwnPbqb93qJKJAndNwN-v361ofeVoS4lm2Ds5ORT-ni-kjiJUYWzamgPybwYf63MJLG89Jm14KrN3QdAucdySqvCrBHBMlke0kenhawkQqiRCXv6HS1JWbVxJuOCMF5Pp2LVLewfLFO19-ICn-W42ijUzfvt2KdDlaIZC5MeNW_ZOVdVak9R0lTgwdc9V8iLQOw1yOeIj0dvpWvHHx2_v9Pgc8L9f7hXQhB5h5YrkP3il-4NKPGYJtSlQQhKpD6bX7vFTGcYJZaEbl1IQs32TtVzmSEM7AEnbEKdCCTVbJo9e7x34_jnkw8NIgyjoaZJhK_DWAZzxEsmI8LaEhmSE6SVwhIrGLXRbk0CHq8l8GgB7JcvLFLNAKG1xIG7Dk9WUS_oIwYrPYIgirtznrNKDkhS8N8tFxseSxQ3zb2bhGMD1cszk4cTkbHSMzyCxfoF-WVqbNHPAWvV3yzuInDpexPPDdTGgtSH7mTOaORokglx-dyeEJV6h-_C0kyAYiecvoLuJBgB5zbkI-ZBjlqLz21KVI9yysVdcVDft4Cdp8nYvxOwdxNb9pqOBSP5rAhf77gyP-J-wnzVLk_fu1ed6-WmniuOvDDQZcJkeJ9Uxejniz42OLteSdb6caNm_n4HmDuZN_NeLCr9dhoWkvzw0TOyPbqpLFYyq_GLQctZyXHK2w9H_3gXR5SQiheeRuhbOGcWRMe90NpqKi7xbcsNafiTKVV2MD2wlt9dRfkx7tLXvM3-mH_bWsVWBn-jXDJN3jSp_XbfP2fYjYzsHAn5fwaIR1qavNi5Ze48NWnkp5BPXlVsRLLn1meulOhM83lDdRkMnejFaFxddV7ZxNqAC_KquWJHEKJ3cUK4PzdwBVZlogGIEC0ffyWBmhyfB5HSPpIMTwzUDVZ06z7WKfBcowZyNfbHgzkaNdU5jeBZnW_aPtzg5-pwHy24CYLKhGLEBOZVpTl_VUtkqjIzRXFwsXh1ybtjLJz0zpOvxF9f-pwqa620bVE5MFp2mNHzHH_oNQsi3qJEUPjQ391m3KGBoyLnjtdtAdyn8YeR5V-4_daa8B2fufSHUh_UxFVrHUXbaknL39QIdOOSdGChsQaszWUjDbZuYUGMiKw6Iaa8W6SUzXvNKNqMtfRPKKKkUaxG4qxwyTNDiZ9iNcarAkfpHRYEzpQaqm2A8TvTYIDkJjP2uIEWsXZvx1MkiFRCdhVS4ZPlcI5MFPoKH17d4jhbil45xGJUDYH1M5G-rV4WnUNqfIEkjjumW_p-lLnyHBnOOTk97BRH3SLnWZRs0bTzxaLMROFrrWIN96xX5Xp7cHL9ZkT5sa-VaL-Ko7peOzlzSoLIpARQpcEzP7N8McjHaaFdwUCe2casXlARKqFd9j1fs0iAT_DHUlOy-V0a7vm5mvNkpbPVZeH-ucokrWn2Dy_UzKMk9FQkaFMx-rI6l-M9VqB61hAga7EtIs3466SkrRttxSPIG4Fse7vinGIB4hKYBS81Isha2fqDw9-YpTOhjHDZssbXhQV6skhNxmL5SIGm8RBrN1niJCM1O_EQQBbG8ksSTr_Z78-_OnM2rKf1ebaIFaERBVKT8kOse3oBKrQWYUurept39GBN0fKh-kXcRjGY90M0HGxsSwWPSnFT5B8hi4q0qKPiabn3GKlxyeHEiTvEsETSfuABUvSdTUT1TkYSYnbWkAReOIZWJ-kTxR1q4yVY0B2_SUSfPZaKxsd28Ml0CvqckS8tenuLUenn96N0cqJBkb_U5dWE10za2KCtkpQGEaJre7SXg8VhytBVIw-1R3VFyQaEvMdzUlP7SPHFUy9Cio8AUFgxy89zEfSwu4YtdVitioEW-D8uWrGbV3rajKI76ynD2ZY1gB1J_zYJzuPDO2X4Esoj60H2JYXt0yylfzXvhC15zBa1gNVmoEr3Vetc_TUBYNyK_2pLo5Ba0tsSmx0c666v_A8DQlzqK3QR_bObjQ0g8OvyvVsS-_dZwehXpwXqgsjZ6MMICbi1i7mCi56zrJs1GfhaVBbDC6RqO4w3zukLv7DuOzF_2dYQdk7T95yidZ4Z5UaQuxp5G0-9wnd1uHZB4O-KqCv8gPgpszmZ619b4IjsBK1a6p0Ob0XncaZ0qFbxs__4mViLNtST_AcJm_ETndei2hLdqsEkjhMcBDrubWECfPSJwGogWEsbGbSsgKapdNpg1y6s5W2gZNJEnOgLV-SBEbbrrPv6eozDwE_o5ymBCvRVCw-kLVM6629P4dwLVmWNH3RJ1apIXiQCWCHtUgmi7nOFoiH8yzk6of5Jxi4XM8G4kvHK2OsnwO7j1tYLuc894HatOkpf6ARYclwIkXPMF4zfPip0YI3oBUscDzTrwNM7N8rFOx2d1KtYpBIFo_-avHRZCMrIChcha7jpHairJma-S2mwP_VLOyIHLoeQWZW7LvGmIGVCtYsj6_Fc2iLL84YROfohiTjs9HvwhVYwJG4bmwtCAvVZLdbunqpDFaSqbrbk0pMwP5n26DUs9mFPOYLW36_kvDGAGcR9Z_FoTtVizMSlx8R1UVMauIob2rRwZxJ-DtYz6xlG5BAct9AS0LjaNCyktlBC_g95sYlfswgg3KNUMmIVsbfPBtSsv6SBDJlKPyl4iFaJbmFp0rjtp2GHV2enazY4lzYP4O5WUIJ1ygYN_MAfG8g-hE56Y0hy1tCc1KZEFYB3yhZTtY_UvjtXyxdzhYGeqwtIhrliAIm1JvjByM8OLf0kRuVsbehiGxmy-hkzoC_eV2Mlvri64cMUuSrjSTLXD_Y_B5SIMj1RSRzNTam6iItacDz94_tSWealnUPsdR_MQrE58Zze_TZDD4nxpnDUIZZjUHnZ1SRJ2tdgzYTHk65PjhmeMy7XGnMNKePvMj-iFbBccLBojtDtGvpV204pg-cYT-d7CkNJ7lYOoVX9UZozHI9nuhWYiv9ncdKwnvDRNn_40MacX2RIL1x8N89KPlpZmFQ1Bu_CnqsyCK_IaFkxfRPYdD16qcykdyA-dx1IqkXTF-rK6yw2zhXqvmD4nlO6mA-W0ha0pfX0Xsl8JFYH5B_QyhAUrx_yjDxVBd1sl0CRC9dtjUgKfO56KTVY11XidDUmkhwY7BPFg2pLMmNVLfozYtjaiLvCHwLliruc389XTkgF70pRthA2oM1m5VqFEC5FWOOFv5SDhRtjvgqsDsyklNWTAkPqB_XPyLRmfod7omkOkQWjC2kN6FWH7Na7F7vgw8-Vz70FDqbkPipUZudZjUA_l30ln4KmV1IwD57EROP5BoN9No6aHQoz7TiuytpQQWqdU9rGQl46DIWR7R3btck0WRa1XJf31kqyVMjB5iqGDOgOgRT_CwAtb4dOZBOscUwcc0V4Vq3xEfIqzHYn7Lsxg3gXy9cD85WdsHLx1QWjjQyQ_Uidy_sKzKA97RmbRsMvNLvvIfhofsCuiaZocjtb6tEkMd9lL2gyaVcxN40YdE5ffRYRI931JwgN1ITVDL2nTa3fni3bswL3oY6FuXGFT2TGHa5ztX589xSZe4tOe8d-xM9LI1ElFJ9OQJEqFZPYOGkER76WXBtRnawj5f2-kkrTsc9XTS3mYi15j7LuVn9BSnAyZQk1mDpxVonX0dBwg-fOnn6l4tp_H7hBfsoujviotVzWAibvV14DwtCjfYcoTcmiJsEE2-CdPoj7nS4jJTK4X4nrd2eaHDznvMvJtELufnhPr73UfbEWkD9HIXgq_SCHW7eZs4wepZ-UQnbWHydLm4nGcXFU_ed3h4UGg58G0VhLKKsdiVQ9h47aaF4u2D-Wpyo3R6jE7P-X0CaPsYDBd5M_HUmvQ3K9wCginh9zwG1tQXHOCSWzmLIMqNhQ_OuqyysY8kYAnhH7efaw-XYHsCD_L-uzU6z6af9dbc6DQtjWAnMNCV8cYkav_4DZAk-b49QGQzeZ4tuOJsbjwWm33Od1JWIdw6tV5Jy1cIRpT8HWvJv4X5dBgxqR3Y7lN_NkRP2ZTKK8srRafv-U_280NVt0mOg4GnzaJPjA-qroiNjAGpLFqMfuw7rOBMyAWh-IobnhOdey8YdWNmjT8z4papRkNc9WpVpxEJ8jLaNCeLUd46-q9FOmNZblvY9ISyORRRokyno4qZ4gfN1MfQ28rbJXnY710BO2n0OUwgokA77W0kh0Pz4WUzBH5a2YooBmLU0Lzh9f7cFZM-Syf6ehQF7l74V0NN90xO-1dVPlLN0638CU8zVq6XbM-Z-raS5D7Fj1tdezNuuEdvk0y-0IOpRLaub-zoJI9SYFn9tWYPe625WavSyI660zA2NpcToE1AOwhL9bft1atxH9NNwhLqBjNEy8TjyKIklXD_8O2AlZAj_VO0_lz5KVNAH-ILjZDNNhHbkNv4dGpyQbxsSvL6SVWrfg8-wsdEyKKfxbEDSO1uwwZuRaJzCqzhn38vgyazBNlxxz1KUfCo7vEfM2_mIHIR_Rhwi4t4P_H-nIpeHcrVVil3L8QrdhLmHAJYVuSm0xfZsZ5llgB11UtSH89W8UdQfNgKQghWQ3WHtGIEN7VfKxQD1bEjxyD7jz26ciQntx4GlCRlSyz1gbuY36Ry4tlm8zDXN43uNugJXRe_G9w2OwVE-DYFlZ-uIgJLNTPkpPIPrQvf-AvvYkFio4o_zZe1gUH6Xz2FTQN1PqU-JOQCKGajCrEFioODg9UgDPGmJaFSXIQFI8TqvJ09x3unPO4i1mVCdcfgKFq73g2SH3-DIyz6w8TCWkZGtUm-PUC40-CccQGBDyqWyUPkh4Y-3n4p18bvbgVUnkVJ-y-rMlEK0ygPzCgP-hqQDNNjm5wMEXmfLjPDO03svyTq_OAVOEY1ZEBCDuRIjd8osK0-n064EfzzlPTLnlTXObrJVCvm4_7QdjfBHjML8aORM8M_2h6zaHRhB0Mdp4EnXy5UMhe4SeJf-jpHR3QgQfttBY_qz1gVKBPr7DErcJ2XjGf1jBCJh6SHyktsIjqGfulOiUoPH2zm1fV46_emn1EiRbP_DJZYgFD5lQ4gTfnvLMS88US1xFxx3NzXeec_mgctYCwxkBUroafrX0IofQ-XtzESECdV-TazQAb5tQT0dZCriBS8Rn_2EgCVTSYJFOVT20FKGZdGDBQvO_Wb5V_PDju_HDKJhOUIMty4I6S0DiuDV698IvI287LpsNGiuno5xdOWJzPU15ZLHoOamwHzz_pe8dmrkrMMVMmVzEDWzlIV6dTCofElzRJdZnhhQqmMIQvt78NQqBoT5QMq4wFdn9XYS37prs5en5Ff2XpLPvWza5Pa-Bvt13fV97rWMlY-t_6fOyA5EMoNRJKL6V1PuCpem2-bMFKxeZ2MjZMIdwKOGBQff3O4FXJHJmGAWEeWZ2nz990TWRh5WixMU6VIpe32VqpaAfNwqTnhBvEVQueSUKnCsxeNhnDmL_aUvJUQHrm3s06GnCPFSe4HZUIgJbEgjre7s1gBQAXGrkHquH2IA3xX5S6apzaF7Ci1uFLN3LUcS4RqxZU0M7ZRUZNIt9vxLiVHZVO4Li2S1T5CmmLcN2OFsSKsKpVnvZlafSz2_J6mlX6YFtALBYcSRhAiJGDxqkzfA-PegDjJZdNkDnu-9vyYwLc4eJigidLXYF1zGdMCsvLyA7SKd4ni_7ljwWNFNfWTR8mW-Fm2Nh0pwfg5P-wxVHrcatPKV1HoERgfiyU2wmk9SAGwtcSX2pu7NMb7eF26H8ChnmY3A_Hm92Ml2vl8ypsyraKvH-5DXr8pcLgt6kgWLWzS4BQKQi2GY5XA3IkKFME9uezhFEwBd20IYFZMZIirP_HYtH-I7ngVsn8V-o1bzjSmNRW3tdcKCAIsMSFLgaSW-AlaNxUoiyIBjWUiIytP4VtgZs8X3KdxOIHfES8JlcfgtJBjoTbzMVfq9xyuX-tivCGrSM3_9DcRjlrzA-IUMAsCKZCWa49dRFkujfbkkvzjD1yMBp81_K_25PXd8LBq4R2JHJft0iUagFn2MtF68VNrn_qKP7TkTdMCgh0p2YQvBmrmGjroMKWhGTMYfL0QELMgaixS9aLToaclyB8mzu1Opi7QO4cwk0xC7-KSTZJtwkLFYsLzFi0pZCHlCCqbAv44TTyAPlNxGAmN3GXXFjYTXfV5dCz7ajZGHJHkUT4ur4-cftElCr4RTiUQrArgqkDZd0OfP7GGcEszl0Z6fllHqtSVT_1JQC768F5Yp3CP-cptUkEGW4TOwNJhMf_tV0MhlJWiNwvL87I3BkUCr1fdRlUVfl4GsuL9CAQPeoXJqiH8Lra7yKlqz0yfHjmG8VvvGWcd8khVNYfEFxbELb63GwHzo-aLas0GHbwVBpoYr35FcfpJOAYGpljBx5FkmJB4gpDFRMovVJ_GZS4WxyqUHW5CgGKHmo0x8psR2rXvnIc8Rk5jb-hlgN86QONiOjOTSeXfElqvJepnUQlxSonIYCqCj0WVc-j8HO9tZuvRluZulWIVGjhxIxqRROn0220c2ouGpCuINb_0ZHMuhL3iU5OuWFp7a1_FAUq9H-RUHkGgFyR8q8mrDoQEmORjcmG7Q1sW3RsX7UphEQJTIbIZ2ITAeosXR9NTgcaTUIyvHBXU7E_OScGEIIhGXFA51_ZJZzOVwnT60mYSlgQfyWtisKCxjGyfLmbzs2rI7AmZ1cH2pxb3RHLk87Tnu65hSUtwl_7oWqPkP2l2A7umh9puSGUQXeUgFbxoER4cpKZmy5wn-9N2pRO0G0fOsbyUQ2Boa0NAtR_SeVJdxRzqXqnKE5DzxOmRMERQ6PxgxPJGRO201srxHFxAu2tkDwcSqPsvVjn1RuVLFsZ-EnFMx1mBKXlYN3-CupIpZKi4KBHUZkp4q3VP2pxGZ9XcRe8AQwj_u1X23fdq3lztrr-uUB-lqmzvo_BCfl5Ms5p19yMW3jc8st5tG7NiclN8-dTp6DdB89xrDGUUCDp0GdwdoxxccVF2UVDct3Fgww-o7DHLI5E5yVrjuxSTrGBAv0SZVYku3DHOoqV789iodlesD-MwvDUT-2qApP9P8GR7K90Dv73UwjUGEH1cJNo_p7xGi1Ffp9eB8K2uKFjhUra81DsKuKpk_RKX0ir14XZQ_4sIbZMfjidvpPoih7Y2SveqTQu8Ga0QE1MjV5cvA8esoSn91ODr77GQyvIP1jtNkqfdP-xd41uKbnCB8DUXkeUV_fAk8p4n0qQoli2SfEbA0BB9N8JUECPcVw9FqBxR-w6kOW4gD3BL3iawblOoZC1IRTcNksTLTXYyOCNJtaUzpZzI4U0Cwt-EkOmRiPH1XZeZ_C2jUpoxjLyhxxgAAGIK7GlJvUXKFKxwavadEeLFMw3edjsi2AIfyx_f8KGISjejYsZuQCXpFjqNwimG9tDxOb_9uyaEeDKqdgRWQ6lhZrC7r6i7jVtnmFA8sOfwUz6oUzfm7xTyg5ZLvGkdIh4pmS5yUdXus470Oi8BZJ3jYiHXaSVLaxVD858FDb7Sn-mXbC7Auls0ZQD00vLiwDd07kBd6SnuPL-mlF7QygH4ef0NXZgtuNyWn8qJJwul_IteBvHTs1TCyyLXomn8TDrjlWJYZcPrsJ9xfzA6Oyh_I4etaymyBWvPw-zhj--lHSrX2L0Gd3mevbVZ4YagAnobLFHMnS2qz1DGOq9eF6_wafwYa9ZRKUe6mVCNyA-05uHJ30IloU_D1Aj73QBZiTKk0sM53VzBMy_RReyp-wvx-CnYySgM5JzGSnKfsirKphKyiAiAMTrhgwHmDXuAwUWDWUmcqHSrKjN9M4tVOxUq7QymPnzkD0auTXoNLQNBHRs_I1J_12u082RNWnl53Ze5pEBsXxt3SAESwjDaJNip20TX52_Mr5gGwNjec90BPQLS7Uyqd62_Zq13jb-BRyCM-cAq8BlzQlLPXbAvdRp1bJRoNn2O1eRiXmCms0cyLlzM75-5yMxapmOGLuq75P7r0QILQinshOkXTLNPJBL8DmVv21_PmeBJ2UlyVviBF15TyMLQ2pcYoQ82VoS9jjWG6qFrwddQeAvQdKgUJdfErMoV3nmLXlwCY0uZMoJ98kyYdfaQ9zAWAjdMdimmhqhnJKSacQYCv6F269hcQ_CnnaW9tPy1oaiyxlmRJTmKYwE5uVnPUJdSt4qo9-PPOnucZ-6-QUS6ajVa_BWh0ye_tU_OXKCpWZgR2fVc2ImDlNEqrSoTec1OBpNVU7U_JDF9t8NjX774XjWgFUn05V-fTWRVNVViA0AdB6WBpcgX1T9q940aYoAV6oOT0OwGo0McED7qp7JKQCyf7lB6_UNardTgvkXGIM5ne9s0Mst4E5_9-r9It_JITR4vIpJgBAgjR-uBM9yo_Md9g4V_IV-WrBqB9GZXE3eDi3q_sOQTOm3HZfvc3w41pbrVA_bdCbzaUNMfSiDjapGdVBgg2BL4kYTzP27cVYqDucmp3RxW7dILPIzy-Wi64Fjvbl6Tk3eNReUHJruk4jM_DLQBYejCuhCr7P1UJ1TscWUt1ZUrSQT_u0b5n4BM5VUyUgQfsVWltsGPB6U6SgHNUXg8rf7YzaJ-sH1bXk1wqKzlD8dD2s54H5rSsNG3lm9iMjavCdmaRevdsDWwVR0_Zte65KGBPQNLA-jVJoe5eWhHaopSmWcKyNSj-pUGMPEo44-o3vC52blw5ap5tEEpmj1T3HMSmjCgiblOsBljdb6BJoQCc2ufHsaT53yq8-73fstb5rEg6uJrcgGUAKoMlH0xrv9abQFsPspweM5nK-Vu3DWmm7ew-g2qt_-YzzKUN2Of6zJKyEHrBp45CDkc7oMEeOxVyrVyyV26r7qKrB5aixpzJiKuaSzXV9rr4V3YY3VCcKw-xuCXg9EBzbWJJHPl8u2fSuX0a9IkooyxjmnATcOUjokBHbdiuBEWgGUy5WJlBJiaJn_IdZQZZKZ6oK4uhhQ_rpRE8Tlg6fN0Z0CkmfzCIyyNn04iT4NmR0oFlJTpE0ShFE1NqWuDXfnRDrpgz4C1OespGws3wWcVSpvCRwtgxZVULGrdIFZChXpnqmmCgeykAU8Vv67MW_HBnY4iBb8pZph62BIrlKqJYEqvMPE26aHsTzkolDg0Bd9QAcpeskkVwV4VdEfD20j6hBESLNRxAvi_mZN5J2g7AJx4EMinaPNsLLo2ChJBj9kstGQvK1G_fUO0rTWEDCB_n8V1FilrQT3FbRan6EZ4usg50IqogNGegoEL-35h8cgk_mTzDLax5aT0TyUVuoU4KoLe8yvv_YHS7e4aAFx_01lFkvuaZdtCRhEUH9OaFHJJljNb3Rm5iqkoQgBe0tT_ArCGPw8vqe7B0hzZRk1SgaZSFHrq6S1D-q2-btRenV_cQ0_jlA91MStexyo3rEP-BO8CxxEYsPSVnC8SATE4phDAgWYLIO3jPiYIRJSAnx7SoKhfgyuAD0fV-5hE1YJRm7DS-LauRRd6dd1vWiF_FC2EHh_iaVJElJKpmI4dSurOwhvvbmjJ63Nid2iT0Fnz3t8erVmoUV31xuDRWHPxN8jvvciV1KyPE4wK_gYcM-mpmKaQqA6va0MhF1OvehRMlDEb5y4b_5-dqmsbadjJHVTP2bNu2JBBWVorHYj2vdZb72TMCRFy6GtK_I5acTu8g131r-dwb_fLMsYxUCY_0lAVVlj6_dDrrYPDq5JK9rygLHUtJS6nHg1vfMaVQ_bu_5hPNniMaAMfRMJHNGzAxyGeaQc3F2-Wvc_bpci8EmcqmrLzbwaKHTrVLMNslAAcuyJrXntgI2cGpTWsvYZ57tI7W3yH95blvZZ3VFJHXPR7Ky9V57y022vBlaUIS_t_zR8oH2lRQqLQzZcudFCH77Nlm0PvMeWbjQlbftvrZr10_1MRglQ9GIEDnrGTHgPH8XZKBALiusL3aJtTpM-Q2wHkzXsD7pmY91cyAuhWUyDGv7anwUHWlEMjGCSIueBb6xk-nG5opXkKbi1mzm1qmdyw1qBnITAgdSKFa2qjVxyYDGG-5JZhd8mwcA-jxArQq8XR1JTMYtKHIJpNLFq4skgbd6UTPCE7fD0lLSrLpJa78ECtBCgQ2I_OykblRKlSJDcpSdiXH39ksGLqG0UnmynujCuJgMn0NaoMVPlF9HCe3_PR5DDOmMzUTQV_BARhOvpaAvCVfcVi4jycK_L0qv3DKJSpL1VUoDRqBtR-hU3izOGQ0Y_ScVJAbCTWwzOBfVbQL0CzgNBxZ2azfD7762E9rkFHXrNZI3fokEWJZgA9Pf91HNADJN2NqQ3IW7AkDS-6-LdpJ0XHUtAXime_dYHcyuHyE_eKQuH0_I0KHdBNrwxxS_7dyYiiYXv6osJY82o6iklqP02lH71xDg9OMIPOZwYtZV0plajyzac0BHFr2KCRRw7Vnmb-mdJGR0F9dHoR8kw1bE3xAJ19nlmOxJmiLPRi328-1se6-3H4y4S5j_NVcGqe5sdA84WmKr5clsn3mCuyfZSK8YgSLPuFpZArNyLfOylZG0Fl7Y7xTPBTLgZcmaGiUYZxza9GOsV6rKvqI2fgk2eT9meJzd0e4Ub4C_FsHEBGNqPZeDaL0yTwi1JYeJ375k6-JjbU0P-cQrB9qs39ZYz1MfJVH03cgApu4B_FllRPSX2m61Y3nVGxnKLeKoEfCzKG8R4ED7iwHwEaUUMnwvBDZj8_F9Ul1eLwZt9cKZ_BLOLybHWbPURe2I6fsUaAGSZnAtD8LSRZeI941yTckvcLAanTC8sAc8J77sZNp0GonGvCFtz7j5doATwj8_c7K_NsYAjvpPmR-lmXa3TTRfxPmzCO-S-tA94mpEbhpSCsFtIoajqGCU8lk2PFZfK52kNZEWCoqTomiKmh9C3bK8UWGsuqoNIlYXxOHyGvEuopwy6KbDqLWkqgqCPhIFF2Y7asrZ1YPL4LBseJOQHx9_PGzwIvDD4xmT5BdjkHL2Eq0lWg-ID9DXVmLv025WSz7Ke5wyHnGQs6XXFwI_GrJaNkmcql-xY3xu_8aZgG5hNEcyGq5x7nHJm4tiFmnlggNJqd191nWbyNgRY-55tyLnohfyuA06SpmGjph2Ci5DtMnDTKqSl5mhereKteleqtD41s3dZiueU9c62AxcXgM20-koekoqeBhNLfhc_N_YfegCirauGxBTUW1GGTL6-A8AHG-_FjU7GcXQVG4A3sk4mxibP34UhrULgYG17bnPuMcWKgeczBxqqt_Lk7krhkDZIi0DE83YCnUiCJLNuG00wGxHUqtIVsl_G6ew1ezmfAVgaMItuwXtfw3G6fhVLG9bNJDNHgUNHvYUgXEUjFefbeZM0pMzjShELXdmGXLtjZD7JLOJBjhK-xOgveewY9ATeBOSVLqQzoZICiA_2WMa0AsGB3fmLnIsqpxx10XQxBtPrg-Nyhs0RxW58aWeEiYCOhNE66NTffOCU4QYcnIBvfpmcbpWBBvstzXTn2OAM_jQJoHtvBN-J4xMYN9tZCQXyy9YzgQo2la6MVJuzIh2CoylEH6lHF50oZsKqoENP47BCpopWiPqDt6q6TCuM0UUdlWrmy-b6onMbi0nOA1jLtInK1qqwP2VjALdXhxxgm6ixU_X9FSWlylCMAehTHejl7KUlDJijB4frJDbm9dVPBMdJuuPc7uJlVnoyJP0LAsMarDnMJD3E8hD6WWjKbwi8sNno5Bwmkxsg9b0m8Yt85YyTW1wYMADTqQUx8mq5eANOlai9KfMVUYhkFRB420Jnr3ER0QGlprSOk1ZCYSOHmyP4L7v1HRI5pxilXj7Yf39NzY9QTUiYjk1HOh1NQvnDwL1YHN6srb5sUqP7HjiJb1sOsjh5f8GBnd_PbRp5GZBj5-J94htGgg3CYZ0IiKC-WFInFgJw_0-dsJ-VNH6iRksnSmxsrHh9oU3ioQs5x0W7zIEaD0wlr0VUnfIzZd1jd46E3w9ByKfVTW_y4JzsvOai6vW37h9y5ac7-WxfJZrycA2GX-lMleJ8enT0I14N2Gu1yyS2jRHTBibM_eAiB3u5z0S0BdDyL5mnb7rTDnk0eOWEfxtxtI1E5HMN2ElJfehxeNGfQU1NMi0XLXprClY0Z60ktkGwjKGIH3NeOKKQUKSeq2lTWLP1_MjaTNXf85Zf5WN-dXyAoxWsIwieTiKDP2TbLyf7AGe76CA8Rk63imZkk5cc3Q8Agao-ecdTLRjC1cxSbB2W5ucUQZ1j-9mFVaO3Un0zJCQrDjXlJElVBDcORW8iQA08N8_zhHn9sR14cUK8_c7vgxrYXujHa22weJ3GifZRdMVMg-2_1yZDPj3fUmM3IVUpVGX8GaaXjS4vtpvXbsisn1uaEyDBc1DwnQfwpDM5L9APBHwvqh_ifS8lwWi77tq3KOmfHRlSd-gft-kOABmYLQ8bmFrlV8TJSW6XvYDzoMhY5aoYY2iPAoYfrLPAEEtONNuocDlMnWx3-0f6oukQS6F5EF2Fp_LS5w8ta8Cp2JIwgxGGpqAC0afNuHYZUYOcyd8FFemvqITXm9F8Zdufgdi6vk2VNT2FFKqIx3F6v-2ys4EIAMtsU6yO1tOzkCUZR2GdzGp7I6kmCanbQfHKXi2_eGYI4YmLSgnZ3nO07BV_lwho6tRDDSRYo8Lw8T4Uo5DAG-Vq6TefgXcXrgGxyWccXW_OmqK9s8j_RWjdEXSpHLjEDOW_x40Xc0he6YC_ouwZg_hZyBSsgoLgqwxDmokAaq1cB6ZVyK-srMMxX9IKyoQgq30nNleZ7AlXig0-N_jFWPnPrngnDoYmuoK7s5wB9c79pSCz1dWIRTthwkh8SXqa6mcHGmFVW6pESskXe1j471GNSqOBRXMU9lsj0EsAUWFvU4GA18ksRgJz1s1derTKTyR8O3vdCcz3mEkz8koT77E5E3c-73n7a2ZlM9HYA14uZ6YZxRylHBDfwL5XN5l4qBgiEE0P8uk3x3JmPZFFN8RHHBdLU1KkhTr6SOkucYJSoWIMocWXZkcTHiTwzp5baTXsnoVaGyA92Rk8DF2ZgF-Gwe-vYIN_C4Wr65yvhfIgGQnX46ZAb3ST5BPLxA4BP8g_Ah6CsnNcXEGb5pS2U5LVsl7fPbfdIr1m-751hPFgT07Z4ULzVbPUR4OqJg3XHPFjF2dAcEwzBk8fDzfTB6lUfjfgxGAllLiczsbhSWLDYzsG32VvMcNV6DCO2qjOIXC6zAAQ_iECk2GajIjR04osqGetUVkdSRcDcPsAYbq94xR9FtXB1DWDI-QQvOx6vw45hdnUAibrXLyclX1PqZt6u8Kv4-XkkCaG9X9NoymGFt4JiGYEKKuRAGTz_EKx_udwtIB_4K1R-YLJk0Fboi5MPhCZlGAe1gRAS8JIxlBZoUBL1SNiX0TySFytaE-MWfV4qwKzbVmrvFu5uDXnszRUD80ZkthZd8ufY7l0e8BUDSQbX7EO1C7SsXj1c3rfsB6QDT4J6MoVu0aECUkCf9HK-mmHyVqzrSS2wRiZmVy6QGDbagjTgF_QAoqF44iKD7PDfjyQ8--3O4rL10vuojXhC0lNER-6Y9LmigoJnONPytHCt8Rq-ekUEc2kAU4DPV_U4LhYzcunCyN1cShapyfQ9Z-DrmRZJyDeRmlCJ4FZDNEIiPRXFVUNlAiTmjgaDk_R0hCTh83Vh5EE9qt8KFoL8JWypJfON_DiNrl4Ik17-3Es6s6rV_T9DjA-5GdR8cneaTjHMgb5BySYXhwFjHbguneY1P_TOF98-baHih0Rgv29gqHbStbQvY3OlOOPX3ZSwWNDvZJm0jtZuZ5nr5rnm61gfofjpndGlFbHcqf9Ik1m3pHxqhLlBLXlc7fcE9Fz2RInfxd2VJcsompFQqyt7JbXxnRHDPzbVeVArC-fLFQPl5tahU66r8MFn07sNly2FCGBn_wmzaqwtsPtQJ0TNfC-Wic2X0-zstLUq0DpJdRcclr28oEIlpA0OG98FCSOqcklEN7VWv5BNBjPEQ8T4_wK_nBrXR2fNhaGgvyduhGq06YdRgR1Yr7u1EWBeWhuitKsBcDS5a5SuluZd3KbzNrttt2LQJlPO1jB1I0d4zr3FIdUP4TYuVrut2q_mVFr6oISdYSQxcKzaegiOReSna5MxfQlAx33IcVOseOaDilPF53FnLRGeqUwa7P50827UDH6hx0wMPRmfEaxo7YCpewrQxLzU_W5WNKOJYf77aYgRNC6hTNO1kM_u7-FkIzC1xi5CSTJXe2QS2IX8r68TZkLHKrzMLcMO7G4ftI65EtrYcR0eIMt5TLr0e2_6lHGhe-wy1kbQ8MOVqMpwHJvlSi7cJkyxGFdctIAPzIxFe--K8KgaSwTVIyY_bkXoecbrKaIsjHY-BjuxGrXpfumODo24jh9_AY2vS0PPMCj3ChlVZjJLbJ2qeeMsQoqK1tYU07WDngrK1dTp_kmpmryBg5yIrUFJSJLgMSaKGXocmZnr74Fq8jvE0XEZtvgUyZym6tTG3rCmqbPNIf_cES19poxh0HNbzuidxU18T1Q3apkseVfKwgru7-9taZGWT8FN3G8eHNBIYS4YIuvUo-LNj10SBNrUbWA9AZthh6urzz7swwWBtYrX5nQvugBpUob-4xOPeIM_390FmALynP0WPt27EOnp8YP6yWLVJIThsRf7gvgbNgURSTppm5iKdIVprzEX7d_YB68gX3hlN-FohqZBXG4h7l2RlMlPjC1_DY-LexINVkWJIwp1l-c8i62KqDOML2m6tVirStG5pQq5npfeT7ivZ1emDJ0UiglrepKH7pYm__THPuK3EC_EneS_YrbMHGiRv5FXW2QEcwHs9pPf_krN-mB5Ph9tBJNekNppsn8EoZs3hJ0aLCxs8zPRcxMKCeqk9fBsup6z72S61hTMEwnQwSa8Ef6qBAOWpgSGNbObpCXJojQ0xDAabWCPoYnIoMVKlm74I-AQ8eu-W84WMHfQ1rG3ZldAber-6G_KpXSLX5jukbV5eZ1paoTHcBPyJsBinQvp_RvqHWAJOK7ESfTuMjAcNSeWgcZ7BWZedNDByEWA8GUoKI4UY_r0yTn4U9puY3dH7Ryp497kCGJG9AzD4VL-uoqnA87an8UpxU6xj9v9WAE9kxs2cMSPusV6rfNM6VgODFoUptsoNSK6b2YLKbMFUE78ZBoalnxG2LOtrAyrEq9lI_AbcJdIamEUF38Ws5E_FPcPi4SPGBZqUgWrWF9O3ejCZbGSdSD8WwW64R7fdgtO30sT2rip3qvJpEB1O-f6XNhx4MHAeD4WX3tdMWmN0PMbFs3KrrZoUwNZ9vSxn0VAKeM9UndcZg9e4o6xndt03X9mGFiZxqVHH3rrKDPQf-6Gl-btCcyceVjLdCJC93LP_PxDQq9-dDvD8blL1OImj5PZ5tu8Tb08rWpETUChSIclJM4WQQ97WHqnNthQ_aj5zollaiMRtJIY04vFl2u4Uuyb1E_n_g7h724Iotq14oavoNEfurbTorJ-3CFW5WZmG1S_f5LyQ7KLww7hPgY1sADAMZwhtf1NN8NgwIKp-meE0nzeO6n6zv-Zh4PA5CdVX3bfoRfiTIgQWQl3VvJjkkmxBtRl1zqSRG36jIf25wYTEEwAhfWQG0E_EKaKLJy5dewld2-SbrQGo3LCqmaHGoLLWdfKjvpINKN7ufuGrErrBVJIIH-Jxtc_LHTnktifL9u5u5HvPIXe4WfqmMsZvUPGtXhoJgG7kwNp3_Yn0di6OAqJkA-0lcl_hHicdqK7Z8PrE0a5erzYPY3oWLQpTvh-V__1KHD4w4q8ti1uSz61A8KsNTOBBtiDa5ZHiyc-Q8Og3q6CkLc9n4yb2XyeLjJ08fjY-z3dQGd4yYCBmXL4rZoj6SpQFT6yMIjKYUROcilMzGm9mBd2wl03-KrNTwiyU5lyQugKydNyo6qA2SXBq3I_P-DjoA8oOSy-ZdXJDr2WlCFdnA2Jcl52ac67WZupEfQ3LHSxo23Wexa8xxY8ej_1BkBXbqTpHLtJq9zeBH_rW4fkRllPf280FvvDSbqJzLkbjwSId3DESVkBiLNH2t7PrfRjqnH7aiKXMRpIBPgnqpcCRJAov98tEYd2wfVFM3gT9IFMFb79M3Ox2wvaSvoJIQLnUFySiAarLygKYfV9-BOC1D6XZpgTI3E1ewch60v7BSLpSGrT2eAx-0f2qQ2auX4ZMUkXQAZf263sOEEnRKtCciAQ79-Sn0td30mB9hyo7S7xV62xtUX0vn8sPWnVflq4wUuiD_Q5bkhhrXuJFdKAE94QuLgByaTiYF0omHNLGqVrfGTXimaF2pI5xjdgh7fh3IkqCamNnfPXtA772tiHBoD7YxLgRDUili3Hb_ba6qdM5hpWoBj8veogJbl-N6U12GbT1LhAS4ytAmcBSHgcz4gUVW3fYaibarfQQiIgpdqwPTjqNb86TLkA2x2IDilKWFuFbwTof3BBQ07PsmZoYJQJvPK6qKuBQ4F_m0XJLr7tz-e3X3Cw6baos3djojUiN66ontPRN_P6NJZHPvyFkhNkaS98oslYvJ2SJHgbQv2K9OPhIzX9E3kWP38M8ZvBx46S_ZvzB6sjfHxv07040z1aPHaja2PgP7SH_YH9RUqq07kwXe0NDO7pFeBY7vTUuyVm93aZbiAFOALvv2kU3eNdFsEJmG-RgO_NnRCmD55NhZiyu2oC2jRwN-n3_QaX56FkP9AdV6D35u1Fd3ST9DHvZZVKzpujAZiG0wKNXurbx0ti3-XOK3Q2YjJpPr0i5J9fsHp-9bIpsnbeRvW9MsPtYG_wCVNQDYl-W6R7Y5tUwsKXdstYfH_-urWKrOYlI6QxTOD001tiFkBzjcoU9w35zmqmgzyztskwlJO7XupkTjbKxCGfq7ms0VwnOGLNFojcWt035OF4kNFCNFpsZjFfdAMjXhWPevkD8r47yrecHXQq6odzs0g84M6XoeYRBd2yU6htq-l1VwUVDEqZVB6PUI1yuT2kOPyTmB8drZ035AEk14TE3fXtzWfWMux_fFuRBmNX6bKGxbES3wpbQfsQJH6g4ZDhRKngtqyhIFFjChpI7BfdqDf2InjOdCaRHIEHb8nTgjqI7WUI2LE1V53Nf7W92nXIYZb_rdVNuYfxlf6JNcQkcVJClVJgx3zyOwLHiDU2P_8TysEs6wF3A6k-DbNmWLubwBzuN1JPSdoi6z0_SEqy3TKhc4ghwDAqTnlX6DI8qU2TS7LOgmO7m17SrPWWMZI4mVTg9L5h2eHpG2cUiZHXvkyiZdtU2wVJjiMLnmVchrwZVy8ZEVFJP1GvGvKf4DAv1R8g_QH6RyLrGBKRfPzurjiWS4BtWGQiSBYySbnEprHJaM1WTKIJbFuBJ3xyr4TrRFsIUjlchhcXIEniEjnCu-ruUENdNRbknOZXkwdWj4ABkZTHFB-ExFZ6SZ2OK6FPEPwdrh4MS6gpDglFSscxch4V9ebeMxWRshmUcgtjgmzo30maBXwixQ1kG_KdtqPdHVWMdTxVhKxDDLmAsKpFQF-w-WQBDlBxR1KC_F326uq-p5cuF3zPtrqlRUGXatXh_jrnn4DNr2GTOE3xyDC-0cy1Vbnn7b4rg2JK9sF-XLr5vtl-zj3GUfIYDneEhXbu_PGs6AibgWwLNwEmf4qzeY1HpGsPwdpKebpE8DmsGUwn_pnlC0F1nmQzSyPM5wEsq0ofv_YOFkFbBu6RgDzy0PGjcR03ApWvIwX_gqYjLvvNldHoN2iBtRp2Gdewo4XV7zEN3p9xPEranpb0pi5QBPcvS_JRG6raI3DDD-8Fprup39B3XmPiPj7XNFihhOclg441yVpU7WkDVkdR7H4sR2AsefxN95pZZn-IcDEY38fSTBGWsy14IqRiWZbx-yQ3Btz3RId8ssz3z_sRVo5wncbEf3x_2_EC7LLblNiY14ET0cp6YTTlze7b5-brzq1bvqRZIQGspu1ePWP34tSAoo-BjERSeCcb-p1KpQdzHBnAtDL6faz1DoKnoxmHd50mE8aHLRkDdbDTaNAebMKx4Cmp7XIwA2t9lfoCzpHEZliiSAiHLEEfBsNy4-S8Y7B0KNKeiV4NU0re8cSfs8X_7u5je0fBVM8oIpMBnfM5sVTMGOyoqdADtUSy69cSi_R--hYiBXu_Ss5NGoikMyC2Mc6wdy1wwnajwktR3FQaIlV8fPQkj1N8FVKjCdDwjvBnUBXKoXhRE-C5geGPFRL5-yFopbIWDt8D6dZ1uYNGqe7uvrhhoymCTN_PYVkuwr6kTOYhmeLD1Vf9nREDaSIqmxHMxMjnqWM_s8AXzlMgwUQRpx2sJFulY0SkrTf961s9URPI2vmw8JydRTUu9eHDLIOGbbA5Oxx8tLmNaq4HnlTZreMot-LjuyXOsDZMItyTSD_PZJ2Ts_jR3vaW7L6NYu_q_N_fgd6kj22vYfYcByAHbVBd4FgLAtKqbo-cadkJqWCuZqh4rwvCpn03ZmYqgCUNhGTHe15JzBiMdBNxThkZuBUywsi_PP8jK4Y4Y7cUIReNZsRtmvAy6-RjdB137-02mLA-mmlRUhvivsXEHNpKwXp4q4_Qvj7IF_mI5ZzlC3XAU_p2E0takB46jDDQrQqmuywuPUSFCgD1SQvh--9xYsM-gEq-ZMpGFsQtXYL5ppAfVcI1jBFu--wjcysoXw0rEOyNTrkF6BN1t5Fnrabe9aKmSseH9iyQgvVnG9qAFt5gzwUNUfAx8CFZmvNtecR0fO9wLLY2641y3re7VIql2H0CcuChF1sI4f40izJ892H6AIJYgVvC5smZjZ1l8Xstk-ZH08KwJNf8F_sr_mcxkwbj7VHBNcIB9F3b8_nhUEIMX_wIMoJrBA9wzj3RYHeAeeug2i_WiGE7lnfEUqhaq4u-80CnH5zXjyjGKLngehphtTS_iLGXiiuw1Dwg8j0_atsbOFkh_g1R0-17pGd-zVFDu0OPIe2YzeMThKbwndWqU3ODqop-L4xnMcw4c_p2AVICwsyvWlRLY3I0t0wcZHyE7CW2GD7NX7QuA863aQhEvIPjk9NDEeDPCA7y56gLRbhH08nEkXtWzwqfrkNR0EV9pNvhRDrtg9LZ8gZOx9Hf7qHxTiZh73j1GTnLiAjykzZJdzEbifdJjYfFjCzwJFj4aiHrGI-Jlc4Bmr2GIMvVjCVd9waq1ouLBdsSlujrNgKDyC-1ciq_Od7LcNAnWg-OmxM7NgC9LPB_tvSa-nQCJOUay6kpA4t925V9qKK2u-fEre2mPr9EFikjZN00Y2pmwgUhjw_x2bPlFeNX56bF6OG83juPQy4sazd4qAP-7d8SkUXpYJ9uAnv8MuIjEn45Du-YNpadAORlGSjqfbeYSlni1njKHoevYuGJOov9j6T-5usRqJSR2T--TxMrX-YIGcvjAe3y7wYIucGbRZ5bKOPsjSUcN3xaVnAPyZLuQ8xjDxqMF_IPl6RNtZiMP6G4tE2s-qRHm_cd4EvTBqlWHbfFZYhB6cXZSz50jYozduU9QF9DB13K29NU55vSc1IXHpeilu1keBnXdOhi8qwxOYgBPMgH6pwdNzViNrjRm1AVDy149zECdM-f2K4hidCmZUAwRKvY81VkgXC1iq2rc6miV1F_Su_A923FGb1xew5y235l-hHSZL1xJ2hZA32cPSTQUnG4l0nmqB9GB0QG88_n8lRvVOz7QgNAqWVuOfx9QK9ukKHVhRJTqC8oLQdO0mu3KWfNd985MMMOSU3Wc8fCPjUVtEophVMpvrAVORB8czawWowCtPlKCKoTUq_oUJZr4x1G6AQOOgLjGJNklpKjybGZEKD9mDaic4-Hbyok74MgtDx8AQFzUftxw6Kb8HJZCIUDSoubVRDDssLc0n-j0us7evSxGAgCK9F6XnteYiFndrbPYeqpwxeD5bE54EEonYfycO4zxiMZdnYjQrJ_vk0nQXHK7dZgTqMRSnHgiEfVp5MiNykPj6uiJUweHkk70V6tSUMcQFUxMGI2FRQEsUIWvkPnIlJBGQ6WJBkLIVa0M9Cf_skkehnXTwUDQuZ1u3l_CriQ04rRCM3iGCEYKXFP-0EZam8NyVpf60y6M8WU--nC2qv47V4tgpPzQMs4RM2LGQiC6QcK-NALLEsaNIj4QRv-50_d3sgLtqXPFxjyoi7_HJcyMWdMAw0VlTqzV5IiWUl4EVXQlpclfPwcF2nkesiVfhE2FiSoeYLNlCy5diXGEXkM-LmGXF6yN2KuUbzienFWFZ4iNRJZcXDakqD91FJqtrb3H5p_sFFDFSugQ9UDokFch-E3Wbr2gUBSOMqbZI3xdYNsInD80zPlUFVxAiiDN7G-5QRGRHMrYWtEfP-UTxElr5s1QtIfkcLu9oyMSC2KJzZUSxlhGgfllECgU2DjwWLfb2AFHMl0b3UkWShQaW-c1i-Nwg5iZqRp9irDrT6h9KReC2WYRrhblLkfExfYEK-p5VNeKgm1r_e2Z9deq663cqlQGY5rD2KQOKGT2hoOs6L08LM0knb6W55q-fwsYqzHIPbgLuCO-YixkoDQduJcN7Keel-RYxQPnv4R5io8mBoRSGxIg8SBU2HISsub-vDqun0OIPr0X3ir87lEJiHelij8KxZgZMQGzL4DiGCirfneC4CLAmnH-D6Ar8dZVuh4dfmIwG3svrZ8dPKRgOnteq7769YXCx_vhvNmp7uwHZLzt5SFZfyL2KGdT5TJO8-wj8BDKYglPhAGHELS5nyxmwnO1J9Uv6ZZVTEWKURGa8iXIPhUFCNvhljjrHOayVgdHvIWpZQ_RQlt9nyJG_rdVl2iLI9qejt05Q1S_sSS0KjxFseAG2g7TCHdPDtfANxVLPZRxWbjNmQDjEoo_KksilnWQlDTkuqF1bXRgydILVXN4-xx53DZFu6IqUzISDhlOTsAp0YW65bHmqeV4IBmrRsA52Gt1L2k5PnZGFKU4cX869b1ZaN3jg0uFuxUJv8D9wme22hTPXKzd6yXpwdxWekSk4--O-0gHMw-k9pnzfqHRQooBFSNe_kr8XnXOFEqapGDOjmcO-CPn6yZ3zSVOBZTn9LRieyY92ji6KiGoqj0Y42DJ1JOyomUtSIfzx-XYKrWAxKmknk9nzINl0vOxZgqiFTYMslBp3WaDGGhHAdC2jVQMjcYbEcpTjLnCy0dumTK2eE6WA6dPtQ0tNAGj36U73WEBd5iH7sKOU3sdMQQJwyyw3POmntI8qhmzam2ZFI8HDghiBVm8XzF5HledYAX3uEzaPjJpux84gA2ILqDZoOR5Yp3n8kv-vU8Er26E4bC-r-qboIp62imKc-hmoInp1SJ_dtktkGv1gjPQzqh6LaFtveaZxjtgmMEtSa97Rj4XnoGgz0IQnhuI4EuYNanqafWzfIx5Fdfri6GBtYnXIw_joCKNTYCQRgiru0YKbl0hX2-q1RubPXAuDM0MgkcqOY766oHhZknpFU-KfEAlrSr-1OIQqxVZwBvXGmbwZh7DZyUJrulq9JCY2YKw8xdxyLQGO88ei7XZIBNGJEe3yPKlVLltQWpNVe4NxssKd_bd94iUIBmLmKz__hfak_lUgaVMsdAXsJoklk-ur1Yqgnh59XC7vvJGBZ7lT7xFskQ-TQkL2PGLOMp-4-5WEdCq16jM_l4iOgRE7Q_6EDlxDBIDKNhHsp73i3vdp57P7Dz12rSNrPpWRplo129cuas8Ddq8qMqK591aw-7fXkFyQQxjdTco3l-alI_Tgj07FxEfRwAACrUeKJUBIcVAtwWPx8EWC3wi3r9TinQEhsN3irrGCnenunS0szd8oYACX0mjTndzOtugBNg7NhxvGhJ9RpYN7XcpbYsH-acIl0sqWl1cEoUZ6m1NdPIqudEFiUhYN5W6FZJLD9Cw3UogPXIdCl21MdzUJwmEhpyeml5hEEm0Or95aW979nI0UqbUtd8A5oW8EyIDVC3IHe4O0ewP0CR_cdLbFWmukQPPeAClwFJI4ayuWn3lqN3VY0wW6AIflHlGwJb0i5T_JQ6CwLTwHa1nGJ4tZFSQAMqJT5jvgYsY6NKvSNkzreKs_YTD8MrG2K7rn0hdARmXH_VIIYXRhbSSEMGub6ZG7nLVw92tHTYogCCq-wM6kf7hhRJ-u1T_xB0beL8OELIDj5yPZaBKua1CnCIaehSKb8tuTBuJSuo3Kp3oP2zmv_kmfwKnjkb8wVscyif4DIf3672s_Ki8F-JKmtkQxTQs3HXrmeVVVtwYsACfiLkVkF5CIMvWwkEZQfmvooumeCLPUt6Ll02m5zgaj7Vwfy7Fnz-3RVybNNqUQe7oCTyszugnsT_lzTX9MXvNwTQ90MTB6JzPZnPPfxHiFdqPfeNVL2KfXqQXW_CnSIZREHXGN05rRYwmHAFPM0CaBlLbPEe12yv5BKRZuQcSxQbrPfeuCdMdLJ8qFK31_NTx3d5RGIhgtfHFAcT3FjKsvElfRIiueuARH35ic6rVKg-wFpmKVIWn4w_M_r0yo-k32Mfw4viV4xLADaCufm20-ZJpc7sX6FEDZNf1QULIrD6awrGckhKNDUq1X_17zhLx8zti-JnzAUZKzbUA2lzdw9zHwSGD31Fp7ggSXuYlZH07NfVGu6oUZzcv6tkT7Zt9p44VTv5CMYUmiY72wtcgotNBUukeI8FYQSFUFHi9maESKWKQFjE-RNr91hVVQDg__ln38jfmMNg_OJzhDe-ZUtSaslAt_sbYDSfbGbdnQRn7rkoHQlUW_OudVmL3mQi9bTWf-HwUVo6ECAUz25E4MTjeR7aC60Rk2Mfa1GMoJgIs7ICJruYrYrzXMqjWffQ3yWAqg-u7Xa6e_obJSLhEQFg1DrYAHQT2CGDod4l5_O4GJiOfHWInxpwl4LC-_jsqkoyyP0OHDglfgZNMoORu33ttDMDGKeMtJl-AfOPV__plb1LxV3Z2sCWI8xHiqVR6ddxvnaIZ8eWbfZlYgLEpFIp_OrHyhA3-j3UOA-SAIySgsGWSMoqWAE7NXrRaF6dqU5RWPEO0c6zzMa6Qq8SXlhWJS7-Rb4s6B6EVX51SUk8lJ0zoLYKlxBWr1L7p5x8-rig_t_yWH9POv-PETkRE9dg86FW51zqYwgKL9rTV3wxv_8TgElLUzAve-7r2MM988T0QA-yowOfvKFUGu6JLHSVtXLERiPaybhPefTko4q1c8NhoOf1u1TsZrnEggXkJjQx34NVyXs-DSYvHOjaUYdUx_5jyh4Rmh3qr6oVfKEuTE64xlF7LHyCUBJHZd4RpHUv6ZAmUe8oKWMqBPb6sKEYF7E85ICmTHQMToBnssBnylE4roxvD183FyVm0XYS4pgaqTGJ6CF9waaSi-Nuw1XWZ5MmCsFnBPw2fjej0-9SdCLnj6vlXE7eo9LR-VVVAfOMV2JbHPSKlyE5RnxFYyI77dpEbY1EZuWztMe9na7-reK4BW_ud836M8pRpjsREHOp4aC94OgmQ4QjHjjPo9KGZS6XqWhn-rE_KlJntC2M2nnr0T576Wv6lHoZoLejODo3gs4ajtcSyhtlbyeOwC0NSQlyqC9ljG2j4gFmQahnCi_dnlZ8_WAQChlTw3bpJ6qWhUL4eyqXTWcYuMtaTxEZQPjA4TNPgjWBBpz3ljlD1eFQOpXA1lvaKKJzKmNLkAFaIoQNwdeeBmJ0Gewd2Eyz8evWU7Han1BMs8FNocYRYvFsXzr1QgYWZlOEUbpnuJFTA22cZ4PCDgi0u3-0K0LD5a5h4Ccf88cOp4P8_sOm-nTljPi2zkBjvqk3OdRFuFEgO3bDakYQtiCp0kVnm8UDJLLeCmLGzIc3MWnqQGeg7zRm2gwhrye51M5eWvKMoy15MoRHoHUlNV6ulwfqiRWZreRU2OEvT6UzuKpcENmmKRRL9TfFj8QXYZ5NIhC04gpB4w6-G_jLAFbwpKpjFE77ZiDgDA4z2iwQDNlbhMs65wOth5hFrXDdrUpxCYNxWrWvo_eiv2vhN5klONQP4GiYK5NEHoa_KMYVHlOHHZpzuGnnCeSFkN1RC1GB9SkczyfTKc-ic-lkNvIwFfWhq9_Vm1R5oZGPYYF25hCXk-WOnSbfKH435ILctEVESCGxbzshe8j2cfqJGhuzof6AZgD7IZsh9Evds1yj_mnmKNiAM5f_8-JssMgE9OduTkfYqdz3si0wBii04FunF4M-N_6JBF5Nx0R_KiV_0h3ZcNV8ZSJ-GeRJaxeCVYsJJV6xYPtaojtles2zROvmf8Y9WAKfviRxdkCU1gqRzD9qscdt0DOttd_2Dst3WIYo-EWWZW6fwd8F4C9dodb_j10Ks1-t3d7CM6Om-poMCaaVZCqbEpQpcHiW2MY0TI1wzJe9rS0-27NB372SykY2bMedM1dB9nyUx3EGXaqON_r5rvjl4EoTwFeUKD2jfU65qY8D0rSlGsL6FMh80GAfPZQE1FZeDnSLZgjwXFavbJmxbpsWlvGVLU53tbThCcV4n5k0NiEseTV7VJFs3NUBoZ01Gw7GCBXF6gMs4nOEPUweBObv8FOkwTu4hj2Sx8_Kk5t6V_-DVSh3k0Nu2DAeD3coXcfadGYv4VembVQs8q9NRAj6BoNdZ3ICKGTC_KEHH3OUi3FS5sTIBxSF6jG821QU9LUcY7co7Q3A2CHVgfHlce4E_eyREWPJQFvuB5cn3rCeBKsZPICPrtzvg9z5BdaCCF1rBUgvm0PCD-DbiMe8xQvGCuuB90MByz3rKnHOe5sFdf4a5GZZD5FzubXUbUdo00YeQV52ppcMg0nK3IogeybClb4pM9DKmfdewe7h12r9bdVut9mo7i9CTjN56wYKKFNsnPOnHTMDHPYXVHJ9Brgi8yPa1zC4CrbVwjP8wW7f8Og55SR84orNKDYWBuJIXOomnXg5pT1m6mwNAlzZ2chB_FP0ZDN7dvnN3d8n12mxmU_xvgurM6E4n2Ba8H503MAP2kKR73NTtxMCRf5eJkAYEc2Gyzjqt56yLobBEDHV6ltliuJ0s1yiMNKoY-kZBlkoxXWaJ7ktK2-H97dU0m0iiGrce8QM0klyN-5JprLt6ozVb5fVa1vlHB9dnuO7ySCezbOvI9tKHbvCO28MYDfDFpmb638JY-QJ_wONOhBmlZltfmT6ngFWYQ4SygW2avQtk15UY6Gt_jrOr_CX21NL_TbqUKnT0YR-aQ6ENjImLd8g6l5QLleWcoYtjQb6fr2ul_YOrM42WnSg9jxgUDXA7GUSe7oFLNTil1DGEQGeWg-XMwXqXWhxok6GaIuB_2ePBCZzyx3yNRXdmgpMRWFlyhNM2NCKdgmVhk42wt1yPJxBC6GpEH5zOi9hKHLx-5tHvJ_eKRgNdJlLVwH5_O4SIqYl5okm8UNiL3aGbZQ7ULxNUXNU5NFuVD2HHiUFZG0mVhLRUQsOuozDtd8O0yesquMkXQmy0FDy-SsXx9sz350IOyZ4k0PBuhgCsCyXbUzVhAlQj4S0cEZAM1_K-TDaSltQOYbS56wMOHD8_ZFVnKtCuMMb04Oyg8ylrS9E-gRb5DvhWISaHgE8_FFyNigqP7I8aYO4zvDf1_sweqyzWQCLweVtbmhq7XavMehPJD6vkdLPJJxivIz_AHVoLjZEvO1Bi6PutwUKyfwV4hOfXdPdYvoQFLe9tRKWs9GZddsoLoCXOduP-qFEciy4ERvFdFd4rWtNW4A3cVUzpkLhixmtWUkhqRD0jlvvmA4CU0YOeLAx4cdTnQNUvdhrxpi0BqYWTRKF2918-eCKsXwCSUNRoAAN5-_4PR_Dx3-sFNqGcckkk-fCuVDfRcTshQmxuA8TOn8rRgT2zGlDexWn6lR8ZoFqK_nIeAPdB8lJETDPemj3lcF27jPp2j096xasFXYd4XM4WqCkB5mU4QrmuVurzkDHE7pItHXojRF8Gz__Vb0JEk6ZbjnDHLZ3t3bk3K3Q9Wdb3OMJloTPVxGSLxQPBRZ_vIRMizYowpUN9sDNDS2uyW4nufj70NF1INEqtd5ovlqBqFxsWzBq_jMfZ0LOxp3ZjAAUgvabD_nxg2FocHwRf6h9fSX2RY2xLSt-NxBa4X-C3pKijbET_hQWhF-xqVigOp0yqUmllVelw8HuBYpp7rw5P14mUs7kKN0rWQcRc4BeEFLJhTVB_EvCm0L0IJiNH4t5UmDt9egzjjjOP_fjaFTSvZzCkfFWWQ7ihN-nReNAtANp2saQJ2YDXmJCcIOzq46CCJw6JJcjSHFM9V6yPKDQ-4GPT75QOahBD-1P6g0diybGypeCE19LvYwDq4ngnS_v9guppsBxawE7_rt6NepT6RcIdlRrFUxpTPS-uSu-LarE5w1cJBxN31lupmD9KCCt7xa1MTf6A2c3YOc20sK-S2gwWasLlkJBl-fNv3PYrlFKiw5ke_OrIKBJjH08QWJW7uJS59-JTgGdX0_pvzKDo1LNOXtO7U7XEHLEVnlFxP--6JYoxOgho-fKSnp6KvwTxpVub3Zcrx72IGBP6WZmwSqtDUbLgFv23N-z7qySwGpgD1gEttoiwQGPRsrvEUCM_D1yBUy4xeao24gmkeoRlnoue52sy001RZwdXSGD4d2mBT8CRfFIs9aXfRUnW9CsrHYmBxA2dRIs32xv7THXq3093CPmVz6iw3Iju72gX2jO1e687qepDH24Hf5JgpeIURwSwGWd5qatu1jn8LdV8QQKgivOFO4pPFv4rnvChaJprRQgrKmTaUzk2A_T0zKBre59nxqAEJQX7h3gQvOSVKzjVoyN-0WvQg9FvhqILr6wqWtrqPnvutg5bFs7IrKKAqnegi_ADRGIA2ZD9n7Gi8AhMa0a2IKht1BSdHfM4HiT86a0A2KByrDyJZykq0zeiOt5JQXSgRylJ6KQu7XT0XSKnKb87J_dA7CZfBrsmQuX68aeykWIsGPlQzb5uc9DnKka402h1Nato8hNkwv_MYL4OZUsXh2lN8ZI4CA7gUXZBkmaZ5UZt_gAKPDbrukYMqO1QaAVs86pvNoUYuMbbcqNOTkWxpsB3g8_RhTHKr6lDp9H0vqaPEjf0CIbW7yj2xWdcRVPsogIPI7Xzv_VXOPSSB1Iay4DYYsTo9JtGDlGRMg3JlnKTR6lT1LhTcdCWxWsfJIU3w8_1IpxZzf9sLzIDWT4IZ7OO9uj9bxyltHTuzpD3zP9No9PzBq5oJkpS2yhwhmau-GI1PLbwo2MVlsrUb2sQFw-6OCMYBf_rGNGxNThN3d43A4ej_WH5JA9gpnmzJMETYXmOFHa50RGqgbbhY6Ev5ysvaX16g0wPrxq2EP5EZMCN2F8x1r5MJl7jIgrjnime-RVMmviuDfQjp5cyctgAUx1e2SikMYg458Fdzp4PGv0A_iakIX3aRh2H02WbX2wcbAMd7L0SszOtM_BxojhK-vDAFrH_LIaj-ESbyAXEuKN025uaIJBAq0uq5KEVTx-i71lCBKbE70BLHtpcbLs_sPsBkSd6luuvosvQ5ZcwrRKs0z-Z1_SfBVISpLCgBPHuuJ9p_nzeQUeU5-C5doAz2XiC1KlQeWhYC13Xr43RKQZiMobagwY7RIH6KA2q5bG4lSxYdH6KgIP__6qlobvMl-XzaKOaLIive8DcPv9yG8eeI_lEKwG8hlqJpl8L9-7Vf3yAEXyFKLbsawGEa8jXCKcFI87LQP73k1PXjjfMo7Xj7k03UVEd04ixjdl6VdRnHTILpgIiB3OeCCgj8OkXzPT1kbx3OF7tLV6jOqzx7zMg7c6nXIG3BdKBKo2cIkkXViodwZXdBklnXPRa4hkSw3UuI-No_fi6_M7w6m1iaF8yuV3opiGvjwV6UnhRCF-yf4nLbMuX35_Z09-JlIuGybrthQ0wB0bbD1nE7Ud--Gj7QuMHZtoj6gqrIJ3ukjBwzADWZsUMTOVMQVlHbCOKmpOjP9vmqt6oUM5dpPceTiuHuF7lRvKF4nqt7FaIvj0ETg0XkCUlk_tISPVgfN3JMIczAwdIKtmdQHjcko8TDiSU4U303jIZ_9wdW_BrviAqO0lrMXCQswOv790vAuwxgjzMuIkkOc594a7hePN7lLCGu9RV51ZI6E2X2sHOFAsjrXtBLf4ve6NX82gzIE2ekL9DGylfDgg_zD4_Mk5w7Yh3c4-6VbPoeCeTtWXv5ca5j3xg26M_d231vo0RpUYoG-ItE8ubOrL3S_78er9qZNIlqH8OeJzDnORiSJleXf8YZEypSoKq3a8b3YDFfcRB3L1dsIFTCjYunKgot-8_OiJD5aJNAbNWDxCMfGFMQLHfhF2CTOO3gBILEFLqlA2uI_NG9QfO1CM-56gIsWtn_qaYqHeYdZjbgT7f9vyLmJsp60gX4h-1FNmhQf3twdLfb9LDzCabmYTnrGoEVWBS9Qj7Ig9g6jK4Ct42ZA_USgDD13D680DKzDB8iEBWmZaQ6SsnHenEDxlL6utJ9So58D8IOInG5zQnKmQn2hocAU0jlMQkGqWW-1fswNNj2EPrM-mKg3A25iMw3Yvmwnq00vUS-VZNhzCmhwou_Xe0Zp0I8GvP0Lj4tqeJVw7VY6d0kA_--k3-7uqRq9Ps7zN05TR6DiUvDXLyey-TSNjjX1pAAssXFTR1S6ykTCOgc_QSI_68c3Ln_WO_v76upvovCEMjRizNKE_lk9_1l9nPb0YiJV6TGSohptGRDmC771M6MuFFgylimjkFxN67yTKPCTdLPgditPhBnuC6cKXyNYD2gv8ZldzoCMaJmECL2Ta58xn9p25j0FcJZlBeeEVMOOG5jKgTXZY3nygv10OaSHIdYs57FJevMrPZ2hzE1-OEMIgKBnaa0sm-Fs_0OqNUeR50wR7YW7fsmosW1WqKlvFQ7_FU9UbkZABh49hIgIZQvos10eLrdku1JdV4s2hv3FPiHevlfMbSv0cpSMyANrl9tW_OEHgZHBNuHEciUQYvtKJFjJKXXthCEXNS1rdr-mM_hTRSWRhc34XxPcSUVY86X5xfm6ePe0JUdXngJzk1Yo84Pxly1JVTm5ShSLjJUoOf-sHN_kkUxw7nijpyivg86Izt5gpPAFbGpiESRgJkU9Aj_eiJDgrXpn5kJUJr6tONVlSo0HCaDbIIxKAXKAY7poEAdp9zAQUir6GYJxXzNdc_-ktOmrfBaXh0POTxFPJwB74x1LF4FX8csqcC1ryOBnn9vLDvDzws7XEmXQzNxgcXDF76_s7zI-JbjLAg29uHppQvDWwglUwAGy0riwxnDBHDXQ3Z5SaopDuIGN66iLMkdhw0pe9pYy9P4Zi4boZCRESrgyB66SB4moXzkouqmPZSdBrbkWc7r2ZEdwXZSe-kmVlLjA5B8gzwKtFv1733m1oV1drFNxg7Qbi6YRb9jEA-vdc9nptUV-dmV5mkdPJu_-ZGtyFRCpfGn9-7c2g_UC4QEVpdftMOmBV5BL7iTVSHoAqmmkFDeUjuvKUm6IUzp1FW4hourEZb-ExNFn6w2TzKI3DnEKIkOUjMg9tI6I1iODM2A_w-KlSDNkafcM-COKph5tQtVdG_mlb-LtcypDXS0uuBmChqNEQ8j57x4PAOzsDyp373nHwXvMKZTc6QAGn4vf7t3znvMRb3RMgYGOZWrzRTnbtHIQA2JRnRR2wI4c1g1dIK60skh0kcbGIwAyoa0suxFuno09LIUa3Ob28rFHthCbPnowQ7o5oEb4YesJ-PcIVGg_vL_1Co_6UyLYaHQkzlJXIxkinNMb-09Q7ZPvaVj3619uzjHowAzJPaEzyc1B1kXS2idJOvCvuXUjV-VCjr0i1rJ66qfCfh6wvXaFQfEocRJTwmYiEpomi9eBaBdfskUGJF0mzF5LILlphugJvJXhfSnmLppSVFcorkomrr6FIE7fhHYyIpHKRSnI5AXuL8lrQv64JBbfo--k0kmdJa5rsNuos63hIVP7Mx_BI2ZSRKZfH4ovwGXbRY-kQ_xxre0zbVNGJepu41opM05I3_IZmoGux59QpZWK5SkvtNabPeNXQRqDCZTiX70Irvghf2mzXAJ-ueKkYjZDLuOVHcMMAZS0UovjAos7RbRrDkK7j6k2sjtEYqBSZ5w6vFV6qjIPRK5zXS4Ei2ccdmETGQqXi-RsnyM_nwHbOFJBaxRDhRhOauSEKu0CMXMj9-adlniM-JiMvndiJt4AmoPtOIwg_x1RpfPnhYL-wBzAFMhm3G8s_7gGsUBKqIzst1GaLidSQfQqh39AptWF42QvVznWK3yMqtcCviwrJ5GbO9h4WVQ9rZYaSiiQTrrnLLWOL3w4Wpe30CiwTm-2Hzg9JtAukJk1W2NiIiXAICDAnS2ZUQsFq3EVUdZNnD7vIfJRhKVadqMvOsRRnm5ADhNtiVBBwtUNJaeasVIQdYSMYi057Oyw8oWJh9ZmmLvAljT8YVjPSQdXAaMJHG6wX7fwYEo9DxwN70DgxjaHgVDuAw9i6NbczsrHNHIjmH1QpxSpSbZZt8Q4E2RbgA_ZiIjLINrQGv2st9qqvE1UspCvL1_kdRmPqkz7RiLaWqAJWTdXFguqTWB_sToYNXPxgOaWx_V6laqhzRTFjtXV-Fw_Tpb9wWKVAoNwKTGEo8w7PfRXDYFmEuN63JWpXDW4VjRyvlf5TfQAwYS-8Dj46hzCDRcLAByBBCK4ul7JVbKTCheVvKDFfCUMq8uhXa0VbEox9F6mbXninZovKsx6xxuYInvs_UpMqqhYFRXifZYO11Mv_vDYKmiU5JpiTzR8noN1wIhJLiLaMEqA5rD0GijRIGi8Semby9-CBjsygc1DsiCSDOU7ht8LHSs4owEaYUTgF4lB2PSkIzyqe1udtmvYqK-QMc0IJ_oa_bE1EHkpnbUHyTKvZd-wiIRkQQ2NA4bgReD42G6PwhjEnNIvfWXbJGBbNG2gprkDUkRcvpgPM12CDEYEfVCDO12xzIE6hZtAsvHf4CwLh9cW3ZfvrGbhoPcokC3WYicwLpScMVLOf42TrBpIK5S7f0SjJCttWCiIbvG7LzpbTAXjnpZWLHIplsz-xUtXVLQ_VInEmp0-dX5t_RFLKq71qLnC89z5xxIctOvk23q3i_lPxDwT5mSsjCXZHPeiRu2QwthnJGLq9qxkYiqWW7vyn1mxoVwDucw9r01NY41dS3cHoYKJGA9GqeA6PT-v5UZyFMTpPYpntHlNQ-lgiFh1bNZI-Ypjey7YQameGjB_IPbLqlb5dfjrf1A1cQJrVvVaarpX1qoIJIYUYh0qsA2sAS83bT8zswb1lkMH9eWBO1XSiPt2GNlo9zs_8MkoBK4OKiAcaaR14u-gxACAtyL7HXXtsgb8sX1V17AAGYatkFumFFsF4wAgSDytytHvNm9VRfvBj-b8DF4FPyLqsdb-aKwBilYOHAQ4JjN0meZw--4hdYLEIcx-tiEPp77oeIdYcF2NntHR065nK382PpIOAB-8Vn0QKuNTz83Rpqevu4WpU1awCTfCLEGotsvWfX3ygAwbKrncfeSNUS9h2UVsdOlDHa2N329KdzyMnM8hZjAY0lCZ4Zy9rkrvejXf4F3XwpubwhV8-uzcxsYa3exDcYSThzeFq3S6F-LbKkOQvUDHp46uineh0XFfXbo6J_8stzCn4xniwzjrY9I9quKGu7CSUSJ554riFgBc1m7jungahzHu0y4nQgqfGV7B4EsahLmRNugjJCqW5-8gvKvBVfsA2tG-OpKq0DpbXfXMgv_ScC3fESdkkvZu5PadfVBfwRAdyycX3I0zQlyRq_UQLiriGJk0yYxsS0IC8Hp0Qxnxw11IIzIVgd5XK-mtWDxi1dr6m655w8f2xfCJ9iEOHtRi7CxLtYGv8fh0d_qXgkhlCUvjcKK2ziSbWfNgkgPtbp4gszsn141PmCcdcgCQASfirbSizipjB7avmkZvlESdhLXuU5v7d2TpSLnydbUiUcARBrE2Ea0CFSsxjD6AbU2qLq8ElnGZzeegoEgj9U9oVHHMyhcXGjjpy0XiNJQiKyliwqV2__g1YyjVzNvoMkK3UW6Qz1zz_V8y9AVLOoWPQRaDL4G0ExOVTiIHl7Ot3vnC-CE4RRo9qsjKbowrUf5Vik8eJm62uEbuoAoFrTaishfsH91cxQeHPQWTZQBXwyVelzhI_yeynqpdcvgsS-5oOOgj2bITKFb8-Vv6_AUkvRmFLnX1WAqnh1I_dWdeRkJBJArAcTZWQunokvsisyadWzgnxttdanAa92gbCJc-LuKfGRsp64CwAYxbbJRsJv-SZ3a90h6VIEtROzb53eX9GRlCbL88ZgOcQqMZRRRaKWp-yZJcDQ1npvoif98MJWyWtvSHXumOmhnkxeIq40HXHtL4BLZRZhwuFT8C0c8B_6CLwBTBxFFrzrzgmJBfTu3S7kOiTrCSDsjxlsvCXH1jaKeT273VkMSosrTrppHJtcVnRcg6hlQkL2kVRpf-7EXXJQCyok09NZbxr74zqBiNJJTbTOBkInpzsRyyhfKh9-nixPxSx1kcj2SbCstyciLgM38AB5HysATThdmFZqJmnCr1lX6lFcKegLA5u-b-8_fMcDXqJhjHbXSyQ1VQnOTVrA35fmJvDvA3eTV5ZL6CUm4Y06krIkBh6lvDj_ouhHfjmVRsyrdQwcTW4UivVoalfT_DNURDp5xy9APXVnL6aFWRKS7-v9BpxXgTlflJVy1p5N2JluC8vQVhNimU0_yR3zwRbWYMaYqiNtZYTpjVilK3M4cBjQsoh__RZzyVr0z2uR0zf8KVfr_C1zDzmcWpzCtcBmVOEgPfrVcqoYyn5fS3u4IaB0AUg5MINQDjaR8gjc61lwm5tGlCoahBqJqqJloIpnXgSOEjbnuT0LX5xKWv2_3bfjCVjTvcDxqisBrwI1O-ndxELpcPgE_pIoRg9dPHyv-USE1uFbKwRRPmxz-vaWxyG7_UL0g3nfvg8Acf66VU6aZS1OGq40Qs2zEwiQ5XaMyIuQS84SZwPCcteU9Qi1dSReD28dIUVWskOGCxwAmcRZiqFLCrPJ9DXM8F_pNoY5dTiof6ZVUeZedaykrYm_H7KpGNPk86aWKPov35zc5NrHzIh1lSDO31QiVjc83NYNsfA21KnbbdhDdIoBHQB_JZBtqkFS6L___JSOil2Vv4L3nmhnmslmXcdndur-s64RIKJtwfbX_2ZL7dvq3ZbhXtX_OC5eYkWfahLk_3mNgXVcof6K3X7aJk57zPl_Nc0Rohvlt8v48zEmBPDQT5ptX6zOFSJyWOGQirAz2AVN0-eFNXewP4FEOiLyDD9PJlDh_caKmivmyMr83NspzrfGFh-dDXWhIPkCvavKKkQmcIyyBYSALij2hZBJK4nAod1XbmVWg7Mz8hgppjLNUDXAOoDd728veQ4mY6hQf-UAtb713snSFuCxkj9-Ii03SQJUp-p1zDEmyrgwV2GGroW-QES6Xyssvki3hBnw5lA2901rVxWcgiO145RBw59xJNHv-1HQ4q-E1YmyTtHTZlFHnW5_REYz0CwTUHrUv7djT2ISiJ6yye2CoOqI2PLld4c1JPpQZVSOo8WTUdE7WPAf5NGZ0qnAreR45QTMe4J-OlI1vEGzRX-NA1YjcfEUgPLc3zRNHfZooebphYaAdR2OHcZzkhbFRaqgXa-yriO2bmnHS3Omdm1DNcz0kSgCJZJOwVFNLKclBnHS0Af6c9HkOakEMV1YTDqvmUwJnNxUIO7ciGsLjpNiQbZyuXCaPy98DzxEwBZAAJX63-rQcqNqPp5oeohKrfCXgTC0nHLJEpqAHSmIBDAQ3vZVS9vwTDxMZqEb-jgvJ5SnNfoxrrVIEZqxUFGrGo5Dz1O91yyRvAK4CgaYmZYOt4ArhENRIZz2IuvlpJgjF0YVfh6LQD4O5PDkWx1m_CdGGIDjHo-V60N-DhwYnnyFDp_malcdmZtoc0n0wM0XDtvZE36tuNNqiTcQCsHfHb4o9eKG5CIoa_nGK7jSJYIgVg-x2-8n2BltrMsPdZdAetYghF-Fq3PFe7U0cV9TQeyWznlVJ3Ef4DfiDQonQtiQi4Wt78En97adDHTo9p23QqBT0pLPcG_6y3dWlo6TnJbnh7m2TFnqYzXY-w_rOrDcFgHjtsTqeM9MtwCUU0fKROL7AKir4zFjZH3GU8fC5CwG5v3FvSCchRINw-0OoYkFc_EWbi_1Oj7JuiRQFlGQhxoe-BfI5hxHQWCgDgMv06GfAMGC0u1uCmmaL9ioRjwCaWfNuFBlIPB_-bCF73WktTeYhCvcauOVUnuysSRZf2CCx69ZwLCZo3J-QBwe0FJ1X4SS7RpU5xh64iUbByGnFYxZV0O5XFUmmKYvPnOE7qsANWRTLABsW3pNmQ-tV05ZrJCTIh9hGDzLGw3bM1LKCu5SCaNVYal9rXrkQRVqjQeVoJBvmfa6BiyFh15SG6p4E4q-L1RKNncGgueCsolPZ86sa1ARwt7ZNc2xAf-4idYXVuhsn5Cf10Rr79WyJsRx2SC8C6fjgjim8AFfJFVzvb8_DE5tbmZd7IIyxyFbVVoMhA9vTfQCNN3_nsMAaPOIO8kwcLwCyrSbFuC0XyXlluk8fLihca0pS8r2wIIygLCdwTGjDF0AOrw5BZSkF26aNAPH8Ixc88NReyMMcd6ykkobhsUbu2ouNEBa2dnuRyzTLhZXBxDpmS9wp6j4PwFVfMfvzOp4r9U23bPq9QFCXjVaceU3RLq1w7HPZHzI2tNek5rH7op-WIHKmoP9-dlS67mAR2pbHAB9BM8_GjR8Q_kEJCS0tI9M-F6WmlsGDD94b_RFavQkH4CDgfwztZ9QN2WkBBFhaCiRLo6tR2h-cLet5-5CG-Y3Blp2HpXbSuuEMf2y9714JdNnPWknTsbSzwkjprqC6shqGFVyDUa0NVLc-hCt79IUDJmCs_v461kIXnkX9sY_HIU5ttOji7KwRlqlrttJRxFzarQJPMzR6Ih8W9eekB5Jq-Zo7phRcnhjoyeytrSQjbojWfKRJ6z1qowUTWGdBWbnb3YbUc0Gju-AKFgHL6e4mMvCjce0O36lu-Eax9hlemolktVbZJuLM9ey8JkRgBc46KTuEfoEVYJUlae8TUGve5K25YTYSD885cJmBX_9jelxWo762EfB-mOcSyyvZcedcVZUHGUmxTidvL-66-XiAzBwwytXemc95I5WLel6O4tmu6J-A2V5R8enHB11ArKMMTOh6KMbWUJCIuVU-7khf_0k-FKrds5uvOJCDFHQwXgy65lzbolHg0PZ_tk4eEzPHJ_ku2haSiBIppSyIsAAOTybjpSdg17H74nEz14NImK6NS9jaO7aHdLMLE1BRuesbbofYBlTcutOAqvj8aJvtElN5D2suJA6mcPSN2EoPT4ssSpJS9VwOxF578OVpUYT8R2BTa8WapUahk2qLj3Kv1HqIaJjdnoLl5tQ0O8IbzC3X-TEr0yTEOB23pmi6GZC8WkxSgx2EjC0w_FNKpTC7idcYUEu8RYkL2lMbdAaL4zIrTo_WZ3WUO4VxrI6MqYD9MVNJFx-C09YVbo6gc07K0GL0WMOIo6VUXmx0e3wZRRAmEuYvISnPDKV6F9t_nB9orMcmPD7K9r6DGQ6sdAnaE_IKhj_cwGLNlHmdTwwi8qbpiUaYRq3C-t3slxfhP5qgSBt_MghPGF5IqGMBZYAt7jTrXg1kRz43O9N2oMCHE36lWpaPu4jgv3i6aVOFF_UL6mDOar9DXcX2mURiqcR9VYhrJGXWtq-uNQlpePHmbpfkxFqQzcW29laJsPHyz3xzq9VZzP41dWh3RJc4viwCtvCLUbnlogi-Uclqd08FfkQJYTCRVC7Ed2_WQZ2rMfHGSOwj8URq2TBD7EQ6WvBMqBFKQs-zw3K5Ckpm8zIyGevKdQto20gtPYsN_YKRYOyKY4LPJ22wuEvQpZWZipmVKaIHQtsspm1HCvXwB6MztJjYOnT2z_Nw0t1rcjyJZE8B4FmAm_LitMMuMx4yo1sTMMUX-pU2dgybwyrETiChZiRImhP5tJb0sDSFBZbda3AusAjlAhCsFNNurLTspkTWD-QIkGklztTvZotz2ZqpXfvxSswK2aJzEUOLr0WnSgMjUvz6hW9k_3ZoJ3B6xaMbaVNJBjIvVs8kHtM2qTgwY5sfoRmphFiWr4PYrl_B4DGZ1Rw1T6xpQE9Wam8gYWWZZG7N3iV6QI7WIJDeAsb_3q3bGdFzj2HrI2dtlyjvpAGfDCqI9CWOivzV9Uy-qDPGdeVYQpO-2XVrNsi2hXjxTYQ9DvuXxf26xveRM-ZKOl34jalgisHvH01JvG9jx5pSwhGOiZyqD_7Doj2fvBQv1N1_hfTqcJSwwdWa2ycI6F--McNYz3TFrxWDC7oGODwKgWYx2Ojn96eFVd0LG6Weh5YMccbmvozBxvt3_46vFsxCyAdZQ50i0-gsHEY6QOWSSCi6cxhkeTtyxVwHmGwFOvsEe089IqgNc88liDSVwA5uNyY-pxDre_wAl7_lpcwmdHPjDZR-BjRLZ0ltR97Bv47USMMcEYQlrC0pQ4cuSWxEfxzVgEzB3HZWsklOhAxQTCBJ3-_p84tASmAz44qQM-G_8VLxJqnKWPS1Imez2jV_UQHWFZzUvMiQIyXPxsobbiTE74dKskTz7PInf6j_zjU_2gIFgfej6I6Zwz9O81lP6ghoo9gz_u7WkVPUgLNYiK3wxFj-oL6PNtP2qTjHnZzSEVyxKfF3LILe1o0J9uJhAcH1Px2AmnXxJpbw1ra0M9Eho8z77mikg99BMebgqFJAU8FpnADcjUUS3VtHWkMyn2YlGOrv29y0rPR9M9yxwoqWe4sl3GH_cZt445X-30967RoAJmj5pckMOUeJcMS0RJKj20WSgEi2e1YzRrLh_cBkB6At2hueEk2XlP86HmM93hIsb1B1QB7QQdHis6eQrsoqOIlentUsrUf0CQrMTnp87n9fczQBRQM-xossZ8SzEfw7EYnPhJuBYhUdgSwRz04DnfrW9N_PVIjmDYktpXBnN-7XDeMaG8rMa10RSK9dhgCoMMExgiQBstJeyN7d_stSXclaWQW9IXLjda6SYrIqmimTJ4p51kZWbwDIg5VRbcie_JB9DbPlILADwPzyG2P3EnMR9nZa4vZWnPaSu-LUR9EMRXPuMxPDaGlHvB1G3G4a--_N3IbCVVuWiNepRgsZmWNgHsvyfdMrac_XLdEfitdQpjggQG9vDTweTinWQGvf4IHBYib4895HECLMuShf8TRulR8e1RPI6EwppENJQMsJXKG-yQ8QgzfAZ7jljBREuSLa1YRrXiAJWCsj6nuYllvUQ0R4SwFb7-ajuapEziVvWwuSy6QRidzP-9cpDoywtjRKJz1pnQ554rAXoY7fb7feylxBFHDQd6B4-ta7DlkKLyQBhsfnLT3F9wzCuhXJwBj9ytr-4aOSziHh874sOFFaz8U-UaJVjUZREkUf9O8fCCSYyQndPAl2EJx0Axb6XdXXQbDwI3eErFjbKYZ2UB4oZZ8Dwwu2REDuopAltJ0de3NdFbWZUoc4ZLipz9vv4X5pimkqxctoU1h5Qvmkn8hTgBzYcJSdV3pJ2GY3vStbboMcz9sFBY0ITFFTHfIjIXkGun_VlgDNkeQL3vY2kfpXfrb-jc6ct9dXjdiikGwEeKQESyIuAKCjKZ_nQREOq_Yt-_FVieD0r93jrfa5AANc-oCYv-UFXzwZAxrs7w6LL2HptVT-G-MUSsdD8iJN4Nz8FhzFHQd29DriEqNGDjD5lR-2UE_N1-tL6BL6_dMGd1AbpT-iZBq46c5v7dHKcUWepI0WrwA7ML88QXcVkpsVczFsyUR45ULt_AuVEdMWosX2TGLRLQsXsR3H4sSIUX0ZAeoJ_a55OyG_ANkm0qBuO1p5mTM1LWX-vfZWj4xYp9OvGZ-O5nR1IdBB7XufWNBsAWxZlcAWYW5WkKVMRNh9ryXE7Il9QKqfvs4dtDfXmVzMNqpy0WTjzhau5MNZgVEOam7rUUOm3rBI5-IC-qI5GawhY7md_GpQuUYgKrIzzB3RlpjxaFD5vQOkQVz0ukHiUlvvA8O-yYmq1LtoEA0e6AeC5h_WqEPH9svcY9KvpW739MRw3kkMPUnIaW8mT-sduO6d_G-8FeGFjWuY6nTGfN7GqgCe4GxRfJwqwzO06gshLb-qPMJoOGZM0mvtFYtMt5Yws2xrYTLHf4qhmvBoV2eVNicoevB1X6YbcxsOSJ8FfIvSx4Mo-2aG8izQZ0fF6rLsvv4qI1XMUdAfXfyXrLLea7JaTuz6VdzKzMXrh0dnDgycnDXvZ8KmQdpGajjGg1D9GsnSmnBLRjbAyYCHPFGTjVyac4ebU8D47M2egqk9XVtL5q8RhJX6xw5eASiXd9VdYdYqmTEoSSre6HJ8kAiYB92FE4x2-LWucSjLMPPNySxtBVV1DLnVruM6jbFQ7bXAGK5F4wucpqCwJlFf6A7Cdn9Xuz9KufnYrvVMTnIT3YQBm0KxeL0dBI95EijfIRhqSX8tk5xwRkSTUuUO7u91_PxxGZgvpL7USnEUC9h_m0Pupm5NW1PfFkT2ViOGtN-GqGAtmeiLZ-xY4E-rUzzMRFLNZ39u-Z5nU2S-JH5dDhJmqgFoFBMRj3Ulyo7UpHaXTl547ByrisAR4J6FBs42FiCbgL6hs_sku4pZqrNQBUtV7Fsqg9mBK709xlOS9JNVVCsfb8tTDGqL2qHElJOtNnMUe0Eg7s0vxz-7a9u5psQ0HH05MRmKb8GQXyZ3fFBRRHmYtfR87dEpLIng5lpfZa7YhxxgS5KjD4lxyk9sP5NE8pkuo92kWPdnLA040D96rS4ew70XdZV2Iut0ocpvqazoxUoa6uwRI1-lXRzb6-eOnmyMSO1mfiTjs6WcZwfgKAkuqm8ZDdXrZUg82q05beWWR4qlAgeSWnS62JEnyIaYFJhlgB9eYVE0WYDXOA1S6J-uqboAyNoaNBDrqvAM2qaVD359R26lTzz6ZU5tJR05adp3enLT-LOxOKkpj39OqsptBYg17UQjCmQryyyxQGFSFIdtIHx9so34bAP_F-OEw2iLXC_Zo-gak02gGfl9W-xGan5jsFIsp6VtBQ0wF1woEgXG2mnI5BkPX4Gy6FRbilT7HGh9Ap3wJF58A5O0Jicwiuj6JYAbIe-ZMe371GBRjM2N65n2VRNR7FtlLs6NayZfw62pIC_GVVd_5qSWyekIhhoHOb3xWfyGi2rxbdHFdlbBgn-Wm7sGcKdB1E1dypKOgKEEuFioEdjZVm1EAnP7jtb0zSzVOCK4_9QE_4GRmR09XttWJMY5DbbQQKy9n6rCGTNvpTUXGs_N8hlOcIOJmo1Ue1a_Yjxs5YWAK-lIWJ8uNl56n8QeO8OKzlCf9fnJKh7ctjcPqTx6l0WeOh1X499QvjkNHsx_rS_azwUCLely3s6L1rLd4LSNzP1_sx1WrCxg8TtlTBf1tOCz_35c4-BjysVQsaOlUJXS7nTmAkzl2B2gwya-ki0gnK0Za-JE1qXt-CHaBbmUhe4UsN14vERCFrQnHnjh2ud8klOEg_jG4ksLAXlPDqCMCuOv55VFxuS5RziHkoSwbxjqpF9hWXKoFYnnLKLwEynaC9AnQeiLx68EWDoMOwKNWwcPpau0tVoLbaoffmMXj_8xWQDiEKqKiPMjG6sWSafuMM5OlsfGinMV6JqFjwbCLl8qRVd8rh77C5ZaV915KO9tMcuew0EnG86OQcCYlHLZxfhr9DCNm1paS3zsgBhyNi-fc_vOQgNDMzv8WYLqK-cqiBLRvANLD8J2kt8PVCeV_bcAi9dAV_PiClWyKclHY3a0QoGBiizpQ1Mz-_N3AGZpeVw384bwQ63tNkPGEyB-mBWOKREPIY1SJ5FdSvywfslZ6Qmd5W2l3CyAYKMTyWiDl-KVQSJPkK-9IVZYZKaX2AJVVODj3pNHYrDtlP-QOJxFGwxv665mn9s2O61_J68HEKPToLXP6fVCLw4zfOxAUvnhn75nLiX7-ZJ6xuDinB2_O0Z3v98XtHZaTNs2rKMId-dN8DR0ILekBQthlQ5dOomEINyrUp3hEoKZd6_pAFLe28Iei0ONCH2pBrOyW6VsafMJDsr-MPgpp6OU_pNtP25rHnV4avBtzKlii651FgeYS1sspvRcGKeql9-aFdGoC0kF9d5w4NFBfjg62JzChlXRc9SUEf-lECCm5lrweLyoYTkuaZAVH35QjV5cZkgYKlIAyQL1DAjwYOwBLeHmwZmZZTKG7aeBSGgtowm7Vk9XZ1cyVlluR2IU-0zYXvIPzqO8TvSRLUvZ3NoRGuOI2CbiNq7YcqUifmFGCIV0fA4ggYXEVK5reE9XPsOQOGIwRsTyo9PGo4OL8tkX_kOMvzJjk92TV5RrwX8bav_YkiHlygJo_eiIWkbUkUu6JylmcuL2SnueMgs75TGW2Z_ccFR1RGc4DEq5_n4reESx3uGuV54jWxLNQbagwesk6fn66jdh34QKgJXsRKV_BOAZp7xqdYsn2Yx5yZu0cVFbOf0ad3bB66MzPA-Oy1EhTY4fh8LiTfRq86JUcz4vxURGIV9XhSnx_HOWMEabDZHxnKjm_3TtIKuhwyuwF8ou3IDK9hrNjP9ssZBc77zvdqb2MJ_e9z_dLLScZX-r4zcEb5iSwJGV3NzRlxYUx2GGJCpmDid5xMBsTQhASDLqokGGAMr1-Au5aIvJManyIEYgbjxqC6MME6WSm8poKbkW7EPsAmoudjdonzLG0WkefXtBLTz_1Vnowjin5HdTjbiWs8ZVSwVl8hZNeNFqH41MWJiB-s-qKIZ2OWI3u-IwZ9KeuewzD_DWrjJYA771K1xPsqECNusLFsLcjXpiSLyodgS_61EfON-WRMnxQKrhcJkayZ2cvOuFoIWd9G-jJAHs3fGAScB9emfmE0n8UgPVrMquIYL02oWZtpfBIp5uGvCUlFNwQmlKuHEA7NTTdHvSH50Kq9WLSXegIIcmb0sJvjfVXPGDuy5wL_58Pb0tSJkIhJU0xBrecHdmUN091xxC1KAZPGLJBVAR_9-6CxO0rbb9QFh558sYwNCysGTVhrUau14Je4xREqZwXlQ6SPwK32UVTZi2d6IvtG61n0ijBqxmOhvtxOsvUEBUrKqLi3yyy1ySi0ecRbG2D74j9D-ZTFbsi42cUWpsBZeV55u44ApwNTmsfu6SWVrBXsG2YoM-RLswgRnwf4_XsChS0YYhjHIb6vIaEzjee5MCIkXx7Y1oGSgJXzJqOyNK6dzuvO72-fRcdipybQfnbmS6Weu3MZzPRjuI6XHFzNFPAwuGZ2nVVCAlXyBw9GBS8P0T45X-7q4y1lMFAVYJvFZBuHKnDrwS8W2Nz505ca8v2NpBbhiUrQoG7PHbPo03TUu85QXLqPADzyKXkKlhachy84dIkOY29eSNeYz7kNkdsYhc4BOAndDo6WPKJWhyhpjpjjfNA208HPwgTN3TSPNH7eQBxHuQnrPPth95pCiP5_JOAKMIP-nirRrapaEEWvpeu_XxrpnTm_PE8GS6cPquEiNOfsvM15YMIthf02ADUfhV5N2sKWPsQATpbwwvC6tqnd-SjdoCsRuFEQW5VMSKnPFTwjaJYUTJdkT1Ere1VeklUPYeoX3Rwjl4w-LqbKNeTHUl7T-tRQzAmQhwS9OVUqyzNTqi6D85SNgukBOqLynXJw4-3t4hr56ONVpl4xfXdidWsq7cq7sPmSs4x9kI1dG_frz9dlWm8F-aSVE6Wg_6u_Gsjb5j30Q3z23YDCJjUnmyvXfbjl8uuDavt9ai4PglvxCdTOUwKgCJNRfdaKe5pUzONyM0dYDiir-j20ZypCcaROvuMLMNksDzZ14SpIJGcbzQfErnxa7d_DZmRstl_rxkapENNm57lzM_S37Ih67Bud35RAFkn459qC4YyKm23BtKFIImbpbzjDxJPPmZyNsiY5LID62cMUO08MWrZSL9NoM8w42MUuE75trK2A21uNYmrjfn58-7XnYL0hXwIvB_3ufHhqTLzcW14XLM3-qfRrbdG3x_-c9P_L1jZ2kB3NQGYe5U6SiK7SQ8DAZ-f7bhvGQO2BzxzpydoTqxPNwwULqOF86rwLAWNlrouDdT5KlREvAtYN5bYL91Vm5IOi_oL25RpWhwdJXt4TyR3HeRQuWxNDcuH5eQjjD8SddzpwDpJZQh5qBaPs6KNW5tfOvtgrSUF4Yu-8m0EE7-giO97PMYMXCq1V5DMmCdU9lJpoiqOXc5toCbMGtSKIy0H-RQk3b0dfQv66nyQAdO8r6stkEvcztJxMHk_zKvgt4paro8tNJb8vV15h8Y1pJ6DxfM4evt-tST2Lw5m5nSC_C55jGuKjsa6g-CyfJFm9qrOgt9P_8WlP6DskgTnL29hzFG4dzqW8lmPI0bMJO35nOnNGUpY3Z5qx8DGgOW1VU70zRIgBw84EaaOnYcmgB2ShFtb_2JM78wtWXkqivRzax8qRX_PrKkYmnQMD3jBKOGuguydv9CxbUp5JxYh-7glzgwP6pPeZyyIPz9adnVNodMq23HXH8gRLzWSgw0xdh9FWRzBHNstiyv74HcVpGS9xpYeYAndWnwyX-FGjAMhzVFHZbvP3X9bqG9rlXrVZ0S76JatrUbpA3ytcCVXy1ds7DmTDzA5DEeYOLpe_kqFYC5I9wle-H5-kk78ncFWVTA4C1Mib6imu1PqsOwRKetvqMKwbVLxvhohSll4i0rOYw7QdxX-R1YduvY81oUnnoh09Vqa07eCg_3zgUe1jem-9W7xBySbrW3nDbN5N1RQyT6pVYIPnmLDJLBgVm_mH9-uyz6rnkB0TjrSV0c1kYllb-jKCh3YqckvCFAJlFOcGfKZ4QUUc6iDV9_QyiQ2HcPCgBEToAYf3IJRPu2Ygfm53PorXy-UE7uJVWktAOt7Cj6_fTuG19P_0VBooD7UmPpe0ioZ9q_EQjpewdSo_IYAeCWAfeFEUv_ZX1Iaaw5IXdDoMPxD_I4rJrcDrVp73Wtllh2C_2U2HiUwAJILdwuZANoveFulxRLpayt6bU01t-3mEuXw7FK1_cL4TvU8l3tssUFeS9Ws6dgGNbUg47GFWgkRG7SY9FP-LenCkmIMqzvX2bsBDIFdQbxYztdEb1ny5iMxPkTa2u1D_ebVanrwW8GibtKK6OTPlBNbVJ-6tLMFHm9wH0S4fdypudbmbmqCdz9TsMukNzrMBy6rzikDA9B5zlZsuo_xIeuhwquIwt2u-HGtyCC42GSJj2g6jTUSfx7uga31YMK1sOzcQrT3qSSspY4hjFOjjMKd5xAiGFsURA7UPdaf59RPgaWgeBDJqt3eJM3PVRVCDGV65IGkzptBt91d_MpRXQEQ-bqlx5y8u6i2OS40M31rzZURZzHHvNt_UmrOebLPqHOO7p5vgMBd6ck_P8o8LPHnSQQBg5SGGE5-gPKqqsvcWS0lraE0kAYnuefg4zhuQnVT-fFdI2KVdz_OiOnT_MmrFIWYo58AT2Gu-V_7jl8KaOz3ZIjOd_dmGqJz069fsJyug5DdxhNH2MzWTpcX3Uc-h78ESUPr0LXiaGwIHFXCgqrqF11IM_tEt3xqDyaBR93LuabmQEk-LMJ81EIu-zydt3h_1a3w5eTPdR3yOm3EZK1BhVDfzBHlIP9-eYrCqkB6tvxmrRog2qflUmAB5WDKo3hqW6TG1zPBWIjQlv7xabsdJonc0Zh9DB0_SUyAKhye1oLm8p0-3ikaDQsx5eAHNSennzHjjRICzFOLJYOt0cciz6wczOEMJvFuOrucI8_GuQFwJdMljI63puOtx_kGqJWwrig6MV7W3wuDOHmJB9x7xCu5B-KfJOuhLWkq9mcRqO-0zyVfBjD1VeqPywgUmoHbteBP3rERUEJvlp5APINey5H9GQIQxpYHTa7p1EI36hy-dRsujME-8Aesaq_sndAlxEVCPsq0j-y77lhVQgqiir434dE1SWhPkIFtlH95paG7Qn5KhzO1aYcfnft5XPLtZ8GckQb3WDcAx5osGuHzGOb8TM75LdjWu9YIQz7hGuofMXqQwdSUPEWLIPFyBKa50yk_OOCfnDOxNYLfji-bViOIMvx3rBJEmgevrlkJBavGxRRG6ue_qKXGLBIEhjbgTRQoL-TcvSZotqHnbneQ6Kw4K5Pqw9hYq_ySq--l_YrXij_xNM_uyBUOwzy1GqaN_THHSEpUkTTrnL-wwgPA-Ot_upDKZjjMgQTWqeN64BXLxQ8gIHyvlmXXe1IdUdde7o9QgbUMDJxUnQEDq548nLWyhBidmaJe5hqgCTpsJ28eJG_VuBw5CDroyHxV7B988olMkdbJAN0L93WsO3MQgT9SHXMptXGfu4KoeGb_Jhe4_L41BArxGuCOTZ1p22k4xI47GkLTEgUqCePnvHHGZUCcNiRt4_B0mSHgeg8Bz0hUrAjgsveNrADhta2Zb9aOGeNN-YcmEDH1g-bk6EK71O0jwxWYyeLBSUTnekm0aF2jkqFjFt_gogwN1213ezLqpd-PBWyletBLg1DnzmjKrBPSiC18C0BRObXK5N3jRdSsqe0ur4r9eEUBV3vWuscqzNwNAK1p7EUkgVcrdLlaTuW78MIYIL4YdZLkx_4LXc98Jz8K3B15PX1bZOg29thRXlSua8Jn1y3_YJnke1goDF4Mhfwm3Nb8iKQq8KDm06nknRNEOAJ0-lhtVexklULuaejc_C8DZ2Oqhbi0rJjbaqO0XAa2iaw2v__NAHk7GJex_pIyM8ptpPkeiVZskGqH_3NfFCEh2xR37uWUrkc3QrPTa3AKqIKjjON3ITZFJHHVUKVHICc19pQOzSYhj2kYTskP-HFoA5GcoND5-JXRAXo38nSobEZ8VwNI7EbFZ5bprIxMk-6U198XFF6Au8vaIQc0kVxfFx7TUwU2f6xsGK3ZSMSdnganTuGP8ClgFPmvHgjnO0mt1Pom0LSU45Hk9uuBwuXtfzpT6mnPVAwBdv3I1mqgGHPjuHmoAIUJ6qMZW4isFroGuokpJfy_NRNXzrAfe6KIa8UbYTMOoC8RWXWFgmU_Rte3UyZK6kbE7WMcEZoXTU72TrfcnAPzcBhtuyThFbxu_IZ80eU1WTdU313JqJmBcUqMer3Gfc9R2fVB8TA-BOwAOdo-gJoLmp2vT0fkARKz4FLhbP_KgNl7tLyioU3lFsztXyBjIJ3r5D3UHLUFI8-r3jGVTzYvpTnvzSPNAwBczsSvW_GptRxzIWkiIIER8LiUwX2fWShseKW50pmHkSG7kIGEFJ-Sq7YV8UzTStV5BC2XVwuCPBWsWuuEAwhW8MOipqGWF9pJnUvvuy0iZnCu1a5kHoitrofkiKhofiF6DI-GuZI481yB362SiAKyxla8s465A_mKv2hJZcVKv1svNjzN2FbQYr54M6ms3ofG-cccUedznOgOd_TwxaXGXHamYBWDSq0Oj9n1N9tf2-ovp7Wh3HwdeWjMqvnerwmiQxPvJGt_FK278Lg918v6S2O7tUUnPDLLBVzBSe0VxfMVvVZedHj5v4zbcddqqb8KQQqq6L8NQT9rjzd18lu72wrpcbtGGQA86wVDNz3OJm3CvwQpTTCn-JX_NRsVt5_4BCLOE9Y-H_QE3fegXciScjpbF1X-7BsjOIHz67wxcn_5OxLN7Yj8YH-e5HdBPDVXgDpXxX0TkuXfEsBvXJ9O3ZGuuu1Sk9LAULHQfk5fxhlzSTsOepW-bq_6RfsmrZD9hjaV-73jJQud3i6dOC4qdkJEBcxqyUjDo3LPjzRPBrZi5yTdKMkh4TF3isVFxsI4yG3JqkCll14gqrfIUi_LaBEswUP69SO_BsO15POAvGub4Yjt_tEUk4qh5E0C4y3RmLp__9shIUUZORgYdORRkko1h5YUQJt_69L0WeYj8dB6Wg86Gy-GZWxiKD9iOQsikxxxJ_N11Nk3OuHj8oQ57j6jVLhep0vmYT47Sn48RnwfrrC53cLVsWjmMAXH4v20Qn7b819imF_xS6YbjnrKP4cLlsNmX1ahaDyJNVfLJBN0hcXTLLa-2rTMqgdKpIxEbtb-sQvWqov3rCpxi8WND6YhbbZ2cBtcxervdVR7uk3H0y9JvEFJYk5ujBUQE5-4mYjjdOY5s7YH-XhbWU9-Rfi7upbs47AJoYcVmU6m7J_QzXb2IE7-Vxr3IqU79GYQ0TllaGt2qmVemy9MksLT0N8AK0DtgrKaVictXxEdxMyZ4e_BaSw3aoqMkPAWTmyUiWGQWPOZngscZloDBgXDxIbZivmGcJ5eo1EGp2B1yRDA0TDGgslRZRn6aJDjQw_DhL7597moh2Do1GJj8QCNodzUfTL-M0vPJCJwIKGgt_0WuCXaX8fDBkqIFmmpuMq1iExR7FJqocczki6A9o1b-6kHb4Q2CASRPpck9t3jybkjdg2C8mBHrACPBUixnp5-BQ4qf_RAKq99caBcXYqLy-jhP179Ld7ahu746d4FkoWYFnCQgdf3yGwqytGRGQT3XMVNq4_sn3DkOX0oGfGWlb8wnLy8uk4wHBf-xxdjA6EoM23zQlIOaQyX4RzTEHUGgfBu940L6bdh3SyRjC9pi3PJ1AXzhI61BA__fmI_uTmSY1b9wvTRALi--rxZ6lA5j8t058HfsECt-OMLKfnyDj52XXf34xR4Byv4IjSQScJyg22ESY5bEWWHPSZ_oIf6LbaaZhTaaWpUcYsNd56olkiWTDrcKbUgLvsvQSEYFIR6cWPSguoCq0EgG8mIRdKzJn5-DhuGJyP93oahZuQbFoxN8EyLlX9RZfzrMDRaFp6EfM4rLXqYv2UEU09vj_mDxDiK8PUJv_Z4UCr6LOQC_s2nbLo4H13NuG9hEC_xGWRWL87FO34okBqQkHEscXAEI20X7cTAxBKAMdYo0YazXAWWABp_8ErB4szopxsej8y88MsBCRBrOzYOgkkj4bYUJtOHAXyeouqBBRxiDuj_83KZWFZwb2d2PXyizjdv3a2flrGGWhggoc0Vzvg8ddCI1t6-KUUPujTzRjRilFCkygSmgPpa-XRrtfWTVNoC6AamczNjchCNs8VedgvNrVxjE5XA-8mIpqisbgbeaL_R88_cKaW3Pj9jeca8ZEF1zTyjZTxMfrlPsna0UK1vfIlX3CSCA081yvZucVdYX8YTeQZGuxLus7ahN0tPonUq1uaruoQeRvc3HY9iVVJ0hVBKhJqNVh-TB3h2uWtViPdrRRg-gZhglRE81IBEcphIDzJ5eMx1zHrDMNuK-K1Z8faOvl_5qeddzJc5UUbq1gAKQihhxlOFBXFnNFlriaK47AH9yZ9MidiLQh0thRxa7CjJAS0i_TvqJ6U9pF6rfGkzyySCOu4zOR5Q1-hHmI_OWakt_Kk8WZRe9fum5rs0Kr2iI3S2_D0Iu3V2pMrRTERJL89p0NTuBmA9hEixzK5T3oQcJR8CqAnWFrgjHEF8u6_BZNg70WQBojvCKzUrHz-Ep_rzdI5J1UPwXOEeRVblIm8lP9Pl_f5BBQ6YX88Fj-eK47HSy4ZnohYPVdz5zDotDGAdT6t7f0u-882gfoJT0EBrckZUwzGRMYO3lgItWqdDokC1awCs5GMwEzqRxZcwVXPP9PntqEURP2NFIbWmmdtwjYRqZN8McR-JLYwCAnFpedpxKqYFDM7j5upJELPBeRZNKJJgCwskp6cs94zhuZ1jf4IG3UVWFUb0MXpVWypeDqbGHF-_OZ2Y55RDetBvktbVkvrcrwnYjQD1IY6uEo2cycS80uf6Ld3bmqT_Yv-LCfV1O3BqpTGwUA3P4O_0l8FEBG8ZA0SZcwVj6g_ipjIOag6xwCkp0jV-wnpDORa_epuyN4sWXPqLSeipSR34BS7cpSKC2qAXXdBYHzr_lYQ8ria-iKgrCIo_rtDwWCrP8Q-A0ZClWtPS2REmQyeAeNuTK3hNuBs0t2Uwavrp1d4WeQtbdC1XwDA2UAekl2OFYBasVQK1ya34ova436kWTL_Jhca9fvChChszxhyv4K3kwkmcF3FzKprcvGf7sN1Ba5mNniPtyPlzJR3STujGARxn09G4dxfJKdCsnU6WYZZA11XQowD8k-I4j45xSFFqYhdmzjZ8vJ8MGoyReImpZaVxNmGuBRx_OGJpzR6pSZJG9zLMM7UHHTH_3MdJUlVhvbKMccxetsJo29DEfjfwIfIAgG7aIYj5njHrXVkMqLguCj8AmHeFIA1cr-iZjSWezJQ2i6j8msEDUhINJYOWbUhx-fG7e-jzW-tGFOP00iYrTM78tFuyXHF_OvYrZbeIpmzMyp4NowSjMcuweCxiFWtuKPEoVzj8VLZaXxy-l_miXNb0GhtMR9YNh7k4t1gRb6NNNs4fpl8LVF86iWOp9__7jFPLwop3BIUT98aGPutAAbM2zleMVQKrKbfGR1Ki5IftbBnhN1om7sNzlH3UM9OWKlU2UmSZ0MHSy5AQ52TlgNCCnXEXOi0sPDjb48jY6TD6YeJZDWWyJr7Y9gqTnZ5YiVXEl4UnxADIZcAfy1ruLVLCa9dMvPC3swph4yoVYn3k3Qj0UlGBdsstmbitBWOI28VN4HwF8nc0FRzH_jHuYyYIVnGy_-Iz8SivHBMdY5IEb-O0UE5XS4pl1LjdOAX1jTNFPCO5R_KNq4GX6hAj1f1v5Mym1xl_5QaSoakmdOUjvHzV_beX5yIG7B5sSzuZEqk-1O8WA7V1_i3qWYLUcXj7oqzsJKR_9ZSLCpL1R25xhPPM-Wr5xYGaskMSHxVxW-SK9nHSMvUUSNffFBo73Zjr28iHOJjcw03jpO9jbaBhpc8GLZ9gBkv0L2RteYiFGTpuH7YUgK7697DXjVYdS_6H1g3lSn6wbuqZEjb8WftK6rnG4LVOsKcyT2XeRHfD10Hmp99x1mI003y5wJYA8lATjoMY7noPiPv0p5u-Bb8Wpike1aeigMzh6pe8BJ1kxnWMZEE18w8dgS9kW-biDdY0GzX1ehHz_b-h4yqrrZf1x1F3gIAEuZmhbOemAfx5Z-tkokqcdr9SYLRA19t4zuk1r2p9S0YTuPlFArKq3ZaUGeLbxzK3dp1fmuGJ8SXJf9i7MEQpFozQZuNEnMHMWSMDfJIDu-HRLMvuoyPvxnmGKdXUWryzCydasTEfDGlXdOuIzPA0_rOm845-1Ef5L-265wu464tw5MZCYwlZ8FOMoBuNKZJQox_2oHZM9WaSc7rfHNqjDpPx9PFVKdyynUi29d9odV-J99if2bOHarbJ0XZLtTiNFsS84cF7pR1azlXBcyZoVl3iIGMybDQdpN7xzyZvBRq2UPsR_ZTAnW_QhkA-cb2VxpJhah6nbhbbLvqjZywQHGrrxUDOUUoC_dFpYse43GZLt92GHr4XWU3irhKIOri1RDBxXY-AYae0UbZsahbq-tPGvjfkwx2B2YJIRPQpY2es7iVPePbhwDqFniGkcpeSv2nw0in4AyzgZ7evoYePd5jpqtRakHS6HaAo81Ve6Jg_Zlm1rKIUHN5b5AMtVzlKICFXsjbVkGkI0iQyxn-wOI5Kr2bF4OapAL1kmW53xj9nNZCTiulUJcVBdqs9WhLIY5fveAtkpLJUb1FfcAOLiU4IB0Q4tYnG2t-CV9HZDFoxBJ6fiQWshghzaXv6Cj_e5zLUNSqKQpRSXUxn2ErkXiZjiiVvd7s4sQ-b-4JFjV-IO4ZXW_vtnVTa5qWcppl4NJYn315HFeE09DpCzrJKUEEJ2MC8QilOjmzl5DOJucVRzkvFsTtf5sGz7H3_PHfn34IPAQcIiKiL7kUOARzilCf4h8hXdiUc7QcT3oips-i-Hy5saNeBbeATLt2KlwmsiNA7OkkNO78aeifDEd4XMABGDiplzBFUrr4HeIZhpf_dPJAQg32F5CJ3R5Yd_XhEq6M17VgDUEbMeRjqkumXIq_d3ppIdslgtaNkY3ZckMGuj9DG5BkVlU0eRl_vA3uJQtt0xukcx3Y8633ywDVx9Ogz8FStxLlCv47XpqTVxsyDyHroI79PxWNzJ6S4QeTIZ_06_ytZBdYQT4e8TTjQ5sGqGy4bXiI98H8yhkw0rxr0MNT0XxYsrce4zQfR2_5t28C56N4jvi3Uj-LWsIbAgjJ6BOuhPj6kbWW27rW1YRTwf_cv3hlFof-CmBFky7NBaRPtRYLxoSbwrrZQKg3wo3V5kNhbqVcIj6cV3bjt49mrySz1PdhR7xvq2zAYqaCRkxhqGTTRWX1hfwfQ7sL6Hqw7Liquk5G5gpXSDVplvJd0iUCcyesJ9ZMto5dHUHnnGOjnXk6WY1ATToyBoybDbJS29lqEhsy3q2Bu00AxcosavDmkdc17hY5tudRMDVWKJoonAvXeHUXhIlq4gYf6-QBqvm6Og6CzJEftIyPd-w33ljHD1cptzh_QfQ807ioQr0t4v0V_jI29PFkmCo4nJk9gOir2cEZN3sd7Gi2MyyF8damp7PmSqJEH_3fzeVWU0Knb8tRs_XdSVgJLkqRRx7Wv52ZlT_5B6WPro_YM_f0xtPJPUUPbEtC72DWHD7J96hn6mhpY7rvl62-NsUb0InNjfQMUuRiCoO5zWu1AV3FE7KbSh0tCNv-t0RguYk-Q5M98M4JF4iNjHOBupLZKHcPOFxFVPxqLlN_COJBMoWrMK8cCT1iS_fEvLEKnDEmAHAZUk8ZiBk-DRONTEMM6yI76qf73cRX11QpZi0dBYthLuPReULILMsPsTkK_gEEL618FhT6Nsb0wvPA7gpIVR1-2n9VMc1Wpigq7n-4vbz1Toi1BGNQf9JMi4VKPmp-EU0Zh-w3VtqKwQ5l2J4ElpQ8fBqVNRbqfQjizvqpi31hCsw3f2_bb4vSHXrp4jikI1ali8yFpS9VaWtHmEMQown2lat_FMo7D7zB5vgClZXH51Q-zKwlDAIwKJdv2ADp0eda2VfAQamZTX1Pk9lHhItcQsBj66jsQo3htYThIRR2eEn_pRcQOePK3aBkTHzx8bmRfTdhS-wzd4PMJefyL3uPOoruoZD2j5fCr3SaeOKBOXD-rtl8WRuKOPd4IZlGccccHN0fl8AyXAUsErTHlixHCjBW5awOU5Da1kGAOWw1-s-G8rIIu0qV1A9JLhz_r2dF-L6-sU1GlXlySAwRW_9IxR_AI6XHmeZbdPDtJyMm80mJVgnzRN4D4mL9Vq5L78C8H5rthD07fmp516Zqgf8oTX0WWGz2YjDofdetNwPsvpdxvFN7kAYWFqqg5QHOT9sr047YlAP2KgzF9vdcbzi_oZlL7ow99RtTFPEs7SgDLvEYvakS6cKU11ohNqHL2b90GbdiLftH7wVtlgsM3LnHEfnyABzWkGhAXcNrKyE1UKT6ejCesXHEkh9JNM1njShxngNeojWybZ7n8DPkUw_fJ5xa3xArnQASSYzlzlKOhBR-Mw3OAhXyH1A8ri-CNLxvtOD_GoffaU9selHgqtxckbueMyCQrbXJ7Nbg9O5xK3criMM6FUQQacUPxkDDg-MWnicfztvdgRUL4NuzE8kYMKQB_G8FbKb-XYSpBb4MGBLJgk7mF0kuDXy3kexHK1Oh_9fAVfUtw7nOMAObJnAOOa4EdXQAVMbLJzGNWCBH8rPF0tPe4rEph93CCEbG7iviGWJHZaqK3ZJhkZFgVSiy7-P-sGcr70he5mOdfC5hWLp87j7k8cb1ADnx0b4ZSdyanUZZ2Kz4dVQ8xuNXeAOM1qs3-xzvRCf0-B05VyBzPODU6y-hHvy4GplHVBIGjq1jJOOy-Isa-6kDACencNJKabM8Z8GOQtgsFbVPdAdQHTsdNIOYeUi-gieAdEME3Uw1KY4n4JO0bPapSFts4UTatohx_2y_1V0JecYLiwM1EnHcdH3Vymop_t378qk5lnMfUZH9_PVNdZ1rX4_OlH6E_RCdLtHY14bFaUZ5iqNxWIq4WC7so1Fiz3-aAcsUVomJ0aBIO-X8Ib1de8DfelmZboOh2AB20tPVqSLNp-tk9exLXcB6gjH7XtT4i70bFUe1vLomwOsvX--Itf9c8sdqCu8wcjraJpt0j8LEhMuVNDUYrKnrMdJ-E--n3fBox4GTcd0Ttk13lSE-dBGGBvi1N8YXBZLcktO8ivNBJ33w5MGClkuvT8Nhlpnmk2vZbDjqBX4IgxThuwl808CMoWC6XkofVBhh4bEWIT9wtJ7TRdzjXcnMASpjay7hbpALo_YCNqxPnLy2BBYJDCNHT0ZO-p7Cy96y5CkYgCwbdkV1zbxhcP767OQwM1a8GOiXEleCjIt1vzljOlzrsIfsmLH81rhuXD7AToqj_1A-O-VeQaeF6JOVhsu3V7-e0YuYHJEcUEppae10YSnj-2OwG7B8dJdg-oLNQ90jUEHdalAOgB78awiQNIbvkp0J43JEDbvkUH8RTP4Gu85qym9C7TZdN1oCOc6D5aOQrjAaQleoW4WusUAJALIStDYPTvxAjgNG6xpHHqbiHT5efngz-YFMWrpy0C8q0AcZ4bKe55GiZ1WkY5rD-3r9PQ-llQqH-ysaDPhgbP0eiG3w6Y0O7CwiKYYx8gPWn0XjRlx_LkGXOkCFGdCTaI-0VOOBfsM1CH7Ph2DiRA6zt7sToBviLJTuHGbPU5pM-q-XhR5nwIz4xWSpmDeyUsXW8adXqKReMgmRyJnZlncoSVmlAnuGXue_Gi0Z4xWcWb9Gra1TnqJMK5VzIc_A0KLcYoT3FrrX366hL3K1fnfBGuoQMgOK-9wElfWhw96pj9PP5_Q6pcCGLUl1wiTZyeziK0GTLnszhI33j9BjQaqa8xHjxkXlNFd9Xwupzuol37n4gJAcpKVBP3IrZh_wyPKCYi8_YPfwYGZrzgGDc6ZcnZVubye2zAFTsaFCdsyfj-5pQL2yKdK1czgtyTWymJM-Rgcl_Fg0hCjZzGEFi5lXhty1mDyWDV3tdOUQdSVp5JVq1IilOiZ9HswaQtvq941rRBVFPHk7gr-VGSjoy7dWn1CotQt5D4J5JKRj_Gkfb0diLKnLu0DfcGlY4hkX6YhVDTCHI0HrzH9T_dROFGPn-gs0JwpIJPLGNyVLuLKNhF0DFhkzPd5BpJR-RCn0Nr_cl161HlIW2kbeZuoICQrNhUiZimhGcujN11PSHiaSpRPXvs2U3xBL2CF9mjy1hgJ8mpO9g4pODl1JGLDcixlv9DJSG4EYxY1Zq__oFa6_uFnBokLSkhaYrkAspPxwrbJVjqiJFKUwvBuciODzdZzKIwyWqWompwMn2ZItoOdHKFZKzlpk5c_m-Nfq_OHY09qjkqhe-xqqgEx8YRKfRayaqFeIpHxLhM5LQOBgO_30QZJy7zlDAZbQbwFtu-l-nwQIKeF0Ody-djeWzu22IcOFM2dkkVothMDmYWe2PgTgEiU9dVdUWkgJYsPgxa-MqImHq_CJK-J_OuyP6VTiMCjMlCeb4d4CXLjy40AO7qBwM-YdUZ4aaK0FfYze17-akIE2SGYAMuXGonZDDIpddXgMbP00hHPLUHMRVO4ajdp6P90Gu7rgImPJMyspXVn6z-57IVZ1SStFIqzHA8-_x-bdgpBCKz88Dt_hC3WtSyPKnPMf-sw0C0bKHr_C1ywbviy0LBVJ9ybOuplqEEM8F0cUshXox1NLzxqbOg---D40Sqy1-KuYF1nbFeihfdCKdlyxzLx4tYjpiEp3nX6aLjJcWi3tGlb5Y5jZugXB1azuU66mZ8csH-fl5d_J04RnCwMwqsoXPIjfYK54Kvf7uNfB_WNhUHmm1_KR9rFRlcw7YRNsWkE5DwNx0dpdglEOoMxuU1xNfiTyW9Snyg_63l0fgk9n4p-B4N9Vn35n7OFFu_lHKP1S3kq3ZLey1_ffXoPOK3PNuu_kQS4Ga2dc0lqZPxr9lbPOsIB5CBKbFVqlBTBGQl1tURNJDme2NATO1w3kRPz0xdd5u5HA7VcljHmUKt_-neXHpNQTWTxejA0gwW9aMVnmLpoQVPxjB7R9adGMM1ZtdrYBQ5148dmZHVWs_kb2aSecC2ONj1SDC2K82YAd0_o1AKBU8yMMXIbSSHiaIYqsXYzOOJyHCU1_h9Iad6E5WyMjRCK_uFh5ZUimaJLcB6iDoorIvPPdh9nl7wwLwxk7r-rqz6IdSUeq0ZHwzeGLwfrOZ5YLikkxKVrrM0JcSdA0RE-tI6R3z9VfKhXeeM97P-Pxjg4gLqBjFsM2ckqkxTyh9AK8EO_1d1Zd71RWlGFQuKZpor20Jzckomv6KPb0ru3hA1cYfVyX2zCoF7R3tRQouCBNHdik4lfP135ARg1hUIjVTsoYxJMYsfqG2NkmLkOQFpX1EWUtcNpYucsjFOYGiVoGe9c7dE-C2TJKl8J-wEvyk2rUghNy2fYR8H-Qn5g80dIvIYIvT6hgHp_NT4nvfs53AslS6w2GZ8ohQLRG25J6ebdJwfFx-urdUCzmhC7h_pSOsLxHOesyYFbs8Y9-leoU6-Py1po9iI9jnMp0g7HD5s3dUGhMPa8gWXrLjLZRV6bSUByjs7poUqje4ZTbn9yVh-bKnkJcH4Z4ua4ZVeQFG40-EJbgakvr0Jodv2Pb6goNtZy8HTSkRfASn4p0CSXLCZR6H8jF-CaZnfErMpPhbF3EYNUDrFU7IeU3PWTLLL8e2dxWl0lgEDXMQa2zdDCsJuO77o0GdlyNn5niw_cVE0bUss7m2oSE1F0OTcUg_TuRYUuOsDBbnC9fm-p_-NYlF0Gqw3xTfU57FfsSo7MbOxSPSUTfmYpeGZxV7qMBYP9oMvS37Qekl0vsAMuepnSnksoxiDN_3zLb_bN35zJ7jPmbMTpc9KHlnPWdp4IjeHeQRKeWqnNB_ybnAeia0R-kG_CbAztlR2bxjXjoeDx3XJ0rvHvsPGA6wNkORXQ3rLZzeUHYDsYoVZUHu473MBAIE-SjO6yk0rKzSrLjrJ4JysxZiQoYve0z_Sru_3ipMe0jDRGhPWLfqcn8LfgtrKOjXI-pu_BH7wqL6XhnjqfYxsR-VhtohCetjCEz9wbLAk68tCzBjz8bGhRsQUpFhQiGdHpb4AQN8rIdfiAgAe9WvbT94CA2J94Vt6_wsh5UIiqqqAod06_qNMw5Ojt9J_0cZNABcmnSIlR2aoyrOQZTSLu0Lt39o0fQZsDnurAKdVG_eGK0w5-9IuSh2eO_hu3Rf0mjLGS1w1RGy-Tu28EK3Ooee_j61itfRk5a2QVMCleo0AdJ5GULVuwRQkZacdZEtBu2ixINuM7d738AN4n85zd2qSSJ-XAYFIZtVzuRuGHIEJG6Fgjll1TsPaNXyGknKyfERwSAKtamQZoTQAPaBuW4ymxIoKYc1Q004oV7Q--bFJ99rkvICOktgBtOzshHZjpxj18ye0pk0DSH5FaIxZqQxj1IfDHnYvNBwjHIy88Pu9yvihjRwxR_QCzdzZNm96_U3WympPs4iswBSf8hHeAg9jXId5at79V3k_lU_lcmxZhqfnOkhSj5RO3CaOyXTvWWkkeiHJ2sjsnGox83w2nOJ4pD7EP4UrpH7_X42UEaCj1JPqCmNyjDccyjGHWOu6DHDEPW0PlZPFq5NFX0U-dCMbl9araGLd98aH9T3KlrjMBR_ZmX36h0WUsgSeEfP6LO_MV0iGOGpIL7poihjz_LghmRWYv0YImwzlvBvN_EWYTkNXeC7twgXawzlyEGQHZaD6vk4gVcGdHfR4JYjh2ALjbKqbvUfoOMnmYnRoitzleg_qf8rTjU9zhLhxMdtC7UajWdtdvVCL5zJ1XuGkHezejwt2IcrKdLnoK-4dnjWQaCtvd2zPWIGV1v1o_drSrhSN3IQQYCoYZRL8tmtLBO2j6LGM-UIU4_oxUdkjqC5O9BTnmw7VMNM-tqnBVsw4ZWKWuum_b0xztye2bMaiBjqP64ywQIVmEXDYCvfK8wmVRnGrik4MWzJ33NdZgjNkAxttNZleXd_udhjw95u61Ys9RBdbivpY2iu5WwjT2c1JK9VDJ_iqf1-2fsNE8N_UuF9RZTeK2FlMr7RxeD1X-4gWFXJnuvVLnypu7C3lD60g77fGD7qIIUILnuhCVlBd6Mt9dYbwokz9AHcBFaeAelTfMQ1-QqcQeAOIZVdvyYYxqb4hL9mjr9U28ZFjB4piTJCD4EO2oLeimog_zS0Gi3p-ILZpZ-1YVIdl_UTeps9AUKghDaw-hlE781GVNv9lb_40nkUEcKcr9otOgXif7NEwiSYI30btTwf7hITC5oBh9tdODiB47qtehZFUQ0WSpVVKITI-uzHf-9ByeDycDLP2mjueMdcmpgbdJBng23hkeQ644YFwqrZZ3j4k3dqybImM8qrBt2lEbmLEVnHnJkBFMYm2OG6B0SQ4Dwdy1LAPfF8ljQTFfTfZ-01aTgOJE73sg0EYwbeBXvQhKkav6T9ThHNUwxLCF8KzYCkPlmRFhSezarAuFm1axBbF8-bwacIU6ihG0tG1EDaoaFVc8zYJ527bbkwvIHSz98dH4W-zp8oEgbdT67_cUNKCgX-GmBRS0X7LnnNi6ZdIYszmoWELdGMXnqeVKWuvAXn5BUVi0BWO7B_wYp9bDFuPJZul6ZrZpGzax9UWafMxbBEZfa70rN3U6bZfCRHYb144MJDuiBlpOvdlPutGDqLDzpvcRk1qzLsXwWPTQi4mZhpPZ9rzdqHPW_Q9Opo3WVxlYC7Oa8RipUanNhy3tKb2a7GJ5MfUPgKCu8Wi6FuPrdGVVAN6CPdq8j34eWOFL2SHRvv9eNu854chg7jEuJUCHc5tFvJh5C2TrOA8NwgeLHJHgimsNVHBqOExPMJPCcaetjHxGYfA9U4Gh5emRMxBJJ7oEJ2-vDpHY9vzP0Oa1CQ1G1paCHIfUBYef5eQrJ5gMrHJ38S0N9l0Pn7RactGGu4RZ_hRLXBQtzbIcBgOjXc7Mn5bwgoz-lwkqS_7qtEbI5h6DtreQCuGdMoU_iNSvrB2QSlYVjToYry3wV7LLPi9lR1mePN8laoNQQuzmy2WhK_Sv82XQktRPw6PoLsSg8VdpGNDtWdNO6-EHzeh3m4teg2zEwujuwVFw-jF_bCJIYHzlyHzcYxv5btM66Nge15HB5T0ymXH2-iTgsN-97vCeidFWKJIqZM7FB7xVE9uqQfIejiKdjkzRBPbC_NneSA_QystXBPdANt0r7b3xnlrKIl5dDYup08Cz7678vYhhaaHn2hdnO155lPJebH7Qu-xPnpN9lmwRXsAKCUmTg5JxwtshXSRN0Q1b6zogpR4bnP5bjg5yWg8o8sd62p3GsxEpReuSCoGrMfPUVXQigYP2SipiJT5QwwIP4R39YixLRNM6Rtnw0FXdORItOW41IwiMjRM2uB-huz3Cfzl87ekh5fPvhRIj78Ai3NBP4riqPUi59LsDkIt8jrsy6VeO_nKZmrqYrIvUAvRlLDABB9gtnC_tQcgN_wPIrvk_25N2iJTuYo3IxqjLSR9FIlQap2Zs1ccdo6IGYfUbsGV-ItP_xVgyDCmMmU19qgL_m_TuJNj6aJ6hSiKxvitXnP8U3UmrzGaX2lrVN2JkG71uCD577u4-qUihkbSZmxy50PbcrJ8qceOCtpM6lysV-bxsdvxbAk2C1u_riR_2yBpVEJRv1d1eah0r-8K957dKXI3tGWY0xWi8RMVpG_mQtFF6dcq8INAW7LPjspOLc8T7kYidWf6uFQTcJvwW--JMR6HwcPNLCn8G8GHVxU2CFJRta8bxaPojpfJtBt0JG3AmJ82Mk1bBCiYHcODNB432rrGrXA6EOhTycwGJTJ5CdqEgZCVMW7k7hUUFdK4cR3SJI6ONEAT3roaXCri_jN1tuOde9NysvAc5qMrRi2yGvsm4AHqvPmt-CoUgWVp-hMqIz6tLISdEsQWNjbHYDgsWS_olj-Jbm77DqrgEfqZq0VXYP8UsqwYOwM0P58MHOKm07Jg_FIe8tupotyFz9pCljWHSnGZC9MZhh7OtaH5eMU8mWWy2b_CUDZVDBRX1TbXH-_6eYY1d8x3hfAn5JrKaQOM1hWeNO_DRFmCW3En_76HDIr12YETwbE0DQm7Y_aTwSf4kOkhoC_2iTy7QxWfifmW385CI2BOHLiVHpLA-l2Kg0HU9TYxA-XgcwGi15Vhg5WIQpLXylaLn7d2F-PS6p9OFY5xS_TeIA02ymeqljNqpdUMJimgk1T6W0ZP6dAs8lIH_kaKUSn56HG0SV952tj8oMA5wNFUQ5iTBbGYNYUx7TPXd0mdvnH6tVcV-bGm29W7yX6xHOGQCxjhq__5_iwmjUayrEIlfaePV6doDCVahOJ3bmmoEMeShzpCgFDfBNmrAztJSnPyjkmU2XRxt6D2-YiJsNsPRhUeoEGCnewGfmt0lZJkh2w6Fs9RUiG6ZXuUnmSo7gNLlhDIuIsx-zjU8R6eAso0F1KZkF4kqnmwmI5kk1DaRosy8y0GJKc-S--wJh1DoAYlXB-z8PjpMkWxmIB4oGd31RjVXS1Lt6EGdmocB8r3gb4f0MFjsPfQDKAbs3O-FRtOljraracuhZyLqLRpK6jbKsZVNRMuNM17BviD0XvHwaA-hGv5Giq9HyJsYnuHCgZ4vnxY2b-D7DHmDiqMDJPd7Ld_R28v7-Mou-mKunTJbCts_E6o6joFVkukdF0yCCm60Vbe9GwRzAQNaf2X5iBF3CRz4EI6UmTyCKAJBfy_YLat_1FwXePYlsJa7c8pI1ozCOtV-T5yp-FW8ai-2nvErOba8wZSTGJC2N6KOMTQVYZsEK2xG6kzpaEkaiELZs38oZRVB6lEhLG-JvL61VolLKOZNbgIK6VFmqXgF3qERIyt4a4l_LTfGJ3iJdbWiMECvDYFbupdX9ca8XycgiIK6d2bZ7vKAuYs_WYDxgh80lFzm8UC4vL9ivKPUDOZ5N49O-s4f-pJK3pJsaqQz-gRlDJQCM7uAEry0IJQF-k4QFOycrnNC0wn-7g14pn1VLKAiAwJ9Y7enPAYMeul0y-Uf25hSHE1fM-0j3_evI0QDXUjF2pOahucPxduIAHMjaHW4ZLFYhmMpDuD7o2jS6OtHTK_y7ZbrGrDvFqvvLYa1mmdfNKRPbqOnQpM8WTANL_VPiJCSzD5vhXJnw3s3yFnCAiDJS0JevkOWXd8al8LzceX2qfqaBBmcFfgUyWb_TV1qXjc3DbutQ-t7uJ89QvKPUlg1i7b_EUsxJXFcWX_gbYqnp3_er6LneNtqJVIoqnQHoJRoyfmRtY5uUHY8XywlbHBAFb-nkNx6-GqW7S7CwN4OXEA-kM7uDAMYugVSKYCQFWRHsk4AxsOcOlHuOjCqX4EGrh109gpF4iTwV7L6OEsNTtJ1pwjppCsyRjeOi-pWit1bLX8KEl82-sRE70FZ2BeyD58eRZIfUSR1fyXV7_s5Qsf3tK1kKurI8TK4YtUMSZa7Bu9o3APu19m8uGoxdlF_XiX0GCu_dqYclvvfmYUN-ZEuzgbH-7nEVFQm-JjeLa04O8pjuzoACSQXghzRxejyEyStJRqYCM8WltpI7H1IlVlyuHkN2AKUknC4wBjWjBS1QY-m8gZ3C2deysASIaJ2OfXdY8W3-tW4i9zY5SGsBFOgUm87sRkbuf67CAhxRM6iHWuxI51NJWQYiXuSobaWWhgaCAezcooikDgllZPBBPVZC9S6PhJ9wxDffEYF0Ik8JxK6rWnnFWjTmzk2dG-KOKb-zHZpwxlrPHrytKi5dTu8gHUcbLCTkcbPeGebprJK6WKG9-hqPVKF0w-JdWYllsoV14En04Sv95iKbV5RfKv88IJhjAQcB2EGB7pGC468fPdaILtvADG0164_J6V76L7fkNvF_AsFAhBjGH4TprAj8_8JbsUcJudTQuIaA5Uq-HZTFTy-T7qeLfKMz-TUfKxPN2jdPXuB83I9_XQIFPmf9Sy4ANRUv9Pdd3R37WWVGBYMgBiZcbHQ8mIbD3BFD5DHaCgWt3ZucToKZHJWKZvO8iMaykiCXhOw8TGvNDZI3ne0Z8XsxGQzclo4us73mZAXtc14lEaikrsxXAtLIngCZTVoC_UJDHLxCq9Eh_xHkrddXQXUHtsGyHQNKeCYDOtO8_4aQToUgP6Jz2Kaevwdbc5Qbdbo9K2rnvtxclOQhMxOkRhmphrL4i6B0Bj0No3vHmGG1fIxvAEJnZzA2Hqq6fRcRR47u5XTUeiw1F9h57iJxjFCs8pAuLIxfalmjtUbiv5dXvPC7pbGCM3NfPlaWJc42BIL3PT7NM0J7nI9Z5PNOIkuzUnuyu3BXONUD2lNZeCWJ8js8lfCObZofTo19b7xm_sjAoRLQ9dV-2Z1epejkWZtua22y42SfbFEIFjRE9BOucQ_Sdc0YQcHBE533_uz4wzGoV52X948FBhsoSN1YSe4Av4h5Q123Az45dfFTP7Rbwc4bX9f9mKTb2NU6tPiw1Q76Iag9bbNdT_0sP421UMRuifvttr8jcJgv-zG6urEmqZSDAqhOg3GGsYXnS5YNpDiwN2YOaJfjGYLCiTA-usVqnu-CZ10p_q83JXFEpZfaIg6yB-XJnW33Qt3NvW8kjcHWgIRsOnW8ZXT5eE0iqL13aMuUNGlVfPxE3_-0mC0zFDO1y9Hzz1IXS7yA-O408WlI0Wib1qioDL5twXjpHaNUfj1ziiCBn17ALXeiP0KOdMj4BeeoVFjkUgjYkYhyMnLqOLPYT-QK15Pf4AWVxhcStWNqnYOhZgs_bljuuM_Cfc7RHCgvV71pBE6tOsFX1rgvTiO7ksaZWQfHtcsVR0ig-UWtzR7HSK-WzYNmXkkmS5_D9yVAOIcKRNOSecWiIrPsunAa80xXFyXH-fIXDdgbc5rhuAGpso2LILIgotpj9komVTfms3xC9nlUh7W2HWoNx3dLYAGuxGDo-V2Ig3dAGCjtleV3am4hh_SR3PY-40H1qK7Bpu5mkYDtK8qrdBF3MJ8iavpYEHob2-t_mjjzP3SmoCbRdmQCr2N2qeg57uavLiCyC2EkqYcQ6oqij3cG2xsV6O_RvrnlGR1NDItHG2i4vOrAcxG8a77Gf7Xd_5FtmyymR9J6PwZKVwWxeRy7oOvh1XYYN_PA_A755ZQq4uy0sByWxeuTkYbULZl4oWW-mT5xPTOtdfLXHFqDwWCm99S8zQpPtNIp_sHoEe-lvviv0NkwKh25dJunhFQKBdCjRXCwLLguUL4wnoysLUNw7cCRVL6TUH30xW3rhYQWeDVUFdr1-XuLwViqkHrZ3dSkiDD6U-1bWAs2zCFkbE6ZSn5mEXJvk1HWZqrCpIXVm36RE7uJCBWsJxOFN8hvB56Eafgk7RHNsPj28peArp915qxhFuKUx0HPKyWTcZpkt-eaABhqz9SGyUhNvPF4mfkbVpxjpH0oovU-LLdM0AeIaSCZDYLaxSpPxkD6I9zgi-WYEtRzfkMS1laYQvcO8doPydv4O85Bw-vrMlHii1iuGIdjvX8mcA_IrJEob6qj75wCAP-yxbsieAzyLlynJDAuLr9t1Tnci_N6hg1jtfhN2mZ0RM-dti7NwdJu3IC7DgbZmB1x7wxFkxl2OxPXalDHplK2WU7YXlz_7ne1hJKXH8OftHoXl101JcHtv_JTJArvFEaX-RkRLKasgbfyJZHCZpb9aacOaAUD9mZYhDyeyk7qViX8JM09axXLTzYWEVmFvrf69jqeGBwqhd-bgLzXx7ntzxMlkuUkeXkzNlVwyCDBD6j_U5u7H6voRYBqR0_QWJKkPxQHmLvCFezKkxxShc93K_4PxBqzyYrRWurTdS-YFa4SUrAHb-vPkwUB1R_91_bio-w6GkG8X5yAjthgg_AYfOc2CMJ5hwy0V_6c9KFbmMzoQAkRtmwhqeCzV1gAAy-twfLXerOAEvB_PIio6sWW9ssEJatRlm10WYmickuYFYy_6S0EbgPQS-VuNNKpSc6OQ5-OHZxNt3DC8ynyAeo_GSnzKawG0QQVzfLEiXpG4ct_Fmaoa620yMr-eJsQdAH_ARy6OOc4JFsRDv9w57ZCyPHOcgY4RzbnvI4cUJCCyFyLzH3ViOX1S8cD4Tw2B2PH1RwgzKzlKfIM9bF0xsaSMJ_RUXwATYjxLykPr2NW3LMgDVReAPpx9uAnNBhwn-sJcqZ1yItRjU1BZxXHQnWDUnxw3S7dr3heM-ysm_3KyLSUa3tTtawfUZO3dLEkO6qbcXqzRA9dH-wDMP6_I-XlB3Ct853M7DF87N4bqZRl8pQbozbi5vku93ouq3cew0YojEhHevacLA8fjf05-rVLaXrGzS4eqr91rBALh0DtCuMRFAdwNx0ravliqkQIBUEMmqmkDLy1nmCLG9Huj5JEywCXbP3FLcVNQvnIhFxfdtI7M1vYzNAwL75NewRPByTJO9G2y0axVO_02OXa2CS0THPbiFEg748enIfVmklU72A2UYuZBqp8MFxF9PwU9nTZdgYLirYp0MmWqrbPAWXCkR0I6P9Ng-1ocL9YBS38W-7y2FSByIfViICPp_7799oEOpr02tt1Mim2IDgpS3yu7XfhdFhepKWBKKZ-ldGQ999YQrrmHOtNdmXFCYSWVxKgYUfIIGRP0h951MwvD_Kudd9_DK4QsqlxMQhs8RYuJfKOhiTrhjMoncYoz43a-o31p_fc5PSC6iW2j1sIfsrA-qJJQ-ABxPN4GluQss4fXwDIKw6oWqMu8WS4zjwNxP18bQ9sWVI08hSBpZRGICvUznyVkdcR3Azkn8f6R1ry8mXiB2yr6WhJoKFxSgqlwr64bAiqurGb12tEl3ps8kn-W1TRLhXIYc0_kQ4a4sF_YBD_1i-P1288FxskLjhA0ch4nwKSyPmQ-yawN1FBsOdeo0p40glFDrZIEfEgfVOOlrq93N2Bbx2bNmBVhYFo2XfFNddj2G6wX2TFkJtFI1Ch_1909WD-K2vLg9nMIQUc8eVoADyBWXvd5hxyXR73O-WwkGX1b2tVe94M_Hqs0OanQNd_LEm0e_hsGkG9oaXjyoPuOcuWA3VgPqOXIdc_8BwMi2k2DntX07n2LrtNwx-ilSDV8KHZZWjlwKoed6uDi0Lgd-SaNNb91PwlvDSkN-ZGGV3JkYzx9WTd9vi2k9Ne-XXp173GUTOaw9T0OxwF36Tsr69N8TYZGNmMwgQ2wye0e4h8pPgZibUGg85WQ97Kwk52XPsXCpR7iHuxmPNzl2Cj8sia2INs0KMmC3xALjqvc6xT1fsDq4X2u-bFYiTGgBo4FfByqPZFV-79wgA5TO6b4p3q9eixTdAOstOnBNr2whKn2784EpxDVUuB56WMFuvbo3cFe4tN_Ap1z1DgvUYoVbZMgDjn0sbpFI8q4rRuF6oRw7JZQzj9EM9GUC8O23_FvvvRjmY_ahznd4JwzWYKxy-NG624bZEZNsyt8zThOl06Lm-zNbLMb8mw1a2-SnUJtrEiIwDUSJJeV10go9FY7UCiKMeEGKYzBr9Lj9vukK8NhYaizvTFygAacxWLUxKDU3nNvJvu07rgVw64BobkiA5SR5l1UQgud27YSgmaUG7QdYfDMiFmjFnpyKCn2xZC3Hs_5x5qM51hTAyCJ9ytApuLbAXk9VOWsYFY3KKqCkY2q6uIz6TnlTlXX_0zDRfgBtHlM4dIWvN6MErtfUXfkGXYDbzMxC0di3PQq_ZGmS7RS3LGPwBUgT2_k3DRHgwdu8wMjltlF62De3CqkuhlAJ5DpFOWhuWDtoSXZj08GlekTxharl85AgCNXShECq_pajeLVoZmCfiETIn_M20aadGOH2plMJhSgJzEVJ1Xgrh_QWaDDxnqhvvwzmFNYWr6IRpoVnWQG3WvWFKUhpaTPxMKcZHSzdDiOh_HGOR9iZ0i95pttswbmXTuNYpC23IKZ0SKnr120r6W9KUWkoF7tMo16Na_dpYcYHHDAbUgX6UFgdWPv_7D6UtR2I2K69dKJDgEGrDIDWy7UovnSQ1ayoeTRMCNTNiXYBrCkjJpb3Y9cLiqo9r2R94mHkd7XXIfkpVf7Qp3NenYbiAyO5IwKBMHRoGItqhWEjZXv2VVfjjRpDDize7xpm9DZ6OLxGEykDLS0R4S9MJXs4V-Y0zvrN2LEgUtpQi-Nco6Wms9TvYPi5Cjvf7NK85mdho8KxIwOHyFSksoHo27f_G93DakWAjNvMIxE67v_2DD4kEWdH8D-q6OaU3k0lKFfz0wCM3qKMSDZ951Y4WQcwgsVaySbjuOYdylxjLwZ4sQ_LsHXe-e68S-wGryDcgLJSNkDAsJq_uhM1YuyTOpe0NpqLscsWoTICrFjkaH9lE6hMSrF6NR8e0DzwJjoYrRghQErLEfM_WtNiZDp6YpV3iHikG5C70otYlOOUQiyzuoT6YapQi24GIXoyBA6uuzTnAuz7o3OKUHC0QtLTkRu7Qsya-g_aM_h8dB1XRAoFRz4An6GPO67Y669gjqzF0WmcB8hOptMLqK4kZaD0HPJaLcKYJV1yGp9QTuXKCubUo-Vmgrh__VTESGOhQvuqVo9Sm8bPg_Oj35c04ulrVvpr4Y_S7v5VEP7zlFZTIs1xItnsTPZp6T4IUjQAXi6n1QElSy7AuouCQYDNH19oWzCbwKwwNtDFSEnRoRy1TcPV_lYSQphFk9u0kOU_l6pkOtRKBXFmX6G9aCho4GVR2JI3nS5hpiBI_MnzQcFbUVvwNHAAI9ORgjtaiUL-z_63m8FrGE-Gta6_ZSbhBa7cA4RU0KSdHw8t_BOdfcvpL1uvxfRvbzB-25KLSmOLJh7GDpjFAI3dUvge9VCAWSdMN_RpEED3s_dwDmuioG48p988zrXt-nTILhG8L5Vp1AUPhjLK5hV95TRPQa0cBZJGM0NYfMc80MHI5QCuzsxENWLO26VxQ0E214_VdUonGbzCE4eVxBx5I0wwBHKGhaPpvTUTZpS7AQ2tYmUlum0SzubAjDs3M46PdEpPoazgxoldtth6iV_5f3sbj_lQEBluniWQIVHI9AmXC4FwKd7z71AF8bvmr3F_DgjlJbzxQ2s20V26FVUT-Yz4hzgMJN74ghu2igE5ybHnjT3WooAgs5NoDC2cbOHkIXfWvQ3uG-2O1TLDGR5c-N57danlaSrA1snd_eMnloMvuYpDqhrEtNKfu9MRZYNfIctTR5-lpGv47Pn_Tw5RtJ1NRqhAR4bOXL175M64XzzI9aBK-JiLY8Ae4ZIj3qHYTnKCyMmQHODBntCD8MSLxe7_lNGQmztJ6ujCXsvTT93DBQBqRdX6T-4lC1UkkKfdofKmwM8Wt0Dp_Bpjr4CbxQn769c--lU-ZBOTpYSL10lNw5ZKjrzAGFDqVz7QojXxJ8grI_aI3_tc2rOQaVlzvJEy1YLIxaThyFxPxUgM4hgO2Cu8BzksaT-EMm_hblTc9Phk3A1npmzgiVZZ3X93tMf7dxOHMwl6XNLVkt0_mz3-qV8ShFMNdHJd_yQFwxstUVjlmTYWrQLPiArrNrqKBC4Df5uAV-yhKdi8iPF5tohrNng7CUW7KbKe5dhWInN8XTnK3K91qaA_wmkQTycKxh4HGPRk46IeZz1Cl_c3swndgasATw5lPR51ApZ2HenNaiC-vsFMZUrjynEVTZHTs78HP-eQLF2wWi5s7qByQIlaWDGugI0e77UZQePtfogAcd-esSFlMhhDDAcN2OOhdXLBJnVl7wwYsrF8jjC2PqpuToKfM-d0MYOM03U-z-2_qPY4yW7ay1sFcHi2thwqFH2rHNncA9fmS8KiEwEvgtHcGW04-xsMVnI-Cs1_2UEHf6gS883BLtZwl3yJBgR_R05PpeLh2_1cje8r0pvjgEFc76JttyrLH_Bqp0ysiXb5EpUZXZ_KLQkLTiHaVP2M_V2l4CSGsAQTZm8ELi86qeVod5m3oPEwez3sBnboaT-LZsejk9b112OhimtsBPm1iEIdoOkjmb8QrRJ9AnwXW2bxahKkh-79e3jZXZVy82BW7HpeCtXSaoTjQV3nYmsxR53lhUYJEYfQmJ4_gBW8c9NlT8pxBZNYqOb4f_Vg6cVj7h3ZXUhTIuQpZ-53qNae4eW_QnykBDrDPdPXGN1qnNZjTp_3DCOCqp-UAPngFupJQ7jc9BoXQ4J-KG3haA-JV3aJ-c2_CQ0N0YSwE_ePb38I46kQ7QOJcKbIdGjUWoJWV5JmCRbrYVgNS9j1yFbkCVoWkRVSvL9DQIGPKlvbYLbjm_NXPk1fVJyqaL9Vh-6a_3V2AtuU7hbotImi2npnr7UX7iB_z_Lgz9PbTIt22Q0wbIERl5wkr18wf9pfK6no_fS8WZJiWkrIRK6LOjWakzRY0bWztO1TIQUH0cGYMLhSLd5XixXQPUZ5_enHr8Ks92Ut75pl2xGnuYXgUsoyMb-y2vKQi0KWVcwL_uz82RRlQdgBjNMn5gufESRQlwV7See4GoE27WVoc5XRrSbw__OBqCz0Ct7GGI5ObPSF_Hq76VkSRXQc2gKz-D7OPhNnmLKRo7oqWnz_myYaJL-NpYOzifSQvSiweLeh-lpx1gsTzEByHDYIF-GHOYlKDfPWQapHF0o4KyI1bmYwWReRadc17vGHzsASNWVIypn0-o73SgK0i0M6kArv8pb603GWqe8kb2C4ZGvAWAamt01rDEf6MD4S-EhxInfQPHAFFm0WkRNovxfaUkobmIAoyxPCJreN6y9XKEaNzLFi6dVQ_550qEhleFxbJM3gol3WBHc2WBzmcd8mUY-JS90JTn1frDYcPSeDB_jQz_bbcpQ4-AMn23pTXECynRDjZ6XxnUbzhPlFC-qELfes8YyqHICq7X9I5_IX2TFy61vw6igbl3rxKOERMu9JMauxpBVULAwmoe7_9KXfI8rW7-bJRabb8anwVdDmMyk2pJRhjgWwc8CVCmMAwFjPdqQOukKz4ArEyrcOQku79tMPxGmYi-VYiQODiadd0VSbBLAU7V679bmcueQkxL-fv1IHxiSn0KNEjVYEni-2WkklBAKppZDPKwYOUfOqXVDBrsab2uFNZq2SCdMuG-kUBPHoHf21rEUkwEwmCphfzemnvOwLZVmD3ICKvITTbu9vvZ_7Y4OlRaIj4HdoLmqoHNm5QM9vOb350jbC8BPrHDt4QcgFr0WzyB9NG9DY-dRipNnwBtJdjTiGKvIKMVLMibFGgmDui52ZSNnQfhtSl_7X0zo0xXXzHVJdwyBTRFjYspVPT1sc-_-_olErRQaaYI8FrKrfgX0VLIwB4893Q8m1rUcWPXTmeORoWvRkkT9nL_TE3OExq6crAPlHf2T3fIdqq9JjjTaK_-QhBBt33w2KoyDedI01UpbIzAtnMHCKQ-RBvU3R_8VIpzqiDY1L8bkS1RRiLNcucaHBXplSx5rUiqsgJHBxawTAz49MD1f0c9p2TetA2T_cs1P6QRZDwQJfEQzlpynZCMFvosNrKNcPstYJTQe3ZeuZ2OddeEXs9rIcs66uwJ6UY6uNhRzA0Rx7nMJ1oFMhp2qpCDuumchdiOXV1eCPKLjFWs8zWFtCm941qQXRQLgTRw4hoLVbE9QiX-WKezSGQWCuxuQ9Yl1MVKRKoeJ5us6l4SAfVrVMM_4SAOpcCY8YCUvuUOA1CA9lpm8Hg4HKnzDUFxyng_WHKmLW4o_9j-dLVrJ-4krkIc7ezymrLPuwaUZd-YjH_XELDdzGj6rcZMVVP8LHBat4YcLeAvO_oFf-JS6PJmS18LFHi-h-lOSO6SvX449yDzGLJVmqJm_09JjeX6t1YFCzCJYjkcnJMLvcGgBjGvK6T-saiMksoqY4ykwWglnUdNhjuOFZrZpFE1fPgN8eS2qh1N77AODdp453exVVgNLulava-CpsIuVSzEmB6ibXm59kVTzE2A7cbEXJ9PYo-GWUAutUWJB5aOnkMo2Ev-9IUiP1x8RBxqWHW622xwQpPsZK6ieQpKlshU6jiLZa88fdRYzwSTZOro8EH9_Spz-C3NvpP9bbMdu2QUEiPo3GpzM-zwDDpXwUWsGUQ_bmAV6v2rRm2HxfR0SfdgqoSRQDfabd59EFfB9ShXkkhy57do12jwfWz5gXGU8T2snW0DBGgVpTaec9DdUFzT4MmOVrcFplLIkmxkmmJNG55GDv26T_XBWjPw1cMtMQ8kmrdCxSaziMvU45nSYOXbXnZWHnVssrweKQZK6sW8Ph1s-0fhElSYcA5VfKYP8zwXBOtxh16hBA3lCBvUoPMohahoPbja2zSGjQC7MLMu4_P9G3WDK3E4AeO08YBfp-GfdcgerwWjz7sXfAin5yBdM_T4j6Imf3v_ULjrrbAA745oem101p-joD-5ashPhgQ29lzc3KsihpeDZJjVS3nAAbfs5hlJy4p1gYeK7a5o8NwPBQcozOCXo3P9QNOf4xtCr8XTwUwq7lRwZXgBHBdqoWIoW5jORYZKVHafUf-Mvqp_GqUfqIS1TSJFToktGQxuqt1Gdzwxd3ZoD4rwiD_NRK-n1IVII_vSvsIJa-FiTQ1eCxE-mx7DQzhGWMZbLxMnJF66FzKgSHF-rFA5xlOhk8-BjUOMtblNgl2HYsYzuYMrl_yZ1eke7DEwtfJE8hKpQCUILwoAIw6RBFsLsv9oEF7rBeiJcR9xRBI20dYDYGPYBg5ziMLf4fh1FtOJzd6oqmzI9V0o_TT19oiDR0xLNvdsjTAQ7o6Jb3wOpwyXm2tXNGnWVb-GvZf8docYVEro79V388s004GXbsHC4iw0CUnXgOkZlWLOUFuyRZOhQxb2NWOB3Hn_p5Z_c8L8Bwj7-6KqsY0qo_outKtBwWgSEskYbT5PO1KF6P2jY5T7qCsNvl3MoZntV9Eq5mBESKj4YwvWs03J18bI9e4jRhMOCNOsdZLf7jfuVWkD9gJAc2CnQRblGub2R314J1tq590z-CBBqEJFXbJhPHZtC3pbr1er3-NF1xbGqyROgtfTmdyNeueJ6H4hNyVes09wRP0mPf_8SA2R_ozyJoj7VJJMr8BoAqLO0aG-lT1QbijiIVsga3tvyAd7AJ-jwnXNkZHeSuDXdF21mTxoTBOOQamfeGUn3gU8rT8AQA_V9SS4vgM2ZMjhtidvx62slk2k05akKQyqI0LUz7tTOvZCSRb_Hnv_t7Z37rRkUslfxXJUEkRcrXHteWS9ngUoe8hgFbaFeMf5SO3x3dY123jZYfkH0kc3zVZbzozJwBqyyNS_Yumd-pma8dITpI6m8jxwgORdEqsPQqLEIa3Q1MsRWR0YaT9XwwTAEO2nyR6j-wR-JBLRfuh4vnZZDbUIqKq0Hzelm3nwuu1J9sEVskuNMjPmy-xHVpwbK3az0FZXgqq8S_SVPx-lLLzOH_UJqEY1J8PjL2W0t-as9LUw7G5NLTFutJ2qshgAqgj-67v3PxeRBxHrQfMfj5Lu8Ln7ZO7BWWYE0K5Cef5D0a2k5XRTnYzgtdFC9FpTcCkt7OVwLn8FW6he-rsGxRvAhqk3EAdhBAZLt5q_mxaJL2e0nR1E5imzS4KFOursILPw3QGkPZIJnAldkfAI9wmFgLrAlyfpAzrO1UV-KpUYF5uGjzQ8y7P7KaWzkYkrtkYjTzUdeUMF8_FIA036h9_ZXpiI26H2H0kYwdig-2PZ_xlVZsFzWFBqSgOaV2h-JMd3pROqcT-eHeSPJZxUTXfW8QXF6pImwPxdTOkqmNwvzRmemOPeYVYXiruFRnYWs9htubmyPq-QQ88QKQIMmeFCv7Q_0-zBokNp8XBnvMuNihnGh4Cr23_7OlGw9YgDEXIi1Jl2KO9g0qUs9rFRkolBwaoGwvB_fo4UyCGxWUd91ZN92ZeoOroZaTVBgivQuE84JSzZxxUVquKwlToHQ9z7f8_dA_drd-TCynTnsvSpsLveik_WLZReVCSteEvhEvIosX5KzcB6xH6mv9sHql1N28_3UxEaMuKOqnvegoWGK9tRwEGzU5TbH8IOvy-EVOduOEtuaZWFzT7zGcfUFVBVzTC9ny8epNaJiPAS56ulGN-Pg7uQlMMLdIhIZ34BQJ_nZ8zuTP6e-jTyF2NzoM4QCMn_yvehFDBABNJ-AeCSiWM4nmKwyCIfi5Ow0bx3Gee1HVRytqMrYFPRBhDyx8w-Z7XNgmriXYGoqp_Z_HDv6uYC1MpAuvQAMbdYbBGmqBLDvlBHuLwyfi2jzfZjbBgsZLtVAfhtwehJNDoq5QQZ9tlxfIFeVfBQgLNcyBblPBYyFCJytV7QfmImLE-QZQ4kZ0pCtsu0A-oWcZOXGvM802t1f_rHh1bJJHqKpI4v5qzXiy0HNj6pGmiftjtF_KdT5NXVn2UkIVx7VO6t2PxbohVgdrwYYG2NcSZlZKXGEHsRA3kkEAEgfWFdSH7zvhDugCgH70Q74ulL_2gm2yfkY-AXTamLNsIxfqeHOQfhpw55I7RuYFAISCP6pzo91XXwYlER3GUjlb-G7gkVjz-iO4LPi-vupXVCNqPuPtoZrtlPTIPxPmZUhku_XlIGovrIgNcvqST07XyWGcEg7hpTZ-fvRl8Su_x56daqWQx-vS7bfyMHVyew8Yw799SWVLZZNP5GjHgWcbEcStbXk8zcIok3omoQmmZH67uqCx73uPkAh1M882ueIaHXMS9C-h0K_9ss4RzJi9tF7b-NtXwVn-VK9D3dnEta-Bk0hrXINhQx3WubIxY0CWGuKSk92lfULr53E_IEY83QXqmrsXvWDMAL0FA9PgH1W7J0UbwToXv0h6cavbpqt6gfdMStIVATWLXC_8D7bbj_YyvYVUpQ_4JxPaxeFMYYBsIyspeiJNZb__MPqfcaO2xvQ8pwfGBpHSALhpXzVG9KRcBxE_3nnITFFPJl3z2Plui9mWZ3kR1Dvwoj-VQdbn3dOx2-4y7NpnPDAjYPa52-nWOWFWyo-81gScuU1fHaa49T-ceEAC7tFRYAkISkmjB7N7c94XvXcvAMrY7eV2MDAavVMd0r102AkzuHVaADLmow4Fwuh6LDqHBJmYfw7fheXYjzvD2q3myKw8zhbXXlNFjwRlJ4EAYs4neab1xbTb6gelxSVj6AUkkJroLJOv38ydS1kWcGCfBY1IGQ-Iv-3hqnQq4nkr_a28fPKgKOxL4vzlOgGZT_K_bPB8VnxtJaGPFksjaWWMQvq5VeSfBFvySC3R7BDBp-XQavBNOex5q9b1qIsdR_xYKKfBNmbHaUyuqAMRVp0nNA0noOeJb8eze-xFLR62veYg50JlfDHIHtoRWNtDugdnOEsiEB9P5-3u2YKnQG635R6apItYXzWbir-d_b0fZTRMYKV08CdO6hc8lhgaZ3GsUND7D1EADFdpSy_ERzMFAZFfSNWkVPB8wIYMcWdXNQZWNLnod-tY1PURzE3FHI54VWgxlb1FUEJMIQl5ovA3nAHRKOLgn8vSfexuM0jOJ3Whjys5Q6uSO44GlMWRM4qmU_bGy9HGMZDe9fm-jxhIuy0DjGsC23Tm5c-CV3nxfsobpLC6ZYjRH2zuKVg3SiZFQ-dGdh47iiKLpcq42E6lxZA1PetujDQUkxRVArqArBjSq7cbEUgWEzYUrKaksN8RzTIc0_8IemOJPobSMz_D2FxdQzioi0-AN59yom93G_76MPtQPd-v8PNS_npYJ_99YAeu4uozSVQyrWALHaEEx6nF5vVekhOMvhuu--RLNbTufrHBLO6za5xcugsfyWE99lwttfrf_AUfW7TAGwiCt2jYfDsB1t3wRGw-ZPIOa13fZtQ4pv5Xkt0QwtXbKruXKw-8ofFwsU-tPuo1ndz51ZQghIE-GscaXCL8Jzcs6y2wvsv1mK93xsUD8mrTNezUjQKdOi4Lz-G2KH38Z9Bi5lqJlp8C7wsCwbUkKANsXfvFVUe2zTc8C5KZe6SIlnj_VNvIe44bKW4PRuW0BuJQA3hAL4Y6ZkObU9gcKQ1P_jPoJ9kDc8J0H9irl6eG3pilmlqCQxbm8-RI0W2XCxB-legvn-qBUVAApBMzBE8C1nqn6Hjnj-zNk9ab6dR4Ms9UQ10dA0-ZkCZKVujZ_WguSTG_asOG8KgT3BvfZYlQGKgkE3H5JNHltcoOizMp4tZBf6jK0UmeEphIOKZQdWmZPWPf9xNQGTJ17apUn6IOsTo8_-fS-Se_R8p5CR9LkCH9BIEDfew1IrjU80QGLLWnjYdz8IscNU6h-1XFFe43JGASH7rui7nYBKCXj77wTzg0kdEhTIizGl9ZsJSPI9L6QegJ1N18xjZ0Qq8DDyonhENCbYnerdTPUVgCr15zmgQ5zwg_DOyUkeqfL3xZDgb72KskXhdUg9VEGuc80ExfGVJ7-1Ad34xjXeUGtDdCI_IGT9YNFJjfdCC-MKXg8E6AkSA_Pdt2I5o5lwJyEXiGIrWsh9XkqWeioJeh00DU0fEWmCgoyG-B26h_oz8OsyOFCxS9umdckim9IZbSSIp497-LVxlP1m-ZwPG0RJX1hISwbzzUeZMTYL8LV7xPVz5XaNzS4bk_CxShYCFSanWe886Jak_XRGLU4_D2rTYmDdZXxJf7k1QN5U_zH1y7E8U_SNCPMeLMXgHnmglE1nU5W0OWbuij066k5bYBBTe4X3gWBUHJePQ1DJ-G3XRs_gPXzPyFev7rwsPe9u8rG2aqAWHrZ8k93QIO1k_POPxBo44dFM2kbnmeSBVpu5CwPu3xdrKZ_bTo9_5F1YFSpaLOOxHK0AHFILvs-MCpSUTMAIkGq5FC7sDop3voaknkMZq_V4tJ7TJcP755GPiX_rvDcokMrxRXu7ikQSV5pxnxZD1RpblDW3Kki1PC0NuwS6f0mdHL1fSigdqcdy4CbGJigPJPaWkZQKdQ0usrn8_ohPbCdiqzWhvnqNIGns8elZ8nT3UWGn4QHxErR50ytSAn9L5lPtRyI33NsPiBf5j4LyRhDFBVZ0UBFW97kWnrkiSy_V5WphPEzVq8wK3vyg0en-IXJSEAff_GJzHBN_HM39XJSya0btdd0gSMTHpQQ5L7zZ5s_Oou-mrD7nzmIuOvFI6FoaztL_BtTq2VyZK8XiUohygSLFK_9ulswJ4v4DUsB4V_QLxlICLsDouLqE11ZpcOT22XtU7XIDVCIT2m1U9LjYRk9Wy-waOPrpbv3kXwQTKyRjmy3ltXRVYufw4b-tJPiYSbMvZ61jN3Mx6bq7sGh1jcXK7KhqQ7OnZi3exBfFijz9afi6ecaKb58jPbp6aQ8TVtuzO6k8vwvMWVw-XhNrHR_wTq4Eqf8UrB2d4ie2K8TZ20-PcOHP6q8nZgK5ozDyJazTJwaxtq0lSDzJ5Re1A7MSbEUiUmWPsP4WFtdnYJsLUiPdMcm4XIwkSp7mAXuitLNDQa6PHpuZsVmQBl3AgAC7OlStkqjYfEI9DHhcIhPHQz6RrZAVIaNOchqZXkcIHD3ez54zCdsN5mUc6HCC1a8AYfRRKJAnR54n6wMBCl-Ldzv_JyVcjIxDEh8KEZplMUnZM8_TJ3d70Zq-oaQNHkmjptBoMU3rFqeHG2osqQUSrXvnPS8qbAQei5LUYwlhnxvE3D9KamdqAXdz54VQKiXKq442oqDmknOwrbDSi695j5U2qb4TCZMQx8qMpt3Wslk17JJFMmsypGCLTxeugn3I9bNIzYe93yRwQNP6P7ZM-9EeS4NVpi5q95b73Sgr77bLgG_isHe2lhodY2FvovJPlauYRPKOvJ2oSofNiI4h1XoEq00as8S3y3VfEw2hDV_BVmpCWn0FDHDBswXeNVMtdqNAGoNon6h2ACXKjUJIbufeLd9nLNIyxbEs9FPkw1QQRgqDVwv-COa2f9h5BuxU5l0sR3cv8oDiqDAPEL8DvUDzfXtW9L1rUm4Rc61zpeOQQa-Bcw4671XpIQ7pntkJ7-nTL_9zOOQE2AYbN6fkrDg2ju2BZE0PAZWBsyAMdIrKIFztnvdEKBKU8059mQr_TuH7WHswFFj6x4c1r-1Sb0vShb7i0_jQrkr83jRVbezhm6odm3qpSmrIuk4wYz2ZrvO2qx7P5y83eFLqsmcZMWFyq6ILyrVYICwSc5valuEyc8UEjrKxmy3xq8RP2COSBlVWAUKreq0r5LGYi6XoaZW13Yde1GqHieRJcwgzV6hgCIwr44d-D2O5Yn3pLiawVZsmN4vdyWWt-0_rpkhDgZo3ziHaMeMS-ZVwhvgi8IljaaOXcy27y1pva5nEnRTzP-RYsKY6jjpXrZ_QITfV-2EISRsZZ39JzU7VT2-YTdyrUMDJClzWyijm1TQvC1IKZITGIJ1E5BTXqtNabEfmYkhx5osYRhZ71D_5U00u64xuiiUSc3zFvRO0orlNsG5jburyAAm2j9PrDFK-_ceg_vBlCpSAB9kJ6AEJgn9G2BuMdaOLmR8E3Y8lDf3HvJRfIL0S2RkwcP4KuZ4bSdwwphExXaii48qmOK2wXkTezqqvaYyJJdnNHecZswVwfGzLZtS6S0656qIYEG4WNRuCBwaaFhnJQ1_UvPGQ91I8NiFb0T51BJIdVNemLIBr9B3mxct7N7V_RbjvcU03ecYQfgxRiLtMi2hjzxRvLTOalyi0xMw0uC5ELPf_tKPPLh40gyPz8cfFx12BpKDwxy5E9WsnpbnGJ4zLCBHbHVGzyzwNXqwL6I9UR4tUmgAF0LjL3nKAM7oqvULJ3qFuNcfeplG3c-jrlA1alx-qXs8egIsN5YDOPv_APESOOQ7kWcmqhqU-rqHsUpMitAHPM65DlMyhAsLwqCsbxl6obCyJpaHgO015iJ4IzJTmiBuDd8eoB0aNqyxDO0tGeQhtTg3K6cd_tq5tsAAAD1W9gskwO38jV_u1mwsYSi5_MfTyLWWV5NTpR3QXprRMQyXHl3acmA2JzhAGDy-DO0vAyLqC2L_0sraN1CMBthECR6AEgwfFzNDYk25H7n68pC2I7l_lufCmIXvdavxAC_8QxwHq7b3U_vwTrWCT9Dcb3hkWIxG-FgSltlm6bjUcZPNQF0ST2psjZUHayeO2ir_77ykMwP2uH0r7k6NJwRt5FmUl9kcqCBydp8imB8DIjqXaAlYwFQ4bUc0E6kWqaSwZ1RGLe5fYwxro2SyzyIQpgSn8eu6L9oD9OZWtA_8EcECOZg8h2qLEjlgM3F71GAE6NWBV4JcoapEs2Og8-YIQ47jBfFpiKvrSW9E04uZy6Fg-1gJZuDntzwYEEc784Winefx9Gq5otNquDy9nAoC0x5q-P8En0lOIvVeu-fDoD0LsCoG0KPRq4AhNwkG4s2MKdZW3inzXp7OSbFlqwTXdls5xOpRZa_7Uk2gTPwytTd3pLA5GjeOckTVTubfbRFFFgjCi9fx0xAYfbzEiyhJMfM9eG31lmOehN_-87lEesfMApjLR45a7CiXr5f_ni3c4cjg1N38zsSsUOD-QQjPVl6aZ6QzpOeYq4FUgooPuMoeH85nAC82z7pmMp2blrJjwQZjY7zsuC-C4qzq1X6Q6WQQ4uedLOMbOniinWrGhKq5lWHgQlsYSXIvdNk96j8sWLSZ_2BIdkp4c3kiKgJ2qy3gfv7WHg0WXOQgGFYcm07go77THaGhL0qku3iYlj1nF-bvK-pUm8zq35Rtik3tovO6QlkWJqFFmpyxgXFLZG1I_dYwKtaX3JCmhyEhYOkwNQ6Kf6CL-cViZVD4vx6vG7UL037wFdPgm7gZ__oL4mNDsk-Atl-3rnu4m8szbtmeesMlvzJHufskAezwmM29VcUQlceov31ov21uZj_POH_yDYqb6OrGCb1AD0LXp0baxpeMigI5CP88eNXZc4PzdERlsWo2Gdtdj-6MiTC0gGj2AjRu8XOg2dGSOS0_b7zmBlDQju47zrj14OUfA3Xd77SDECOzG0ZoQs2tM5e8AOD6_5HRf8nOcLV-7kVJQbrTJPUMWKPYT5zgh7iHgl7eSbNz_QFhgmFwDhK8nurKQINRGVylfpSbjy-2jXmEtOGm_JZY_FX_ZRn-reXMb1qafmO0KtQHFjwIfIErai_ZIB_CQG05FZlL5NyimotjAX4ib2fqFAgJBuLygNiZxG08uR50DLz96W29NYJtEn-RMUGApVb4vPmyywUXyfAXyR0eFIxzPbN9haKjDkrbPoDUgz7bnXIPTZpJC2nq9F_edZHB_y7wUb2PrtOAa7t3E5WhIXE_8MRoUYaTc5-xvADkSU-v-Jw61B_J3GFHJVnUs4TmRuDfnC0BT67OjfvRLe8L8JNZY1WbRxJvT8Xxq_4ZtwGzBhlLsMjNhPhOwtnY1F6Kd61__akw4so9tA0SO6ppOZIYypSp8flssvMekMrg5N0SAzL6HnRmZ7CWlqdqYH-WuPmIX9Ximng3Fzasug33qPUGQ2MyBnmjOBiwuElQN4tDHPQnN8Hf-EUDynEQq8MK4hUuYg95_kxOENF0FW0MqmR-j6cLw6HAfobrFsAFvxgKPQP_9dyvhRankV4Dhd54H1r9OVL68pK1QgWazoh0nS6wViVCaDOFPhka58UahJIgvoshtYditM7k9r_9T0W62wscs-_mvjDI_KjOEwjBRpAyd_yGM-Xn5x59POR197faOk0LGjLt8PWwtVtV1eTtIVM_IHRWkVabnlHmsX8xhNZgrgUnr-PJw3HyIROwVlHnqRqDtQYnj599wMSXhKJB-oLfy_qxXhOBcBgetzgTSCmpdPl7qMIR7dSasNadHqOTFtFZAGlDeci_n9iA1Yp8patqdShmPfy13xTpiOkkPtC9jiewoWYCizmtrttXhhJbcVSyvYNhH_xfV19r0eMSRkYGugtu4mvvc2qryPx6aL5CRm6C9Z8c2ePmSZIBo4lpfoVQmTEy_m7y95D7aExqELKCdw1Be7NV6P5Yg3iBvYEXPhfXovuvmLhhz9IXJgFbPsaQVB1rxS8GMdqFr6Vtx0DLBbUGfKEi2WwhHOb7fn88gEOFKC4dPSlQy_BVZ_DEW_oaTgKPqC6bVis6U8beN1oppGLFfONWFfuzxF7HO8v3xwBHJ81JIbf5YGBWtff-WYh6T8LMsP3bvOzauU91-CAQWwy6IE1U70WV3UQmacnl4KnT8Splqpye3CkkJ9oOWvvhw-MII2wjttsctAlz8YgpOXJjWfBLB_oZFJinaZHVj8uDE26zCcLw8r57Efr44cGBRHlXy4iJ0NDI13yvQjFyrBnh9cYkKUsljDyANM19Tr5VHi-5hjKNnL8vi6GXUr6BuPn5B_iS2yu0PLR-t6joitrbIHbZe3uYsoPnj6FjFq27WHbTcWMSWD09FsuFO3TpixPQC3P2R4ku-OCgzToXi1Ola1eyU0uiJe7-AgF4zAXpkvnsnxoZRDMMOopqT2Tq0HENi-mulQS9g_-QbvKdnHILBHSA6T0ygeeWNW1zMmQol0GNf_dd4bqB-m-Z_VzHNMaUkdB7lWpKrbiWr919zqvm7b3OboKg5hFGdDKke5Ik2yVI2vr9JrBa-PhnxALrKlYfMtFiJ-EVdBhh4wqMXJ617HCpioWT1m6c20wOClM2N48AWD_M8MkuAT78mNceBlNs-WAHLAUpplkzCOaH4JYkBCesqdEywTLfGpVBxlhrP25AiCwmVTmetOgcIjAk9uvsrUSdGNe5VL3ertIrc4EBNRNqNhc6lI9PZFT7O2NgrMD4mwQVzE-VUfRcW-ldxwPHoTL7qkWg1XXcGjFN28B_t_qfHyJNP5Go0nVo3xiU3foemuS8FR-BILqKEQd_WxrypZdzwpG-HUFCZ5vE309jaOvZgUTYs5qtVy3EVZ0gX3E3zj7qaDmDyuNWUUm9CQQSnaKy56fYHCjRR2bHuv0ZDNgIL1ln-4juB--FiUETobcpsU7TsL_6hbTTfk0inbiIxUdgvj5J9oK1Bk2h5ZW_YgZLJhcCEAJZQ1sv58UAI8MVoHrqqmQTFDCQXi2XGTugP33J1m68MLvikKKdxFMV7JtOIbWfQKBPPS8PR-c_Kpk1pqGZqfG_KuoKJJEyZ1gCOAmHGD7rnl7QSuLN8-AsSlWB5CXKfFkWEs2f4cBue9Pb5y2ynMtA-8NKg0rYAQDIqpMHqH8n75FJzSji2rgOo3my1SnghBQ4DbjFOQG8ouA_1j0u8WaqGZ0f_wRXxvGEA5uVLJzaBZb9W3x-6Q6C4wdDNOEQsnJvTGWKDk4kAZtFtuPBPRIVI8q-zffEqeh_SiCCmpj0BhQMW-Jmd1VdhvDNbuEM27JCIOZHrTi20Lm59qsveVLQ0ujORMSj0YOH2SsJTovILTH0U6iCfJccMTvxEhrjlftYLDTcoGc0umBtvIY165a6gBv7ttPPG6CtYEzQAV1uZu9iNnmtXtSP1xz22dhcU7tuI9QKeKI0Ra-ZDUn0T_pKAyKDFKHiflmX8HvPfxMECOz-Fyus1zQ-_cPbM3uOW2XbDfKi4KuLx0FVbzefVX1jVNF9l4pPa7crOsL7ojbkir4q1F9bhuXCPUgRvyHEEkUTL7QgBeLgf73gZthdVoXunB-qwKjg5w7IpfrrbZ_pY50t-1TCaGFmEw49GEM8qT5JuGWi0o2mZq3TpBDZU_y4OGkgdDfwGI6hwAjPMqaW9Ii4VXSoK-VPli4yKWsq0OHwJbkm6FRYc5arII7Vlnd1EiggPoTuO1Q4H_LSovGRaCXwbOveqFJG19aeh69ef_Wz1AjwBxqPAqS_M_G7caMoSx4OmxFDNI1b6wGUjql1QTf641rCBXFK1UHYMk1Ls1RIDm5d83ygJ77wqDPgHKKrJwEUPUxQ0VbYsmLD1nPq0mk6o2aCh6ES5gA7ogULfCr7pDQVEyBp34ooVwKi9MWiXXjbnlc6Y89zP4p-5jkJ1ytLKRU8f3DvlUCHVVDLCMVLb_VuQ581DfLFWHAycvKuzpjMDx0ZEUIgmbKYBG7BD35PkGC7m7LYlgUqtsriksP_KSsv4XJ1PbBOACkQV4GzdYF6UOmJ8Acks9Zu91IWsGiDp7XrVCdrG3B6Lt8dhjVx5YRhfqqxgUrDUK8XYWqisTpO0i_A_ribLn8SG3cPD-t3adIBEi8lbduXRMPuuO1G5wgffEHxAPPFlAcDsXpOJJd3-x-rNH9mKeGugtH5h4tuBNAwKvXXpJQFGQ8b5bZGKevvlCHsfdlbI-c4cAo9Y50tGbYkvCbboJ0GbpLv3HC9KMZwj-G0yoFpXunYZT1A3aHq0hcoW9NMm_kEREUB_vpIJ3ONVzRxjM9r7SxIJ94hE_9EPIbV3B86uxsTWW29UWfCe_J-lebblPvGgHhArwYb6JFGQ9f5dDEVUl0xSNO-Og7uvJeTr4gbJDajiP1jr-Ch26ju_o-s1o3ukhkc8GqRDrrLHC--wINSvWzMo_grYh83NyZOHPE6o9kHykN4sKRBORF3z1wx_QBVn6DKOREfd96asr4laF7C5P5bhZHKMasIiqHfe7wRnM8oTPoSVEHeHfqOpgKDdScVi0tOLhgkAwOjc9bXGi3iGe0ADnAgtyKVpjw3hHf_PRNrY52krOOdesq0cibtwxZPoV8PIFLnsKeRyVjhYVC6hiXNi1hhc2NzdPpEoOMx3nk1jKUgHjgXbaqg0a9x8Wny6dYDYGMR4B6cNwYQtkBCUlS85i0OHxgtC1WAixoLE9aBpCK499lK1LmGVGjA-dj-P4xp012hRf0bi7Pmb6UZ5sy7q3Vvr2lUSCfofpj1fPFwkKrB1GiAFiZS6nLuG31T7hthxomF4dvSiK0-gkmglRgcbUibKZSBz-WR-kry113sCBSVFS_RYn3N0GAuS-Pxz2Cj7PD6URomluWpUL9CyUEdBOBupLvu8wgeSgp2eP6NBoQM6G6sMda6f-04BesJTa5Jny5gJhfIcMuDqPQFhSbBoC9Z6iSYZYVWYnFTC0uYaSCrk_uO7OCj8Hk5Sa2CAJpec-x8dys9C_I4GQTVKd9TawHXOVqXsEVHFCyB_e94fOoOEOJm_8SzVfbes_YAw_16pKewVzBgoJVXG_yVVvqXhApdeq6i9Nb6cnr8O9MRK1IRd7cQXf2W_mM1ThYEzmMpq_4UCjAnpEdjOVuwiWOhwGJDw1KRkAG31jD5Rv_BWaaY6bNy3NchO0H2UKEfsD_l6nHz2VH8ILGDc_mPgSvBQn6MmzLguehWxuBSq03S6detav09x78iC5hSamug7x999wvpknr-oUDd7TK2Xmr9vBnR-d7hxUK1XgCUFBhKlScVCZEslQdrpsKww-VlOoHkYNQ8xeR2otzUGyLQI4Ykf7vZEmL5xZrSNufo215OttRflJqcS_0S3QoOA23Qs7g7Nw3N1Hcsa63gOeZpqfGJ8nkTdhOrkfkiK6lI_K-z9HuGjVkkczNPkdT939iXrGr6_osdz66KRHHiWLTQ1u4PDswTPLrpEsccQzwYe_w2D3-5JWHWjoOB734cXyMqVmxEOseJ7i2rl0sI6Ryyy51EAMbr-HGgkzFqC3-jPqyVyJoBEORz7ul1MqdMYD26sqqpjKNn3TwA8BHt_VhcZ2feP4SXQPQ49OY1ncFEegUmmVTDBhAx8DihNsWXloONvPT6r7iqMk7qKm1JuDGVq3tmHhbOL8GDQ4SdAmswoNWpjiN1yaxBg0_pM6DzrvphNiQRmFbwE7xjuAiWzr5NorOW2cm89M7-qLtyCPh6Q5sf-0YzTzkwNowioXrjqrztwMFgruaJWKX2oj4U8ctRs2XTJgN6-WrgB78TjfNZoNwf6pyk5TEq6kWugJYLsgpdtkUOWxJNCIjK1KJac360cuOdN2OnY0l6xPMDiic9zE_OTeQ8KJi9BugU6FrfOv8pY5kzDtlQgrlTSCTgyJl_AGlReTsGhi2NhSnySy5HlaXlM9gzqFCVsRC-1SmRrLTwW7UkEUDCzXijx9OFzSeCvphRb5UKoqWve2OC98VdXBRIfKEfDZgCLvSMsbXyrPXglqasDUBFZOC1kntE5czhcDBMB73zCjrLHjrsMZVps2yBL1W2b9Clj1YgApsbb7b2RotK8Ms5X8K3OPLve2qOmGwUhUBskA9nR_ZwDooFaFlwwmYvXmo2QYwUdCH-Qv9B2n4rNIX-EzWzKOB_plIe1RF8pwJvtkvd4I8X2FOcV_Fmt9SV6bg9DAmmURthUzvNm1eCd0R0h2KAyMYJ78uMGyTq-XAIhX8T6vi6gjqG4kyIfWKpQ3CYg5o9SZ0odApHf_X6pFLVansQZAuqYzJdLN4mu7oXkVpwOArHJxia1w4_7nPaejM2wkU3DCGKIp1PU6MSnH4GaU3qlj9vo3DDRJJdTLaodtcNj3UGbTNsc1xMqXBc7Y5M7aEpt2k3ccOD2DDXGOh_p6vom1zrSqMxQnan0YKdPIul-ccXBml7MzbGiKJQfQAk8oWjYpc-Zu96Hpmhrt9lMGkhgN5ne6RnTfX_Dyp5zeyjyQxbwEmjlyGqPrBrYc0HQsnBpwNG1dToMUDSAVJjcfgxT1Sf0YT4RVg0plzYwMsmNT9UmMnoGzULqz2hL9KOZ2P120bxHJ4xGPuokS3PMsk_mGN3uHwGrrdbyy6_W_khtiYopOxh5DoX6FztVhybVI-rej_VLn-iYK1icP_4RJNIAr8c1evXf2-y65KHRYkQpNJ6SLOUWEptLJx8STWYMWn5CkcARWlh44xlad8o2i-byN2ixjeIcGQMn5c1rHc_W0VSj-xUrSgApI-dg062cfdohduHTqyq-6c7Tu8qXBziS2r9mUTdx1tcL435tWskdlPK2EZhnGsxEHjNBgOBAhnqFCtdJavT4JQknRTjMqeOGbym7p7AykO492dKSNrTNWyqM7CBRrkz4KnSz88C_08jP5W0bfKdZMSl2yRlDUV0B6hbgpDFMXetetfkZ-X8qP_NL4ejUlM8J4Okgn9cE9oW7ujPdQGLsXC2rVH06_poOScJ6ARK_5sisL0MR-r3w22DGuSMMaOZyyKNa7trjmFptX23gzDiXRlwK_5JLxxTa6tlqR6-poxl8JInLwWucfHCf7o_UQsbeEP73aOzfUAkZxjDjirXIxgkRjNaLnRNpy-Qh8kYrFQbG8bONEs80f_UZ66bQTj4lEztC_VQ23Gnk-IDNZdfU5MwfhDkLKHwIM_HktahYXNSjnujuYOEqBmCZZGuQSFYDG29JekB1ELIHE4i4ivTsQX3LyPMTcel5nOgj8yhUnsO59oZE8Rp_aR_PjpnS4O2Kh3FK9n8nhXvb60tjsK0C3FQUYmSG1zbWpUktoPedOd2uIAnzWV6rh5cSd-hyEPMkUDJM5vAHn2G582Oi2b4DdgQv9hBIZJK-bsANwyR15ez16q9YOJxxyM1N6AZL3098rI9q1jhvROuQO5le55tOIw3VyW_W6-35O89n_UUEnowF9uUFohoRJExtzgR1hIhrJ0h2aHtyRLj7wcKw5EYqUtyKL53i0LXLiK1-xgx9QR0pU4PMpSQ_JCSpe4ipftrr9FZ2uViAvMSTPOEwv8GYuGVK4Yr_Ma4V-bQkSdyXVfgI1gI1nl4HX1k6hE9KnHK23PJG-PvywsizG0VwNym5DsD4T5Vxj9482G9wz4G6vPxcAClXQW7q_rujipNeTUPm9FbeC2TJo6voy8jFy3Ix9eYkvr9O_DTmqCWCIoc4wDFY3hUJt3biBecl71Xq_H3nG2mTzfzvLZwoT8HH1mfEQ_-HRLmoCwmHT-1AViRdUgODn7M8Mm8mqpi98WEDECZOM_tNeVxuXPK2f1VDDh1LZfXXXPBdQNt9H_mcQwv8LHUZc3LafVeiPFWl-L9Kefw8mWXto8f--x2VT5ZJbi-iuIT89AC_gGlFlR4xHptYuVyeVLBkMw9Xq1qg-jcvf2x08mGBW4iZt7mG6Yz6UZFItEtSmNutM68hVzLcZRMcqkDm9ZDqq5LdTonmh7hbPF2rmkUVvOzvVpuJjnsHxSCSnQB5LQQBF-jjNMNisjvI9EYhhiPxHd2VX4F8a73S_DFr3eNnA4ENhJsnQKb6UwRwEnOPJkhCoqjfxFnoVNRDBgYAb8ebwsktpR8I47bxBwSCZnmO_2EaTqBqNQIzfNM6MFwZGk1Q-NXpegD0rDcZFqx_pKpx9LVBPBWfI-eALoRLspxRDG99eeAqs3wtjbe3yOQHnqt2amYfVBovaehKhODJ-e02zUJ-1VifmnwIvdY57HjtVqHzfRUZSSPHoo5FokmR-jpZ8o2JSnEeE2aTih0yZGfVCesO10NJ1OlImI_Jw-FUF5Ou58R_ygZjhz8kmwvbSGfrH_nyVUnTJsdX6f4FwZ9c5CTf7pHQbM9RyB7r2S0P0qzfQA4EM6gQpMePTByLXO6Z6Rl_Vn0wZfKvH_ug5zNQatU0HIKqmdkNSmVh0PqYjbyZz52Hkr-ods4GF1_YalVigOlaelTEKoQJoC-ozREEbZtvEm58ty4yOMtqmZDElWab6IAsBKo2OtTRgLqGzWqfJjgPG-SDoC2BvFAZSKs4V1RRQtpzByBCCOyZCjnmtjKqCXTI5SIoGs9y0i82ZPFqFJUG6tBEEGDtCNdGr1bSPIiXSG83cmqRyUfTQt7uQ02I2R4Wr5VBNYjT9rlsG0J3iEBgdz3_RjsGkpvIGph--4uFR0C9XaB5jBkbz8EXCMT1NXa2hefZV2V8JuOE1Z-7Wgh4qzjVD6qJLwMudBfgDWcItYZ3x0oofZpCi6eWC8WNVgiKIqHBGa_x0v5fXYQ0PRDjIJs6nSTMlt-7Y3wUK2X8eBoWmA1Cq1Of_XOiC19eN3djILKV5lT5Q1rk5ZC1U3rBJakZW4CV6GJZ9kx-tYvHutRyu4tqon9nFnclXC11MTwlC4Yx5257CO6_JcmVW7i4BdpJDPSqfio34CYhUd6clCpoCUxw9UT6MJYOZ0UsbOvWTcBY2_IiOu9RSHmDLMhUmK3mm3D0xB1PEV2rE1RO5ivGUMvwle7IEjroyZ3DCnbC0gNi0LbQ6OTn460qqGPV1vjgW-7ZUQpmcZRaSJmt3Y4w5MKzpnQoGVUZNhSHQHI0GPGzoHqN0K2MbQZnaKN6P5qGANb7gmt7Pz7ucD7ixS_QM7QhJk9eddh4GPy-DGH1GNJJUbvACMmqmw2jVvcSxrqq0zAodZrsV-F-3FTWqA0pG5iM2o1JeqoGKEf2VVGB_m7LzEGqsryIjPynXTAocvduhioo3CAe8ciSnLseqqb69yNlIFP2TbAXSJ_sImAS5oXEQPkH_6zmIucSx-981wQZoqQaKSWd-ttrqdG9mHuGJ0ywZlKtwyFvZg96lc4xugUBoy9Xa2HKd2DKQ8xEmPqY0lMSLFs-VY7Zx1-uBYuVKg_hCRQLHLY7730rjCx9bVaZe1hq29FPEZxHvxVs92Ef0vZDNu4RUOXv9EvYHCyVNhORDRqRJ4KXLIEGYy77ZoOnUtkMDWYDP76XqnPOoApBZeAo81Z7Pr8LoIc4sYc7E8HvRR6SYrpPEqZkSYKoylFW_2Y_Cpu3-0dVe9qJ4Nt6ky-nUZr2q-lldakscWn0dmebSROamnOfQOqQmoGOG7kShAMFvOpGUt3usf2iW1sWxAZOxc1LWpYE5AUeLjOkZGrSo-VbXoZEUzWx29Sp5YBKVk35AsRuqkVGxVQNoglbtHd0NfEP_dKNSi910rfovnRClbLdosBD5Aq3rtEmh_JxyOtTG6rNJbzIvz4OOqgjnTU8k_7Ct-p7aKv6c03TFD31UedSni2pw-zdrAM69alwn68r1BVJJVvPyoHRBKj8em8h-nl3ISXQnJkQtU7nRwMiD_HvdT3hF2Cm1lNsR6VdYRzHfoxbujxUboz8sEQGTEXoH2WiCwq-3BiCX16hGrEdvMJwgbrghVOLqg0KjD17A9y9_x-wCrEliNmMDxw8J45OGfskt0n8PVQnqG_cN84b3OCrzWim_qlEe-iHZCKbNt1raugg_zanWlEgXtRxRomJTrLuCTvm5rx0aUO1bpdMaSb5N9mgM1Q4b_FaqGYVqxH3IYmpPJvpo0VNSfrB0Fp4x8mZdrL1aIN7lvsniArIQVHXsuf25nMTGaAkKkXn54_SQH8mCRtQfEbWSndQ_cBrcziTB7hyiIGGPPmVqscyqjimDaWc2Rbzi30nK4SWXrNGOLldnlXlIA1jBuDH1Q49SR5jabTf39fTwOEdHSTN25a8jM7HlSbDLGCfoFn-tNVqvSSMx07BY3LCVrH4UmO2fNNS3ShV0CtPGA408ITAUQIdL0Tw4CYD-aYgUx_T5fywYEEDgS3VCBliY03BkuNRW1nTafNlhO_A39Bqrq5-1qbkHX_6s8M-GwQwMil0J3qRPNANvsXO50w3o0JuRwhCPY4DKKBOwYdmbnFqaeFydWFOGmTT-6CW4GHENjJarAAmCnX-7GtvdaIUXnkPQgqIUaTkB7OktTmOOU477Kg4UhmIHoZa-s62w1brwrZnR795bJrxz9ed-bhcyv2hflqyXOcQQSn00CL0P0HFHHT9YDwDn_kIj9dD8qKUhMqB0C7TBHXanjxryk-ayZdiZTFFke4AYOmf5QU2l23NXnKuiL7PBNYH78ARxe66VaSsopKjVzuHqJ8aEnf9tTOU50MMtdbQdXp-u-IvTeOSuNGcXpiYbakcbhVflPOYmDs-q7veF5PPAPw0aGRmnydqzM12RJ-PflbZ_6B41R9wOkQ0c5p6ZuuHyMqMjdzXtRZhYbLRfY2SBtDcdoEe24ZAXiJCByVSGwLjM7xhInA3AHUFyCmNLHcIgGusb2ggZnDjDk2gzuHFSdvzqPRovHKnefjOULhNA-K7pQ8ldSfDLCb1Tr0YJMWJhv9Z3uzXajHX17NYuLTqvYd_p3omuGlqQRXDWwjsTzgFw3EBY37ptrMvnV1Gh4zcGPnrMNuMQRb1wyVe2iP9VaLCjwcH79mULWnfrw4I0--LKQiB03ItLHTcj7g3I_qZZOPe-fQNk_qpvX-GDdta2EXaEHAVK0Ucjof8b2h-jJzJDhNlZQc4X4_Tb6tOluH-AORjF03hEV9m2wo8iBJJfJZsfU7lzWPg5PqPigj1sp1JZ5XCd3furY1dVCr825F0LJuHtx5odflQMxeiT4y23O9C3kRO22Ov7Dc9SqKxfjekz2O2woTLrHPmT0D00vdKDiaFDkmnzHPAA0i1sUhx0AOI7ZTO3roCwfC2HQHymxRMgQb9P8OEZS81-uMQPsMqngZAl98ipjksr3gLCOn6jk3ruRWTSVk4RQsGrXsricanV28crrGbDXQdqxZKnxs2BlKSpCe9_e4bkpiiu05kb2wRJe2O9k1sBqUsJv1Sxd2l1GZRchVcQfnj9Xri3HRmrighRnQb_wKO7O1APv5PgUctX5jpMyQa5QAnq-C_RpHB2_n6ldCi3iCUEN4yYXB2sDh3QEmwlC0WzObuWQXGFftQ0jqSm38vzv6qe0O8Y6oclgP2KLyZ-DjY0loqNFvTRhedA3wokxWxzMTE8lqZR9m_u1ZA65t5VmnfEyWRBzFZqxAAkM9tE6Zm5ufr_4FPEW0f-CZENG1nLgszG47mT6hcIYS6QOqwz1mCk1AxOy1HOtcm4r5Gi6VJuFAmYvFIZbuMmQOpIruiS1J-W6qOOM9Ape0x3h8Ww7cS43SCqRTDvWJ3CcudUStkE8qBsqIlq42BPWWr6d2b4Iy6J9MIbKEBeoVOoH41rLR2LLrV4fxDYcrcLueu_EgCZPPB5z9eskk9oEEZk7V9zWstdiDyZjODdezyTpzdxV6i8nzdkKRw9ppXOgObY3mpic2zQwchsUD2IkBlHg42_tSmH_NzUQiKPST5g76g2MeLggodDV-FeKqH0b2_rGW0xJGamQ-lW1ZwYG357tzbo28fsPfdu1-f8-UpKctq_uDIWbYWbCy3yTO7Lw88X6cEBY3QRLMbl-dF6jzIHiYDi6oSto2Yu0AGCwpY48xLUa5yUuwiHryKfVoy_ShFmVW04HEvBVexYtrq_vcsVvgQ2-bjfBqUfudTkgw1fE6a1N2bevJNQIIEPlVlA9vUcgE-HGNV1shZ55_yAopxZ_DMJDfuWeBY33Tr1w-dgR2nFyyelgJ58Z1QEObLlnxR_nlZ0M6x-UYNRO0YUAfELD2OZvLW0svQQJC6mBN-3vlP0MID2Hk50LS0FTePBBadYrcoHx4TG0ZxFa3ozwe-9W6z79GeX_ZOJMOH-I-j9l3b4EshGEDT_J7KoXYIo_EOl5Ltrzmj187ZLExvDBcMLIKzlKROT07xVcOfQWk6bZW8FO0MBG0cVcOGvsVg6jAyJKnHY-3_l1Mo8qh9LOcLMwLde1xJr3ZiWzroq99oS_yDT24urUP1tElbstHxkZ493KJNmniHFCqGxke79d2VvuEa92kfFFsBVyVtv6hwut8tMR9yDEFTm4rS_h8c64juVPAcTAHspmQp3wOYPdDbWYxMbWqYLcwzuKTYtL85swe_E8ZASuVcw1NwPCt5RKueLxTsgXnD5kYTIHSMQe5gf5__p0sPnw_NJBgxPH1XQJveCN6N1aFDO72WxneZntS8ibCJqCBZuIv4IMIrqJJNH9C29d5Qi5Boo8rtZU9U1WUivvngE2kticS4FsxCfJbmAewJTIciO9B96auCDqjVOdshsBGGLvbsy5tnKdXtguQUowY_bzTSrVv9X3oy81IK9VksSK2r9PaXvsXr7Bk_9TDr1fSaTrqULstlTeUlGPQsRT9bvgPmoxX5YIu-Om9_JWBzryLCnF-FRurGUzbGNQiVTcNq9hLZImdvKeQkscHWk83wvdclidlUnXFeGVTjd8PgNVU8onWnGQn0gWUX3D1saO2YAi70vzty8rLMOrti7KUa47LqhlB5cjDmlK4n9E03lLP2jxiUU9KQ9tmoGSYxf2knyrtsFSZbxrtCO_jc7gW8W5QdAGEev6OSxCenxpz3XbTq_qeoBwELfIc8Gly7mN5nLmjOnjPwPi6Hp4HZ8dS70Z1NE5DtbDZZS6TQ1fgUlnp4rSxwINJ3W3-OBoAwOJW4AqC6xOAhNwDLaiFwkM2VDvCtMisySl2nxNm4uLhNlyixJwGWFNO-AEx36iLQX5cZfMFqPC7yPKeXq6eyTjkL7oCNj3o1O10m2UL6dL5GE3zqNA5a4ThCE1Qwm9YpAw9QxZDM9LxU_Pjd5JqdXdmrVggW-etl8EMKq95zh6Ug33vGCdj1g4Wqd27ReUl6V634LsO_gR4JpWZtUsBcIuNYAhRB8JImJHkqmNfdIFDKiT6ip_HP8GnqVho2eq2hNLDjizaULMhrPqqmZIIzTN6G3Yzfe8g_EWLdkkI_N1EXQ6f2SjcuB5rEI0S3I-R___EO4vEf84LklIL2Lnrffkwcxu9qTwBypTbpXX8DFJ7X6oDo9l9j2SYmm_AXEXI_z2ILczWATWI4KK0lakCGxxiq40KkWQxQw0ftkc8Wa3mkvsssmLqDhyJDjt0N66O3xZqotnnAV02DmeavE__iYOIUm61Zj-RE1r2Ek8gqR1YZS9ygXrIBDdEc8ALV3B0RjiSpTggyClNPj8DHUM7a417N8byOEjOsoLgVmcLdydOMku_kucVE0eFAxSESSh_2czwyfhTzFxA007ByZ5F5rSe98976F3MwX5kXlaRcqJVCejJqyXTMlNqhg8XfHN9hIqM09kv3Qm8vpDSHDtuvEUzHTm08WU3B20qnmwezbEPo-t7h6qAATZ53qDOB9HaTU-pTry7XM4AmFnI9OcLQRSAhzmC1W-D0yU2JS9P_2u1PVMsbqoiy2BWM9atMskEJPE_rVSgqnUigZRFGTyJFSop3s2yj5i_zGdBed3PscZz2txok-2PU_E4xOlxB1sHoK3ldRAY_qZm5nPHJdpzjijZrl254o1MqkXelP8O1LB0DiTYfW_aWewxOvSJXb9NLaDR7CkqhTWGs1o31j8jzA1BYRlAg1rV73AOaAyNCqMfsSu8W9GRFjzS7wIBodzO9jNNUsD17Nt5Ru9wOC7H4lxpCZrrcgVReeE4uq078RTQ-llfIxyvNmqIUz7xXUTsJUjqGm7lNHtryprTuIjDlYyeEh2SFvdoL190VnzNMb0BfKJRGdYMnKLLnNO7HjT8YBcB3ef2Io0szQVqoYFMCx3w1GjYYP5Cgre-lEV0wVrrfFGB5KSfrcNg35dv-12daVaBtzc94LnSWMQeVxUkctvp6_ABpIDQNV8iq1pQF3AntMxjLZbcTqf2ZvQUvNd___cQbG3i_pFH3XKkW6uxhJq-DSH9L0o1J3A4rrRPMXWPnuviCr0_p3hqWqxAK-EkZSXTDwDFcLoBF03NqNZcr-6CXwwFt2P7IxICPOaWPMuiEehBa3MELw5dbq6x9723alkUL5NyFKO4O-GXLhTWJ37BM7vK4ZbJ2F-XmrV3q8E1Q0Huc_hoYXQjGOzeAL8JqeBO2UdrtqSnu7MtCVkCQFjXSEHZElHUYy6WuPdH8v2tq3LHOdmdR9Pmw53DS_cspv0Q3IjOccO9AhDWGd5Ifkcx7eds-g-qpOxM67TQJnAp9c1e7pIIdnp6ip5GEqPkP0k-O8whDW7XPguotqSV5n89_0TeiQjLZgVBLJq9TJb8PT_g0lZWeQMMxaNUrk9k90sgvmBSphuAXdYNMFp28lQ3x9vrxGprj5mc8qThIt7casnvkE7jIUMdRunBIGwGl0Qp01GIs4IiAsSKWFJL2ZnuewNuY5yLbDQDPZ1rfpIIJABVF4hjBuwyRhWd4qYNov9xEEM-8aNSQJ4vgycBoU8nQTlOGG5higO-NxXRqFO-Dl5N1Jm35PLoOIDTPJmKtSBxEcEuAs-5pNTopU3eU1hlTjVvFwNT6i54mgSUNtRZ_OK_C_I7O0JqryqzIS5dQNF6Ewzy0oDjtUG8Q8AqCkKQ7oLmArkdYIeP-uWjuupBQ1zXmcIVvB198MlkR0wbOzZxCVaLp8z4SrBA4oMPsariVARQ4Z-Q1TELS9yTn5KLcdWSsIR0Yv2bCne3TsspyP5Q3e4Qgper9URpzxT2l-wHvzOHWCFhcJ3yUFjSL7nelF-YqciBEkJePVNNc49mufG5zO7mRGqR-7j31PFTQsNXjAe9cEqkI_diCbXAp0hjLLA_hgxH7k6a0eHe0YjcbAWHIBNOZ5DNVQs0hbpe7qiQxANnV5kRPaGYjpbyPF68rJ7iHRmKr_N2xri0kMJ8uSBBhHFQ1pA6VQZPOZkKYxoc0P9QJXA5xSDrTMJKWGl-NkQDXaAPx84JsXTifcKVucb4_IGuoot3PsVrXNXu68psKMbeiDrkfCqQbpkYBX5AFjp_K7GuKB_9ce1FLGXFrawXapylZA_X2gKYTyjTEIgyEDCLHpwhrzfvBy-c_IictLvwUoCnEqx2lPaLdiF2P0Y5F60OheP5F9ii7K0RhpaJIb1oYhhhT4f8ygcJZIiRDPbIo-Yl45rlSbaaRdWZGBzQL5Z2l0QecwilsJJg6BSKtuLZe6_M9XIStt188ogoOazHXNFF3mY31hAwHCVSRh4bU2NW1pc9HBtP0micTVndfnjL9nJZyxdHJCBFzYwpC42gWWwRv2ryaH-aUtfN8By9mUc5UNM2LopEUY0ShsFkFXFA5NLA9aIS9GW2CIPDItKOMKt-2nliDA7EHFhydZoAhQ4eG-m7v2sCBCITdlkJ0DZ9Njpv9hhqL2cF1yZTEsbx51LQxFelraOZSqmf4gw_b970oUUw-wRRXbCj4jp8BeoyIPNrLaQR2msgjY9UO3VqYFCBFfp8TIuBV3hnmTzEShxjtFa8q8P37U7XkOTSNWNWFj1g9NOOnh_QZ28mVCtW5DxtbF74D4W21ddf5RCFnS7Tw0F5YuDtnKQBVVQjjs4Pvw7JOMIz_Wo6z3EnV589m0sGPrQKZGYCosjvxZC7v3w7tiBdezN-jZznApkwu3A8LXNDllFfwr9fjOU0cyXQqAZlF_Ti_JZvzJYaRzZyeCI0Clxyj9j_pCwAngWqhTvT4IJTfNNk01A8MuCghK4HFV3p4JBUFkxt23unECelo5Id5MnFB7i_uYJ1yHyVtYUqslNxKLAB0QW1xvUrINyiOlV4IRVYXbXB_mgTHH29CHea7mjzF4qeFItsWy55yHKKcLUgikiAo28QQB9mfK2J-RaqLYLppgrT1AIttcyeAswY-zZkXR57m6Iwv7wmd5gaUuV0HVqSJ_99wfAz6PUZ2fhMkBZMQrntZ7K2675ENVX6zn6K-_ckXSAT9gbVAyTFqNaxNL7BGYfMf5mjx12Z1LTZpuVzH_CCc6dd9qSZDpvk0nQGflgocaBWRANnHrVEYnHlIx7CszR8xI9YdoA68hAvtUqypxa1GObQSAXbPURvCydHid5zkDp4qshm7m93GQ89_nzPos3HcHk_UgdAeHe-I9gFNS-F0TzWmjPqKCEnpflzi4zRWmYltVuaEWHtoTMDY3-ZLnpMfJfOVirNkfRERmC5XHO3aX18ZFxXW8ntPvv9NsnxjuHxcKlQRQqsjaKk7Unz7YWahANmAgDGxOuQozqVzV8qZdC3KGFagNk5qnyXrxweHGA7LjdfIaG41BCMpwmvhvtw2J_V2aGgr4P8OMYjwWmVzL7F4ldROC7hjCGqMS4JfPjTZ19kzQOs3Nk8z17Bx6Z8LHQuiuVCrLfTpW6F4ZPQHt5ydrkZwnqlNQJ-Y_LPauPmHqZ4ZLyYQK27o-07sqblWP9rXY9vcwjdtFv_f9cXi1YzeCr2hWAQ9DSBLGpTIn4EKtTaYMiOWQKJGjx8iQu6_YUTH99qen_tfrCfQqOeRHIhzQwCR29qQbIed8vhp-vMXIfakWXvxCejZGyoRrnI8rcsw09jALRh3BaUCx0iWKODnRBTgpz4YH0taGRn9_BQz6rQg-ySgq1LtaaNWZXpxrHmdpU8tlrKoMK9kDy4rUwf_O0Ibz6dvXCZvyOCzTPat2oBwxhbUdwm_E2oy74Njwkz_uGiBwFQ398g5ns_isl8btVBKEre8PTKUSDg104oQb2EVn0-BcFXLzbh58QPlZfpd3Q4COrE4KKiwGd6Bqh4RI1Cut7Ix5gK4vM77dOmDDLkgjuPXpYsiGnbjuyikTbmhCAkHU-nuFtBzdfqF7JUBnfnUifjtgBs9H-jlPVNatYUONa469b532sV_94b82CBdL9t1X7lXp1N9Wp30NwhKz_Qa3bhgWOK7T-AROaA2en2H2RBPp0klSTRTSMecrPbCYvJxNhmTUwEIDZUldrOeOLJ_WbG0FA8BVy2yHVz4FEAUrfeuMdYAvNx6bP9573i_jKt4bDt3IYUjFtVxjoaxAIcS2VqeINUEpfkdZSOxe3OqbJmEIla8XIeHYVqZe84GY7dxY7oUhEL-vq_MdJp0NCvYWX6VGZSgIhvEPfob8s-uIgK-9r8ar9oJq0uBzhlWKfsRHTbhosW4nRph0_iWFzuU3GZhW6xuhAxW0lGCPeAcswLNus_Gy-LX9qHP98df_EmvYVI1tc1MvZeFR1RHws5n9K5MhRuWC_5p33y2n_OJF7QWs2O6ZLJ95jtr3q4_sbU8UozcjgmDcDHDrQ-bW79P0Nb9Z0RFZ9SOHxlrMh6IhvebTdLqp9imUUYw5USFIGGpSZB00OMKw2kwyTrbXm8FZ-c69L6XLFHvvv61SBGZ-9-skI8-E-0aor-jhDbBDcsnmXyYkjCoSNvE_SFIETPmYugAGNjXb7XRXQEkkvO-3q7i8AcU5ZgHnTVbD5swUM_RrgeNJscmgXuA1jjc1U3EolXiArEYCzlJMU24fpNqtTQe50T3Qy8NkQPdgXetKI82Sha9CjDGRfwD-CJD5Eo895T5VO_lqMtQjbSX9518IhAFfa988Mb8OugV36yJq6Vs7hsqj0XAw8Ru_bYa5sCKpS2a9r-A04m7H41MZzOw6SzBLd1AVUfVm4MYCOq1mbX-Njfxe7_B53UWqTt1dkO2nMuBfemCWBG6GSJTdMzI5oqSmE4OtS-8qYHr3z-LiCNUZdIwTjIu5pgKW6kdq3guuM5oNP2CkyTe4GTGOiDI7PamGkUAFTQvUn7O04h41F_JUdaKkaZa9rtg0Cinp9z3mV7A26wkJ3NCijk921NGK65lsnOGI53UhFqd90U3Ahe5heV3uQUYGgr_gV7bRb2gG-nyyz08TJ70DON8a1Hy6N59RBNXwEbPxcspX5d6CRQaYzY-1EM7gMyG_tNiYEze3EPSqHOaDQZm-lbA3gQpVbsN6Fvi_D0JCAQqpDaPEanriW0nHgVQepcb3MfHwUfX2_FE5mFpAoDnwmteH9sGunygC6vVbJuYyp8IyBNsfQR87mdonwe8M_VENZpU0AutncIY0_e57qoNwzZuHAZCqCPv_s2FWDnKbTdtnUzra0vvGzGNVotKq1QCcRwNAE0256WuEnwdzzTRXGARUEXmx3eYXAo5_KrWyrr493mN5ivNohDAO1K9sR5VLC0mEf68pXQZse--FVw_hEfc8hcWG3FAYvrwoWP2FiOQJaxOpAZANwEI8_bhTPR2338fkJIB7W76XewbnG7Ux_8AVMaSh_oylhpHpPlgHqzZgBnvoaLNtNdWFwS5Zio1dte0YheawddN4Y__0HqILP8tL1KptohhGgiXmhRURfx8DPsRmZZlSUiIFbkDwafZA-0upSMPCQWjOWCQFrrNo86xxLJtEoly3MRIO_0xIo8uqZ3PI6QrQHg7qkyVOflGmg6w_RSxd8z1170RRDtfErcx7ugNCv-e-eHWFeCvz9jE4Pa5To2U5v0-B6JsGsxxzW0ceRzoy-AtWm9WcfH86FrHrDsMM_YB6OOXtKoL2cbKg45yTMsXKxoxhf6MSlO7RIAfze6BEN1oAfiYHp9QVHYRUXNQWh4xbv3GoyzZe_fWiTBVIms6oIq-zpQXROredp9EbC7uCGK8q-jeuYnYtsk_mhXPFNabiAMNoWo881V3g6nFwRcvluXFpm0xYRz7K_8x6G4nUFgFW6zs7lbRW1u7W1IA-CWzI3kMG8PWeqikbbqXWMu7-GtHSTqe3-P_eIhnv1vUZegextdPSmY0fyx3ywj6wbdLW5Me8jB1eroOvtbbsxrx7z12sntKWiKq42cxm1rohRzLiWcmD2R-CRJqK4kgUxeEx6Okq1obb6Nh9rzp50CQk1EB1lspaF_5X3s6SkEOnoAc_I9njhZPf3GsoM796kWBmuJK6nkYSMZ1nNilnAqhY5MW6RSp5ivVmAroaU2dpCX1D08OR9Qh_o_mc-fH82s0kj3Jw8dcHjEnOrbMgnKcDCr59Pm61SzS7y7tu396DJPsHdeJzw6F0FsPBCw3BRAb-qN15G_Vu7sR0wuaRj1HD8LbCj17oKICTlYLf2mduhO1Pvl87IuPZkaXeCRnk4j8jK_2j3PGDQ8Kr5iNPDkrlXdU7Xlw28K8gAbSnXw-kahnid_-oWzfkcSWB53vmPoI6n9bFJgssASNO-ivXmECKoQ9Ml-vZOHY5AhH_qPklPv8dywV5jJAkquWcPeZOrtwgDPl-WhD-6DEi4uESPrG6q3gCmVP8_882gZga1f1UxlTKfyzx4tqlAnXIAvEWK7qOIDXq8NBnJONpc7xOuYKWdjbtBWh4sWDOGssCyhNXrHb7RwGU2ivzkzqwquPjdb2eFHCMjUyFtNjeoYZbGkg17zLyxI4WMe97WQp5jgllCUo4_CGZJ0bBIxC35nhSmDe5epvY2xs34a7APkQrRCZGzSFAKzTgFbIiu0sEquK30j_ecUX8YOmcq_pb4Yy0KDClhBb8jPqbf3sqGz2vNN3-c0LICSDQ8aB-EoNzQ7_LY1lMo5Q9SYrhSy_zeal2thUowGqhAtzHGUcKh-XDIcNAt13qrsMfC6eY_NGkGum2EkW3VBhflX70jPQXIr_l7sVGRrJoUl71fUFOE5x2BvVUgXUgOAW_Psl9oT8LrO4c-pr0DLoECqDqR3v6w27GBDigfx9ZPBCqFrxd2SnqdsqL-3Pbth6Syg-dRJGLksfpu3ETFOGwXl1x7lglM3D3Y7QP-wBmY8dy4HyFOuav4tLMRENRy_GbPM11L4fgivvOt_NpZhP7fupkNlr5SUWbRP-noNtxq04OdswvocNfpHUFU6csZgUmzljKn3hGJQfxCJ37tkivR4rGQy9MVbVpTo9P6LTsHLBZei8D8PjU-w5S9BvNp1PsFuDpYU_jjkOwwFwZJ7qMdh4jdGFhyzeeFkISC4yuE3f-UvCt-ugbSwJS3KP_A6fyG-gqZqhXkrak06c2NjZeoapaPEzZ6qZlqR7-jmk9e9g3gMQu2x2us4u5zIwvKrEzU3tSAXq48DcYBZKpCh06whjBVyCLPeuly-tPLfj6Ur1JFZSXlbyTdmPntvWhDv5OW_WtjL5lARdjJWyckGnGAprCvmsy-QiFesWtNviyFQM0igKs8TCH4onh769RReaNrcJqTqnn4uLMH7veHoBCKhx1np4iJcAR8FpMaw_gQq2p46ZQltEdO0AnyFFaCZ2QcyLfl2B1KsGznM3n1mHtI6F9nKSyLjGalZ0QT8MMRtRm2WGuQXXzQJiBfqCmz1fQ-uzeAC1znoQ24zCiQYXVJhLiavsik-7Q3ep_-JFcKQWxiM4NwSn0R1llStLCHwjtcUZe4YV8czg2PUUpooCeflIsrWhPxFfnyEM-7R3xrYPvfxmAsirdScAg0vZKGOJJBcYbMEARhzw_NuVRKIzmU9mlcOAPvHfyE0grZvBqEPoRqd6OWLicQGFH329Wl4nNQ1X0VP_RnOLLwydRf4N_VeRFMdsiAGr5bwot7gy7fCp3NxkrARId9npWAQKWkhEL7l7YBczDHTAVtr5yaiPsA1sbbq1HOKkeOsDCT3s3mMaCntiw0q55eZ5XZTq9Kk8GP9-XwTW-gP2CYM8j6cVxoD3x033mR9mkxpjw7I6Ij2s0qCC6XfOVAO28MmaTGbnLuMKoyHKJcQnEcs4Rh5iAuVI3QRQbdJ6AI8XAxveR1rOg7keUpI2s48tvff0GuJiReqYhH8LiAb64UN0RRPr_dhIkyKy0Kd894TQBsecmjEbEtS57xVkcUQD46YjKscV2Qav-xSO3jlPAHkTwUYgjH9HmToXdEI-9MP-v4Ma3aTPNVKQNvSSAhW9lDnDVgtcGetwID-S4_VYdAuVVL0lEn7JxlfuQSyUa4ClXXNoJnd-gp6x0dFVvoCC3JaIOwmKdodIzfzsfdbiBrWo-arJbD9XwbzbEio0gorhAi0KUdmn4t9NQj_A55sltmXHM2edT0xCbT72tLY1K6tWgGaA_Oo83utL-_UxJVFqCFbqpvT99FWJS8M9Kxm8S8IPZ7NwVM11O_5aziCC13CXT_rZaXfABeaCaKi8Pc-UcN_5rciWAY9AclqPdIPMznXvvUQ4G7WshoCyefi8D8zPrSwVg-88FQCXSmSJce7LfaZ3hQi7Ds6RDkKebwkN_GbqRMM2L7YoADpBKpGTRY6VVihzLsflwb3J00S2qMwnXX4k99tNc5oASYyeNQfhxrUkiBRNGsjZUDG1FcY9yQSp2sHn41ceNT4oLfmTnKwGbi9r4Mzl1BMYYzx_LwoqL4oCNd6VV0aWPEQ7WxULaVxmbq0jrl3JHLQ95ehtJAXAHT4ofDmkW23uXoWoxuJFJKTuU7FbQwtMDniSPlykQrWXLvSJng8QesmbtBiGH_DSc_qpO84v_uwTjKPEUoGnqlnwJTBUj0J4kt8UOAX6Pu72m1GmwcVJs575pvo6eCUFZ8-fbI1TLqbCxvn7PfQGBl-5-cfm829WIpqN-KhLHbV7AJROT_vBTgPC9AG4F0rthuWDCtxHLBZJh9rXZWFBWx9sNFQm9DPjj53yL7fF0m-liHU1gzeVtcau60Mciq_RIn-yDIYkMUJ_Df5ohLZgIVR0EY9aByi-5ohIR98v0vcU0qa7j-riRxNZWhCZMmQZQKnt0uZcL--gI9Cur5h2OrpeTBQV7hZQRhj0KlXZIY30F2acEc0vYxg42BIwo4TqyusLdmNhHl39PAbzdZgZcRnu7UMnhSiYCt8lA2UE5h2uxukMl8qTpJBoDAgwjlSEAre-2yvn8gCIFwcemdfCqJWsTF5AH_SHi426PAr4Mu-k3fYPGIr-Qr07_8Dab9gx78kPIvHOMJGikppJHUWyPkR-lBLHqVkIDgMBk9soVPIQU5GAUVGtndvTlRzNQ0McqQJ1NVoQ5-5Ypavg2vYB_Qi6hSrQsan6fV3QA62tNl8vC9NOWA2r93XPoY567UKk1MKzFCyq7M7lp1ENHsT5TgeUNco5mbjGQLpSwpHurPHKSbw4Y6xxHhnuTQ_d40P7TJziArIyZ1aF8nI-mlNFeZjikpcZ8u3CrxxGOFuC6bpUByE8fjlERDZfvC4JeHBT0gk5jzY3IeNj9S2JYJeOhzqUJM3uR6FGt4s1R7UqdYLQx9Ev3uWrGiPRJL23IeZ5HzPqnYMlbARMgCT5E_FvP1nUVHwW-OoXJ3ZhoRbJPBErfarGU8j0wHnKJsmcn-B4fVAnMIp7ODYjOE7HeRTwvp20heKSy96MzyAaZPpmSpxwZDL-mmCfkTnrticwnDwkpDRN6MkawtCN_37JbNcusEk6uKs9AtYzY8p3Y5IPPG-fCMYU4i3b2kJKS-tS6Bnhfa6Fv3F2nUVDZ8FYMEtFhL0mRYBxC_6CfpbKqo-6JZqLZ6_i76_td0z41iue0fkSGX_fCYoJg8QZDLeaOnY_5TsDr_uG5XREgeBGAcl2MHJLzzmSMOamw6UX-FgdqkDG8hfjHqGdS3nIaHmrs2j1J3KVhz2OlytQXef0VhVlyinrppprBW8KHeN1rhZGLux1Emz2rU5MuYzCu8og9mD3Au7ZL2QW9pnpIage-UsaNBPFCs7VReqt-rQgdtSjx1xEmyUQWlJCYiajAwgdfjA6Oar06Rr89V1NN5_cYPcwByMcNaNqSqV4oLvi4iFNY2WKs9t1BL0xY5ht8rxt7aSswLY5HCTk3VzgLg45rIyM5j-yHwzScH9Ir-8YoBCK4OTWBo40ucC2fE7pIN4oBIunBkmKULfl5wGe8VIFDUra1upan7t7YajfPmDjoHQ6VDUnJV71svjQsFf4mF31QE4g0bfG7A1LJUK2wRHBL8glxvCVUzwm1XqMuAlYi1fOnLOdELSpMMamc4kjKri5cGBr1qp84XzKQ2EzS0pPxs5vN5sWifATRH9cj2T8mGflRjYqyPRre9GHW9ADg1YzvHsASzRfQt-Eb_1btSBxyviOBU6y5eDyPLgiBlrn_jqMQR0GAG4Gv49WlV8EnED97XcNyiNY6KMVCKzQ3iYwY8Rvc5i4khiYIVVlvEqd__Rai2MSWNqdsCcnQ4csm2-kUqnM8ped9lPzPPffiVyVKfwGRG9fLkcdL7XzG5AKBvMGJ1R160DM1pbunHIAJoW80F3L-pt1dDEJWbhDpgtqqgd63vPG-S6NQWpmiTYHIGzdQ-QQaSfHrMk70MJtj9RkhDsSIqX_v2xUcMtHBRJSDrfgzri3Ihjd0mdz2k86L555HU33YGpTOqdz0MNKpLMY1X9NVSL_mi19O7AAaReMvq9M7XCSUZB3-Pk6yY-6yivNxZ3_e8zjHPl6JAnNuw9maf6_O2jDgPn5-kgoyyd6VMLdexXIzN9Sbz9Wt7XWjXtskm1bgSQSYfEtoIlNoH86tx4W7cLEnHStcj7-kBv3yAx6Zz7fMaTFssAaWAxVHfDEF_s34rjod6p2whm2XIldW3-ga895tTNrn3Nn0W9hEjySD4Iudzfeg39jlTvvxAKCZdXFRu7FaTuKivBZ1zK_Vr11l8Vw-gu9lhwXDmT0sZRCfo3GuWxrMXsUSd_uo7k7Z-F1vzr_hsYTtUF8UAr1LIDVry124xSCZaFC3Fk_WYYxV_0VQPOhMxqxNoG2ck7c7gC4Qe4rbeUf74ln4u7dQRaIR6JOsYxnN0uqNS3CWNoxTcX7EJmIpZkUFntkIqvqi9jdmSCkt4nb-mR2QmipJaSS96T0cHRShPlIN4vmr8u8_GOjKl82pBTOqWvjBukzNk7WtZaGfgxAk1-dMIg4sOMWyUyAqBIknlTDHS9OssOtuaxcY7iCRo_g3TKITSYpDeaWsl88KS5NW0V6GUEzqhBC0bEAZeY1XjkCdb6zsjQ9et9YXVm0bLNNDJcKX9Di46ga-gdk9bmtdQzV6a5kZHCx7TqOZc8vknDKk7AGhHWJlMS3l5ag7tMOw4x2n3wDPd3b76uDxzji-3R74lDMCVZ7beIsymhEl80O1gBJV4so7nJIR2uBAqKKGmLnaFv5EGJ5KSspuvYwkAu3IsF9ov-h9590-qVaDpXGDTKpOnq0ZPqmqvhXv3h3FiKrVhtD19iLOyJp4U9mEPZfKcmtdr9pKAve1Bg-U1RLqKpLZu7yDM95BPgcNJ1HReCA72Ca-5RgyPtUch1LhAAJJvO0iZli6nYG9t0KSqsOg15XzIIow7ZplT0YBjsDADcMhLkbU254EeSmjiO_QISlwW0-meTjdvjO3sUSJyW0szGga6FE-_vkbyCzCpYyjKcIzJ1G9djwgeETeFoUBP4rP4MSQE-4yBvE_X8topmcQhRRNe29reSLubtEs0-s4lHIqqZe8mTmw5Jj7VSKooQip_MAe4IubTJuWzS92kgg0eYDWqUZHTtE5uNlfw16lxyTIiiis2z3rS-0k_v4eMbq2QduIsq0NB0tNMWvrGxArOw7YHTelVYdPwV2lTfwD1piBHP-bIJkyeleED05JndS2XYxP3f2XTfdogaeucmoc4alfm57CPIVcRIfADm50EcW7xWDyeMxBVdijDo1HxnxARFnKSciWztGvTsvAmYrhrMRHQ0wOirYOvz79Mep8XVnQc5IfEKWwChFi-t4eIhrV_-o_1PNQESRv329MOKdnku_t5yzKa8vk7u11cqobtlz9H1PJJck2NIlrOkgpvZuDnQee8XWgRpc9zTACS5z1vLPHTM3JQaLkKBNTc2Y3g3UFbNQAVjTA_bLqLAi2PXGworueIsxkJOJIjcsyk1D3FVsbVqPGVDoqIvtMB8GAXs075putSeul9G3MRNL_L_Q0407xnME9eMtPNXxzDaWES0QvyTXd7-q5euwfZVtnjMP_O_DAUIJI6LFhPRvHy0lkRUiu72Z6-fbhe7rctbq0ncUBTO9cV2x3qs79SOrscEGqY9twIYc4vjbwmJEwlCcNaCRw0_QakevAOPsG5XZJmXETvIHhp2JqOoi_shuFTxB9faVv3u1LibHaUWWEoXOVonX-_AEHjh3fv1tDDh1ihdj4UkYkcO1mPGstSQG_qkunTsh_Emaq4pxXAz_BXw5uZ_jptxiZkuG9XVJ7jCF8ot_P2_APo1aTL06hq1hyw8pua3_1g2cgIX6A6QSwX53r9Cxf58doFJIjHckWXxUtsAR2jcMW5R1L57xqC8XEH06oEScMjGLnnmLCuitd2OZsBeMFpcKiuzAW9bXpCTsQy8ad7tszNa6nquxUeqOdhTAmJxtS3_drPq3kpT2t1zTKCE1ibotxO_bAX1V4w46tYJ1i5kdEZ-dOpiuu0Q6Hj53Wa6g_VYPc2ERZTo5Q2Mcjf6_hjb7uoh1pDgtE71gxS7Rs5rZ4OOfIfdBAExCsD0dYp8LOuKWYo64eNaDLgc9i1NzoQ00jNcJd36S9SjAxQBWTtVHPzddVZMu8370tXrPH8xe7fQ0yQlT2-WDrZJJvm2EduU4naCeTE7J1ihI5815TDgAkpxLYvdUrYhyT67PKH7QZH0tTcT38MtItJgMNMwCVZdenuBLDqgTbd5i_OJz_uePsCs6Caw3Fc9d4bE71UYXw6bwHOvKmY6_ERryVnBp4vtYKrhe2ryO24DWLTKs8xF3Pt0Sk80dE4YNI1oD8ueoTH4Sv7Cpvq7QWsb4Xcqlmf84d10u4awbvUogacvPgGcfuOnH7VSY7CL2Icj9Ob0kqu4EisQkOeItyx5fdW41Wq0HN6TBUjdg210qyfTDX9gGdZ0Yk32qgnwEKP9UM74GeV2tnW3_vExC3nDGlKsbVE3vZezkh8MZqTV3TmOGjAK7Vf1lSCcwTZMzRv6D1qpFkspPWyH5RytB82kQWskziaqMpSOcyIhVzO2U5c_c4L92nLDnRMwAjyxRK78uXjZmWIzFzR_CPRuAqQv9Lyo8SiSNiB4rlAjXY7vB9ZtLlvEYCXHslHSOd-QG7mdow1Wwpe_RuGNCWV2imJtbEIPOlgZaFbRlX-z9sCzVgXlHwtGMwHlLfheysa7ahsGRW1bUCZolZFV8kBI4OWsixjGnklSyAvFbPKhs7yKBx3Eg87SFOmHsfG-n7iczuquqhDUmrT9zTvquEYx36bFDXcWiINnUAws0TXdUR-fiGKNzNOo3VhD_Zlqk3xQI0MplAXB1I9BY63EsWvBv7NxKVRBN7-tNw2D6uWzxiqvUGzo8A-qyo0W52TSnKp95YkZMYvXeczpDLhkYDUlZjM2hSjxHqoTBF8kWimX0pyP_EgDwoyk_B2aLJAsOcAFggQBTosGNRFOoiYJ5RPgbkYMGV-0lC2qWpNoXbzxIBRBDMIXGBypcPLWSjJ99VymYDaUYMC9Zu2ScgGyMIAWMltEi4PywqiFYxUUtTAXN9U1XPcKjRP__NLRjDlOPuYNLTfaiGqbhAiFVF6qjd_4bgZO_uu2erAZuma9Wpq9BFCB8OxAWbUB4Qx4ZvYds9VKVCs4uIoxJh0rIg8X7hLvJyu0CPwHG8kYtT6lR4RC6hUdqY6rFd61F1EIRwXzy3BBVTtkpLCD_MEfXyYQqE5sJD5v1g35P2cJgkvcAKACccpS1zjmL7tJcqMHd9mbx4rwFcCLVVi859F1mcouxm_430xAzMBXrjMcz5LUi0iTEkeNKVu1Kgv4rvheKM3nromySop6iAlKs7Di1kutAfpnJM0f4ag3KAl8lKJMeG5B5HR8HVPYFJFSaotEJX7a-97v62D0hKYDAWdnHZHyveN8e-koQHI8Smp4cOdNQzpdcfIKa9a-nBSnybZA1ElkoaI9qaAbh6MKTRXXAjAxqa_3SjfAL1KgZ7cjm8AGLRvLMjiQc1bxykV0pH6jRsASYqy5nPEU2muVNGYRwk4fSa8bQkHTzTZm4zHMML__W-TEH5XnkVTH2o_a6_snHcH2wmtc47Ike4HU2DpGHxwGNDNosbr2tyJ4M8LVWSA9jPiwPTe1iNWQPPr8VWaltZT7nByjQqYppHido9GLXOGDzqXxQjavZ3K0r1D79332bKpx1WhVgRTDkiVXQodp7-uo1yrqck54e5BwopRYiHmtaClWl5MBbOSBBCaAqIyO1U-J_yL6LB9mL7_dnAvOEBtMTiFEJNo7vzWtMU7125Is4wMZeLhsgDCIBSbLVCfsMlr6SWzsqoCyVn0_CJb8NEBxvFCZAzjgvDuZ7K41SAafxwkAh1MLQ-Kmdm14BlgZtqVUz_2fE4c3Ca4AY6DaIruUy9NX-Ac2EwTRBQdhhgrZe-4sPsH1Fl5mSkGWoTqJR7Pjeh09uE9cv7k62k2UoJs0EgJiuD3OiJ8FeObkOB_zZD2B0FeZLsXQJgvR_6yfgbCHxFOMj5qD7IIw3z-J0cgoJvgzms3ZCraJ62-r9hFet8o-olWtbOaHdwGCy77SwW4AmaUbtji1Sw7869hN_tRuSqaXA0voDTSnD58uQEjuex0_OqsYnyEWYoKoddPMC5uvPpYzG-BievEV7C3Zbmh8qaZmKOS52nONhUZUFIYbfuXtUYkccKF6YuWYBD8miuFNrg-IHj3wM6A8hqscD5r9tHY2-ePZk6U9tutoj91unwyJr5o8O9IaPY2JPTFde7NBw3tLkot8FFv6uQpmpEmOE8xHi-6Gu6WbMVwgT0ArGLTQj1j6Eeh4fLbYM-uwaBdP4oRr4vaOvFZGmUJcJLqNJGewUZw6TENOLYskrjJ_fOvgt1sGYGCrcpz5IFPvUGJ97pxwOFsbRip7j8W0gOWAgZZo-tYkjKtmiBoqYT5Lp9wob6zZdV7oE3C3V9ZgdEzsJJ9xseL4e61QMSqoBtzZn8w3G2UedsWj3iOjLFpZ4p8YbMgU1JP2luRVkLtaHG_EBP1hXTVV3FW9-X96uzJy00d1jNARy1RO4_iiSHoVNPFEmYJ6huUrwrfIWivyH9sKkW63a9nCOsCjHRbLSVkcN0xTDCRyUMo_BkwrDYkqDxtFFrlGHfpe1E7R6iGMSZIDY3d0R1AoFresOmNgMrlPxQZ-W1UgCdeOZpKHFEMYcfL6NnDYsWlDfz_M_O_abJE_lad6foPwfLRdl2cUKnnIyYkYhYgRyAr4mCQulX96_qIMjY619bL9ttltbPJHmiqRHFmV5xI6IvFhd9gYAKfvXojYLPQU1hPaEreifZQSuILtZqcbTmNhInUxJ1mYUVDSTrlIpWbzv4oLHdoqOorOSqBVwTgi7NMAsazstiXqZW8UD4YFjagxOFqCKa_OhKy2QtSsTtS8cb1pZCusDW8C2GfpoW5zG5rb-6mwM6KDOpkIEWIU5eJ0Rk3qyyrrzjz2xQgmxq0FeGqdtv1olSldkDOfgJf3b5luDHeLe2L-swr0SxR6wAYthKsbxKIKQx7dcTE7vXX-qKi2No40sW8M7ILyWDclp_jIQVF17z35P0cHcEviQhuqAxiPrKHNXy_6iPYoeo_BMOj42iAumYI6oZ0o1lL5Sydazoop7KL0NDZk6q297a-Fz6_Lsdgl2kJhtw7a5t9osBZ1eoLldWEdOnsFVhjzhDJg6OF5gY7MJVNy8dA90mzzObj-kCaxBq7oB6l8jWtWlBoIxZnDrxx-7Oa9ZFPpEwawKDPXT8gYQpytkpR6tbgy1udjhae0bCwmvt7174GRKA50hGYyFRt0Ia8cdWEL6s5EcpTMC0y9cCWS8xqA2uDpxZ5XkS3PBb-kX2GgB5gpT_u_9mssag4TxzPPcStNhTNdTuvuS2qyyo_XW_c5T3HnljVYtBzuUophNBxm7eF4kMWIqv_IqNgdTnxUWVGtPndnwePUw7Wv9mTLZ4C0jvjwBHorVgaCF6iN8tB1_FF3R66WEGoSB8Eh0mFYvNiwn6-4G-_pYdAQ7gsqF3S9LaX1qaLfdbjJdUTZCFdf5HRyyrje98H_Y08gSOBMwopv6TkT9zPIKu6QT12fkjUOGwxby3qEyyHuVvQ_3XNxxPNXJbMRFoTAEzHpCdoEqKB5e4SZfRyIdpB76ESxC3YAxYir8lNlkx9NfihJlMbqysF1AUzYnMxh7bHqMptWTOnwPeeTy0gglsvhxYDowEwOLyqXqURstMo3QRU_hTPAUsAhv7d9hc8iNtD2x0M4p2u12YS6_zopfYzQkWeCi-RrJszdJ8rzdiuZmpf8q6fppVq-Jk7otOGW9UOeGfNdKZavK7ja1IZdHkxNFezZs9DneECf59zbp3tfpvrkOCuKIJ54UvI2hobVyvxjOI9WMNuw4tCgKs-GeAOzvL69UXGbUwaZ7tewt4U0mtkXfn_0pNMW7zWVdtMl4ysj8FIgX8veXOSUCa8rb0Yj6D-Y4HehP_XUZo44WB9HLCeYr0e4W7XeQAdgq3oGN9C8224HUbnh_BU6Xtign5-Ba7seiM3_lPbCq1YDsrEXguUbBmdDLAeD-bfDdUp1jVyRB1fV4A1kytZM08-9p58gE0Og3aZUdMuKf6b6eTTPRwh61p6N1RJQS9TDCXSAK_5LAd5YsZHQeRBX_nSEROyfqjx6pmm6sMGTSC5CDIx1oH6i9zN2tpABA615U9INZ5YkLbwbRAyaAk6lCVmEcoH4HXXkx4fume53JgVixK_B5JWrx02PcKEftivlxurlcSzZjECvfzWmC1rQeUd8d12A1RKoJrCiwiHDSFrlKKu_f5P_w9IAg_59vilADWRh1wfrA9RlvFhLT3hF1IrC94y0L4PJX6bpKDaN8iVnt1ENuvpI0fPv68Vd6Y7fwklMAfsqaWuW04e2fHeLXE3O097yeNVy9SxWlUn_-1RrHvu-MklLBQTvjrZdSgS4kzfeqHwoyh874-THiRN5zvNjyIE4dcS3LvSMxQczFlat6Z3cC5tsuVlCfEA_-Ob5DZpy448KkiwLy0_I4opiFB-E25xmnJdf6oyFf_JeTHoIO1apSr1-V9LozoEIyEOGk68ZPpwD2fV4ix4jjsQzQMAkDCnEdGFccZlsmYDRsmR7QvWWh3xvbbm9AbTKoiWnNKgtb55wqx3NNZQGcedjK3jywExr3BJq4IDywtI0W1vvP9xdwA5-4s8XhC5dh-GIpCvjcg6_gRHV2gso-PfF9oUGTTgunPHTADf2AO6zpkyxOL_1kvFQC4i_ZwCHjdl3d_ladrgBJ26Q3SVVypho1j9ScV17tjCLOn990HtdpCpM_KzjfRdxJqV6W-9zhsq0y-kYiGrdoDbORIwIR_AT_Pr2OC7hFkZiLJ6W-wunpGPL7S7gdiPzQI8cjbZsL_iMVGMBfSpmPdeDOdH_CvFOY2GW0qPv2MKiEFlNiLjQK7lZGJX02_TCZ37th3sQU2b_hcRgbu2WBeGgD3zxFDJ4IxSeZVEzsly-jnLSX76gZx6cKI9t9v9P555RLidGdnkvyeyblA6xZjqxtb8Yb0bDAICZ2NHkTI34CTq-mb8kf8EDE2J2KRWcSUjr8PLC0PaqDG-EnM0LT9BEASNPm33sLV0qXhwQpyyL-J1WgnDXRSYnkzmoy-wreT8icVKjbvhv8XQ8Dj3uDakOKWcoc2USEwkPuLKeLqwleFDY4_7KQFou_QWgDXop6b-b-_4pAWpSSrFdoCDx69_KT7VU6AyxTTzI7U1VmDVu3IhZ--llbIVon2-V4MJYoUKcHX1oGONwli7vQLjUmB9ruT2BFWNt3AT3JNi789aJbNcI9fzK-YLPxvP0ak3C0iKHjdXz3MQFQxk98A77Wy95NgCDwjowORdjaIpyiYaTFooHqwpYpGSMtzxOkz1Wz9tx8VpRRXKOmknb3KhRxSHbILHkLJK3wUeJABrP8Cbn5vIM5BsSCVYHwMNag572YhihLhnRmh9ou9rxx-_Rzv8kIZlz8BnEZYJG1MMqw0Zcqw2gxlq27NEqb1qtTTUXVETmV3HqnUsuWUlAH1oW77YGmx-EIS30AEBke8Mgsoi4oSOJRJu1i114BwERApVThxVecEKuOoN5ETBUN2R7Tt8MjMtG2kqPvWM0xFCw-aQ6vf4KUbqLRfHLnRGaaVTGzWo-BnG9OTKonys1SW-FlJ4EOMWoARUCLKr3-NfALYmozPlOIbgpewJN0yhNkKiKkqvpA77LhysCnmB6rGAFATBkOYmr8cYeS0AAy5BPrvve1p9fNlbezD9lDCrhixsW1AGnJojvaCkFqEtTSbklTbJZI5ssdVy9s_jV5tuTRrxZkG9VtNTxkPVzSr30oECcr_8HexzKSB6IOt6s16epQ9f23m8G0vg8K3CcGE4XlM6UtldJ6X_Ufzr9OODNrsXMULc1bmO4DpyqV3DpPav6WHK6HhUuzlA7Nrp1cXTh78CbfO5hpJgLItLRVv1dHvh4OdMm8C4eO3fGb7TRqtlEL2NpSjy0a93EcA8eLzm20-6CZs1gW6Dq0d_mYNvdJXTFBMBDhWhWCT2OPopV3iiTdEz4zQIsy7DQk-hUiPgYxopo4wLBz-Brrs5JzYf0YDOLAbQHgLSNU7_HWsJLHeQoaur3D0CcX9m7dGFPP91vKY9KOsyyQsDFdm7orxlnA86EjQrlBtXbcAq5UKex6mR-4Cy3DH_jLhObnIH8ptDWHoFOwzhWPQOVRKYVoTw_ofAUdW1nmeVO7Cr5VNqP_JJqsUjieihlIf8XNhxn5p9xQD0zEmgT0Sr2XPqNkb7vHSlOGCM_zQkeYhnF_XHg6tmVjeHDk2DQpHwz2IZ3z_gOZ7Cb-dbXCQ5Qp-n4jOdGWqVMrfEdprRKKINNGCgQuWv1WU9j_K7VxVDgmzCRbUcah7O21uGNbiug2ILM0BC5ZKatKiZ3EkjkmBAv5GBr3Aq3BQ7cJN8Wii6jPOahnfHEzywKA_BRgTxS-6vXzG7nXZBh4M43MzouJ-duhIVCydGQzcpBkulH_7qznyz-VFzRC2lBLwbQ_QVdJFPqK_uY1-79anjxuA_VAuRn-wwXDMLcrqhTH-TI8oqTlujlO3M5r2lUoMLEY6D5ihA1ZNTLQB60je-mVQ_4kJeyCkoFKN78grk7TWrneuPxN1Md78yerUnB-DGFXfLK9tp5bPxqxWMSCDfzYTPCcFhqB1y1GRgBDete8M5fRprW1xL-75yCnkYoDYCh9uZGPTl0fF76sG-LWYGThbf7yyXEgyDA1-ux5gWWE-KCofVfsqYb80n1c_DQ6nxts8LxQa1IZWVz0E72c1OM541Fdkw99VwQQz8YEZ3tQr0XjHPiGf9wAuyMooqY6clQbd9HvdYkoRfObGnsXLUWgUBU-hJ5fOHv-t8DODSI55ic_unRPBEatRFv8uXlCRUviEj9IlSJCCqZ9v0JMZDTQAozXX6ivQkFn7DaEH0MRo2xJRtASx5S7CqY6h29fUBnUqjI2MJBwlElulVcDL5m_lIROcQ4HdmQUUpTpt_DtGdWQG6CfHdsmtfgc7xqAo2NZ5-TS3FMcMW3sNLZ3syVpGQfJGMLnyIWU-m9rIw4jSGIQ3ww90uJIMCO9hIhhJ66Lxk-FxHzQG0K_pyFJrw52Uli3BUccvVFQZflPo3oh1CSv7BKgM8zEXesyA0xZFj9bmpdQjGYa_5C6US4HvmRMh1lIylzdad0OvJuy6GwQzX1qhHRhW-KSwQZSsKSkG_fL1L-UrzGylfsALoSlevRAg-zNPn8Umw8SLguCeSjLIeEG7vrRqOWmKD1bCwlbKUllf4TVigaJqp-5RgBDZGqlF9mnGMeMYl_qk3bAsLFQ4atZRqMMVWaW7qCmftUU2UEOEEf-GQJuJOHTLbaBk-V6o6ZHI8EB5LyuPL3S0KIRz0yZl4mtd65TbtNQczcVR8y26F6bCAXBgPId9ba4Thci98-tN98EMXC7_w2IQUB84HBHYYTpBhN-aXrEQFWUXwO3jlKEyUdF12bNUvtxo_QQ1a9-DxZNxgSH5L_gUgtdpOctSd9xjBfzyTKve2KNAZGReA_lNSys2XFZ9NAyVtVmZRGLVEIuoVCQa34RthsTdp7I9pESFwbK40jzPWKrhRPKO62t0N9oKdz5NpN8O0c6LEhRLBwv1s22XalVayrOx-Rv5EF1FMnxnJUYiFlCAIkQi_hF6uGxT0upU25pyARjWBf6z8YVqG8wWpixpyymNohn2xRNuFBI7T9DBAel-PyCDL9dvNAuc4lMT4uKxCyQZ1XWV8Aus3V262DdP7AWiBEbGGNb-fxB-mxIIYslDTTp3PKOJ96x3giZPypxhCODOut4X8leH2q1s_a0bVxmhQNW9PmezuyzEF2BZ7FdifVwvoN7K1sKsrjIsunyY66DtrSdUQvPtNphmAL7QGfbctuHTaYyiiso6e9AnibxMRA3TtU0DhRMQP4qGtFKsvw85yE2xv9uDggHH3sJ2D4bKzPAWeYnGyqikXIpPf8LX1WT3zgGg_OS0Gl4MAknbbwLZ7NVhWQBF7GQUIvvRgb3o7YeNCOGfVVVyBZGLLmhDgJUxh_qz46pnlxzDKyhtTjD6CGnXIMVSQKXdTvXW9RdX-xxpDwSy6nrxxf1TtShT1xQhb35KQrGmbuKFw9u3lFyh22t7_NQRVtT6v-9iAbMFLB3VOJub-KyOOMpg1j3FEYtSW0uMHUN314CcXaeZaBzvWpLIKbiHbluzB69G_Pu6W0mmoAQTtDWYhVjfpsUu87arZaihwMvfMZVDCFZ6Dr1DpYjwnAKqeyWXxDBkgb5f68z--Zp_LaibeeZufs5B_fW_JHthP58c41lSzI4UqXMkQFKmx6h0SMQSZY3XvJ7GPCnbbNd-DCHdDX-n5MSUQRbCC9kiawMsdCf74ymc7NFXVi4OnrjRHSyj2ygyE-sKUwqA7XQvd9RI9zWeKa1PpEYaeqmGiqZ91qZmbrhgk7bkeF5OFQ1WHbYtUkYO7AFNHkp4SP6jB_Bshv0NUOku8A83z2i8P4xmPptBS_viWKADbGbexQj-Ymv1q2cgoCtK1Ip23mrrt-tYjmG7vBvgESsuCU0fTqcdCjOWQMyTWM0-LquBps8nH4YRYmnbv9aoCK8K-hlwTDO7v0UNIF13y276In8q9OE2e6ucJ74YUFXc8wy_LNVdkRbbwDWAwM-HE3tTwt7p8R8whtQCPwB-LirpH-rKHH0WWwmpXQ5b2n9bgLuJfRHrj4nihyYQsNOz0FJ98H5eYyWq2v-X_QuEH72p9ynG2u1Pvtq2zL2y5lkTCZi-YzpyRTcAUEAOFl3zrz-F58090c3gv1jXVMPE6cO_4xzrr5Pxxd9Ce09mX-lkndla5qJ86c9vc-Ka7BPwTybb5NvhCy_XUF5VHTrf8KIB-XpCu2snts2RkxSootJ6rY9NJ4XFia7PgOeWUDy6DHXyvVwj2TxiR6jl65_XCS8HEl5cA1AWVGy-Soi4yAeeWblOebDzOPTsO9Clp_r6N1uLQI97HikRPwMV7wN4bW133J6CMNsy8OagAe8eOtBzXxo-RfEhp6Qzf-yKG3NME1tAxY7CbQ6PyCNagxuK8qKHr5Hi1Y3lS-6FwQ2M4HeTAUZple-Uh7wZvgx8kFXcTm9FaQzeHGZxJTEfLP_BNt8f-cGvCnHU3RgLHmLA9D_MvxgpAtMvxDzKpLVP3XzXtiASmSWpFThLPsCOh3Fs7butx7ns2tsHBeOnZllmPV1HR_QdI84nh5e1vzEenLVjXECmIULHcm87yfUG1yDPuu7o-b0wVHsFGgVoR7dvNUpibsL87d7HLAfW7AaKQ8OImrVJ8iHRfjylqaLidib0QkbJLPVrdyDRkR9SDCzjAz4OobPUaiOarXYyEaxJwGD8F01ZeFx-Hlz_c0t7vropoHQL2bDsLgtXeNW0c14xbuRHpNMOP3ZBtVusTlHXnswebSWH7s_HzvBtjZoR6nL0lghKlhL9wi47PlihPgDqiiHlEi2H823vG_u3QSJEW7gIomgrX_9TNSKmP-iYBGSZr5ynb-PgQLYeWOTFHMyndqYUsG8aA3o7hN4xqcanatOsoYk2kyP0S_STX-WBICTuHK6mlstY7jHg9odTG5_gErWIID1opL50R197CUK3PqJFRQBhj5wZomN5i1FRX3bK9ybJexd7u1mHuRiGr9QJfFVAVt8snP_Uvf2kjWuRIJBSFoqcHuFZAw0x9v98TbcdAqUGUcwu6vRibyqoDUAF7eWoDYNL-mNsFCwsjJaNXHPRGXy3mgjr90z1Bms2aO7UxOCa_jkR30x67g5cHndEf30xyNN3AaYhmumjjbDC2FETRz6uDTFLqBZ1GFQRE2agi6TrJ5KYuytJanVz3O46DcNTFCgx6NLSmYnCip_cqztfbUSa-JdNgAEl5G2N8xeg1-aoQ20CoSn5BCdQPvtYTE9Uz8WoNaAD7Bs_ZzkylOabdYcnIs5X9aQcXEz6OeCTwxFwaH-NmG-FSVGy-QkuBv6SePRA60aafEigASrzbNqVYAInKDdXNiVGMBRhRdrcPMCD01cu7IBTnNQbVpdFLgKnJq-ke9OehZLMrJLwVOQKVe1Euju1OD_nft9FL7-Gm7AJ96KRls0BnLP3GFLAuiSRswwwGKjc84t0DRsQqqz6QfPxOh8qjKCjCNd_hR4y3l1HI02uP9TelHb-jPKvMOZACuD9GayWw6nt-Oqnym4bKIu59Gkgu6C6XI9ccfADODhxo6dFNfx9KIfuHA36Qmgm3e6MChO54XoV0RVNkLy7IetaMbsNkzp4_kyPFeNr4NNMm_xORLNixmgGLbA9ZBZA2FSKaWL1L5Kip-2O6_0Nk0aGXFyrjtYPTLtA_7e12NYVEwr_uXRRTTcUcF-f8fNiqYzWqPzpFEQNWZXqJEryh6CEBc1aNvP-7DlLjHWjVUR3DXxmds5NBrQ-Z5M4M0yivnVn3X2l-XCmnaeZKbzjLF5Q1XJC-lyVtMJp-0iZcqReLUWnigP07082_LLW0i5CmD6DR7DBYg-h3GoOeoDG5ZKadBlVvgwjk9D5UMEnz_6IgS_qsXQ-KXH4SmEu_tmz161MEPVvAn5sGjdMGpRP-kLT0gvaDOJJJ07ct9AzC6xTNlCsVz-n4tX7-lPX15n3GjH5Y5xzf8ztYD1W3iFErcZ3zr9QWQbIn0F6RDIoQNeECJW6QzyG_g2z3S1TaxohWs3zz77xAQWI_-ebw8jPSE5sI4Lx40bIWyMFXsXaytZ8M5-2DLr6I5soC2zlAST1zM4HcMdPnS0w9ZjO9JxnCC6M5Rb0Q35_HozLTn-mV3x1KQMiaILPcbgzF-pL8RclsCiD5b7m5ZArrZPT05-NQxhRb0QskFXmCB-3ruokkKKoMuazAd9RnaW9CSoL825ScuSuTmDVXaMUu6uG0W_xYKX2HBsrLMPuyfP6JF8Csd-F0kerwiYdc1jxHnadXEdSqOlqqb29IYzC1JqE1BlfEZcnNxS-bF9tN_KCmOgftE_cESDaI6ittgZlhwmMw3wbJFbRS3UGgcebmRm_nroEswtEiGXkP4Ar8NGFpuu-6f8yCOwVZeDGlFB6beEkiCp4V-P7IJ0YQ1HPhFMmEI2CwIWQwVJK4OqBE-wk2x7HyMJDhsLXWI0nVGiA0ZCELKkiO-_MAD0M6TWPJIW5lsNNVYGgIK5idE6p9FsrMsy48j8IO7fHLBUAAY-XSd6pQwnYkgBaMKw4PKKKg4f65zcOahx3SoXHvnGqq8sSdt59yk1OT1iTJhiQrCYMn-UMxBkjVWNNnmhmDj4ldFiazCH3ENt7mvlLSPb7RVdzCcaTpOqbYmytMHoQZah5hr-zjm0wo-haYnfvbhFnLewE3GWzhgz3ePjN49pGG_yIRUX0ujBWlhoEQy1eSrd-MNMfuc1EPKR3SjbZpawP0iqC7746cAzXLpIPVXiYNjEx8Sc9WyDgRMltoOmKZxiTegDMhzTVS6Ia0uRSmgPfMt099D2eynrtYoXP6kJvoAMDDOSlqixFumPgnZDWAVZk-LeS2cH5Qb9EoFl5KEs5AbcIHotjsko-6G2_4BfgXoZ4yraRu7FoxGjVRnhBDbeF-QTgUAy-ES-Vv5t8I4DXs9gp1OmRRzazL9JVcSdNLXhmJKkJtFcn-qPvw3GTrZnEqjQv5VC0GgIiixslpX_FrIWweUjVdm8mph0PCScmDMIG8FHpoWNAP2y-m1TClnCPOED4e-EsEchVny49zWXYQOIIb-I-Fo084yuENRL5LAh2zrhfwc2kwFXn4x82x5FSyo67e4YF4eG-sHY_LaYPQTmDPVYT2FKdkIt5tUmETfAH005fuZs3K1JU5vtIl17Hpk2rzVmjn7NbnBmwyn1JgIYr-HTB5b9AQMXjEkeeMY_gY7UJePetF_BddLS3fDL3hrnvjodCN3jTSttlaju83sP1Zcq_CDfklkzloGmQH2qpECRg6TPWyp2gwFNZDz8nzLuZ_uYv0Prb-Iid22CWHGjthwCxbMMosJiq8R8guS5rsse68qyJFpJKKtx-q-LRjZSstrhfLIj0XHsCBzzEicYMPFy4vKorc0fE8MfuvSxNmji6dFUFnmwYjNw1Q78juW9TDtlqMnJhK0le5Dee4yQ6btyZ1XWugXoiXFtjUCqg1FfuiBt7-LEn1CZprC7bs5yArOxg8VrYgNSmDUwNJW-TjviofIMly5K5Z1XpukT-Y1KzVjzI8LeJSgc7lfeQBAeNzRRj_TPgL8Nvs8A35BOZwuQCT5Vk5cbSNQerZZbgSIZxgwqu_yIgHqeE1QJCYoB9nXyiZYx0YD7eAY6CrFoP8aTM6MJME7obMHzI2uR-gCaPFJ05LnlA9OfNdeOqsX1V4wcuR0b-5QEQWW8iSxLC6rY8lW00Za9qU98TNo2W6ytkBDGyLBxMCNT53DUo4WDu9sgg-jKpvW7zDCc94XwK2-EHXu-aCNJd6xwuuSpVWpps4j084Fazo_zo8RoxcfvlS3cWVf5jOmmQmt5mMH7Wol9N0BdC3kjqP4d6faZRfZY_3jPGEFAGaUCj9CmSennwEzLgc8ieV4wVOd8ZTOcf5FgKx1unMQ-goVx2YKcJ2onCeePaxdMkRgn5qd6Q-l20Y_D0iq9Dq3RtfIVRvHP792UFvfQqVLPI7tcR_bvFEEAkPl-nkY-NW_06h8wiVwQ5vQ2S4T3AMNWUaGAFf8EpZ3pKefe-Ijg8jaSawjA2dtwxPGExZ-hxAIzM2zQnMNF5YkW0tL6ynKKZla1YV9X7HJ4k5tbGwLwczpmAsyzCjaCtmgjQyaynOl97v5jwqn4ItL_xeRP_MWCBu_5BLiNNThI98nX6FFDDX6__y0TiRP7tJ3aKEtoIhWdgW2XYejTsnILMWqLVb2G8TILzZUa_tEu7IOJRm_EZtVt9C9aulH15AJMUdQuNIFPjfvv3vHn-Jgjd-107BlHcZ-is5CdtJsdh-oGphcr0WthYXWW1bMXW_7LCc-bewHa3n-DD6LdTEfcvC0RcRCh0tKls2UeNK2WxJUkHqoBVYxAXrK4yV3kOpsI_I6Odk_HGhZqedp1b-bqiwvsVZKb1QHDiUauLg--_pD6hPeItJIit6INO9a6owotZ-dNeUCVfYQufyWNLJe8zKip9jpIluRSu7njPkYHNZ8vy6Bd_myste65yZCCWdI-hfmFnmlYZgojfppZqo0qLqkwPcOB5nUdkd-aclz-dJbsGwypHZ0jx3vaiK61b_J9ydLRtv1jmoKeFVZjKoj8IKoBr2K1dmG9VnSes0wmKIdKX-S7OoQyAI8JV_GC4WfqEtY9NjSKfvyMDsaEynyqLy3xlC498bc_zWoVd1aZ8buffLQx4LJopaTx_nS3DMqKVwU_nYxwpUygWqAuKyk6v0ZH82Ndqtv461Sis-iskCiY3F1AbEGu2nzR9zMHcn7SRXWxm8VdNNNDqYAhOih7bPArATqu5kJvHoTaje5_0yVv6W6pfVMhWGJe8m_3R4SKL1Cab2Ka1CxQfsnj2sdeeb7_tCAx7sg-1MuIo515bbiD-s2hNN8HgvijA9JvkCdg0KzK6oU3RLgR0G6WCzm8JlvVRvudrrmyDZ2fidYK9qAyJCvcOy43Nx90-QJ0gEbJO8W81ihGDor_Z3i_CGKLJ1D5LsWR9LckONJgjQn9kiaKmDo8S9F3nyNlEa64D9ME1AhLlck_GrlSQkL72B2PiIvGzqB945AzrIAazce4FpeLhn9Ek1YoQV1xnSTFQqExr0w4tyt6zuXhTfjgRKisLx8EeTf5AxeU7AjYIl-6-A0pww3CVZx_tJtbDRv-6XZuS3EsHHQsKkLV5o1joF2Unani8GSBlC5M0S9XkmIzYR2L2esQxAIseigp63shQxh-NyUVFexJ4BL8WeQiof-usxe40bXxNrfbxzENGzhbdUPcPNhfpyyiPOVN9KbxUsOHzR3VRob9zPHVS05ui26CQVa_FnJV7-OHnZ9Kew-ghpAs3nN3-fjf5lrsTNJ97KyYpqJVJCBj0j9d7mEU76I9XxFdG8bGsBC14qePS_ILYKwFo9jgzbQo-tqRhjjACC9ZUq1VsQgOyTo8E6LjrBVgO-KibD9AS-U4KffK28m5GC-tlx8ktBK29olJJbjRoe7Wkut6IsZvkmt0uU28xbLnQ3SZ8eKHQCfZQBpAj9xjfo-5Dru-SBahaYjhy7hdzc33KxU1j3LGqGuTcoZz0E_zzEU7IR1yjueIev4aRLP48dHZ1j6Q3bzz7UaTsefaLyCtg7MgWyFuO9MQKiTncgD_TrwAQgpOzzWU8cuMGOlg0iwmss6B7JKo4z0A06NP2mTATx0sEuVuLTxTu5DW9FecsOL5zZZXbHQGEbyAUFrgw_huJCPkmoyteh0uMU_Qk-S70mcM-UMvIx4DOuelx7D2xY7XDNX3AB7TBSzUBqXMp_1QqKHZaHdEbL98HO_Eh8WGIIQNPjCPxz3dUGU1rndb1ojIp0hMJkAbS1uDcVLFxUybZ8Cv5_2vmuYfd18Q9ZmL7A_bquQLYxvzcAgmjT_2aVAjMzOe0lqmY42D9D26gS1MKduU2VuXFCmXwp94dh4vqXJY0b0jx5j9CKM06UkebMezE0RYzEWyrK6WSibtoVHVfqBJ_Upf-9Y_QUdBNjqtu9dqtx6R7AGljUdBRMWOrfQkhxxPcFykYhoW3HHv3Jh0eOxyKgXXJMy_9zcjHd0kpBAvz_vKIGYYE4OT6tlrvh_irNKOJqpoddgWTh4URgabc2-q1xtR1p7Tszd3AEjG0hfTfrx1QtGUfTVdmNYV5YGpERMiCV6lBxXO2r6FZlLHG5EL7nxRU3nAiJy1ex_JdvPlNKAiq9T9xvQIc_Ev8nyjnbgSrigUcMxO5zPJN333LLd3GHb_Wj79yoVSTq6b49vKEuUIYaDn0HZrUUSmxrnLyPNYmVC9xahqqai7UILlROyKw8TDsxWPkEdMUIwV6C-a8vuhDGwMp7WNpEvIcd2fSA-6074Nw0hul0iCkPltDGUNKgr8VFYxOiszlkRDxpNa0yiqJJfTTikGCLNBRNRn_4YZLfAvnl7oGVOkpbjTX2AqNKqxNesX7HmK9xT_DgG03Zdrxiv9pBAZL1C4POQhYXOd-8k4DservdpjcfRJdTCKKQdtMjv-LBugwdi1u0xWDWKbdLZas7fiKyxUMgVoJkFdsDkkdmlErXpPtFOYeDTxKDgsG9EfmxjrYNLxy89zhpFQIVw37hTDS3pM-Ee8AcIkVLJ8TxvFiCu4u-STqXGYhVezr7GGcI7v8D2lriZTbk7TK1iJnJMRXV3dzWX-1R6uH71MVctKl1QWAOZaxH5Ru-Uo9lhjPigz-Zfr3QfciJKerqJOyQUWmrsucrmwaMyN2pfd6yoMsOfN3snOFtx4Cycv53WzB_CmXmGr5HdFW2-XwM9a9OXhNPX2P-sKY63lcXf032_4erGgPSFcLhH6awOqGENEJVADBpA4Q9u5EgAC3dPR-SwapVpmBciKhTSDSBUxUe6xUeQFqcSKzFt1aX0fmSiV7pSLrAC-IViXY-1sD7A9PcPb-RfBcbvbXrbpXIsD8xUFMbfWPOcwCUjxvp1vpZHw7b5M6RI3c5GEktmqX9yF47ornbhTzZaKwdvuTl2Esq0ZulR8_buuzK7uEm6rBD6wlP52bC6WCt3Jc3nmfjGQnfXRmmRZ76fZAQChmH6efhf004uast-WDE3RE9OHXb4d34PbepPYDxkamOn44uf24AnW_oIa8b3Uvff7kF2a0GuRb_csGzD3lvg1dZDFEBL6hAQcUED69uEkKZPNh46FXFJk9BYhu16l-KbKyKQrQMNdbcGb_VdzsVhHEnZQ9AVTD8OA8DNPm0t-2bHoylXrQoP3bpFfUr0YNxAyEyqVUHGy_oReqJt3xC_hAZT8ji_arJ-CaeBhwh6Lk1-44ZBQYRJImrNuc9kMQgHT6MIyZIugUZvjNw8XwpSOYgXuQRiCylpPHly7sl2uKeDHZpCTDpkKDYGZNY-iNB0C11dXue1V0r4WVXkMXEKGx9Bg7dVDTxIIZtnMFy-kP7KUHH-CFrWY19oj-Gbj0PHoQacTaRnnr_LcXOkC0WcyHba9mgM3gSYM6EdCbfSvjg3jTgOvdXdMUGbhyzogvGmTk69YM-eTbY5abk-z3OE5aOzdQy_jj5_eaGovdA8ZL4VKW-JRpDNUiLB6-WKEPnxy3vF0BhyZCTnroFmTlsG5StujUC05Ta5FxLUTMW2CGgIY5NFzC757Z0gRoasDK205r2nhAxTOB54uZ3bxwmgHZ3NdkLJ2eqCP2wDbsFoja24dLyv7sR5MjSgxqzp2z7MLcR--_M1JSMnmH5D1IS6ntBMVkmEdltfeKiN_nuBFdAvB9Bm7iH9NxBDVEibqxHyvlpXtJknhHnqyFpCmp3y-pLxPGUdT4L-6tD6RkdWJ0pvldUeAsFKUUogNVA6UerIlm8IY55yXkqMOfSbeUvYkerwF9_m05I0ypOfBkqyl2CwlTg9IoGkW6H4S-f7Sl10Iw46aIjhW25yG9Qqj0kLIKi9B7IS2nD6i9fkrc-OUCfemZORXilhBij231TDXS1rkAjVo9iRJVJG2RoimLMACV8PhRqMLChpkjmzPk6zTw58Z6si03c2z00BRW4YaOdHwQusu-D35HbsGq2Yv7sgJRAdfYAVtOYKN5a_nC5GrmoogVemK8XWL0X9tXyF-4WU54hoV8mg1e7C6Yy_R3KJawBEAB7bAwmmZg4I_xA4t-oPHt0smoN2HOaZf6-3ohptMgVOyqVy--pHzmMCF-0Kqb3Q2kjF6O-NqIFqPvcgimw_V5b_aXqoUo7VYiX4z2PnPPF-_c84yOYIyP9Vbm5I31uR4M-DjGSh053MCdbpklKJ7vXBdNnox8BeFY_qgtmd_DB--jPVEy-2BqOJrWX8nh-8_Z3XZqoi59hxEf9SwEYsn3tyt9ZBV8ikK5s9xEPxHtj5e0NIsLJPazxxazV-7EctmKnexAPziAzOw_srFTe3cWbmWVIUjBuAprDisMt88HExqNg4PVSuBlhr27MzJGRxviFTpLuO0A15eKFl98Pz7OsG9XMCrq7e9HfJ3ZNb0ZopHmyiRA8nL8NAlw7Fwbh2UXe6NDppg5txMxXHl-OmeYTqGMlcQkwxNVokltsx7GiM0rrYsNxaBNX2tpH19brp2cNBvrj9VIDuvuCAN-Vwv8835f-qaZ2rAsVgV8phuNWW2dz4pnxHG-Ulox_g2weRdvjZTE6YylRMMz0gSrCK7ksqnc94f6q5ef9JnHiTUh9IHSfrHuClSe_SwLfwTV5JWZmrxq4O973WG1sz0Dex8UFyBn8UkpcCeDWoZlXuL2PO5WaHNLZZxYrg7ZEF_h_-GmmDMwD76PmFs1cJDqs8_Ek6wcMc055IR-YQeJgeFzODHgCy_-S_AbSLM00tYP3fRjxQX0k8EnbhMffzzxI1HdDa7hA6MqfYPPCKrEYel1Qx6-OEf01K9pfmvJlaguaMUmddpG0lk3lPlsdtfKO94B9bWyg6tZ6mljsjVuYmoxGs-kr3DysO8rs4ODDqW8mgjHUJxYO2o6T_Ul9GSjy-HbGhuhXdgVvK26lIeb2tDPsTLCj9aLcLNv1N_Jfh1HBp4jEhCv0HID8K7wYKjEMBkjXjhRo64GqFIIyVo6iu9IpQp8QzyyoKtxleBtevcQt7SSwyF9XBzt6Fa6TfxQVHtAX-1b4JNIW1QcWS3ImatgI4xzeTio6e_vgsZD0_KMs5wqyAk9Yo3-mvVUuYWINBcyY9xlEKTGBrlTFNZm_syp8djZRPVHBW497_ysZSXFxIf4NOccqZj7qUOCPAjQUZWXKPuVJ0f8WmcF3Ch7xLfsS2TjUGjJPGU2vKqdOphTkiF9EPMDMizz7BTkfiwPOBj_78bLMJae8cKeoMENXdpPDcajcJXjySBRch4ciRDDOtgFuRoWmsBtNPYXFWDFhjwNiYS7TuJX28rEzRMub-lWVIAfoLS9WRtIvXzqlLG10Q8xAKP7nj6YXXKnAs5TJyyftMsm8ne4PMq6C0uhHLuklOHVRvQs92ciIZ--IJlJEMFTfhOQuoLLncYjK8uhNE7FV0zcxQqEyLrCZUWfjFqSoz7fm9jPscYN3ll34QefArrrVZcbqQmxzLy7_Ach_gJxFKR7DmIuUauYW7dFLoza5rLlW6s8riTHhUY6MJvnjfQTB_KsDwIPta3zOKlglLpcPQGSUr46_-kb3ANBeaZWr8ryKaTQYQ8a2AMogzBgicQ3IRsUiu-Od4CIZ99rzmMO2rBVOm3Z5wJfHPemuJHnRs5sFX3C78DrHX6LoeCD-TMZg6Uplad_UC_b0EWkj2gAkplzNv5PJIAOtufkLaLB8pX9lwI0_EiIIkIm_QrnTLfMIhegv9CPXQUG1T-4n4yf1ncRNxEVWBpWyruvV_vWR2_NU-W2oHaQEXb0jtcu4HKidCDRL7vTwnFT5GNR-CD7rY-r9L2ad8wE0jX-Cq_O4Z_sUuOk7TPH5iyINW3p_E-pswWzAKn9jeDMKXPtoELP-FFs5AQ3Drm8pRmtMcjMnEIMwCZs3tRZ9__6OAoitPQ_euiMNMwmOQzLA_9d6GutrItXQlEmrSPQbUjMDafwNnbEnG0JXF0mGFOCCFLMUSSn7yIjN_HjnEWcISr4gd2t8eqoZVRlJmOx6Ro0chhIAtcu2ScUyN7ilSHeGyLIJ2CuaK4ki95jZsmDrS0N4mjaPPdsyi69XLGM3Wh2xXlUuzX93KJdlc9wpSTw-zgFakszWvIPpSs7YiCjcZ6KbO5ZMesMMoZvj97fuH3LylcWvtsnmPYToYSSGo1goYZoFaJ__XRm1s_BVjql3ShsfVm2BB_PjfXLuW6OPIQzwKOz9ezhoJ3-425LF2ZyDV290ZNtRoOcfc_vADzu7YS-6lAdX6002ulnJLCLj9CnVKSyFYlMprlChrc8okIttR12NBIItUgIxKFwzXn3o77YVIWJinjZwM6W4QFVwL0RyYBf8GkfUjhKYaDckdOmpyKYR5ydEcarXFZAghzz0pdbuml2ZE_yfbIbhTu_uDlSzBRJK5HGWYw6lMeHpC-dR_OMxCeOHSG5fZdPeIimH9T6zRGePd-3t1y0ISArWHsXQSOM04Uc6y286FHBSsvPbxiw8o3aiiqgw75FBzcHiQda3u4oCHfZwh9nJKfNZpRSj1APga2iSlS7hUpl2DHVwl7zbWLMx2R7FrJc7gsyCR5YgxC8VZGnTuuUZTq1BMVJYCENnCavCI5CcmVDNRKHJrYW2hHDGYh6lrX_LNx0IdXtH7fQb_g2H5KaY0835AtuQ0CZj_gG1YXqA9ExI-fSvbMm-WioorBFAfsbwZMpWk3Kb3mc2HvHelSl7fJzH3J5hI371wPvixT20YphF9nE29x2ZMeGCm6NSH4fEfjqjp9m1GV4dXbqPB5l15_TMTvfAS60YBMSEzeZMzIEgD6RFH_HjzUJME6K4yfm0AvHAi8tKsLc72NkLBfM_mihoY0fQoHXF_XjlX9skRjl7FaXwTycTXPuyeGUsySC9CCv_eJUx4Epv0RQV0snGSpyYHkSgR2eNI6tR_wd0-pDMaYjuzBlo9txHr2RqkWET0bj9syWw7cbjUs23k1vEzZErjKr95vxcVDwh-guhAiTiNgGOdICkDlvjGxyzmq-lIL9AFh-SwVfivTEAzVwFft9s1zmayKSpMez5sT2qDOqJTSQSUJn93g8yjdAoubTWogTJM9NMS3069sJbw0GR0Qv9ANBE80-ds6MBqNLyawtr4HTKEi2mApUN0ighE366WOaCuvI6iQ9vatRpoKCj5yBr8NStJ6cyaZuULkQGvE6CkK4EQinAYzpoREnqShQjY85EyYGcThxs8-nyiX0QZZ6H4O15Wj7Zhl03CYvkObtu47ceIc9BcTMD4wCumAJwbtNGE0E8Euo_c2IrYjfLurEHetm2w8Tqf4I1eAnOpa_vKZL8L9upRMIkezl5hUXFvRgdHa4LpoHWFjSuatEbFc9JgyM4umttsMxdRBrHWGmUQ2tp5JYtB6kfyVpcKJZPANa7li3W5VRvxB3rhQI3DN0UVNT-ZSXtPMY2-BRwhe8ry0Cnd2Kh03FGeEVegIo5VuKmtr5YI7znPzs6v730HaOH3MMQm1W9oOgNS8bt8bPB1uguAAA_gkl-WF21X0r5zcGRU8Lee1ambO2-B47rvZuAHLTyg8BW_sO4WfIsi1avJSIk0UxZM1UkWjePDVWZZi4L_lQS3s0shtceRWKA2tS1rK-TqRHu_vIr-gWakaUnFF1KYfrWnC8F4j5A4WhIspuVD2nsnJBtiN7HB-_jCpnn6kPsQlZi0zIgGs142PiFx_q2m4_T1qsCodQ3cJvL6kY7C-SrQdjIOS_LZxH-C4Y8nPEAEhck6azkpugBnLzbyxURHKuPGSJsr5UgkUVaZoGTi21rfYLlMykpkhKXPn-pEc3OlZyICyvgkdVPlC9tBwHvwUmqMJtbnhvSzP331HQuXVjwjmcVNOvS28NkekzsgKz-PzQECYzrgj5q9de-EPEhE6wQWSRvKb1deUrCyxsH_HlQZn0moprjiekeB1KJLGOGOlcl1GHeDeSidcHeXHWIGAAKxwBD9-XP8r46gUcYkC3ftEZBSboSMg__AIsa0Zb04KW-vvSfQ9RXhq6tNbzXuwY5nLWrl56uz5jd11AUZrL9fZvYxd2tRggZ9nGOq0xufpxHVNOEkYcSYw8Z5bZloKrFz5hI1tSqdrP3Bgf4qwu4MLoZyM0q_ctVIBWN-6Xl0LRGE7uM0c5mHd8pBNRX0CtRtlaokba8qGx1jalhdf7BdDGhXH6SXNdYqtPSujZFhySs6MSk7avar8AdAkkQzZS4ATjC40Aa8LPaZKltgYNIZxdgnD2WmNhJn-vpjMfQLu3D9Bo6MWSGWAn_JBeIzFBViEWbtfgueMogkln51EjJ8RNeBpV-7o2BnjqJhP66i0a5qDaRkQGQK_TnGgdySlh8xv5zgTYWrC3VqVPmMvtAM7XJjzi_LA5BMDkXcUKp7UUllI4Vh0tiYSQT4XT5yMG_GohXFHZwiDn6QRa038i7O7uUAm5ml_Mj9WeoRzMbZKFyLjPyJ7uIsaabo-263GVlNCa1iK-wtfLcnCGb0zC4Yvdu39qm1LS2sXhHxOuOz9jH4hkV6vrbpibHwGetC_n_QNeZ-IcAZyMK_mzfXw8vbxPuLsAwcUg2lC7ombqzZsv6Kj0G2XiriUCO8AGvNsS500EikUWMtdWn-qccqmJMR-Bhn1lNT1L7VBZAn-QLSxVdkgSWsPlavSc0LT4HON9YPNh5v0EVnb1NM9qd4OaVNToi2KzI8_TvIAyOYfg1IcqVwHqZ9U-e1ogvxpeLOXkbON0PT5JJu0o3-ClxGYl3tBB2Ab4EP59EM6DC9w3CDYirCn09lU_hSXSucXwiJR9pGQ1qryIyeynelHddKqQmGemSQR_xk4fk1H3mAyEBkCZdPKWz85KlJFfMUmuHWbZKVl_OE4HRBRzhFBYbnWVaJ4vdjOnKR9YHyfOLtcxl-liYBEiNjrWYSBFt_UE18xmeOawlI8Ifh83fSQPUYRWZ9a3iOpMdyxUAicjlz-D_3DM_pv3He2-bM5h9KfdXQJXog3MdTvZyccv2wynGn3s4q9VgIdGpIkiirnvn4kti_9S-PDOUMrQnc0Mvvp6FIH13zoTVO-i10PowytQ8Dy_rkIJXp-bDlTUYufdm4u38fChGdb1pyiZjLyhexhZNv7IijKOatlQDzd-4SJEgxtceWNOcylNVaj8wDygQhYgIm_vJs0AeS8tTQpF1n8S7rDxey8MV4Q8rSmmxFYnKfZ4XZeiu7DKnMfwi9F5fx6-ABj9ReNWKO-KblIJakBQGP6MUqFLEvYG83GT0qsjR6SkTQck-iYKCyA9AS93KnzvaP6VMNUpZUoTCWf6aJG4YTE1UA2ycaFEHlrN59uCg_QcO0fsu2h-hnzDjZijArNwd3dLGPXoJ6Sk4lr-biz4EJro0WKJm8pWScTX3YMLIVFMWZB_qvsHhj2jF-CCDgSir4A8o6TXdnR6wDorGWJa3jyW4RkJVXaa3U9ev6dYxGZ47i8OteGD_eIlXW7fliZZcgai8ndXWInCarZn4Odfk1Gvcz2DBe5Cl48rdLy2QKCkT2rn_UM_p-vLktw_YyNn3uKj30PZXIFtSeqHDmEBVgDqeLTYMu0TAm5B5z7pphuXVC7fVmxrek99lQ3FCZMgKtomSuR3wRIgr8xdPS0v7hV1p_sTNG09TjkqJf2BTjws7LURvVluRHpkF-Nv_YrUviNcFpuu2x7r-f9RUSss9ndlHSS0us0yRU1s_lbyPXiLE6WXPSQdyOj8oLy0oUVNOOLofIs075Lgeqa7VGU8vhYloPUNW2u1OjYECxJ4KgjfnhOt166f8bMrP7QeKlV8utI2xdN5AqHgShW97eQBVX1-Bnnx5r_VZX6DwEHzZEe8H7Av8H93uu6KSBKUZoQNm6gMG3DQsKdP2dAhzNrRgptV-8sEsN5y7D8wxg3KeVksVExUI4O1u3WN0binylg3o5AM8uHqSh8O4xxmNpH7BFp23gXX0d3fOY9grwLN3cdxLXBcum-IMM_vayeDp8Dlzr5XWd4Tp_XGSXyKAEtTDuEdHZQMddLT_t7WbKvX-X3fFILkPkqXVCYfFA9rrNk8DaIkfHX_R-8zsxWOF-KjBu755nNrQKrFDElqhb2JnMmwlhT7iSgOv_ZxktMpJ2LqYcQGTltpvScoqKTyFAJYCZpdJN9KkVq7iSb9hXsmbUf4MnKP0CErwkmxED8btGX5PrhJZVl3UKPyUx1fryszVcD3NEkTypyDGQseo8hLyI1ZSHgKnWNNGodadJF3cWxBQQV28Cp_LxlXuCz7YC4169hJtvmNDL6t1AH2efbe1xeouywJxrwvz1YRBt0pKhIGvdkBFN5Ms4BsMHhUZoJOA_9VKMSdKcfmWS4XhIOMI8JEVMqJ6dP6pCJ5d0ow0sQtNDVy6UXslpUigyNH7CXHLn0OMnn6KP2DZJ-qY0nB54Muh6ihg6Oy884Hr_858qFysFMA5lfR2DtthK6u_8NrVrmxA0u6JMxF_QgZK2V0GnyXTQLwV5ylPkYm3e9vvEBjFgMJJ-iNvByEvWdMJbPofuAoNniKajg-OsfjTDED2PKkNv2iu5zeWgj52_wrYWv2eMWJ-9fM60-PvhRRcqiPwYQzfbRtqurJ829R0Yc9Q_1pjGdPn8oC2U3PInBlLZ98XCbYqfnYwhHt-1OdfpbXmhiE5xoArM9K4BE2iL7Y6HDobvxCwX0h7eU57_1FwsKV1VxJTfXeBSJDTbSPsFGbSiF2eireD8Twha_bLmTO6ASxz0y8oXroUffrBGp_GPXdzIrg2BH_8vCiNCGSmgEF9zc8c79O_-mj1Fu3DWsEMifjxWxARg-Aw0nzciLxV2PqdBZhf5XTHGeDavD5bkdyfyMq8rK2wVe33Sa5ednLHvVoN-z-x1oL1N8OhFBrx8s2FyXR8OvA-_axC1AFZLE89-7Ooqoc9Cucki2HEFNViWP9uW48OFrg8dtUv954XaKVIOw-WxspERA7mv-sl1b3wIXUeXdu8-s6cOzFV0wvuhn_4pEfuaWLjLTMgaPhdc2ZuWO-CwCDWtBpmuSRIEjbzEQCdlRokoEZK4v9FAkFwWJz2E1YkBwq05Xvaf07XKi85bAMegIRbukcNmaTnD3pJxv_txwJYGeSMsNRzWhD9kRLdBVQMQZEvS0-zdivuxWrGuK6CyDi_LlrHIbCrP8EmYengY4VdY7gkLGYa3d2TU6UxiSj5g42HTkuHN68FCHq2fP35pZUl59xfqDeXngIaHKoPsBdUywyzEt0JPwYhE72uWKIG81Da8ZMO4JPmZ5SyypZz7AiAjg5HvejWPbR8WV1fvzAh1slvzBuLuoskitDylWG-z8J__YttJkCe4HFheRhugS2RbzitnhtNIAwcSr_8XDDIXJqh68QL_L_8ri1gYV5LmndqcWV7y-oXUcPAdXzUfGq7xE0tn1R-LmYmcPsr8fLejbeZAkR4oO_hktXSSfEuE6jmUlRme_siyzEZ3UmmaKsUGyS8mxEvb1D3V56eJWF7AoEQ3jdtXyEk05ZjyG-_GhfHl7pRd5V7H6dQd8mS4pqNzYrvTMh8jzAXau-Jb7F5_M4faKPgmTsBuhWVbveWqnixDhaiLHBP6uJKAgxFOl0b4LmhGiFvSFi2vjrOVR1X6VTplHEyPhDrbwHiBRcOc9S-6FORa88t1eRhvvYvSlZQLI4ngTwYDDQJJu3I1pwaZNrmXHWzB5vokvwm7lSbaU4HdtA7gdczzQvr6SkkAKGVjRnf3Mc2fgQiYHjhodcf7y8DiD-wt9-6PwGwOWPbnNAz1BruJoED5V-47JqWKi5PbG-Uhbg5I9OA_tvEso1EaHCPZMqY_1J5d01l7M_7nMsgpH3Fb4d0Ir8JkT_15tPyHlIoG86_zmidy2F1m2px6PbPaYyce4uJfEyi9vyyx5-X7EpnMpl5CC4_6npmR3-u-Lj1zt2M5IVTHOkPzuBAhtVk2aSXF1JjSMsi_0_4I_gufyut8IC8QcYniCavDFTA4IzOLpi5Dcb_FjxXrSLvOjvI1oKbuHCzqI9X5JlrlWhxn0ZMgfBM-v1P7WyDvRxAAjAroiZI6zfy2f4duzm6JfGYRPInSLVrY_3IbNzQtdx8Pa9SUh_AXpsx_gdsBmUa41aFFtTTlyOYLqUryxTnJ_URkETvwA4g3MU1l2Jmho3CJpCL5qZqwc3R97DeLOhg9YEpHeAS0IGuuJ_RLNDDTnMU9VWFDqKr8MNlOTxHkAPOlWy7kRAOAIpjsvMl2bvRMEaAX3k7BuF7k2iowc-oKnDTzUWG3Eb_Xc61atK2uvnPQH_0bX_9x0riSbErHj3a4ewkb1BbvO76EoN2ZPUmykaNRTcyk0aMJHQ2WuYC2d_Ip9BieCz4A6TDaiWDd3b-bXh2maHXzuflL2EQaragexObdltOTj6EcmsQffKMP4fpVh-oKurYb77CTCYRc3HpenEYZsoAjSb72MfL32UC_7eOjifBNOE6hm0bNayO87Pq_SYoUNjYCMezznQMh9BfYbs0nIOfxwdONWZUn0lZl3cbntRbJLlRHOHI5hWj2_xxgFDypz83Gy_ZIDsgT4DxXuML76zczRWVK0FYxnQRqZuSXwMSfT45MJN_I1mdryLxxYyY6_is_NGO777n7Xj-D0PdmCt8O-pM2LLrvps-DgYAvEOtiupRwdGjUuHlAZdBiTHK1i6AjImWIXViOiM26JMIiBS1styEyLi6tZbszSL99sX8aITHjopg45ZgIv3PBu-13wBwLkuaFQiJSRGHTzCfYJ2cnRtECvpLUvFzQVVbCcCto4seTRAA-U39v1kV7IU2_3k24M8cwY2c2YdUDQvQviO2y0TAX9poVfl8zSBkRfjYBKISkmGxxyhCV8yWSQRhcy0D40lfKccxek7yfhmSNOOmFxJ-KpZ4p1NIkCIS-RHkGAIqxIuvWs7eoPfJEieo-VizkQT2aaaWrBaXX551E7-g9uv4TWmDQTBCvNDL4QYJzhbNBFdNHM6_ltGfDv2rEfq672DYMKLkzd1Hj5rvl9P4ItxlVXrRC0aP0ux-E7WV7YQq25_hYf_sWfgOaVzQMHMiVxsxFZPCFToSDlyVviRTu5N9Vj00mLR0pMie9S1g0SoxTNzChKe2F_L09X4JVtcgzu7k4Iqs5U-JDfcv3cLMNoSeyJFi4Rem5NSlrZqQ-kjbjpGl-zWOcPPtCuqFvWg8ajcOHWCA5FDzXR9nXVB7rPTRid45ckiwqVBhgVnN1WBCv88WEv-L4UX3y_HAzBY2jNCW2gykKhkJ5MrA4Qze2IFOewKXxgsKbkUkhHx_4I1CFOwkoeIS77PqVPffSvT0DCMF3mXRCqOhESbAbrpIj4FHD9TRhakPrG1IN8j0TNEHAzmgTs3K-NPEWOPIKayzSP47N22hDBq7U-5aERrXHnXcuaOi5x8tEVs1cntZK4ShAhRiytPvv-RCTfOUBqr0M9fyEoUKzkwt1_HXiNfKFstJmV5KHXU-852syzbe8efO32rck0o0QlGJxrR2CE5K3EebvuMsYkr6nHmx7L2ooiNOsEKTodn96qGLHyWSClAMboNZpUkAGAcgNmO7Qileb4kOlyRM_MDCFDaAdW_K_3V5HOHxi7FPNLoOk_oJ0mSETfpWMDdXo83-G2ciGqL_WjddbIKgh8mubvLCpUVKO4YmyNMi01TlKY0DkYT-ItRlAYYO4n2wNUb90I9rltF8hOlhk0eSuGMR9Vkx-V3M5OHP-zWv6P87B8KBAMJQc6mGQ0xJWweEkH1pv_CtQ2opilrnLWzjv9ADpzqTeZ9jZg1EyV7Uzg2YEZgGizgufrO5_ZxW1mK-jZ3Hm3uKX-rZeWnb82GXl1P_THdWFRdPH-PsDb9dCL-uIyHf5S1SA0HZs5vDmh9UR6uJFn6aCiaqEwXicCNUKwEZampEj4nqdcRToZXcGUAVB_UjiIjGmY3obOPU2sQo2gybXlfEtZnWIrnr1JoV_hz8rBugKBwJ2nnRuN4SOgTlLEJfRRTLFMDwubntx3DFVFYweP701o2k3BuL_GHS49f5dppYCm_RbYH2MDEUEe9zekt3EvAsb6ZqnEnYAYl5KyiDv139upg2Gk_Tm0UokEuSRIA6njRtpkivYZtcsgcGL3fxKuf6SDrMJEP9CZcO8V3HpXeyqd9W1Rck-R4tWl9IkUZs2gvsmLLnoqCVbYha5HFRk2WgneUZHRBHpuIDuyZi2-th2_oZrfoJItrxaueN5Gs-9Mj46O2Wz-I5PTYjXVNC0EaffSgZUYGOyLjvcqwwba2DIJUEMkGhCLuBCc5MMt4yT_HR211-33UzPjZnpAzmZdbyjpnnBciXOPwpPcHtHvOeUD4UQMGptwnQUdlmsV-PIvSENjO55eJeTT2XntMMQp6iW7iwtmTgyDoigGPEczCwC8ibB2YUjhzlsVZmzZMeYa2Vo2mLnYqpm7pmmAVcAd5ZtEGzFj66YF9qyF-QuSgFRjGCWEi_g2jqY95146D68fsHIYkjNnLKECTT5073NdhNnqU_gSrI-7JoLzwffgHGgzekzT8TT96sfN3aPFHPSxwc7763Z9GwD-wSVZwxYbwXYCa8VuMtcsocei_qFrhnKCA-WrwTxreOU3MnyY6WjUqBWzq0cYSFs248dDQPuS07NnTuBLhALNO6zCD55_Xa6q3Gdlr1mbQ_dpAK0p68ROUGTyTE92X1cPuAAHC6fzPuStrZFsH8cIzGhpswNppHIGmH9fc5enLBZ0RwTLzxJuTR2hgk1-JX55JCSiTuGAbMkoYlCjhS3cJTLikMutU4kyc2G3N-jbz0Ai4b8GVoimpP7QqUv7-m0d6MkzY-QlCihfM1y66Cv1ibywR3aS9ZaYPP3FOqOYar_fwnJHwC7PKx6ZuvvvmF289wVHtI2lppx1lZe1OkUXYfnmDdU_N4GnGwlXInSwNRxo1B1_LvmuArQmvBZE_Cnjf2wRRyW6wQvncPy1oqxRn-hWa_5ifXL4ipi4LuhfcuBxCtpZvlG8ekh5bTUV281NEu8flIFvBeo57lurL-G3J1mst9dhPk9epSlxfpo25A-gE37qd_Lrrd-1x0S78bGojnyc1mYbxzTPzaRfOWaMAZeOKPX6ma1L2s1DqXDfwKeakD-YWW1PczK7SZp_JdVOZsmW8iF-IqDHhgUVi3aDnQDwmBYxvuFWxCsBozfoBkOChcxfpPwnzpdakLofED2gk9ibReZS1oaQWbZwWrEnadXLQK5geeelJYvur-IC71y1ynp-ZpQjWYSmquth5aGhCjqUd1-SR8ij8O1XS1esj3e-okOh2CR0LXW9v7MBqjqY5uEuUmTc-WWTCGTnSsEjr9R6axEbhfz_a13ZaOzaLHGE80h_CIT4o6fkChJ2PjZF9L9i7cyjwBsINX5REA4AmARp922bBK-vCUGizQ8pkUOitvqCCNc1tYqNeCw8iATzridrXSnYxOdPbdyXJexQtQGpA6tNIOShDx-lcHzV84oL0lLDmIf7mbO9U16arLl6Y8pJDSwXBPkgQqSQCX27fMhUTNEjS5W5cBCKG1mrKdhKzh9UF0PwoIs5ZTs2XDkB56Q-IXPxpp7uHpAmsqu7NoCdlwfXbZwakxvpu--QTewGOUsF5EA5Xn2p1fSeYfRAI1S7vZBh2-BmMj7_dOAHpU3DmJ63G1n05QgYElThr9ZwNzCRxJQbKNA3otEnq_EdoOVj5JkmqWfR-ei5FF8cgEjRMgWR4cG1F0VgDlfUhTFPb7yc3ol1Hb_K8Ikvvq1c3sVnkbJR1xglojfqCDx8a7nD6oeiSI7KfhWt9SZHfmJR0omcKhJo7oMgx3tGEhVoJoO6u2zFIhmQOAT4SBzpZHiEXBGgkplHkgIjqIUiZvtIceLegHIvzT7jrRIK5W1I1dyqixcgmMpYo3u_oFjNN3jU-x1-LElCNvvH0nWD5gDPU3s2BD0FIiyOYPPwmVA9i_wDYgx-Ncs8ipWPixbVXb3TGT69vBrsXS-1PjXhjvzZisPpt9-aPAnDpT0XEcD-cLKAtwDQV0W901MrNcxriXHTDwi77VA4gLJBZzB-j01JLTlNakOpxKECQUfbGAcxKwEK_zE2ybdAgBWSb0ikWWhgQIvC36QjrjvGjJwDSBraC6YOvdgjcLlpoX0XajlSlQpn0ZnVCuICvVsEaEM3KJ2-LweJejaWObTNzAT_8xlmz_45vgrG-0f8hi7pZ4o0tdzOYvQbCWjMf29RrGdLH4zX6cr76J9-39v0axzCqJ61n0y0CMNlCu9QjwpvNWUvxvOJqzwX2uu7tHO1PmQZfzRUKAjnhTFP_woAk0sGi53Fe82wjSpJbTD-uCIRA03MDPepQZinM3_kVrxbomj-wn0fqQlfWqck2VxRr_K7y1sTR6nPIBeTe7GgCEjZDGScQw9H1mtD5tfONMzPAKpcwueSeCYuqO6QsYlzZLTm10u7zjzcqekW_ZeLFT6wy3zTNTyRqZufdsBmpCvC78OdpjUAjIUTuQe16Dna0EVcEN123cNuoYAgQChmsEvv9pO4TrwiwSoKGel9n07JDu_OZkQu3iPtHgASqRYKg_tpWVPd39-NV-HjLukvXiyBQoEEZxGbxqyl6bbDfEUch60o23T-qvwk_8sQz00C9bRAXQnwRzhFQjHtX6otwJHoIORNYrFsP0W9P9PVuUF2pbpwzxHyjJ35eqXLC36XvWsSkrtg8HgZVHFxdX4Pw2dIYi_L8JliO632cJhirZXOc8_C2ThcOfUqKrJDZCtrS8UGYFAfwxMHBaAJfBUOWTjAwtfHwlnOQiGkJ4Cz-bgeLUweX9OpOw2PZZFcjGUDoYhg3vcvyyoDiTG_Yz5qSkIu1WqM4BQmH7e_1Y8sXlFItlM0VAX5AtU2Oh68fjdZTn0N0hMtIg0ZG12V3VkBL0dR32KdNexaOx3Dw2QiSpWRo76NJZ1toiu3g_NuTK9TavopHeEiCiOjilQA0z7a2QfCyQ-QMFQ6ww5cco7TPqwqtLxPJCID4qkP5YLPWuWZFSsTbtruDIZu78kC0fq9pyzxBersYd_7rlISfFy3cZy8RZcG-SLOA3BWwzAbttaPwWzXdgii042Zf_gMK8kGBupc35c5yxxXaIle6dnqrmsLzqCS1yKeqyOqJZYTmKo1ZfYWUWOPcsvfDSz56Rg9wVhitZngojGwRwaUCUPNpSbv4w-BiWFx2SzUp27vYGRfiPf_8q0koR6Qz2UTGpN6BBPcmvRddiQkKe5ojePA-lRb6eEX9DRVJbyLO8qzsNfDdjFzPNl7V4AXm4h9UBt7nG3eGTvxzaT2yH6XowRX14_CSLSpPFgvBvB1kRGfg_bAgkF26oP9YIL_fIIBuWM6063oj5pAM3ejpa7OZHCpU4zSt1d4Nuk4yU9B0mlvBzouSHC0W3t599xsdRCfQkAc2-ekKM5nual8TK79Lc_8bj4wj--znOwnm6YAUvHE9ZcasbEKMn4vh554ZxZqzERNodLLeMMIvYK6ZEZ0G5ufizmrx0D-_sruTraH74Q0vF1s2zQ-hgNf-4YsDE4wJ1n9UkUab27VoLK_kaOEQj6YrlkP6jLEAbobP_VYa7HXzEkWaH8yAxmmO0YQDpIae1j18gELvY90xPdt_35XWz6n2IzB9kLq6oJ9zhzxPXHXhCidz_3545wqwObMmJwW7Kx3pl3ODDI81HSLo0vYDWaYThUSPqhcdU5-wI9eNKJHPA-jz2INXO8lVxvFN-R5VjKYPLDYOzzpfbQtCFE73xqlTgzd85rZovC4fJOtfqFYDENbtOLVso0hvM1Jb5nk-ZGA0Xxey5aAZNOUgplA4r0HL2vQyxQc8rdjFiD2Hj2JnFXVSvsfNmtfktSuXmNjxK6tQsF66FzC26MSK14K4W6DPDNm_GA7W0cj_46A3DO3071A9PsI-wWFfLc9IGrQ-QI4kJIsdtw4lfrNJ1Aj3xAgsWHlCBDXZl7iVCKTH94KYzN_V_mXi3-QgdCX-OkIIUfC3sGfzKGG7ixp6BwC60HYlGY8XMUB45JOQuHv-2Q8GaL1jbrwwweUGg9e69dpOcemW2l6_vsBOdzWsqzBkREZDZ0398i6XqseWW57D_cud0tKAUjKda0o5-ibeMmSXyVdVkTyir_CFJx1Hxv757IXhdxQ9WkUCZkV51DDBXVbEKzDCTaep69886vJDOeJCK-yYJIwXZfWOI3QIOre2YEA0Zbw2Y_6CVdnFTr3IXaVg1eL7oS-GEh_MNWWaQLcECLNjMSyc814cB6hUwg0m85Ltv89OZV3o1K09tuY3QtD1s40donUm8RGQqVAqLnTbX2koHONj3KPumnw_OxhENpiOZVQJ7cm0WQFjU--CtbgPrsgGbFggkMeUD65Tt-5pMQJ-4njF_rABDoTFb2MRlUJBjNmbpmfHmfERqIfnIG3VuOblsIFpRu03v-CUnMEm1XLl6_rgCACv-a312JKi5TdnxS8FNeDYTUv29JYwkTXTns_ELmW7Mns-cPwXUKDd5KKR8LCNBDxW7ZPHfdPRpJX4D-yXJnJnyTLt0W1phjpO_pEmMcd9ckBPmd0sHAEPXSdyRKE82hu5cDO5CRsSTyA0YqVIhuc1IAl_zgp89pOCbYLMBAh_deYaDwsLvEIvNzVSo9Cuj1j6TNmzPJiB159IMsKpFJwKsdAeomnUC2qJCq62wC53MGAYjioeJ2gSlTZ-8G1todh2w7XLFGosMyrnOTkfoeIxZKo9aU_1jUfnQXm8lc6gL6SItqVW-1C63E4fHlBNcMQOutMTh1_PRNcoc88_2LO_CsBAwWY8lwDqFXxGJLKsMcb2BHxdcqEXwL5rHCpb82Q6jKEvwdetHngK0X2LrxuTQpIHXb75yRkCaY9iQnQFfxlRYX-gKvdu67Q_r_Xw5ZVuZTQmsCfoGhZSniHIYskB0H7c1QBvf7AnhJ0vb7QQmlnbTkozmk_jtsurctaP7RIewJ6fo0oGAfdQ6-kJw82ztyN6MT5T1At1MLDzYzg_FJAqEGV-HCZ0iFlIucUrsByu0nOIwPDELjK3AoHrYhQBBZ6K7jznvShhPscFnDFz9rGKGokDUSZVRdQq7eyYUG9hRq4GbrHdtH0R1gOFU3xmuwI5SR0N6jiEPOUc13wjHh9XS3SSiaSXtTK_R6QvYFQftMoIt934CNTXTAVR7RUB4jrPsovBJAv9CNPTnEWKKCJoCQM6KYgCN_Z3a45Ds0-zf3kQ8qKnwO5F_l_tYUAqJqs5sWjVzK5hDorquyo67uqiA480Gs2stiNg3XeYYUN-2P8HryONaCvXYKLEa4PjWb-GCZiRO7-s6U9QFosHh9InOQsUmUgwWtnppJb5_a7ODQJ2VJKzHSv_181Fk7-hyfcOb1Ci-BfGhpprMGmlaHiBwFK1UiOvw0071RhmOS8nFR8MMItGbzqGdu8cE4gMslMYoyEw38T8tCgxHmiSIyVWgLEiY92E8z30u7CsSMPGhSXHkmKHuHHiD-eR2Cfx-Ne6CHRki8WiiIXtp9xP3uGbDlvA7aWpV1hEaPLwlynsd_ZB9DaPFHY8kezwiE7I_r7kMtS9MFJ7bqVN6ivYokfmOcBqsrq4zQjD3kZIlcC_8TOpkSk92iZgHvTHG5cBbOVXsvmatcGNWbjLsYjan-YyZhTuBDrzOhWqXMPhXg7S9xpIMQ-JtSvMDe8PA2CuU8K9rQ5dKyKX1OoxZkubw86w0bXYI8j4Q_Y7eofxf6qSwGylZnk-Tx64Dn-gqky143CNvuipI4kFhFL1FOGVtIoB-ajPqQFVupVbW5vINvp44yGSXGDwwucqutoDgNj70RkILaCisr8ighSETKQSXi8s9s72ijm_tTCMFteV_o8MWV-2YvENH7lbipbq2nD4V3ZqKvRvpl4pdGRweVTkKwxryoCX4u2DOewzaj6N-OtBQx6Ecc0Uf5xSN9t1Zi8PWn72SYIg4zLjh4YOA5a0CKjQFNJPgDRGYHI_BDpmX9OxKoqOMGbHK-HWP6rWzOqV2V3cH3YU5tJAjhImlP4t72Y8WNQSr1XI-TfKzMfQZWmNfa3fQ7_o3hJ3iFc0XV8GxcviYTRo1Uqo9SA3RW3bPjD7E4nqZoX3y3yoH-gBUrQ4l6eTK9T4zbuP1zl0P_E4xJBjIGq5nUCej_B5AJGlWHCCyawu4E_Vd7iWkJLLIBgqAHURin1DnHz7nGbIAV3KAiBTjEUNhSDNh3VNt6Mf5rG-wj4DwE0siD8oahNMBMNgQWpZhGJUv9iSjmWxJJ9CL0D3dqqM8B3onXAyFAK5aGZDMM31OUF5t_3NiinyACHL3GjqcaMnkpfelaBcjsSZy2uiTZwCCAr1-zEiGCdgb59hVRTEB-CrxEYVHMPdW5DslyqCEyZXko_4zL96snjEpJ7NdIRugjtRiO6vE8g3j2PVnz02Mgn9pWbYlMgA2AFm21Kdaza4QUR4RpA4eNEOV3ITzlDPTU79-2RMDu3U5jh3ls-HCeXKmloqZaXQIo6yRPXEtBU35ytVNW_Hu1A2iAMz25YazptdHitYgDMf5h1E34-BO3DSAFrD2P3l3hR4uApqnShx_4Cf4Hwj6HSfXvNlnDI01uSsLW4E6I2TdXR-Rm21X7qKpNjRBfW2AW1RBLVaJlxXeB32JHYBm8raz7zFbtbbjMWYMePuENDoW93baGX4fJ76oS4K8AF1Jy8tkPiuegxvRxUFcD0JKCZhk-wCw1YbdqD10Qwd8uaTvWD4Lue03qvHMo4R2LXp4lL-AYrxaoCFHs7y0uXX0ilQjSqBa1OLeQaHYG112jnRoAzs7NpWhrax6jxDvlFVwuIDVQ_752N3ncGGZospZncJer7JYJv6d168pGdCAV9UVXW4cJzJ3RuG1oTEERi8x6VjjBdULz4jWcebGQR2R8SOG0rNYSEfH8RpMq7UIy9koZjBPfn3aitdlpeIObu3vAUd7i77Eu0GrmmBwBzbUjDSbDgihOobRsz-y5OappdHO8mzP8LWws-pgcRSAzuYX7GZsu8lWbDS3MjrJguhypiiBL5Tyn71hK5pSeSccU_khx5h5TpMge5Lds-tGjieSp33mgQmW9BqmP2PgN1heyYEWy0pIr3F3kdVnhovipkc-zS8Oa08jxOQsjfIZEVJtJbOQHf4oXPFxt9mwIcxLleuCzopJJqjAKtUf415VmcqN9M8EgjxFTp2vxvQ8Mqflr4hFPSmSNSd7XpPsgYB3hJGesiiLCLj0SLrUhqCPnI7OhKgX41vFXHZAkGWZUzLPL2YrE0ulju8mu6IfSIl34N6RVVRRHpFTHI-W3kAUQM7mHZuewiOAP5fg2qQKis_G3pcBNKWnHi0YJrvDQmGymgIDYnJZ_JoOm53SYKeSlaCtqbJZc-FT86cPANd4OXrr7mt5JjrPkoy_JNg2YCdbo7Enc8YvbsLrskxaWUoVKFfT-6i4OInQCFduGii1KudCI1zre1BsGugJm_h0Qz5HOA37J4ZJ3xGLaVzv0P1ig43JktMBtslSIlDU4fRGNIbkQl3TzZSPXu1jxE5mgvBTAbCMzS2VH1Ybatj6ImPcoaKzgcXAbsXEWrDeuakcypdIlDMFGw6sc5IqpdS4tW1JRwTTA-0JRBOdViBH8GRrH2uvdHUeQNPfRsQb3TUIq8jIx9TeALDOlPxxmroLB7l7YlNqYmTElnSPQnBtY53YUwJNU3Gr295gxiQKGyf3jqFr5oy7Njgpw1PpEKLwXWDSA0-Xa9TT4eAOue0j8CrnaGBQUfmNzMijVUob05Nt8gotIy6XgVA2jSXPEIjVaruO1UDN9FowsDKRGM9mqEQmzmb97evKaGZeOAxFqiTaEghVDf-waUkAFT9IFnci5r1sFFitNc3qRYcepwnWOGU-CWJg_dsBSeQnJuOPlZANSvtOK3vyGvqvV2M-2fvvjoKquKiQ4RA-fpr3whBodFIKSxoDSh6bMt73mFlhEok6KrH3sAGPa02ancrkiWzWQuTBpyL3tPfuQpJZ1YlxbRn11VRMrbHsKVms-FoKXci4avRQzsS7tL5LdEFgbmanXlVCBZvAYr8yXrY8OFusoNItGmXgQqBuumKD-oWcMtpYtMj-GX8Jzb2kBZOIUY8RUscWcP91LWTGJK0GEU40Jmee9cDpyxWQSA0ALHqMVyty-ZhLxj8AA_Ohjs1vJEsRcOm9jQSiBmBjXLtGGcVKWtrKjMzHzOqsSEUIouZeHrIFBI-0r7vefWyyY1H1iHo1OPpbktJ6QyjWchTo86KHtTZM7WYL4n_nt6JsJQbfAqR1UmDohq9scevENlodRhjpme9ld-Q_UEycGWRsVkDlzZc9LzZIZX2I_dsPgmDWjJ5wagkoQDrwr0p-AhVdxNb4v9UZqzolLVrbM0TYHI6_E5YyYgaOe7ULO-Qcnc0Vose6Ohs3L1F8nRfr3ynTprqLZ-JuXvaZfXdExn5onycIB65AbBkCU-znFC8n6FrSQlQo6EA8oTByCdWzhWs26bGZHmJpsgc5u7mF5jzRGFXr-9X9QXOkfIQAnIqI9yhkz7Hlq5oOeaa9CzkqRK6LvKVS4VJ9BHaBB92PtI_16q7Vd6dH3-BdEIn3deVkTAapY4pqTkKBITxzLLImbJSL3Et43wBrucHR_B10-z_2aJO5z8tsje7jepG3dkLwT9IX3YBkbvP8YZ20NQbBmP83DSHzXYjUw-KtVgw3ehyCi-otKctcQMt6zji508qKVLPtZA36mOR4MPw9t5fEvLyx_dV4YW2PW_DUULZDVNYOM4tuKvYVHeavQ2IT331CWR_xAT45SkmvLTd0ni3wsc-xs4rjlZAWSRLRVzOca_zTFI4a6t5guq2U0fLptVK5w6RysDetu2Ec0_OvnfEy-I14kd8CeoEoFJ_x4nUuQE4Jxh5gfGPy-fFRi13ZuUOrZWfdoDsBhA9V7xKr6xXUhqdYsOYiWlU85EMKCBm4NNi27YZKvKF5787Nfmf7tiGLvtNtVV-9_OuIBPiOo_z3ZIdHSYI4iknrlOFGOZrJGqVF2HipTBrMN4k7t5r0ksGjvS7fk0y4Q5RlQ1dlcWo7re3Nf3r7xL2k0NAX1a1FbykmQo9nB58MRFNtt7y5ZKPFJCdkR_WBUOzOJY4bNB17Vg2Uwq0CnWzsh5aU-IXJzoV-2wEX-HwfDIygsJA4mavhT35Cv9sSPoPE0qVFgPsx8NKOiz1xp6vtzlIeRYQ5WoXsq5rsMLp73G_3h-ejE2xoDCw0XYXaWMM-0TDP8ehKY0piuwbT5p2tvIYpSPRj6JbIADt3rXLON8IgARfAUQGeUjNaj3mD921a9DNZIs35jtw6klo7pv4RFnkm7UFy3ma3rSHWypvM-P1jDyCPR9sEgcFokorjWBjxSr7aoPopjzmGogLEkFEYzLzwdlA5TQZe6BhIQ11kjAlNEm0n0KULHnXRjeoF8CfEFJFv3ZkQ33nagBMvk8_h_YxaUJUIWF_ziC-ryFhUKPzd89gGPILp-nBm_PQn_V_VXBJRm_8ixkV9kpT7M--47XZsuIUZU6qoRW3fsjS6WHB4qgy10eQkpMOra-xKr3gXxRB-9CJpyW0ef16p91daQypLsjiseWorWzW31b7av_IOa2X_IchkL-o3_cM_rp-OVwwH_pzAIytUNAv9aNyoThTDf7jqDP4YQupJKJVNuZ2omCfTv3XOteEolbGVDhgzy5fA_qOaFDFicc9vz2oXa9xJlUkDsHkjxfWSnAfmq_sIGK9XM-UROiSH4GgO1jbt-nt8urt4whLSdvpU5IIhVrBk-EIn0PFyBvqMRYFC73HNdOJIgUzp2FmfmS0UbjB_OmeV6j-jQjiW5oP5eCatQL5BTj_nxgCoy0BZ3Mv1EJ54DmlRfJf25TeMIP7Z_zbADn-sv-8PDhXXrOpsft8KrtfpREjxz4K8IKNK3q1cUIMBEqtH9506kEyVe9PqLU1e7tMiYffvkXdt0y97kyCTuaaXm0gmyt1Nq8vD8sucga14mqzAsjwA-WogVG1WYJP211hW0tEazsmQ18p6RkiAwmc4R35KVXslxX7yHhHH9SiAZIInivZGEvoViu33TBFJPwR9mKMSPeAeo-oBMI8JO9E3PHKGD7t7kr1NGHdXZ58M2QmrMDS0rK-5wSYMkm1MyZ9LJEG-nh6sXh-6hSHWSAWjvkkLBlhcdYusm3zvuuanTZ1QUs4j8QM5EtLpeH4DRUgyeHNZVe0kxFoAW9U2cJpGZ5xYyBdaBUq86-5W1EYka-gFDOCQxgH86QxSTwviY3fegNruKDYtqP2vTSTk8KhmAYn3yY_UcpAGcef9Mk4zHFr_Q53l8ze5p0zZ7VFqFsAklEPe4f_nycVF5sC91mFfwQrq62RGzM64dbtZ-Izh3mTgotNiBiSb6Nzu9g5JPuTnDh0Xje9qPasVujLWLd7xi_-gGgz00rRORD70fkaigG3sU4gNOmb63HnXUxrgBTjL9Ipfp1KUMAbbQTJMO-B1d2qM57X-tAaiTK3GQfwKj67ElLsBZhy00JjIOMz8p_NTOdrOMkP4IwNLjRIti0s-umexTDOWZKWAbvzxjYoEdbK5oCWacDtOxrgStHVI13yoh7s6S5deE4FWJJMSNhLM3m3a0shEWykgx62HC6KAZMJR54JdZ_SNVzaaxvDfpDqSiHvSmBuiRVDN82q34gXD5F-LNVJy98afL0pT7-c2y_z8NMq_Zb6l7WPps-FlfegoqX61re29EM8apuq5HTXEbRmvMv5Wrxrq4JbvpnlbHTS7-UUo0Gxsm-GzDwju1CczWSZ4Kt3uuzz36nDjSRU4i8D0at35W15ysEqn35nTvWvXLwX7tOoz0glw-7H-GkVBeZlL0mQ4QnhwIK5oyvN-ZNWhzTqzcZcWbrO-bdCUYwQ8iJ_H9LdQIskj_SYi9_MisQqOYvUNWRGwJpCrUye4KTdWUkr33Gr9VScuvvTUyZdScg3NilDVuz8sjXEIlkRkYCcel8Bq1W9D8y-EYD38eaVt_fEGbPC3TqBdnKnhjSsfJQVOH-sXtzFZrbGPVW30ahahhOXQiuSh_n4ZhtUGFgyhFgSedgt6gmqL2wvebWAPZ7ENxyNjvpVJ5ET7qYQTSl2G_oFVltiWhwBAIbGebfiQYMV8E1s7avs2kJsvZArSWo82y8fc98GWhd258xuZy17XXvwMYrvNv3B5dklu5wfqeudu1EucY8dFD7IJUVFXuQgwXoIg8YhRNNAzRBshXdPLvYXGsn3UOAh2rnQXKbo88uVRiCVHjDkxTjf_k9fQZOjUITScyCFIp62jOxQXs-PuniZDiZg8LaU4Hfx9u8CG2Oekuqq3SOzH-QMaX_M3W7N3Or-u2NOp1Es6hpSnJxPn4F9bqeMG8dchDhiw4H7uYZvvFOryO70kzzSaBby4FvEMZ0rnDH9uAr0zRrx7vGFn0UxbD6qLgOrRfRnU_DhLSZw7Lwkh7RXJkL6sW6vtE14CJbM9zDHfZVbv3dAwOcsaaN7eyRit-RU3n9uk2PLR3bMzAtK7nbGLD1KnIFtAr8Y2FYzNQfCnTpUA_JUWPEVNFxF_xrTEMIx4RFGUsxYpka1xZ85UaTrNC-JvQlPrn3MmFnkeLbd-HLFCvaPhRHf4lgKk2VNWuJbqKoz9EAwimjLR3E5AST7JrZM1SnLvtJwXXNIMmXU7gQLhFBXQmOVgN77InrZTxHjO3k9kY3VvVApP_XDrlbDPAqnL4J8c6rNv_lMvc3y0n4GDQI8BhxBu06-wE797bViqorIvbGE2YEJtCpRtIeaB-jPtSWfJXk1ljQs6EsQzQa2MamoQn8stVzk6gXML44AycXhv6k3sj-9zMWZvPQ1UnPy4zP5mcUKxYaZC5GBnHyPSRYWmBj-HZDM05RJOJUlJ1C26gu-GCfvuVFsW6NSpMX5HCjD3oqBrFwknF66jf77bfWWFNIFfnN0YlPsjK90-100uyzc5tpQwp0AsXH_rcbGCcnBG7wd3_Jt9qA-J8YwT98f17LHhf7sll1bWJj6sSMESBVdNcNoz5-68DYf4SBwpcTw8VrMI3Q3SJmc0u4L0vd0suu8vJdhE8EtxYNINTl_xm3BxHh3L2luNnM81b5yFEPXK551NUwds8zuaFqg7TuFYYdIPFzfCruSghoL8PMWoZSdWThb5EiT8rgeYcNjGy6ySo2nPgVT3x8G8c3hz6sGTc0M_lYCu6vaTN-9Yq_LT63ZG0gdS_pEAkv6TNb4Uly8x590nxqHRzzp1K5KCQP-J4Q54B5-6djys7LQm6W5D_4fw1bVBOmRhYpKJDcNxkdRxpqHCHnj6-qY1C_YzHdahHQF3DnSQE1D8P9LZ8TM7MfcK3saWK6Ax1InxSv33xrEV1XJWGpjR4FfRhvN0PWobVUJrr6wkocY4R4wj49yVDfI5aJd_87YIs709JjHNI5lPqWUWGYH1N6qUwrQS-uyDkj2Tk-37tsgG6FLzUDUyKWMzosCvKkNjMSqspRzPXdoXan1qBz2xKIk5gD06PTPltV90ZPuLsSfljlPSZZck8wGJqClgD_pPQ6XINqF4Rd9vS0Uvij-fhSZIiPgxGkB4hVqbETMzJ3z5bZ1DS8EqJV3QOpN4l79gCbMmTh-u25w3aGmceUgFiVROxYAi97w2F2zZ_Y6GlRYTfScMIy0Aog0OHnI-lUBiY5TAjANzjv84DvYtPsvbu6F4BPcvbXeKqkDKMGJ3isC8omH5CmfL_eugD40UhVyZK27KN33YudAuBoB8iFpd77zkqGxlna65DSbiXi4VH_H5M6z1slkK8jwBkLGDIw4XWhWwBKslNB0nSrVgfAqVcCLMpnz23_TJ9-fr9ugk8aDd47uwqxarWiYHwcaN2EiQ6gNWMgWhlXDG1dQ6VymBjKBURTUQGosIByxy7WZVeAyLd-GLOmX87V0k6FAkYCMBKUL9PCZQCyRvU3lxHPPQs4__yY9UJ3fQQm_j5hxDBZFoR8pp_FhIyL8ocuMybY3zw0s80aRtP-mkHNaRfnMDXWzTMhWSQgcgt7jHCuTjtwoXwD4Ywk3BWUMq52E3bhhwdCCC-EXhkORI-GWxcbkzb2UD94iTRBTzhSH4BmvVl6qCIgAmH7U9kKcWJGg1uhQF-StCD-QFZjx5xQGAeQkaFtqA1vNX3pV5gnLZRnvpFfxzS7mncj-aTeL-nfngTyofJtLAPO0shpuzeS7XwhGY8I6Cn3yRA7fVG3VPfqfiapJQqnH8VphQwwYCRYlKPEgEt4BnUXePk_AY1ic1C7aF_2EFUh7-oBfxJ_dK_inZDeBit7Hpc2SXpnPRrGGOZ-_BpgAz3bH7QHPLIQ8a3tXmYNBc5dfF7KPlg1VxQMWNVtVRpyEOOOSgqNlvm5Af6WBx7xz1ZpBs2UAhKFFXYHHVqcWWUMXlFwkaMDLrLJmUJybW-po8_kdZg3Hb36lDFxqHvebQtEQ8s74Iktg5gdCDAuoTPA0CgecXrDGhGA3UcwTZ_h91uiTtHWJYBVlHx4E9aZn86uGFIK3pezO_hScv--_BlP54xTaDfha7fzmvfANNst0qh9lFtM4PBWtlNmuKBgf-m-zOVvg83X3OtUPagV5KoN6lwSGSnPGHmLKtlVX5CGIK81FdgRugJ4jdfXUoczmOWGOag8IAsXaln5vhQgLRgHbd2A3qgLBVyQQJcGB-quZQTWH8DYBczF0fYfwrqL5BDtkO8zcYvG2vCKW6wOsdMtrZFb_s3ug4nh5BGi0lB-gg8dRW6Ig43ynQdGFNyKsW3SyqEgMcRoUyjW3T-DNyZDhWJaSDjHZlhWhVINhxO1mPn1ujw2Cf0mchuReA6sEM4aN3zukEOZgX2o757GIOLtzCIcflkLojGSTymJ_ktMakoSdH0BNlSwcokx-ybWG3bGuLLBvJ1OWC3M_LpzyK01OvVaB8EgMmphmkgnrwji6zIPVGJrC0s-cHFpR5dXZHJ7hcoBTgOE0jRSAuYJFbok0I3f-E055-VMbWcCyl-iHjKS4qOjB2pwNNA0iegyYMjdYCXtCh97CdJTXvnN9yQ5E-zXJlK7l7T_YuEq9NZmMQBQ30Oc0B0XZXznJo6XSChk8uIhCJmKN2cxZX-mUERFe50FtcIEkhDQCpoYsj4kKKxpswg2t2aLrzNWrIAFWN2YqUF7HumGUhaDU0OSMbK8ejPiTljBwN6U-sF8F0-kFZk8m-5me2r5At-cxOs8cEkhwQ6_X3FzDIJL3D9z6h0GF9ddIX_2Tey2_ynvbnUV66YY7S32w-ZmD9AKNL_YiTAJwrZ9tg8SstlSALxYMOY75wFoBSaXKNmn5tsXkHawr3oEAdpr5hmP_7ev2cmeIt-ZkyRgLjZiVBVsA0StgZtrICvGbHSHHcvur2tEStIK1ViWb1wDZD8Aizn_OyQzNRfx0Ja4-TtSO90CIVdQajVImVFFr90-H1TISdNU02uknonkZhVdMCBWSF3_pEhCgDBfFwBEB02UKXy267TlgGU6d8_DnUhjuoH9uJVbOHYYx5DvTqkwQTGUFddMPhyYL4tDy90F7NmX-t732zJ3qNqOCu7solchOUYv7K1wQ2Hl3PYkWvX43LpJMcaXOfIliwosuc7zk_qBPIIjD2_UoFRcO0Jtg-3vwsd0Cu6GytbL8nFVEOWElckwnk09UjP5v6EgE97X62gSmU47HZY0w6JT8iRXMPof0UcAoquCWkp-a-TNmiUD28t98UMxhKYJWO27JBsRvo8_fEj_6jKnsdwBW5uJieOws7ZYh54VSFTkIiTXRAuMV-aqcHbuK6VQ3qoFUgwstIjKHTttxWbP450MecsdDacC9YATWJX-7C6-jsfQk0lYVrcQX95OCllZt9Aa6sGuzUsY1-mORF7Wd8bpx-kceDVqoAmVMqJbYfU76bK42Jv9mPbEj-T0vVubjOtWhVQKhag2JIuLbIrCXH-Mj58ni1pXsb3ZaTYHgeP61YQAaCLIoJD6Lfr9bmDnNSNnctA65zF8BI1h5zxDvI0eHZsdzkH_KpIx4d-dLIbe1CH2UWqVGVfvDdFnTWUT_dnb173ePw6bIXVsBXsAqGormxK17HeFxV5Ekhd8FxKPoOx9Oi2E9fmDms0lUJOH0wkTsOboc-WykFcBCKfff7g4kH9OUqAHxhsZsidA9KwT5fFNtxCMuhobMV0Bz7ThLnTy_Bv1838SBKMx6X-OE28SS4WgjSseUQMqJQLH1gkTEzxcdeAbUxbM3X2KhfE0AzFEtWCQtOLsjXz1n7ijmLajLYEJvUfXGtE0OtkDz8ug2NP7tZr0JqhCcKLVhDhncFUAnapVW8bJZmCcYMBWabVOBXdzkTEGEtIRqveP0FYXYNJgVlsHXV_hDxW6TZ1Bjlomh3ABvRRWvv1vUuc0sCe3XecvUbxfx4Vb6xKQDznoZAGp1QNi4UsqvEs4Ta4d2nUMH_8MX_YePfY5CMfhCxa07QDMMBNnMGFcYKFuWdtPlCWlCOT9kA-sQvTHJotfQA6zQbdoVi9f2e4PGmKdTrHx65RbVkmdepDCfuDnfQyL8o4P53Qp7TagJokgNblUL9VHK-Uqj6e5zMR-QD4W4Qe81bDyjuzhtIpNalxWZcXQc4wo3IysHNkplYKTFYrQ-VYNk0K7C4GZ-LtF4Rb8lpHxhSOOaaYeAxBWJL2ZQRkb3_p8_sQ4I_3TqENDnyL4hRwKQ8Q0gFO6JDgqCLSpPYc-7CwsULVCS5vENiatCWtrSd87icS8pzA_U52iv1XlTOAm_rtFZ8uxJRHWJA98kEkHdJWYPaw3ZXEVt7XRumvTAl3GOCHZ3TtRGD4gJ-LV3SyQg-ZbD4he59VdFpNA-GiOrttCQQar4JXDJA0KpDRpiqr-oE4zgcaZuNX8NjkkcdOy-L7OmjZ1rx6-3iYs5TxzwuezB-Zy0OvfUl09Roq6X01u51qaQAwMuyoKYg2SFR_rtbtzUZJ8Naq_79XScsuWGlel3UXQrgRObriJeegi5590j-1B-S8A9WCOQYpBQnn-QMSwBnRntPSnGyKIEt72tiBVHQNLIX4YvV0u9mmtcTbDsZDjPooc5p8ZHrX93oXRCzNXd66BNVL4xvy4O6Bw-pICVOFyrPvssAAHTnDJg8yvXQ9pbkkBZVtInb06eysHJKbjYxJV3A1ZXEMAaipVc9r0YMcJlMrWccaS9BQyj8LxoBG7YYasyu_rRso0TCQeSBaqJkd2qqU2UihU4tCUDsFFGbqc0EzqOl1j5Kwwx2zxEpVdEa7gzX5dRApEwXajJjYTQeR0P03ekY4TUvPAjHV3Uie2QSK1NN1lFxiNPIYPTm9Wx-3DnxVsPyPDvcEZJzz93wxv4I64E32Ub3tjiR1spTDGihYQIGNSV1Lv49HOhDsxHWKUs-PNIFpYzAJ-al94S-vHLqYGJOc74hN25ihpVsXW9B1eOM8krOeXlvo340EdIHqazvfPGyMn8pMqSn0JvMCLfDt2d1qaxxIkT_V-CkTr32AKnVDUlT11irsFNO2-ro5NZPD8uVExckDL7xoJ6TCFQYBeYKlQfJ00VS2n12SyKMIhhz6aqzDNvpDRX5aOJzyWB6Zi4F0jZMv3KUQVfQL_tysxausVwHG87XazV027mXAa8eEIqBA-HaesAp9bKUeDvaM2FMGTjKWCaV6dALQqw2Yv5R3kIcCVWxoTDj7D-dMviybSipFkxSpSsF8bSGJxVXMVEzIBHUdEYWxWaBlFXf-iZlE6RVyUayaEkgMYkuZzSzKmZzIINxGGlRdAaO0uj37CI51XPp1Gy_e7TA9coWwapQB57j6tDfNAsKVm84NJy9HGb225f-3HecaGj2mg14K6oQ50fqchqGP9EcyMYVZtqe0_NswZioM_M11iXw_v6W4ZX58uIsLzYGvRNFGKRBYczQpFa6xRR5hE871Ohz6mJaV9yMdSUcDs38j2qqe-yIty8ru7fLFn9tIOS3qkyp7TgWKoD8mM2g3Ai-a1i191vvG1-_mSLo-W7MnS42p-aHp-uFE1fiJ4TMP-dA6he4ahl-qcIUN9gFIvcoUofkygVBYwHZZwWDoQZk_r0b1pdNUIXJ1Gbp9dS4KIs4kS73DeJ5ui1MS7zjbjnloBVZyzr6MxYUdUNaHeQp1j6JXrS98uqNEklk4ap3Vr8dr2yXZwLfmvSwPh2k-Vlz4KYJfTialRCgE3cGifPJVczo07pEyM3cYM7r6KCRBxIsRyHK-7NsxKbstqRHSJA4lWLFB5ea_S2RD2qYEEcCQiesuWS9iSigGPhc6JBBQ733BtD-olZU2GiuFic-ZjeQSRuG-mkCImcsTdEYvaXn0i-FRCKYZX3cNb1u7XnHUocNM_x9THo5gQH9s1grnH70UTiKIjz3LvzZU30RPmzhPBDbOaieFXd12-GUzm41gppppWDOO7bo8Vw5dLPxF-no3_HqJF8gIelOmfNcEhL9cmu1C_gcHuvJDDrxlXlUKqqbaFscy8XEflNA4gkCJYaAc3Ou-VM23GHHMaZjmM2yp17HFuOtvgXdOPbfgY7fqHfhKfMQfRav7_2o2Pd1fXd8MkZj-Ux5hK4ysA98cawc005ioLtCPC1ULUR4UtxgFeq-WPxlFr4sF7MEt7Fu3l0I9XlbeZbtK6MJe3xoGj3rHhgP-4P8TwtbRNRZ7xZ5y3KyYSEgzS2rAap4p_K1Cw4NF4znwENK-_uIf9EiUOCo9LR8Oq80YabyqblzpKZl3pjiNmUUyeX3pSSIQhcBUuFZ_u8m5uji2r58O_86_TzbriuYNYMkK2I5ihaxPwbcJIkqjxNx7h_Ey8ALkyZhwkKFppk3IDsg1MwmEeiiG9Nr_s89gT19P_fW3JLnLnz3JUYIW8uFwDriWN8TExxBtqQp-gAteSflFMPPOWdHlcdbjrHl3tH0nhFRNgK5K_RFOdy9QMcdFWeOk_LdmctnrdZHqu49CHHn_rgBK-zF0_p34WiTnlJ_MWEJNaSNG5osW9ibLKKn5QOZa8Lr_KGBiT8zzClynp7EpQNI6C-PSgJ8-KnGLTTebddvD1ij9vUEPB8D6Gi5-oSghl-vcaCdxxfKfw71SCr7CjaO5PJWRkOruzysflyCJVj3OoidrPqtDzp-eBCAOB4T4Bcrn1nYFvS0F05u-rK94rSge6f7mX72NzboroL0ZAAs4LGe0IswWh4tzMcWHfD5g-Cq-qIc2WJxiZ1Tv9SP9RjR2YALTmfZVsWbzvOt5uThOQ28R528YTr_jyJUtqOMnx4LNJP6C9jCwfeCrTYxPCfl4H2QEvQM3wH6N-snS_sdzFpoEccNBvp7YEk1ExxnnwI9ise0q1tIktWEn5XpCmbjRpEIFkjMJIkktI6ODl2gZ_CqM-E4W2O-D5076KBCQ6Iqzfa4c8FY7X2PLsh-grpejtdUxhrloDdwf8ETSIWgk_qVvwMFr7Xuu_xCD9nuG7zULSnyuvv7a1ntdvxwxpgzJcQ-scI64vSpjpo8D_YETh7g1SAQNnaV6bysxUhr4xMF2hkxV55tsWeds1sjGW6tAGsFkaHnNI5Lp8XzVc0GBOscEHGcCsjdN4cxSB_0GGbNwZnlmZB4mnTklxu7u-QtDolpM6mjJQ-1k1IpPc2MOWpuaPDF7HgpLZZIEV24n8Ggqc-0NpF_T7gLUE8iQYF_OPs5F2TtyNNgefinOAzZ3RiqKdW8RJ2YuZr9e5nN_zk_z52uSZ2Gsb0imwtG5vivbzzKRkKWGdO7thwsXAEHoNq85JTN_JBlrTn9LoyWvOdNwKdD-5WKhVST9VGYz_OCfJ2qB_dYQ3Oc-W7v7HypNKtxnKJZneMy8QNCx7GC0njkyXIrHA8mhBdAaHKwT5X_1h7NfIXE58Ri_t_CLgCOOoTM-fPEbVPANdH1wNf-oRLdhjmJN8YtTOFr0doz4FoNW4_gi9SUJs6jHzlUmylz-j_sMWJZy66hRVHY7bUqcHuW6ZWOxIrwLLZb9c06qu1xBAx-v-U4uI_xVkfuWr2avy7SOz9bjhLO835XkMyV6inMIifMnRMmMO_POcPkqsSq6hAAPxtmvk59QGGJQzu4c17cLNwSVInhZxLcwyMt3W_UlxGOD0ymS2QaqlpYAhWFH5ANVHNMv-ZPoLdz6zGiL3b2R1R2sp0_3FO5r1H9Xb2h8uhjgBeALvHuEl4pp0aPXzEHy-DyXx5OazJmNYXvXluO7FuFJOWSbF0FxEtx1GPum5135g9j655PvWFa3NjHtuGW3ecTpJjTAGBNixQJmHQC1CArHhGNWBuMTHQ2X97zlqq1ioYGi7Bqng08CqMmrKeQiXu8s3idEUQ_yw2VcmT_YcLkJmKs0bdzHiuOey7TLapz2wcAutYFIloruyr-BqMTXia2Y0JaSJMX076OgALXInW0SAB0Coy02ivs0PtgjSn8itNW_p-5gxC5kGhixF8x11pAC2gpe3-G5qCnOVJpqL97FueMSGHgtnyVPq7U7TShNR2EQXY7-yPGexbXl4zjZ4H8K3Om3BtLdNss2xWDn_7OdX3SHv2yHrFw3d6uTXCRAf-BD5yASyc-gv0X3RwZqrtfL3hE7WUOT77Acpz90X1mdlSKzD42So1Y7q3vR8cjooA4cJayEFAAg3LQYFppAqPOLa2wQd6ui4lgDfD9m2vg22SbO2dgvR7VVi6lITJgNbytYgjrl7nRea0DmitZApTvs8X-oBs6RardB6f_TYh5iFr0e1HlwNuj0HXT9GFcHns1RAop1JePv0tHAz77cPlkPDmxcI4B2LNNdVhWwnOa4X4-CbbfDkKTvUEHkLoa94P13Lp5RGHrWN4qGscVWK2o-HZNqivKdxPDRUrHHu4JK07wZFo7jUmddoXwy4NNfqCflKYkRg3L-K5ztkdf8amsI7lmUhPD_dr_OdDoPhFEAoWJXdyEiZXLqeCVtu3T5S6rj9Xo0QFFOb7LKaqDqPj053Dq08boZ58MlzsYZ6xAHt0_eEHJAqL4Gcl4DU388bsF652uTe2v1iPVLwHUZoYZ_-Wbx652UdM6cG0P_VO87DIOCA7LQzmnjCRvIfhP5Sl9Xcx1851J7UPP776B_L4Gah-busb_DEuRZunA-mc63lEhTXzVuTteInrT0onTEGRbwGjUtkSbmnxRwIgCNkS7vHqvSucTuGtGA6_9fKYPnWGknEWzDtHuBPXV1TQflBcrChQqPDMNM-HewhIxQmFFmJzdWz0x5S-sdJupYkAqXsDkzSM8NncQSo1ztSGiCNOgWcANV6a68j3knxZKCp2-WJ13S3j4hWC2Vsu4WtdIBQwjGCbVCLMKq6VfDzudkDwaQJ9YJi8ina2L3_0FRSouH0JYeTR4Dy9722NH6StICaAI5j990H1WlKEOn2OT8I0p6z9RSkLf8DyfT7zamjNAiw8wahX6ji-xDfDY3accKU8_FlbJNckOt-P_zIdOI_tl9wNUUqyjGhP_qEIjUYlueNZ031-sfuSBBGpNO0mTXZQs0jmNiwS3OH3Y7DkKkDQw4J61XHt3pJdKFhURnc8TcK1xNsDsqluRsmteQhihU9Oc_hsUfzC5FF7y0q25ytqBnK2pOIXyaxtuo3lz07LXjY8g2uvUH3FG79wgDuPbcqeNplagfEJHfRWN1ocSb4R1QlNyLqzecKR-iDRQPAJ4YxIVFyLL2fpRT1VbvDCQuGYhECY_F30y84SqGfuU_nknY7U4Kdsn8MAnAUavDCwbsBl4UcD6zVA6tMJBsYmjpi-dFtUlLmgpA1-mE_r9bpRDQBeBDVp-yIVLy5Pkf8tv762sW6aB0TOXxTc8mvgJpYhfBu0nM164_EZhRnd1jqdc-c9q7hOILWnh1RB2iggTXvKEDNg2PM3JnIyfzmnLLTfFzKYJWWBuMFj_9DSqKUpyq_4O3Z2NDA1BiVqMKsfXyzrvlAphc_-v-pn-2zWe6vm_2jZdS1qb35Ls9km2urGVeYfqTmpAGlWn_EOSpiACbEO9FStczFIWEv_MtOeNPoKdsGyY_StV3UfSVKvUpMUP0KmbFYF883qzKiLtlJQ5To8BF5vvWdW30tPd_0sgT9RM_ZXWGTb4wiLh4yhYB7oIEdttRrkd_7dJ0kUJ4OZx7-j4eprJsQ3qHF6v3igt99dUY-dFY2DfxKYdPtlQBvnlZ-CfUGGhfoMxi9k_QSL7Cn2K8-kFdbVMGUPeq_nzxHrHFekY-lBe8QFZqkiJcq8Q89slrlfq-ZRB7R6yKFL22XjltRAwW_HWAZPwmA8kNQDM5CZQ1NgARolvThOvJIIwaaoVOzfb1nKNzS4MbawqgpVoEmguJPU-oc76bX_yVnNCvEMgiXYJFgZ2mTxI2OsPewwJXzPKIgedHfwh4ygmtln58B1pDlBDA5I6ridC4vHLBaf2Ji9g1MlSnal_SZDiSG3o_Kls0JkXyfc_cLXcVCcqVIfKxeVyi8GJqgsXadRGW3WcGP21-cUqgiL_upPmPL3vsZKTL7-huJN5clQqgHsnuygLviMLtkUwhBWvlpiSgS7qil8S2vpigbLNTz7i1HK2_F3TMNr4hHzjCPediLYdpKqfWyGRGjmJ-dnbGVa2r--yX4U7z3Htg2O9ql58BTF7dYe6vgWit6_6spSAP9Kefajf22UGmeNSC6u6QgypkOuC-DiCpNiqQiUkhZxvHMusN66uYDPBpD21zRFRmZcBvf6CI_9df1WVkohYa0uK1SSH-fCFStUf46sQlzrrSEdMZf3HSn1jRy-9BY_6XjIUfOKD7rDeh5FYpOyrRMRClRK9lH0IWr3PToOkFLFM-HCdSsz7YmlYEHjCGtUrMZlrsktzECGPXfRQE6DtQs6y-vnC2jyEctvL1G8Qt8APAJGW_-sf39OxfkrE8Z2_1-mEK9TOZD4MeA42JWhCy7a74c4BOog13Jue2OKYeQGlKc4vY01QkvbCWZnv_KtXT0UwQomi8pVpCE8F0VsJHhXCcCpOCFH2ub4oXrwE5g5S9Mu5DvSD1Agqj3BDGgBr6PWH4qt495pHRrgaBWvu09nSKEIVDLGyBtR2yKLZvOaIZzHEZwY4LJmS3pk7GVnHY6H-eEVIT7zfyikvhyFud5N6IiOGf_eSSuMUW6m57ks6HX9jYzgOMz0IYK4ttUR8mFObwwzR5Tg9k7PZnNEvI3Vu1t7fFj7jhdxT22Uk3Wf4fLBEUmiyS0DDcAI1IfMDB2bJZ-sVeffSfk-u4BDzORC7qSnK-GoBXQCbYz-IqwM-smydaemGqm5Vs82lvmDM7MW7n976fM2V8Ev29DVPmVXhMaFbhfVZsAlgiG8JsfE39Ef1yIFhfX6CrsdH6a0749qDGNBJstoPznGLl2TLpvBqmOmO5dC6M-Re-0rxi8CL5qP-NcRSWv7fx6sqzP0_Ah0L_I2HYrUrwjYR8U_N70xK6Rk5_jNfEpEkENeU6Zyn1i-uXJIrHN1IwDKoXIZtI-KzMNiwOqXlMmD_ADMxhLZedjxcw7J1q3D9NGgG1wDeYVYx9t5mOl7kd5Fswu5S7ObaKwrDKeNjvh_U2pNXCUNdacCXDZYTrAtPUgJlkCPToNv1w3PWVQEndVrX9CIcljGO2IEIPlbQ4r7DXxxdmjHw2ZqF2wAVW1Hk1qrQVWyc31fmlCCscD-Pb3vG9cYixrtmfuG8D3Y5fsQDNKtODWGuQTGBqW9vQ-C0X6fMFKVCRo0ftEWyum5e-cbl0k8yMNdQIIRkrwyhal8g6yMIINSNqxXEA_t1uQRy77U7F8hOteF4d7hVxw4sExhlnbPzZrkbe9pnC-BdkGQtgW-O0tD6HOHkT62l1pzeikNkjiwZgqYS7HetW1wlEfWG7VUIQR-42EiW0izzaUn4tek60UMb731SKN3YNAv_sA_CdSO-aw6mSzD6HyClE2YFlNCMlTQBv8tDHBCX9T3_2NK3S8aOobwQrPQ_3WRGwHSm80i1SpsvbRYahyyuWdRna0Jy00nOulOpzekLkEKjACURcxcy_lDrSX7v9co0jxFUeaHl-978AA3EWlVkPO4KNzCFUPxiL8Of8YL-ONe5rDepj53x2LzBgy9RtXaAsybSsl8kfYOt6wjAN4ssLC8gq4ho5fqxXlGAOPX8HO1mVg7R2abPqlpvcvrZ2u6N5DTpc7owYXEO2-XrT7fE1sqJIvfXdlGWD2l-lVmQWzdKcR6pQD7it7iPAu5E_5V2tssJG3usLGqDwU0fBgcpR6l118qGbcMcX6NEfDF9caRTlhFwA_z1LJarqPAv7Y0m4uqcMJ9VZ21FHW4eVCnZ0hBcvJNP4mzWDJ5XhbHy9s2-Jm85wVp0uAqzUllGrteZ47-c7DwfG7Sz3b7P_Z5lGAXY7tNELxEH3BZd-ZZVLGko58qUByvhnbwcwCPwLDlE83CNI0fyjtYWrnMS0TTcVYip7g33Z4Gzd2vopYZcT6nnv7Zfy93-7Oosf6fHY41FNWKBulEk6KysCb5J-wTMmp5e0oVtOYxy0yKFV8poJGXytQbUNjMHy4PV4QWtHmd1E5fU0R0-LoC_lg6l4UDh4Sews-4YyXzxOKc-1alJBBBG2NdnoK1GKf05rSNmiUO5QGpPl3n7AwFLumdGcXGA8L-8-Yn6BW0Seqs5fuL-YKUXjVOjZZYepIpX7_ytM4QA0n4biUzu0Q6vey_2AeE7gCYjC3Tlo2fTecWoPTk2E8GMgslbHiE3ogFob_tmQ_RHbOjMdW9oDxauL3qGlNvWO08RAA5M5bZ37jPmDgy4bD9f3mF-6wN5ul2nhBw7QBbfxY_v1m50FV9DtuiEnslQoArxAhjFFJtoguNdrODpdRKjmOcE4e8r054aPk0RDw-bkzZlJaT6n2tVKShkgvsaGFFtgiOdR77tqkZnssW835yMhXLuIc2GTww8NdU3s_hhwTy2f3QvqsVpAVB-7jeDwWbrgkoInLOeumxswRJgERKCIp93zuaQ9YQGw1zwEeqnEZki5igWOr4o1ivnqvMr8QrYXE4bU-ic6NcJDOx2T8xze7QM0OX5M8qM1mi-_RcQ0AivIWrJkymjfgM2ItZflRsdc6mUmXWteTDfGSPmrvQt5qTB7gXK4R_tKmvIkmubeXHxlZmegycKr0ca029D3yJpGi9uJ5q2-uTR8maAHzEyE5JSIgyrnNBpC30uZp4Rihc4mGomieZ5q3n8_bGH7_3Yhsojt-wUzBgE8i3Qgbm7totkd0R2oS9dt1lKjroTcZpmRz15F7nJyjmoqPS7jdbt1Cf9UoGU8DxpBT-LxVJwrFZrlT2gEO-q-v-ZlXCO14orQcNzKnBmP1G-BEhUb86Cg7M9MYipVZOxsQ7DWcGMPr_oqQAXI7YqecQ5-tFR2OWgP8dczYUxXLDMoynbBpUrOfP7wHHgYAREAXBAIZcWXOLe5SYkfk0DDUhy2Xa8IUavEkcSrWrZJPFgXaXXvRYiiC21hmZdLoJrcsvkNm9bV6bprOewrq0gQtMP31BEX9RSuIw-7ygNVj5dS1yBIn2w8Ho-GkC4bmChO1Cw4qmb3GncWm389RjVGw_4KD2uTvpsZbIDoYgUpMW5mpdOy-sF5ws44cp2TH1PQ3-DBNzDRkfMmj0Yj8jHNm4XYmryfEjyBq2Hva36vDh4HJHDu7y7WsdzTOKF9hwVYOC5IotUKtdku4_9wQqDqDzq3ISS19d5gmrI8OtB3XxsOXQH94mpp5fjceNMLgSi3SxAIN_lVtKXvweLcTvx5-BqsQ1-DDBsm32r3UJxJWz0wtMXD3jq7sbGkMu1Re-w9QtG3RNQRFSE1C5dxnZCxFOw5_tQfnqMco0oCz-u88O4Ht1JVvIShaUnmXgg3k7z4pKG346Dyv4F_8HT4BrjDYPePy9fi0NW6rtsofJOYimW_hCIEWWOZpM2po1YrD8lFdt6Si7pOVRpfl-LU0ySzsLhNoka44TL_CbtenoOi7wBkLEftYQcpLnO7oBbrrt9uLsVI25S47gzT_aXfuWFXfcn8YrSDGYGXLsfmN35TQrrMpAaYr2jsMunwd9HuxGgOAk5ju-O20G8aeWqd8_AZmImXW1SkrtUywZnOncb5iFHTp0Vf3IjjSYIOyu9P8XT3ffWWQdoful9CL3P0Q0L-WuJIv5-tIuhXxVKy4jdjqt40fRC3x2cyRv5fBZVaWgW1ru6DoZmqoMQX-danQfh9itAwzjUOsncTCVZ6RRtguOQ_b5yRc7vXiKQR1-NCMPwVd8eViDSbHqxndjGBZ0sHupd0LfHyeVQUN-GVwF7FEoPAA6RNQ6S-Yc8946_quiC8_gu_V6j7sqePl7SNLbHjTX4MOse-EIy2nclcyo9zJAbfNSWi0Ahzo8ByV4Ix442m_NDvAzX4HBNz6zBvYEdVENR6VFjNCjYEbzTwZEdFwSouVYk9A-kxLsUNKVU6KvgbrCWzo_ppOVk_oxJohc_dkJUpb_aFGFS__tUqGUdegMX_8NN8U8fMFCFC-copQ1f8hoNnY7hmhnQ7fa8ldQX5duphJXQtQ7pUlV8JVoby1hVyyF4AsFwKor7bFj2xNbjMxyJe7e2Mclc9jpXlycUskJ1kDV_rpiSpZDIk1n9bEXlFileqIJAn8mCEeFs7Fm6GbumJC4sVk8qd0omiU14-aSgBGCNCrv1bsr-xYxMf-GLzddGLFtuqmGe5bUVf56zWqGYS9Fps6OqQTWYwigyQiUzRrDCtFGQFZXp7id-WLuy1fndaRTa8A8JBMGQl1VgcSob0D5SlC0qpljR-8B1_wrMAJnt2dYvZqMqHJoi04VrU3aXrkP8lUbGsUiLkFDKhVhQPOOe2aeQK2VwsxTl_kEPiCznO_5Rf_mDVPRlZ0HCpVZFDXYRpoMb07l5S04g4KilcADaqvsZAHVmwCR9IH5S8mufBr0qM3QHedxpMhdwA4vXC6G-DYme5epH0V7peI2rvXbz9qIXZZpJIyHewOUJg9lkL7z2HaOm8S5GUFYPlY2F436PB4IHVp9IivChSJ-5DaR39HfGYUPoFk5NjRcQI1_tH3jRDyDMKgPzrr5VPUUP3xj3Qqjxy37sgxPTWKW2nFRjS_Y71LqoHl0p8eCeOyJmP7pAbk9RwDIhCGxPK_BT1kS1bcYRsmOZPhKXeqnKdRBUsJaREh3NWA8FaeVxoBoBwH3AACCCXECxSFzCz1NFbErRcYIr6Bp6S2ip59KVqXHDnHP-9EAVoBv0p8XDXEbr7hslGjSUQdoW9d6QTqsjMp9UBIED_MzvQOAl0cp7LNsKBIMRHeYKPy46q4qE_HeRCm5ErLj1LEW-0iC4MQ2eFr_ATec0CodWZeVTi-VkuZQ-3ByEb0wsPQtY8kygo7_ZFbUtvPxRi2ariMIBh-9gAeU9ni01Gq7xWuYw9otDbMiYJABTjNiHb6HvYGV8hNfP09fEurhCOC3Ox-4he1rsHRldGPJj4hFMQyXaT-LcShKE2C6ykuXzaGUQmWDDFJRcaNiH2HAWPVJj0zH2R1bPwZ0J6FzmfWkHurZs3giCsYVtSuEkc-MtcMTCaYa_uh74WDv2jzLtHfGWOYvFxTPPQGNyKsz86F-ufaCTbLNeGzxIXTUFnwiypBkPL8gP-wIiYNlMXCEDJfCphXdS82iDmkV0MZ7bTG4p_JuHLaO5nUdCC1CyvOl2iUe0w9TSs_7OyYvFWzAOiCmBzZJCHE0IWyet2PnknrbQpclzHW8T2rh7xHonKwqbNE0A9yN-snyB9AJJcqjC7AKuuQHSDE_RfvggslgSEvHcD7RIdnc2akclW2PGM23DAMXcQwjFjZJLqgzAVwocTrEq2Pl8yzI2JnidWR3_VVQ3DQhOuTW7S8RwbU4vT7y4dyoSATQtiCHEbXTSqWMS5taVdX7Y0Shavz9gnkocMKSEA5f1RKTIJURWMtTsjQJt31WK8Cx3ZmgYbjNZyejW2FpkkmGl8mx2BSVtHPNrsY0_zfc2Yc8RvIZGfJ5CAdTtGO-SZPj5qSiexC-u8c420uplL-SQsq701gUntwpujp2IlAwzDBTxV8C5NUM4PIkBweorphjbuN6sVAzm1EtQQ_3dTYguaetNJdAwoD72L1z7mkivqIDwxi02ZHxedZ3rdb3hQeBNI_qWx_ZVOGSDKCY-D7J6jWeK3ebWSnIABklPABxNZjaZXyT1PAM9_s_vY5aNWsVI9uQL7I2W3fN19PKLe1aWcUCM_8dHXToel6ayYqWc7d32Qq7KokVi8BfLqsxMm0lyJX9drIbC7oGAZEpnzXZ2e8hXfbkRwwRR0YjeBNJgA5Fost4AB3wi9rO5cK_jWRd9viQIlXAy43uTfTV7_7VSM_DEwEHBtArK8q9_e96REmnCN69Bug_m02xx5B33qvt2kzdHGqfMqtKMTLadF-cR4CU-E0CQ6XZLc8EgxU65PIJx49XLBlxcSNsQbeilLbVpKehvHrYjp14S1FYwOTybPazFTef86yotZRrsacHzvJ0Ii12vS8Pr3HUhCYlDNkvu7aGgBFJgdFzNFwLIreaFlOIjwdXP6d9uMdQZtY88QXpLGJiCzzqJhGfDkiyQ0OoZDM7LpNCjh8JPykB-BSi9GC_RKt1kCKpynj2OQauo0nCgeq0OzuUTIwP1CHVhqYu7sVichTjLmvTiFWLRG7TTBJaMIFrcUYOl8qndmraV_FohmRnOkYJ8ra36qaA-JdWB9yeA8i1l0imGVt9MEda1sXOkH_4c_v5kWI_OTKZALCTnujcgU4oRCcRAtqgQcV9_kJ7ECVAxYqSx4paHQ_rBT9OW6gyhk-rkCuIyrRkpsSTehvh_QjyagsqYZWeS8pd0Kb1Gt2YOlTwWLfBlHTy1aHjua2evcDHX9Us-5emMN75sBd4ATMhxB2wssfOXW29wpA82iSsG-hKPjOi2lMhJt-Lw2wFH-JJVgykMIfEmWwIpXDfk692NwxDwaDNpJfM9EfoA3lxbyhxn7cPg3ftI5sqOzQwh-G_RFnPcg9au9L73-HYBEsz_F4XSv1EBJ-K6Zhay1z5AOi8rLAaGEzj2tjMjXwXpb8gfW6jzCT7lnxYalp0df77qVh-yKQ9PS1njFHr19Nc_42XBCDK_JSYNV6w0t_a1D2q9gCxvw-T6Vg-0Ec5jlbe3AxB1Cv2rs7dkccm0_RDt9_lyLYwlTK4diaZis4wiJMmLvQJKVBzvqHZNuTct6hrCSOgNKHGiZlwOtbo4nISaacv_pNuJXILZlcT7cchqIQK1OFrG8xQdDxf0wli_7oCQmUJbkfgKHh2gpAlLVDPD7NSTV0yHOt_NkxoV-2H_7eIcEsTpRHCOfdzEbJT2qGtWu98nyfeKEx-0nnUVzcqrHF4-bynY-uHGOsc8pxXiy8pW0cYs6URqXxAkvXCcCpZkIC7C3GfKgjBUjZljijQhSz0Fd1tI3FipFK888LvghY6qCfG7qP6v6pVdH2Kh0UEUoAHPZ0-6qIxDAxqSPu4opOVyLcqGzVF-6wJgbY67aX6LobQGrifWjpunpvVb0I7snAaKVIjuoSOKckkMd5m5wmM8vuW3PPRA6QGM0kXFfB2qZryGxay9_52rbUnZn6nRMu2xVOdH3FrQ_sUl-SJPHzBwwDnFfacucei_k7-JO6xULGKY55CmsnD3P9UtDKW-hsZxLDL8lKOM1bp3NRwHoIH4saVFzFc9N9BQBFaYLkrFnT4lLDViMV6DDvBIHDQ3tQA3VwK4D3x9uNMlMPLjj7I_h-yap43vchWSikdFDxDs6e2zZYtWvLoK1FQuKZa9sgpO37dAnwT4k2dDX51O5mTvIgbpG7QbaeohJlbKDkTl506D2549fTau9KUMp1AqqUdvpnGiWpwOvv9SAdu1shm0rXLSDaIGDQG4ylcy8OF5VLEIhKPWV2RKRRgkWr_DIbJ8lzZWmoNzdhTWWoObori0YU0oT2S68myufhcHTscH2w2F-plN0o6hb4PztEGKH_epIuDywzh3vwNoZzxNsxFR4Cg7dMFhyIz2CsZyZBx7SApYtdNUr2MuKNXuW-mDJRuguNL-y5bPuLmbg0o0jDWQJWdkQnQDacbRVaACJlTKcvBUppH6_Z2p61v7YPLmNEg2KP8wAlmE9Jdp35up6_G5Bj3JuDw0XRREfJTx9jgyr4WroaalKeKALeqwZ8sEZRLDBtp6SMU6iJiieMo7fo7jPBaxaSDrdT5jn6KacGtklHJ6r2GR2jBUPLqQTAHOU-PW3ZVQE8TuWlxFAg5xk9Ecb-I2BlBObbHstjwTkOKVAxN-u-2AjV3CCtO8IGmgyVU87lIMYFHeTr93GYyw_SzDva-t0USZ45sHeupuSaezjR68D-c2BAQEdqoLYhsvyNLk7SO--mr6VEJfqMcpopFw0qXjUgoZXzgFtMBi-MgQgVz_Z-y63wqWeabIjVbWDh4gA4-z4o7plKPKp3qHbmX9vNjc4_PVNRkVq50EiV865pLl9Q-T_nq-6xYAQ8imlDbhjgoHG83JS4W36GLPwD_2soU7VlBd0WXnMO4Nj1P-hnOKEsd5oijBdM_f9vWnKLqaZRdG5fFm2AIUixX4mSVrsvmBYcO9trkAJGXmiQH_-TXmJPvTMQxwdie7QobIatPQEuZ7JWDT3Jw5y2kBKblr-2Ozz1EUPeFmSt755dHgpo_oPPrN9In7fXNG8rsgKFqChg35f-iBOYpq1mc5W0GK9iVoBaO24T5DhhWHMPFKYBvSU9zezr8MPHRZRVOBSVX3r4lQHON8ezy7DU_y_R-Q5HnwVko8HDPRGUMwqbAJOhzCNMKFLXurW1_cPwgbfvBWekXfrXdVkrwlGIWols-8ijjDiTz6V_ZxA2lScXk2ACWk9KggOwLvmLErlh3psbRjVNXSENO2A-iYoaLAlrFUtw98aMx20dGZWNELMk31oBuWb0aiC6z2fMroq5rqKucxj5Jr1V2oKhx-Z3VfFimCNV8V2aWVuxzP8p7ggglRf-2Wq2WFL-N5MfwlkgvnMoBOGFVLPkCLqfK2NwxNy4tGm0kLTCFY2N7fy4MrBVv0DCGC-ScPYJuO9dnehSeZVlSTw2vUErUeZYejQATQ_sCulspH5cBTPFgj5g38RdMjrVLovdL6W1F2uOAxbxyDkFfQ5DLZdZqwhCqQ-PkjRs22V3xIpMLlHMzCn3PS5w1Fd6TZj95H3LGaayQ42PFt-lnZZw6LpwSIhI1Z_BjNMYfqbVSWgzchAR4rjmK-5a38z9R5lU_FGDftNeuGedgTdTWMKOeqIqj5yiFYiRSGtl4tUHSyd8KW-GxcqaXOXGOeILWoSRPBVkKm3DTKuHp_HHD7j7AdWGoWd6UHi5uCo9rR1ed0FcoAIANkBGLAVQpPAcm7XUPt6IZZ8blnRmj2IMvMcBssNGmSF5iV09Po6gVix-ybuUpl-80pgPEqmOmo9JXiyDrZK6mPuAqSblXK16_fdqynJlZUo5HeoYnf075aB0amGViigCdec95Ak9cjYWutBhmqO7EDriw3oBuV_90yuKvYpNMk_ZjgQpr4AJnJ0z3oMU4iXbnlY5wABXgfqtIhFoM2GVAI1hxZc0tIllkBzR2cEMR9I2O-3cQVGFFp0-PtD1HCckn3XDhAzitpfcTWRMwVAy_u8B-56j5GGomOdEwu5z4-CQ-1UvjL4pIQKo203rQqokuf1rB2HRTi1ClBRcLagi7Nnnm7JvDQnjDZlYfOiJM40y96_9sRBnNkWVwpk-Gu3sce04csEywSuOiR0q-JbQWNgO3g6P8EqoY7rtsAI0Ae9ULDpJMjC5_ghHIbm9tklnASbzi8CFtAXW5ZgS7pGICP_ne8GOsbxbxCRqBIbu-_3R2aN8H9AE6NRNRMleeoboNmgaPszcXnDDZpuGrTFcNwbd8uc3Y_FbgCGOUXxRtBw8zONtQMc3yPhGif129vA40bJF6xqijWLfvUjVbiqFETf0P26tfhv9gU1ai5-Xcakv_cWJf-Y5QLGya78hDspC05qaWuZpOl_5nIRtXbo2RCOvywXY-WcKFo9gMM1PUycysxxok_0SyZAQTjO8qgnZtTyux_WN_y-HDUsgxYAunNauSxSy5Js80GwiMozRsU7YM0fLN_S3cUWJak4iNcRapL0LUKMkxzG4SfsmWaA9_FcB3PmM-FDdMj6stA0mgfrlhy4B9I0XElr6_2nDd8OkiqGxhOrPTjSESXiTJDPsMirRnKgDU-ihbSHk-xsDmL1HR219aQV8S6qLv8y8fwHp0qxzbgCHvtAuX2p-jvc3FTwb2pEKwKjS4Sug663G7JUbMNHAZXqJ9siKuZNLHfclsq_AHIvSa0f5hZvhmUbGZpYTgG8DVbRsmnaCO5HuFQkXwxTkIsgd-we_DKLZPgETAor8WLVbZFrfpKUf1xe0iMks0eSZ1XVwmShWyxtupM2sY6C4_8UtAoyN_uQp-8l1nxyNxucvdFmsg8UpLaTHBtfTzRdVfFGJzHmRrRgDwy0DQwKjK4WmGKozfZUaj9kmYd4dyqzkacchTZPNWyTpU10JZRpC2hJLzNtKvHm82N4ecrZEATsFooTDc-_hSJovPTcLfSjJqkHS_b7RR1D7EsERs2xsQkPvCnzYFXiMd6uGfyWMgzdNdkPrxLD2t0Gx60poy-GzeP6_NkhbMj0ivEl2wC5C4zXBUZ2gpl8K5AtFEmXCFGyKwFwJIHqWLYlquTZHdCHozbQcRprwQoBQBPUq1Kx5ibZD904av4fPLhMMgYEerqILAD-sodi04RRCfENCUaF5RrhK42rFMc6JscJJNhbtnwkCecZokN5W56kN6dqjdNsJuPE78rgF7TlNAiIoVkR52jqSs1dj6wczT9l6zs_QZiy70wIaisSQ33_Jq61o_37181xLiKn1ALpiWF2eBGf8wW5nqgZrN109SZ69IhEQo0dNm6nm-yX35bSR4W2DGeJ7TR7I6xXuZpus2Bnz9YpGMBM4EEotmSpa3OQLwvnwadC3FBnN39YcRg19AfqZ_pesBh4j7guIC6i3HpR7X7_ckQ-4VcNX-2WXL8cS6GelJGWuUkiNC_eMvt0D5AqIjVOTppr_NvxIfi6bYh-Ib1J0qUS6cGAFmvBCvkugZM9CEqyKb9mDt2blyeCYW3QUM7rdB_oFcuqmDZ9x5aO7JITg-u6La5Pv6oMpNB2ML4VBwzsCPe_8zOm3x3tWUW6cNp5o3VsKncEnCXiB_gg0SnvOJKq5Z0E43eMqSVaMoXUq8dmmEDlVJ6f9W15OJ9N6ZdOdZ0LpfqV9iHxWn_lZvYje-acNNk_xiyJsJSZcj2CYElB-sI0uc7cHPwBbUZ7Gun6MdCv7RTzWTGrlke9JOl15_poz_id9--Dx6VNe0MhiZahIkGEo-g69flQEUZKGSzgHwBlb9i_jrLNIO2-AavEPAJCofgfmrP9UBcazvLisHUcXfhvDdlx_cyUv0eXjr0ekRJXfPF5kV6WXPOY5xMz83CRN56YLCBWWcuidkcRIysy53ipoC0Vk3IF3B9SA7wzAGRSiqTmXsPfa9sSusNr9UT6uykHaeWaO9SoJTFFSykVg8QGDPtQxY-L_c0a4aruddIEsyKDUr7Q_VWInqpAp3I_fNkXvegY9_EgemHADt0uWsxgPuBE-oEuQxY_xnb-JXNFWenUCRl2TPHMnwTMjfMPMW6qNrOZceRXdPID0Dzdtg1uDQQGKHq4Z6lUAp66WwiXRWICt1xtgrjn9T8UhBo56ZM2MAsrXiQ13selfnJm5rT_FiMjqTv3JFgCStlyweqdnJFk6zV7MalDepb_xkBcp9uhLIvUAlENfCg45BjlFLZhOhYqZUL7ExBIlVpFfHYj5g1O6M5YEnwuyEayOFLs93xdYQCgynB3w57QXXNtK5AAbL3uDJFB0oTI67GMW2RZoGUj1HECybJ4ej6sjoSznmQisVmfCTj6j6OpAgqWcpH0c8kEcGN-QAhma-qgGTQF0B0b4KPX1a69uWgbvQrq5G37gKKFplJmi8RjMFCBKmT5j3VwYsS-RU2fkWka2GIAkJDe_9FaABJlwNX8NnJzk1xL4eLPB6kQe8M5v4vu8uyxEEncMIXeVrugaydEHa99BEyEi3DQtl1dxSrt0Kh9PTjSX48r9kouNXpXLiMv_DBIXaxfY_84Lr8gFyUHMhNxVqb-afYr-DbknXRl9omSI9lQHR7WBZSl4qGioYAUyGpkFj4s0K3VarecvuPu4SAtPYamJKa6gI8hUsDMkvRhOt3Nxj0G9_mHaymgUuEvLJRUTiB4ofk_nRHwiXj4bu9PWedEcxK39cq1iZOGqPVWgUYL8nJ3SGu_IcmefrXfLHHzSKLBnrnPrgJs6wFgj8teEnoyxhT5eIZkty59_tUHohFNp9mY3QPrKLHmaMtpe9ifTPtfp1GZSGdJrl6Fhego6FgUXKyG7LSu2dKmYF6EoQjFHLDp4-LXJJxf53xWj3eu-cV-qlv2c6vV7reoK2OlMdxTvCtcln0kVFsTb6uYfE4snNvZojhcaOd7QiPQgzJlxBEm8D5JfXQ7UppD_y9GMadsS4AWghQmXJErceI87VW8O8M7n1NjId8q6WomYEroQ0JRKFtXKXmA4sNvZ0WHdrhJXkq9mKDbW1rDoacBlMvzyXHdzLFug8w78UT3dU-_TiIkFlGcisBcuStV_s2Fl3eeZP8de7fUMxfpgaNNVK2E0iJ1krzDSFV4oCgzJDiqu8R4keVzygXYbvkNYi_NlRLlOPIPwVL9y7c4-3QpkSE-BBscKUNp5DL6nxDCaKfBy-u4-9AYKV76Ywy8lJEpGmiwlpH6y3v2kyVTm6xznpNe7gcDj7GfJtflL6y-bewkao7sLhwPFgUojIkmwrSXrpugnhJ0WGICCYcqFkuwZpWBGx4rUXoTZ_435tJ2p22xn4a5A1onPf2KvpNYms91NxtZeXAZukYu8hSs-LFJxjdJWrn4DLYgrB-nHCK2U9sbLvR5iI__rCtyR39Ao9KZQATGSOpUVLrx8RqdRCqrp4q0VqzyZVDTaGRAU67prHurogwLzB70dwlldxbGegLhRatZGcDGIkre8ssosKCKhtcnv8bgVPMoYmdtUT2YG2kWd3zgrtbAG7envzJ5dxjF-Z-dYjpWkayAmqQvm0H625cHmx_DCkV9QQ0bozyAl8_wC_LtmD2n-jsJWJE_q9DNwZ6-dDdwpzs23RNWHMAAfgS00rBr5VihvtCpjrXClhXQvFh8RlWLu0z6vRh3an56JnSpPNlx1wC25IbFRXfw3b7OUS8xPJ2F9o7Pd9-mFJba_onXABhuFlyfX8Reot_KoIqM0SL8EEnoXO-NiupciAOrqfw-ODeWIkHaWeyQ_oKOGZBS63PgyUWRW3_ZqqitTXS9e-hVrD3ewYYRUM-hu17JyV6J5rMoJ7wWbGbSxkH3zxcSx8quDnjZ-eg0oVCmyf4ZkAwdjO4t7yDQs68FqOF85vHk9CMvwPX_zcJ-nsn_okiM7NNRd4uaGDR7ICjRnKM_QdCbZRcHfcBegArdkfyijZV2MfgdDHbST6_ygMq_bmnYbYEPy5mX4vAtG6uSfQfRl-1m9NT2wtsOF5_t2Bl9_Z3wNocfeYs6e7-cpF-l7vA3PSyyyGN7QpZzURS0mBp4UdfG5DW4y5BOtoF788IMa0gsDp0pISsIZoGUt5j3pEoraq3gnBgE2fa2rLZqGq--BYQaqZaMQ9Wa0HY_loLzhCGZip7g1eCjzITCyoovCTYqder4eNHQpgbxI5q_dggN-rTOU82Ntq5aTgaDPTTIxPG_oJMvij--j6DImWcqoLMmwPOQcZ-ovaPchwLjVB4P9MfVQi8Yi0QU2xI_ZEWi4D3mDMJKl-yI1Zeb0oufMuh88oJgyK8hLPgCynnUfdGfMYqj2i8obt29xntjnFDFP1Lni0-VRp3LZzXo2a_JJ8LWKquJu2ECK0u7C486XlYtv9BrTh9hue_t123BC2cujJoEXu8Dk4FgmqwgkNtTRpnXcFQpjzjPXAcg5bOFQHN3wVlXbZs9-ektumu6RcuBWZ1zuskCDCvWj6ajgqkyPGt0TQ8Fs4tifP3pIZn6d33Wu8h_836gVOPbso7gLPykMAZviYhwux4azW091sYFOoZrZFQIsZx_Dtx2JgCIbvOSyz_uIrqQeHp9FFWGzYBy4au3K5B5EZ8y8_fEkGI3L2VbLEDe8RFXm1hj1EwSAzWOLMHO_eerFDszm3lHFJOc-2c9qzx3gly1ST5lt227bGBeIkevPoB_4-CGSQx2vvwLhKwKBhw5mJ1DgHY9CdXfqiW_EafK5uhklEU5kLIzNbIVLY1KEBYDH4Yp1uviUi3NTOLI_4e6fL84eXBZyD9m5npoSzUyo-cI0LK0iNJo3lQUp6VDrqgahDvclJU5gvtka5V8VLgCW8rHJSPPqaSw77Zo1bfLbFfO-FgpIcUZqrhHF4m7p6BN6Qxrk5B0BQTu93e3D7Y91Ciea4oJT3G1EXMh0-C7BQgoSWisuTdMrvfBcVoKeXCfqd3hTiCLQVVNePOQD0o3x7nL52gGXdUKWd1RIcc9vleArohP5fdFIktTw-w-3Qh1Am1DUbCrnz5CIvi_KItqSeiM-DwTWXofysr_AMs7jzQ_SOnBhfmWXuby7usJpVIhMk3DLWl4ApI8j9p4mS39duW1ameO-srJ-KAtiAE8Kt-RAIgjEg_L5mFIctN-7LcQeNJYgTCRlwvOJN85PG9NnEf3Oko7JS0LwskJlggnztBd4iUmvVXkxOcgR0zrrhMZkRjsMw65BhzkSfz0LWGMTJGBGhCZ7PK_XT34FWAl7eDxacmG0D5ldzZIYmDfWKUwlbIMRulm2DkJQZnEopeUwROVaZPeacG_UCpBjs8ycx51k6ZMB_z4k4Lf6U_sANz__Udc79R_LCH4Ii1kXmkA6v56So79yn_af1cZPIdL5jcz2RcJ38uwF6gm0R0cmsa3WrUPdLim9ZUuFizgUtcYH3F8LH-r-RxUi96wICo1TTztQHjmesB0y7UQxPQS6V-asAmvz7K5e7WlDlQY3yrCvuLobTBdb8dJclUzWsTON1tW5yr8hxaBzGB6GGFbJeci-XpkeYLGf3XVj2oN5FNJyWtmoDbcFk2dsDR5TnS5nKSZTlxvNuwrRRyiSrm3G3dF2sPfVxxU89dsafIFidJ2nob4aDCG_Q7kQP7ij-lIAaBtYJlQyTZ_2JP1KhSx86HTWQPTBG3PGlQW0R33QcfPiXGc87M5TL41XdRfE5IRBrfAQ5xquGlgRxkam6kp1B6EmbHgHpVJSuxkCLwbj9ymfx3IJmlHl15WrDXeTATLl1YT7pYk-QY9hXKCKEn5AtdRFl2YjlhRiuxCipHhwK4lmV8gMaUwv6exbVLUPqKJpBFGUUOPBpqccBtKB_0CeBhTjRoJQwvPVv1A1xkGCHomawSaqP1T3hdgz5jXX43ofiAXTGbpAjP1C84S5a46EdZN1IvMPCucp23T3nyrVuBU9Sun7n3Y8kFfhKkg5SS3NXRFRpBHZ3J8QMLOvUjh13x31xrYlCbAx3cYKWJbZLv7Zyto9FLa5fYmVS6xNktZiZtNnmVvA857nCMUP5d3U6R4T_oNZU6zaVvhOuSRwYhPXhMFFzn89iYoZkR8nSqAl5nKlrfzZ2UwA6O1S7t2axu4hbpEFS0vN-3Dc9kASg8zoAo60eOBEBcjlH8vQJiRkkHmVCAxvAlQJEARefjv1b3OYNwn5bOu9yNqNUsfh4a6EDjN3sEFtLbAwXytvKW6OKx2xr0oyiyWSY4AMqX4X_Ree-ejyW8n7erJpIACUbwQpCbdlL1bwuCSBWgIPdeOfEmRGaQNfXZvi6eLPS2C3IqMd8PoVIcmmH3fI2naQQPz1hcfJhWCUTD3xVuUEzHrvlDDgroNjfh-uDDYjI0bi6zKNpUGKkxtsH--VgnAC-FCeA6EQeM8_oRgbV4paPfNGtbR9q4dn3a4ITb2oK5MLZ7FKqNyMPNhK0tMq3mB09TS8wh8s03C4v9kPUGqweBjf_ep5O73_GpUXr0bEBlOBkMXvsJCILAR3PVjI0ba_O8urxuqj-kRirlRJMBvJzkRjH0_S6ovrYugmTVSfWoeiehzMVfTKCAvdQNOHX6FOTACRflLmKjmNQoRBeExISDP91nmetzGFGhZL2PiHhKP7vq2C5p0rjU9MiYLu2IWm4Gk1No8qxBWnKnz9NVJzDvYAHG_Z7A_YzuTZWa4BiUqMMnMTk7DnfS9IXPBXgOGmGEJE-p4TfnvUmHWnky_beFu0amQaPfzNN--qyz-Hm3BOXA0hfiQGl8d6n3Run-AiEHZku_NE-kE0iE4Z412_AZ1SrWjMlY_uROKvD2DWcFFrG1uJLxr_eh3Q2hSnUZpjr_WFmIJnGN1gWF0LpS5SQgUwY_ClzpwRQomv13dYvz32t0x0oudgzRfR_rkl7jS1lMEVwep9nuPr_hY7DZsxHtJyk-4AZSVm7aKqUyTtPB5A2QH_6WTg2zoKWpgjWpRgntlYtQtWoGk1IbAF43M77hXzkSlXv32dC1U_65YBuuth-Y0M-3W4VJBoIAUqeZgQ0GaEY51KrA5D6nTtlwMctEXqhYhJAIygS6xacAY2oqjesToOpO4yjqn4fgioikoTQoF0nmsFB1CqbF3_8GvzQn304G07PKwhbY8_G8b7nFqimzk3zhlLT-zn3Yoe-L1e0eSpxSabMKkdGPOpATJAx2yVYREV9lJwitzgUTPxVICTD2yII55QUtpH6uJ3A_8ShUVJ8OFZd6ZwqPrX9z7LC7GtxXyjpAbV7GotckbVwOZWsujeysANZHh6t1FduA7zNwkeak6znSYbd9vHY8ZQmGvHOo2BDTbN1dMDdvEaPwLzWcatuFcLsCLnzu2Tqz7x1VU3JPbBO5r1FAaaq4jxePrv9PqOq4Fq-OcvlGLNtZntWocYgIKQpN6QZ6yPjUnaVrI2ojsDjgIDuYyLqwF-lAyyc8hgnijDSJZENMuBdyaz70I8nEXF4t92R3ooJP-5eonUrnYKxdOLWS1IYSj5WcgZWeXssLn_UAmN2ZrIZUO5zdyCN2fgtORkOgpb8wfqJF5eK8jMySmyFx37eZYv8_GQxPq9xFkloQtUUpi7xmyuh-n5jo0CrX2TTufEKOuXnL5LroaXqxwXp6NIuQ_WTme-HZFCqm3h2nuhD5WNr_CIqMPqZznOVNTCY7vn5e3b6yMSrLSCQxukxvmVOVpYcxtbbfX7mHka1gaWchE-HAs7YX2cIS2XxgHoIQH23OVuLjx1jCaXXHcTGug9cyInX-z2NsJ2ZkxifkUmoj49kn-w55mbc31vBDlWekb0zcY0EcM0yug-pKroQ9c5L6bRRKaRFPpO2boD_M7gs__bYsvhUK4YwmanG9SOpVpy-klYRKghM3qHwaqLw47yt9uPUrIxAGLuHbC1UJNSCfsWtRwYhhxv2ghfFfOV8fTugpWvE4C8ufbWyuEbv0uqod79onE9fLMs0ofexSCXydhIcKub7Ua7JzKiNdeeYxy2XCdxFuR7ncqmsePW9e5mT18v2qNHT-JYDWM05mIxgijDXX_izjp8LxvnnfSVI6ZpgnnHIWR-wVnaJQh3Ojji-LyENwQDU_kKwB4zt2sLVo6eC6qGomf4qENrV8CouEHcJ3Hws35rBA297p6LDEv2M94wbFVfuvGFgicM0LTfu9yvWdROzh6zmqVV3JtBzMjykXnEPSy6fbHhckCJ1uAxgrDFvdIk8nvsaZ1y7TzXTNAWs0Hm6fbdPM6gTa5TDB_nGccXKn0h8HPZI-jY8rxXLASwPBDtsPugfrMTJG7jt8hGUZiv4YTT15RVNtULe0BvR4aUUtTnizTGBspNa3jFxCfkzW7rpp12mGoKAXYUQsxUv6oI9KGD__hNKR72PI7Ns7hLQ2AstC0MS6ss57YiPKscKcI9DGS_3MHZd9418kb0S-8sstOD8DuLO_cN6RDf8Wuz1CdgpVNKgjKvIziyRixNKpj2pJPXeyfc2BvPb-_Nyynt-zJEC-6Ndw3FrQTbTUPqHXneqSjmBsynX9RtN01UUBblJlWnibhHS5YV1nkwlEBOK1zBkem25lwZQCsDuq0PYXRKO_F-io1bvX8NGPEb0o4IRK3kSjFTtker0cp0K1CMRlbi_ia_koT7ma-ICSdQ-MbZEDzjCyaA0kfgoepFZp7chtVc9nyMzIOhZYQOhDWpVBCQZ1hcC3GUYmEtUnUANKN5j7SzbAPdX4ZflShBT9Rxqs4mIUTZO0nxczdzdjmFPhzTq_f4R-2pfsGXTvTrYHAjhMa0u7GHkqLxA-Dz_ggqy3nQbhHFKWWnan2Fjm6E0Xnd1PbJCT9s39M9SVHdVh3Q4f_XBtwwuc-PmuqfZkznxeiLA5oLz2Si6oATtLYZ_1w07yW-S5MZo7hlu1ocnZt-ksKA_EgazmGQGvcT6Pj7W4aRYXDEAd0cv5I1jkhvYNDFJbEiIwkAYHwqt1EtYok1EALTdw2AVlVjh4ifQ0Pjy6Axde3p1Bvw2G1UvYcGbgpwQOSqhAocbYgJ1wKNoe5OxPStT-WNRTEfXWSgw_KeGKcbB-AkuebMgHPcdgv1e5jwFmEdGWBcGqjT0zNBKtwvmetp9bo8zRT_UTb4l0Jhmzs8h_XVogWIgzU84od1L7wznD7uwp_voOVasktWIkETicBT2ReNn2ftbiBRiSaAgWgazZ8GzifTl0gEIOq1tbEMLttvVWyxtbBnSGMYciVXAVUSIAlmCvxUWN_MBiUcpOkY6DRletO32IwXEPz7q-78fZMXsGzX2lj1B0aqfkhDBAh1SUhfO6WCt_86tjcto7JcT6_D2Xmevv1EjDlMAYz0Iy78HFWzn1fOw6iSlcYB3FuW0JEyXs9pBJ3fIdV4KPfuzBXtThczwyuFOShyj3m_SaygoYgyvfAhdXpZw3Sy0IaI_PVJdFcpnEXJXUgIkoM9LEV6r6CNcqtKL5pQfvJe_InElMEVLmVg56uEz48evNj_QhRqls40DpXtsg-zru7Dl0rdnAzajOOBehXYtdpxOoDm9TBTsgTGaVPuaWLxjNnkX1bVrD1VUfdj9X6Gczfz_NZnDlwG0uXfGNfNW8Y7D-zEB6gu1WBRSqOEc2VVwLnqYlyo-S_-s79MOlq6-GrPBjzLigCJuEscSoscL0uNvK42jEuKNlFNX2mv-zLFUWrFWb1ntWLiRS5sNhwMjq78r70T1ERblKlwp_sbiFsMsCPcerzTiKlf05oYVKrPhETW8MM-VYTp-b6IUTpDrZhi1Q1bALk0KjeqX3GcUpkav91eGL3SgAGkbwrWdIsh7UrBzxjpy21Whoya8J5JOGVk15iThTL0PEPXgq6GoMO7AyrMfwK7qbtB08hgFefTEmC-aUYofKZETkyccOMEz_qAGs9Y-vJMhB2Yy3f-EojRB7sAvlugrLH_iuhFqfawxDSHVE3UHzT8RMlp93hosLNKyCwhd2ZLRcN9mNtYSBF_o0XplivWWCDxAnE4KsCC8VJ-HcgE3YBA0OO4_WoM7Geb2FFDjskhDF77Q5KfBj2l5LLI4Mb9yLfNmgN1UaTFQQjb8iQ9Jlog663jf2d5fH2suLfKut2B84cxUoegsFUelfMatl9_6yRe_IPdBEWd54iAuZscH_P0cX5K3iQLNaFghBTm5Nguwhu50qvME9TEmBb75037IHq2Y1EA-kEnlXaw0eBlz0sMJnwntHt5por7D-XLnXJYjZREzYR76q0iABe0GIMn6T7cW7oj_6aYGx3-0s5ic5ULq-vC5G4FMp0dORUiHj7TJPW8XlpWQF6hekYysAvpSGh4gyufRlasHagmEwv8vP5sjrxi49hlCT_LMUvr5biUF1OverKlpLAsjUk5ShO-nXcWDaelJiKI15bDRi3c7leC13kl8n-GeFMxFIOMA1At_MwxnAS6pcyfHVOolQKdKbm1Xd5zZFfhVGXSPI4REiAEjwp6MukoUB9uMnAl5BEYha5s7KkKGIVmJuShCDG80QBMIKwInZDW8wfP4WihbvJcq0txhMei6H19peH6Gg725D20BBWaKN4hYPKiYyHkob-8OXgUTuQ5sxkQhg7NNoTQVShqvn75C3pQ3lbbCW5p4-n--fEdMP10rN4DOmPP2pBKe44fYzBMJWCGzswF2OqMCbsnJGz3CVhf4YN_t1IdmFMmw6QryIFuFeJiSCOU7jh05ikLqWkeFbhhekR-yjZx9AlQeQy9lqqggNxuV2plUowbnk5uCEDWqLpoWJDjobtGl9fQe2SLY9P7ccfCJXp5bzBiLX10Wr6bBNjIK7SJ0MZW4N26CopOHfwe_xsd2utHiLCkDxksOtshEgg-nwgSwBFbAdrOL1xVkcjS2jqQJHmkCxHx9-1gWmIXj4itAKDhT-yH0UrAHlAN-y4iud5QrnbkQJDzdblEs5AKDOVEeBoB7AHVM0AsyAGbYs9QFyqEaYCL5kxiWRiIR9rDGjmu4yro06oNWTdJohJy_d8X0VNOYOZR7haMOCmW5scdAWfKQeLmcAQdW_yU20Bx7RqgX9Yb_xDBRd-91WrbpcfpyaFI6PNk9OWcUNAK-nh2DErTNrVW2Crf2Uvmgf2XJaIl1BvWgfHmlcHevVXq8NvJbAAbyNXXAuokg8aX6j9gYtgjqZ7b0w2IV4abXNRlCkODQkCsAqGzoArNxK4lY9KKP-iYv_IZ7nWMBbb_lZZc1ekZEAc1GxxqizC3rBiFry5dTq9Ii7u3_gqiSLx89RJBjR_13RwGhd-KLiDL61LeVDJ8gKKqAgkKnaQfoHVZQMSthIVV1JqtRnxCDeYRDjRlIZUMc2bJBlOqzwq6OovNKj1tQmnAo_yzVnNIZmmRh49Bt-9lOkYLh9dVWfKMhV7qJlymYZuzepBNvJtFurUykN-wItgXMzwP7M5QE0PoDpJlZfIhaiRDWsBh8uzGl-ZqzLdaRbw7X31-VJGaSyeaXAY8RerqsYXagTiddXNXBv1mQBxNG1bPdRJp8yV5RyTBV3f9I31UbjmIJWTtUMHcjcWUNl8voWJhhWFUu5TTQ8ewwZD12OAoXvLnTyeieG_VlGuiuKSPpFaEsc-_dIiq4WXU_FxK_MemYisDRM3abwiU6Wptg2c3S1NMfIT41SGI8vBu46ZInjZrU40HMR48804oUe6grqgw2GJ0T-25wpUVEXEuJpeq0JCyL7g6kTILM7D0AzDCfkYcv-zTR9Rt9YtdhiDpCGgxZu54TdgWyyNHBlMR9jIKTu_dfOUWW7MTTyfUtKwBQ8JKjom5XbqylDloKQs4-pVeD4fof2Bx23SG15XM-VQjdpiWPAb9OEJr3uwzyEv-qK2aaKWJm2uttQEYAdpIiJPrnt26-SZia_grC2mDEHp5XnLVNLr7x4DkqlB8lCvrUkI1pNMZj3lKhG4xw6S-_ADpIF6NZ7SelbISg1yUc1OvdqdpSdlA2hFpDlesX7bcA-o5Hvpi6-r-QGVLebZp4IAd0CpGHb8H56WGYv3mFi6IS6xEF1SRJQ0bPK_WcDF1DyF2fGtsnsBIfWcV5JE5RxpIzOCWJ7Yris3_ZtrD3bI3zt7PI239nGNppRY4TDFZ0Hr_7eycrSC2DenqmVhMeSnIjU_BQ9rk8N7IFIxDjoKuYVDmFBvAhlrEgP-Zwb0-uTL69JPf6IA4iVtpgS2mlYQJZKoBm65r14MeSUjuDendLyQf0NQu3Z5hyGkJLed7WHqmwPGxmlSdIRm4RHfdGe5EyypfQWrMH9aP1wKpyHPxRR5AVaQottZqv5R_GkGYD0R8yISvrXYNQgxLtX2xRMUzRD8B2AOjlqlZHEpH0rJ5Zi7hsOYIRpuc0HXYaHPHWQH35V82fxFdOdD3x5GFa0lrLNz3_jNw-vm2cFu0ZMEQMa_iA9CHNBDygDVN8m6eBYl67j5vF35W0cLD4g1VNTuwmPAk1QwihaS7gM3ZZUKKT1-5HCwBo9vpLPV2G2pZOk7YzBuhy5qBPCzbZ-UU1QXU15aTPr_qTkYpNplCR0SCLM0DqVUGruKZLvAYOgSWdMcd6dBYvGjt6ouAx0F-7E8z07MuiEW7Y0uUwVU3UF_Vp0UiZdZIZk1cnw2-WqQJSu7dW3xaTCKg6RUcbZK56EMkTcGs4OKrKqwd6qaOWPd4xeB4pxNaFuzq2sT99Qh6km9cWrw2aYYZSn90PuVT7miN9vDcrve_2rwA01sfrFH4YMheZPCnZRxUTXhPMj9J1MSvZgQf4O9Nslv3PDDzFbnHZ2CFQnD7t6ZWPoGg61e0SiwLH9JDI3UmTVgA_YIbSLJJZ3qpRjeOngUobBDZcqINorzEeHCpFiRVlblwMPw3_oex4PT0p72ujymWR7zKZFJP5XS97snympk1CFAnAXWPKK2uxfXjGfoiXXsUvgJMC78kEJW1_5Q5BeuC1ZyVvyrIMlfCP42p5RJWBf9vPKVrlV-2dLBsDe7fjuD_dp8-KeoD4OB4V3SAwH61VNgYcBhAvyxTIP_WdSgl3E6UqgtWIvko6eWkOaTdmnZ1VHJDfQA2-DGccFAJkcJ5HXgpDVsw1Wnq_tYDE5qHzR7vDs84QWbBd1PDr38jx1BDhjBbE-o1Rn0cffUDmVhj-WlzRh_yBGtLfgZF7le1p4pREiUwsp2ko0Wl7MBLjw3tfo8tPMiz9nuK_KFROaOs7nyutP_P8UY6vaeDYuLzdcAbwNXOO6S_NcTHviXNWG4tSSivCX_pxBrvXk6bFiTjzJyoV6HZvl1ki-rfwk7vY2MDX-N3syvdGsiWlcxBGLAmEfTSUw8sAxqNaUgvXTno4sk6CIiSXWKfwosMdiHIIzUoKKq8fWM3LIEpBV49sQROiyRZKlCsa2CRtn4wPzr-6YiwB2RBsQo1sLQbDkQzvDZQWhWHJdO-71zKZuK63t6l_QIIKZf4O-nRQyWVBo7WQeel-6Qlq7uReS4lDDFzQqeQoEu75hycQzIO85-IdFIkavNqroyysSVJFoA3d_RnYEWW2MBcZ7NpIlugpF_DNE00HBLDmlSIjy7GW6spPwHfr5y4HaMwpvndFdHpIy0YC2pOR6y2EX45KDkm_G7Dzluq-r8YVO4Sm6nPgXkIW8ZAzovIipHmrjMygndRDkC6wIXzk1QFL_RixnhnJ3MtlHfw2TvVbVlj5dQqSss3uTrfNG29rwcb8sUdE2bZcome0gtKnpIlwN-kk2-aEbopvwLwUyVYf2psdYp8Y_dClSRzwrNBliuaNa3UgWkpTNStmKc3MK5F2hifm6DGQQGF0z_-pRlzhy1ppN_0qOfTQnGCPLq2cjP_P4dRK75AlAwBOR1eMC2L_bqzMoOrTzGhs6ryMg4vGpq0JjMrj4aUESZR-gUUu1b81n7qvOtF6G5kaABlZITvuN4GTyn1ZO4Z7JPhgI9UvtSAOyyTi7sIl6ItwjZJFhurJdNCH-bpZ13R6KUxbBt4-ywyZCE8l99OUF38_X9W-q90MyhudoblTsvAynPWMRxJTDPbr4yZpoLRPMq5gL54Y8PKK1sNpbbWc-ZNfCrenCcfZE6c6YJvz0akmkg2oP-iGRHNz-fzcSJ9BRI1zYB_jrMikSCXEpsbfn1mv3lzx4HY52PuzX-g_IQ9zilSbfc-hTbw7SiMAi0YlhZmdbj27XNCDB4OGyjnKHArjx8HSUXhuu9D4ZmOzXj-YwWgmqeF-wWATqAEV470NF-S5XvChcE9b5MGwc0TQGoBdxMgxNQwWiiZPXSIprP9W_dmVxLYkQHfZmOkmHRRgKQHSwI64IZ01TM0jW-Y8L8gmhFCpkoUwIwX66HaWrkdrPUM91L5yKJ6HL6PXvpNfZqX0j8texI_3RcrHy2K4-l2O1rr8Yu3tadmxpUW0c6oZt9cpiZ5nqn5Kcy6bAb4PNchuGaXu-YrJdfw5_Mr3oxK2TP541MYojQc62KujjxOS942vBD_EMnvocphHEsm0BBSz9mPkAXCjBj7aY4cftfZOswwmIY53-tSMxJQxZPLR_94SmjNf-lQTlX2tyiUtiDuOdOJIReRW-n35tBUN_qzHRhjarM9OsXS2GEsSktvj5oWJdOBYx-dh6ten-8DbFuwIF6aIjCWHxoc9NILzCta9yd7B0hM79s5qzEGNTP8VSsxh4iz8iTqFs4j5NgWWY4ohk-ucJHKHO6gWVwdMPjR7Kcnp_j0MCnoja_neSxehl6nWPeIxFInk1Cra85hu1_w72ElAgRv7pZJeYguivQO9OmE9rCbin3S9ZEvyEV-D64a93MKmZ5oKEb5RKw8QfRkaRTupjDveyDrnJ5N1al7WsxnWBtBLvjRbjm_71dHQmOGOOc4PeMiBzRXXwtladm8OUi68RJLLrDXQcH0IqztqsMKWsP8wJlstHuVHhNF5cLE06xKQhJM9g_I8nh_X9w4gtu2NNgCMwADM8cbCPl5bGtkR_eYpS-G6j7FyX2BKXpKvoyk7eC6f-PWpBZAXoBCOmjnIXu0_eGhcXuDihH_DYqEFXCzLHi8hKaWenM-5SZqsACm__Ztw1tzY80ZHK3Y6wzLc4-ICCYxM2r9f2K-PRL4M3goA1zNCtO2zSVGr4maX3Mvi_YaKGg4BgXJEH7Ej4KFNxw9g_xn3JNW0AqsDV3wRMPEZ22ff3WdUYjsHdLTdzDYacgSF0pFD5OYscoI0e-bxsrE_RZSDN8KBe1CXccRke0Op91Q5-t4jMHVOgUvM0-1zNFQHsZ2aOV50eSUlBJez6gqB_vA9thPtIUwSNzdA-LJ8ORiv-tgg1Wy_BvXvduf5dwaw-BfJsuSEtpZO-kWzAWtwB__pV67jiUo0bgu09CnMD3hPMQiH7hTvLLybxSiilTmaQdpZMg_lWuR0h6WHDrrAl98_pUfEvJHqXRM-uRNXvWa6-dmWrFA0nrROybV4DRmUi4FE26nI8vwiwKjYq6L24JAEfYnSCjHgM5K0rHzmGiLUhine9MTEHwW2UjNtsUtFmcn-UKMsGwPYgY0wHGcNWXmnh2TetspYqND_M47vS6o9ud1iwiDAVmikNjtc3pH2tTcRX9O69OjpZ9-Hv8XOMBK9z9jHD0Zk6_kcDmQlcgm_vHv4yKZu1JrIh-hAARXQUDUoxP4CPQXLieqwgXjpe-MBBtynJFnzyop85wOGXtwSod1_MmfncWYaTnMf25tYxLwzVV44zuMGZn04-lsNmhJhukznDJpftKOnA6ZDFB2kIIwUdbpEdl98bZZE1Tv2CqRUSIUS2PceBdVlXx2hPSvTfL2HIikQ7hpYPfHv-8qkF_pq9too0oJ8iuGwgSHlcO6i77zJGpL4T7G-1dGKbWPND2R1nO_0_AjxZIMbfxp1xzM2RdcIc55dUZRy_Jev5oUzpftSa8Z4z92tifBNv3rtxU4hnQGSp-Fum1hM-0qxpdnrTV2WrkIyj9yA4sZ2ShqxsWtuQRaoKzEJ3IbsDvPpvy5OD1X9NcQQ-0PoM1tMrlIbYkoA3_9Zq7CEwYIlyv4_nyI8LjVQUoV6RMuw4TpbPSjfW8h4DZ-40aZN3DXSJeCmY7RyZN08XSmEPUktZYg6XrjNAxD1-rrP8dCr9ieFrRs2N8ty5Uf6MM6kHUJhIJ1Isg7IOxIHPtcw_W5xGAKyc4Trh28zMK7yYOerN3BsQorZj5BuWiw9aSr1bbz50kL5ObhwDtWBm9cr2L2Xpq0MAH3iT_Z8I-7dihjGQbWqA0VMj8tq7novpfMFHy6MjFNOK9_9dSIw9Cm1HJN_eJ7ugSNGZl3ZxLloXSiYRAJyA15MFVTDjMENOQANkTFCl2liCFe0zI2zOkFZwRX-vdsHYtQ_YrvzN4XEDLy5Kbyszg1QZBHau1jE2Ar4V5v069M65QnD2nEjSYcud8_XhvGMl6z2BH4s4fbWdumRzclyz0OZZTWbsAui8jc-yy2JKwKL9oXSL1UWZ49xzE1HNx1HN2_Obx2evPUDsBdzAgxsHQTJUVwztHrIDi4MBdCDZKjqqIjBBql-t-BKjvRkts_kLvB23maipLLxUJzAmY1XJ2GQVPl660Q1I955MzEzg83w3bJDDtPn4uo1PP-qEDsONAnj8wyfyHxnnxO-9mH4CBzAgPRzXdAKWm5Mu7oYJiT5ziBHP5tvUlYyOyZaw03bredEyNRRKkLsdQcuuB9RpAlsKzwu8M2aVzFKjtKqJuaSyGFDcPiZ0-gwLvmLLPwrGS3twjcdBXYgrldJoOXjqQPd7SngwBL2SbjMa--h1MynMBxP3wEbTgDJS5O-jAVoVKf5E0E9MBbg5MtIlrhuay1tFf-H1Ai2mlqQQAAbFD_OnHErCfvG88t6HPdyHdzpEB5C1gER8W9q8WNA9kHMLujc9xtH7W1pJbbl7i3NyA8kR34rpVgNnSlCZjUifBiCXH-LVB_Rsgjc23shguoAGxhJQGwnhycqBS-EQlz8chFBnvvYlYUOQQbDNR01pbNRFJjtb0PbnFZdZBFUlvtYAB6Bqk8xkAg762-YhJqILw-udIlgeoONlmzzKVvolVFdX62aNSRfJngRMmlqgrRJ-ZeAFBcqqu2CQMzJzogRbK-lcDvY0z3RiYF2AIHl3r11RTm_Rynz-b6LB8zfh6KGIm6LIq4uqcqawP17OuGz2hzIUoaFu89E_ChzUhVqXpwQ1rQtTcg5-AzMnYHzLr0xuOxlpf8q1p5EAT2f_0b59diFr2MTi5Gb1jMCfSQvrBAtprt9varJePhmW8-pbfhRk-8FMg2yHE3DFBjD_bJlZ3iZxnana6DLrmY_CEf98afJrGilZaYI43mYrpCADxIfv-WN7If-hmVK1ewuiam9eTDhv-RX3d-6Y6gaJ-OQtj4JU2XDQeIuPx33gu4Guhzcv0TnHoRVOS9DeE3_XjQwiZxfJgO0w_1ViGhSesQ8ou9wAPsnxWDF_kVMWOHgAA2uXRaeo991BRSC9mUc_TgwXkYK_Z34ieuWVhM1-Iccyffj0526H5o7L7gqdfMEFMawpjFupekcd4VFe2NMSAZw_RD3JyoqQo3hBChnjcN644X-i62buPfpbsluyFGCMnW_ckEwXX98sCG-5cizU4F94uMMXK6Tsq0y-1W0oi3M5cLQ5HoFuY1ghSZgdgIE5mNhm-1JR7_PFIYxHljvqeEaqHFkgqlFusrIAK2NTM6XexJFRjwTXZ8PL0gRQStqlDzd02v1Lrm0VRII1JeACYxV4ylrnDQH_2HRq3Wp-g_6IHTt_L5lq8NlxFSDS-gOPsFzCArQN4cv9VXpNUjZ_tG9P2RN6to1GMAXVrKncllmR6jQYiC8eUDxYLH39Qte4zg1OEGwgwMY0__F45CU3TrfjfTFDLzqNi7GMTsYCgy8R4ErNi6d4mA_ZUvKrlQqWWjX1YtbkmtreVCjn4RS-XD5dt_52CG250LcFs4EEXf3GYrHx000yuMfTHRSa_E_FxLnWM3Fay_eG22Fiz16fqYwzJ3nfzSwqLMBpysXK0OKCwPH33ekI57_AnQOiB3YM5DoyLpe11TFI_FO915M7sfHTO7WbErILydLLAOMyiPQu17dAqFfib5kBomGfz1_pE_gdDsmUsGDYwCNzbwlTPji_JD4MOwGv2oPgMigQqmB5wtF7I09NFK4MnpuWo7KyKk-6GD4DjwhwKjXBo_8zdy5cHh8PE2FS6J2U1MGVNH9mxvDSE37gws8XO5mIV43GQv05CpzEpTIbVzpTrimHoMSjZ68r03Eh6wG6bhUtkdveSadSDUCVfkmRLRTztmdNTPrnACXALX7jkXwTZnA47M04fy0k3GsG7i5RuuI76NmXYGpAM2VwyBReSU0UvO32Skdxx8UyX3opJjASt_baky6npJVHdrJkoydQbl4sFimQN8w24zzskjhVbcDtegrR11Zw-6O_XkhXKDyBoa7SHhcvOMkZH8No20tNZhXHKh_Yn1WatPP9JXVpqlnmr98YtYzeMMJ_MUguW8aIf3JONbEzir99ZQVF8p79N7QjvfmpxwPi79F9MdIhK2qgDBmDAhPQ3ZO1Q2A3xTPJm3Sq59i2g3oYnkFRuOBiUTjNlIkO3wo67Alm3heN2_ZpQE25Od1AvXPGvlYwVvl5KHJpLMe9svxk0f5kGCMkLK8gpBieVC-vvtgwy0CKgS5pc-JPqwd6NUlyMcLrnpdiwOlx0U_q1C1y2ZSexPVnfL5XkmhnHjE3zXr2RlPrbeYdhl-LLhKIjUORdLF5FB5rxkTV-w_jduaGAsuysiJ15rWDLSBkH9Rytw0vdpScjwQvyUVWC91jYKJ3_d0k2YzMFzaWp--_AipJeZaGNuR7mSPv5wlv-WQn-uXHbSrYef-SYhb4M4ULejR9AvwlFHfsmp3PfbQgZcGzOZnI_bOZmzQMLNF-_u3ntN-1NVb3YE2-lEUSGEkZDVCAv7n9072gWxZ467gEDG7Wo4wEIBv1PKxW4H8yxIP675IzgpXK_bkWbjOEXIOez-ZseKSaivkNICwoYUkNno5lU2qpiaAy7iIGbb66SvB4WRr03zSh8V74mzhZodbewx6fi7UrXkduJvMLzNfNq7Hno7oksGwPxOkw9fpQXt1vYenBd_SSkT6RNqrGnoYdGF1yKyxC_W7idCuXEsRFHeP2hFGYNvaCmCYrEwb1WSvd0HiDGKO2qakufsJCVhzaXHFYDwY-opg9eSHgb0tyxs9Mbwjzf4UUVbdUH4O_WY1ZxpowBZjI-scuwNbriOHpDbKkZy01uIctONrig2lYE1DP4P2LblChRmYa1Zj_8Kvv_7RlRCr5MT9UfK7Q4DlSHFt3h5P_NBEQnN-VaEJ-Cjdo9M8lyjMBqdwyzTd4gsXKCT0_eSa5wJgjkG6XNXtyiVZ9SJ5kq_5wxhP5KpSZx0MgogMs5ZHslymYjOWSyzfGDXbQmPkox7Zhev7-uhR7w_ipn9JtP20xiWFQkWNEPlhEUfzrDBzpiTIkt5r1yNwoFyx14raqHATqNaj4QafY-ciNor7FkdY3hPw0Mg-mKeodwiI_veAYhFOv2GxI0TxWqPr6h_VXKAZc0dDAFqsC_q63C72YFSadk9-UOTe72zRwBtpvY_tb7hIJ2K3x0RudMIxscddSTkrNwjs290n5xFfMnhHrMGlffchpgMBrR8ke9gCzTWb55ZO2Csbl-aCW_gwFZFx9E9i4qolAcPt7QwRrYFfYlktSrLsHEOnwgmX50GNLe98SfJK4bX3uPKxkZ0rfQbgBj2x_iVpH75ANr0xCTOFVbsTfLZ7p8UjRGtoijvFyaiEh8xcxKgbDgL8sK-nIENOJOvnKWOkuszdLzQWzfQJwxNEOlY_1AWkuZfneq7C9qGQg-zQzm1yU6P5G0RI-xgafN-d8P0GrRJJHnYISELQ4TNLyZ9t2pjVggynCgkDiVCI9dOyFO8laDwKQxGkHqGMJpKEc6mHTUFIEafmm452uVig65qFLeNPoBTlAqO9m4RuhGF9mZ7RWkKRBZAZ36fhw4Xq-Xcchgt0t8epegoGOyPkNHpN4q8lqJRl3i2gpYXA5iH_LNVvjTxJdC22T_HSPLc3c4g60bOdBUs6Wn8klT3cVWnx1LJ3hVXNAU2VI50WUCfP3IeG8BEnkIbApFynF3Tiyo3PgBE27Jc7h4NkHnDQTgI0wuc4iR5G_pogn0VwDcjjiAaP1SLsspFehEfLj-ujzRBTC_WAp16q2r7zPQAqfXZYVSy3736gjTDm5kgAb_mG6C7zAiz8bi3wfn3p_1zoLKa37N81YT-_EWuT9qGegFzEhqC12L_4bI9uqcrRQAz7G_u2wif-4vgZh4-tRFc9YWoHZ89c_OE0YDRrQshfhhTAKHhA2eYKrn5yqmAAZhvcVt5zFrruKMgJdN9q5dooUBlXzbvkd7w8COKRO_Dqn4eh01B6JKTTUjW1H98UPdX0PNVTbRv1YNWuRacvHiTMI3aOp5IItTspf8r1kyRzvNfgr1jtGtE_NH0Zp3xHJdyZcqXTC6TV1f3w7DqoTfo7BPmG1o1lFHtAOdf_6JugZGsS7gixeP717WlcjERJFWYYJa-oNNTg2hIVbljhO_hDy2NKc7AhzHlEDxwTlH00E-jUfUJuFWjHV6umcqAvdLLMfzk8vKdu41BWmikVQR5GWmZ_hciUk9Sb8h4JDanXsll_j8Az6XvPuP22RK6j222VYMIJ31rc5-QwEm2l0A4YNlHDKbYnYqtCU_nSlqbBbWmCQjZqmHuSH4_9I9fMwAcboevOGi3Z442ROcfpsWVnOuQqJcbLNppQktfaeJUuihU1Ndbru-CS6HjkY7MIoJkMNfjfVSyAhS1SMxmKEN7oXqNrq33rhIHfuBssO3X9bgcbL4uTWx5Qkzb0m8QNJ-vUO3ZW8vPaSEWVdwY--awhfL_OCOJh4DKV81AkqyZH3vjDnDqYwCGpnQD_DH4zUNEUsf08b5sJNHzVr3QzsCiXv_KC-BKUobiSWN0NSAGqleJWaXvVvWfuF2piSsIWM8EMrDzSshh8HtSfpUJSgjg9O3YaX10nRClzaX77G7EaUUCwwjrghDdIjKYwqSMaevBxXkNLbX9F7pk2qZJgaow0obgtZ2FD49XLI4bEVgtVMw5k1I37ffmWRkJgGSJqTf_t5HSqP2A45_ngQKLAVv7xmqxl-SY5XKpj8jb_TzkMkCZI5n01ddWIPfrNIVg7YCBjmFEJCHo5I5D1B7d6caYCd1YJ2N0tBH7GaVQmCqr7ualMg96UPrRn90hmmi9MsYNLMzHdFIdocCvqsI1tiUNQMii7GpPlF0X3I6g2PawJPEuw3pg_Tkdf2uREGO-SwaeSKby52Hg3jfTChTCdd9ewO69OIWH1y15t8s3er2d-q8cT63zSm-d-NMwU45XfYfmEHgHAqNIE5sbiR3nN-x1MN_pvku6KPFPuT_CllbFvbmLZqYpn-hO-O10xny0FJxpaa0URVLeAF5eb4CUVcvOudHtEqkh7aSdwUHDBI-T99SLfzw2N9GQEYbp-ObY7Kd7fHXkFEcN0TAqQp9eMNw_uFyD4od6j3vp-d5bDnR0Wx4367sjCbKGxyByNfC4uBZEKVIRsT7fSLSShJC5oJFTnmsn6HT8m3bdq3-Q4_cd3dpkD-HU8a34MZ8MDMkO-G53h19AUxyERfFK8h1kzv5wD258_bfBPL4jvJIDO9yT8qjFz8zVWzAZwp-2hIhd0rvnW0WGtmyoU_j0mHWB3MVUWv0-EuaBcJVF5JNaQXo-STrFThXzGqkjMUwsy3OwOeYxpxwYgqv6SYcfWD1_4NjFy0Yxh2aw8PORTKImNq7fUyD5-OkDdl2nzLVmPgCltGsdaH9_ab8GyxQq6ww0JOq6Ne8-nxf75iNTgFj9zYgHMkdfSrT9npCzy8B199rcK-0GSRDF2hba_TuMxsMgR52wc5hlxgWIBlTZYLaXTT-8HrkBrcJqaRbpWFo6UYMj2ETYFefs_67_xMrEDObQBWxm5BLdngHmb7MVJcUV6xENwu50oFcvYWcfO6XN72UhKogUjDaQsgsFYR8F-LxT6hnqy0fScf42K7MI4LJJDeNeppC7zSbJRsTBjDBOHMWBkWNZcJTbd9RHrOs34-SJYi7vRXbaKJQahnRmcYUHrKRP_Ph6yJq-dM3EDf3gWqdrlVaLRYQ5g1d8xc02fkvTKUHIJ7rZCOGk4Z30tDm2-8_0REP2iWc8sGvyXM5NFafwUbNS1_P7IdU6MgYkaGcKrnOXoDvvRHQaeqlxBUFzIviLtPDy1fBukRkgw-ElMOC-BfNmdxwiChK5yGC7Ml2k_oprP-vqy9yTJU3U6p5ePwCdMUHq3pQZ1ajpP0WDgv1PRWlhvZYM-Oi5SOMm5_QFVyctGGP7ZOAtq9wqZtzPC3ZnpFMdCpd3YqHfRd6ySOqG_Eo-V8XlCc-HXWNvvmHhoNrvyyx7BVvWI2c9KIDmmLmF6B2l2ri79XhhFeIRqJeabkZmjzH2wONcL1PtXI1OYmSFr3ij_On5I9lEWDBDxaSKrrc3Zb58Zdd8PygcS6ONL1lp4CPCvaUTAOmdYUwrnPuBY1WToJQwjl3LI80GGOa6vIfxOHvGYS4w9e0LAANh4FGjbun6lHCqM8g7v2Bg4gPoVEmH0Uw5y3zptdFqzbzj98pEjUkK99fhFdrbdPvZ1pD3YfeNNlJEMINcfcQ-mRzr2e5RrIuNMSrTpPqRN3jJEHrrwraXs0al_C8qSZJi-FM-vx8l8PTx9QXmeJTgtKuCrXqWGuFxrhU_mWeN-unXZQc8qv-_E_NPeH3EhcnY6aP9wsJtgTtTrdGZB2i6pmhDywrdHUeNbV7vf5MWq3xcpf7ik2ITbKgOuJUVC6_8lGLND-9SUiD0ML_CC7JHe7pcf-5PZv0A3mnGS_j6NN8j3bULZ-aL6EUtOmG43sNUAgM9uMB7j2II-PxJjzfCnieP3ykbSkIvMUPDrDL_kEWjKTIFfHHjeENgsjtx11NTPtmdfCOl58dI3pAiQalxnJKvvuU8rhGGO8qgy200axHWnW6p-oy3Ez2wYh2rsiIBzbApp-aGC13WYnU3jMVagtivbS2QrupU1aFmUdZE7aQkPrl6E7o6Nfb1OatnYa7rx65xa7nCptnn22tRri1M4YygDWRGEUPj0wDQByGIVL6-4-JQOrMX-TgJffPg9dS406yNGhoWRHRolhlnhA2tXRtZYzK_IO4aOMZNI1qZmEjxyRiMXaRqNTG09RkPwnLjwdcihQllIlNYwcNY3Py1ki7OgucA50g1uEFkWiW_z2SXtlPuUGldFdKqajo9UBIahfa4XsSflzNGPShYPhiP1lZj7ZsnVKkObkbNXFqsxfJMX7MOSzrI7y3gGpKDINwmZv6dHtmknP8u25Vf0tsAkUjuSfh6X-BEMpbrVpV5rodNES5kWUv9hZIUFJfa3poO-zW5HjMnQVN4LYSeevoa-DlciTOiQIs5l5219aT4QkfxEEFmGESQdVG6XvHjNyZWUCs646L4sPnr85M3Zz8AXqHM-7d6kbZazofuc2uYvOLkI7mltqJwlIkJTSEn-eZMpx1L0pvPN8sUNQ8K8V0PNHwjWTPcOPbJ_JyEPIwUu9Y0NhBacchB19anDGPFbuGQo1716hBryamf4RIcJPYcVrhqropyQbWgBN0yf--Vt0M8Lbp3uWh1buyMh5t6GBedvIO8zVoY3fTgGE70CaoYNDGZrTCsPVgPS7WKOuE-9Ixg8nEy0f7-e0v_NbWcMwbXeey5iMPCCyCup5rK-gxapnolML3GBkSzoW3mYqYcnRvvFlYr4zdnNkRHfCP6RPpV5ghwL2X7Kz8CpZz__7QN2k9c_nYYR1VY3jPmGgJ6_VJTePT5z54MwzbX3067AL96C6VUCvIJqvrie6R4va2N3RKBmc3jfScxKPUkKyRaaLTnMVBrfyxxYOQdkJtuBrWUIxYGYm83Ub_IIxGlSiB9pOcNeyZIyUSwJtmRUpCPmr00AyOB1slO-oMPb1q8QsE1sSVQ-115ne-uvZ9LjNj-9K6UlRdI1_ipfCH9yobAiOARFLFDquDIVYfkAGGoPKMDLkhginQylISctHPYyT_F0fPeN0wY_jnZPC47BhIU36nJmFnKhm3Lv6cYbL9a9mnawpDHDhmaw8mv8EcPA3qKInnzXSFt9NXIrqSWcKX10gpiB2zAFyW3WWDi-66ioczrEBx4BfMmE_vgsu6QLpgSH1B5BESKIIJ2zQ0bE19ojN1nLIu3w7a2ztdtBa2xb886xJd2yhYahgqBYHw-izX6eLWZ9v0fd9SW4i5iNmgrlMR-YYTg8Z-qh3MpVVY7fGP5ILSzVPs-6DLZbKkTm5gsjI8csezNRftliPciJKnSHpEb7xmaPQm7Ve7ityr8XNW7ifp6hPIksDZ9iECdfF6RxG-dxm8x4LoEkXbaiYfW_iiyAoaC6Zjt5vDAgLO0cxSb7qCk6T85fOcc7NZObCMefQr6Rlsu7OoHscoAEi_s8W2koIrxv3MdeAxjmBa6dzSOzXYqem3RxcLyl5PEiDDSwKYMfAWLGHRZxCEqG307b9rl43udytIGe779OftTIu1IqaqrjTTh6gP3bMR_ZpLbz5PfGpwxeo8NKEXwQ7TW5FRIB18abrL619DILIWs7FQmaioeOAP1czsdO-VEYYMJqkihItrauKdRGFOfw-e5bCmbA5WGBwWZw_TkmmwQgg0viJDb6SWaiWxk2QHlj9MxQHsyYFKhhrQZH1F4yjdFm8dA0UXWuamu1JoY6xFUbBrr8aHOzERRijcFk7D3CKuiPDSyl58BbRfEusoBvfsq1tVRpuiT-8LEBmgb82MY_eC7a95FbiH7BSY4s7AflpZE10LtXH0l3BhBHnjeK-1zy2MtUG1aci1bZCRwkbkWdL44_znkt5Vh2l2CJUIrEML74xLngyZY6qo9hgRg0oymqBfKg9Ngr2vyfRYdVrb2Q6j-3dwxs59BvEH7O9D5PsmVZUm0VOE7qW-J6qx81fHd-iFWu40sNxSLgaDOY6L8djG_CWGO8kYRYWNNnlPdoWDEguKNJJ_lcuqL51UuaiudbMMiORYFU6kH2lcLC3R8b_D47iigE48bMDMTrrkANqGiRuz5tF4K0jeZlDF3HZlIvQ_wOMjouH4U2yzmY_tYUSOzgBUHPpQeG-3XUwogvrJ0Gf4CgbE4TjGvP_YDpVfndgDXif5LsXcbXidjW-phbFWCf1LpBzAjyzOKOmxVm6gqmeRzUCmQ7W61AIVh1BrqQNWCzN82XddQSyMD_9NzrAULJKcN_LbhwdvoFJ8B-Qzo1XSLDps9Uk2rSvgDj-_DbwtiC_0pwJRfqQ5c6asf2148PhhoTsgT3CRc1UHuWVegaTwmnEzGUSF48gksLnlTJCdRfBVyX-JiYIXwk4VCY2kMSdJ5ZljK6xplS87_1vXbG_hO-Jdb_M3VpmV4GUR4nzSp9CGtthT9NGG5tcqqzrj4ABg_ys1jzLmdh8Kiljxrkj0FkoPDgXh9mpaA1twzqIGe7Kl8dC7zq0kc1DpJsZe4le4iHyeM7DwkdDVrhxsRSGU43hpbDGJwWVrJ2E_l_UopU5A6mzqXLxtmkrbZnGYDdkcdGtwNBbKM6pVV8uhDMMfzOa4DzbWHhbnuGSqXvSklf-xzTAc6mfgT5HHAqlGw_-10sLTPpKQmYy9PLJw-G7nqwhq0nR2oDpneb4qhcN3rvcD5en2Jdut07czw2mumyG85hmwYPGb8AmH1anMvQumg54q_ttAqvOv1YSbXxws31gMg-T6dBxfKsuSK8S5wcGDc6rPF68s9FW20yYY4AZf57FDmcLwlBQymOzhYuTpHXNAXDI3PJ3zdxFt10z3lh5NdhfdGJ6Ov4ELFpx_onU929BURL9xH7H26zPc9Jn9NekWaM6fJ7Q0fJGpv0nhEeCluIZBM1o2AMA3RHr1AvByuKu9Ggv-Nv6oUJqL9i5JS6jrW9uu1MFizQpwVWCZX9lOXRLsr9q4Q5qrKpgrpXO7aB2aR_GmWH0nCcu35i27_pqkWp9CRdfQtr4Y9Lwzv45PERu1MdtHpr_gJNKIy9XEy8aYsqYzdOUFDxCzsICkkeQ0zesiNfG0cqjZSlbkeoSo4RawG7lYuNG0NZaoRAY4A5aH31VBJxyxdiVMD13S1N-ay4OkzNAYnqycCUh4DVn8PN99pYCVdxxCuMLcMtCFSDEiFgbwGDpB8x6Y8ENYo_qqNEKmWzurUKuhc1swB97RJsS0gVmTysDF3KYvHOFiL8DbL8U8rLW3dIxB_QCVQCe98jdrpVpZFIu-Ckn-4JK5yBlDq2IyrkHWHpkKxdqT2LY46WAYjsIbtil1ROqVDyM-zoelMx2mZ2q6p0B0yUaxoUojX6V8JeM9aCeE9J4dW_1kszdVmuTXXJ2NLiqMJeajiXwEQbPzKudReLznbC28OijoBGOXWoERtUa92-BuqGpkFij_hAnYx4LQO4HoNrZarrlz7WPeyVVbL7MPkS3wtwCgoSQwTRXguqUiPtU_r_2NPivBQx4TS6wn8ZRnyPeePXyGHxq3KTI1mvfbaEZNUaa_xECYdcCrLF6PSr5G9XOnOHI90gaAw9Hm03dkl8IZYXWPIbhpc240SPaRPBxlDIYgIRJrKAq9rdEFjeUoOxrHd30Y0z7uF8kHLJwCJ5jJ_y6v8wr1ZJKs133ectfZAxqDQumGEaMk-RfgBbNGOzBYcpuCak1zdRTyw624cfLcKKlV5EzPqVVElVpB51On51E8PZ7KS06q0JUPE2J3Ww3DybBNjA-VzMRfvZOrq6iBJjq_-mAY7AJDk7TF-kUP7nhm7dFAWENKib1iX2oH_cAbo0oYH8FmWl8lx3KczbwXzElxYlqHernuyY5_kQLHcSp3CVHCxPiZAFzSeMjSS9j5jwSIMKpiPL4XALWP7pi0ItEaElVkoH8a58xYzYgQNM9XBWt98kH_vskldX1Bmpb-sCfUbRD22jFtkzwBkK2Furz_P96fuJ1HmENGgNGqPHf0IX9dFRY94GtD0J9mbT27iTUZwkv0_Eb5EkLaLTLw6iGz-4nB4O_VAsLH3X91VqF1spAxB7KUnVfEwRrdRfmOG1MSNMgyavJypMteJsove2z0Pp7wWAv293Hv_T9IdnCijO8Q_nu7lcrF96jTItKvUFkqbgjy9_WH6kUp8nSWnYp26rblWJxuNyGbjPUVHPYzcNWfX2ntiDWXOA3ewKJen9Z12GuJAaYzgIKbyu7S2nqzkGmhncWdL9p6fUMjpACw1PkazlstCYhHnvoe0CmyTG8oIuCihWQ7p70INFgVg9i82ePlTu2bp29ibEN3JCR9nWeNCgt7xp45MbM2tacjD5pFYbFP-GGFMMAE_LuHMghRB9fn90QjygSTmG5yoe6FIwOtT5cZBy7qmDUKvIshi7G41F07pTPPHPOkJldffQGajxepZT3q34R_mFgz5OncmUR6uC83jrw36yo4CzOlLG42JS_w-S7-JoL8_E5X46fb-PDyGv2SyLAL4QIEanTTkI4MKRDjKCPoc-Xkxmj0VMf7DPYyuZGmdwlwRoUdkO07ywF2B7lFbEE09JRwKT4DhRa0CkpGxmG50hT0IKntvR_Hy71GgyVRdSe0j2pisyE8cT97XLFAP0NP4APIaVREmmFbH-KAne0UUqUXu8hze2q9Y-Y6e6MC-HKwXnpPUYS3eAh4Qy2mtANofUhYk2JRbbC7p6gZdavptCf2o0XAPcVPYvxIljZCzBfTeByzjEM9u0P3GnrPRelNrCK32HBu-6xluAKhg0XUToWcFhru_j3n-qaWiYmBfg_2IoulCDo7prepFT3ZIH4oAPbT6DpTI94I0d60SQPr3pnhUMDoWPF4iq-DykIw1q0MQYYU97HXyZqkDRP94G5S6tCWUrE9POChoxW-nkB9mjJe0xg1G4pDQZ1IkKwI-HOpqBG_w44S2tNYEL9xf_PToHTXmSavv_v5GXntkOk8yePbNHTcPiS8cVArKfirp_KQbOKL0-lAiSnhKjYJhSfDu8tgWyWnsM2p-TJ9sdtLhylBiED6JC6fN04X97je5FYPTAOF_8wDC3w4yS2xmBxg51toUB4i040uOX3bSqGerj4N6u0EkGa9hsr_deklj5l7AP9_xKPud8ZCVpsG8cO4bTKT1w_3J676704MAuS9ms2OvZcDscwmlmMHnJbzY0r0qUNmey2qt5rFvUo4J6WrRCxK8AdMn15h9FwSiFpmQG_6w8bWkwot9JidNvwCU04-hFl7taGEtwhENUFH5N9S3C8W7sQVHSN-5hi-Sq3LkAcqCZ66fTmrrjIXoky4Ki68xnKXa8jZlGLXhTgHZ7A-tVK_h8UKDObyeF2FITqgTAD3kQZshNeI5PjHMGH979MD6Puik6e9U1XMglevHOoCC1n6RnPlaDLxceSrpp5cy3mCf3uuY_pIW1Ftf8VKaarrYLKkiGvLsDL7YXJjTK2d6iXPutuihUud6PhWIP3XgDuuQnHv8QcmP6DfzC-fD4WcsDfK6pKoUK2iBjZFj2TUj2LfrDBTcsP_qnOEjDsJ9o9KFKz0vpUVv061thb1HWyVqLWBbFSNJXpEyC3Yp89kYaO6a5EgjjKmXYZZFwzNzzyLJWVgczDk7I1eUlOGzZzt_HJ5mSpnxKN1LDdJhRLhQgVK_OWMnw0eh7cl9Omoy-IDGBui78WWBK6ZQam4s1qbaGgK629qJ0fZ0C8k_lJtnV9kOo7RB_3FtxIIDoDmgoZ7G2E0r0rZflPK4CxSdMEcSXddi5b9vwjAuo1GFcNnAMYgfySEzVTzNIZr0to5HeetF2FKoh1Z3W51hOluoW434KXayIFHU1GG7lifERWFnKwZqTcw0462WPFGp-p0L538gaGqfBZ1ia8hmj1c_Pa6J5MWRXbyvVKINXSBQoV2pA24_HgIhXVg3yxbgiBCLE3EvK_w4QBlmBB_LMIskAtIBZ4G1plk7KQcwQg5R43ryJvh__-s00yJFBiIBJ4jyrR8KgDuNxilSnIF3A7-BCHhqBYNCK4vLQG7otGT1Z3PnF1Omyd3XgONihddpevOQ0w5puQqic6tOf0kCw_L1XRnY7yBbbT4aV9ozSd5XgYcTIThRAgp1XRrIFlDuZBS7Hi7aZN2mS9YrAjulPA7lapwysN1m18ZkIlk74qH7NOh2omev6XGXnQxZQDBYnSH9O6Nq4LyjZJrDv-fe1doz0b6LGKe4XBVMnSdFPJ71Jg1otDvR_EXG_pw9-OGgNgh_AG-FZLS_vpNyJo1t7GE2Z1U2v-fganaj_DQ3GqOxzz3jnPTgK8HXm_w9ZVGTTt0mU2k1kfqVvmtXAwPRGqm_ICnPHwjFEYDiMu8v2tf3c9S2XG22Ic2YkR1ugpygI9MN7jJRZ2lMkPkMo3zoeYAvF_5heUSM7R6ndc9al4kBntYQ9EuORv97ACrQuPMbyFbfGi4vHuJ4VA04MbzAqu-6CpokdHQB9AnEJANXOHOwszTRsLettjxon_DWjvGh_XBfHVvGJ8fOupMUKTOmhshtwEkjeyml7LGpkrMzin5UjRs7BfRCw7V_mQxJrgN8-ntZfUY1LtxUOfEfBl6w5mrZZSEhByJ9-ds1ytQvCGWvR3LZ77JERJw__Fr54tdSi4xpNrguvGdEypkwbR8U4Z8aKrLg7GVPOTp7A27ubO5di4--oTsqnuP_LF-ojPy_25X5nlt-dr3CxSDUEQiIP8Or6CmeFRmQkT5mNWGk6lGb4GUZxAwbZiNREd2NvJtoBIIz4I9N9LBp4xLUo2PapRwc_Oq2bu4k-b4FK9QzkBPZMD1PhD__SlzC2pjS5wv0JncdObo2G1sx28hmxuLsFcdKXk8k8i13Ie4kDSWkLuLEq5unEY61WpVeX9ITQWzrwSuQT0aqH7xTvQVfijb-uc5IvEZOkG0eeMEaB8t6tbadWVF1cmdFZ_c54SX19s3dWq5sSI94p-oqlGrRymJLUjOdE3x-t815MYesSqglDck4cuGPW_YYU7PDN9XfS3Osn3EiOhx_9-qoRaloqbjMnYkaccAGI5AR5OKuuGMvmgP_L2mY3o7Mn230ttlystCRabr26v-niisJiJCYMlYV1xwhg1lofMP0t2eEkk3p_CiPW-Hnqth_XV536f-tFCrP2V29VkJIWkGDpqROvd5GIizgzYLjDTFb8eRtAhCmvMIP7Z6ZaN3Cv7pv7uCikF2D5yVg_Ebi4Nkr2WuxzGZuhQYVlGZtrYEEt66VQ8DhM2PfOvWPXfphoLplQpWvsJ0-47mUvI54pdj7iGm1VqzW-Jwp3gEkISZ8l8gsPFO5lUgf11LhD5OpoF3tSR-zzQvVDYBYf8eUbBd5wcLSRGOw1-B8fWYNpAt1fE0aBgfPucISl7XUk7IYKcYQmHUVHH7veKiSLRe7EUNcq1wk4yy1reybXnsFYvBhD1yCkBPRlt-MXRea3AxZICtGRQQUDXnDilTrMaWk5cphHlVnqYD80qq9B4ct8saYg03pFpDNnFqcPbOkM7BuKba4YoG2iljAjRwLRwsfqjbTUHuWrKl7EM5aa-m81J9XGYgkRPVznDDdTpQ5I3HiA2A5ZLSe6tZkB2vTa6fgQysi7aGXIePIuueUIbAuLJQqGrgL29KZu9yZx2pm4t9AWsvxMnOaY6W7uR9ZMUbj2reYxZkYadcC1Rln87Pb_e1PqETfcgRlB6MdSiP6RyogivRO6PThBxoJ6cXQm5cTxwz-T3rhUtX6SNB6idj46GJfMkQ8ttSi1fI3AVfWCQhMfe95nHQz0wxSYLeERJDSnVjCEEArnaXdwbUh6NYWwhR0vKSmJqaNCn3EFu4NrwC7xtmy8qdpqx-zesveMZG-g77X5YJ3hwtbwhFO9z23ZPMsR_GFBgxIqQzeWX2CMOIwU9F_OkCvl6bNeaBQZhDTjxqBcHD7cxbLZ3X7gTM4iTSBOeGcxVczaHdfGmOEk1aV7b3NYZBhw4pt4-Tpp-tqyuwrWpDBwww_TpX25ZNyfi33AqqvFMM_dgnrVYMdydfHvNubJzNKr_YWIjhTQ6sZvTlOqAy8362VZIK-gksZi53L8bj3usaB_-kLHtdhSohDUfxCJ8dcfdUqyFcnH9PYJ45rMRaCodNYkap6acHJlFszanr0_9DmE35Gzv3sj180wNSAytw9ASGuku3BihoZkOkaa13YiNuaVgfoYURyMNECtPYRTRx0zHiC2pdIvyIZhTw37E-8VYZ1RemdR51bqeH2KQ0YCOeyOLaeIUlBELxwRmSCXIkIaRRcpM4BcAqd8BwkcAlvd-VePgDuEFaBV1UD7TtQHfftVWR3qbSpEkakGgPsGrvki_1hLIlgJfVV5YDqjpl8zq1SuGc_VR8bJHE3Ey7TCdsNtOvnDsGOUSjoZgJWhDdl6HLmh5Fjl0wcyi6FGcTUGTAxKjWyXuPV_rE1zedl4OnIULfp1ynsJkQvd1CD0Q4MrSyP6PsXbCkTm6zfWMg0siQEllyybfrKj5meyJ3Iz2qq9wZghehDhs4FSb0wN73i-Ijv1kmJk_V1PBpUGnf-N12k-zRCy1NRqRNA_dzEA02B4Kqv5uNPUcvlL_h8q--6UT8i9ZjxA_REs-eOBewuN7UMI0uS2qmzbuoTnlURUQTUuDdaf6puIXYucWJ0dHYSiVMpNPrpPWGFP2MIGvZLnv3w9vLEWCpTFXF1VAa49zrQ6kQsZ2aIKCvJmBgUIqwZreG_WEekh0eQGCt9B6ez2dphUCun0XADV7HTRUfK1JVIyJovLv-bUJM9H9GQxH3S8hu-H4Xua52g852KFKgumb7NQwx8pG01WB_d6vYspA7RuiJCIVA7KMKeE_y0rLHcT2fiHCSQMXA9AthdpzfoaVtHxj378RqnYkICYaUDLisOoe45zmbfFhIU_XLogXKz0CPJCrsuHhviAThnuR6t9c7tqJz2UhGrl1hpp2Ar_tgScQM8Zhg9vlecnbNfjVr115EOsrYAv5LxY_zqNuLsyY7mP93nUMn5PBJ5vLBb1ukP6WBNofTl19-SR3nt75X-AMR69OCllng-3E2FRD2Uci-xjhaDama9-OkVgJ2AClXey2xiRPwh8uRteUInfEFxmcnT488HHvD0fFOPzEU32xgljblE2HRlfHTWSTBZwZDr5XYVadIMN_coAhFkdnWPV7FMqq4ctz0j1zCFo14QtvvUcNWXZZ3EriMgO_F2F2KMJc0lCQoMM2e-uAqkkqRDU6OVwGiFaA-PxAE3nSIv5WzJb9r2s9ub_laBng00FHVzvKxbPLiuJA3XCeqOPWdYJpN81WsbeoIgFpKhoi6x8WqzS9g99xgcsz-t0Wq1eojSMuT8KErux5KhncZBmriIDayWjK_7usRTWAmGU7K8VLnGCIgpUh_ZNoXhwCruuIA-gyfdk-u3erSFfXg7W_8-58ReU-s6JC8-ZlgecH7jK2lwvI48iV8WRFTSSfrDKohDiI6HTaTkjtrrPbY9TvQHiix_OoASsauacB8TtH_76cS90FPPcXVkrCJbJ2I9Y4F5N6rV3x-TXFwdYgeKqpN3gLg2q2UK_qBhxC2542uOYq4BLPMqm3MmALiZyaP8d8BmH9z33u-2aOSegbhaIoFFd7WR5AhFbnrUr3v5N8vXlxznPDikrNleGj4wH8KYNRCjjihVT7Kpq58hnG3X8-X5Sn0cnd6qq-beWWXoSneGIbcms7tPxH02PeOiTgBLWlZS97RcD5hr_zZkKeZqUvO_Yzm7pXCk-9Lu9CWfzuYhS2qhQB9nHETG--CLSUSk7hJlgaqIaGzQ5BULQgvigSR-VwZpK7g-CB8gIEHqVKwEW029ityvdARW6fUdMyTdl0o5BOxLAkk4Uq9ZQ1COPIRldvilmXIHkrDuU3a4RsgZN2jxIpRsN_G_AoF5rfTFUvjotzE7cNMzXUUXLgkkvamyf8jwmf-tHytRnXO45hJjgLHpHDO-JnmrodGzRwk5Cx3c6EJtBKaNuxJP-Q3945oELpSce7jUe-rKMgt00z5i_67mCZ3Tr96o9Z8dW-BPsqsYi5QJFbFHBqLYRbTvTjfWLJcEt6JXOpnjLCMeIm87CsB-1wxVtn_GNljNOYtbAK2hbC5SN71HvGyD0Rejxm_uOvnvfF833KGMUeul28l-_lWOl2cowbse-im8e2il6C71g37TYijEX88g0-BE2clNl9OSobTn_eN9e82kz-35dDUnCrdnU4gEi0Z5LOoi2ltmiggpeRzgow1Awynv-6tU0u_DurGQC_gnEasLJkteC91DA8qd2nRHa13RkasAelyszBFnHmuJhIWEYUwgSV-hshyiYIiSdO04mQF1gDK_Y_6O3bqgr8LSYs0a2pQkbeR4eWPEwDONnYuXatFQI8dsI0lLC3xz4XpDrsPGAJhZeMYA8lGayUDabBnySDLrkVkGv5gzgiisl4EvhR9fB_-ZbSjoQJJJZD0whgUMBShtS-67zo8SZ2c2-2sE7N0GV4aTm0FWJUnCnYI6KT7sDMTIkEJ2TOgUYE1Np_Ee7LKY5lj_RLBdJm6FBR4cKYiVzdxGNt69BtrMVPQcYfO3mFT_6WcjMuHj3C4SFCLEmlYtO-9zvMv0N2A5bKs3KMs51v_PCPH8fDs5ilxqjyUX7HaR4wdu_XhTaMWfcCRRVUArQ2rafwsuTK39Lokyd6UJL2MyCONA3NiJIYM2Ec_H6BXwEwf-d96CwEBFhwpQ8GLYuGXNIrMVjLwSBBXurnknlExSYWzuQsBUEPNJ_HFpnDJ748KyKw_B64NZrAVJO9ncI8v_SnPknFZQmxDBcKtMzks4Elxf_jMah8GN8n5Bv9bpx0CbzFTXt_IAkhD6i2UVWdo-DZyKg8PhZkVqJkAmG7jcZtRRQG4BtlcZJZ-kRj7f_HMyWibHMU0jWor9bBXmNedDSTnFmtTxGX7g1d7LkWMpUbwSdMDEmsDGQfqVXREfetdNdaOgjAjelb9wPp81BDidHRjQIcKfFUsK3_qKkobO36JyVKxKuXvloLBpqW4CRIxQfBVHdNTtrZNANH4yFI9Uk5PlqBxLsmLKrEL0oHrBAzgMXe7MUOiuGV-Bhhi7H843T3tbQ7IZAVHeW8GdgNp3lYKyPx_4TNiZXleJ981SN4fNlU_H_-SWidIR9yeFR3yERlHpksxihqGpKCW4QYu2KeZDf0Y-9U71stYSBJWoP4L7qaovdjXlAod6Jpe17HdjBdj430hPamBEyYOAiDrALDv4WDmEIsRgy8F203E3lOF6t25K8AvgVs_iycqiIXbEJaybPHu6yF8EymU2gBZMQ2hXRGl9NmRur-Zes2E6hTv1x7Erfr0fIsMK5mllO0rEVWY7WUSVHTc4d8i_2Ek9f0Yt4h0WP7BCI_CZYPDEfUl0cclFajYcPf7yPzH4fpjNXu55lKmP4a8k-Bv0eE8CTtyTX_XDflYvLBNG-3W9vrtNEA3GmP4Gyc5ejc4GrPULoevpGw8idZu1GnUfd_ApZd9HHyByM-Ajd7_eaQ7KU4ihOBzqunZX3qgeBwdNfwR4D0s2ARstwZNco73Nf4GKTVUzsTFU5Ou3sH3mum-hDqZYMl0ObS5G5jpEltLYblQX8GwHnY_mGpK9_4u6bUkyRGC_T6loirWZkdTjRmMCTNgJ8hS-btQjWRX7kmLVQgWsD3094qCZDUMiyk6ipBzaXytyK4IluyFLsl2X5yV0yXb1tZFcHQgnVG9d_oEUNDAHhFywIB2l1TULAb3-_8yyQPfFxWuXNmIa0VUW2RaFcJ20W_Z_00HwzSTTDC6Du6AGvqJnkqTzn5ap0jXjCaX-1VgczsrW_VbSKvbhNy0pLqX1_CBkBPvVbLId2iLZSVVmeE7tbI1iWazSRWCzMe6RxpshDjfw2sc7l_uHJv8B8H_EJSeSOVL7zQlJFO376GZh-34VqcCQBRzUpDlFB2oaz1pl7qDsAOYiJ9eoTlCy6TJ6sewsv-DrETA7s6OWFUipaYKdfXfQ2TBTSyPmqTqBT4HSi1yj9jd-aNCLUJSNhgt9bHcwLaeyhqcGPJRoDxoRqk8brQfh2IEUe9JH86_bE_1in7Ac2ofm7fjrL7LT4H04auK8rMSu8zV6yupdtxAOSR1bZaY1DBzOjP8DviJTzyvzH9EjXwrdV3s5m10Ub0PlqUhtyZX2SZjb0x_YDzNxs0NeaPIOUv5IzRvnfQ1B6pG3mpPpjiLNbsXSLhNZroRtSfaGq90VkDAnmw7XTiq3ogClnj30nCk8Gn6XHfFgpbFkkblpFXS8NUJ7p2yLZ27F6huYJ2dMq8IC9FI2Y88a6a9_6ZoCxRWFzVYuDnR8Ay_hrmeAM3udpGk3tKLEbL_qCJkdeCM7xDIX2EH1L9NENh7nkqiGsHbLxoGX8kGWX-Ys9HkkonjIyU69NmKFc9HkKVCHm_u-HwlMUFT8_UqkPXa9G2v-Pviy6KwMLqM5kOiWrK5Bf6v6R2asVEXO2ruOiVxaxBqABtS-Nfjff3nOurvFqcyVUoyVa1-QcKTtP6B_BboQ_KkghWB3OwbPC3zzyLolRNhqyiWQ3M6Mfic2GRimnn5onakC2CzS4QVLElsPmc4bxr1cn_4RnFZTafZBZaO6IDuc4yJyvc_5dSqnOSv7oPUHRlahuBOpbvvmkEAfZmqTccfhlIPqVYoa4nXaRPjSJQtN28mLoJIveUmUY5WRos57y5OnBAx6GI0TZ2w27zuJtPvaKFZOIvzuAFSGWT-Ght-Ab3LEvsQOUOoQYQgJpdxwNbsgxoC6LJrFNZIbm0GAqbpbJLauTBCjOL_2Hlcleh2DOL10SS8h-xtjSEbRCpL3ZNhyj5aaaZVm5gZAGVu9zTeFxsctgJSiFQtQk0wd9DY9tB72SSw5TGqTMKRKVYISL7sMaWkbo-1J9y54ivusKftJbQquGEILPRnKot2aqv7QyRXjMdePkcnqBtmWE29qHn-yJ3VtCW0POsw_DBUUdhBy53D-q4gUYLXQyXfOuTLhnLpHaGHJXBMI88aLDplmdCx1FYzN6yE9iDain7zrD3e7a81cHsh5ovNxqEfzmlYXT10dfVzRHaLdcr1PdDoo9rIq7vvoSYe3txdGwAj2Y0Imo6-1kFB0lZaxN4vqLdv3Er7tR4mwOWdr3no5HGHH4J7qx73SU_lo-NC6ZIB1kP4i26PshICuIn9mhYSkHC6hzyYgxnHQ3CJ8EdX9w1gl5-uBUqXtfQyoXsXGscA9g-E3PN3CuAOASz14Nh147QSbWcbcVH35uWBqzZ51HC8mej6PWNeyMA_MAcu_4O6X1qB_aMjfCChpaZ1wNe0il4hKJq_jtFnjEUVmgrA-gaRkxKtpIvCbvkYZF6yXvYnwbxnBrX0fz04SsVjsc2-JOsynQBYxXrTB585ltkAlMq7rjgvHVk0vdGNcw2r9EYxkYXjM16ik3UL5cQubMvusvwCqI_wzpaMPi_WLzMczZdFHbcKeyTd8r1zEUgwwcAFH1NSrP_qYbP4j84PRbBLLiBXO6FTaG-ah0T0-Mbyv0SXcK6oJzTrLBgR0BDTIKk0C1k25Kz545ov_BtMEa_CqZMb63x6tfOu4Qe9DWi54h_HioXLDg9hjH5ggfz51gi6L2-SLkuXPF9vXTf4j5i4ieEKXOf2Gl4mtKJMyf1HHhy4s29cIhTWBAvvYjArx4sv4R8uFgYtFYWVXv2al8lLizHB7yc1LFZtMjaUvMYwUQRtZ-JojcR5ybH2AlMus_qqPL_SB1RNrinC2Ys-l7NlIEJZ6-ne16J8yLvDvN5Nj4Q8tNch9Y2LRltcHN6_HRl48aHEihhbMfYXQ40jLJlNV6SBJGEG1T8uw8dACfkx8jRtuzgy39xSr-oNAGEdXVDiRw4KNdVxvA-F1wjF_f9cxg3RkmYlGUOKScrlIX0R4V6pGp-HTQ9vlGv7CDGoq3IWN1eO1eL-rQkWUVgwQr7eZ8HBfUUuWEgiWajQDmTirSGejZGiTXmIZzYX4A1GMYeaV-6iy1ENyv5_F885FliLRDNKebVIiBhyDosx7EZR1OFAlFBEZGBxWDXqtPp8-ozRelnWiq6o4R7hYNt-GEZtgpAcCmy1sXD1gSvHaiEEEz1bYIBOAzDKU7mBeBs4lPerj73aiCB7KuMOpNUZkyy9T41dz85JzNLU7WPafmX1fuljNBeqD2xG9MesjFhb-UhQDRzQV-eaSnBq42lsMzhMulek8rXQ_qErir_5y4OyCkUum2PvVzo4UQsyyyV_r6Tpv7hRdxRJlfUBXVdXKxUHmy7Kn0ylqHHr5dJpp6zT0rrLQEj0nX97fOuxz1MdVxX7mI47dgXdrIgIWUTrBLymUbwGvJVqzntDZYFkHVi_x0RGhfnHXMBm9vftn-lN0q9LEJfOPla_6IC7lUCFe_95oktXI2QVIoaxD4i9hrSDxh8tMdcc8_ztS1-iUNghAKV1GjrO7Jyv7IfcATPJGcyKeY15PX3TZM8oZ5l8DVIaRpFo7nBtOKL-ZlIm3AINensHIB6NMYC1XP9kVZ_iOvTNkgemkXo2Kl8Fu8AaZEs7QJvmYHcKdaQgXlTRMv3pme9RwKUUgMcrMG9CRaRARXNktjjbCWbBf5T8zU-53Liz7RZUohGTs2WFOxoTh7bOjG1AsBZ-CGhlgckBIcVeIgkCEtjBsK-iBU2Gu-JXuLRuX3Opmr1BDpmDplKsGnKlkZzMQQdfuttf9fx6fmsC95skW5-ftN24ljlszxWJ2nfkjsaFLokMTyGdfaonXxmsouuQ4tUMqh8PTidLW22UIoJ2WARq1rYh_Rv20kqRY8mah6ENztFDm7pd4XjkF6cSZo_bVFXCxi8v7UXxSqPQWhnNwu3vGf0EtRj8awbRAS7ENCwHxp1iFTLStoTIAzAsTPDUwdtdlw68QVdiDwZ9iktd6DSEi7WCkGgF8_W3cf4g5Qv4iRZqBHbVgE-7lTVQX68O9_iWJBAqPVI8AEowzOITji1ZR-Narw0iupcuSBiuWoq0XFdIOnB_pHAdaoon0uoc3R6dFUce5RQ1STypARl960OPTCBw4-j7MtlXs_Bx_je3q4fH0bGA8x8uQRGykPHPxQ00kdd__zfDRb-rVn3QWoYtL8bpzuquOnr05g4lJB6V9ScU6coxInw3yREElz_qoig8nu1N0OqYv_YwOBHhvMdJY0b03fsJ0SxT8eS3Tin0budxyyXyj1cLHHW9A3d_xHY0Z86mrbhkes4Jwyu1kE6O0xMrwW1SWyzAkA2mUvCymVREnOXkbPb_IynTOOHx8z0KYMY8GTYePJwLuLEMpZg8_8-dsXlGwhzAJspYS6mbPmWNf9GaputAQc-_bCt9zIHGxhFa7DLewotNZ_edpJ8_MnHgH-uGKQyvtqjjZ-VybArZ8gVamGCTE8GItqQoYFu9C23Su0Qz9p1IdE3OKIUH6BKcIyIbTZqHz6fqPkWtSnFY_ysoCXSiZNla0BTsD61qNFwMQPftH6pfukmby6X8r1d1vRzvwG0_lh9sl4pYhBSKLw2AFu43FT9G47AsPZwqfL6NH3zD4snDhNe_wpexxItycpaJCKn96cuuWtDSnJAipi3Pky-VpyEhhI5V5Ey9cmDP-54cZ1QPHc0_966QCx6TTJn5WrbFojCaeDFAOGdkd1Pw-JHsS7XDQBPUKZYUdt57Dw4ODo_wF2YLcYo7gXfrac9cqqT8NG_62vmmWT78DdLfKmuTsDhgu9Ce_Tmm-yTCHxookmHqwUoWXeewvQwcpuA_vOxV0e1cZLSTa3rZ7J6p3DNkTEmlct1Zn0BZK3M-D7y3AhtEfmbrVTMDqFnHVtbyKYiz7aHp27VnXvo9a0ixbhGuFe4fhgSNqHvY2Z09yLwEvIZ458zKhv43VD13l8AzgGbrhDTKaq2DzbnqYEFNzM3Fl2Am2ESBIrVLwOCcAD-fUc2QaYddDZiRZ4TzV_1jTEUD1rbXkUWS4LRSnWGH5Ho6RI-_-Z4sDeWuvMFdraW8jLCIulFL7Ecj-K24euD6vY62pVj9-FlKUN6AxbkpHg3u_RhzYLMRvnL5pPZikaTntT0uIGWwCe2Bshbh2MCG2EfqdjSJrE7MsBRXubwBOqf8qmRw3lLVtimWd2rOcHGSfr3PI2_9cfF0wtyitmsZVz3dphbQ6p_NCoH3kC9V0oz8GIcWB8JMRcfndFJfoNWFlGkzvghc_DiLk18tEVdUtSF2bWLXNckiG1W2ICKqqBrJ2te-dGM8zB1XyjHImW1D966g464KxnitNsWHF8WERC0O-M27SKw-WEY8KnatGXkjlN4VuWOGTiqqqpeTByh4sWXyE9NNN_Y79B51EI7kl7YBl8vX-FcHxAVHSqXz3zELWZWOi7TipKlHsX9juKOU0j51mZbEzeE4UlPT9HISRNMqfR_z1UMaZ6GhhDgo1Kplvf02yMCDrONpcuN84S--JM1XtWTmNG6UT-7sM_hVa57dY6kwYN7VPAtOd79gGttuhahFhuE3NUmslLPcNnmW3FxCqEU8LBP75G_nrIyqOU70VTmy1iZfIld7-JZxZY27hvZ62Kib74V0BuRSTtUF24mfPiykyV4ELd8oUejlvmi03hR_b1qFXguN_g_pO78_4sDvpf7itogT0F9KIMg9cyivXqvvPacJNnyINGKHEH-kYpnvqFS8CtfrKmYzEsvsJb2FImjArdawXqMNkLEHgBNcC53huBS8f334SeUdHROubrTzpYzixdVkB7D4Ngn0ksM6nnfZ9kCViFznhghETwmRGWeh0rHYQWS-fiWVgMYxKjZW7fugNXBLdEHmgXI-C0oiUvuMBB5J2CXmDt8zNK1nph34sRhyoJJmkTZ4koSbT0ffx4oGsV4LpU1E6IJiXnRRPCtaYg7lHBaFUlmyPK2WU1GAPu7GTrbS2nAmUS0iX4b9YPZSzazibn1d1jReLU0OJ59pmuXugr34MahwvP94XOX9fmdq2fI7Pw_96j-y6NrdQkkjhV7OwPmY5juZmMQoweu1r76neNokK2FBt3RmkZfUFQCbV3ksCvpPpmOmKM6ekk6QLdKZGlUQTI8dAKfBGQE2s3lR_ExUGisit_4xhG327lRwaIAClv-JJJbyP37_3POgyhDt5oXu7qulFeP9dBE-WurIV04ihejJWXNnT6yecDSy1eENChZvOgfrwkrb5mHrURDzGDjnTCLeDODQgSjEq0OIZWb9BKyGnafjOLdny5BF1BQCsF-fquNPi31F2eswDurW0Nh0cEkh7CNjgRTw89VjvBRckpD749GhN5Mr88MvHjXzmP2ETuDZq4dw-fXX05Xnm1mdh9KIo64RUPZY2XPyn1eU8mKmae8INZAweB88x4i3DsIwCh2TGeQLyJDFHSHOe_Hfw5qSIV59O1QMjrmBjAqdxBYdskyixlpkH1fvuG7JVfB6s2GgS4MDpeuf0CeJjX041eeP0foeaEYi8rCadtRZFbNSntkrlFMEqJ8h2K3LP9imoRG5Afw75nxOJJ_9o3wK2G2qblH-9LHRjyGIGJ55wwsxM8BJrJBFThDVWHqlaRKqQPRJ60YoOWOpaQVjSTrAt1o8ILyyocsJTuoRwrSTy-_P4HatU9_tOHuJ42gzNtbkl7vLBHEOjszXfxQ3lA0IBaUtvaQkXJioNJ3wOqnD2GUodU4v6ODnFsO-d_PqJefP5NXZbM_KgRVv6seW29uMkCAfV8vnsXJ0_dvv_FSzdoP07BjfeCl3HuPTfx3CL_MHnAZDBUNmhnAylRdUo5LTE9Y-iAwPUAFIyGxGBg_t-u1zehF-wGlQ1i0NZMyfv4FLysj5xwBNY_MFO6rCOP25j4ynMgxdMZMBAb1BxqGkH3oxelSxbVjabbzfGk3DDg6u79Svqv4L8cnbCI7j0abX5-FDTZ_6EVd9ADjs07TqhLp2qoC3IRGVeBp6dW-BEdcecUoVh7MriYu5SXQMohbC2JqNxhuFtbop9MapNeueVPag7Q4X30HwV9_-EJQNg-DDH1rLl3odb6llHtAFiem-TGi1M0BaQ_vpLxE9diK0Z_ee4IqC8osV4vMmGiMFg9hmFrsbDozsILhkmnB10spHwoxuaL4Qz11PiZi4t3kYpbQu74g4FFZJsSBmiLX_FhPXsnJPVbte7u48lY3Df1qf0muZiDZ0WRCBx93CToy6OIuLYVVmvjeUJATgtZel22eFFxz4dSUdpcaMB2X9mdM1b7feGzfDlbjnq9Is9VOtLgU3wjxP4VPq4cXu_omVBNPX78vJrdg9YrIoviSaUCUuZzjAZhas86hSokaTFuX7ojOM0Kd6tGgarotuqsed-P7Zdc8HZhrdYcgj51wAGZsqdMVifXhx-Ja_7IjMQJlQT0wSM8_tnyAmzvVCa_KDzCcslyUvgiL4JK21DnN8XkXZM-51QOak8H6jx7_tFa2272pLwrtL8QwTYYngHZYjVwoUJabu1vu2uTpOeLliENWRO_14chu97LmLi1GON4LNPLTHT8Y26ZkXYQ-73cfkSifwYh07VmSa3JSv3zFwqwZVr4sLNJ0DWWsrxarr329oQH6PokxlV-x1wwTVJrunjNJofzZIyI5eiswRFGy3AjjCZ4F3g44YFXNMPr5dGnudYEvaDUsxTfleyY3MX-o1cigLWA_MMt6MKBEQjHFQN22LDKnFkL2s8FgT-vfR0_N7gYrYl7TvguwE00hMI3N9O8VZGZ0Ojolq7wdOPhz6nkdUbCs350IU151LBBlM5K1SADQ5prnR_6SmVFuo6YPExJmch1S1J-I4b6W8riXY-vl0K5SBCknfYymZBKoEk5JAYVl8N90tUeOkNwGzlk1tY7wbnBH-4_VsQqq3Hu6gkVthxL6bS9ApzxVZe1DL8LTHFV25bzZur5mR4RP0Hi4KZd2xy8qtZ5WTNWJ-IUxTNUENr7vMg1n19YO0SuOHFE2jvNIEGak5RWHz8dM6Q5dyjPthRNmrerVeH9aftCK3q0__Bq3kxk97IsNC92dO0DhqsH3yHUBk-kcrDRHHZsOseFlZgIOCIvN85bKxad6eKdH1emqt_b_juKSGjNC3td0-2zEsoyBZqWGXk9kDvL_yeYPcjzOkuP44JVhZmRqWM8ToHkbS1nfs6ePfFZ-JZWYTdQhHKViFTF7Cu52Sm9N4ScCPzKBbfO-auf044Mb6ML2uC1o4SKAtOeVhHxAUsmiRnMqd2foRB5KdJM-Tu_giID2nITk5IkUMwoxTOaeL0CIzV-gysefa0LMW6plHrTXNbZIt1SZbFq6uDOsm5RIwBqWmwATOtA1qothsmDGumZdnALXqLVv6mMmAcA0FCy0bn1MsqGoQGoGGIKO8eUlF2-Wk9wSng6KxYPaI8WvzSwsHzl3Cj2m8RrjBTn2DHfKgD7xdmpA3lQ1Yzp1o2Dhf30HogCiWSSQaYvPW096FU2mHCDeN1VRVmTt2ivBK7C5Of2cWAlIikf2kv6GxuhzAb6YfREG3ONaX5l0Q0-jJet8zhPVqvzCsyBu0WT8BwCO6TO9vm_d6sEV1qZkUrNuLR7UWw6k7kc8D61jKrR0zVAUTJrF4ldfIA7XZDn1m-sB5Pd2TKcvu__9VDCspnALf_JyaTSQlJLUSLb9UpJRwQwRs7iKB8Xb313qwHT2vdp0YQF53EiAivkx1uu1SM1WDSxFaguAc217vlzAzOmiNGJAdIDGPEFCXHgCiEB3f1siygo_Pc9dyeKaT9ASSWP-lGpQD_glMDRj7AKh0jYkBcGelkY5f4yQamrljwVZbN2dQAabQFriG_WuJ6ceKZ7QMXd__ThhLySXxx-th070Pa6ZAI1ZZJevVy-mlGHFKi_v6laoIhxlJHkF9sE_C7QXM6bSj_Okb3uUqR7LybEuMjRkr8CwAqEy61YLa4MRPlDUEg_hlNvFYdf7YkOIlO_4eryZHXWD-HxXIwaituqxRL6QpWqfj5NoGlc0QLDTCExXRGShSQIGsDzY7C9D7jaALz_N84zUZCUZ2Ho_x6OF5aMIse8HbRXcfVPYDvf2INak7QAY2ellsRC1lmcPgiuA3EjB3TUXL150LB0ZGg4VNYYCUZm6ynB0jovG8CBPzCHAT7J3p5wBSnkD5w9Nmu72g43e1Mgxrz4IERhHF9q-7wRnHCmkZxq39XC_Umc_qqsDdKTdrgc1x7_KnG8cflcK3Tkp0mVqTf8qeBmBAMkkxJzFjgo79PMzxJgPArfpCAuCfeTdBhM8vVilu6FPIbMWhM2E5itXDzRL_5eRVr4fLrqorOBVqdujA46eTOr7WUeplgFHnYEX73sWzq9dY6inymFdV9P3-79KnN9Lww5QoTLItEECVdPqXR2tevZpUZrq2XQ5MQmtpq4D0Vvb1vRX--xHcnKahgecKZyq3WwkI8VxfFw4h-6D2x6JUvWFGpzzcgQLUAE76qZleD8CTXxa4E35mqeKPnpjaply0fcuX6xCjM_tcMoLJWSfHOHiwVtxJ__2Lqb7czUySHwFsSOIZ7GLaFQmIU2kfhUAGkooQjUmmc8pwJFxCq3xEKAjOHxM4EJIp59nxJNvgFBL28Pk-AfnHKsSXAb76LZulWC73WUthgebD-EVwssBAQO8T27cbrdGQj3LAuINSGDOhEf_3yUHoQ_39CQDjspOqJP62ahJsBOJOj7sDh7108K49NCJaXd7Ngy0sBjkilYC_EVvLZJ7q1PGk_jJR-ejpQnG7864PYU8ZZc6AVbjEMzw83uxlJxEPHwUrUrnax6zUsARpnUgQSmBgzFde1xn7FNF5vjNgvwlf3-CQocJhNLaH4EGX0lzEskwJB8hBTgkITXcHN5RxVLN4VNooQAxbswzFbAzV3viplWLPFlU4L4EFgkgx8x7lbLJ46JNUngHFrd7AbA8ariwB5_lcLX005f0vLMmd_L67bCxF4FtUMQ-mr62bnIHdmHC6rVYeHjTXg9z5v3ttg-TZe7ECknyH5thrir7ol-2CiSF5pOquFmzkaKck3jHEbvFWoZ3ZWXq8Sybe4bYneSBnywuIG_djbqYGI9Ail_7boAqxM_iLC4N0p8mekp1dUg0XiG8V539OQ2qp6TNi4_uxNqB6fOjq0LeL0ArYwXA1LPaD9INi6a6SKN-kKRr21n5F7RY1-SNsXSJY36d-xnmNFchYgNPvF6DfYrOIfV9ObdD8VF08YpVvqkeQEz1825FHSlRLPV_H8Z7R2Dm4gJ6lRUreesvqlxf5JXPMNes5P7rH2fNUWwUUqJhzZafktjkNp0NjStM4_Sv4L7cX0KqVqMyoc_RsuXN0VlCmwTlpqkBQTQiU9cIcBJDAAquGan90fQLG1noFPBx6q-VdSmxP3d2DD5dMbLByzYUEO30UAsA0wxiB74z3ndEor8H8VKeRPba7i4aGCaWcendxyXC-gMz6_oZocHW-om8dBXl1-ZKbnamPX51awCiDGkZ46bJCLDOrmkd3I75vU2_7-8EMUJO36AaTchNtw5Ia_yj0AJs8nPe3zHgbHt5xVmHMb48NycwP_q3rzRNuGvZ5EU0wRvrZQOkg7Cn21FcaIG98dw2Y3_WUKLi_OYeHWbcPpQ-LFWVtWV3gOKVl_EX3t3I1pAkdSCO3eEcl2CXx5o97sXM8plaVRrw9_QzdfhoHzQ9fMo56lvGwJiQ4zic_XaqlgMxtsmz-m41fbG6yMhenI6BVO8cddQqeCssr2ZzO6nHgLUPHFLd5Fse-YfGEwO9dgBCrU0Gt7fkOAY4PXT-4Xi884--bS6hgk8R02XPgZpLwPf9RaxV1G0oH1gXpwSsdAttxkrTzPfuweyuVGCKdX8aodf8_mnaSLiEBK0Gz7D53GBYny2vSSCbkRlqupDe3hZgPlzJxdig-ynZm-UfmCGpAPOaC5hbKT2hRooSr0DE4qGRzdaQ0YrRRSLjDPpdkye8FiAyK28_XubLZ9BuEksU-Xb6UKUFTp7NqwXkVOePvKNomm28LFisOyFavaooCF7B2gpeZsTzB6NnbgmjLxlbp0bJ_gRgFq5j4Z6mPfhxZXC-IacIOmu6-VYuVWdG-_cQjRlOhHfmLbBTRbJ-xwTzOh5NXfyjvq6hJZLncHGVy5CPabNCJ5qs2u6R2ycIndWU7j91A5j6bl_DHNb2vPt19dCErUJ-fWxQttSCFPVNPV8cV_IVnqidPLXtaisXBPAwYSR1rZNagLAFvsEr65_42m3eWMEBJjLyNhSHr5WGAEd92u49Y6WbXNZ6ePafaCc_b76Uai02DvsXlFSskkX1VC8f2qnOZtjG8OgzvSL6festUXUzhSAN8YHZVUpuDgcc83d0U8dpWErhKq5kXSWcmxazskdXhK7gZ1lFd1BErlYSQ2-hkMbyU06JDfGlnCgM9tUnfLh9W1aJWcuadXK6nLt_ttgv4GmhUyMgeLAUxiVOPBTcb_VaC_0OXxOEMyDFLbniPSD84oTi8MBVxYqb7yMFGezSUUs8RFvmGzsa2B3nPpjK3JcuSvwS7nBbhd_jXodjzqnMt-l1uWCohx8GmHuwIGowkqGsEnPlMnZhBQXzoTnSEN2O3VCb5oy0bABhA3y2PAxmRu5dR-Ts4cdZoCac1r-faMcKI2nK4wLK98o4VFkrJ_yoj1tvB0wQ98rrP44Egfv02a5icnHVFb_yIsch-vhhZc2NzmIuQ75FEzgc09Ye3J4bVWVu5e02U9KG11uSCDJeaQTSYyLfZ0dtn4wmIKU-jzEdzclC7mcxud231LJGsTkMUkfAQg8q4iiB2hgDE0feZhGrJx449i1GkJBA4HoFEvXkvdQFjvMasZbCf1jmmWFK_BHEahW2e60hthQLOc6BNc6qzj4U56b97IiF87YdB7ps3TdDRTD0EASmr4eUM6SKfgNKKe8UKat6ehUmJ9DnIwrzsTOtiC7RY1wuleYWF0RP69yCa86aqqxiyFv_ZApj3DPv7dDg9c9USDBQFKcrJnnNI9t4DQtWrNJh5zZStUJr15gYNV1r7_4vRk03FhkOWZmH-PmQaYAQb9CO2ELWntHf5f5iH1VlkyrbT5wNa7h1_tWuzKvcnVMT5PpHJ8U91QiRZnI9DoRlZpky-CoKfAl1NN7cd203yGQ22zFkQFrb-gAilHoxoQfN2Z_p7aUxpmF4pa1IamQLYhZLybDokiSsUFxcegeMTiAogM-f6zbhRUJOYhB5u_fjq8snkTuZKeLGsZuGjA2WDx3IKVecV01EOcQrfD0eWNivv0_E9fQwn7_SxesiioHwR4hvPfXcQ6K8j9Ly2mOO4KFKqREVo5IcOncL65nOCP5H7gMRVv6g0_7woccB866jMnnAP61Wk8oTN-aXe_8rzjidwUI2beBz1aGy08xwV7ilNeRXwvZnyDbVEPKGBo46PBlwVbbvuyBHK-r7yKjYjBfTgx4NqWq9uhe29TlDhmUmZnaZ9XVS0dIGZI20Gju3DOSrLs5oLEl_97hMLaYKlXbrKWLtwTP8zTIpw-To6SOI8bxHcana1QguKNYlolkjVJUm9BKzoAHw288sLcbu0hqKgJegVbsd6nRQFZbO6Y1mSqsMka8u3wDHAX5U7aA0dJQ5tZxogLt-t_9VlepS_MBZCouARXaFOAFbBGrXqCGbBB87wLxQVKTIMd8WgDsmvfyIDX8WFgSFudKG6TdE7I2cF4_P99tY0O-UQ-KZog5A5QUXCVT-0ExZ4Awhy88SIgrrNUzmg9mCmt9Sk9QBEbTIsyr5c5SZxfC-vkQZu3BtZGBcrgjDx0I6qz4ItvKKhsV5mbJWLV7b_qAT-uzvJ_FogN76dqLVtos8jbfIgHWWzcuRKylc7RwL2Z1BfOB7zu-B7BYqCUyLM2OhWvkeQ440F6AYxLDJVtpKzwaO_2i9v7y2rov-oJJGDoGFDy2xOd4Vty1gQuY55LJLViu_Ninu3YStg8wIv66gwWaLeLDAD4QH4zWD81TG4xn1wTObGIfT98prqLcAVi9Q9Uy6Ua2I2KlUvpbXCIpGyByMPpTluSIjinG6ZtXQvfzF_4EwYRa72a0xJ62IqSvTjo3jMsAxtVC1xsgcfKldtiMTTLtN7HEFW5vhxljACMKEu_Ky772QetrhuV7GRtsQ1vMnvuqQexhiEPyUxmpABZeVyW7axgznE4kx8Wx4kWZAtQmErE7Gu5TX9WHDcDu2yypC1oWUb0B7srNgnDhmUohlHslThkhCtktfjR1JvoMxUdtUySHeeYw7SyuVtdEusTJXbxI_W6B4GCGm_Zj2a7XGSd1oiy9ZMwrq1nkxymkQf0eBS8kNX1qNyA_rPh3eqTQEEQaHa3jmnQm2qB-Y9av2x4iwzU-mBf_3MUCDnj9Zl7HOpltJTMt0hwM8lRUVsI9YoagVCKvWsScdjtH0WpeW7nwrOM7IdSVZfI4UpONcuGB2iTDBMoRTUznpF4EjWCS1NQvLQCsfnVcJ4OhOkFAM2CCtILdAb5oiFF-Y-nV85O88LB2T4voG7e8znw3OjolQ6wUe-Dr5Q8hF5OfNXfU4HxjieLJVWzKui-rqwX5dCXaSk_S48s0LOY1mAOmTNMq2a3v-G1JFwmXU2VQ45ibj8bCjKnb4FH34Mmf6IfICkY8ZDHIbURLASBvn1gIqf3BP1k9nSKbuEK046C8pqiDH6JYTtQQ5ox6IjAO4lhZ1vTIZd9Tz4EZnETVGVKGrEV19QLlJj1D0Z2P7hExkvkky10UgX-QND-L5NBPJTpGpRfcgwyKogTo2ySCz0uLObJn-MbaMlKkws3C9ptbFAu--I7NO1VZuxahA-qZivdj9lKP8ou6u4Mnth1COPukUYubz2607b--Yo78fXhTRAXEwxYVFd09k9mpCFQJz96-kfrLIqsN-0Xt3EUw9pTLbbfgmaxgrYt-XZsEEtch8qIL1EW-ARaVRFJ5xP0680Qyw3nk7sp7vzwK5xcsYTkVzImqaCdixSLvexvTh_L_Z3VbWjLVJmRykNZdY5qIFENEf9e_J0N0lJXeQYq_c_iXryEHufNbBg8zXTk88qx3LTL_dknE-dUJFcxW2fd-B8DZuqHrYM3cG5AWcPYV89jzZQRk0XRd3WbJ1zO75pljyzLJ45OOABCbvBbLdWS1q6PpVYDEneGBtwAL5qjGu8X_I7nO6nkPHSgvlOELW-ABNJOPLxY5oDiEVotOamEP5H8F7Y6LYJ_EMMcWznmazDgooAIuUUWuaayDqHVGQICC6BJnaqtKLHjjmBVMVhhMsg0TjY3e_wjt0gyR60B_0nUJYKpIbNDh3syk59L-MoU9SOYU8xz_qp7QMsMEdpDa21mMDoLF02F7GpFtVfiuTvo-DC_DbifkM1nzDDmOGTyBFOuM9vIYIO4vYIZIELAJSJlEiVzo8WceIlX1Ovpacu4vBwpnswHU2HLtpEHZOZGJmy5OI228lmJyauWyb8yG0psen_8zhpSpuA8JsWfDrsqz3_HC64q2WPbgjLCCDKd7fvY4Ak6RDM4iaNqwVZWseuwuLP98SVOYDer8z1qc7sKuV5I2BRZl3T-hiaPppNxu5ETsoP6aziu3zh6q599zmdTpw9nRpRIToBBgASt7NG5Zx-l9xJeAodcu-YgY-02xViLWEqsvFl0wPjsc7lwpUUUgTzOyfkBv5gh_1L5zveSqD4o7WFH_CxvBAbPihW_NkzOVfwXjhZFIGXTtH4bvRCh99Csmrmwl_36Gxvq2RyMylMnXAM0idfEwMHrvd-Uw61sLEqu6vvl7yQr5BImkN-VFyiNLhnGlgdhZwyaxtrn-5p_AHYPgYrQyNnI-yCoXGNPPV6bt0NZqAJ1skRcaB65eM4NOEz-xdF9KMWumeox3sIeuCdm0vqaB6THiu9da9PnqV7_0FU2FuTB8hIujLo-SyNyM7Zu9I7OSUUjd1ykbMJ7h1cAvPjfnwDKkkw9uxCWBUmygHm9nCoIBwOzCPW2FOKK0pmsF5BAcb_27keqkmkTW7fpK1tdIeC1_XkRJKFslq1QbMc-c7d3-Ty1bl9XREm-CW5VCeuD4Zx8qGEWHOOfa2Z16wnKMVBU9rkeaRRw9lSMMDVYPxNwAcdVPgzs3_7xi5USHLjATR-2GPFqhAK8o76Z9xTocdcTJk20nsCkYysVOA0IlQKXpcYqBR73L8jGyyVmf65SGh290Or2EqaFuPRU8vGXpsoinw3wwRa559h9J9ggWmB1cgZPTGSupbDMwFPf-Z6tPpWNkB7SakyEcuOp-eWiTY4ZycBsJR2FtVro8JPbQq62qcin9HXeLtTNyBopRZG0U4XQHDGPYNi5nJ-KWf4xkyU2ttQfCtVpvlSXeB60TX50gcJUFX3cgU8YllZj20oCXBb9f01Ni_K_ZgU1t2MOfUp9AWWPdS15QAMIo3EhQb-00NSgAqG6-SKWn9M54lf9Wzikif2e0Y_-TD5yosKhaIfAwEjSWhs79vqh9p2hKEoLLT8fjlMU7rHu5EJr_5BgbvszUYAe5AN0ABURfWyBsyaXujASflXO-PlRezYxZQlQTYPz_W67njAPR1IGdOb-_7imBK08X_O5V1-110-e7PtkxiK1hqX_uHmJgFyiPgDvBUsCaPKio59R1aBBmXYIF7wbEJxL2btv1DyW_lT7aq41nkjShqL4oOK07oFpid6sQ-Ig-743KWStmTGlzo3a4OJ3e3yx2l_fvnRnC8OayuGLK8-7qVTcJY_ZJTlGjIXcyY_BlA2GEm3ocVVTvGvco3qI4fs6zvc0nU5bbjqbooHSlushBXa4Pe_-ewWXb5XDElnHqH_BBZ-C45QJo_ozKOBfxyryzQNeI5l4Zt8kKqrTuKgVOT4d89Dcp53YxRG8ZMN8SLOlWIW4rnXi5F5DQnj-3CoHx4YWkd6EF-aNCm9QRft9mCzCCgCIBVKzMJiu8wsfX673JRwTw8tLNXaWnP4V-5eRvgaqUYvkTIgQL9B_BNVyrlwyPg1rfRe74rhpZkBhyq6Af7-ihf5GUEp3yCHTJFqoLB0Ls5GoZuankwDwfPU-fUtpyJ00FYHrHJWxxUaKa64qDJXFaClXuW4WO8xWuk9zlG75XFZelFZ7SsXTJ7E2dpuQt3Xzdtj2V2ZX2PaeT3J8hxTaUj26wd5-pmSPE3mmsDQfHPMHfqcYEgDmQFTC5p2QwwmNJiwXyTvtIUsP2hTJ1g5LcBaELzvwLSUA9DkS1-38ph7rHFO8c9SsuL3VWu5YUO1-Y3nKP6FY74QCiuyCpA-UMBB8zlH-w5QNkErjo73vKM2H_v0cgck9z7J-yRj-20BTUORdTpL6rk8qasT76wob366ec0Sz3E6kwEm12CwFPDsJnP5nRQYdyf9a8EDyJVMiKpNc5ptICcUmZYkbF0biByPVEQEj6XDZuCN2DBVfc5JCC7AE7LcucsjArm5k4V_Xb-D55ziAIHyRll--jTFMadfh4oiuyeUvKDKKgFTzbZ48CrrRyTTI8CSaKoAsZmXbwMWhHlpFpNCIq-2Oj2F4kx11QC9zO6WZrHg4NuIYBTNRqIIs-H21A_Ca8IVz10MDNxMtlzZPPIp5N-fzsOusDeBMzoDwVe9r8q2VwA4KIzCvv68S4ojgMtMB5YUASNu1OtiC5g_JLyYYBx_YExTdqd_gQsIrXo1upqiVbUtRnXvX4OBN20eue4K3Ft1aU74KnIRcrZUmR3xToxgQpRzi1J0PIwqg3_wFNZyB251QtogGF_dw3hmvbRSOpxT7d4EoaSZ-HUXe92FKV-YQ8g9Zz-NuYwYqvKABqi0z_FCkC5jwbflENwiPFJOrISF1Uh-K8ZAg1chnepAPYpqNUAWM2Uuv62PfgPeXO_GgopPnJWmp--dwZhWb2C2XlWbB7lRXy1Jhy44JjDzSKbIUN659KnNS-kRUW3Ke2HxgylrirFrFntgpUKTYQO2IdVFqYHyk0tptOvRtYGcoaBZ1A5nMde7-hZTw90hJqnc3D_l9RL-B_SyFxri6DrnbRPa_8e2e2D6WdjC8awr7OOPGl4w1eYouD_b9uC-SDET1VsDGK3zg0-L9mcXJvgFUJQK33Vq--3gs99ivDCRaZaAyaA5T-4mCyglF-2Q2-B0CJoz6KqhfWg7ImoQxlLg6kEFwqp1V_VXir-Cs_PCtkq-3Ng6rPBMWWfJHKC2wM0aMCUot93VBOOfAsGqcp68cB8s2ldhCcfHgSnrjmvtS0nI0stznFz6BN6Dz7j-coMKapv26Og65-J_j7Q4tHzPuyuCdm7fEO5jMbxsOc-LEymqTFydMR--zB9qVKr9tgCqR980sdYYbCC41Liwbn8TR_uCA762Or8EKnUUp7drPX22aW7x_IbfSKv8TszFMpFijzwBms7Csr4nnF6n8zxzZEjUcL0tT2hnclc2AAJ9u9kH6yu9i1PNdxZwJW5pqwRwFCfi220enRaMT4sPMC7WrNZHYqf5l_S_6VJ1X9N1sg9CXWzhhWG1fALiNKTOsttDkWUlKQYeVYSIImSIpSD5l8pQslb2sIJgzgJmo2haJeL-WKsZkLYHX54CUurNe1Qe22CTGToJUZ7R36XdkO0IVIuC8bCuGJDqHIHVJFbAfGpTMvhB-Oz5semyWKH_2kTshZuJ9NfQNaIZxwcSCvbbMO7VFCvqqlPBhavHAR8X7sw3Myerd50tRh-zbhtnoY2jaLbHXN6LoejDX3ZiqfOoZr85d3zM8ezfnsYRhC3DYCp4XrveJ_XXHaf1oZ8t5EMQ6VWEsFBki7K0ZMg01gJsXhWfMVzReungZ8VeJzG5FpmNmj2k_iYn0k51xBvsk37j6qjiZlmsKXct65jUjVnF_MGWTZTNcWjeCl2p61wDlSdO991R0Ugihv5LLwvVY-DjacvAmIm-XxRfWXEuSGZsz-7UECzfNLM0sGPzKlkyN8vpXQsirBCHTAgUM5Larab8bhRh_BddRBr9hsVDaQnOdbm4h1IGurZSsIGG_TiU3CXt2YLhTd8vwtbJjz3eGTXOvjFjHeqGYvKr8_j4-l6i6UsUJuIuBKCAamX6ZsXlhxlvb-6MZ8ZAQJdzSab02QtmmZ2DaW_nnCYgUzD9drdjWK7riSBOMwuIHOF9dE6KWQaNZ5MVS0TQyZYm2e-3V_plll6r3JJUaJTgPPej1dzJFUu7KtF_QSA0a48JujMLaAGh4O7i2_pWsnL0jxgIXRgym5JdIfZqzXsX-56V9eAaEqDNnQJ8FNXIGbRAHZ5MoO-r93PdcQzQSpf3rXK33a8Lo3SdTlfbtP_VrMcjoVpSecaQ3-LicYYnCwYj5gkDu8qm5DX66G7bu7Tx9mAz4ERXt0Ys6OAKN4b6ySNIhSgYU9XF0Yd95fBi9NQSPeow-zrO6YH_TRHBYJJcoz-PYnJEVSwmVe2oY8Ev7qLS2r4ocDnsx-FT1TxZKC9csj7aFYIkT7f0X7XGHg89I-VUOTEwMHg9BjZCWF-3Ew6SMyfewNsJAprEp4CCJTyEX1F7pwH-HXby2R7HgZUa604l1eOJwlQKG1_9VZGmY668bqmMR1qz3_qEZ5ReAIaQ0pQGpyyBAggsk-ujk-OB2bdGPFPAZdExfmJK43OKz7J-GRIH-5XnKHW7yHq1Po_wmvRfSWGE_BHnIzo02YBGJshjrv9LV4dWGHwaZRvkjydVBBLh0O7y3xkwIEZTqb8Ez-vUReiMQVdvGvYcBne1I7Zt_5zn6K9Kad2bB5M2VKaazLGgO_KmjDy-5ofMUAaZ1O8ehK5qiMrlKy8aa2nW8TNQcrw-t25mJqm42EjAxiZofsoXL3Dn4kQaEHzJLYjl2FLlrG3US1AMoZPTLjhJ_xM0vWjicx87mUIZ5dKQbcYASzIjbGIGqX0zhR8ELQQp7vQ3ZL3itscAz_MotSO4LmGgpaD2vLRICXfzzBYfF3oZBBeC1oe80dOkfsaU5P7zJjg8tqMycRUIGomGFa2plUjKLeZfTReF06l1JVmKEMGyU8mFrpnEbLH9HmnrV45sbER3VM3-hmUq8yYMY7NAy8b9UyovR7du9meEKp7t2T-hdzBOURmobNxEwCgd9XGBpkxVSkrBaW_LAT_0xEo9sAmkHTdu64jDzKJ4I01vmwwKpFCh3wVyUBOrnqqKF_Oq9w4w3LJreSdfBKt7rinSih2TrZe5iTRgmKhfFYR7eeUnXy-bppt4_e2OOqkIUk-DDWCT0fbvteMEbtagkXum6l631sfCm0un8h6XA3GCAlOzaUv-or1MmFSnMueu4hnEL4UeqbrTrLZB0kExZgj0w02_3l0TMUQ32DvW_ShzKIPJirjm5wvvYl3XWlmay9MWicdWovVWjM2Jtcn5p5r-B8sQUtynvytMNhNzoxasFVjsGSGvK1wJCmqqRdye_tXYF32IgIbB8QRaijzhr8POor80AWwXMIxzrDnu5Mhjfn6XopAuDah68E4jrDwSECh2JLOALMmCO_0VbNk6lPIO-5ycZLzsNuAzAUv2RSmZzoBBp_wod5TFJSwQ8LSt8y1bGIiHCzW8AvP7537dYfVKJ9O8t8wBFwCSitirB3wfQJ1l5nIgsBa4CEX1QkksygkGnYPsvnf0gVawYs27F5o488OOA8QCMDoBpQKKsoj5oQNDa1dE-oLXdw2arZVKZUK4QubF2Gt3R7yNRIu_Eosbw2ZmO7WO-SnBwdvjv9LLMVSI-iJFHFw_CDg4sax7rQoNC7-mBvqABqk2BIqQWwoKfEodY9FGdxwwkk8eGKVYKtruuiqhGjiBMo9YRi-LY4P_hfPpQtrobz6cx1NKCIty3yJJkCmPRFFg7A16OGYfoWY0ARHB9eYUTLn4D0736MrITr0z0BOJv4V7mDlDjLRNPpV6qtyADS_sm1yjnaTEMTkaPmYtkjPZ0CajjA-KuVGKvgQMH7pGfFmHQzB80YxAV3fnvHaq2OdD5iijVwRwu_gILI-zUPCU0K8MLejuhq1TbUrSF4zE6nnFFiuKdc7sWDmWLbkBADO_zH3t4WlexDP7_BlSkBJAP3Unv8VbrsqHXHg0m1L2GKR-JXkRqazQaNXrVbxUWYAlGMHQ1RAsNRMYhynCntNf8tlX-08IIpNDfT4q3UCtUsKlReVcmj3hLyDDv6m9b7k5C5OkDH7WwxOrnrziNhKEy-Yhncq5z22hHn3RmvLDlUEGHWrVNZa2qh8R76_GY3wJwGV5NQEWLsVngqjIeHyJhG35-BiZLcQYoIygcs4RVJ1ZpOoic79SOvrm5-g8AjaVFYVxO_-ZiX-VUwbAW0ojpJQB2BolzxMCElzxnVbUA7RKbwq8nTyAg-ypv-fQZpMrDp6lEpoNrFW2B-WXkFnuO-CRptLrXeolQ2sgjx6MNaG6TAzwr5JkPQWt0Pkrr3lwhmQFNnecjcwzc_uCLxSpXkdZv8-PzVkOsPCJ-p5xER2Yu1qVJJvsjBEDafBvc96DGHgXHU7COOxJos5ADmvq8yTPNjcp6VPX2sydrm32tLIZ5mBWDucA5FHt_CbhcpMpM_-ZtzbmycVNJCRDUDfmHXnsjglD_7ngptp8quPa_ExeLgmvYuKRj3V-lT58dRvR7hXw0QVY8CRtsrgeYroy_D-Oo5CQ6FkL4qfbV4HSo3vwkcaw1YJ05LMKUqXl5fC_cqZONb07qbsQi1WH2_3KX0AlCTL8O6xbMvjNdRAPf_hLiJMiK3TNMYmp_DvbAM6SuYeve3nIcUYSjJueq5cN38eEHUFCwK8FXDBizRtMxyDG9Yu1-cgNqfCSFeXM0ezDxSqTr7pE2zOlyqljmR1s_utULfwahmwl0PP9tflr68de2LvigzSYMa1L1dDkFCF_OheHQkQV_e89bxFmXdMXHIxc_rRBreMIkfFuPYaRG8pdJZAerbSm2jlRU4yuyDkwn9Y_Q8freQBa37qYeoOjP4Mcg0sSbCKlwtM59pyBXhnX3vR45wpk4qjT-gkio5hH8XLsDTpMY36SLS3S-eNUa1haUcSCZsyee10WHLpaatPGvSr1Tekmd5w6rw6ndKjEbqE6vP6nulHPbBdQIMlOYMMKMebPSzffCKEwr5k18krh5WtDuCVEHbwLRWCUUATIUevZlwYntDuBcZJ_AvLNDodlc1g_GuN6RRS3zBmcovv4o_Xt5ssoAmbc3oeuq9RfkUYvVIYswczWKawvaTGflBsOLpEgtdcdyyz6gR_o-bjPWG3B_lonKOoqpMf75ncWZfihFrt0jH941yWbWTSVdkzkdvIuVSzGsWkVevpHU7xQAPm1vhvEoLPJkt2pu9ejNP73UYP9dYn3MxtIUS_xxpy3f1EMCwJzRaf7wvVZPNGakwZqWZ_moJw1627oO5Tx-hJA-l8tH4BQ9xwdsnqw1u2WJokzDrM15GgfSdoMEDmRto5IJK_ViQ3RqStz11UAnGMGRxNIJTO1QEje7SSIAc24WyMA1e5KdtI5E_89rqXXyO4oWfh4A6ZhVv97wo5PGLDNjXdd8-T7kFt4a_PmTAoxwDjRC5rfFu9CdOHmxfd7To6_yjC7_t_syLHg-QF1KVshUN8qk-muOfYTdLTQLWJkD3htGNsNbf0STQA5NhzU-x1vCP9bxcXNTj2CKpyioPHaIM-V1msntP93ljdAQ2JAItLb1v5LlKn9SfwW7m4m35P1IH0nsawcVK1bFCCebZ9sPnGo8a-__1TIZrDvMdPWXBj1fq3dK8bd9EpSibM6k2ww56kA5Z1bVENxaKJCfeuhNURxpdLP_6erLWx5g2WGiB91ePSB0_8pcihAhzuXi8oFo9Geb3vMp9nT2P1YQGB0lHcDv9N4pNM5ojCq_RJBp-lXAFpCeuuHhmy6HwYaMdLNorqiWnxWeO7HSJqAZ1hsnCWukpqOL-zvnZz_Syq2VO2kkaFKntWPSZWLTjgZfuK0LoksPgDOWsPjuH0E2OdWu8daVrmm22CB2MPYSHnWoZ1mXyFepjaWnky5LGcRA5MIHeuI7EBEQGxXLaLv6C5rDsM8NEqi62YhEFr1LC9_S58j7X_FcioMEIhz0evoFbSFrxXDcZutzB2CQLu9HS1WANoeg6eVt9dk0iHzRq6EeZRJR_Ke31KmJgWlGfckkGRL-pCIyPxPmxpdT4DEoWID5PxoAmWFPCe9l8WzFJH7Kt98fRy9WMREPX_-eR76_5mb8QaQMx8RZSTXNi41MN63E0wlk5q5yhxlLMC95sk28YWY34K79ee1CdBn4Si2ulC0AEXDEcuRlm2K2OZr1-F2hXaNo4qPEI9Pkh325WvcfOaB5PQ22JI9iac_pRIpNJyi6ds8pupJYXjKY6aYiH1y6fjjWGdlKU4dRC2uNa3kmJFCGEes0iyrquVXI1futiSse3UKRTLcILGjnQpQdjT66SXevrCWPMMoJSALpqdAdIxt385VxbAPbasnlai8YfiqvK6Pc461FY884JM7yGrkOZ44u0Fls9ZXu3GqJr6fQk91mrCoREttx1vXoNzLF97iTZenYylfLyu3QU7CgHAmxkrKE2lHmsJI1NUeUQAd9MRi62E992QdkqPoRSphLh0iwrAhPcYmaC-DwnZ7CcND1i1tty8_v81mblWHMxAG7Gs45KRw14kgml20ROxJ4UFZcqlWVwCJOhHKCNEafz9kbYVPoibHPr2M7XAZ_BEY-3CJcnkNMgD-fXarIV2LX-hnfZOBMh_hXmIHhH9kPg7ifx0EyZhdCcAZu8Dz_aosMo9sPR-AIGbNFopWZZzEzb3KcHuyXULiL3v7r8GJPwy1ZWOqOAsPwMlN5VclmtK6FBRi5WK8J6T4-nKu8mghexHDBHyBpkzZ50xPNx6_FNdj0QjpTeI1nXM98QZ8hDs0tSGNUyYhi16juttGW5xdbTE_CkUwZz60zvm1R0HiqAjcAWnIa7xzZFIm1LiUKLBHDX73V9WYqPrMoupJM6OQo-NV_oMuZtZCepQm97vW3MlU0D-GcUPRj3oTkVMTnqETdTGOihkVO59xrmSjce4nwyYiUa_9ClYAKES_AVbmhVia-im5ECQ-hNZaJPqn4h3UPDeEa5dc2hAASuxn5EQB4aqLBGn1-x-OTqgY2qCAglbNCp2luiVHHqnmnBeR-JslIIq49ykHFV-eVYubY_8ZhCUI45_OayTZAWAqV3L700G1tZ9dMwexQFfU1P68xUrxd9G2Em6SAR9z4UMr9rIGCtGgtrVgx8MIP3G3EkxSXccNl2_KC4QXNGbfbXAKxIu6Ojmwxbc4VCh1o2Pwvqfz9REp6HI8La1iCzXXf64pyGDbWKJZBJerBNbcz17fGcKhsulYvE8En5Z4P0RUI6HmADipQrP6Nt2imtnE8kLSFA8QJcfKKIF4H46BxvBB6gTg-cGXKjOmiDo--NUVs7EkYFAc4qc_okLwZzan-xhHEidlwqyaUeTaedj0md6nBd8tIrB5COpSVII5m7ZZYw2-k7chVbWJjefWYTlthxCfTwXDR6sAkFmKVGfaArrW-0er5lrlU20X1dLptWgN2hKNoc2Y2PMDGEG8CkURfJ-M1fvDdlBzHoPCVdHM00vZAoY7JpEpg_sYcPvBbFU2SaRkzOYeKKYdjf3ZdT4ZyYJx-fwGmjBre2J2Z_mkDV3WWenvEV4yZ1kYtsyG4dkoUpaHnaxSXGxibhW5pYHB9EZylPhTWxljqvCq5ItsF0gOP6PMZgTq9hVqgHoe3h8bTYM8blELc4DnMs2D-65iMbBHyQd7xgMroekBA7vMcYRKMJF0CdZvJGiSapJRRV-sy85dxvCj1u07-T5FZrilsGpJS9k8ZqMu2z2cTf4iFMobon_DAnCLC5_Q5Brn_Lba8t35oHGc4IiWZslnOmbg0DgRRAIC7csKgqEhcSOGRP7G_5VbJKE2y7dNNtH2x3X5xr9zBt9wYucGgL0ZsVufH5qk2CxF6QGEEKInC-tXoiyVXFoDmhx8kA-v5phvgILzMAAJ2D4-PNyCt7sBULHvL2RppLE-fhyADKdHaRPmDbyVXmbecvVaXDa4js_BH9CYzP-2I_3Bc_GWzuJCooe7Q6MzZyoU5rj6FLbhHYfQLCCRUi-xnq-nU3VhxaXzvepSl_UNHDSCQ7I7s1qR7I1P0QSZTI6wTRfkGxRf5ofjEtXpXwUIKE1Bw7izBfYMxwA-_nvK20BEWrGNsKHq11Qu450dbjgoXE6ahmBYV4bSVusQ-ak4-yBl3T5v0K1g1XThcMeqNCTD9fdTxBzQF8RoeY3iWkNmt7RPyCMXZlxRTcFnFw-JWpZkaaECiFq97iNaEo1VOTjAJcfoTnSWyrVtf7tMopDRhKOPlUG-P62_9_4sddKQUkb5vYdXJ9zsJdAC_ioq4mqey6p7_-xRL8hPvGSUBjywmVCS0EGx9YPixlB-ZQ8WV9821KaiQCoxGrpbMKonqn4cIoYAkNXNwryODthSSex__M-w_iioYmCWKhqHIOoofunp05j4likouZYdZjx2NW6bM7zhSiEPLUEeZVbri3J5dzgoKmNHUwoaG_3ywLZNJ7BaHINQzy34RehFZmmASh-Wd5JoFBXLJEt1y2gF05KvVU1BmoNOCRuRHTJXOgTHmG_VrPJffqjxEm_RYN1FzJGcRBuclUIoleqhyUM3L5-ouupd7aeb5xvVhBDYkka0rYLyMV9wONFHq1yEvdL7oGbvKVGDgYh2mRlvxQmiMeuEdNEb4fmiBqQ2AHIpSgpQ9c7qGr-ZAYVjDcMH5ahWL2Dlx52K-mdXhRl0SmSzVI-krR_dzw3tUMG0NEt8IuSqKAczR5JNL-UhSHzL1Bs14y-fwv0Kq2T0b8pn7VwFWKJngvFTbZ8omIyNgEYmiWOV5-6GMvvz0nmujqzlS6nFYp0AqPLp8a7UoEVLb53bXcIyrEMDEjhbbHYRq3TavQ7SAr6iUHuGL-VZe3NxoWPqI_8jnUrxs-fKdl8oKoa_IatFIQzqQoafFzXY44g7rjFtC7f5a7MP12etY6LbtpbElQeIqBKd-v7sF1t6GseQRigUs6TeK24zQ88l0FmIPoKYijCH2YY4ywF-j5qXBdZSF2Cm38I4ge21ptcWaefm8yDRNuTSbOeD6fuZQ6ECX95DuwJcZQn_y3REUlxOYpNNOwrac8Xy-wHjWlyv5QkbZtMMEZkeQhVW-Lov7xyAIycVMggxciZWJlqwToeyaU9RBSgTOwU6AqEGeWYnZVvk8j9NWcW_OARM3sq-GHed4P5-xAR6leCL5WKKRyz2BOmpmtteCrAYs15d9m_iDaZiGk3zb8WiQY7iFetrt8-HmVnFu7Lp8Vh2aTSVgN4fJ1R2FaDvMCzd3KZTTlZPUP6xD9GWHGRaKALj-SaBqCubc6TamYzCrzaS9_3yf1CUq0Fgs7ny_GSwG8K_qFg2mBoEtpXeIUUJQhV8NiMkJxIDERAb3-ZNFG7dJzI9THvMcTc8Sl-0yp5FFjEY4_EuRbeT2-ZE_oq6bLp5Jag1-yBT6reVNGlRk-jfpXvj1GpEWVvx4PnwRsfnrnwcceiPtRcSjWLmUstArr0gSbINd6XdauiASHyP8W0D636SXgxCngm51aY30TcOEwBv4pcsborz1jtAEyMOaTAGnx6gDHxypB51QMdaTP_23QBhVuX6UUJAAeNCbASE6w8UmQPwjgJDHmcf6J3dgMEXcJIpSJeR8FICp6jyQaNhlAcrI-3SjcnVjZwgv6N_qGzPdZVnZb0v3rs6_t6s9_eKOo0LkwI8_4mWcTSMKs2Qs2qM1-ygQhUd5nTf-SvIYoXXpTKMFjUu9PBdl83YPqwWPswvo6W1ODcCsq17BglaHJEpH0LwZUWbnNcXuNBJoliO1olR-zuY-GMkm_PfMW0BcR5Z5O5VXG7m5SVK-tpClr5-VPyOzZroENJxrLYHb4XrY4tFQUFJqHSLHONPhowRw69dkalQAgMYLpaewLasklH9vnGt9EphpXl63FxWb-eMY_AYGXV4n2zj4uSbatZWAsG8XOwZqEBq0SSrIsoUABtwqkG0PYs0xD5HX6i3gKNhNlwEO9sk1xZ7ZlfH_1LFZgKwrFMHK9JA-oV5dM80DytKqEWLLzoVkYPaDcplLP8faqvcza6Q5SycvcbM8yDTrbTSPjcjg9wb4RdOUgDVejICsvKNozmiiAH81Dk_-gOf0BMQIzGexJijBv5r7JsmCZ5dBImyywPBYs2aKWdIJVNJVUXCihpSGYG-gQQBsQxekZGl-aN8JggcR27pG0_fTM-xDV-vucOn4atZoxuCOT1Ub4jmRIxyAL11CUQWAMST7qdAKrvcxWJNTeVyu-CLif5wV84EPI7e20Kc9JY4rJaYtDhIs1FhuzYzzWA0rda-7AM3-ahfeRKA4rRUHPBBcWvBgoon64rQI76KMOFaj-1J5XVIqR3WRCLYgLm3z08IUdffJj7JwE39lbtoucEjOUIu47pWd6ZEnaQZHrf9-frbMLAa9K6nYf-_aYBkGLU_JVOoh9yU4Nh6kxXSeAheU_a036dFrWaybOqFUiu47qJIg97NTke8IPUXcP1Gp0t5wLpXp0o3PHaAo2MTelfSZy73wRPAwb4uqLRQPa_itdjqFGthgMlNH5UDK_A5Z8p9z3xJ5vgtKS61muf8w4D1NoBs7br9OXwAKUylNh3TSaXQNKvXEc2PD6Ugzp0fteh8eCm4mZZfIW240EUjUNZCthDehcBhvddzS_pN0TsWgv49CNsvYSQT8eU2WNrF6aeX7D0KtbTQFBeumEsg7eNWtStPkYI_0BU9jw1OZDdAH8OJ0zxKXyjUhyAsZ26SHQeVeqDNM3zEPBuuzBtp-uVdbGQsrFFP_1SWs1XW7K7ycJzTdHJnCmsoKkEHrqLYJXQp-9t1vPz0xRXO749eVYFGhbZKpgddeN0tDKd085shGWioS5ScsUi255cxZIBHaotMvYrqiJG9pae-RbqtihvX2W0JA_aLusGlOhXHHGnGIsgtxk77w75N7zOBxjc3W6uahiswPSlh-Sd-QyFxfLor3t0fcvYVjtISDiBTXx98VRIjIZPzpMGYUpmw7WOQ-4k2iGEzRKHgs8ZGHoY8LeVw_QtFViuoiMYXA2nwlB3SjwBo8zlQzlehO-6bcAPAPDhA9g6GTbQnMPMlF-MrBpy1mF7eDL2XGFlN2PjkbDEzftCu055B3ykxDC4JYrJQV_0Ii-H-ilndtp1ScvUnC0BYmZfZVj53jQ-MNgpLxHk-vPtmuxNhO5XqFreubghl55wW4e1TLIb_TP7uE_du-EvXko27qGPhaysZl3hbTfnsmNFwrqkcuYyT8YXGlrpq_MPbowhV3Rn856ZrL3GLLhca1B-gJde-Bitru2qAtPnwSr65-qSJBVg6p4z4xmzppUWpWXCEI4Aw5QgyYc6Kptq2H20AqgSsRCZJcUAgi_VJuamMQafF4H5qsSnz7c-xGzpsiNmtAGgym59dJHl566G9fqSnfY4MhhQhFq6Q1OP9AJFadR-p3ZMzaUH6Mi-qP9E15eqg-oMXUFT2zGDXw6vSQinh0F0mQ32ux_zLfnezBl_dnYspb4vTDVny1D6N5LsHi-QL19HNk49ygsea1q1COSYrFVoYrGQbsOWP2tj_NXatLSmiyit9YjSaQA-CydxehKz9yBtBnZG8Oe0hEgqcdLdGl5RkXUul10boSu4_JqLEfhS3V83eaFkpkTQ_xdqTlS3ComAc47czwBS1gVt2A4cnOlYH2vcf-93bv7vhfQ_lG60Ks9apt4cXBrzDOX2NeWVKK41uesEqpvmlqvMejX-8slB0VVS1-yQ-uQqPT31GRHxpHefjr7-MZ2NFJpUpdy2QkDJyBhQLN6XWE96pbGpLtYDygifG2Hjp72HekqXNhea8QWJro_6YbTr2M7NX-5eNj6IQ8da_fF5J9oTy5fw_pdFF-1SUNhp7roX9-aNEN-udfMM-ZvUjRT6ryioulMr1CsEPbn-N9u-rKSOQArSB0OdfZ25MVeWKaBB02aFwRpy1LCzhbi758dDv-HEf57dA3KFUqRNZ1ZR-qlqb9Fs__r7pDNE1WOHwUGIyiLsYEflMnoqlTdkFdsuHxoInKh0SxwCNm_L0fGUY7LUiRmLNq0fM89dz35vvsnpvnKrywW8n8xU2KsAKvPL02eMwAeueAnLC4U3azfH29KeuiYxRtEnGhrRslSYac9_XXv5-uMXEEhSPNhTgSBFeQNKeFwLWu3XjP628oUJDPjp60XoawUAagz28HO6fq617wmE-hcolIX1KwqqwmIqPuyWAdKnXYgjsFaVXpPPJdt2_Gal3qbZtPAYjk_XvEFHQG6gAa8O7T2FFEOgpnc_-RDulj5cwJ9qwuAMuXDafhLGgjCDw28mZ9p7yjx-iFxbW8hmkkxoCxx3zyM3oUvk0re91EzGGmvaxwgmUaFhHu0lKTJiWImufOT0wBrh5BSPMjJ4m_5zi70JJhjWiXmI38OFA60A-bZFtX0-R3GfgXdiH7kwd5Iim7dGcIea839S0WF_sampJEijmb0GxBp4nv9PhbjkeoATG2cOIyZ5CADDHHEE7lZVyr5i35mWcb1QToi5A2iCeBM7tkulIpPuAOXnlHcvO596VB8diWDF9c48ZUBHBcZyr6M_262vbZja6ouEgHTWw2fE8p12Jxg9dLFfCaMnB9OVnZ2GO6a4b_bMJdOD4uzuVTE1bpKJy81P78loh6--BXg9jdz1LB6hG7DOVl_Sn7zTjplSZ6pUwAY9yyu-r63Rxw9zFIQiygnSscjHUV-NRDRDBIdth8crBT3I55Mlg76_bChhBMYoFElzDCZhqrHt6EhcQ_SBxxyRJClvdhInh48_ZUc2oS4VwsKbqiOFYGfOvVqyZ7_qTyZB2HKBvKFLXmLbfeWcUPRyJSfDXFT7IOyhLpXm5OTw7q7_MD3Ld33glseDeXPH77JuVF4cSiq93ki-aygo8YwhHAnMS9N371Lrhd9SyzPYUPNu-ZKJXoaaUWkyRc4NH_BBemwJD8dTbYlkUkJS0zKoqbrVzi1Pisvm5sF3mW269GBfaLiyVlkCD3g4Yg_3XKF5HoaqzpQ4hAarvomAhUp2OWAOr5DCiFwIFBMn70U6EydLIQSbYLmOwsweL1YILQe_KmvfuiaCpNgzoesCsAFDyqakwPXFLK3iMa8j3dTsOzCjjte2UesbrVBCEjeYYV4riHun6QXcD6j13i6D2BlXR1uAevFqw4HcJo3m5IBKzkXwCk7-syINt8P-heioM7QaJPrz8tH5K_OO5YeNPbfcYSljjEYtEVTt7StzMAgSXyBb9Su2lWx3-GHN5MtTXhcrZqAy5zLgvDc8pFnhuRclvvDQWHNCEvGikztgZXyZvcJMHiJmDLU75yLkTVRcb_A-doo2qkkQWFjchdrKdeIEUdkTc3p1thm3WmsvmCQ0h0DkP_oGj8OPmhVNhUS_zNcpJB0xoWFUxe3xVV0hhEPZK_dYVRaRm8DQSUqhDI1PrP9C8tKcW5iPJ-zlww-HtL_0MHcRJEAVNn713JVMhcZmaNxqp6CqSCdmN1g8QOHSlODATIyokPSNxJQHwZy5PAsO1SUHCWJ2n35pclFbyNrErASC3lz3YZLKbsLmzDo30Ni0Bgw_cCClpNh7PbBcRK4lynWafA8oSs1PHuEpF0MRjchXfmjVukyadzkLie0qIY_rxrjGpeQGUTryJPcZpXLFQFRVYo43h9XgSYdifaqdi57cjMrtQBBxsJWYRMDi9BXDPzleMTMdE8u6UnwaaWptoNcgTv_MtsWDuwxuOAFGvKnsWXtYBIZKdn3FkH3TawHkmm-xIwhhjLR6P2nXFLi0H3MPv2Vm1Icya0hY4FuAAHm-XyVeGO6Jh73ZQeKx65ZQAZt5B19L8f87DVzw7djD0eFnwRlUcDIg9dySP-EJz6ZU-YokVE0-SGjVJoQ5Iqp7soag4z0YorrEyyS5Jp_RqmEuvWlfLvKzKZDmR2om8i0zs0T3js-v-yZl8wjvW4W23JqkfksDnIilxTSjBH7viw1Gj5jplCxSSFyN-6bc4X81iftvq9slunOA5IdHvXxP_VCtUlYcpf-GNW_cLzuGlFNx5F5ymcLLyleWRM4nMXEo7e2mSRo_8XYZaZQzSGOk-VAhpOe2r-hgNWAQNEbnh128DitXakRtINFrsaubyxg3OtZ3Cee_GY6F8kSOBCeNPsAUUWSj-8bdTLpFmf0qaXCsQwvSkCMoQeEb8yVhi1Ei6eTrQQ90KMWJlINVKZmCkzdZP3x5cXku5pEpFYOjFQEvnlniCQ_vKagY1vetm3nxVom1VA1Fk5_PhTjNabk3VWU47M9j4Yd4gvk5oDoXwy6E3_mt7RSZtnU0MO4FpU6Sk3wsq5TDmK-d6osePKnR9t3BiqOPa5u4B0fZSutFxE-gcSSebKKdVlXm2tae2SbxyiTNzvviyFK7n0A_yDjDhcDxg0gVi9zcsWKfAWp2x16qTaJepfMnTzYb3vDQHMdeHzmBh6CNJbyR5vHJEwoDusks-8b7y-MlNRoz9loATd-kMXc3K4UvLxL6iouKv-I8ahX2tyT9n0gDav-qodAcoi0dg-GTIevzwdMo5HIiqGAlPL5Lh36tlhkOaoJlf8UHAr5wz24GOunHZqdzcVJRSVF3E0El89_yDfphUX1aa4cuH5WaiSQaUQpgOYSOeuEeN8i_lm6V5QOKCqLtwiEkvIc4BCh9o2mhGYYU0wDeRxRxyqPDGE9C6bJo-nc2bqgJZPW-EG8-8TePpDZBm0enel05WGl_VeuU2MGjezsaRs3MSk32u7P1Yk6uG8JnqWWXJl3s5HNQ9a3qDHubyfwXjTQtWY85zY9ER5ruXTXVYPbWsaZvCjkRfoyk0cdZeuIsk0HS8y8JH3uytc2oyzteTOTzwc8iP6lznUiEa2KfXuREm45i6jzcl9bYWAHbWXunilHb-px70E_O5XZihF9EQbZIOzimCL7805IkEMG6Zy37UG94Lm2xclQh3P3hM4umw9q3Izh3QIjxGAhqD1cg5dxKfXbYmxfbb-fjG31lcRkcqn2tuUY5Ljjmkq01IIWl36i-lmlZfPd4CNMkN_3mKAvFqGHsBNIxL7lw8BkvmoNdShx0WB6xqDg5lOP35EnKaefmr1JOHGbuJ5T6VQcTdmSZAS0JVj9em3bqTCNw14CDG59z70LHUwOsrEWxekGFOqfB9Zn0U6jgVHeQm53kfO7W0oneBfnAxRPZjgcNCYrAzCjF7gqR-j1BzY40hUYW9wr76zXrjrN1HSo2VaaJuSDk4scTPJDw5905ss2_JTAoes205kMn7_pfnH1XovcLYy3ONqFjTbcj8vXX9MRSzxFcI_Pr9x1HwY5M9LKMatpsh_y21LNSTTTXtgvYeq2QI24l3JA8c3L16BVIawM42OVeeLijpnDsPoSGwvYbyvVEfA-J5XYsv2tVdRxy6WnDQcldbZUkGPCvsRE6xwv9p5UYCVfZca9INCRMpmb9vc7QVDRsrWC-Zb_3CcgsW9Ts_FKXpWnJvH5zQ1Bfq-pCpYwK-08uU3E3MYnPK4BUiZmC1TqNKyHAcSWz0lvpFca7_XKgvG5jkrof8wEIY-xAm4m1C9MUMUh38075fSKeyk9hzBRPcqWio8Hc8s50Toq9aHObMmPLpOMx_Q_PWk-Lx-spoBiS_IdH8Gi4QZbZXxwTP6NubvUB_XrLmtgwe52Rk8QnEzY0iE4L5gyB1fR6bN-YLrhx2YDfG8lv3NVEGldt0AfopTvqbDnvKuiS0_YqgbRHl6GlH2ApnJO1kh9VeXQvufDTzE2cRACgvJvqnnbwyH_sUGDHiXFrl6_T-KcFAmt3FpmDYy0nptMWYGPumZR29s92665K77dCOAtaR80e1DV_wveeCVZ7XIdtQDJeRuJipcUMm_Sq0ucziisRVbIf8VVpmxIWbtvWw4cUmaWy2Ztj9NksKW7kL_wjq5vX2uG_jE7M7Qlf2RrBIwLDm0c3ENNtgvGUHmswqGz0x72XQTIXQY38XPOsgng6JVJOJnhTsAbmKlpSTSIASOHAfym5rJBcJr5-bDKK1nJx-9SH_bI1DQ7MeevcPEU8t11u-nf6Hrb0AhLsBign0izeHJXl3TrwJR_pEEP7lwVxPN-_1-CsiojcK9Ve6mM4B5REnIE_epeT1FuMxDb56BSM6DVc0Jy8DT_2_46r_mB4yRJBgyMluufE049ihTGvMHau_Kp9XJXcPfOoTNya3kn-nB_moMndguFf-G-PTmoEv7Cy4c2i2qYIIuMmmrV-6tSZ2Sc17_pVFolSN69altW79VKB544RYA46zBWwvWjlgQT58MCfsVAgZBnv945W-LO5Ucxp3962p3IEZyOJNqVv7Hj6WUDhlv_TOwjdNUKhdxZWZLHeek7fp8BISt2nacmOuAX3K1lNdmRznqJ3gO8fHkcp8b1cXy4R3rH8O-IXHb-OO45zNB7sIDd-N7s7wyeeoOmF8XThs451Px24qyWliy30G0NqqLVaMcNkQiblgDH8ud3K0hUDfV4U94PW02ovcfC-T_xZcYxYZFpUWK6OexouZfMEtNRnedaCSxHd8GYtXZOx-Tdi_KTvwoGhHNBgQaCCaWq1CCiZqE87zOZt6gR66y38LClKtP0A8wOEVILtsN-xzSH5ciGo2mZKs0OaHxarXNNVanC20y7Zc1kOKKIYAp3GVnFSYxTjvwe6JIoQbWHIAIv1CwXxZWZpTL0Y9sgtN3ExVY9zW_5hIKuWwJxYVK-bTQdYpIINZFuiyxCp6Ii5WtSkoh6uxKZ9XSzzLxS6dqgiglHkzAK8pIVSm8hKFf0ZLLsRKoOns-vKPclqfrEgXdPZtPXJRLwlMLzp-yy66DkYHeOiIrFdCzypbPSpqcikP9MpUwrUR0HM4sqWEWbzi2SVzOq8WfAhNWlbZcQ2IqBS-ECoRwo5lLkDErkyWMqbx5ZL01PGe2858JLPoa_9_m-VXzk3tOYv2q8P13_3z3ViZwI3fmdZQIbU2LgibSNlc3JfWpomJNpl9mxeQRwBnWk1U4LrFwvoRV6OyVJz5y5go-ahTa_wqfG-PhVek3xg2QcPJd21u4RV0tw33rx50dlIqjWASwH1xRD0buNyLU81GC8aYdaDBsVrbV6soD-__fq6OPN1VqTpjUxERKMUhpyFvwzdr4LdHV8qu0WPIn4m31sLlInxjW5-GSdr26JtTEjWNRHxCWkzHUPRViWUwEoztF7409jBwz0jGssa-TXrHrZTsS9q4-b8YbGHNaBs3lBwQfENHteXS1FDgPFwuujRWlYXF2WfOpGBLFcZTBvjjYgsYLJ4YtewFcc7nMQgKjdeZG7FW9wRkX3vgyqxZFLpJ6ZPW_OtO726Qv1Y_bJsZaHB-nILGLxhgCVl4zr44knqxY1xgwAcSEXg2ee5AUeF-QUc38P3-X8h1Xu1IjJ4GRo9-iEmBIQn6jQoNvE-c0dYZ4J-P-loVVQUP04YpP9h2ZD8yI5e6eXJDI-mAzlFx8CTWRfAcvOJwQ05y9AVHqALnYjMnwP70pva4oT4TA_3uH-0bBTZPFTezimOoL24fGHInVxfBPudEfLJpDgCJy-V51slezsvDMqCNAJNNNFwm00giDdMZKc2dCHNqvJ6CgMN8UKZp7_RlEvVBlt9oVFP6l7lJauUEHs-VduPI-l_BzOUVu8yL_NTyriyc2O24JX37YAGs1HY7nC2sAzqCb5TGdSG-8Y68M-8TTrIvKObxlMwjtiNLmsk_TYXGY-k9ZAJV38eo7yQfemgRhZCiuXe3y4n20I3E_c-2_jybwWl3JTS4qWTZ9mU2yk9-o-X9hdEYC2-Xj_ZDWBhevHGWWWBK9i3_05k0sZCFXz99zp5GzFQQMUgSYWcwDnfNeyjyQgWGGahB9KzgauEudLUQUUv8PQb1Q3i0XqkW_f0mv-qAXGoqaBOfNhCeR35DAtY4Nf505g3zjf1mzoJeNkMuqz9IjbSkKqdPQdJU3E9wxNbXvLknCrNHNFe6rSuCC3gQ-XzFvhDAwQSgp3B3zzlWa1CVyX2lHtmVqK0_RUiAI5rs94tCZDmC5S0uH7FSilGFDHagEkYq0TBs4PiAmStnZhVqME7v9mC4dlkCHptDw865YKx4Ayw3fuF1sXD0zMyW0_FuKYq3Lu-IR3UaKjpO3EP-zMTUetuMT6BxTQydUdB3TpBUX9J7cbPKv46y-gGeflELazWJjynTukYs1ltQ9IwkAYmbHWtXwDPWAauo25xQJzspvtcNg4yFN8fTltrcoc3XhSAo7zxCe8JSWpY4_5gTwHBIq2z5ANHmi7NvbUUmo3P5MpxZSNlKoROYmaFPL0ner7iMH7MANnU6HkXorXnTA-XXlWvby4DqMMhlGP79zAB6m9tJWIufDMa1y_DGCxwt2AVH0y7E6md0Yjv1C-27jV02KToDaHdgQJiG7UjFDnl-KgiZgwA5KazFxPmas9I0Hi8JcYcWGz7mcAOoxV-5UrVh0CtJFZZGO0OMsU1qTrjWfSFn8zhtSp4nvArcbJp9An6pkPIxtd4tzL8UICjv-AniBnDY6PvMoHRRfIdAGZ_T7ke1cmICM3Z5KupLD-s29bgKRCMkzaEKwli9BEyY4v03siRbRMg0cHYej041vgxMLGpcBWIluFePJVmp_07lw6Fr4a2uf9GvNC5RsiSjwzpKOhjKavSQ6g-0yfaK2QaCg3jpVCs8qMtQs1ItmKehFptJaYrD06Grb0imC-WFyLhcR19EPVqhGSXxd0ZQV-dQ5DxLcFel9mVpmEPuOBD6PrCLJjIhbbtLanOqbPXszkfLNEmPzawsoVsjfNcfR570stR93s3Un3ymbPJ5J_Cuj-uWUr_Pnu5XQ37C8dCjF0mQVC6KjLn_Wyl1aIVrahYvDnrvXgNVHcvmG49CINZovqhKNFov51TwZzAXBHIuSpwDwy7R671GOqoXCWHCijU4NJcK2DCxBrDErV1jXbZklPNYzIxu58mudAQumHFxwUmIMzKtDWV-pCTOF1E621LZVkinRBQUbpVdPHZbeD41fxOuDN8IvBhguU8MsLlkVnKmMQZ3YVePAs-4Nm-wC3SPcnlTwZSLs4-8CGaEnbCaIymCjWRimxXb7PdYU7oL5n1Iy7CmkdHeiK2vGirDbKmr4sMl-v6pNZppy91txPspI9PZv4V5ICDKzC9hAvqLMHaDUy_7Sl_pk_tul5m7OWNpaaDM8kD_95mKH36EBQjT7tcUITpltyfhozWcuuTR9WSjxu5Ddme-ixocfBUKGRMdvvhZe9VAncvPpuQKYsqjrs7tuOfQMlW1lIRs_kZPXzo0Ph6ejbtNw5NLUP_fzzZRv03VLxOw2nd-6o3JBLe0DuK9rN4e7t1ex-WYKVRNpOBdI75K0F_pn7GYxG04Cf4PZGlbJksCziGsDGr2-OmE0DmJuRsvhS5QZvHA__Gcp41ktPftKLTvwcWKY4LSy4ByyFhKkA73nKoIy56DwnfHc7ddNpdqMAq6LFElks2aFX4RTkprPQwX0hlHJaIhXokgZIsZlLnswiJp9wJ7eo3ni6CgbPSh8kIyqfpYsvjeNheuI7P5y8np3iEt_F0eZko_1JQ3sxNHS12hhpuZCs2nXYm7JO7aXsFOgCnU3JkZFv-UbX_roC_HfBRKceNKrzCA2MohAyPWeQoLj1z5bysck8johhXigS0dQ3jUyq_tJZdfYPIsObbPFA7WbsSk-Yd3v6lslYnNmUTZdfIQp0w0CH-Dnfn3BSE41-KyV2-wnsewpkF-gL4RVHTPoKG0Ju--Z62vJ_IfmhqOYIsIHSzXI1lpubnFqDCF2G8cCTwzFZHruJeFZKMUEA0qVjvF1-G2UAA2ybA34XuVUwMJ9FlPyk5PQNdWixT98yLEjGVbog_z88du5P6vI4tp73yBoeh_-2QRa-OaqHzUlmf0uZXUb-A-rrfwybWFlWJyrBTtwykWj66uYAJraCn4XSiu8MbpRd3mZm41Gnni9EraKRUT5xUIPzFuiwzAvkc3ACOCABGiI3sNvbfCDApu3e88j-9fO-WRZupALjeYnGk0yRFK4vM-J0meQbbwc7vy--khwgQDASyziodZ0I25hWuyVtRf2UEw_BiF_be6gegFgvQrGTTIz4cKrK8c31XMzahsfoFggYJtQtmtkRqnWK-g_0tHnAzijTObB7J8llbbqtoLiv-pdUPC1lYPSPr_6iCM8jeWY3MxKs4WP8jLNoZg1miCYTL1vQz07ce-5WTVSsuKsBKO25Y-t-MiRxes9K9LPhMRpWHbCUhXn-L6vPzE0zieY2bd6ed4W8bHpLB5AktTFX0D87QTbUAk9MgT-b0UBCZhZtIlsJ1l23adwkMHk4kUqOYR_Bc_oNR5myviAzBd2yG4IyhiDKpbXebhhM0dE7t6DBGxSnsS2c3NLrSD_234GbOG6HTA3AhuvOVoiLCGVVzlMDSQA0UyUfj6c6Fuk5MyWFd09DQ1mmC8Fx71CU2he5vrnXKqT0nsQx3HW-v_3G6V6GcF6tCAEIaES0fVtvNVJ8skPrOBjFSlbC3UIAdO6etUor51oFLCYJdNh7tQNwJgO3J2_akhOjx08GkcHFU25jsxedDmr5xBso2-RSLKqe3sDkoa4xLk34YslNsQ6-wGXNhxzcOFdejYkYSBJ2DfeKno78xzwnXC0L7HcbStCgQkC3CNcagVBGj4MZaf-OpwQTLBtP7VcqZrYx8ZPqLMWWzW5DoWIDrs7hIs_9vJAXfiqezduqZLdDZ1eFeIzuPuPMF5J_NDCyon44YYX0XdwtBIQ7GAO_vPn6GbKUndM6dUcPJr0Py1c8cNadjAF4POy2axn3fkQInEJpW713moqINZT266SvP1Xh3WSLXqJo5dMZaXNb2bQFpThtGLIate3CjIy6Q3jAu1Ci-SAwPIwRK1cV6NsQBu2ohftQSwJmlJyJw1Bz91QL3vhOeFLDo0Xe3wKOQO2_inLnzAUjFcRjNUnTxG3t1m5qSwfqRRb2M1GHKYe7BMKOwJ0-f0qz8KfI71KW1cRsSHkjdew0ux9cGzPh1I5Xq7gz4W3Ez_9yBlTu-juQGqGw6fxIdXI8-Vs5fJ2VNxry_Ru7DrTc_y37Ji7dqfJyiVb8xAczMFU758SRbrYUd-ASagxWLg3c4O0vhy38ZMYXNGiWVmHaz_zyXSh1AyfZDQnDpcZVE2fUDM575CjoaG1CkJvA2bIBOrVzvZX-sgAtCtUCzQdgBK258LLRtfuM6UK4F7YhoF2ooZ5XGcQr3P7gUWi7uKefD-4CtLvzhQevzCFw2zJbJ1QPj6a30U-usDI0maFnOAxmMTzbyX11R5PUg2fAskv81y_BkOc-8qamDYunA-qhuZI-7tI1kagntVLPhV1S0h3rfLOkMmm52LBeaXzZrnwEV6wzl3DfmvXqkm1HJ7Rpj-yA-xxZLYDgtPpB5QYfQcHXJ5mVg604ZOUK1KapIQovj4M19yCMfVzvDWxpoC21KUQAjM4939kMgUj88MKiFzWmxOOV3lM-jVDf3eG7rQ4L00ow18p_KmMRYhKOk189bsXsgmKIFSDG4LTzlLbzMe6SEl-zh5UWsVjm8jSUHXTSM2MsrQ9tpEtP_kHVF8xW1fcDUmhrqYWqnqkYaFaXXXbreyLJJbrTrZyulQM73dalWNqP0Uth0qi4imUPYJKt7k8y3FTGHqWDsNHtt7hBcpqZwDAPXFTbDwxnbaFw2J7GPLnVjm2DQvdckXcVq1vBfU_HbwDx_ZYk8fu6H2QLx0EPkEOxzkO0vOE42R_Uwu1ghrdYZYP3W7HFjdX16N9xUXcJXaUKffL2ME663NQ_qq3S9mvooaUCQXdvYs6xbubkooqSoer0_yYOO_iTLNVEnUx_njfSCMW7i6_dk7BoKa7LvRkSbAKYC-2QVVcmTgJ2A1pf0BTmnOtZfFFVLBLcLeW3hddPDXJrlsSXXKH2TjFhbOV48qT-RPnMrh6q1D8bcXUkwEKoOxLO3fkC7sKq2Eh3mTARNa2nRAr7k1ztDYO_SBdzoEXyRMKf2YlvIsI4NuKuvt8x4rFKbKEcQ_pvnoNfk8XItrh-tkol0KbY3cm9gC1PtJugrW300Q8x4j56DSppez7IV1kby5uPm2NBBJwXNQ91Am-QqGm0o7g79MzIPgwvdxpsNH2qzdbh-vpwA5a7dMTbpAPBLyWjlgN65cbucO7oWXTabgtBVlp2lG3Np4Mumr_GoqXcmcN6oIWr7PlHU2NaLg1pGAAagyRN5g4V75117GkoA2i0HZdTZ5oM0qerl-jB2fn-knGYnYbCHdHPsHOxH51RSK5LoXXIELrE5MRHXtrtddj33mIFMXOTsuDRDO1yRGlWIiDxc8pcYtE10cDniBaNVziDWxeYwax9x5qElMu4QOHLVC2sCbRgYXa_y1cYMjUGtVFZNz6tu8OLa7QxIozwlTwWM_yiIGVDfzOUEGtr3cevUt6S0E_AveAJr6fzd96JwaP0UC_lthng5yi14eI2KQL1Uq0ujOojDjnq0NHFhxJTO8ElW6d83PXOs4Xl4bEH_TV9GQrTCzFdJ-sU6uL61P0sFuiP1R22gCbFDQVuIOlpbG7Z-ueqoZiLIyPdynC9vwiQqErLT3EEvh4pKx_w6b2X8pt-Y__oKwf_7vGIwVJ3JZ3kZ2145DFeYIvK6RhptDT9Cs6zOsdoGHxvmneSytwp17r0IsP1yVhRqlM0sgEcr8jytb5VKX_VQwwfg5hfoQaBVb5Jp604Udk6bhutUsh8ctwCTI414Peo6_RNojXgp-Ca8PYu5YmSuRnnqQMezdEtcoLZl-SaznIEodYtQftheefSVedzyiAd823nwfqFszI6vkI1yerKiIro4JJK6KHMH3ABpINgwqdSRLAla31NTDjqmEWSHL6Q1l18kM74krZxdxDnyBnpcgWfvYQlrT4zbxmb2WMwH136hIqNBnmjQ2Bbps3QkJfLM0ITiQi34j1eK-czVyS4jkvkFusKe_kIX0bUavSKJSD1gCR8eyS_HPdNHV1VPrh5hAqhbECSl1RoV3RYKjGVFwNGzwfH28uTBq-urGOWUtzfZ-trc5LqlPExJbmQdaf6u-xYytXw0AwpsWUKKM12h1_ged5ND1bBCyltlTaCMSYogNb8ZmklDal51eRJxWnb9oO6B6MHp8wZiAWU2xdd7pfxIYSLxyLrfPZEAJUeICpOt2tYbhJ8JSntecAIDmXEPmR6Ogz4FJiDFr3eLjaFl-Xv7EtCa9Z304DJZ_vRRMAMkZZd4W1lRYGQl6FQLwsEqLLnov_av5QoAS1WFxNQdykuEFleEsSlxZPlYBfr7kbCmUpQugJAPvxcAeoac_aRBvEUr6sVIeIL0gRnE8knuyx-zGILQpEJ0tkw5DE6wGnVBAqeI6v1y0hwgHPyly3P4lyn1gKulDl1o1_7uMEY68d7wHH-ZavMnWEZlDOruH_B4bxUVQDwZT-7pfiHYgznv-8_VT_tySDdrBcc-BgqSxYrPoFyp2cYLIndISat3CwkOHHMiEtnezELF_wsYYjqyo5bi4THAEPxf3dJeAicoGQNgpik8K5gsBllFD-meYPtra0A6YkFupzc2ERuHMYleasp1P1-kfSNLMVgMhfI9Pa6pEkOC__Oc9ecNCEyaZTdocGk6gPKy88BMC6Jvwlw69-vOCmwiFAajV84BSphwotXvWfAChY9Ip2L-XRBvi2spzLJ7Z7F757HjWv6C6zIoKR3Rci3ffQVVcM8anjz6x6cLeA5vykMKcK8u-lKVWdHdjSftwK2nKNGcjO-5xjG8hHMmVdZ5C23UWtUJeHACnAyRT7dFOCRB-Q0W4PKENevkrnW7j0aLwhk5OXqUhHZd9jRs9BOOgwsz2nAHTN53c5DdxfzjA7Pha0oMr4ZWPh_SctR5vVLI6Oj5I85sv0fwvckDimWEg0zfPf2fg0CWeuTXshFyieQ98E0VWOq2_ILeTaQBc9IxLj1ypqivk0mWgcHp3394FpJdfbfRQM_sdsAqQm1jkPiR4h0EBgmm9bb57XCqs8_3BFIQndpPKo8-idBRAZEIw1itIpA8XbcXHbxeAR63UWW5xWsQ_55hQUnilEGyMCmHRcaQfTAQz8ipDfng3Zc2L3iqYBIh-qaSO8cwPZt8AXB3Z-HFIxxoSagd1wJU4XW5bLEbgZGKvXu7XFFiXBDJx0DCHM5oD5EsR2QX-D868q5Uvhour4lFZ1GvpqcV3Kn3DIZ1AUMQAUImy16JFJe-LVUTmyW6c-ERm09iaVzfJ6hy-0QImNdnyEUazmtvaFdfhOZND1PDWaeYHe1tffydihNePQWUmfEJ7GYVwtTJdC8hDDV8JxuFfvnGUNWm158gDhAtcNx7YjeqJWl8OJwtdY6nzsw8nhfyTVOZRZT3qFrOEqH0mqn87EjqAkBojHswyAnRZn9sH7cdqleA8z-g3ZlbXnPcczPKwUjwreMxznSUNhfFstNL4KNHsr1qvEBh3Ybr_2SxzuCak-ZYGfN7xXSZd_P_X0PWFr9d2cbl_7RusHiRl270cp2qv30EYAYn-lQF5h5cEabNSBYqnLV6IeFY41GuK5HGOWEF_q1L6RscxvZZOnaWyBIN8ATqB7-Wem7orKesiCENV7O8zl1DN5DMhaUxOIZsgmP_ftZFNdSfjqzvk4rp0FIJAoBfPqPzLZ06646Ezwbbh_n-gfSOvJjBTKRMEq110RlW2RaXBOIAgPlTDdGfpTHUJucwpioIDPaFQWYtnqi-jJ8-xqjhDqjnNwViUWnoGRGitxXR5V7QJINLIC6p7yGYmBSudAADkXQIjjMkX4Ax17hmWUvsRpHvufx7MASJCLtIg9M5_koPKDCeBTxRISwBOfpHKGX_Ob6rjQSSADKmM_-gXJa8oRxPx-E5j9s5j4whJD-1RoxyBSpmdHp8zJNZWxUWHTrj_YedjrGnZ8AgUmA6QJb8clLgrAybewR8wIiywebvAd6E2lWDlSKAul0II_kQ33jb-LefsbwGAJ6Q4AtA8W50Y0lAcYkrCnAamsp-kriGaRK9eW_X82firzRycVqlLfkiIyBHvrLNomxThbUqiuxaPFGYBcIj1gKyvCp7vdP71t_6VmyKIBV_OUBp7aSOONir9o8mTtjwzW03jHdo43hy_dCSNXDjJQmspn9JLwyLINNQdeMB7HalfE5abh-9-wCqx48Zzn8UR70voZdaKbObYA10whojx_nECWoQcpv6xS4ak9afBOmQXKQt3kx-uWgE_eeztPBql-2rc79EfNiKfcWnhfOK5Eivf_PXsoVzjbOMA_JKmIe45wkwUhz-e7I3p6Y396K29qbjzMtC6RPDfb-Dh7j_ZjPInRB2AOPIPUBsaM2o738eYs_xSXPYQ0kEe0jh835pvEDJfh64SapolG7e914c2Gex0TDHeo22gk2nU74Kk9epSnCQWWmWCEx9X4CrsgymCCxoYJvTJimTrpJwMjvV2aN2dgtmZmijgC1QgKN5EohGjStpFTl6rhwAXKH7eGcYUOQWfagEq0UtKyYlRrO2Rf22fnF1Tq9aYPu0mLTSP2TqssfNxKxfWpj_EeemXWzhHRPgYFw0WFRd98P1QLLWbVvfKP64a8TToEBitnGVw7TYaac6Bhj4WmIL_Z4-lc0PJAbRNWcYCDvX_8-9JmJbRo_9ikniKwzKykbe-DfZCi8SuEukos4fw16lXIUHcF0MunFrxElJ1eyVAkHyl2QQUaAIHaoP-HBYRp5gFxVw5zqxn1QGjnGsX82yuVVLevJXDP442K8gEbG9OHkojyzOBAV6MGGiyjBHLQOXHnF5qZqnlk6Iqr_5fWSYG5gIzVX605MH8QNAJG71mOdDg19-Npk6MOHOFBQO9DC9MNUcFTgK0WaF2XZf8mZNjSrHHV9-o3GeVg-yFCv4nrBamNIAZRzNipec52mstz7XjDMteu5s3JOAHnS6lzR-Yx9zQ0-TUobuWrKZFAPwpVDdKdvGALvq5hTcv6583YC5K_o8TP2bioP7ubETRM7MU1dTTDMjoZQE-YEn1TzZ9QuNxx_MCFeNDMyno29Osubl4JiAYK4CPaMpYIBtbVzhVAfiAkXV13qztLlwj6YI-xoWLn72gJyw6ZPETycz8SML6cKM0uLaz_qjolGnQFWip2PASB0fo5DI04nXenGoijJSw_iCl3SWdeU6nZXFILdOH1CxvhxTTfn-w5wmggQPEDC0pTSj3FCib-O4_PzrdXOCga5RVzLKro-9xacaHVecQAeIKj0TtbwHyzzUkg2KLaNe24bDOB_ogQxWSmStKgFbh4aGQqdp14I0kARxpeXEqG88a3T3tWWw1FZArsIw_lpCRNzh0h7jTJ40d5iLoJMQXR5tAVvxH8OlrtezgNEiWoaykpjcxlQmqEOHDCyBadevRIPXP3cko4sFs_RNSn1rKRbcOns9VJBBFKs_z5fyisNWGfhj0ia9TyBNsabC3Zc5WfCZtFw9QV50IVPCJ7LdXp-ghfv3ymh2ZaBYFnc00JDErdHuiBh4BPyOpDImmTEhVFPvy9XeeleXAehJNG5fYlhUGrIPSJIwNfump1z30KvSXB9P0NRhareUaYfObEONsRq9LAnNd2PFXgnm206l-wz2IeI6Xt7IYQOPDLT-zG0MeSCMDOGw4cbAtcPdJRo1CLeIxnVXEsJYUiAoCAkFCieHdp_iyI0TUnudVG3GFUwigMZu7nkNMDWzMbrdB0w0QTlXIWZOZ3LAsubeCIalNxH4C-hO6KWS9_5U2iYq4x3dMfhnYxi5hKGLBFAejwxjlkQUz_yzWrkxYGa9EdkgXI1i6Vix1DRkgJoIu_BTa0fCMrs2bvIL7rnEAjI9Iophf16WQl84LZ7TmwKyZN0mMGpExbHfzznHkjPdNqn87BessRWiwJAVcrKkhuE9zt8ajGvuWjsc7miIBmkn_nkdSs1dHM4dJ-oKuQpcRojqjKjK3ppdQ1gL1Afhs69D70q5XaO1wY5rIIQEjXcuhujwP-0TdF2IO1rdUXrott_DFxOwVtNo8-n68aB49FeJ8Y4JAv5Ss6PZ7W_CFltjmvVqYFZG_PXlV-kMhBLiLsMebdn-uSCmOgHfuqbLAm_5udQUHIZkzbfVFJhtppNQFbHZL0p397AjMzsGnRJdUTwbv9CBuJTf6Nbv979TXDjOTJfSQN-Zs95KodraU070FKuQhqG-8XA8s8UuF9ZbbUmctYgFJdgw8qlyL5I2oYzswyqULfFBgM_KbfNMzGXANXGMZhmeWle41Oc2YNyVRcTapxbwcDseTVjfvtgZieGdIf5aoi6S8b_AKgDOn77w2pjDS34BbelBIyj_oG1jGnodO4OsqoJpxexR1t0O2a_dOPNAxYHYRzVnQZd_Vg1LHB7PU6HBLoEPZmBuKnGFImlj9K3V_MuQ6_JPwhlpNHM_pcL5Wfqi4fbctrhBHoPud8N66KlPwe3CclME79H2CLBG25O-B4Vwqqw0farYN2aLp1q1nsHi-2f5OVzRJCAKBTDfKTIrIG0VZFK0rXaDgc4rC68Qa01QEfIBxZ3MZ-0gwaZdAjfTyr9837vFK5MRmX5F_jcSFCH6NV3XNEkxzj__hkMBSB3U-At5t39z8JgJoZuI3G5kDsRiGOULerzKD_j_AYEENOjQHHiqchVA2F5nn7_93axzhzhRmU7MT2TpG3u2QA-Gnim4wqaE5gO0SazIGOd9RN5iC7If01ghf8TOMMk-PwsULXFhRdvdusVYuZ_Bgkc9F_FgfB0_ZHhZkzp4SA-WMJQBEbs5dtGYXPpmz7Fd-b3EY7OnWXdlm-_6DJhfs4We3PzHEoob2yk4i2r5kBUeKym-LoWoQ9c1AcGk7sUhzfigyRHE8nIPyJ994gsalPcpMBeUDfegV9jtUg2_PgwSDQ0km0_p_44CrDPj4VZLEtRb_URAzrPqF7azkaOdJIcuOR1lExvA5aVT4V8uNQGd6EE-nOSvOKCdi3E-8tIBi8OKVpRfQ9Zt-5j5qClKSVEYBWL4rgiGSGlBSSIKg8Qk_i16U8ooodoGsA_hrIdc_EbPHIhWAw4ggv4iSnUnOb2bqT6ID8LUurdF5eT5coQgDRo89Lt-VSa4OYmBS7AcJkO-em9fF6p89Z0kb3AtKWVZM4UTm_Z6UvK2safHQL6jepuflY-uZlo21iXQsrGXQQkHjx2bZZssCT3tJDvU0ksINRRll5OL1TZya6bTrxSfQb9nZTqtLJR4ahw7PeMQKMvZ9LbtFcREiETk1iGDv0zbGHrbJ5WEepLT_gFXHrHWCYjPnZIgkPPgO0vnEQgs2rfUcTaylKf_Dl-V3-RjJX3orRWAjSS7BBt9o2zcFPtoOhcxwYQgrEkEr8LL1jWyhckccT15uphz69--Xb192lDcWgv3zvmsTOvPKxdQKBNW9Inu3obKX7ApnLhmAKvQwIgJqz6iMzPI3iTUqF4e-9tPet9pzS6id7WUdVzsWjMCEozlX4i3iAks5CGlul9xFFbsm5c9mC7aXMX4qvpoBJTcttk61R66ncly_UztE8VwP5qTJSfyZ4Gasj1rlIGBwfJFMgwfGhE6b4Jx7Ri08FOzslDWcrxnpJ2axKdMPblYzT2sFTbzbuwT1blgNPsYCPHsV0nvKAF-S7LyqDy0_2aWvbywyuqGfJLRJhSf0P-t8CCkj_Z0jQ1slW0wZcbrGIWbDCsf5BxZewEMGLMEWyCvd0TOocierqBShdxZl_ri8RnZe1LhtDQ28TkPQ2Hl6fEAfyj1j1MrW1OWVMyqTZWXOVwwr89nySHsB4QhqcjKTXcQV1Uy2-frcqbcD2HkEL55_Iat3vuwGzs_tMRl4ClTzCqcX1LlPWEXuoSgdzVzDub13DhCu2bAyA7OjtgB0_kVF0W1rN54KfHKe7087znejkNk_nQfT5ndD82xIRkE83NYHg56r_RJmJotfb8CGbFoosunnGoKnli3RV8wCMQd2GzLXNbwpoH2xeUyvcPOR6vKANxEejMqq-eCEohu6Akc4pFUaoo-TqHA9WSXZwsvv6zL1sJDxlecvjFBlvZIMKM62PSzLuYvOpWOqmXVrCVqVYoaK1__lYwdpAbMmOgAr6gapoApPeK_nlkl7eONwTLO5byWYt7VB4K4OAUYqwfwdvk4qdfTI-XqjiI_uwAZUeiVwm2Fq0poZ1CUj03Zb0Uw2IOaks0u9uPbNSnjRflBvMZ9-qttbNOFe3DN8Yrf2bjM1cIfSLdL0FYUpEloPY1CL38hyMC8SOb8p_SK2_7qhuvI7p5bX4eJWQApNppdZkvVPWR8-C-hVPcd1y8bc5O2XgRs-kES6ASALzUrWW2AiNxSaL1ccBTYma8OpFKqpduV2XxylkPm0bbuzKBiPninnXY7nU-BUbueoD8WQ1qY6ZmP0-aKlNOZPeZzvEPqxEu5-iVrHV7JZ-Hi0RH6CIXqigS_4NCsOwf4v4xxdgWusFeONYJEqHLEViQv3TMiCfJZki8WtGVAz1f6Bm36p1p5WH5G-F1EG_lVy1GRBymzFuWvy1TCfANj8uVpYWUatsCfz1oB66lkeepJkCl8UgEFtsuRTPPFWnUe4FyC3d684VsHtp3JimSrRpUxunM_I35CsUshcM8vEKbeacIoIduAnI7K4KRkqMSnNo_ssnSnnZpXwNTzU2uG8Mbjh2gqWv-YZ9K9fmgr33_77PJ0ENUGaGRVFzdUpTUsKVub_x32ONxBagj39X-_JVLKrrrcjISJPCz4u0sm_igy7u_EtFiohRdi3N3FZIWRb40snER1hmD9MzsRFfATKFPqBUjeoofvKJJ_NnEzkG5dn2KbGAU0SRTgkx8xS360iwDOEXV2xZ-sI1Vruakz7zAVik2mmIoT2oGMGaS7cjZ_3GmH1r4ELURdpGpu-kMUW5C9PrAE80t-KNgnMoaJ9ONtgLMEaoiTwj4r1K62vvANSOLBCka_WwrUv1fQvbsLGmdNhvAP_VA9EmfcfbtSFHcdEQaUpEdIMs5H-G8IldJFgDoNpJZrcgZsgoD9ydUa2XX2nhb75wMhkR78413pJWIxlqq3qycfj3I_HL48H15-2q-JqEjOGkUotZJZhtlnm5VG25shHt6jVPvoX6BRRg6R4ogbdXIwvGdUDbyfRthcbI6sDAjiXhLQNCjpmGKJfRbstzLG2XSpK2-pjkEUyyKghCVO5Qclbn2lfMVKspky5kXh6xcdBHptJYOeE9ziOysdlgTU5CNpW7FRRnxo-qOSGVylEW_oLHQ81MGxeRQYgddK3pPgqO2T_Mvup9JC7zQqQmMCzscXPBhP5KT2e7xntLlEmn7GwXwrPUmbpADDxCWT_lUf1JDdJtFHo3h5bN57A0bBDp18Ao3lp64RRAuOsGB_z9MmQijkOxNWhoMtq1vIRtVmFY2WPFUrDSihgI2jW0hG8OR3ukvJ93igpiRvpSxcFDekFqxZtv3lRwvHwf1WsqostE0w1EdcG4UiaS3nVH6d7dFgryYs2Zuai90LmNZH-WiSqTCc9INlSfjJv4MjsLeep3NYZMlOJxUGTeydAolyHVKNh9bKfT6tQFV3ULL-X0bbPaxgHaJheLwm0jCbSik5wtMyVtIrMjc1hAH92WLnz9oIQkxp8AZm8py29-KvLo13sLsp_qauiFjz8o0dOHtwx_wTo8LMXhUlDeMGEKjkTpyMMsoQI4H2497XQXJcKYaXMg10hSbxeHr7h-3BsFi7ilulZ4VewgvHpYejA3Y-VGOqQnLWUy1mZwQWBYSO4qYI8jBmYKVp5UgG1cHSVhgJjY20LpZnyR6_jqWCSCjuL80zuOiLgtkIxf0xxRvZlYGnbLu6BeKB8MjzcYTW0V_dn51DqpOCjtsZ6rt1oPMOw-RuUV48jDos8EKtOBSEiBnt8_OFEa5BWJ0sLcE_BdNoZb363dU73M9TcuL6Ij8Dvdl8UBavRiL9wmowO0r-eyKKnnnr-75dWJRpqt27jhvxuzwE6gU7EJ9RUGACjcy0SnpaE57Q6FuBkmJm7xrN6k1nf6tAvgBtDJAAPdX6U1XLCVZn_H_29aXmSudpxdsYkdtOHPAh2smsYNFqI27qe-SU8d_61zZRO0lW_kCfKIsefzc9h4rTxmiRX8Q4PbBV9kEOhFQiheRAotw-x8WcSBtLV4BaXTXDQ7EYD77C17Z_ALgpwQ13ZlQ7wjbKLFbIPhwUzgquc7P-xFIQcKDmsw7f0-SrO5hy-axcOy-Wkufkpasc9Ma48L7pf2564DzeZMakkYPcXi1xGw9oeUIa05HBNIynSniOL4MVO4bHdhP6UiCiqh7bD2vBXSP4aAt7UK_oxB0XCBG51dOFV3wRnXE1lmatC7uEEMlnmY7eHwm4yjc5HA7UjNCxjfHLa7TqL4erjVTGuIEfcXRDCS90ei4zafDfioLngJxbCpGCgG3g5Yc1RW6TdbXGDkz3KvTa2u_8gFF5fgI_2ehH9PjAslRf5AicWrPkxIx-wV8AhY6R9XjqwLiRiglnjQoYqvm4pt7IDnKNxOeinzF7NdFoYlQOXpQtNgHhXoNfAnRUgxEvyPRiP1z8FPylgDuINFRbybA96wSa_cdN4CBaHaMRWV72AgVJzNLjk92U5Y6TlToLnB-RZ1MSpLS95lmydN6g02MNi52B8NocHCh7BmZCjXgKMGwrl06gFJWc90Ul1ZXULM0WAlgFtsR1zZgUGVylcSSlW2LtIfKaGxaX_83wX1oR-SrjoYFVGZmHP1k576RidHCshxRw4G19GvtGNWlNpRG1Uk-7tTgMxqUM5NUAHdfKvA3wBjaZDt2YO0oTNo2pih_wHSwj0TFNFhEfp5UIjWrSdubc5ryuDJoKrScx75Nd_YF-RoBiXrrY9T-YHMUqEQWdtmBT7X61wqj12IBJ11mpDGv9-aNbCacKxSSXiaj_YGyxV28Ag0C5sxYq4MW-lzJ7eskWT5HZdmhoEl1re2TB4tCUBew3YlJ6VZBzPkjm2c9ldHy_KxTLvF9oOIonOALlBXfyY_3j-mbymezvtDFXO9NFapbQaa5tLFmHWLWfqvqfUFrNrwiuDzEbo-RPAwjcAjXHZm5DKZ-GJD5FlGME9UioYsMEV6beqdD5C1l6yR7-ajrSMxa-ndwtJXhTRjIrtkfuiF0Dfjx5opjL7EkXfFyGCwF6rtCchrUadBfVeo2eeb6zMoxlDInrBZBt1ANrBHhhr9FsfT89UY4V42Ax1NP7zwEs0is0_osXDyD_-OVBXyq1PNxySoiG01kO23v0NXkfZqayo9W82JjEXwDeL9N6s1fTHzIKytD-EQzNdmqP0pENSiYAZY8kaYZZMB08cHGolihLrH5U3eo3xpF_LXhVEJ7DgCskBoBvNdTnHYuqH3UyvddNUTxap38zbOXZePsUXeVpriLkmsI-wK43z50lFZssDSmmijmXHdaoPjNiPCAXWafjK6Dczk2Ltv3VLfyw-kGEqF9MkRzvcu0xeCmeLtRmwTMETFfZRvNr8mvCM_6SAueIGJ9w2MdoBS-9MN4-MqP3v84jSkavtNK0pp_3vErhKja6yICQtWA_WAOnPTRy8_EXu22tIA9wVJPVQDZN3VkXoiPiRN_SskxfGX7nh_LewMxb3uzjUrddBS3oVWgwY9RI2rnmWJSNQH5TpDV4acu02taFPA1N5iadsLpgpzPCnzdSmWd4gxXypmz4GPpONhBPWYnmIJat8lZzhB3SLXMpG9WTWMa324BFNxCCnueuoh_m24XCnVJ5naIF6bNGaz9fkmP4wB7yJ_oYfOnKL2Do_P5EO91D9JeOTgOSf1ggtsaOsx1SeQivY4qV32JdUEmRinRd5ay6gJll6Iwx0-_q3hvR-YGUviV-u-NJS81e8nseK6w_iNvbELlba6G1dzrM0y5_fDw9Gi2-AA9sASFnpbDrPs6niBo2Z_0NxCUEXZbnKQT1525qT49qX6VxdP1dRQnRPtE3aItha9RlcDapD3rlTFqPcR60KU7ZLam3yrZZkyfQWbN96IIssFq_gVWISJkXJtZEfrMPuaWXVIo-2PiyptOQ5eVfj_lYIwqeySQ9796WnlBVpa7hIKHF-T-gjyE3318OCK3el33lDBGebaKB1JDrQRm6cTUjT3Nte40Cda3HiSkxPE7ywxgbVO6AJUwAecsneA74yKCYMvexk-56r_OEm_X0wmKvXVm3P_mXsAHJO4HYMXH9zpR90yFFchYj22M_4VSxDfk0Um-br427-9J5bt0IQSI7xglHyHa7gIXVNPBn0DN6v4AvVCBS-doYCqjs2nW-LONsXore8TvJaGtEGE-glLVRzyWzj6zsWKEHOh9Tds6TwIFJNhPNo-B9At-qcTd4yaEVO-q7ibXoZa8789zXHBoMhEaG9iv0qAXlJlLyuZP9xq_4fHuKReeNU217cvWjQrSaLHSviT1xJSFZUHQYCuq-E7WoLoUT271zIrIjqGetBFZ3LPGtFB9dM7PDGS11mh4vVLOy5A1cl3e4f3qbRLg9Ff9Sebaz7yjz5RST26OCqAOlK21LoEuAsfTz3jgu3k3b38681D9xtwMgEyS2N2gT_N-_HRkyJl8b7bGFUKoAviQOTedJ0gBt1dzfOO82jJvSTm4ZP7Wk6siFryoPyIzz03PdxBO070_RiIDdoJz5Lx0ldpuwyF3UnvywFbsh0YSBow4ZovgHXEe3RHSc-XTcDafxnIyu1z4tJQRolUiaNsLc4eyx4SXxTYvG2oWcyO1rcyTLebbQcAW-Fy2-RyWqMV24zcpSD-CRwDn6HTqcl-dyvont05xv__8MnXhZCU-1tt3zknc9tnr5M-jlmFEw5-F9lrswlsBHDZoyhIImjKr0m6BrW44KocXToHIPife5AhByd00vVtBghdmkCX9_TjpO74-aBYuIj4UQPJER5hkD-b1JjvoON9ProGo8qDKJ1m4msgbt3spUJerCbIY-pKTVDSyN5xutRecaY5v0ueRauMgl4cJgGuKgmna1N3_cpkx_6luUUhNEY29KME3BmCNkZsUps-ioLOIEMb7rWGZQpBB8OjZ8SQ5CqyRTLFgYmG4KS3B9V7Ib0VdjY_Jp6tEYfsxdkVgHlskNW_E8TUTXZ2JdZPVwMswbkrDgWf_eVFDKcVFZz_Z7nMe_2hQWoUvIn2CJUN-aO2HJORfvZYSFomO4ACRtiwRaLO-TIuhH_raPyvQ0M4fCmwmHXrrWlEwyLin5xTitTriVlMc7-dC6E_K92yZkDVrh5sZ_bXlaNh2CSbnxT-kv-9SVN8YXjj13rEVzgP68Gi2A-cqywaVghCJkhsKZqGVV9e_egPDYQCyvNhIgYaWJCqKlQlbxaOdCdaE-XG0KAVgonkGwhRpLu4yyIJ2inJvKlI5eKwNmRf8hVOd5UxWxgPbsR7DCF5MUDp3IcuwpuCwfUkiR_4qMp8rIeJrhc8HLFvE6yUHBa7GsBIX_df3oKJ7ngBV5j_MaVSp_wk3yhd5dZcZ8QPBPs1Id74puoUlR6ETZlGNf8LtwrDTHgw-I3kGCMolAiHWwID8Anz4Ir2PrB1hLhi0y4jTpys5S_ShjNPMVcgfgSV-k2KE_TZMlNQoNgSSxmKnSkowCWNLgXCnq7dI3ctotPJr6AaWSYNdZ2XIpLQz9x6bMtqRWeeTQ0opThqwF3ASJHalAAvPkDzhGq3iQw778AG5ChSC98S8o-VvMT6FsmHe7_I_e6a2W6HDiuix38o5MA46yx-FOMh5bUhLWCipb75VaMTsOv3dWKZB7laxbyqGA_L5M_iZUfsOPHkEdJvI9qursxuoVH-BbQc70O253mYWYg2XrfMr9lTqY8l52Y-OerYxUB2TDlo1Ff1KNxJNLAf_cnamWViSZBk9muK_os3AWUcU0TQpke7Ss_bQWqImp8carpuZdGyfhMu7wbtBwsdxIE0o9BqCutRLMbxxoaE0K52KDvaig6tKRIRnnQPwf4s_-aY54ypGgRkNQswDhwjfr3eYTkEIiaxtc9LAQuD8Mr4gb1L7HkDPGQbNMcrDxrIIyxXGBtAZTB8JLYxBQ_MKhHuqoa8_X51w9SRboNwhOZuCxs7Zm0XcLkISJeCUc2PdE991FkLs3NzkFpY2Vq4PfGe69QCMgcu92vXMqayfsTzzoarQwd8b5BZsWQRryOcvgjeO8s4aAk1e0EgF1h5qvtNQxtBx-g7F8N4FlDw_0b7hjrFtWdQlkCRXHzvejl1XDYnowmu6GxvZcJmdAqE0emOI-8TA6XY1exJph-DkXsoKYlOrePNR-95hPk1IPJSS-41I5fjJhUYNm6jccjbR4UbY60KDJN2bnfGoiF_DHkzRbqKl6H_XyFdtR0c7mmicinOZ4Tsf6iGw-nA4hBTxbmNLvK2liM8IVQw9nrdqlByFulW6jXxzU5iZWIOGPV3s-L7JFjqVzxNYd959S3gC7_CKF6pi0ZWQwCtZyWJ8wHddQyTCD9xfmOL9Bcsoh-wXsBRJf91uU1B_mKzxFeoWqGCW7-Dm1NmcE_MdO5_2VZ-givtRgVDOdrzdHJTj9yqldmjQ64JIhwm00XY-i3g_tOTh3W4ZNYiF6vrCRrzR8QaM5N6m-JlWslGhcHY36lOZrGpVf0K56XeKJauXEdNBnyNOYVS68raMRtFnID9Qhy-PEVpKnXtGnrLMqZ0vp6HFF9vraMUHMzWeE7jF3_YAxqe6bqgxlgkd9KzeYoet_SKf5LTpdhHTgW5AHv8ezMCWf1QTHIxoWB-D0h3ALpXnFKMwSxnlEInugqK_aJNM2QGY6425ZZysKMY0CWZSmMfGO-_DbQMitwTe0-CSC_dwY5qFf5s1S7ggEVGqIcNhAtexuDZ5MirZmp3iCYZb5_cmgvMSaOtHO1CjSSMeJ34eo3JEpLbw2yGZopgQSmZgy7iG26B2e895W9o1gizaMa16sT0OeJSdqmCErQSsUNyQUSEJ3gEM4_UeVeYG2FQ6guXghB_SUrMoLw0tPh66LawPcm8rk3SVen-IcntU7lEu3098XhqJbrOrWk5rEJDremmIaRe-vHIYGwVRc88Dv7Nb4IE3HPIMv3cjHjC4gfcvHjMmgR0YsJAQCE9xZ3EZsUaj1YjfZXGdYJEfKPGbgN4yokQCobCx-EUuYSR_XGriFGy0Hj74zeixnrpPsKRu5tDSZAvnMe2-sK8sN8hrhTrbjR_val4AfZvzTDNGpgJWVo_zTxG2_1uCTdZNPiyIy37mRatWr-xfjAaK8Onr2wQ2PZJ_W3IlhhstR6EsBMiHyV8eHh0NnlIFEaoGyvTTzLpWWO60pn4v-rYsnM0SbuFjwoeUZ9sTj74ehsrSHKFR5-xawQ_TZrHLor7FzuK0-5LMXc4rP9QiCgiqqryYVyUlSO2PnXqCwVDbEgaizsFlsSOW_4JM5npApMjwlC-l180tp5mRgkGoG00UaNiBFz53XRMYU6bAKg6PpFrqtMsWtn2QbADNzGrBzL1KLtWHaT6iLDbilst26HDYBWqxvmX1DM4SGEXFYclp5Vm7XOmau-_PNlG_ZXXwEVk__04M56vTpO3FuJ7Q6-xC1z-92c7I8dpjmNphQe483u9I3fB0PI5svNFwRDvGkdxyduIEKP_ZxwxDEe2AkO9doOEj0D65GR9keEwHoXAXRui_pz7ejnfYa7tY_A-T0NBNAkIkQPBj6SzFIkSWoNqcvnG3TxBj8LO2UTwLjkUzBUC1JP042pKrhNkXARRQZyOF34MweSdBbJ3P0nZ9eGep5DunLlGF-OWzmsbjrTeibGLpbM2azFrI4IWUh-ARIUezjCbiUX_nwCDGGsOJgzZi5jEmrVHuWcAem61jphWO8LAbI9dpajYDQzSDNoIR29PzOSCB3Rzx-v_VausyY0VYL7hIyM4NE1t1UdkmDyu0XeqAY_53eCEEeZ3hRPIRmGWFBp1q7HQtQ3FhzeGA4rFOcoi6lAFSuA-1ROa8zoWi9ZssvIsAokdnPbpPUIWYsU4mDlVBA2RaG14cisjtYp1IYeJltZI9EqInNGwnnPmoOn_MKWc35DN7-s9mVf2NFVfbeFpfI44TfJvpd05mVoRsFjbZZ77NSRH8OH4pghfMeCAEh4yV4_QEh1G7w1G25xZbroTFBnYx_aYURibVSy-VjH_16VSuowmPOhNv3HzOFPyOouaKjfHn3zdm_j7jtNaT0Kw-euDiNLUoO5aQ-xNlBXpayIplcXHtKFrp_6a4RREh2PZoJm-Yb-8jTH8hj662e8WkN0ZeJ5aorO81so4nO6FfB6BDcWvkP7nUNPJU1v_mlfqvmiCyfOE-TeYIPxQgREq6-jK91Nehi0EuuhNckU22q_279x4PNmqUkl1Decsa_vj3_H2E8t55_GMqMah2Ec10dIu-fFLUadOljz42lk9W_QRriWQCkPJvnppRx3-H4A7nxoeM_qIVv_eJpSNTqR9KQgOggb77qJzoSzkMGopUfK_vGv2i-ea7q5LLsAlWD1nWmgToLlSB2f8Hyob94C-vjynuZZ4zzahMBxtLiK92EQX7nu2q5z6WtdeFc11w_x-zt2KeYACu9y0skhrVNLT6OHAeNZccPfG3tzKHwByjbKDuxoa6dOe1VHTC41PAQ8QdyL_gUV_cCjwiIh0MuuXTvIjT39rUtCbpa7IbJ13Rndna3-xPid_FMLk2G8wa6xmJNVHKCjCyaFBv18l8VcAP1EPLB_lUMjE_s4E-MN4M-Pxz8Y_93rW0awFcBfTgqge1Lu-SaTjCSYp7_8pxYI-RUyJl_HOc12yq5T-tq5WTn8z7Er5B444y-7hW269HzZ4v2yCIOwTJ7qgBBk1wRzLBqn9iHX_dnZQBiSIGAZd35CCEobhn7yBbG7SpBCypS3xwmSkT9uWZkAoZ3H2XUSjNAX5FB2WMz3ighcubbbbb6Mv0RkujRH4O-I52FkPuc_S37OasLcMY_6yvgCuh2oUHVtrnvPOuUqJ0gqp0qIGM8uTejhkEhlws-bPeqEXroezrOttmb8AWUutaQPzh2U4I244jZwl7fv63V8E8gNxtIM8ik92MefII2l0Fl7YqK1RdqCNm3qATL6djfRWILUKgcxySbIssGL7XS0b_7cxnOdmzAYfeOKgwfo7zdft4zbM_VMd_I3YWHec5yQ6T0iUcGAJw_u8wvTX3bUXfT-bWRSn5_sexa7olsuqdKRaiuBQl92d9meTBZNgz8jliWANWiWkg2dfxMU0TKAz0RxYiOw2iPFhPC6aFIU8PjQtK8P-4Fp8NCsXFTfseYu0GQQRG7C0pH00s099Yjq2wn97spHWt6sY0n4SaZqVe038M1Z04J8DrSPinGXEamic8lRDjM7rtL0wgE8RB4syw9k83535U4HLVa2Ci3r3VfYna0rvSXaQ6EOS4tPFnURLzGfp56EKeNr4lkItPNmK9bSbwZghSlr2bbtdaniCNwDwCpDtL0p7hJpHMN_Wq3tR0ipvWlcf9KK5-rMXCZ1tvxuNcXeZsKXavbF9lhUFq887TF_6JEgvZpoNmhbxOdRo6kF9C5b1ag4YEvTPcdiXtH3KbrvD-MPEELUr8Vy-jFlLafkhDjO7cGpM-U5VL0tfdUOskSssQMJBJ8jV-9PVw4j_kNaFZNZPJWZXBoKfg9ZWzHSSo3wemNKTe-RXb4HG2SXiqqf7mQrBVVU8Ro7YeSMTcRodn7HJ5je_HCf1cmIL9XJsElA5ST8B0sdJM3njunjdL4o9xb8GZoBIqHy7mudv1x8H0CN6WAwpiG-77_WdXQTzlzTT5qW0AneI1fxdeC_zADjSci-86zzJ-96UuAjDGOjGaPp7yB-M79bnofS1D2wDGv8DIb-fyzXalELadFaB4ble-oBMvvYAj1vZ3AYCjUx6ZS60F050RSjXzPTKJpXYHUGEUOCPX_ofesdVmOrFzIyBrP9oa-d0zdh_xEGdtSpJHkhel6CqzjAcm_SdaKbjNb3ywmp8Byq5RY7lqxbIBe7HlFCG0p-4lpcReQutwxqwnflxtjqopBFl37cb63LsuUKnw2qRk5AJZe0IR6zD8YwZZhRW9c0CbZ2ZyLzTiu8ygqNUgGXVAChkn63Q-M8N85PxpWxle82IDeXNt7gVS2r0wUtMTfp5-2v6ya_n8NwBhRltuuMB0LqHYAagvNYEZpF6MdTAjS03uQgzd7564Fi-XDuehOuiaQsVN6kqI9aZhA466rhhCGKGF2hvD1UZv3QaPraM-DzVPoYHOExvsLQDKTcbl_d9a09wEi_-dXrO_5a6m3bz_nQN37qQ1pUl3B5cIxUpceqVjV8FEZikGZl7L2QzvCGt8DKpu040U3w_jb5ouHP92pv3bGqVMt4IxpMSeDOLPYklUgs_1-i5yT-uTb1zEj0V-QDJBfuGmHiIkjr7Dg_vg5f9wKkNjBnn4sCIazXZ4L2eRvb74wwsLVbtTpNT1A9qp1Q1w3OugH1Gp13MvTBXpK70d_IAdaQzOMIq2Ewf0izyYQp6t3OhKNOATDUG4vLDZqBdKUJjjDPz3xXl2X0CrGVYnrq2gtU-yMhr16hOivrlnSK4eR7JlJIXga6ot3wOIK8ZTCBwTJTHvVfKVrvcm_kq8qnQRxudcYdMIQdBDpx0lBnueVgzKF_Po2HTX-IilKNVNxIw-MQq9pNsKCMTwEzasjiJoG0cLzxOlLsc9QjuwKQgKL5bNyR0d2xSwJ0p8y67p-HLtOSY7E-sJvPnsrzhtRYsrFIV4pn7aef1-Yx_MI3A6voMO5l8Xu-gHY_vbRkVK38UYytpabaxUYiKGc8lT8AuuYhzsmImehkxcArkHrzwUxkpa4VVvD9RJHnmk-zK3oppKsOfySEN0hwzUT96g_NzvWZBRgSfVgWcamX687ZqhcFsehQJ3pG7zZZ2Vftoq6b2eB9KrEEV078HYMM9e-QdmDmgTB3ae6k7F8Xbmxwsek1PP-aFRW9tU97i59Tg-iqS1JJadw0a7WY-BaAkeKJab79EixfKpf0jrGSNpUaoK7iZrql2MhCs4nTksP3JOCyXxmAFAExZu1SXTLnRYFDjwdPib3-aQZUiVNlF_BB9yEOQQnwRQTshGNUlqYWwJMqsQpcsFtRcvIo-7XGZsQYolNNGGblPu5pzeZ9gcr1koWI1-xsxdNSesN78hB9_P-LNq232VnXfwnrWTeFIvAW6l4aB1DtvblnloYHgxDqR7Q10WVHiD6K5GTdzqaYD10xZmaWZIjzdnJW_3Ylygj948uGLsLseYyBD0RZt10AsgJdXTgNp6qkKMSEiBAnK2QcRe9A5htc8KyvAuX0PaPK97dRPKYCJbQpr23Raub4tblksC73ZwWS-GQAYz9tRZ6TJFqxozPvR9aSjdns5GbKoZ4FJ-HS9Mzxky9msgswXPwbeBHM1Jy2qQw6oa50rx7rWl2o1yGDLjqy_TJpIHS-aWHFfIzmqcfl3i35vB2mfR-JwnRkjoqHvI-F1L4UlfaIkcIXO2kh1sPYFSDXPeVCIDLLWZI6OnIH3s8eSpKzsjX3shPPdTO0TrmYww3qjr8YL0jdbFzi65luB0CnxQFAxzAekxoee6LnD0CvGkn_H6SFn-dmyDmC_dBZCJ9RXAI2S_6XOL9n9epm9rAHX6Mt7VEBNKTE0cHlTAmxyc3m1Wtrp0bt3pVjhRq8JOQQDWmw8ug9VBO3ZW48mhsQWDwOmm-_VQ6L3NkpLyMYwZW_ixFu7kpUBgrPUMG21Q7fL8rlq7KSbsfdsQ91RXo4FFb72v3OqzToXcecc3VkNbdi6KdOIZX5aXUw5bedljnt4bxGWP6yiN_IQ5pzexgR5YFnCZQ-jISPaVeV0nQvMhG5fHnTxBreUzl22kljguSogIhX-KtUCgN10I-2AuBiRojvXSJBhquj9zHd_AuIy-VwuvBsp-VcTW7BOtmbKY_JT7ep-yRttgtKXPTDCsn2tFFNpaOClaHVCaH6HD7h7mZoy-2yhShoCG0u0R02BpTuyXzStE-BusJlHadhhGcPqqviOepEGS-XEz_Y3Km0VUXGsrCBFKKEnbOnVptt_GsSWdVFB4s-_B0piqGmQz69oOEqXdXRy11r0dBJrrMEkXIXR3S-AJ8ujTGd9qdY9A4TEzpDg6hqs0nkCXIZOZYZunPAlITVULk1vfueBbN_QoWXV5QDXGD1QPKnbnYUbTyJGt5Zo0hQdZ8FRMDMekrfkESbnr35uLMvrPI2O5W5RjSNvtgiXsvIsp_8CGjghOLU5_N93ViuTCevuIAXtoFK1u9Cl9L_j7Ur-Pa6602S_ths1xd1lN87OPsL9LaHDHoSep_f4nSk7XeO_DDOAg46RHeKDkE_BroEt-Vjn41BP4ASRdsgOaTgAHlz3RlaYVwXBmikabXdiw1ykFq210MV1gHOwv7VrWtdUzQb2INU3v95YpzddHl3eLGz0BWryLSYLGMbnvwPlSRWFWBKa7miPWorcWvilzHHGnBJk0N4Lec5AjqL1Cou1qUMM3tI5MBmI8OGZXS_3_iodgWUN9pd92GYVRyVxb7th0Nb85lAMIxNqJ4u3tvcaYu3ikQ5FJqplorsa-kvRLzen9an2ph9rm6xz-4dB28lQkiWHDiByUISp2n4DA3DOwTWdrZlxioSDTswr-97hNGovmyWy7E91ll16oDsKdUtw-X-nnLKlcAJpFmd547Dqwld5T1sZKGYZxraDbHE5PHs8F2_zjXwDSt7wDtjd-ErKqbnXkZ3lz3iXvjZy3vlwcjSc_UaAwk0Rg8qhZDi2des3iJRvOE8z_pvfb_bA3XeVu1usj3Nue8CPylfqa4BjLh7kPq9aVaHCQ4ytAttx-jdZ5s4xJGS6rKiVt3J8eiOfTo76js8vc96n3E_NSZkE-uTcSU_v8Z6d_p9k9L_DNKbo9RznoNckEVwOBn2tY54yWx7vdauHy7mnCMilNfAV28F7IaqJr8av59dV_yvNlCta69lNOEZ-6pRX8C16Yulr8ptTu_m1NRPDI7Ecd4EqA0AO9G252a7bpmwu-h_Wz3sUSrM9czUNSgWefrmhwnUJE-jfhuA16Q8ZFzSKAa6iEpxdgSBTfi4XZLZ5R2UjsHJoUqBRkOshG3IUFKkEC166sM75z5jtnidBvNmxy5-eMNNfRgD_41fmBjKj48j-FOZr-sExsR8PuwpjVehGpaDEHiQuB6af2juWhk_0aMuDo_koOMo3Y64iFjo2Kwc6NPd6ftHDeLFzu1UtjDNdmhCko6GeTQpXJPclIAaeqXkDhcFiMSDG3Isivora2QJg9PQqbMvCDO4XgQTOVm-EDgMxWzT3qnillm-ssLoONkQTkg_UHoDdFyhsQl0NFnJg7HVvYkibfDHjoqX_3QpXCmAUZFUFUh1sy02YgLmtC3mN905rL7IebNDJ4Mgz8mAtjzZb1waSjiM22sIzXT0JtBBICuVFHxKu56buopqliPXB9_6Sfua_Puj5UKqVsRQhrJInedMUSRvXwq15_SIz-lhCiPfyWswmwRT6bEEWbDhXBOjYQ-a88TSVw_MPZYVdowBrYE7z12XseHWNw55ph4DntyxS9SKEp1uaV2Ke6Xl6AqnY75KyJhY_ovlGtiJnwX-8-pW9fqoftJEnBooFIWyUYLBYMqOVdAwi5KJFFSxcX5HTpalwdR8IhGQ0CtVOY3f3wJxLVPpRnCDVkj441CnRBRer98Xe_qiPmYSkTBSxTuAj5mon11bLaN7plaqa7zSVT3ogIz0Drqr14I9utDA5p_vilEszBJgLNqsOmu5ypayj8d5qUQwsx83hzzhEeykWItu6gewhL7MZRyKJ5_rhhafHvk-h7mEllqfHUTzqyFUyTVqCvY_a8mLROfX_IICuwb8pvgT_fpEsB8jBFcPmNvToc97ab07aAOzBiJGgDhGb0E1LIn4uSAXxgwp4k7UFf0bosz6_VixvOmlr3rc3hIHWHqfMtsJQsuI93VGECfsYLvjbDxz7fQ42FAi2Hz6hZ8O8lzkUHvGZwgfyRx3MTiygEFRFehz_iams1nZsQjJQHApHIT2hJO0q0on8Xy1Sja6e8CV8ubdEWfxTSru0RaGc_eQ3EHZ2rwfUK2uyx1QRYXg-P2NKoQ67ghzDyD3vx-_3t4Hlh8m5dyszV6OqE3TAH9HB7yIwr9MQZMw1-ApXhg6238gmfUmRmKbQfl-rEkVKCBp_kAPwuljwYIoxmFvQdpvHJrCmBYt5-3SqCfPovy4IBFI4x_oBYJysX-QzdW1XP7qawSfxcy5BIHimLU2DKDVuPoB72jhBxZ8eSxKlM0DSnRrzZDqNQOEbpf9xUwLOZVddGmKy9YDEhjrLru-KcQ_WLlNf7Q_932Mz5YLbwzak5EphOaaSJBJpRNXn0mkDwgM098P-QJlgZBlaQiXzroRJL2HKa1mjN6KjiwWTf8wmg9dF0lBgKXTmLSiPCtxkswWnisr6AaP46ku2Q2BFgNoGLawVH76-bgj6ZRM0Y4Rlp1klUrgYKoFDjTQzA0d7MIzYWjz8p_jyqqwLLcZyNRLF6bhmBJz1xj4RfdSJ9xiAWK3KuMOqdHJ9R0GInLYBP6t5CdCXr5yf1ImAbTcpU47ti9tv7Y-e1sI1RXUTtCSMqH1cCWTVfwBybk_opSI6tQxYWbiGtXYG2v6Y1d_uKystkPrRAnpB3ILTwgt7Yh0MdJf7oY1jdOaJISUqaVL2716mcaazEKJP31JfAKAGL33f3sGKmdOkMBcAiaY9T90Nx4F2ZywuvTu5ZjmC_hjIhApazw_uyJlEcCSP0433R9VFS64Jod4Q5WHZBQGK_AJzKmwvT7ngGt-1a7DkZjua0JVU_50yCXYmRo1wnqKhvOK_f98z44M41mi71QWnrH_wO80um-O5AEUsMGBqs2Qus3pOq82But9VWYpXzJs7TkAFm7eI176lEuI_MJ-b2JwH9Jtug_b2028cJXTnyJFGVLamw6rKljy5g2rFOGXapDcPFya_V3Yknem_yKSE-n1Px4Kjq5teA1eN7WQ-1xBULIFezd3JvT160r0XJ9x-6tIJiYih0OzqQcVf8ktQC7P8qrxfATDSnmwacU5NnwgErfEosvjFawmc6XQYS-0Wt3759IyCLcqtif9WsjXHO2I92HLKub_CxVeJefwzcp-qRMxAPy0reoQod_vMTIRas0TSK7dy5lq-e96lhqpyY6JrVjagXWb-5XEXVkoNqrSlxMHCmw7GqNUpH07aFvL732X9ctDe-M2w-_wUO5kJToAMGc7hnb1mL5datFYdR-tAoMqNYgHLyK6KXI5UisTBBBJf5ZDlH5v4fTabABJDwwGJ19gZF6xXMp30w87WWTU8kqdvY1i_2msrMQnVhBT-DB0NIzdqA4T-tKrSnzpEaf0NwNBscZHHjyUp8FPzPZX-dX8Zkasr5SnSf_-5Jyz5K0HGFX-VsjCEWQLvHk8JfMTt2bJLj44oY1PSnJIw8lwuBrPFyUpml_lhT0HinxcRhdg7e6je-ZEXYBDHtJNcooZ_SpU1uQqv0Ueews2gjwe0QScKGGs1r_x-seh5fZTMpt5TdW9SHGhMpTzQQahZIXnMR8lOe9t3-wWGGCFJJjdrI2KbcPCTvGVq85aB1bXoDGA0nGaDzY_mEbeAMcKtSbm3MkoVZRFS5nO9TDLHJHdK6f8UJ7L9LZDTy2FTMRxx1huX3amCnsC4M0YDbX_8UZVpydRehA4GaL6tzX19yop_8-Z0T21Z79-_hbjV_6wi3JE6lnYcJBADo6NtrwT5_bsPIr6-IZ0OlK2fgHQqGETciuIr99xDDuMa1W435BOw46sUVF8uCSDQstQO07AQZXUqobyUPNj22n1fDWSSytbanppAHCzrwrcQT0QPLmvKCN5pYXS1D4UPOulT4zgT3zIJUAukjJwD273vqXpjTzaJd9V0DuzfNLL9uVrQQ4kb7o4XorP4XP78BYzF3W5o0JHhvUk02VB5GvDOgH2kh63Mg7MgypON6qK3F7Y4s8K8BPa2GilK13RYgalfiGwDwpRIIHFegItcNZp9oVDq3x1mCvZ8jver9daYWMOEh7tEIfPNMMdyh4e6PwaECn9MfhkBrAGQNBDyyFY70CzROZ0z9WbsZIFgcjZi2uUun7rfNSR2Jvnad3ZEUoaSX-VPuBfqRcbk8E6HBCnFyTW6yw2Y7xWW5wlSLNeH7g5kxddJJRURQOXHHMB30kIocPeWCrHkbz9p5iDK71XAsLaJ2KZoFQ9hWe3P3GVMGFmGzTaKbdIW3GReAPRE96XxVMfpR3gwvkFTgymF7u9eGAEHfNOMSH2iyecfF_evUj4Sy0UCXRLbQzCqFoe9TufXSespRWsnjWIxFCpLnst9NcCjQ7Bd7uC1bvidFDQpyW_Ni6fhG9KMcyclc4lCLzJ-xihZlYBVMcGdflIhCYAbX-oldMRM6UvHG-0I0wFuSd_1BqZjM6o4ta4_F0jYcYjBbXouwyThUHTOc6oSKRP-h3E1Ee6iz_0qBo4PQyMF0N0xzSbW3rw3QJr4t-BYWfK6Cg17yuMtI4Lkw_HGxOmodl0AN0DdTmISEfBk03fFNGeN3KeMx1hJP35IrFPAWD7p-J1E7FrwZoSvQo1fZOC_yqmHO6whKDxI2jp34uI9eV6iItpXddWhKuShVZD8l9zq1Mb_vGxSTzroamfrtuI5jzMTnYJ6TDm3RmVOxdm3M3gnlaulBZHuXXrFQizHa7Va82l0XbFwahzuYsesH_pSOh-Th0NU-xC8macqDQz4eqIpbw4grl_P18uW2qbpyPZHy43C4QQfEiKDodiCVSC2ApPkQzJNFQz41LB8XSPrn-LyjEb0PJDi-L9uq40p5AwTXiWj1m3jDk0qO1SoWJKyK8Rl1WRvTE_F8DtZlmkqlrxYuAfFhrKeL-CFxZdB_AvTE2jsvTaXZbVTH-JVz6VbKuHCxIqEvMCrf5kY9GDj93rJgXq4MtIy9F13EuKmA5VQtK_6zLszQEjeJdP3qPy0b1I4Atkd2OzKO6rsW8L1RWP3dvkWE64zcPYX7qxHKRjzcf6Dba6gZ8hl1MJXgW7fdu1-o0oJA_HnBWRhZ80AoXV6qfKsgfdE1dMLW7At5T0ILizfEIKFsyarlBZuTRLADDUo2FgoUZ19urduKj1AT2c4kCTl4Uo1mUbxbSQXOMF1aIuyOwsWCshAYK2UqcRNkxcEREBXn15ZbA2N9XSpup91eIXWDam2XevD5oqgf8M7bPu48NR9h44YbAquowpfdhekeCfGvr-IakLFz6KTCt6nY-5wbnQpVhWQYTx08d_l5Pn-WSqBaxKNrnXZcclSuTt3sFaNDaWxxjAytFCMbbe8pdYquJfvSO0Hp_71IxCFCEUZvLRAp-Z49E-NecdigIBNfxrPmY4geHJqydOJgNTVI05i3JcRTh8MpOYVuRZtYk-tudyYON09WwjtbL5NQI59j_biMr_6b8Czorj0zz-SgsZi2k-jWGSUTi2yHNDlJ3lqSim9j5EvoFlGt0hvPhhBObI-hlxQOsRprL0wt9Yl1Gqnl9oRK_BuIJlLE_Cx-CwLqjUkrF-kVbv6xMMbRjN_-FfGjTV-zNAU6lNInH9CiJIrASTUkCdtChpK97bXHha9B4WlEQBUZvvyWFFGQSmBM0Qzi4Gk-pvvqUKSc-dyXiwPDfgeAENXl9UtLzmscE26mtubWY0lP1ZLF12dcsBTL_HBO3zupV9fugl1YAiiIfI8AdMtS8RNXq8ey0kDGOfue2kgPZAGL-mhR7QT25rdml_QIFV2DSNzdRKdcz7GQPMBrzoJoxkCaAIJaVnZeE9yXTYyJoJGoDP1pOeuX9730T7JbSREnjHiI_HiqCzYy3vErp67PZvFoXqKQGR7tdQ7Atf4ZGRvZqcz-WkcSP9a56i7c-_NM3Z50yAwlVPcdgpTqauinkhAVOot4T3y2tSBy7kKTwmvo3f_yH0B-Jer4aSsfy-kSfe0hdE6bggldWrNcWQ_ew9hMI3JmSY2VAh6cE1P_h1cDnDroNYkjiDcvKU7JX9JpVZC8EBc95pZ2OVv2bxoFuyFomutmy29WMNE8Q7uUzZ3AUJ56NNyzAyjWGuLZz5v1AXvYdDobQ2YPtO1EsIVQgXlsxoVZzti96bjzLtTzVjae4qW0GW0QrzoOvYoVnr2j_SGabHRG2-GymEfGasmP_CdeSDGBmB_wUSoz6aRo2H5ly11kfdX0H0KzRl2Hr8RZkV_u8BnyG6_I-GBzotqsg2RXlL7W8okzLyZlWCWFYL4fMFk-FlH2olfFY6vUCdHM3gPvtkk-G5JvO-26WZZ2YwkCdt5Mx0ZWCGslInAAwAO0ZuaoVLvEscdkVpiX_2DCurqFLhyikk_gDd0RhFKQ_sPJl_QKj19mIN2ZvQXkfuFFE4TeoyH6hZoyx3RUU9VojZtfCvLuhFJija71ugJjwDcVjpAU7GP0xervaI1ycOkfdp1cZDadrFt6pELHukibByA2kmZZrLQHhbSw92MuNFX3wdpytQTbQmRD3v9YEZ2hsB0t4EFbxm_1jc4lIW1asJN8Ht80xkHpzAQKClHF77WACz3aVR8C1nTGCONmfq5_3B1nsrlJMR4RDci3bWyRl1-aArU1RCDiP2nGi0iQz8iisqgcChw4OFGjlKcdNCCoca18lQroSf9mLygChILQKDTJFGvFza499zEPLTGUxloRaI4bux499OO5b7I6k_wnXPlk54pGaI8j1MiRHp7HyqZPR_iEn7R0996KIgWLUfKq8lvErArinB-DHfejnszohlHLtOuGw8AuW879KtzZceANPr8x1LZXCzoGfJpztVV6-O_cna6rVJpEFDR7h0IbcaWfBNK54g39PlMF6Bh7Wx5UMANDbLZwRSMdGmNh64zoraemt0vnmdwpn1w0kYyLU68HXoGG_ePv1fQQy9e0IXrXPLWDBOZsTS1Mi42o2fL-eAgZ-Nycgeg_YyzQ1ro9jSCGmK_Lms3Tu8L1lAGGigqxlppfGvlE8nCGkZK_R_9NxLXoEIUXDMHdPDWsTHPZcBSPJdg8TZg6i5g5lqcLpMYv18eaRDRaxFt1UKg_XbD8CDtig7q4zDXtiUD3ANlLo4PZbIyD57qWfjqeTR8cnebdYme6IvKMVU6PeVfikTXTjnwXJixiWSfKpslYSh2QotFgF-h3VHVaOSDGgsB5U3k1knQJlz22tz9xRpwtlh6vq1iZMCxdhN0hT8d9sx9Yd6UhW_7U5n9VVi1E5nkyAd2DS8Qb_ROKC8mvYQWPCBs6L4gWtG02WSTZlLWnj4XNUVr3dzRZch9U4yhPMTEiDbdYrQ8GWeEnujMnM12Z-fuukoADxuif4dv2-1mIDqq8zPxfjpb9eS5F-zEAH3rul2L9IqaKd_vTH9WkY8nxjqrfx1PSBlwkEVNANwrkuuPyyeqzKYw90jDAsUusRxUkmkF5v96hn-HTppG6o3qjDqHadiwLMIqCZlCumhb5SgzZfTewaHOIsST2_NdI41k8KwTlVlnq-0A4Xq0zU5SuPUuFnDXZSYs38YsCG9M0zQog5K7LzHG887Wv1l2d74Z-qge36DsOWYV0tRkGXNyrQ7LIgW6NBX3ubiz7NOgcXSaH5fwfQATwcFcXHzvTvkKQAT42RqnfFGRzwtSZjSXrnMvi7WeJ4Bw9-plbsy9p9xWH78vLdsAQDweiaZVhvig_U1q5qWCjsJkslVjx1JXbsPFbRu5dPsqkGdvSGZOfeo60_GeYeq7Gaoqahoph2xbnaRtKxMFi9HDKbFksetf6jRjs4_iB_TagyWOiSxhMq1fzc843RSgL1-EZ7vAupKIu14l8ivtXeP35_Vhd1yZB-2JoTIvR_KgHTDqopvsYk8YAlBsR_tKMXbFBZGJqGCfydpREPy3yTK4O-YXfHFHfpU0RhsrbxdhxY8J3Q-4issEwoIEYkideI-QIt2Wrm1n6GG1f_STRLDDHFyMoT-XkqAgt2FmwgH9hfo022EjC2YLQK7B7tQHzvlvcpXJbklGTmrQK5E9i9LOg3P0o8MwupNYoGgsgi9W17lo38a-wOSIvFKEVbDNKnADxNquIqYDR93nfv_ztiMYAW4na0DCMxBwUv691LMRk9mYMeOTJAOFiaA1eitMFcYdTP4Mw2nMuZw9ycaoZB0G6GsBdnaSU7473WbkWCAXRWWmmrCvXBaz14MKodHEGAC87EbmyyiRLHaN0uQSsbRnxRQj7mZCwxtg8Yrgwp3mkBM-mOsgaHRNHG1gN5U6G4aj0sJ1qcHIKGkNXWh21P5L-VqzCEOkVxZgs-FQHKT9dpljUMMXJXeWzhtCZApfalDz6ouBDtUtKvMav9AaLx0Qva1oB0Iz8WBC2Gy6T3ABgceHxUXTEP0bdy_pl0Vgj-OEVI2x-HXujdDWGeFCb4f-gqijs1li6wiv2wDBd0gQG9hjGo8c-0zaRuw-zso_qtzftJ7nHGcuSZNQwggs7cAIkLCf5T2kwmNT33SFjav6XW21resj5xkQcdQ7PF65NLQMG1zh08Z66i2sdtMJtYLC6jDABzaVpQoG4Z2hojh9lQlRo-HDF7_Ck_PKtDitxHFaIjrThzawGBu0qjV9uOQe617r38yzGul3SHU8jliR5vnBSpRtgcufl_T7CrNtWPz6SFQM2WTPATypzKZ0SXnLORUMmzJ2I14tKRzGAnAoJTqDo8PlFC6h0Nb4pJZG2SfzJgP_fB-TRjS_Gs2H5Fj9M0cRtSYT9TfwT2bocu-SH3RRlDjDdRmTxaluxUSbKZzbO6sNL9I5N7BnxlSFG6CHo7L7HYgIzVNyrdCoe7u4hOnt1G_adgx83aQpAieS5Qx8DfbGVJ-5bSUQiFUA2YZBxz8VkLtJLJnvp9Acw9xz4LkjMKvYI0bfVDuDllpYtk5zLYV1_c_KO0z6oDRo9CFj19ge5g-dGT4NxumfXE3RmfEMvlD10w6IOKHyekd-qh6LBXV64XbXPuXVWve0mzy47spDs7RgOeMUzicbK8jmxPOkLinULPMwW4s3UYNExpF-6ayPHiSsjhGzr96UzB_1ZGnrvxzPqA5hl7rkuc18r1ce4wLZSGe5ecOjUNQCU9QayuJNLZa1_lFa-EQBXn4uJSgqTJCt-GZyKegoL035Y9qj5_1oX0KAFeEaNYkVFhf1KW8T7h9OwH0kQvLOCpp49TA91F0uaarTwWeFA4xbTHG7XTp7YZh9lyIm7qpIfOaQ5HIyYy4MjOOE8A0iVw6KcTWBsdLzuQlW25e5rFvQ7hm9gJP23dMvRvgVksiGTxrRMDeB69az8ssLppO67xwC4Ks5YoxKGpR2I23FTmMG1_SxoASbIMdz5H6iGo6h-wrdNcn5XTzU2YFyfNCOS_XR4X3kDt5qCDRyh7bJcEdTNkgSMEU-2un8FnpYFrNxlMix0IJo6e5jsgDlRcVc-wSGDdr4kKyTY8WFXLfXfJ4tNGpjE1g-RvQ4P5a9h1hu0TdBF7sp5Xlyz-l20Me4sTpIpGuRNYotmIvm2nAi7MQtoBMd7b5kQxHfrgKBDKFz8RC-Zt8r-8Azn8Z4etz22oNMuJuCN-6Y6OTXoCtciqmC3SfamrYqmTO-12WCoJweQjK5Mckp8kgyqNWfAgFO7h4DBjuzcfJKHuz2x12L4Mi9wBx2bU3-eIKs2W225pCDMVbfkRki5mT8KHMeLB5wZSaJdBMIELKN3KRFy0kAp4QqNHH0auHDXaM4BP3DCj_juGbH2KBY7mxjUUi8ur5U869YLqzs17rj71il5SXF3Ym636ZDawDW9m_mKyyqKm5qFZsQzoYXHQJoZeJMYZ-c5nCG8UoF5acl7G4dq_7-NgrX-B_3tfmgCeKabntEBQErv4qzmnzeDBayvwOx2Hv7-soHkkAU0WizPwE0yz-UxMZwX0KTzcrfkpy2n4qFC2dBtQwXdBB8Tpsu4f9tOkw93Vo5RUEgmSPn-7mOuSQpjS2J-3LwD46iFnPuHMauTC2P-1yJrMi9ev91TvjVNOUe_m7gQVB_71aCBfp-XoIuWW_8bcNgvZwO9__aQx3ynOScxtLY-IA1KOBhqvSCijEQAO1KZWeiebltUwXq_Ev2_2JYTST5i0fbBPAqJV27WcKCzeMVjGpLoQqYLjhE116vBSj8gbGkgq5TbGkFpZzDqxrYGcXWYk0Jk-WGmW_jPzsKaRuR7ALmL2sacc8L36tQJPkGosScz8Gm9DfoYlTSPN0SpGDK3zPFGrxCiB0hxSlRS_zESPRT19idl_1FJUyE1gn5RHS5MuGU4ELzpxRsrDh6EGIAf7SSv9uMMTopuvGwTicOGPLZkhR8rs7tU7fPaQ13-VQYPvtL4CuxAP11pOFqO9RRkmMviLQFjfz3VhWN2xvvQ_oNBiIc7UhRvHJineK9BjQoxUXXuBxb4ZkkEHSTVuhJjOT57LYKnMaq5YLX0SRN6AcE4HxuIij_GMdRlJToFJqNg5F6oQkA7qCCag5uKHnj7x9NCgqmpA_AvvRD7MwouTzzSFgRakwV4GcY5WxkcpIN1DUmR-8KgJ2b3XaM4l_fG5gc1iijqirSgFzZ_S3T8sMl_HZG7MvEp5aggpah7cFJQDc5GD0GZ5pdpI2dzQSXX1htqjisO7AEKCr42zqj_-nfdoqtoks2xOhPpkf0WoEK-PFdDKDtc3XTtvpAujkW6Mh-9u9QrTJWUA4-gHoLL5vP8E0ym6K0W-57bKQwQBVLDq12Xar_FioQXRPeoU72d6cVoIGrM3RC3f5v8-HoevDSRG9Nj0OuorkHnXb605jUUbcXQyecPRRpN6dT_ek2OG-u7S3rUVS-gVNiiU2BB8doC8iSQRKqX4Nwf9L3zWUUg3grjwOxCAw7lBZpz3JgTSpD3qfsZ3P8-S5VyJvHSeuZeSDqoXevWXYd808D-bkG-NvBbndsyiCGOaPAnRM7ccM7b_Ow1aKuGZlL_6JcnLJGpkGkqvOS8ZQziHIj7pgZwW7--KhDIUXMAUfv5NRcaxEdWVT0ktYQBAIoOM6CIkPCnMWvRwUGoYpuKchRfoXgWDUqgv1DhWuOWRKrrfNIYuxbA-NkoMAs3WhOW7z5h5cHT9_bqNsqT9d-KrBZNsNLJ1rselVKRu_m8Ztk9zQuqHusFdyb-N-CTnnZGpRG1b2hFn_RjW0t6J3b2jGt80j0WuWigz2zF1ZvUSLmueeDb2YZsvn-Pi7b7rYRMMc6Bc7cZtIrriWVehyUEs6BLMkHvCH1jCQnMzm2mtvS00k5h7HwCEcjGwnxx-ASgsYpGFVzNz0nl6jR1idHC7_PH9KxOdFQQvunOlj1yB8Z-swPL4SD8c8iloZSHn7nwzFFJ4C4Cm3MBOO5YPuJsXs8L_UCI5HcGphnJSrYWXe4GL20Xt2UhpiAIHc3mwreqq80-iNRPL6YnR1H0YMSMCjU_WQIDI_Du3zrxPq74QHrlcijPkGb54bzP2MYsSIZGwBmwmmA0YURAXm2cujurGkZV3UqGCupJ9-2CcjWN8gaGcVxpLG-6xFMc53-0RhsOhFDBQZPr486C0uQ9SlO5LNi2byK0H6NvWJ9gVw5BJhzxEPc3s87zHLgNZBASEu23LVkPLNSExcUjSdf-wm5LFKgeJ9-uof_X7OpRX4mQDuIlKJtqNHBLsfkHMHbIxch3YLWPJofmT-wuoQGHAvSU0T5tKSOwZNS5Gxsg8OcbuQliw-ureqJ5OihTTToozp2uEQI8UCK79DRFCXiVa-oHeGym7jT1daN0CMmdVIJnsymU4kIZ-m_iAxJ29TW__Khn3kKTttaplnZzxgto-f_PMCPxpV42RuUYUzE6Y_hzoUPqq9RulNfYDPrLLTJ5aumFxkQFxa2OAtNNP-WlUNbQ5ePRPAfmKLoWsph9--qc34hI8Zkb4fvktMTXqemI3rS5khn477wk4daAzkh454w_r2NPBuLB5zx8y-ABqzREX0ac0yvV_Tx8YqPlhhX_HW_AOrrB0dV1NkXUj6VDvonHjaFu-mhXboOrKVM6QiUtLW5Gl5pSUHWb3qCHNRHHZipQ7HBCs39rMOwPj3NmTkK6bKfcDcuEoRMauhqaGG47sEGqUO6Papwm8m1feVlMiih1QSQzL5svfMX86-vWjODOQXCEE9Km3ZnUgfTBg7CDCUGVd2dXN-Lyk-6DAcF7y-rO_2kVvJsVnVNgX1OuiuXaSnyzQwcb_VXWLQKHZT0fce0Pqnm85yhUezZ3ftZjVuTxvZ7-ZNvFkL869L9alBntMGhCi9byHkIxb9FAgmA-xAEHt5Yr0rbNi9bZfORCSU-PaNZEarAyL5nNYH5BVHh1zu6roB8LGjckkLpB7BbbagYuTzpou_hJKv2tCTC-EXPkBnDJaAlCqAwHiDekrBT-Ar0wTGKsfKBDmnos0QC0J6UYUs-mjalyEXRCdPC6HYmxlWd-ERgW_bs8bjBVzn8P4g0dLOGGzuSs5ThqyZ-FaMKZEKkRAiL7zT5oO1sAvLNas0bbH9rfCkebugjxDdT7BBKC0ggoTajEp67FeEOnnUMZDpoeGEHlY9wDdWy_v_TL6QQ3-pPHROFWLYTMt7oZLwKtxlNPe3ZuVxa_RLK8kJJg_fwzhPOYKB7ZkraC7wqX8EnKTxbFWL9RNc4qkxffRKISJna0aLqExIIJf4CGFw1Bv9kXJGF7cMFIWALLkxQGgJrlCoAxMp-G3MxqNvtBnk4sqMWijvhx_HCpT8sc0xXJoWsWxOwki8bxwyy0OtTBme9DXpydnaBVOFe-INNAyuF29IK7FPAvmhipecxtQeKJNYMmqMR9zgNTzbr69ldMjwcZEUtbibkL8vTHigybyr7Ptybw4MSlgF_jgV9x5qz0eB42pFU4CgZNbXOzqY64CHnZOIiyTB0kfwysrztk0sO6pa_tkLST1kDUfNJ0ZB_JwXHe5zOKW0m-vWIRlSUPzypxoRMwUxMm6ktnoJm0W7mekJc1VCV6p7eB_sVBAZt-qS4naXAP6V3lS0Yj1Ng_wmdSfkN9qRfJPT9rAlLgm1t8aPdxPZU97tOS3nQHecXBGFhLlEozm2ryY0pfHWv95IMjd5HN0uSLxG-09QYwkXiu9wM-8IMCOX_Np2rvKEgIn4Fuy5E1Zh9g7BKqjMDhNGdrBLN-I9UErkAWUTe4ibEUxBoQNnwBUBb-q9MWU1a8nxHSK5EEZHC-1EaKdh2KL77r5JjJ4aJAp5YQOCk8Tae1NqeCNK6_N4I5cS2MNx-kzKwS7su1ql0N_b0bWJxGxgdtye7_kX9yAxVBRJjmE_XknquMKRZUVZeQXq-R47bLkZOKUaggTKrNHMFY-Zkp6S1vIb2TapmftYYSJUJVwCV3OYQ4LQJ7GEdLmJRs_IeC4AVfMlm_32F-_hMTGUGgowuYjc0J5rP7i9PzVP7ICgIdKwBZaIFEQpJZWUlfiSnD8ND_4FC8Xz1k3NYhw2G5e1RVC9fjTMT9QrJ3nca7aXdDkPJz2IlM6ba5_64yDaee5W1hBt7H96IQC-pvpvAv8nREw3XTUQRVOeZ0RhutE8MKg291NUm2PIWGWxU0ueuFPSTEb2TRWB9Po24aIqVlaFty1zeMMKlVvvZTQmrE0ljlHkI_8k8mRJjAqq1Ae2QmXy9q-1DKnZi-AIa8DeL5xbvyikOcBmqUJRc9SEEP2B6aai4X4LM0YbqF6zGA8PgTXEIonnLHcNCsRdwX8Gs3BGP99M7gBPYyg1U3NOqNd7-A1VhX8k5GX7-ni_L6XkaFT1rsFJwnqApzvwEhdO0s2zuChYLpFk3gjrLsJa_k4LXvR2NnWxk60d867CaH9akSvg5cxEAno11ke_OimA7lzWPJ0LHJFlFzI59VPd_C_Va6m6MT9w6osODfoDEuqbs0Wl4YbF7QnQvhjylhrAcj3D2XhBw6NAh7AHqpWZKP3kQXD3SYwos5IGFKpwkOMnan3FxrgEm19dMSXbmrShlYEtnXwrh9Vt4pE1CuxGsMiTirVdZiM0akCKmR_EgLsEIOotXGqJLOGylgn_crWG9SBuOdT_OoUYCW_EetR6Rsq2erOEBJqYHs0xlI99NLyeqAk5rll7LxHMjgs4fPiE_zG4cWkZIT2MvW0cjNjb-K6D8DQfVnr9WXpvOeRpP7gvix5OqRJ3JrnG-tCHsmyrc48ar51T4SehduxysT6-4Kd_BtlC_y2QZaZJ8tiOUbqdpjdyoojh4CYxUFhDSG6EH9xWXelXdVgA8WoIZSF_da_JC6xamE7_HRh1HnjfhjfY2ooOtXd1rxdSkqREuNwgtZ9aTTjHxV9J__yBCVcN4bim0wPOKvP-rGC1F01edoxVhWAWcAwWYzJW7sHjubJwJXkUUMXVVLUtLWjY7Lh-jZ6jXmLD5KddScTwcnYZWUlpoWzptUDhi_3vnwxmj-d4Pi1B07U5RvZasysufFQ191Q815jRPCmzO8wJAPsFl1BxRb9v2jF5z9Mvk_PEzS8w0AKXEin7ZavGUDTH3vHYvg7cZTiepwbzao-z2-LgTBXxhcn56b_NcueNnC7Rm3O9qsabKiBPe7WGGMJ3XiJJcOzdwFVhsna-dA0xCEWfEQh3Orch3527HBCvkL-bYOMbSF3WwCtsYaOJ8OS_GEvxosi_X3KB0BDwmL8shuAgFOIkKabPK45_eDrumDIuM5yaJm3EpnEQ5eVLCzyn063DSrehYqjGvF63RmYndQk8ApI33kgVeXxmvcwetcIb8GQIq_3zABhmQZgRZZTVDoQSMOY7JjV0qJ70V0Cu-i7dxsaNn7S12pXBdQSlGKjxZwsfsiHeptYiraqJVNowlOXdkngXY3TWWxOmsoPJfMOnGVq7hZZL4RvRbmolWvbPfKh48sMiXFe0rVNjr9EbJcWQu7hJ2_j5ChI7kvisQk8pTHaF7ARGkSvATyg6X6cqpG6WpPXSQwKA7eTLZAu3YolwC9RyUcHSbnXvcYFtVYNQx5-iJUxrdLtBHpoQY5CT-1zB63z9BqEHNVkctQeLBFiKbZGBn4m5uq_tx0lsviYC2HgItthPAdJoldrLJUZkDTLV_u5TXsPR3EGwhfmTjC0yYS-3t0O2ba4luRgpz8oufhfwv73BP2UuOtbIL_QiSmY691nG3jfiouWi8Ed3CSi_LMxqlcOe5OLwoPEqumG_IA6aIJFdosCOCJSfiEsy7jLLFzn9L7-7AuSuorwZ1dIfRsDgrEjY8iBdonoo82OZYtLq3LKyQldiPkyjk9JlwPmsb0e8HChfV5G_zMibbiUPz60jIc0AnkSkGu5fDAwGwuUCcqAxuwCpR3rRULSMQV-8v4vkt1G5jF72u53ciVNvAXev_uIBNml5qgAoGUYb06zAdvCs4cCwbAfKRymC2otMiOW5go-IJlZ6kegV4-c6-cPz-S8Gpd_k1T1oSX0rn6JP7ZNM4joramXXNMJAOKQP90PufGLQpRChCnvGpqdPNNioU_09zw9B7uaYTL90QyVdroGMUvq7zVyTF-n8woOPd6q_WVlaTPqxOUkBbI-vmdPr1uuWcChcfQpnXj7ruEXP6zzpU9PkkUtMmLDJM1FdfJ1KhMRmgscxCyoQZxkW29TpSnW_aZ4mhhSQiFhhsM2miNMUN2m2mL3C4ewgPwDytknYHHh1iL0-MTZVPq7hrscsNInpaSUlzZkNKxqZS2fqDD6pO8jYYRu-7Sr0IOeRxdsAiVr-AdZejxvwToouRQr0J3k1cw88DPAd6mFI5MQrTXcylUbto-kK1DGfH3blLcagxEzorp6ZQ_xVqyhjnYDVXnpiiagO94l3LHhyqp-8HuCb0_dmxGAmAczxugzC3tYeNT7GqLglDyqB-iHyaOIRSrN0GxLOA6vTG0Bgzv6sM67PFAb0cpOwdqHOLjkabwP1pvqZn6NODkLmJp7cL8GE2hjcmsjrPLW2TFTobUhkzHap7CHD-a8EPOfBlrF-ApHQywzCPkhE9gcSQWkhCDVn0pyhdZSqgd4Vf3lX3ZoSMFXPeVhx4zjBrf1sP7sGhOAHLSSohJQ2F9XQmxU2ZV03a84UTuTjE88frzrxddE1Wkeqvcqio3KX1Fmqvzp4ocw3_qy_fH-K4P3dYPqadOUfq-bGJQdv090ttS0L1swA05wwAjkbQPrnszgNRz9z6_0lB3QvOHgQd7ZXCeSoibp2cOCsH83xeJ5c6jP4GzTTQwrJydkpNWkxHvG0vovOqfs_0BoAUzmyHNKWSpp8RZwBHslJcYRrAiJ5ZfCLZBhUMZHAshtzKuYhBKNodEbfhzaFdF9m1H3ftUQ8n57nqS1JI825ltrFcLP1Z7nWmPukrwJ2dWyeHLJzzC-YyAiNL8gSA0O6hP-6X4QqqLY16iZ0qee36cbhlqKVhvkIPcjBviitJ_ulax7DR-0wo-JgsIbDEkwF_fOQzSaUmS1z7KX4HPo6XFEExXZTxyZvzly8tHPByAcqDu3gPaaESD3Yo1Iur5Q8ME3ShJlUv4E109es9GTXIrRReCKKRHwOfcViY0liD9rX1WnVpItAJKKrGz8roB2GI9L7nCMpfriFdM9HS5zH36K4ZIDdYZ-tWgXnyijSv2bMyRGVdUDJoWbIukjJCaOFKPZWnjW-eRuWd7IszNQTAe69Ccc1RUYdmXwArR5oXuUP8MoRDZJ5ib9cjNS5uX3IiVhjjqmi-xGm8qV6hGqV_OLJa00aGbKMt9JU4XQNrT-kzCFT6Q97Tb1O0uerAdb50l1QjDJ9Nnxr0BZjwCcVQDBHEkVU6GnJob7eTFhUovSZCZCPRInwhsGITg-WH7zYz_O7GO84IJha5YRC7mEXKREwrufLSjFoNBIyCGSNXY4elHbktR1hBgO2wUdqWBQtBkZ1qQg_QmaFKrj_IudEpoYrq6pVc-34rg8ar_p0ihR_Mzmbf31gfAzbT_4dTgsoqlB6Md5bRG38sYD_IfghNVcXtKlBAZbZtL-NlcvQ8iw7ZEhMkfeJhoZps7Fe99a18k4z0Izzzq2MEMCriP1HxY3vHwrGdRSqoG6XzMEmoiLfyEca7F5fpivkLApZcPbUKqSv9UYQ_EBJ4KSjJ94UqPxeXnPMrMw1K-NCIgQW4lt6p-Y_paVPbB4152pqINH4-Y31KER-QnudL3Qn0ttGL7ZYOQuZ_Pi_lgSf70C2FGWrCBLoA0BsV-brcjEJ5jrpHlhm2GjTHj3e9X6gcZyjw91RDRjDmSuANv2NETJCO4nRCcioRmwccKPl3mcVd-SBlCX5xRt1ENNaiWzPZFItZm1MI9UvUsDwnwfnwXR3144aPFYKbCesDoRFPKfhbcveBvOExLIJgFrZMncrvFgH6nPeaDYcB-zbP8Q28EN_smWLPSpFteCGyUptvf0BF0v3uhkhmMc1BXxYIamvBXYcrQzbkLYayZw7s4Q0adaB1xpCnijO8tgJKKDElGeEE3OKVeTywqM2DDWhTfBWyNenXZgIPOXsoM4CQQuTc1cSF4n9FZJjh7VL8PktyrtwKbcw852p81VrRohStXci1PQWVtmfNl3wHntQOcJ7cPkACtLQFnlNtysL7hB0JFIFPVtToySKP7VM8Ie2s3bu_zSuul-JtQ-7KwvP_a31UXO7aVeFHwGeasileOWd5n9_Qt0sQSlKzCA4CecImiLzb7HUeal8LuZN51BcVItuv9v0SrQZQVNCs-epSFa1Q_n-_X87D7qOy76FePaAGQ9aVxOfvVBuN9ZRDN1osQxOYbKKGm7A1XPyp021y53KRN0j-IoApIaPYrVmBxLwZSI3CRwmuvRlNkis9WybVpGLt3UChNhbnFvXz_OXjnJiFOkTcVFEyZSWk4dHXehxk2QLuv0RhxG4hz42syxhi4z2M4AClU3uoCpvOpAGxfOq5ojvnzHfKECkRyt9jDp1-ADebyLxLt9htHJxxWGrNr9ujIL4K9TH_oh0uJvl3AD5mrASKyaAsRukuu8UEzEmriG2zUvugZOw-4bip9QEWGa6wP1gAo4gz-M2cYlzXjPelS70UlmrLasemoco3s1ck3VvcVcxLZD5YX_w1VO-ePKnUi4qLoOMEt4JCpC1jaU286feABdQduudVByo4dk5Sn4hgbs6NUqqTvHcihgjssbfUAWZxLoXmdT_tXyD9Saxu_iEQkk7xsL3ObAIJkOXSPH-lsFjJzLzVNNV83_IBtPOjUbfdJr0MB83duT7NWG2fKRPJ1XdhpwFWaR_rNiPo8WxlR_yqphJfAu_nQUwiJLapdz9N4ig2xHeT-v1kXww0ngeoi7Gb8Tn-PQzW6wa9ynMT2BLt0tZiYb0-h3dn4vuDTjnWErBjr5ai0_zn6YKdgkiIcXCaAyiDOMvbcUEPXYjdp-_pe1stvf697_7nB4tNgAgGxiH4KRYPiafzAKfuvnEVXjKRcjOy_XJhg0beIxeqGb8F5zoMR6FArd-B4iFbpjrgGqVPjqqLlzySOi2NhIq8kH42L11id7uB0kzx7TBkRJCKbefAY1l92mO2vd-K-I2gJ6xFtjBpmqNg1QTLJz1jJyMrOBGuR29iK0wj_MATXtChcPboKU68SiGCqxIVyo3twmmnqqirV-0GWZBYF3eAkTbrhOKfkHDTQGeXWJGQab8BxuE4zXjU5phV2NPLJvR7xBt0G5Kx2Hwewd6sM5vFki6iZYPZjEWl-yEb9gvZ6D-v_rRzshN2Av0YZiBhW-9QxAat32C_QoLUZJFpYoE50X_rHuzkxJlrXOwLbYV3mehBfLWxBfABDEoz4bop8k_Hv0EP1BEggX-J9-Zj5DCAMG4x48nPShSL9nHiv9MVH2TNFogbjt7LqeHlRR2_biIKNTZLXefOAzacYHVY63eBafxR5wGG0him-eSzDLYagbpr9I1DrSOy8G2U_-VJimqnINoZpsr7PnkSz7ffVl6EntdrDj3IoTJR8h7DVsK5xqVWvsUDie_XkwresdA1dkVd3h2-mAgf2Vpb-moSUz2krgsP9425d_umgTssMrs8Dsq5RUrfvx9W2TbfC6YmAak5pqZLI2S4mlOuPxkepZpiQf1sRkIRYWrAyl52uL4OzrzGNfc6qYOgTCnFE4Qx-8VuW_PsWhSELJoOuMvn2dFvsaHsdOWaPdQfG_-RD_WZvTsjDihdHNdJn9r5olOxm40ge1_RwWjQUb9vaYWS3r5tcrKe3KppvcCxfuwXehPsCgI-Ckn1a0T2wiRiH1FRO17dDC4Tb7lpM6JAYvcEmjNcmGpQgsuKh93OveZb_QvpGTe0TnLs93VSaNWJPwc29rNkafsoFmMDcoQqp0PmHV3sUr6HwL7g_gARljpSNbc5iXZYM1KBC7sRtf4mxyvPBE1KgpRWPv1NQLNrli6KSJsZSh2SdHSFpl1jMesBaIZcuDkF3mtvprJyNli8OKzQddEh3eG76KXucLc2xQtcUDHSnkhRbWevayqCsSSdzpivPdAAQElDGKJb0uIuEAVBXDowsu5JWCk48DUjh0gTFOflviwcAwz4jPrLD-_3-rSPrl26yIJ3Gsn7Nsbsb3A24z04jOORKdnAApT8koE9htjTvE8kQDBaNa_50J3nD4PvX8Nj_RmAxex79QNE_wERzNYL3sPLdEPKU8WQPJEKW7Z7lAtmVJoTCg8qKr93Yb7pA8DpJ0QZ1iGqcF_WJRSjfxK2KQr-E_JwdNP-lX14dTX4bxljxJjKVr-fVXnyvnN8v7BobtzVttFZojJHdxHFyuaWkHqDh04bGqx21EqxtuXKge-nmvc3qOTb_zIE1a6r2dTwA5kYuU2Jq1TEVQdoGAcwSA5zJqV33EhvQt2YpgT8gSNnKhqoA8FQSFvmtmm9HhXUsE4F1K8zcvhkm8Fg27qtAaPNMd53kGZi0emoEPewA3NhvygLhmSX4m359j6njfijPqPi9ZFw3rOSlG8faklUt-cVLuoAP2WpOJE1nXvH09V5HbS7uYgSPZXSPRrjdoVm8Z20R0ZYz3_wIrymqU_UOHboz1LvFHNQKuCvTW2pYaaauKI--U-NWe1HFb8eDZDj8qtPn0cmGWpgbCGO8l8HmytJgZ408Rz9sh6LoBlW8AjPGDAc99e24VgL-65D_7011S2qPIun-NDSiiXXQqZg-7e3H3Fo1RkSFU4D_BDWnzyPlD9EduGejbnT-umUuyyvfYMUarsfe4lVne1QKnbnC6DOjAuoXJRM7IZUxO9j3dz-TPPQs4o9uenZSNlXA-eFrueqs92HO4xtjklBW5VHThCSgs_vqA6uxvJBqqfDqr8nYBLdVPGz4qwmLy7lf5J4dbUivgZPYshayiRBq5AAddnCzzlUQFcfwthmTS4M2fAX0TYPuzcPjmFf8uUNsA4eZO9qQqLGIbs6mgEH3PQ9jV9UQJsapjxaMcr_4YATVtMl59X734Rv86iCbTN2QFrTqhOCgIjaQE_3YWLtnEHglRUHwfNFC19L2G1ueaOM1_9RCnSVhCAFauwJvFGeybhrazpU-uK8A8kVPbPX4fb8tvZU5l3b3kuOVVAOABGrRXJqGxomyHQwWQN47BBtgrOkyHooCDCx4t3De4iNoWqu8BYX_S9BZSBaCBVtRDzI_7fA-s29NTnWsQ6qLo_EtDxwn1hLGtS-lyaZGSLN6HJE3UmBFbB9UERSTGjQNhVvRdoSavvgsoZls3MeYzo4DXlrj08du2TnX8a3TCFnEGMcD8PmXKbhRL0jz9vLPEIQmKj13cr2agIrOarKu8mpfePDmxP-fPvCHkZRXorqtBByJERbMXYSPEP6jOLNQIIxfJ7fZeOCEIjG-WIOLsiHcmcIBaoFD3Pluy42pTfPHzS0vWZMElyfQeEkVxrE5txDwLgWMbe4sa2MXnwNJjkUVT0L_o556JUDAjXyDqyQTnAi6og4dUGDyrRu27WioLYYxCGjgivpXRJCcZcdzwR1ZMKe8ijJMOyCE3I4mQMjbkNRAi8E9xBHk4iz3xrsnt-GWDoPt6JT5suV50hOTOunnzvXurvQgByncJPvrHb6y-6zWE8E8Se4bayWWf40kMI2lYC8oPAnAwKC9Zk0er2ZOLrUS5l8ogWQOS91hS0ITKVV7ErPM0uI7jwl-Vu9jBYcATZWn9SEb2WeuCce5t9vfopTd1ZwQ1mAuASPB2to4EIFWgpW5TzPLRkLDF_xgw3HUfUO8ABnUfzPR7Sc0T1M9th9VhZKn7bLpAElVeY55OqWD-_3gCHqij3kt77QTRkxWvFBOzVXMOmIzfiZzyhOJTbA2QdHj2KgLLAX_eQOgRcEiw9IQYhiJDWZTjztD3tiU75z5lDZ0HlcXPpdpXmVQ-s99Q-f60kYPgikwc3u8Jl9acUIXImHYy8w2exPGGGE94ReznE0RMCA-uhGYpeHRbWKHnkrqYQKNJtOc-SKa3U2sdBwc8znBTQaWhab9C1KMlg8ZCLaXAq3Ir0oxHzTIk0f1n_tz4uogynfkoRTPu31q_14hLwnM_zowqpKEOQpNXtbEnAwgSQ2GdxhJK0IqFA72H17JHdvyeAmfNnfDY6SZVpi1AOc5S1QtvthIUSwEIG7wJQMmNF_25dlCDt2ryFV4j0eXAv-DsgU500yTpINBVMOjQV1WqwC8BTk8oHwAgz-wM6jLmOskkafzuCrIZBy2RgEr_xuZN2y813ukxTKg61ONRYkeLo8Cs5BelNA0BqeUhH1yYsliGN4_D96NzNpR3iW-hlDILWCwOeHW1k8VxhwskKpIWJOEJnDsDWGhfG7xVwpnO83fRncEIHV3WvX3MqhSAv2OrMI20kJXxIdzy026HprJ7W0hQFU9c9Z9ZQ83QPbSVboVmYdnkMDXt6icvy6Y6b-27LWbJkq09tMvtnj9krINEm54oBriZoeF63-Tl53mTMxlJwNF0xHglvcFeI7l9F1lcQpxwuWYvHa_rR7xDKppmC6Z3PuB23VkuaI45-2cMg4uKqxnU3kMdUY26QoKP3dGDkK9HQw9JHZqzxBJastJdtskSNP91JwpTUK_pXVD5NwzGbITdbjkkTjNzU6Jy4a1NlkeumL9BHn9jpx4azHjc506VxHDEnUEDgSftqFTtwkRmrVgzMAfLIO89CsNvCh5yEKBVICLaHLw5ZOeakvhtRFHOuG5Shd7px3FhC-EaDhBbWXuD2e16Up_5vloMHcHkgy5RYj9k_vAr1GNEfHWVWWtrbtVKuxbjwgm9l0uhUHpm3bDwdqzQJzXzpmGT-neV76lO2XZllcZyjfv1nPEfTI__riw4ZMGqBesSeCL0md6aSv8bzcDo8-6QQG7XsjitJawmxDFfrdLOqpnLF_3elLbLX1H0Ru4Z_bxICzV2ri399Yxjw31nQEFfyAKXvAZd5KgUkDZobJWZ4t8UOLXjX5W5l8_cQChvQcHHk7COchAFrERS2vuZOxPXMEwy5jtsI6cimBxTuAXsjjJRe_GE6a5YAqx8FlMYnCbEtydYRdPfHpWu4EXelsU8nz7Kl6-9OPo9LWGSfi8lSCpGonnV9QngMVqlpz6eb-TgtQzjRUP4sv8WQPrzhi6jKRYf8xDCr_Tm0zm1DA9UP07AmYUrjuUd-3M39IiP7ffK4EJhZCm-YHBJpqTEEHLt-89SYH7O4oCM-oGoSfeKbDFNvwJUBL0JRAE_UPb5NMjFvkQ7eELDNjQR-mTk8JWQ7rvFEwnfveANfcxBgQ37cwWtmZLbnpR1u292qdMpLXUlUPLEFZKy9dFxnwepaRxMj74mdJSESm86q4vO_f2e2HChN4imVeXKzcK9oEyNunBMcLXwUW6CveJy6xUFk56f_N2AlQ2Q7weIWFDk2QfdAhDpk9hPPmJhEkUdEpdSairH9Iw_XYszI5ksiT8oEM5IRydLWDggAU0Um1a_Z7GkOu4bD4uzJRfeKXjfkqwhIF1MuOYzjkr7vbJDgPY2hJAXdABChFBZUcrcsinf9lhpPKlDeLkimlaE4g9RRjRGaxuDrCX6dNVSJ-q80zAcML2Uvp1ZCXuSQvaJSJIWN5Y0cwWZTj0r_mV3AJw0WVYYItx7pU8rI4JGRD7TSu7g9TZJYgCwVVARUACJkj7T4ujywl1FUoFUM3uvTRIcLHQrPL8YSfOpOwTgoEe0KWopR0obdvGi8DtjZpr-6z5kD9rMv1gKO7LPAqrtpJ78nlyPgBbEp3UNmrEBPW3PKNSW4qRFnTO9kHykX86YUiY255tSQKffUDieev6VB1QAsBGa6wxX9JmdihLw9czKzDnVDJcLS2TllT47xOphfHEnVQvEsng3Lno0v_QxnYdLx4OQ1iEuVLavp47yeoV-IObm9dPYqPEUAk3gjMw21p-CzzPp1ad-uerhPk7inagioSqOBY8rRkn165WhSRwkhi8YS1P8vKxBfy3RNAjYGN3auxJvre6BnajrqQ0WjNnA1W5_Bv9vt7hlqd1gR1kiVE6yWD-C0kHSWtfpaSGjLyPHNsESp5zi-KikEUb99NOVV-Ln4bI9WBpoHIUxZEFmrPAG1ge4BUMHGzTk33E2FRui3FSoLku1S8jN3GxvENVl41JGjNBmEoFNX0dtFV4JIpd4R2e1sUvN4RqtTu0zEwzkLqsrrE2ZJT1bPt5OvtUgjNNfjz7g9XHSdaQlzlUN67BKWTrhafDMV8AN0FnvadlA8HQjIyJMDrygtZXE6WXiPI-J9nnNIkb0vELlndJq8ZWYYwN6E50dwFCaFGBObeled9VKkKYF4fXmTFxjngW0OJTNKBCzH3A0-ZM1yn0kahn5UqCyX5B4VXHMjeobBZbc9dx6oIcQn7tC-ilojilv-l5Zvy3aKp5_L4dhH0YqsE89SlLhdSd1DK3MPrnzE1olG2hIF5ez8DPWnaJBXvcRnmA-pqVGeIrtY7UVIspwpEpyEuFT6RhI4S7514ylCZc2kWazIpL6Ri08jezcEb8bAtm0oa37KTJWTZxmQlHNulpZ7EFmRDG-tQT2zQ62CQv_7gzx7dCoGATyNF2EGUX1bxjC9ZJZg0bVypBQlSKTqSyXtxdmlx8Gze8m763bvREGNQQnbNkyqI0LZLkzbSgMdBuP19wGuKEP47frludzODf1RSgxeTHQUCScthX8Nv3a2Ldi-W_h2jOPGdElNUEbXSbACCzyMqGsk7nSpXlj02cmLQ79ZvVTSYPIzdZKuELDCDxGJkLww5ijo_tJOVH6krOKgvm8Q8RD_A8XhRggqJBoaAtBzsvqfFrtUL9MrW0bZRe3O_8j2BjOKVODlb8PNd_LQVMox3G3gumbse7McOxLPsGeQbD7JNhSfzCq2Y77x7Ov3cg_scTHbRfXQhMiZxTjZa1PKuHRYVf5BBx7-rLTEhn85zjiiBZ7NFSrJYjynOuOBMQhZD3QAYDGsd74Cpb0XNxAQgqLnk8-BryjwpgLpUocrVA1E1C6evVEc7GQBDdtPdhDLIoeiAyQ58zy8KIYFs765NsgDXIseZJsVmXWBP4dB-aSUaaXjo-LH8y_wKrvgRzlRz-oYgYvq42A13_GS4AW-dUyam4fWctdaXCy7ToykAuTaPRajsQfNoVWPFgZdECGn7c2zdwCT6Jz7aVzG1yEmEuXEO01hP5dj7q7AsHbyitz13t3D46linkWHuQKlHA7rNMuk8O_6xFvBjKTP28ua4IAoGZNw9DNDsIND5o6ezlEMqABKl1oXJ7PFDMexbrwUfRup5JltB8UgYDSxR1rPtOUBiynz8WVgxKOz6ExDcr_5Nr4KPuEsxd7bw_XNGTO5h7oHP7--LLFEPa4K_y11ytaLVeFc92kEPdibJoKeMkFHHQ6cudllFu7GN3RDj0Y2vt_yYQVJpT45f4VgU30N50JgdMUfqnNJIM4M2OiyrTMqQM-Qq84IazN-9q3ZSIeGq7cZraxT3xoghCFxetTkZImBWAQkbkH35amUH6dWIgzLe7z_E0LHnXyVa-37ff6YT-RzqPOc7PYOYO1zUMKyCSwoHHw3jr6RNxbTIwxXcIGtQqWdGyBrlKbwYnZZm7Snh3bH5aKT4dEfxAfcLaGRYuTEW3pil0OZFMvL2vjO2hLWiE8xu0ct-5yMeMRNyUIaKeHaJjqHVDeQCEoKD7S6AUmyMce9tHp3tc6GxuyfDdm73gzKJp-JE8yTc9-8seoTut7cneBVmHXLfpn1UZvOV-MRFGmhp9Lj6C3gHygt7uoGoQeOJ7EXZ4a3mp62CiMFktTDwcRV542faaAk0GgMTH-qY_KpsyEfL3lu3Og5L4RZWUeqwE6wUan0InHU-IErdUZd13ZOGSecIS7sOZ3txBN-K1AoEkQ_pxHVCSyTmQ-KSJiGNxTxZUKK2ag64uoE2n602P9CruMTPBMBi358RhuyQH6WS5csBGNxX8o1nJ4IFu0OBH6bWDEgnjsieGrYQiF_y8nLfE5En0fZU0lh9hyDML6YM9tKvxpzjfRoIUDZxuLa3wDS7zav8L4P-yG83Uhfhq9ZxXUvbNubjjMETSIFffIaq4fqrWxPKQsl0sIZjw3t-fCxCck9FlV6GCfOCeO9AMJudAhL7bU8alE782sRsEj7900F1iycstkjyIgjR07ul86N4g_IG2e-J61cYVRMhiu6D6OTBgbWmnZ-zl40LRYf159TJDXZp9j4dBeMM2mFOj12DwpIidQbnq-L8qmBL7oMyflnA6N8kESGhopWD6E6YXdL_Q6R--vGVCMSKCg0wAIgoo0nQCrN2k0WAvoOVrSTCSaFgAOpaYM0NvYEuOdKLUU61KqnkLMkNwdLRLpSOR4FAA34KexHlf5DLura3XOQh2lo1RKz97Z5_Y0tNc58uz60NaCiWMEX7w4ZKWbzQow9Eg1ztCZCEb4I06ylDjB-gsIFnhblRrXY2PBycOJQ2DFJFmNF_GNwI_lcjHDMfSoUKNtKElPlH-GO7EYjBih3P42RWY40csltLtvhwnYQnN70HFUY6E_J4HW1YwSlvHoE8kWIDQaDMWFzqQZIG3BHRMZltI1O3nUwfhkwUn4wuMPr5RYBDlXjWCDv1yod6FF_OpGQ8UT4ceK_qngJ-qxK6UYzdSqhAddYnZrk8WdWqUdDYYDKBV-hI8Z7OIJvF2L_anM7l0vqIfqWg4i31avwnQ0-cPepxyNO2IO_0iOUZ54Y7PW3BLcYpH9ANlpwrqgMkI3VGH0CBHO4ETGNyx6wniPc43spvJyup6bxzsubVy39dne3ddxx_LPSVitUyO4NRJfu8YTkmsjttvuFzBZnPYUBaZjzvwLN_bba7bHhJpRFb69wlceneQMV7nAjr2gQeJOhQ6JH40kQHe7UlF5AFEYG-H329meZAC47A7P0ixojFRtMlQtlrrjL48LjX8N2R6IE3v-Ssi2qq26GpbZFe-iHhBUy48XOKuAmOqcaT358oJ-o576boqHf0RBhZYdbjc_FOXg6urXux9rWS-sV2wq1VoGJvv_HUezhVx3wWZ35hyda7eKPw2ozeR0FAvGpgb2cjcDBl8Q7PVHpKaJb9ZGenNnQOG6B7KUBEV_YRnpU2T9HoNHAQXoylr5TwJ4gpirIzbWIpn3-thbxzFS99hq06fhcUgiHTDvliB2x4B5cgqnR0KC7x-VtmZfEcTQ6lpbdDUDor8XPPuxO86SEOwx6VrSWO1GRNJ_EofxCro2KTrQdytqsnPgIzhIN7KDi7qdH8BWC7x-dTZRcLVFLtQviGDCtcl0uYuvaMu1wAjhpu3i2emxit4Gce_Cf_rJObPbI-WsVEFUNv_3zRHXlmRzFVIIquoytzWLCjo9CQrL3_JXLToWKHNrRxh0hmZjl3Jek1mbEtOHKYIOqOROXtrrWHRc_hbP2riKlKY2eoth3WyoYVUAcw9vtdtGmCuebF-aQSPKjkXcSDDkxL024Or6zmBUkmjwp4qrU8pZeuJV6DbZNYX_YfSEWQuDJvm2C8U1PYAbCaDnX_lifut5qSBTJXB-d36nt5dy0pnfN8Vnf_Y5FAznik0SYmO3g0thXoaoeXnIsarf4QEE5UaJEqzacabh-0LDcNOkMS-nu9STEXSMaZJJ-mNlOQ6CgdBemgDOl_O5YFaU3zEnpIL1ATJ6K_yDpuz-XHFiaajyqflP5cc4Fvat-_jUix2hYlrg3kPAxSP6VvX3nyzES1OyriNNQdekRjGaVWN5UkyInAYT7hHgbcLmiLCRRDaOricS6RVD9IInHp2m3LpclRKLr5mdqia6jq1x-3PXM8ibnhml6wFv2ppEO_Rtvlhj73CRxxlQuMNDZnEMRFHzQtTUprYKzPc2Ai--80ZAPpcUkKkLI267JGqxCRE9zdZ9-DKd3LQ3hcscDdmE4iptMSwU9rEHRujqbgbuGtfCeAEvDevm_JADkXrLER8JY6nGFmSjdr4ZXDZMwjU2GwaSZ61dWYD4UPB5uEMnjLXBoZnsPE_y4UdcxcWT1cDw1-XPsxC4OaqRLRDMUd01zcVEm14ydssQYwxC8T4Sm-Iq-0qELrRU_euk-Yzm61-8NetTe5rBJLDVSq1gITw_rq2ZNlDXCubAtzNgwgi6UdfE_OJ9wvdhU3zUuX81Ji2KmEVMi86CDBq4KpZvySDSTzAFS805TUcgcaxcs8P9se0VbzV3gM4lt3m8mBx4grQse_bmYb8_IENybk_d4CUr1UuFfLpmHBPiVXDwglvs1CPNBeSXaCR8ogxU5bXZ2Qw5YU9tY8HutxNVamkj6sceHO3bB-8Mvtw2T9-qWSiCYZPrKnusmxBmH4cTwd7ZUOsJye1BZE2PDFgh1rQmzAcoN0sdvq90-1ZxKEvnrx1U-eExFvdEM88N2B7j4Lkuzls64WSXw5SYGDiBqDAqT0wY6gnRlNJ1HlDCskUbQIIUGzVlDwFOpJ645-OF-Ou3AHmsBzLoGzQI6yR38EuUo5DI39PiI0V2Ai9iMOkLiQ7sYM7OvB8tCyzeOqxWroV55rUD6456VP2crIOakX0J4jVC4x4vKKQehN2zdPNCWroTPbTToM1xMUANZvCZwOI6Gt-7PfnMz5hTfGT04FdWj5f9jIyoHbRKCWAsF0tJ6SzNSzp6BH0Jt6Dl7UMZtj14vMWAXIFIKy7nZxgLTUgIGrEuFB6kamN5vcWSz9LzJ6CzZBB0wVhBZhD84GFZZnkpzCW0QEALfpDdVCScgwEYZoWEvhzCk49y85hxmr76_SimeKqC_j6OwaXDUfKQNjfZxzR4d6UomefkdwLuBqb28Uf4yNmwm0b1cxG5UwW2WEaBhSCbdGltT3WnIciwbOX-7VnYjF9PD1hs91sENsWc7z484-LqtdHQi_dC18XaLY6bZYRZkMVcsDAKF30QhnbBgEnbeNJsMF1iSFSTXB64cPktyS74hpqNQiPtPGizxzO379OBq9d_9hGzjAyqWtfaQX1rbGjkLOZA8R8DiEMw3ryJQ4yY_WS4_cYqZIyGUvunCSOVQs64PMeOWjLpK0IEcyhFKNGp3adajwHKZ2NsP8bP0b_Cc4xZktgkjwAWtysbXnSbGf1HdeNfQo2XSfK84E5LFlTFcAOKdxXSlV_L3_TxQ6MtWXqGkZO2p4JoTcAF0ew9y8mIcha2jP0TLjbNSqCKxAV3tah-_BdiugiIJSi7KNGJfSgscE-J_lXq5JrWFDt92XB8FRIiCgyP616r2VrwsaAXVs-B1uMnrkY_ndRknvhr5K0XB6dmpsdicQtT4DrKVYygHN0qerTZcw6WsA_GMBUbhDUhsfE1cFde3e1K_HyzPqYoqvcUe9idp66h-cNCE-B4SAtiL3oej8QTP6430iQvzKkr190sb5QQ_vOwsaRbZRVhxGXrxuTMyMBRpqPHfeV9laaWX1kXxU0j1Bx2YaX4HiNGza6y3fGJpG_lgdUS31WW6fd3GmsXyXy0ov2R8k22oX8TISlLF1kgJg78uXVNXnfTxk1lYlPz5mMGYmbrIBVKNCrygbw2epBkqB3Lt6RR3SmcSauq0lr8zD4yW7HA0dZ8t4zbwY2fsXEcYFPzSLWyW6zDvlwxhW65T2l24zzjA4xnD0s_28yLJx8x4fDTQ8jjOz4zMc0EFsEmIuetq88VBK3QJN8AQEtDFbrfUgse3PQ16-tFQW-3x0WJlkrrKcB6ue7j0XCd_UwqTtBgXp0H4Eoeh_cuB2DN5JQKgJqZ5vwq2fuHmqDo3l7_1ae0FP9IiaDTyiFnQlRbQIkjrFvgLn4iaDDn1hILFtyqW1SaTeeqIn6N3KqjORMyXU3DxVOhMVoRCbsMk68ubQYw5UpWVNlbMOQSAHq9g-bLN6RoOGUhIvD2reyGOSLX7jvY4oazTrnD6Se62UKNLzv0TKt7gw5gwVh3UTyhxjv5_SsLJcdnOKWsS7vLar8kA8QvN7H-I1G-Jma0ogeaebgVoklxVfdNCKEjGZX_FqL3Ytd3SU6uWyb7zwcEGGVsFSxarHP13u-TxUtWZK8fisZ93qXz3QK0_yhZH60g_AtbRQ9ZFR4UUSRQ5tVLuMFAuK3cKHq6B71RgVN7Fp60gPXE1Il2fwYB2GRNVP9SVQM2uv4kL1Lzkps72CtP3Lt2rGYuMMOFkGpextqE0Nq9MA09C3DigEW0T4PlDhIVJcjrFPhkTJ4AVKM2eyi6-S7eVd_2mVqtbHwJDluNqH-7BR19LcH0-_eMqfDRYu1Zj6GCtlqQm0XT3ooPKsXnUv9QpVarIQHShB0818aX3kgNBtIKdsCBC4uU8WS7QBxVaScb0qUl3ThUS_Q4up1xMcBAHeQodBvnDEVXStVbQrvOAxynpek-hZ1tObQtOqJ_omo-k2qkUSaZ8B9_76awkUjtthC73kuXJNoWy7na1ralv7dtsKEvIvq-OqcWF1ap9xKrkyIM-NQylsIBJnhkBiEL2vpipWkKmN32KMyBJ1BrY87Rcs9JIXXLBicuI647FKDjxF-oj2LWZY5nJp3OvcsJXYnJNwLNfZ6oyJv7IoGp9ubj3PlUUxiD2M_Mzm9beYqHtbZE2bUv68H8xbtrLDmE4JNDg6t18s8BuwL3NNic49qeMGDs5c6mAQ_8MvmCsThry0qpmVJp3BuDb3QLcGUWPoEOU9idiVpKk8DNZEeBVKYEjZJ86iffges2GoAkIa_vHIHvAC0TyK6kmivy3oYRXYtv4rxyZr9oxptF6Vul9GUCtkERb4BbFDxMVf4NyCPTC6fsAadTE042zJjbz8umSjXE8Mnfbr7h-cLYM2aPr8__NtHlLO_uva9moGFbbysO2GOJ2ZSZhmkY6oMqkTghnrqeMJzFnpMGW8o1Jbbe9IIOeefegStu00QTfbo-roAiXvVjCvNUN6hOaOSZd3yD5cBq-Ko8v7-V51yPXaMTI4p0Vs-UUW3OkGe-Gz0Guvkr-78pmddeIapr7lYRcxRY7qM8ExQkWInDcq_2zbpYPFA4w1Ookn-XP8ZD3YEMBShGtgDcvjFwSapDgS2u0GuWHBNZzBBcfW0XkuJwg9frEQjLd2dNJUTUYi3DFK2zwUGO1wB1XfFbIkfwPXC05ZGca8Vv91TFOX-atOVG2fFSumvS5os-dk1Wpq8H6qg6S9gXwehzAMLPD4H-J-rYnAiwPSqnakf8s3yAhf-YtsjTiYK8YIqlPYSQjkb6VNd0YTdtzg0PYnHn5hiPcaxMcQBGpGnOTp-WEzNVNgfMoE7OLmRIyZkZHs62XDQwA1tbNalo_Lq-c3-OT7-VfAtNrmtuQxSOzGpyQFXT6iOxYnYQwu0bRRZQKhMLfol9vW9K_LOyJu0iQI1Fgh7OIGnNS55b0vH9nhE1NxU48L_0SadrlDcsktj_loCwu_QKlAzMeNg3EZ8fvfKiRVlQjhwEG_SOx_lrwX_AXFCdH9z2lVRLi4q-IAe--kfUXxVFfGV6Gbqxpt1JweXovrQ0AgHIF9sEAWTglWgFimxPR2a7wq54zNtAW9gjH8sn4-4NUrTCv6Bu92wA-Xxj_UshGMtzJJZj1Bxj_27gh71J_N9bKJ15YOVGJYAknE4h_4e0upTbpu8ZCg-RquwQgN-0Q41AsjRzM4Yc1UuFSSSPWgMqQZh_cD2Ty-3RX2IdXi2cuBITYjzwvHyZd7AyY-txI1JeZZwoNuhb512KtpwFmggqEQogcAEedUvzPaa4H_mk59nqtyfnTEGF3nkrfNBBSWaD1UdTDFEnMHg-wr7AAvHP33TGGs4nyBag9IlQHS7zT_w-tLJsTsqwK1N0TLxY6ulURC3_JfqYhH1exjOdu4tucl4F_MxlOa6UQsKF7TNYTHgpisUmUkkUDIj-hpBnVZb03U29yEDFlgRZ9p_s_B5hVLCS6Va2yCU_PmumD0pO2a3N91TAhNDeVErGygXh4uZmtA-1sn4_hlEQ2fbUHvkzG3KRaliBCLpqjhVQEP9h9cCehaGAEz9P4ASXUwjLbA_DNA-tuPUgxzrS85HVePJ5Eyjp2JY7I_6uo-wdYl81lSBCjnMTKjsXDL7zqlq220aW2fzSv0lvDFENbYQL-bzxa_dbclUqhvZGRSR8Pbj_YTUljHxIHmss5MdIEFhh2W7OPEH1VaJwDQ94s_WlRzIP92cIx1fW4nfdH-7KOZqvsRJw9cRa0Hcs3Fvq_MOGcV57F4LmWPEbSZzES8wJI49XQ_EBa43IrXeHLTU1yCROS2-DAgOcPF4vgPO1KWN7e3tQjYpLjuJzYIX8Ih_K3dbuqSB-7w-9SuWJn0i8NI1PZZgzY6ADkh6U2WYQgjkAZ57PQxosfdWI0kKCrPnCUgVb-A0rsa9uJbbEW3ACBAwhtnlMnA1zdyPDczi5yEdvHI_ohPM_EAZRIhniTy3hi3J3y1GD9L2lCnRnhjBicIkGyX8k7pP62wZXZWWr9AjQNVZ0LhTus0TzWL-p_rHHg1DphF0vQ16qhlQIDRANpJ7VLxHH43hix_p3tlDxmh8VnrQKfs4LKv6qWcLWYs_o1deMK9kR_vIwTPaySxtHhdQ2Od6Gdycik-izYulmnAj1AzSUwwmIn2sg8dOyfkMVNrpyWagksaOGpNMfvXsSyny9ri76A7Nd_G278ceTh4aX4ZgWGWjQeeS2nTD9uf6J3pCot6Jsi8DO5aJDoc-QpUUUOuepSkU9BZkmYMeIaFT-EvZesfOQ_B8TvG_XkpuoZFLNvPzscTALLo8LXK_BMDxD4qkAGJJateksfcZZAvTcowJPlNNrDhsP58qy3rvAonYzGg8f9hC71h21uNsfo_pyAfOb4swLj2xEsN8togQ8ilX4APqV-8ediL7UpIaJ3_cG4TZZtaQH4-P7KO3Iod0h1HE--inyhXOeo2TiB2up2GC64oPcFjI_BEtjJ7QumyW7N9juEOdhhixR6LsI_a-rmKYBFx-soSD4PpyFUy5DTUHd2Bk8Y44b3hKqQKkGpk-MOKsPFK1Zs3ZNmqsDeBJZMnEvuwQHq1vYxWmT76GM3_Ols1dVMgE0Fn2E-T3SSUHSJMSyjxp53PcAiWOlQyX_JmIA34mtHlS-ccS9-UJR6iTp7QoPCk66kaWeByi1s5Aju6_khHCYbTeiTdVg1c0v6fJZf--SbqMqvxwEQF5M8jRO0Bw99qqAW3zyNBGbWMErsZcuAVmV7yIReLnhw7GSOBaKYy7wIBH97cga--PWEbet1bC02OxTcUgENRQb4z9VuCpwMFz0x-YdfYxYv_-vAfXda-Og6pL87yz-XrEUo_-N3kM5Tqi1hKLvRBBN79GfiHs0RGsRYlWyFyRQCxa2VvsD4M07r2z3wxJLPIVtsvqzqUm6jvYG0F97VaodEhfhq_H_LCEfBvx325oKcfxnugGavvpRY4hShr3QSxKZxsp9Ptp-3To-VYWc7hrrl-91J-eon9zLZkkgQJAcdAjnP8f3wQZqM-UO8mlUEm16DqI5QDMcfzJiLL6a9mMr9OUE9FCDikV9cm9HkpBnF6uI4F-pTfOAjBFvCH1AnO_8NHg-mBf5NTp5LRwg1l8ur2VmfCjlpbabuZeiQtKLoICU25dennlRVGpkUOGRn1xZdrxoRWrB1X8XF43ktsdHgZxgmLWDvq60LI44BKPYoDL-JINH0jqMeSZ1PMDNDYXcrlOE8wOz5lHMiGqBnQd4hRhkASwqPW5mF371VXJuAcOlnECfCZz6WoSCawgdgxLlHfLCI7L8u2PSTMsIiu4mobZCC8RfEQ3s9kO9EGlBQ8H78aSP6zu_6rNRraD__2cH3eYZDExfgZoZDT4FqrHKkvMwr6NLd9iuHilHBE_2Ao_dNwBv3Ajw1DwkwXaZl3sGZmcNTr1ks7ensYSw6BeM3-XQbqfwCd20NVJL2KVH-CrwSDrT2TFTtasebA3ccMai31OPT_rOv16EcmFAb7nf3tM6VegKHJUMdMB3IdlHCbJ1pznv15_xwQ-Qrn6zK1fFdImzTq2RhATamFYZzEbUxs7W4HGeLN4uNa6wTTTLpWFPm_Nr5sYPdi_pbov1DGid_c7lyJAWn9DiuBS0MQvCNN8KnW3pNWhEvkcjkYwdhOpgIMESwRHx3078IzDR2F9uSbHGGaeaZIzIOXbLxVbH9oo4fOtYzaCfAW1wSn6SkRTIuk3BOtLsHqbSQC84hwgX8kDodV2ElpxTWZ0XfvEsohaJuQ6FUf7sicsxmhsUelL_rFKXq2svgkPEZCVYtEHgya4UJ_CcHpCAdFQfit-iWoKFUiVnmRWrKLBRDlor3CqXa86kYbeOEENvzSNz_QEZ9n2oi68TZFPSfpcZ_dz5FgOolq0QN8L-dsTZxcMjKhbpTDP3jTODiYt-qirVzDWCJPK6BauAS4f-Ptow61OnvMHjmr7uRVmNRQ0HRuATVcE4Sv52PVk8cA9iR9vdmeIP2-d4ZJbaDlkd3UaMqfSMSkouVM_tYOy9tRSdq0Ufwd9_VNqaNz9fJhz_p9s7LOnGzZUN44kK81Qdk_6mrnWqTMuOTgiHeqdpJra8Z0IgfUFooJ6C5J56MTLfcya7m7oFSoUr3eOBiXRWrdQv9_UDRnrZEfpTvnU3QniOD84mepjiDVLWN4pondnP_BKjnoEfG3tpPR2IGMkNUF67F8magBq8H5TQp48JCm5tHrUZXc6uJHBET-6e7iMtMFHBnxZ39JfmrVEvAERYdKt6AI7cAlc2tSIXypC4Gkt6Efi0Ucw5h1rNaE4ANGsvdNTW776Jzc4uMquedYOKqKnBE37t4zgALEVVJP1Ap_FO_BSHJa2bUJmurUUmdaDfCRk60stZ3WJhTl-y0PfZc-aJ6sWs1mF1uRennmFWlKArPSfnLs-Nv1bg0yXMIGBndSH_9BdLM0Srfmj_7Lr11aDdLL5FmRKzIPMv-zO9WB3ePA33_bsg6WQ0YHPqiwZclerAeW1ZNw3k7fwtKapXFVvpulCRZyjchRdsbYCoqsWMEhjjjot8D4sz4Kae47rGlOgj-LhGbDD5vrVPgBtSqic1c6nyC0dcgZWA166px5sEVainmZF47KnbLuabrmPcKpNYxs6Jzgkh6KcfTq8fBeHZKk_4W5pAPHxYEk9sK3HgbKsQySjMPUgNEDatpzx7IxQaJ8dzmdjiQz_b_7X9asAQOIU47Gq-MTZ36dlafUbAqn1WLJ_M7h0TgWFaUS-3sbDhCiHut53SX7g_esrFcGVivBqrtdSCMklPLsE0ta6zIV3n1743WHMmWBaB07wwMEbjbtUHG4ccWGKRuFcRb-66zpO69AfqBp1V3O-woGCJW5YXUGHOCf0sO8ErPa_fGUqzBBLxAY3yOtZALu3MuCMm_eNgGxRTTn8VhSxoWD8HNwh_AaOah7fP5YTsUamZ8sPKNmMvJuj7PJ0Ehtfxt46rFQOWY9wEl0TYmsmqYNoMu2sRuzPCfyBmmWmotz3pyfoHdA4YSzwgu6ierR0IaIw4einxN5iKxKsjU_4V1zHkHN1jtjyshZzFGBVnKhR-UbWx2eRJRMDqsDufN_lVjt-knSjbr1DP1DsAXTqu1ckLmTnn25ofr8MzZsaqxz01xtnQViV2w6L7DaAdfm68njy6a-_BrJRbS3hOxjL4j5AHYRYM77bcnwDLw_Z08ruQAzK2WFH2EjzPiVP8UuiOVgy03jbU4prB_hBdPH_GWjRzQlrODVa36PFyobowmk_4waOoZFHI8PpjemUA5AX-cwP_h8yrVNVZkjvqsmHrZ9npFVZJAMeJCPWDNrXAEPoEN7lCKs6fGvivXnu4MfsWZA5RdCJKkBonsdGej6rWkxn3OkH9fLKXHlzzvR7Uqse6MV_7IHcTF8vMMI7f1nQa_4nk5sPMyhtCmZF-kNY08mQMNW37Mt7JuL5Azf8dNqpRMJwXcgLtAjKxM7JNsP-L4_-Na9C4bsq-tbDIJ2iNTEEA0wPypwfm3PJm-Sq5s9H0p_1ySbislnIA1LqC4kd3Bjb4dF0mByPLy6tD99J35PPsOJmT58llkJZKhX4dUIbL43CG85nPpwvIJEVAftRuS-Rg63NW51BKxWsbzIGymzUanCO2sff1p18mlfzN2TqTgPQI_fr728TJCYCEEXHceU-21lUhAfin6zZFiXPPi0LqAgmQ-6zNOqU9xNfCxzOE20z5gLItbTMfTPU-Utzw4A95QQ8v2CDqNeAs67WzW5Lz6UkxJ8aLV0bmBzH-rv6u2EKdETaeXAO9XV5891KHBav7sjQdhAG0zHYuy6Q-B-B8-qve2NKxsFxIPLuWbViWnfy6MFUxknMp_KUQJy6Xhn8SwOvx_0SYuJkLka_toM0XDc3RuBiCqXPzspe5gZY93W9WC0uBhUxV8K8kGzNYyAX-RURYwrBUV0Bebf8rf4yaRdDkCqdtUKIxStpMlCKd74KkLxNMaNwYX3YwiF3C8mDK0wnsWsONigjqFgGhgylApN81LZDU-q0aOsL0dylt8eOtKzp7fKPfNWX3ESPb4iidx7dW7KCXT0YKPvYaxzi5VIlieKCab8hXRqrQlEyOTda8CCdwRDIo_cwjT3QhG7eOHAJbyyB1rE1qHPtk5UwHOUGdK7ud7Azz9LBuntw2bb28a7wN4RgFkDcBWO-wdQXGMHoQTQ-ANWlsmAhx7L8FriovGSQ1YOrR-wS6U5rtN5RS96jboBJn1QZGw2h0x6ZJkFBGDpweecp17bRZR1UQCUEH51bICZadQQfY9hBAS5lXN6L3BBruI_yVFrY1MW4yEpa-cYfuBOtO3optVvVDbMt2WQZk5YKRvyk37LtcBk9QiwzgI44Ip8wT1iKmhoZ6ieO6L9HYu_IbRnsRUqDuyoj9olJNLfG-ax6Kf9soKrkj9uM0RxxMdhKg3wnqz0OiOoGUtG1kxr67Nn0B-U7Ixi6tN8UG9cYVkHiRTOLxlsYeGRkmSPFQG-LTWQMwCx-sC1pt9FSWVODYO6_b1fuwnI5bOHUYCoQlOO_rN67P7t1mNQQbm3HPSVKnAL5q7m1i1LkUIH9YrpncD9cqvAN4VAIO765azQV98HypyEcsmOqXnnANvK8OyYZj71km447zBGhwLTlMz6Pckoh7baxhzXbLUSjBPhk581Hp2jHiUlPKcyR58ttGzDlZBfOUBWvT-rkyCIRjw8-mXUlYJ99nCRaP5hmiwvzpxm0D1w78d1SDv8pz0GvnaOWdgjJF4mJD71XiDj6I0DsMnm3XDkzBk-fyDBthFWxrjPdP-M0M1zSU_7W4-oyu3ZO8iqJYYZ_X_KG2lVn9CRjZS2bmOib4pUjkFrNE2QSK5yujGvPmF_-ZO8XCirs6tJsgUdlBpMkzfX5hg3_JB3n1xqF6b5VGD2At3JEN71itBP28TUSU71BS7mOBCdTgC3AnjbVhf8MuNfLHX1J1CAEsUXeTcc46XtXjvf_OvS86820J6VSKb8LlLyiKCbLYUv7v-WSUaWAmzBOkvtsuLUG3OOjNdScKrcCxmWfKVSbDLV2BYmHJwQNSHS86X2wKKNLk8f-4ajUu1TV27gHcPCoLjuNN1vftnLF5ZZ26vAQ61-ojodnNPkOvAZaNLR8ymGpGM7EtxG66SkeQ3fRoRL_4spbVp4hLte5q1SmEwHCQMqgjGpVYNmGN34VqFqwpzsexYavj0Y3iPbStZfS1ay5op-WrZhDlXgnNrg4FEIY9y8W0NAnPRbuNxBkoGomZdDOek5I71MiNxXYnu6WYN-YZjrbQVRbYYTuRPPdfyjAcQLNFYpwLYu7A6EEGsIrd-Op1_NBcEmCo1GPGERFwZOXMXzDnslDJ_QxcXxj2W0OUliJMKd6CNbz3nC9ph5cgrPL5i94JMJ_Lh2Es-Tl8lZYI36da4ItXpOtnpvPf5nnC_U3ydg6LC0nsuU5lC9_rsY4nrHad3HHOUM75QgHT9ws0UcRAG1yRRDUcsla4FliYt-N_GYK38atij8f3c5KyfKg1zRcevw7gdQiG26lXeh_hqyWUBr8h9oZvAbP5bS220VuIFbvF7IIIMAcaQUyxW_-iy_7S6waayp8pq9rZrxCZVZIDaIvbFoVuNWeCtCM43N1tiIIq6dnlLTUJ-aXhwNkN8rYbEKMbN1E7J7b4hrGGb-gz9A-JI3md_a0poFir79PXj1L-z3ev36n2RHNw6LU3F2ZdJIXNP6aJ5yw7up5mqui60FBsE5hUmuwGQ9Xx1b6ZvzT0l76LxzmBHDBXRu-520HOX4ylL4HaWQ9raSxoplRvOZOY0Dcdkt9uUDgmyu1DB65FyizOF1bgG3EmNWlIf5qSvbeb6saU7iP8eAHQRcZd3NQx0BF5cWWimn8PSn_aauI0qdxWRIX9mFwB2mv-av-tNKhQjfNr76xsP455mdz7p67XWB_0S07vEdOoLJAzrxHOyR9OcJFCRiypRV8l612MZvjhtzIotz1TvXMUheDmDHgA6pmZVVFitbpHYw6gHbLfxEj4LVFwtsI6PVOSYsFCsvptsI-duOIie5qv7ZnsNX2iHWog--U_nH7uw3RiwHLe3QlcAdJfGwtT40ah_3JFgTAyFk8FpsZM_BiARVhCUWzZrMLsA6VunjVwIoPjazmINUmgSI0AiRp7NaIX2lYBYS-WqoG5Mc25xv1GfwBEPryCrL9FrztcV9PrhSbNUk4Zm080TubMjt8VqML7uEuPm-h02qO2YqSv5SoZNiAkPhVmEAhf_SySwJEIgs9iFnL5ca1wXQTD02xKKxhtmL6G08AjxPs7Vv9rl4pzDFfjV1KNyLuMfbBWTTljTSsf-UYPLHttqfzK_6blV8lRQJvUqMV4SWfcpmEXi1tD1G9wTewXUvyuo-PI9oUtDnJUDRqdclfRlXqyALIhTtkQgVcaMzqmDFgopjFIBDPOb9KUHeaDZtjzF47yN0I91kb_RSCQFkAciNYXNIUh629kaxrevKUgbEJPxQ8L_cuHWfuQs2gs1OOpp-Epb9jKoQ_Wz0fxqkbteseduXZ_N-caGGwuEENp5XuWutpcHNTEdE2jbxoEDFT-JS2Z1j6QFdprGQeYJG4_MGKDGS6Oj4li57yky_WJz_8-b16m377p3Joz83BKNsoUqXLRslEx9Zxs-Ba-P5u3iSmQ4SdvKgxPb2G1O0EpWAx6Hss3ltQ3fQ8cut_G3RZ7ZeiX7OUpjPcNEBT9v8ABmbuEqJAcKsbF4eckz5SLUFOSZcr-fY_1KC2jj0ZZSD5liMddDvPmPMtHEH5QHxAg26h1qJmQ4T7LMb16LCuMYkUfvEEFWUyExaUJr76ksj2F-CJ3hofP7oAoRu5qPN8crJQ3FGmXWVokhfggK0hovtE3HtiFkGjjJmcToILZHPWw7yhznjbYmUzrAwmH9V9U6JkUozdbn8vHL67-6vqorLeyGvjUv3X6c7EgI8-u7b1RjBpZbd7A8aNkvwtuurytZX825d6BwutEcef-PWtDN7S6z_6lwtlVp995QdNxRKEVwtOmpqejkFy2wdnmWnBfNnRq_Ir_Nhkbidh3qTEy9HnVwJx_Fbaw3dH8P0GZhJ1ERqznSNg7EoBonis77Rdx7Hhqk4KSsD_oLhMywg_3DyrpoPpbO9YFYCSvmYkXtEpY4hTi0r7lPOYAQL-TDHZMiQcaY3o6jkWJCgJDVLTmvz0GtCjzOh2haG3gndNvflLtIcERHCsUXm10m5ETGviU3PXWHdNAkuYBP1Z9GSgVh1pToBDGyrzAsMD6RXEZFlybn_KcMwWwlml2p2O_8MlGK2Q4HnT3nyrFYs1154zSjnJlXLzRiPuZ1NLTfuyVhQwHuH6aGolQZdvgCx5gitofZVgfYWR4VcgFgLU1zuQ9WIwyTsI7hgcqIj6WQg2r3v_Ye9u-KmhMsSWnBJ7KbcnBL5kv_cCEDr5b01FYVdv_0_Ja7TNg5k7OF3MXjfCtUdw4-cYqfcYPqEfs_lAKQIAoMz-CxGXF0XGaAhyOMIAhtteOVlDQvoTdj48UUxuEcBk4kXhegoiistNFDr6XaAKu8gd22Ug6esMGVoLST1D_t4VO6816y4vHuvQw1qnMVXQRgvqRc9LTMz3RoRz9mLMq6q9Lbm1CCpbbXmrvjmp1-wsdB1Lskj6MbuppTG5agKzRYsAj1Ru-p18oi6wWPWDywNb116A9TV_bre11j86fu3Dkrmh9ZAV0ypp9OpUvHvi34r9tpA8n0l7T5Wh57jpbvgbfgRUZBexQwYZ3POXs8_9HtTRqV8eriCXTNeo7WX7Hy-XOCWTckltul6vlm_AbQWu0HVtWgiBIDDkpLQ2BMwc7vwLU5jeb0z7IfbFHGzy6lStSTf0k3MUh7y8MK8B21IymmGohmDLHYZ38SDiqAMu5CuXVbDUT3NFUniu3bIlpNJXlkBEie-lia31Bc-apN__Dmey4t6IBgS7726qkb2bUbHFydTzKcGrvGRDOfBQEptvPlMW1YI5SpsWXLXrEhmaPd-VuMey-j-LYc4_kbFu7Xux71ijcBKCNnHmJmrWu0P281E0ZQbK0bi1nQWorfWJSwIbDxdXHXVkRT1uenPhDX0aqU6TuLmqNB53657jjKTuzIRuM3YAK1vOG65Q264dg3lyapuodBnw1nwviYsfPHTnxkNL-1Zrt5H1DhoZzd4box0E1AoaUx4Xvg2ILViHiPVUCAQTnNoUKj61N9edy2wppRxzG9ddREa9X1JxS6oeGJ6Wfd0zCYcn-jdt4kkKaQPDi5e7cu-Gd31JjB0MlmnaBxIslEKTCoOCgeQYAO3SZ0lBAIiZdBr2nH-SZUPo-Tc0imiXjQmeZTNdkKgx8xG4O-2TVuPUmHswquRaYjNELbLlC54cKW_N2O2jQF4fIKL5LHQD06LCnEMsT3i-EpFzDor_tP3sIQYSHyKHM_kzX1F7kLeLksxsjL4dqtT5426UgDADqV3pvuWc2MtR3xs0prStLpwJqdaGJwDjOj3uXIrh9cHFmP1Lw-uLv03iQltQ734v57XmndR-H1xFQvDpmkQpfgGbkUsWH0nPMNxuj0gtqiwC0dXh4S9BygUiUVwc_R8lZ25lppFJkLOLIrvT3WbGtiF9nlhLTZs5eQg5y3S8x49ynhyWqcH8cC-j9ZhUm790jT2MOwQhD4Cvhobv84xL7DE24d2cAJX05QFgzarBAQWEes_7QdjRAmMGLzlzVfaqj3qam7IkP-IkDoJwQPN9DLDR-ZocDMMwiVzsmw10JdepEH28Kv6n74Nf_zdVgpVoe-vtVvNjYD30eK6_B_CjXAFB2hQ1bhPJ54mfKv2oLi0yGHY42q859gF9JmEYMW-fQugl-HA2Os2pG96QpmVoalWcPVQgMqhAh0scS04TbRJ61cowMEDw3-BNLQr7gqUiSD6bEvYemo3w4fvDvLpWdpR2s0NCz78r3ItruZDaH7OMZZ7OZ8xHTZEc6G4sl8pJWhRqyvLjL1hcTR7ayaTmRxo73ro3XpRkll8Az2GVl8MV3v7QTM-ZTKT9DEXow3eRhH-jv11AY9sAmTy56usBNktyaO1lxyT8v0jg556XsKsgk8gXhk75YLcLacLlccvDc45tpHQNtIJIhj47dwuJ6zrbsyZ2VCke0RCp36Rb5GZC_ig5mpX5WlAa_TiKOKRBFWy9R_qkdotZwUZ3rhvOIPtAE6dfhiDqjPOVGoGzb8VnPXpJRSo9bSJGnX7LQetaL-waGQBoHudTzOZtSJN2mUZxJ5U_ux37ydGm03f3-FFh2_VOR1WHPUVu4Cl8FIC_yBE2wvG7zsH9X7yW67_btWDrbW949tM0NeCsAz4FVVNztl9WElbmQMq541cxeb1M-nvcBwGx9ClFUsNEDhH-vOD4a6HXRQDHGNyD4ZwzLIDDlcYFNGmI4pwK1EmbgrNjQoDL9miYBxqaSTeIdrPsfoea9Wcdaxg-762wfsFCa2VaEE50Gas1GZy9FGQ1CX4g2Nd69XIjUfx3glzVN31PbmdRop7QA4T8t--ekAXvmwmTWhjF4lHM51rgi-6kzcBsHgL0C_DffFqaFqOyPykWK3fi-jWTs7zomGdyZEeV1o3C1wS7J5AgA9MWUvUME5OyxqPse8uYuRWJqjElZHc3x3GdBQRGNptz2PC-qDw3aUkThdIXuiC42769gxTb0p-9uDETPkfWZAeQ6xYFz2ie5EDXPwJAlONgtn5qSc_XeVm-9vV_NXsHkCYbETgJJwiftbs_P3-FSzcRJfggfi07fjMARncKDeBVtp5NKHbxyKP62wWX2h85sfwmaKRW6LIcN9OOQkR1xRaBlKFOSw6EXF3uZqPk6rO1f4Y0QF-ttLeFayok0aFuArd3_1mXLilH9jn4U4iBWP5MrtzByPoVoSypTmjEfQ3lXVWj9jli_tGG4t1j1gBCc_TPbIqszmW8ZQQwSYMM1MTpYKlJ2dpZMGVEDAL-VLpmAGmBFTTKNqTtwp5ZFlGvXQVlPfUgluKUrjLij74nq1jjgDhGaJ_rxhaZJlxkxUdbY8doLiW9u6NYzjUQ2FmAzKQxvDjtQwpPGheXwFr32mXHdDUVQ-1g9v8DhvYK7lV7DYarTs60WsIR47G9gbW6A7UAwDb8tgWQS3SS4n1Vtc1nUaWN-Z7oARKOZevh1km0iC8O_arxOre33by13kPzf9B60E9LBM6-k3zxxrrXdgR7BdhWj_FqErCWQyEQDLDQnM9RhXTI1Np0E0jYo9IsLlYSGMd0PsYJTudqHA-5k72_S4R5_tXs0vNSGR6DVvuEPLAbeDrpTQfFx0TGpIbWCvNOdtlY7UgLOaKS58oMmvUZNa1RXSU9FxuL3QrmaewAVMlZ-QSYW2n46YXixGV0XDk_I5reBBWh0UdPpq4DQRBNGcRdQEtrMJkELfL55z7P813tdXLroCfBVeq8OCmUJhC5tUOy5mFXHOIF90EUAPWRlW25aeOg9xFAx6SYOx4TrRPi4xr3__4Z_7zEp5kCOPJLqAszSWWxsSdsm-jWEHAOcYOxQ_hUxQ7cN3dBWT1zhyqZkPzDzjC1z5u0B3H_W5OnxdkWOr_LPbcIeBm3122P1uPLjHir0Kvx-opDLY739c70bKvQiI-o8Az2A0dGYJGivocnLT3MYBjh9uDH0wmpPX5lhc_2khaZBjVDQOdrUlsyudmjBwo8hQw8kr-THP1ldANrkIfNJecWEdr80gzlY8StamU8ZZBWNjwRWiiKF8Mtx5oUIua0EwsTmLe6-91-eRoUEzzRpnju8wL1bbBbMXDPOkeWVReqioDG9TPsMBoR_1aoYrOvjkdr_eMo6aBpvzER61YIknisRSp6KXuPKCQU8SRfBYAkRdEddtbz_QAEKMA5FtFVw0Qav6TrSPyurEfQKMONGtdvaTLG9WdPH-0IPYfZcMdAorgdeI30Mn1Oj6L5uKJPt3jMqd6QDF1SfdxhMFhpvNH3I8amFyOiVPCVnvH1e3QA-uTRIwF7fNiTJSHpEedkpxk1gjYCz4rXgd6ekZBgHGWxBi_Sc6ioIKVBz_SAhBqz5WA_LcQZyqoLdzjLW0068W6e0lDYaH8tFtro2qde_nx3htTBFe7XbhaptwDKfXLboAJ1IuV2KtA2dvVYv0zUak6BoyIpMLlDmbI7d1xL7t04WtcuHHQQS1moEIo5HdobnOiNqsaV-Jg0BdLfBoqHurGGgmWZmH9V_qAoVewmHA5_g_U0ty4b638Gc7pflRilHMPZxwWPJFRV99pwto0Lqg__ZsThCSjL7A0it3ZgPIsO6Q2n5JGdcPn9M05MhkO9C8vS8aOVJAWngRXgsQ3kZWEyK4Yw0QyidRBrmg7QTen_mgBachcVgvipKHJGZrXzJqRMkLxxJzCr6svIou5LArQH0i4A-J-X7ZqB4QuWYrtVOwsgNzfLncyWq6JakZScUXcDmGzjXNElXc8pw6h8IzfVYUIRBq2FvRAYii5lh6wiF1EjkBKUBH9jUXa92P1bJgsgkZdbvkESZgdvNsdhPE4ZGRG-No439vt0mkbMhcEQ9qBfugMdWb7snY2zHsRcS7re-Y3suymBLk_zUrN8T6K-p2DkGsRPchqtIWWzasLMDu75h8IJw1-iZ8nTBmYfsNh2wJiftAi0ALW4mJbwWHCr9KeQnqPZF7ZPbjJ3dYixsNGTHqqiFLtABOyyaF49PEk2ZWxxMhbudxLjOvjH26-Qn1ZOwiaCqtuBcJMyzoAf1LGcmlBIJd3Nms7PiCVrFpO-mtRsCKV5vKS_HOPTkHoMuyl9YAZrBgPFjT3VAG2VtOOHPztB190vuv7ovz3QwcREcIXlOCPf53wP7ALQnU6UPPUY6dgVEoOQbD7UuGp3Sp0PXwTLjpWd135FHFkpw8LvATMGbJvsci2tJTpG4tG_grJWu2GZV8IqBep4tO6a2XixpSz9O4rEdK7hqqX9fD0TqNio5DQCNyM72NBAuIEIxftGa69m6khcCzu5BrVqkTN9iXY7Pj_053DKuEoczfHlW_jFe4YmKMzPVBv2he6diT2WKTFIDiulkalgcC9G7_ZXC0abwkskE99mIkKrSQa78Bum1MTSAIEI7AQ6P-eIE9Lm3TTk5gX6hVTbLUaPCQIumd3wqwrdUb2VVkNtKrcguMRW1BHGeF7QxQYi78GbGLX6vYdNuo1Qc2XUZ0jcwh7fPTsutq1heuF73uAf8KpMSZoCP0JUfEvxa3jvy0rz_zPvb7yi4kYiaYi1FrrA-k5wXVaILybGE1Ef-CDKhPzC2cX2mgaBkjTKl_EVpxegiFpWVDNPcRZaDrfjVdQO9sLlsDNcfsAzN_CNeNjatLaXLTJXUoPQdltJ-hN0xV8ExMhLPyGvPb_8WvAo0-xkIO_co6Ou0F1nYVb462CrVE_18orXZS0V-ionOSsrbyG0nKzQwV7uL2otDINPx_Xtk6w5LqlHzcErk8NHePv00FcnJ8q5EMdOt5FrVMeWGrzMbtEPgdLgF43fpnKuOjABr2ZQyU-xS1emTIruRrVAjLaqo2yvyiqCjd0p3WNThIwg71mmFtB3garndnlYAUaAIl20yiLOOvPniDWlWKp76-7o5enw_dNopgZMKAWmZwDJBphjdd04GpSAzjq7qREeBjKJMo4fo8Z6jxS-D7d2gtquDSbiYux9VrTdP7n6b84KyZyFUCufTh6hImuIdwVc_KfgVHuBSZwt7qinp39Z0RKH1XCcY7GVVmGXb3XPqAep9PkPwtNSpWi8OWUJB0FTPJxujzYG9D36BYMszLQIr6ML1rexlJnQU0bD1E-N4N0dllSnimoAtHZGHqUaq6GGs9sLa8W9mjmb19wTLmPdZZ3YNNQgxTbCficZrecriS2G9ZuNZUU49iWfg-4a4kcwEZfNANOblUJ3lgYofS9hDVLh_FcaUD_wP9em1Ly0hZ2Pcq_oONS86_06U2StS6rjwpp2r6tut2I5lE_k0Ve1-7JRO5NZk4GFoopNfPIzOjsclrpFWocLMAw7Z7q35114fe4C7Y3enSMUayeqTLbNAGpqCAkb9R1zZM28U4FKGteciBVnaXMvAK5NOGodxhNE7pAGMc9m4bvv-aIKZny2dJhdfkNPdmPwxI5yaYlb0uXHTzYrYihMo3qUdCfvfeHiG5QlEKQRmLQ9ngY10KybzMWWpBBEElHwOPWBSqIK-1eze2XUucENGCVbiKwqL7SNudww7kpo3WsyrD1UmN124e5LiFPr844EY0E4Ynig84XpbCowyuLw0DQAl7zgdyLqPQMu-sHV5vkiBnuH8GdrBhffa88ZJQW6uz8vLv81hEIlMbnLMpQd5FtO3pQJIwHKRzahOpKDA2tDVfs1o0VWzUaP8QnXqIpQhIinlVvIZ94fw1L-oZw0mp_ImTOFXp9T8i0IoKaVJUW_hAOZ8KU0Jwj_B-OutTM3928Ow005WR_Dne-KeEju2Baz0msyadVr6Ytfhu9bZ_gJ5-GajeGnYHgNYt3qan6JUyUngmRMoCk2itGIoUZ8LATIAufO0JkRe22MofxalYWnkVco-BcBd6z67jHm3u-3YyFy8C1Y23-__RBXvD_x4PwF5AediAICJSuQ-ZDr007-PCiAcYAZARTAdNxcoZAVnELqNcKPEOF8_y7uE87b7Bw7C_r26FLYn_8mGuwIFoZ36unRTBbfiv5sVZbirRPYL5Jw6UeGELcSPCkkQUMcON-onwkpia5xfKvbkpIlWrNjxVhq2johPFhAC9dFMJ63bufOqXu6v-JUk7NAqfNwQYOu07LA7e-Ff7Itk2wuJHIJS5hclPoPDO9utdyscN3TD1TLN3Ul7nCYYLXUCDMO5fXI8-EPNcKbj75jshZTcPK2D0WgT5_t3ViEFcp02XlkdpD4KeoIen1GohKw__JYVTYvL9ewkRGN5mFjP5o-96xoIng7ehYWWQadYKSKbMO4T_u5Cq4Tm01yFtSrCs4PIda2T3_ia0X0vyycxhqeWI2Twf05XaCjh9VX74wfhA6bnMXM1My-Z91K0vqmwjy7X3dYAPBnRMf9HN7VKhC48rz0gV1d4V2bXAiWPQBGBjK_twXr8LxM9yZZDAPfzp0eaOSMR3yIrJqQ1HJqo6ZQPuYHVhusbbMY-sULdzZ3EtFBfidtbJnAwqe8Aqvj3Ax9puIRYPaAgtZfjawe6VRV5SkmkwR1dsgChFt9WTAcUa9xk3UsCyVx9_0cSchu4-f2-rLXBb_NEJTAmqzgI0hxFIiwqS93iKKHBl3DANDRxwhww4azIMh07IQ80aJLMiygPEJXJplCCDDjraiwXHGF7toXVfA5l0iqOPSNVdYMAzScbmk8Mj9FzrEWt4dTpequ37-krNtHq81mHJrztNqXlV8PF1Kf3TElrBxWiYX8ImIZAer_2jvmnYLMVEy_01gqsBd3fcuTw1uNDNdEWA1F3QLXsQTeLNt6RkJ153CNrVt3bMwSpvy-eRQiNrX9C1GvIikwUY6NgdjWVynAt2dBpIZAXd_EQIWxfSXrkU0UHPJ-hTpcih8QzIdKIqXPs1OTsCTc6CDpqmWPoqWQt8FplgyekqsUDa9FoYonOUzeGhnABWVOOzGQA9BIe95A9Futp8mzNNVxkDjJYDjjeRTtxdfkpPAQyUszCUR_Tz4oz7j7yd4-q1dV_KkwdQXNPeQDCtbACiB5FoElBtf32Yf7-ZXaQCAdOe8EtF3LuyYriAlOdEBZQWxEah9k6E0qm_3GiHyALCpgIpTseE-XuuTWLn-f5yq_L8woyarGO0EhVkMjajQPNjMMK3zXArl6rGRldn-Y40gYhN1YZvszt30M06rzwgIwhAganBb7IAIN4psdSfmNzMlCHywswW6-WBu4YvCi3XsuIELa9vfoTsOvRqvx3bmB9ljzi69J60nMDTBpYodLx50y4DaMqFimowJbwbRi8Vb61H01T7QSfT9_CIMkS5p1DtO0i7WvQ6uVpp8DOkpxdbx8kytimtT89AmoavhlJ_ntpnzZG9nwrVaj36Uad4RS7LRuxJ9-iN0JNmWI1gFp-TP5-6ZlB0dcyrq2rX5paNNqnEOUu89JQOTo5vJA4rf3dSYQYaEigvq4rBgX2GrZM9LcfHg07bfjfRL_yUub-YxXBH0aqS3AmIszV3P6JzlQE-dswFdBAYIcG2P8EaPHCqV7XKgWdCXMUQZ6YBPXWc7MUgwNZfFWG0F7VyPs8mmjOOxB5cBqj90M8nO6JGW4S1EsMZBL0mbYEWNB9v4XaTUIB22FU_AXvrqSzuhO71Us-lK4R6e3R_Ve2XjsoulUdSUIsfzxdCb4jVYPNmRVUcirzDkz6wQb3TkWY-Gtw_zUJIyZrWkN9HfA_AyVDhiM8dlIxYRvdfzjiwO-PMUNB-n8S0_5CdAGF6A7l7xFNI2h3g3F-kovzTj1FnIs8G6Hq6_PDh_8GxSufLMt-x4ouB_M9ofIo-uMuAuDUsNQJA61cHNr3jhI-hS066AF_se2iXCZiNJggUyaiv68NaWsXINCKgU1MnZMHrc6wMj-RAr7Ul1tywufZI8i1ZVn9yqvaZk3F0FVAN6u0Myfeclxig8GiaxzYbaNlzckb1un8vcAFJbX16eE2Z6p0bqv51_cb4MQZJA_zGSgAtveXRZJauS-NnxSkyHkTiPp_W42usyjN-49V0iISb1H91ICrTY5zXa0dT96c1ArtMXbwRPp8V1RkRvYdFSZoXyqSfPA3NIblx7z8Q5PnN8wRtS-2F3AH4KWFQWGrL2h1PCFjO4Uej3L1aMPINT8HSxcwG8gmfQb1NEWRZz1jtnQWNEyb5w3tx8vrNKgd7t6jDzWUOFJTuYWt6ak1BAT0nd3XSP6Vwl_MpksWPfeOrqoB3TKNPYRsR8XvHaB5uuL-QXH817FYmKh1X9V-kVOyLooLL-6hVN9m0betueW_7oV_Rgj8smkVrefDA1w01sGM8dwh6TNZE8bkx1XfWlRyrTfbrCYvPL7DPqVdTQMNO88zEtLhTcaszp4VTt2-HOgrWPwZZKEZtZDsf3l-2I-T8bvGlev5bM_kyaeVeMprgLUDyohDgB10qh18B2lWYQ8Xra8AlPcQ5Eu5fVo4q7DAgTWg3s6AQHhSwHMhI6LxthRTXFPymREJRNiXFGhmjOKpDtQcaemi5Sv8ViEy-BlmsMwQk_dxTSl9fYLBlHtm9gCIc29IG3IDqFtxhO6o5KQAzYvCqTPcr3ws6uVfrffUqQLYMG-D438CpS_PoRcqvHyl2mn35X9vZKW6pLttjyTHlP3NPksHGgTbQkYQll-K9QmRg6pLewCdgpaBTYpjmlwgOeaBEm2byM-im5aL3Xs1WTf_0oQIN6pYs4HDuDo7g3_trfLqRCgQVGzclHnKpZ9C2Ztzvr2qhwLl86lf7-zGI1s-O1OuTEnu2fSIjan7L9fupqrZKrHfpYxMqfbgejeLZAiVNQ50VtjwNld45zsaaDKtgkp4iLfJpMMs-wEEYq5wong7eMYrdXO5-P2F5UClfKgCysWEwgSilMJtjYYXdBqG-wQgGfJKg8WHtqY8hOlg3xcYD3J_SmQM1JkVwiQBI8NQvKF1ffA0zGjysdXqNMtzGwA6iC-DbGJSwY_mYGkwambvgcMeDd0t-c58BvDhcFBCPirjwtSHd4c3SnRZCnOPk_a_lHvCCHXPjRaKlRprWZOT-49Ihpw5wqdyRwOtT2yqgCAzDD3lHRD_U99vgjrwYR670A5GkTdRet8Y9Vrimd_3wZaBZf9H04otTzJwjeT0egOyrHrlY8nkTO_FzMtUCybnoYuSIO0TZnSrM8q0iBGMScf5593sLwKmehP7_TE1Gw5PmYVZ38UEiuC_pFyYi4N2oXX4J8zyF7d1PdNusxfNybuLmSxSzvLzg_N34xBGmRGD_Nr48BO2eEtfXcwR8AkWLYpn94m1CxE30HlqxHDoaZk7glTL-l1GjWBjh5i605i9hStz3OeSY6QhbAhtuaXSDD1p5meVNOMibYruSk5QqwNFfrom46o_QPIiimOf_z-zdVFx9LMaqCmCjkOgkd4MOn_x-EpbNQvTWtQs5PiKmLyI2uI84b8Lie9ocHuREws5TzAYm2ZHK_llhxKdrN_JPjkiNHq6iG6W2vyHPDGYZlm-3Et-HgZv0itsyA8BcQr60NzUikUAw0nNI1yIr-1jWxrOYNcE51evT0KP3g0oZf6Vy5r86HZJLkvVSGkhkX71kw1aN-lxQOMkCTVfk7oIMfzvJo5_B6Maz7ejhl4nuBpsSilx8DnKCzDPTVa5Poakw8hS40qv64hVvMa_CMJxzTIBCKefhEcCbY4lynDoCoGL2JK7ZC3PDjzuqQ8H__0RaLX7S4BsV5uAdRG7bG9KICoZ8ReOnKdV0tNE5dFDRkwbLaiHacV-e-BLz3y14tVJ0OL_WEQXgpcPGt4y975gnWnKkIm6sz1slOTtuoLTsIf2g9PAVsG8Apkb1eEKXeeDA5DmDl5KzCQMeTQhO3zojkPoIBg55W9NF0efo5IN26bwu1_w_83M_i1A2_irKVJEIiKbgFwkgg1nGb8NhzKBdjUqiw5KcslL8_OuyA1nxK_vIR0iPbEhM5I1Dn5ZORqktYmiWC71TWY1FmGpPjpT_vI01S-zA1nPTUKEMPzHJumsix35BaCYHhnl7Ds7-YoTm6HFE1AFBr4WwU2V1Odc77-1eOnZlZ2Sr27y3DHTnGV4btld2M39yWyjcFKUa-ZGeS-eLWYaeyqmLbWTZ9LTdyfKEF2MLmd9NuEh1brfkcLpzC--ngc-CVNFRKy9TRVqtR2tGc8MCr15jgb0ZTXaOichrkEulv67enpLpyuqdMFvu0NGhyUomwfTNN2ML0cn5Zj-pvws1nlBzphF9K95LLCh_Td1qtPg31wFPqJAomH6jynf6pHLvKwBpzlhNtxHRIhXCnzaw-Hk61M7tFaQbYHcXIt46tPfY6BqDINvA6_tbhIqpQ9v2w1avsgsw6a36GZsAlFLcgigOLnEMhXUzgiMOj9ze7hAsw2c5D8KLObIMxotRgN6wxZJBbt6LTWO1D8yeZ93eG8ldEIlYKyLuUwWfzF7zhqm_qhCUQI55HWEXVy7f2UmgzmEN8MGlWaPWhK9PmPxXa1ywAIV4K6M3X6_Vr2icT53DCxA2G_aorqdfb4zVjvOKCyZqL6JZGUEiYVM4yXlOpqgFiQz58CRglkuZ7BSovb78EmLk6J33XpkiaQlMKYz8lyCavvwEVmVDYnn69d7Hu4trteHDDlpe4UT7SR_3nzD0j6CYP9VgsIO8ySMU0Usd_F-Yi8YxvEJhEPAsr8sXV-U1AanYvUAvnTk2ue5Mt1ZIgJPOJDorvzqUot_zCXx5gurSg_ddXiQEbSISuyDW_qnXcKEaN2VnMbtrm-hpzkOcuz8Ys7IcbgqwFn2v60VUwhGqIqlqaBglxgqDV_lA0pPgKSC1PBt1sq9kTm4Dd0h8-C_IZjnmngrpEnqgrrzl4RhGuwx2HXnO9sBvHb2vuAdpbIEu_LrPOI120CUDvZA2vRcRYazMTutlIrKEDQz6hozhdVo2aARkyHMOAVXWiRej-uutyS0ns1-AtkDiaYS6onNFJEHviakp-gCxK9xZfEodfOnSosY3gbd46zy8tyJEnLBp4_S7zQYebDF-0FSXJeo4AACyweK7hW1XSBsz-oAcBBmVQkMl70E6ZFKyytIvrQA1HOT5Sjgq13RrYGKiG2FJo-sYIlDlIJKQ5LW12YIaEnaM_vd7lIt4tdjx-4416baj15FTc-Y78JY_4eBunTaxM0t_6QqkIWq8ZHxuYN9JjfhP9nz7MGuDzuVhlOzzZgH_WIrfwrLhISADndzydN1ARMGKlaeVPGIvVdI4_oCWQ0grlUZQdajntKQQRmdK7kkkueucH2yQQGJ3s1HUj2bo2N5XgpCLyPKKEWAmD0uXTI3zMcBIs7-JCuSf8bC5NmFJv9KPDTqLtNvtD2DSWKU5rVkvSUYNHzzrxvm7nS0bXiZiyK4mqTnfHxndP9muHeqThg374LlrAYqrqZIBnPRZecRXvAogxf8Y0E_SCTWNwl6PTg73aWqlRb51U6nboO6eYKdbmucvhzN1HNM7MQJ_naFPvFibmaNJ9yJymq1ut3tZ1-Vrf_-isfl8mQ3S7vjXg2aBdCBtZTFasU18JpaWB5m5fu1kwhv1RccbprBVdi9Y_BDcs8ukeI1kHd8t-s0xLB7RZOTM3ZK3suHvIjDxP7vKFpOuhEQtFAaQiP3K5fo8Lh6DKjVdfmRksWTak1JwoadZkE6GvxOczbRnNK_754FO9-Y0U4AMK-c1V3lQ_GpChgdP044Lm8JF_UrYkuHt5afRHSV1Yjiy4Zu5rICClVkbvELx0Tb_3CEkCGs1fL9ZioHkxG6Y43xwGQxBzFyey_apA4BxvVvKPKCuPrCZeWBATgjDo6EaasdVPVghBEwwAj_tBA7bDvWH9sM8QIb95RhwEdpMyzPkSRFahEC00zzbY_jx4iqUHAK0iIJrZmuEEApl6tizVOeTUJb9FMJf4HZQ5yVtL2DcMKw7qaQNPdvWtGA6pjH-tvmbmUMpnCLLm-mV5b1h5u0Awcrlq7rI-7Y3UkmoMRKN2tG1U5CGHxQZQQC6UNWAIdLWLmn5XlzAYfjHY8Hdedh4TfhVat6sjCWSfXmzJbGNSwEZdfvah1aVrQ7asM_8evXpbeQUqdlVC_jXO1YctgoquEudesp2_AsZm_0J_TEtR6ZeHfNoGnDEEGtVpajetpmLM5hAfbUBSpqwGzLx0JyD7UsrSpYUqUzFgryEdNcFdQHgKCKtuX6ErM6Oc_2HF3zprI-ox0V2y0zvDECJkQydwxcV5LAv-ZZ1zEP5vx73BPvQLAOnR0ueox6DjQArGaZqPsGunue64Xq3xRpDOMDZ_Ucy2YuHhPoXxCpJhKEWPiPWOti7f7Jid0nN9RFDJtOKe-w2fu8Xtg31F-bQVoKPIXp7_28ref9NSYn5MDrRRmAfmOCTBfe3kvUhMF0PUcTXoUV88jTNRNG0qDk3BkNkxdnECnsnglqnWcQCsneSn5SRLLZotKrY8wQT6ssqc9H2szfLZ6UQPPV10jcpICIGFJ2O2z0bhb3tNokPW24uS6Q3WK-Ll6zsXuGdDYjUo0XPVWLo6z5Rh8LDQuo7XXzSS-WML3z7d1lUsmlIMKowgoygUTocOqc8CSP359RsyqUAVwAUAuTViWppj9tUDJS4IQZMdqx5Lchx_T3SZ0EEXltNCYOtsQstne66A8RWD6GxlIB2-5VSfLFXKpr7uq-VXWAZEVBUSAIITN8ePyBEkbqkwaCNrlcOZSZNO1PaFRG7WlUwp5G3m-w05LRIhJhBwQiOSWkJHvVYzAtRzvVWAUJIaD4nEvpWJv-MRG5Kf1R2kFL2Oz7JQkQWVOTjStcYFQpLkzAdZ1N5tdLWkkwmBn_ExUEi3s23Fy4KLVFI-PveOQbOqFXCF0tDE3ncBnjcoxANsBCBQlfoq9yHyer6PqHLtQU7g-NGQX7gUVlON7PTPR07cid7JjaH7L_1m116VOdjhAaf6f-UBT0DZHN89U0jn9n9bahDKXdvlS-AFtLzUBsvQwdVuvZtpmjZLXkDGc-8nRdQ2FPzgG7YnytV0dkiPS5QTTVbXX2BM0XsXfcU121wl1wseX5p3aAJl_iprsds-oeMVN8d-L1djADIjmCJdgWxby0_xr4uRFA9b_eCddQp3_-to71oxSAhgIDrHcsqLlV-scu01F4rweMRTkZMPflI1iKeryCZClkbuXUrmVZP4y3HD0aGhFHnx-W5sw3HRtVQYK_YzOlpx4au1noURALBI1eMnRODc3R2mfMRy8DF_8dszJTR1WERjW18tmsKh5_VyfSgQ7ua_6YMzPIfL5ftbWiVAabgGoki6wONbBf1mhA8yjfRaP8oQpI6TnJw_Ks39_mJqp7WUwrKgIjvQzXY2zFSvCQc2N3dmcETl0MRVjUHfz_4Gh4mi0Y307oLqLUMeMgXh10AOLKKPuUtwrN53v_n2pVaJBZM8ZDrOX3ciAoZKBb52G2mUzf38qmpaq3z9Go_jLSPHKR2d3DHAJp584zDE6UdH5EUEkqAiHQWh1xoLqyA-gII-b5KBau3wYDptd_rjGPzoUo5EDaUy3wMOTPazplI77NnNG3lRTUp6psXaPbThmbjfonoq5OAFvAR0L-jDFhJlqGJNyEtmWHSbVFpR3KSXBvzWxBLo9xSqMz5OOkl5h6C-2cRVfCWc1jyXRueYQXLsXxC9smQ1YRnCSBKQOHXr2VjqYloKp6hW3oz3xrlbufnIl-TdGvIG4ZuVRt4pq4vES-jsmSv2xbRsxiCDmdF-c-vod6iHkN-52DrnqbqDLmVaGzJahyP-7LwRUc8g-gWIJvehzAMpIQAWZXBBDHJu0lSdeWeqc2w-r5LRg72Z1fN8CSO7QTyhJ7jkJiIuKrMk4O0Xr8BYmNUKAcgKh5HZLV0-rD02mrTczvrMBgC2pjc50Oa6nN8vtrBeG_PRGUoxPLbrj-ipL3h49Uk1n0u6ApWej1Z1leSdjMoeaRoroN2gHPvORWuq6hlHb4e30XKDVIwSvP2m3xpFXsX7qXqISmzN6a2Gk1txmZDJCZviJsHpmuOiRJYOoeKFDTwGm5KSqAK5PGeyFmbFbmzH72D4G5OxCUdpOHsNZl1d-M6QlrCVQkM_2HrvwSgw949_11Ako2bdBeABPqgjpL6OY-DH-Hqj5mIFI_ehbJUNFKWfqOMgMJrwilhRFQdyksa6qV7BbXiZizwC_PJtYzyfBZtl653ryQIHBlRm1kl_ZRf8EeZQsn__vIviMREG_s5wxBeqhxAnVothspcaYRwgBm1K_sAowgbQ6cknXBn0bHqSoeJyOXSPNmcMc78sUk_qgLRygGh8gls9z7bbGKWzJj9COE-c9iz_bRmHWpD5uSXfjZ0kHFoTPA93l9Ihhw7KJ01brtFK7fB_iQyxlgro3FWRF5DMrRDvcIqPhiuuAjvD2D1AzpMwdp_x39DOagMzJ-pk_iewF8UMZ_ch5fz0-xT0FItSdzf-Gf2SoR0IX10V0jv19gLZDEG5MTrDm5Lr3MKRZi3y5dsiAiRhIk-kc0JnzvNg55_kRTBckFCdzJNtdS13O3lizYIu7yXK5RdJvM7BLAq71n7Ltj2wq-W2zkzoNRMiS_6ypBBoytIfGHCOm2e-CQh0GGfRccK40QuhW-tjukBSX1AhojOuBpjyO36QmaS6WC_Asac372-dl6PusiKCXB0NwvhstzuJ-hTmWkvIlDIhmiaptrNK1tBF7ZnaNuqCgstqknkmsdwNNAXNvQRPipSPWh1_Dxn1BwKsjj2nfjLaDTEwi8xJvP1hH4YpWaNwhzhlQNWUpXet1lS6UOy-IxanCMdwgfPAYu55LMUI_PmxoHrQjvUdfXTy9toLigEiHTVXxv5guCFtfZR78ETByuOIYCbvluoi_wA_lThmkPunijSe2t-v9JIj1DyBzp9Yqk26klO9gBSo_9phMpD3Y5e__AjUNh98EToLgYgkW6a4MX_4vnw2kkN-bT_a6C0UM0CSPScn-J3yEgbK40LRGJrVnin4YvhdbybCxNAk4Jsab8XBugIuWMneyIDDIVKzlAtLaJu6fvS-k0GIUJZnneg0HdVYxbai0xds09XCknb2qImzG7eBtB17eJUrtBbMHyQq8YXCw_y0BaHWe526ulDad8zdSq7sJ9ifDCEJeYBNsMHjHkBp0t-5fyuqZePI53ovoJDTBU-wu20lGr-pbyHXyKxwa7I_rNT6eX4bl4nDBDgeGQk0mEKqpW1WpFr5D-FBH3JGGHmspVQ7YFAgpP8TcJZISkDZ4wSP-B2-wci0W7KNsoKacviR05XzAsT-OjNvntGUIo5eyI0axlHANuM8QLitr55UGBMsWHA9Ex2s_uN_W-PG4LAnrZ9apV4TJjAND9cM1ed8R_RGvjP_EZnkmEWto9vca507-jopId9sF955FxbVYCrRANqwK-V2_sFbXjKDZJnyoX73Wde6kynq_oa7jNg0zaYzZO11buSoBWShUoBlY0uT9v7_LzRzwmBsOecns1elRUcxmTBZvss76bPFAjIEFhJM8pERigO9JhtCT-t8i2YQ_BKM-059h1Xnlz1Qps9RlsHQdYSFejFYUVvo8jTZ5KjPOS3BE65G2ERLi4Smlw5RjyrBssvKmKY53A_G6Cuhkjb06ueTdISewdTC5zxO2GYFYLJDxnrInNtCj2OWJNYVHd8Lhas2wiwWhK5Wa5sh0r7xkZmJM1Gt2s7mH4TeWI7Z5oAEaV63FnF58381836U9tLJavtCfGH0XpIHRIILC9L1U3EuxluDeVVdKyK3829Za98QMHBHd6b3_8NAeUs-oXgL1VKaQNtGDN4pEAVeM9lok8kZJqXnad42h0uJEFZOHwlGQG2Krpe-wsYtY1UM70b2Dw6YQuhX10c_uLdJox3f1ocFeTdy6Nu8csRP9ZRmqQ48tpNFrjr7hXYXQi6yzZ47hnNCT6fO2MDx66kExgNPTvH85Tlhl493CPWkgueX1AsZc0W7t-jYMLlZ3Ohnz_XD63-jBPqUZPaSWaMe8oRSoExXSsyfqIGi_YScDKXFaGJnrk42-kfuUMSZ-4HNLvthulWr2ZIYUdgEaoVLfCUMTEsuVYEglUtRLT-01FJIY4yAMeMG-LHQanNIw5gp33xg7DU9keHcyhhrJF4yBEgv6HJzqXdRGlW1LJEhn6WmBbjsHiJ8zcw36BqqAzpvNpaU7KDEDBbVXeNdUOtuvpOPbSOUT_qtyk2lSC-8WiZbRdEJctEMJLZPdCp9vdkZnjrNASoh_BlK0Hzi3M0DzHbKXqkHB5TRpo2sXI8r9vbRY8xd5_dPXAD9Y8EymkVN_dQOUBM3qGF70HhUPFaopXa2mqdiYa4iN-faetv_M1d2Bmv71Q4HFnQun32JZKAFlLVA9JwQ9TqrtC11xsH6Q4zczfz9mAkLPU8Asj41-BtIJx2K8C7ytFzwUWPsXNfbdZXACQYn9apZSswmqInI0DZ0L-KjPtpbdk6btzk1cTkb2dIFDbI0n5vvmNUFTTP_bVH_5WkHhQITzLeI7n_9vyJHwH9BdYdG3uicO5Y4n3yRBN4sj1Lsb5X4KoSUBWv_mgURW825dWzBx5rlAhVC7HE3F_WdhLLQxEjYIIIn0AW_AW1gCCq02m1D0cXJEc0_xfSzQpL1xqr-WjD8obYkd05_hWQNxorU2hV1-O8sQCYK-dSjA8rfuI2x9oaZ0-W6gfgkWEFBrQ1jqEq20v1n3YaYo6t_1ixflcFoKiRZTPRtVRNZcnruJ1Vxne-HpBirTL-Fh4oyRqWVHea-gKXlYnn_SiNsZKsK11r4dwjlUp8L1wBkHKuKOzdACK38WsbO1g8XCRLx_9wdb2XXlW4s_W_4CV57_qF81Vs62j0e1XmIWhq8wweHXOeZCqMMqBtEerAwu4JF-eF8KxYgC5f7tJGZYuOtTeCCsRY4YarB6rxkCKtEiIYaUpYa7P5ql0lv5x_lkRvbuA0Ryyr-prU7rCMzSidNOatMyVzEDREbkzJU6XE8K7xvrEsdm2Nmrn2-yWE2x-zVwFpdB6webdZvKAHILwxZA5vtjKZuuMpGj0Jfsdoz9FZDHsh145_GRI1PlAeFYxbL6cgCcelHAPxtS-FQAQXQOFi1rFlYbvPqHxBNg5r6WWHLypgRzMQc4GFw1s7jBkfVTW2vlPZONnmz22YXeDdq8DY0JPvfLFaNneume3yQVobsiIcK5ZdPoioi-a3Ts-AmlLeMihOnoMhm7OU_Si9nOzzmeztGle4HsLJ9mDYs0s_xC3kPQd2rRYL_iIV7XtSGgUjnnnt9DoIfMIlLiC2JweRZHBZ4e-VLT9Dvyc_fxWucb0sfnzjmThiRYrR_5C2UgggqZj7fSdJ6l7VTqp_J63t9s4prha3I-gFKPD_HZtZPZl1T6HUGtAzwR17oaeQ-4CoiL9fqU28ouAZ3Gc9VfYSEQBFdTkVcwQrg8FXg_9zS42jikRq5Hvyebqcg9pc-b7n4TxOn8NIdz6xCaKY0clWkEUawH55MwHZT8wLV8P07d9atdSK_aF8fWIzo7hp8B72jP7v8NRkfBbpnkyI0ie-CGLaPYpcv58Sk7ye_7bcK4BPQs_bRcx1uzhKUh09F-O8boKmm6heafkRnOV5bGBG73O4DQ9915dYEiH3JZI7SGTi5Mc4fcKcgc5qaKcA_mQZKh5h2YxuMH9ptLzL_oF0ArQjuSByeBr_uS6FxcEXfDbV69V3Ymcnau1O9xeWdv0FbUAfnua9XJDBYlaQO6pBFKxJ5SAcVTQLItnHE9I7g0-HhXeNFDv0dRdEcA9I6EzKwSkTsGlWq0oJ-txWZX_ZdA7YMF3JsbY4CWei1RUc4jjhOO4DJvf7ZNBUGgCcsWvbeInTKZHWXrD7r9HhWa5WQG_hQkIwF1q6pWpp_ZvW5afNDk1XSDnE7qZa5lPd1z0Yb07VuSSUf9vO0Yi2bcIVlui_FRiLdWUJzJd07QEvb8lDxSvFj4V9kiUzP9F3545-fUeBuW2ZKzPfxwXdOZpuBggIi8ORgnlcowD-lK3o7JwN4aHpcelxnY2KOvE7553gslbQ5nKpbx24OHddJsdvjwMv0Df7SM5dEx6Rx4TY4ivnLiLdT2MAZiDQnG8ARpWL6n9r4gIZe35dQ_1dZsxPtNCxKrP1_UiCHI03yN57PpRuslejyU4UWk22YWGRAnI1nW_HGr12DPkDKNDlf7yLAeO16yoJVXTjSjbTKtIHZiJCrnRED66TtKPqi7voNo-PB5kr0BCt7FuG9SM9IoOuKQANM3rfoA6wjgnB3Dx6XuKYBPW-gDL03uFxBA2xbW9Xv4I00jgPUrHxwPvvUK7CCdq67gKEUUeVrqo1Svbjr9tmMeGfToMe-lTf61_IYJh8FGkplaw-VfOjLBKXS4UlCmkBAqTLE4hq4j2E2-APCuiAdUAidePXcmvPH37q84IO22_8ZQh3rf9R-2zUeNLKAF1RG1qD0obyb7uPo3wtRLPktA_BEO954RhSRRbyoNEHa-sjlszGReRQGC3XcQBMtqa7efwLBVdlRpwip8oT4rukQrfMt_BbtI-GVUGJo-KHvl0FFb2b-pveMkDnitMGkd1cpohpHUcNnoMMibgJx8Wr1INTfXOvHujR-O-IbaCT4I3CoyMuQOP7jx2igUakUKudNCMU2tJppQwO0NSawKMJiUc1E7wwqf8pjFT0BGn0D8WckYut5oLrxawB5ECHDk6n4GlYbE-g2srln3-nz5o5pNdPTMN3AUP6I2PDMxQhLcj1auiwVsm3MMi7NTOYoDtindBJuAqIFxX5fIV9rk-TgYjNDR8LObDjQocO7qNK6GipDRgf2am1Pn2XhzbakcoScF6d_K6oorrbWvCxQBcFUkMCfILaOPAf4RgAe7AGooTbXGNXoq_LZCbq0kgIguT0cO2z42s_9r0Pp3Z7ujtCDn80tGl5PlVG5-dAmBX8uJ05uk6o5VFapNY8u-bjlqh_ssxBawsz7htG1PAICLDSy5gcT0Qg9U73vti1FmvmrzjCdMhybHOEI0olFKrmDX08jxsa1pKBvD-xhzbE5FYp5DqfTPsygrPgmOjIgeaHagV_L-6IOZ0x5KDhlihn4CptRzpOyPvyAN2bLl3P70JUfOgzeSCgzlSxdCw9GNDyk97Vfh-xY1FcjWi3pNUKtnqOfT4CJjjXksIHf8mV-rEP46uL-kv9dJD8ZB2DW27mXIbMnTUlBcvyBBT7IH31YslrbMrTjz8UkmCoP6Qi4xZCxIeQAEcAw6XllMZe-dHCbOdaFUpfFiDrxgPaoses4b1rPR8zklprxejvWJv7Bxi65b02FH-DN_86hP9zolgMk0rFcBQrXaYkZqfkP6cReT4NlpCpJ9wObG_TKOmL0CfekdzDt5Adrj7F8f-NB1NoGbeLhpc-CBKruz70TPwJqgm_n-6zsVk6cR3OXvYfz7GHKyFiAUPsIRcc0D0R5aWT4e0i5Kzuvj1i2pXrpOKcfiHzRHwAO73vlijUkmHya5cisbtErosL-4MSoqHycGHk7Wf1VRNccdjBcAowc5VE-jZQpZ2m9_Z5kLjQ2JN9A7gBvIrdff-LiDGA-jt5cRc3z-1sxgI_MAN-7fgk6wPWhBwhm4rcGnuYHJ7nQBMk2JsZL4uusz0XCwgZx23i9uxy8O-AXygjEBEETOwxaiDWyCbXKc0XMRUAfWyDD4NXSee9T8Pd2ZWWV-kgsAiTpV4UlzK4DPzzcfC_P7e-VNeU9TSLJajDPpdpRcmCiji3DDUpUO3JtQwQ18gogoqY5Ze8hhYrRjPMGCUh90zc0qbMVqlu44ABPRbvxNei0QbDLlgHVj-evN9ejCfwLjax2rOgiLNkOh3qAvQOeKBUv8Ypf_QPoNAvqdP2I3E-lJPtVsedK1v_bYTv03ukou1n_JgON_iCuHAj2Fju9Iqju_CG8X_-bmpdsIklMDXOyJwJ8RfRkmTEqMYJzDu8iiy84tr43vkQY9kNEZVmXUve9bRVJBn6d66b4dwdInOpjKX7lI277gYLyYxe6wkrSRWSF6LpFxVTcqLZhForYd0EF00Ir1Y1hnfhNWvmm0KVcW10NJcGUsJ8CbhI-ho-MG66BGDr0phhTAzPr0rhLjHy5PFekGk40KWuV7ksoj-KMEEQUN1eJSx4XbewU-fk11nZmrTNhJZgMwyzUfQ3w1vTzYMuUKbrVXGN-4EuGqLlGoCgRjqV2cine4puB81FseOf-Ybsd3bxvRQlOlnpT7sZCEXZXTNUqPE1oKo14rSMeZ494AK-dxOB-fSf22Pam6SKLQZalFYSLWfzDM0P0G61-n04Qla7h0qY1Gq7hJUlS5GJ1Vi12WrHCF7uKq5kofL2na-0b07Z6BoXgMK8xD0nJGRkySXHOUIzBnPXTZSCtRlmsZaOpMybdefk6F_9AuYw_UeO8ilAiBrVAw8P3zcOE2lKIeAQQvQX6VHjtFvWc9kbus1UFbdvfqphb8F9iMXMDKga1XDhq1CHdjz54zzmD2ZNprhffKUMkmulQHFaSkrCAQPJNBDxHvFEbVYnhSfd1oSJdUPT4VqvQKwpVyhnnjecg_yZpNgCEtfIHaxzfhYt0sr929-seZi-WPG4HEsNyai5QAW1GDZ8f6LrH348VxZRgVQ1I6ARsqJfRuu7M6VR_AaWi55ygfFCVXHWBVR2Gj1kDxvO-cJI_m3Vng766S8hAXN19d8R6_BsUEwSQ0lnDZMVB6JeyHg6fu4IDsXSbSv2YpLXaLQ_-i-SlEfi0n9lteSRuu3iRvbSu3ojq-JPD4ohQg9EABVuN8ec9MDlqMmnMik7NuG0vOcGUrDqvoV1A-r-7n3i7MqLcMXd8Qizy9FK5S_kMpJDmeYbex4Q6jOz1q9fi_EMSjkMh3Blqhf6kn0k1WGosTNSDjxnQm9TcYSUwaYiEoOH2QFZ_4DlaiPtzHFzV-ZTmpDLhfOf1WMgLA1TbSeIkQYKsdT5e9S3ppXaqgu1cc8EiQFNBXfVTn1nWyaPwwWoKaEbqMrIdvAPmPB9yryin9fNQRvTTLt1j_VzZQQ_u91w_6S4D0-1kePqoKeTuIfjrNM_nbEqlO93l0gz9JNa87OmDD3kH6slqXhf9jtwVML1ZlnCs05aBf1Sv4RFnLslcPt1pFIac5KHQ8OslsVComh4-54YA4JBwsb8Zs8J0LmZcOuGWDTsAutat97mfqtQElhATsuQT0LItwWMCGc_iIYYP4SKLmw3LumeKmw2Wq-XlIqk-fiR-TT_BnwUtmW3jHu1VZRTBh39aFkf_arpGTyhMmKpt0rg238gstamEjtptue8VVgHqFy0F7cCOOFvbTm7E3jg5dHPRb8xi5kGHwRE62FVYCuwsiaHaXglQMI8iSlcLrKwTXqMaZ4i98t3Kp3Xwxk-WHujpmGBkzaaTrBAnrdvAqhL2fVT5glSXC9uEU-GZrjCw5ViRsgev1myNNCDJF-wGkSUx3oBuRFKgnyiE8uAx3Hcy316apvD1npgTcgC49agYy8BEjqAqIFYQMUC1jLLIrvJRr6jvwWu355d9Z06UWUqTYIdNkQ4pqxdNdP6O9mSvSNN0z8g3u87whArQNK6Q-CIvFPWQEZ2tFWL1eB1_E9PtU2w_c1dMHsSyBEDW1INSpuESG7EB8aKzfy0-e_iR4rmIrJk4jYjKEovEGdKUS3dwbvhfg2WEVzcvV_Fc7I7YvA_NNP7R31TNxmKKnaSbW8sRPeh58vT7ExYtVJ66AbcQHZFyqW-rKqlDvfngGhYx_B-wLHbWoqoDxYX3vBV2kquV-RP0LnWvy5Q99GnETnZg7dWDz-nUlDX2IqJkTB1Eqa8ue2Ryl7GD6CYy5A3o328d8iuF6VcaRRIOvdWgZExgfxNUm960-HjyK8Xi05PWiV4_4Hjhl1Ua6n1WeSIYf-pdaKjvk7Gf9pyMeKQRynV_4tlUuvwKKUNFSUhOAd3XJD6DgJAgz6891wXZ_CsZWTV81gf6BM_NobVaeYEVYxuF9zdiQu2njDPkw2up-eR2UbugSQO8hkdaUkjEYeDlRDzc9xI2JjHoeIDA1XGDsx3CdDP4GM6WdS5VMKOoBHOZv3LDat4ftpnkGrFVMflYBHFXCC7irYpvKEMM1-9sS0HIBH84OKMIVgjdMh9OYV1etqy-k-ghRqye-LafLCYMGzxmQAKMsv6SBeRUBX8rD6kj6Po3Co9iAtDTFjRCGeVqpqg_kgsw5THYo1aFaSKzT6SyBomMqIWSCgw8v_z_npDlhBIRZjC9SOyxlby5KgWRebxHtU6sW6uCGeerfACvnknM-Pw98-gP1Woy0WzZaSuWzsR9ieDrMZotu73QTb6EmqnCeucI8Z_PLLTlSThq_E4_iQFW_pxeWrASe8P9MaXz1goD3hbhHbzfHY424Oa7FDLlHlzILcde7dUn3mTOLcEocwsrrkUSoBGiQm0Xg7Y_zXX9vOSUQxSrK0HRJaE7rSPtd2wkMKxok1HmRmD-auYMW-V0fu0Q_KAotOAs2pKV1rj7TNu3sesRDN1cyv_wrMeVbgzYxlaCyK9RW9gjIz0ym_CrM9l_IFDheYPYS1VpVLByfKpsrw-pD26fyvj2_QmcWZdGtJw6Qqh-p9qKUr0RntMG7-ioPyBAUQsg-9dlc2coSnATU7aVOOdfeKUvIDsjS1ixpesWyYp0-FSs97gyHrsytvbYcNMNM3Q3RH3DNHHZwTvKsBhK2qx8d6lQOGrmXWCmQuMqwtouTYpP_-e4fu0BzbmR8Wd5AI2wbyeCkDko6oaO9Uaf68FsIzn_26icqM1gdNQ4HxhPmaWIAu_2LxZD6HcgoKo0DOnjLrbQl5RHKjGqRGVDULlVmpaavzA-YawFlXw3IwBRIvzrw1yn6D-fNdNiZT-oDhGIwsDVaIVTCBHvhCrlS7DqcZ3eV17d5Xa4clWdjjUjAHCQpp1UbsVcmwSL7mo-JwKUUNebkYbJY-PaEgykUTzX3hdpytdCdEjQsGJjhACrbzo63LlnVoF7Vq7tmZ53sS_bNuNwWSYX9LVANXi1XfhWie5dPt3YZkpm2AhXvJTv-lHfvYtCskQHu5Y0sGDF212D8J8YUXdg0h3fBmAkmieswQ97uYytxk4KNyJTNv-mGl56YSC9GXMZ72TTGfVpbEV4c-i1XFlB5Eo0Z4ufQC7lFEiwZCOZI0J_NyILxpAXnCk1oi8naZNB7fI89nIe-FAt40eKZmtbbRhbVD9FNNhaKHZwidErkb6bRh9MkJDWrbECkWeJeaE9zaFq4B_gVBK6W0SU4L45Rn7ECj91Hpd9sXxnawDhQvhvv1yNiZNDbJ6QA_ZdSgPzEiUKAbW9ZLWUNIy7R7Q8x5MxbQ1QrsKFy0jia28V0y3b6oB_swtqoRLUsIFmnDREHn39a7gRm6jm2nY-oiVEM2rXnAH8BRs59qcHEB4IwO0tt335msHuu_A9s7pqQkVjivqwhpYG2p2ZViSneuxZ8tCyS11YEAgQCldyqrgVbUrjFZBvuyt7pbH99ACeff0L9yhQE-aPl6Px-l1jMWm3tfNUJ03SoxNzpY0XbUFMF7lwAYpOCvXyGiTaXN_3PjNJULaZ3V_ag3SRKWICDmrr1CUPqw51Kes1G_4xzWx3mXYcwjNMyGa_LTeEl87ZRTSJQbdC1Z-Qqk02r-QVWk5wTNI_0YfDhzMmnaUAJ4qAB8VAoLZ0EHoUnCTs3A3pp49SAPoKP3-ifu3WFY2wx-zDieoW8B40G8sMHUv46KYNiXhYR5HTNJMAuN5Z_ZBfDwR5zZ9uaKEvB5-UTCYtBaDifsM3lUtMQSlDSxE3rJVL_pZMa_xnbwKaZ7e37nEIp13d8FfMd5QXVCnz3vPjbr5XMmuNLP3ITRHbwktx3lZNVG1JFZy1JP08vo-dDQRmBtwOL1UZz0NxMEp8MiALQDhprlEzxpgZMCSA15RZxtMPeZdnvzRnnoYlXEoyH9kJkXYOD3F7ulbghexuW96aiHhqYCpV32buWMR4g4g1i4xVj32lS3Z1o7PwvOb_pEQHzhcCPpyUtn6nhqGgYkWdAqpmCY1Ai2hOm8yo2hvyFQ2dKEAKomyDxwIwNyy_W8Oe7ybhrtuwKIyfETd8gQEM4YKpr7qV-Fr6mkiV1kc0Y6fk44ouG4giGz_hJMeoH0ZJxmEHLU4LiRO8r-z11aVgN0BS-LTOW_hqA9wnQwhHT5Lfw2wT13N8-S3Dp2az5gBVVDck8h-mgiM2AWG1KZ9PFATfXueAwmv21HJvNLQHjNoI2j7FcPsF2o1DgPb7PuaWo7JTfsLWkwT65PFdr-TcpPvLO2r_QWbZBuuNCG4qnVl5Xh5DS6nRW14VDUuufvr-P8ohXapUBGvocw884YeGWYObRc5M0x_zoXajoFJVj3w-nFiWMft0PKolBmQUEDTzmfplDfFGpseCF_vMD1uRyIR-GAF32SkAkcL0MNwJkHBdHQzrY7lmbHPpf2kgB73f2do8wNDMHaCm9xAMp2BbBta3c5NbdmaMhHoyBDpR7HqAtBQtLV0r4YXNSwReZrLpBLVRRu2r3lPSBNxVhYIn4ikAjO0ORgIfGPyGmH7XgBhtmp_ykpaeEodFH7WXR24zdCTgDA7JOpTiiYWtdbGQwBfoJzigmhGH7J641uwP6OxI3a78BU8u1I0xUZlVVtY72iVMDhcRW4HP4GyMmlxAOs8Yva-xSwsLxw9JiAfAW6u6aYI_1r7ava2J3iXdF3khc9aAwZOVMjiohKnmKyPZoaej7yctxnBWKWEAgdwpKc0nviE9mTWg4XNiaqNZkO9BF1WFm-FPheNb9wsIqdzJ_8W2HVa2p2udIzC208uN9O33U48tVW-cOp3BnPXaeWe2BYvuaOC7LDAJ0FyO-OkZIpvCPOmHAHFbcXoOnAgsmVYVqOS4F3eBPWxmXVjGSQ_jfJ3YYI7chsk8gOh6Q3agOxmlBT0vcfS5e3nK2xZquT0h5k82cNx2SAgjkUvGvdE4WDQhRjk3m7mzMG-gr9rIrSAaoK_EXF7ACJY2LQPBKqk7qdUv1MNSRFy-9Kw0SDQSgu5Apb-4DD0tXFUaPG3ZOGKkexP06eVJLn9jtd1clw4XXiDFe-78jgoTPbxLalBVvUA6FkKkTBdAUydyoQKIo_GJwQCiWwUBE7u0Sq2O7pKw-msImJsNDFrxF-nly6HYK6-x_7DVEuJt9MW2fms3f_fKiqnebJG1VQwnM9FYP3yTVUInK18Y-8x9amifwhzGDwgDRuJdQQh2IsKLWxlGO_22Nsx49XDm0Jj5VpTYbF5mFPCVIQ6Dldp3YfopUMuyM4TRsApYOtOjDjKuId3CI8wBfpv7yOw6QwoRgm_iE8-5_9dj2T5c2uvpFfTmkt3EvrjRYWECSgGnKp-RGX2G3-BkAlXhhXDYebwy_5lnNJp6XDJpgZ6CMLvsnUY9Khj5IevKK27_R352rHokUao0_5D4BqqLKzULS1LJU1zxTQ2l79QONJbbuZNa34qAtFmJZd1MnJyONHo75J-VVpznjcHQmZ1eXprkyQ5EOQdd7DZF1iWME-41QnygHELOGdlCBVC93qA6jHra5f3oQSWO2hJ02HXAKFSr8fke9hmQdiqbpFBoL1W8Ma3AbTwe7DDq8K2dYFJgutgYtGmT_JEkqDDvXa7BHks_E-BGbWEyDAQwHddKfBXeCIK3MUnyumGYYeIK9ISrFg7d1YJ3TUUuOB7j0CA63PI-iRoQfLIJ-eCK0IKX8tFH6b75gBltmgyjjDviydXK1p59ar7CD9ePwwarhd6ulpEcsCFchCffkLHUODsw8j2SXZ8Ode33mVjhdA2yz1uaYBDy6lppyPEgv8I_z-tRnnASbBEIqT6jtDI3-R_ExvFx_e1lkSBZvidVq8Sprp31etAIYy_1jhJbRnoJjVj6uETHlwY34ThRai8PJFENyKegBI0IchVLmR8UluD5BNoXPd96xk4OMIvf2ooqBIk0ZS0BjPiwPGue47BlWku88rf3QPrIEkQ3D4o06v161-G3-F65rBrBEGEOAZYbIjYxR0KftLb2c1AAkuqYjnGf2JLaFgQ2W-bxNCNALR5u6jgM0tcoS2q6jzbna_Mz2RBcIYPT72J82qD2_z7IEBanQs_M36bHhINa5fSJQ06MPp2IZz6vtj5w9vqYlZsf0u_3TnSlXbVUhHo0RW5vkw8RSxnVVbj1FGcZ5WyVjW-w5krqzw3G5beUo7qv_zu-e554x8dUPBBM8QdyyJrzGDh96zk9ZEBbLwpcFB7wYrQioyZL3tkVgshprxjS1nLaRI5CEuWLjYX_0MbzrIhnp8V7jZiFrgDp96D7WEWsg5ejPm77AsELtF4O0BA2bWiDQXmgMVlaAFQG6Sp7eB9HiCni9wDhxXw7lVd_oRQHiGn-7efauEaPDBq814QhpkWfW0WxuPussiGg1fne37emRKOas4omwDnP-Hi14qTJETTi4XdPtXemGRaYDCL3T-CMxzb4R9a1m5-5pdx5MOR-AFEml9sH3n-9gfU7VazHYlTIifZLeMxZG4nlXCXs_uUzOVL0As2ILi-thy6Ud3UDORw7LH2-o0x3EmAikUptYFg23rUBcNZIUR4fBF2H5Ty4R_ULsBOrbDXq4l8G14r_XOng6wRVUz2k2Ldb1RwppPNGT8qRKNqO6z4WXm_tQwW5-kBzJnNKC-PBCYyukBMCpfzi-s1cTgJys4Z5kijB5G4QgsbAmTfZR58MYgiFBss7EsnORouZTT1dH4FN3PcxKa4j7pOwgQhTfzzIAwZcFtwPg_hZT5qA6cnysJFvf3uVQ_dQviZwLbUbL7yza7xf9SZOx0VpBCSEuzoc6saWH-f3U6BN_IsJVaIT-XW1-loN1zRTKh8JBUEiK5w71feZjfqy-fPvhFW3jXy0cXO6MycbA0M-yBx_cttMmiko79iE3KICjokGR5TI25m9UGP5LQndFTUH7mgeGGoArj5ly8RsfIN1o9oxz-k0kcdNac7K7ByrWLc83rD-6kL2vPRZnTuL7-VeO5UycIhZbHDFHDPr5VKiIG6ey5QMttwufkHyoRwA3f11t6NFMDH52vbUsbl_alVX2pHcg4kym5-XkjN9vcehWaQIJndwZUz-ZxkYpjWFWloecMStpakrA-_V_G9z8a0b4Jo3KuJ0GQxXdMpZDPE_zBVwVQ0qtnMkts84AEJfSARYfupW0bvrgPg6Kw3WKMc3uuBadrTB2lFA2MtmnkEe27Dclw_Vs1BpTtKdD4uaJ7oPaEsLAEhdJWh-9_5QbdvPh9TyiKmaXHr-dJS1KTu773eyv7uZvv7_q9nBg4yt-cpYVEX1IRzGGfh1WMFeqgzugxy6qK7I9URbmZ4rEiCf3YYssi16ZNztnYoNiYt-ZaSlI4N2QPNMlHYDpAyrL7MZA8gvj2iu0Q3VYNzjj3IxhFRr5nKLpNCDPK9inMYMmwpSlGJuwhkDOsgHQkYmMvStGS0wnwTaGhHI-jy_uKdezXJUlFYtfblFZgJj_T-jFHL_Y6tQjkYqcVzs0dKenhM2gfZKZC0u6HnRRif4wLna3Ql3-f-uqc-83Lsl15l-ndCeUC225UpXnKSFOXzQhrfe0WJgAxu1lCPlD7Rtt0W2hSXp_3Yv4vTex9qL6iv8JWU8Jjtgx_ZcPTSpIlVm3_kFkhQ7OgQhU8k7trpOEXFldultKuaj0wY4SQmmwBtzjApliKdsBtTacsWarQ4J12DDxdw52RYt7hr7_eti-4gJ61WoUdWQLwVp_GgbT1c4aNf13j3ouraR9pO1va6ZeKfNY1bRUTJY-igD5PoYUXKpJm3CyoG7TihzMeQms-YmuIXCH7g_0ZNx97LeGKQSIglAjkZoNp54Ex91DJxIo8WBAZ7rLo_bnTRXzyspIj1NYkQU2KRB0-PDLS5-SSOm04HRBHBroMyHLFSNT7zH44Q_PigM8gS5okZIgB2DvpjUjtnAy2vhpvuzUemBdQ0XXGn1_YqI4IJD8aJUXHxrnhbahzky9BWmJ2sPz2MZWwnCesXBilf4m5PCpZVGjf87oFFSiflEBEFPBr3sffATdIytSRXPfyqNusRyIWrt6GIxyV4RKUHPBZ_5o_FYXfB0C3taBqhnEOFuWwKKHAi-JhqB-db2XV2Zeyvtj2WoeaFwT5ZOuFHny8WDUkubVnQojYNBHR2rDnV2lYSt6XUIS4mEOZvwyo8fKgDRWbbqyKDIX-nUBo8V7J4itvaPODjdYkunKBvcUox4yBuIMDwMe88kyS6bR_JKKNT3m17ZpI7XF6aLVJJUmw0Ti48g13EgHuC-h2lEOmBayHsDQh8DH6QLLqMtczuzxkHTADXRYso3g1YfjX9fdPV2zN89x5w4sBZ75Wa_RAi4mIONRWS8z_alUgWhUQaWRBE_Ob_NsLXOopGA5SIRIVulyx_fPMNiJtQg_Kg_o2hT3mRlG-Ehizha1XRp-OVVZ_gj44nYNqJXUMnuFQJjSRUlirVIIw0RGNzserWfsfyamCwbgZrO7XH40xDLC6vJlYvJor-HM2B2fIo_gDBg-6P3nsUrdPWR7_OSRpcDK3eKLS0rveCiurPzFqJYjGsNidlQvTasqxsg2S4e57y__5q7uNxaFmGQsTK3GXJX1-gdIuVJGVlNNV34qsjnjWe37q6T8bHg43xyyIf7JGAVB1Wymp9QUf1cHbDiZwYHiUw756wXGWEh9IzBO2-ppjHWJ9paNj4hk5CQM15c__FaMm7oo5iYWwRhjv0h7bIIcjAQMBC5OOCDDCKNZhZssCMuxfTEUg4Lr4Jko_4Dz53BSJ80kZTr7kuupAG7BRfy1E3gZBrEJoSzjhv6cp_fVQmGp9tsHD3lKnqmhvwUVHH0Z_0nqOG6UHLEbBaf4IaXba33Em2pJkYz_YnSE0T5BZsLfMmACpx6LFwvDuiV8xveD7doffM5BPdIdBqxUTPDc0HFIx7miQpZbgdQGJ4EE0mfIX1Uwnl-AplQGscwrni7URAxqYME70YHHvGCChzSmwtM-klMCLe2l4ApeKEbId4e1jQdBF2umjIDdI7wevfR8Dti7ogW9HhHjJEprJccBvtb-7lFVX9pXgcbS5P3LTHy2GiGZd07FQrv3eEIDfUbONuIn4e2fMBUbo-imgF79G5UriG_nxrnbUYG6YbEdjDeKiAKfJuFaARvjkIyTYxTG1n4TMejALxIq2W2II3PgfgNx7kSrQRi0yR_OzNVjHWmy9k8EXNDIoG2ttgMq4wyR9qwboRXl7FiGA06K10IUm3RuQTOq8iWFJ85QmaAUfEMdHf-vyjjXRDf1xdLMYQYpaiLALLTV3sECBCi8nyeEuPlKqiaEru1y3mGT_5nq6OFbuq0uIfQd50KgIJPwMhqsH6UpVcRa_tl2Y6v3t37PRK97WazqdtYqwBrost_nN-IksiDrqJKt2CKrqYB7AGCcerEgTlMvq49ZwX8dyEv58yi7A-H0EtWjTBP5JHVD1jPfoC3-ouEOA6p9Lsld8XB1UKcb4i3niJNGC39SP6tlYYZBckB6RW9FTj0QKVvYY-9AorcRJ30w83ZYLFm8jZgzKGg80yqrmHQcobCtLjLgkL5e6ae1LQy40HeDoXNTTzK4rd0sJrJqYxg2axfEQuwBF9bM8PiyqTMeGCxW39uxT6wKXj7b-SUeq_YsyEoeZmuGUkZqIsWGuc_3K85d7oFB3VUqyBRgx4xLEQ_b6gz3GW3jX3KMyx8BFwfcPlHQ5bMuuJEjW9-yqWjilg0NHANpPVIPWyq_PAlmLWaAsdj2LxmYGf0Iye2EbTHMWCJ1UPmw9ZsELvoZG6RAGeJBpkmJmukLsheNOemXDkyrHEO5ER4fRF8LQ49LXWCkoGjUBXsUr9PXeCup4G6MASKMZndU6fGDaew0gPUXZiq4cwmZep9PcPeY8g_wfdCWlYRjJTPntxZyZLa9cTiBwUIWRAMHFQOYLhzyS31PxoQfM3EmA2KRGcpyKc3o7ck72FbtDjkxsYPIXy7Xq4bff1N_gySl268dI7YvDnQCZrDd-vsMQkdS_G1CiX66OJ6Gn_xpHWVCQ1pS9diWkTCUPq3P_IzKf6AkD_t_uWG1rn5fxSvu9C89AwaQJMMsJLvVJeJNeZogargDyKn_WmVV0DQKP63VNPqunlM6b7gG2o3E7exIWrAYCS5Z6JhAnrNBb63PGZxdgHxrzHleEn7u6qNVIGVT84KQVPxHyYUg7rold8XircQyC4m5FBy7RD0BmFU5JR3nGyZPCT0kdJMUJmu4z8Dl4Bc666lxX-tnHE3DuHC-BxPIl8xFEkSRSuYAElpChTbSLJ0RRA2Q3XnDECMFCtyVA7wDWYPw9OgdzG5jc887JMvVKSDie1FuZvVAs3LBXrGa8OHjc5hAMjK02kS_ISoZ5f1tNmN9G0PJlq1rLg81zYzUCp8sU6EXfn7rH1ugOuCER7DAYHj9l9ZYbwK8Vt3ubq08c28sPeVsUPQWWAd3DCWMBr8urwhoWzvEXdcguNX0sXjCPmtFdLxjcBl1-iooiafAnJw3roc_Z1MwR38P3tRxsvcZcvGeVSnIkDEeYOP_uMAJ--aLWXcQ9r_M5z7vchDyUSBJJBKk95m97eInfIK2rYKxkUbmhEa5zbRjd_goUvypWxFHuV4_F50PAKLKIPPXTlgqhq6e1VLOOfLajMxG1d8_8FthxUbZUs7-dwo-uKP1QcLu3mTxL3sxQuuYoDYWrm4Nmw9k5BhPIUN0jF6B1Ye035W0IadXey_WKFRdQ612DjTx_JnFLSOhUChFnA-peMf6ZuEoc5BhXgPBG0I5KWipkkZe40FKvVS4bmONVEfiNRXNRHuPsu6ItfxzAhOFLEDIXDV7ZJVuaq35G7nnxO0hkO-Wu0hc7Q3sZOVHoOgzpW9MiOBHuMNri5szCkz-PVayOLxyc5M8R9a72c-ycxPSrkQkQ7prjFc_2-TYT_bRo_fF-y-Qf22pnn0iJfpeI3t0BC9eVzmu6eUwU3OjO01lW5OgPtHrmQ0-onGADPOYYyT5Zt_R5yLhz4x5tulf3CSZsjZeEqzduCEC29mawwgv2WBiPy4NsBFFIDlBoVzWkWNQPOcB1YfIJktVEtwmcp9lXHjw6PbpnGFS75SuQCERbwNgMm-zbqHBGVLpnCtFUnI0hVK3hfE9BAmxmnBTYfb9NgNY6GXFhZsXaElhxVzL3Pnm5ZEA_WQzO6pOfmSbr4JMKsU831UjVZ42BIwa2PdA75DRE3HxuzUrOtPf7DB193KKY28iZOlXti7DEYiVQgYl0YX9NDyWKnHSGaI8zaLpwAzp_T9cphy8DhnKE5D02Fs0sRksvLxKu6jVfRmFewXP6xthy4H2WXpY6j8xJHBCm8I1xqn8Gm5ZUH3_UdzTh2HkYmHPAIo5Z0hStwmlWRNFedjNHqP2fZ2gfOmueQGudz1wi148yl06ajXYG2qTUYkpk3AeK2TfzU7B0k-CmUIfUF-8Ae_80XoRrMcMgtMwO--RRh5Jf8MYRijMmKIEn6NdTg8glg46bxclmGDlYLbIUlvzWXnJlL_KjVa3orhji1hzuE-Hiya2o8DEfO9OmNw9huajyqZrBeMEKpPTO4TfeV9dv2vxOdJjmyRwDvUSXryIrdqr7esLdBwRVeCWJertFwGtg4fZxRzay5hfvGzJDN53Nmvm7k-mOhEH12i_gUTqd2WkMhM7qaHSbVMlve8jwqGNNMfDhwyf7rSuBY9e8tBtYfCHmFxgHbyR4QB7c8iNVZV9XFza17tz20Yu1GrdIJuuSBj_O_sth3l243G98Lkrfb2dMcQxgZgAEXMlI-ZwhuP-9qKCdEJ4Gh1RxWFNfL_fdNKPejCgWw5IBTsazahVmxuGMAqJHv9ux7j-oVtANlljsBv_55mNlZfv_FXiK-KdcIwBZ9GV6D9iqgfDR21KOtqmr1XYmZVDUyO8nduW5BhcCpZC3WdN_dTqVJJ476TWVlBs6idYQ_MUFVuBBT3tJ9PfA5xfQSiqa-_ooxVoR9AMkwwaU1woqkUIRrdF-xWYdmOsBRWBiiylY3lc_9iw2SK0R9XvdOEqleO724h2JwqHT7UftfOk1rj52FsKqTDTQUIK1jDJ1CYoZJKJVoTDeiCLo37deAM6ujX0NgZILfMukFNxaMJfzeERfWgjxC23JOuar36RIIYhLLCNO9PQjmJFj60nXZm9RHFK74qE7zWKcptSWgaOdR89CyiHxQdtKp0uBwgayaUSTU4dUmQxwwlUc_LOWCd-OTz26gZTt2SFBzSaSUwMq6Gyv1g_qYG6aLy1gEiQxUR-rmJOrPHJKahWeIqSQUD-TYtbDDciFV-Q47rDgOy4yRJekPMOG_XjkYv4HMaAJ5eKafvNWyqqCbP83UUOO76IgkOVtfI2J36vqeJDhn_xCVIxj35t_LyEno0a3Nw3ZPKQ3QlwpFm-ht0WLejWKqpLgn3AJlPf2yO6CgthW0oOlBBBnqg5UQ23E2VFhJlS6oUGUn0lAxC2kiPKTeKu7dbitNixTBC1QUV_h3b-AtahUj4vc0D_PVTMK_MKT7jhADdRkc5R6M0Jaki9yQzl0kUvLSaoKJn1YRratNN4KUfhlgAdxqAqlC-awr4x4bydFcyHBeIzKLm5-90pKqIjgfxnAch5U31IBk9P0407f_Rn-iMjI7yzGZW_zkwCpkkeB38S-eWRVsfORpADn3CyRg7j3_E82rdVW9hiXPZv-0onMLqkgS7iDVz_rIkLaCRHsa3C-2V9lQjWsMrx9x8XjQ4zcxTW7ZBFsgCWyYOpYpPb_JwdWKM--pxKfXIZfAlAXQ_1vpcJ3b3Lf5iaF8YfZgD7AjJUTSBEwcZh8SyZl_ftq6uQ-Na_bc2rjrhSJIf8HEMTQXykviEL64nG6eVvyOtTsOQI_lZr4bkdsWiG-OrCcgJ2mUrG60VJM5VTa7452jIfzRnV6MAB6ZAg4hEzOR5ZLm8dYwAJunBcSfy7AXbVzR98K1FIkjF9DzNpWzpSEfuC3-LxfJGUtgEgcxAInSbZsht7pqcDY7UX7bK8RkMJage6q8byrWjFbJ0s48hFRuoND73O53sV37S7bcBBv8k3xiZSNdp0Fl-5LVbJQDmmBvMIINVNCj4mrcL02KzLVQ-GU61AVM1EgoDazPmeRdd-Q5QXE3xCIKN2pqu7YITWHvZ4WRQMiODmE_aCSWRAkhVPq3Ci_ORpkF3ERuzGSpT6j6-5-zgcL5pUXcYY9jMYWYbghGaveMTFr8rRr1ml6Coz0yCtabE0ZgLHEmyh5Mt_Vi7c6k-kSkxkAtNsSjHPqe5YzNoVB5lsQE12i0D8AVcZ59Q8vrbzJhOc9QqZ06QlIbWu89E12oxqJnxqT-FIKB1VJJVrnW6RsSwjoHcypAjiqADNrFxtaLG7mMIaM2X6O_hYxevn6kS-webKt82YLmUz9kDPBYx9DHNt2we53TRdE-leUJt53pn4VmKQET0Lx1cExhu4OftXH1Euavv4sXSgUGyerqB-x4kJa1uG7iS6LfbbUXhKppV1VqHcMb7qPnXPYDRFry0Is-Sz8TwUtgxCzyGz0Ybfx6KOWwmZxfAFMOi1l4RzYzAz6ymMlocRGdu8rS_oBOINSG1gkQlmUZ4kqkGSWAEEia4qQULCzuNB-HVp9Lo8nUXZpn_OXHSdjmOQk3SjPQJVXqAOsUBJrco7BmJdTcIBd-CMep7uJvqezhybmoa8zxLxJtk-o24HnDvzOB61ayK85uq7zv7p-kr4CdC2D2aAa8F7kxl5a2HE61YEcEdzjQLCyRIIRUGao18AqmB3Gz_HXRyxaxaInLGOKPQn896dGGVf7dBe9OQ2KTSZK71zYIgcaCmfotUs4_sFgxYT7zF3Qkz3BL_khHdJSB1ZaZ1zLi911p_5Sr3Fl6geJAHk8xOJUxXfeeC8sorQXNddvX8zGOLUvhcnEgSWqjHzd92YaZ8HCKO2xtUk3pT4In6b6xnalvFcMC0ypmDE7S5zsH6lmubwPKqkWoNnUo5mvu6UFEPA0_e99Rgx2M8iiCrK5vQnOAYzYHM93PDIPOy1YeieDQcrAsCkX1RVDQrwxzDur89ULw-4abNUcrllZkyExjX47AVJjPqWk291Wgo5U0cUSx01btfS0YAHDts8PfldIzwSqpVnMPLN2UGXWLwqheu1hYaYsTExe2ElJuA31X5hsXUPGRg2_-zjaOLw2K5UGE3OemPtY-UzqdkSrnudf5YfwOvJ8ofj_s5BLI_6SgndvA4AcYZ9nJFho6BG5MX1_LNa315zKzkqshEiQp2MazQeBvan3BYJtG6C3IljzbCCx7dm6dOzTGFd0DzZk6PO0VDRrYtujesAFublCRWb7AeZsTENUBh_UIKKrfpO8UbqlcPcZOP_P4M3o13KYZOsXft_emPFVbktYQM4NON_wP21T3IYHdl4YUh0dktLqJzQP1K8lZfGsL-MIjLBiL6IMI98gb9jhRYUnj4ZisVZ6ZlVSesI_JHFDI-IzkrVzOyJz4E_djfBOfEy8tWr35lWCxPkKMRvhIPJBFJ5fkSaQ65D0agj5C1MIC6ol7JyyjfBzPEV0QvslTJ9USpDJwbSpkua2MqfDh7OYcTiag0TZq-dtImuzWfosYU8cGlHedc1YoHFtITYvudVLsrFPmL68dOyPRnEuqFj6yW7Fhdz9DOTiDpSP1WOrRmuBDiCkUvpDp-BgqB9quQgyEkpLiHFAd9QpXCuptEbnHACPOKqtdo03wz8eya8U9sCC8DXUBZLBjctI5NmnSgTlGKq2mR9mAfmsLmWhSP2o-HdB6qWnc_PbyGCkNhfSmqLGmRXjNAWEIW9mBq1mQKmL0Bj4FiVvxWYr6pNq0vIDKh3Ztu26VxdYvJvqj5kWCrwUJW0L_73Esk8x34umjjWXjiIN35EWLSNfTOHG3jimvF3wvuRSmIMjblg_SqYE2sBuxQDr_Gzf-XfIM_ipzcH3E-hlqtJpdBM5lHFNI6bv5-7FEWL_mRcdYg6whdhy1mTYPzm4gBD7dqxrDijzmfwmPAGGNVRlo5Snz1P3hrDF6KqJjr8LFtSq41hSg1sOZHVthb1OGCgMq0nN03VPHEb0NbM_ifXYnBeHC874O67YQWGLUhwwo1JLKLymoQhsT9B1MIBMDx4o62ap9ys1TGdxeaSnGTd6ZHDqEGQktKWtNK_ttZQZ8eHJ4_EDQUruRuJbuuAOFNJSlvo2RftG7r64qa7qYOwKbVQRlaEJLMyje_Zp4vqb3YLRW51Z5T_347-QqR7H0ZypI6NeDNGyMSSJpBwdwfUoRk9jVMdZuFbQLlBzETr6Ha4fhVZl19kTnf5aeYLP4SSKNsQPvFhSiQimGRPz94Cp-YZ5p4te-_FoDatQazjkg7NmjQNr717FluUtPvx_5Kb8SshknrnQ53OYAz6rh8QPeDrjO9kYdUr5kljZxuGIqQ69vmKbmtzlTtG61kpfeMNVQiNezQMtNa2ly0irIGe0T9qdxWO56UTQRm_Vb78fbZAFz25IWmKYQRkxO74o6wlBL-G56G4aik0A5lDTZqgBPQcqYqLq-8o0kKTILWQaEU2C2Xbb0_LQX3-KeumjzQugM-iNWQduCR0lsOf2SNsbJItGVEUHcSfIxVksskVuxQqMOYxMmLhVqZ7ukoIj9HqC3dOT0JIYQ5khGGzH8mT__bm6Fc-eWV0T-Jm-2kavMyAt6B_aPV7Z4FrE1NgZPT5e0f1V8-m7Y6qBv8D24mDzHXkPV-oajLcuPQ0KUXo2ildW8229mHVcjw3H6W5-h9wDQ69S47txBnw47XPQAjPuBgCP_dpsKR9n-zAQffdfBVhEL2t5veIvgjyPOwMXgT_3eaXl40CTiIo6Sj3tnm5ZD_zDvjxDUfw6hntAGgEt9d7fHw_6TXyfhPl7DedBneAzgsB4NPoDj749dxrLg68oeLg-IoAm2_cbh1cMnf0YbERN-KzCd-QBGQ_kVaO-QomjeVvtUzbwnVeHK6mXqaFYT6K3oVwCq9B8vYQh8UXV648r5pztJDPmkMQBSMMtcYFLc9jkRVouUvZXNcgI1RRqjyPjy9yxKQfn4SdR_WKYofg5dEhQyWM4Dd84k0iB3q0NEI3OZzcSrEwKIzi63CSMONw0n7g7dJMFAl5kf2l-iWVEBb6EOEtCmGbguGMXimGHjxNWUYc4lh0MpRTPwBMD366cx_MSbvcucQyvShlFxmuTmeL5OwS4B551KP9FtmsecHN7MegkoLuMNxgMnZ_BwGI9B3IbE4Pxxtm9Ek2HDNaKLuyswpsL0ej9Iibl51w_dNgVuVjKd4IwgnlKdaPGEhxx-9e34J4TLDW6sSHz1-47ZRTYaUGdUBpuwcJJv8Jo47xW92eRxzId1xnMFZHMy8qO9V1iRgN6RTVGV2d_VbMAD36W9gOcA6Tx0txFGXnToqKeXeb-QbBFpLQ1K6bJXyxrTY2lf_0m55J4dMhx-gAVj5eF_xwMAcUILH7xRiUN4Z1WCHTBDK4SQEX00JjFS8AJ8gf8ZHyjL3rJWA5-MdNTwHrlLGxRSkqgH8wlFOflnMiB9pobcGX_TY-VhYMZh239daEbYQOv4L0duT2qY3N67hPlFO-qjl1oLNDbBoFqIRaUnA7rGljzbyP9x0moFtRhTEekKs_ywIqzTWHkzDs9VvsY5B_fdEGpW8rn-XN-1Sx-9vuNhguE-bVWwB3ZjjhcomJtr3t5ZHclTgE5QCqRouHMv6ZvZ_Ksakdi7WyXJLbyFiePUfaSGzk2eo0DVPQrq2Hfk-GFHwC3VZXX-f11SCaGauYaGOwDWggvBMiKu8Aby4dJfZNaq3pJHCnrOVVUwFWDPMVNYYXfY48ZuSL6o9cpIARJb-NXUUrLFtcM6R2YqH04O9QBTZ8b-5hJX24Hjfc3pAghMYsNk5GI2Hi552crk1rI_AUMS-zj4Lzz1njujesiGYYUWzfpyxdGit52IlupHopWAbSmBlshp_9WAB0rtmKsOi7Q3PLvB2eSYafoULJJRqNDSekwemGBh0n6MS8m10MWTKj8j67-jYOzGRG1GofBjltdUJSXPNBX7V4RN6vFBVqxBNxGKOiMq5CpBBZewrqZTX3Zxfr34tkK4FMSC7dtReEO7wqb2pVknHzrER6qmcUnF7TtrxWPP67ffVi-_ro1lP276Fp3wiWPWxILoHSOfX47O-HnCd-D6HPwOcK5wCPAkSepD_ZepL-vke3GqJSaYtbr41s6IU95MJuNEF9eCChoyAy0NpAzBlI033bo4Bq3asIilEqaUFaFWlMCl_UB7jUfYeon4fHPMn0Xy6oaSjZTsIum70Tn0TYgcAnStfaAThOqmKr2-BJlRmlNU1pRnRYewGY3tfo4eSiCDxGbNXFVjjRX7HMcx5d0ayuixTW9vTc9bAi572tfar7_i9zJawmkJb00MGkOVcs0EnIjq1nEBz-UCtvfKUEpAHIoDcd7qD9CMqTd-0MOdXojx2_W9ciegoceHjEDByTXlSPhqEsfAW1ZhQncwxUcDlS3iQdoBguxiCqWnrVwH2VOwtmvkvzCnDbobOTQ7V-IBhpzYrMPu2WOjC6Aynr17FDkUZrsyKpNgu-N6R7PNVmxiDcyQi34wpuNnthM07hVXDAVgmmuNmvKLq5oIKSSz8cPSfvYCC63bJAlxwaH0QhxorihMeWq0IqRkxWiPxFFs2vuoezJ4qay_dnrtCuJitaS9OqJstVusDkUJ4qj3rus_7ty5vx8e801eULFMJm-pslpVlMxNgLsNUGZ3MRTbUBSxbaizAXhDX2WPN74nmOi-rOpyJLluS3aF3Xd80pAqgFzb0n11tthiwnG3zRzWvj7-a2VPmccJVEa0FU7DWhfd31dT1a8Hlo6DcvKuMr21ggxnx_ZpH5PU7UxgMmPQFTgUjvoR6Vu4EWMZdMquGQxVDCXBeSsqDiL0lBxGZo9CrifZK02qlxB3Hwz4dFpQnZoKw_C1Q4DrxKif6OKDCLEkKgjNK-z7BU2w3GpvI4mfG_j4B3kGIzLPIdcl_QMr7dCOgLEsizVD3CJZN1Vw1-f2IEh5D4iDZyfeegESiSTFyFdYi-AwbUt1m5dr_UEN544NXZGHS2EdW5yXFxeGTZWcXsNQGc6scMexm6vZHYx_f5ibK1ZrKxtklpByDeouBtI3-MGFTFDGotjGxaxtVVfaYljrtsmcRkiVzITYCeeFGCEansrN82t-svQnfXDaXNQXN4EFcHhWieRbFrY6sHB_3vOOe6S_NGWUAXRW5rACXgiAgNJr0k-j4nH_uWWcyhYIzB_qAHEQ2e7dJHkJqBdPQn-uS4uSldXPtr0xSHFSlOZ6RmgeUna2WMhkUib1G2locVZLFb5PxdjgwBRjLpbSt88ilMiSRv6RhELYj4PJ0OmJXeUvN2sQ6nv31oJVkjXG_kUY2iUAfeEVD_s_7J_oFl2LdlQn4VDotCTxOTBlouOiks6v_UTXJ-KyOE9Yab70jS7U1Xyobw28t_kZC75TyxmsD3F3Yko_0XOrg2XJzKIOcsBdgWyS__4v608JDPaveIjr7f8roB_PPV-jnlbscNc4NAWt1s92cJaqtzNztGna3oV55TJP2DYsokrP68SRh7g8g4wYWJh8y5i0FSj--_N2vGJfWdl_7i-gpJuRt9dRg3lGPS2dwfWREMux_f3nfl5duC9eQc92tEW3rGcwAE0DibUNRMuCHBbOzB4ijcHo8r2OD3v2gq2IdVwcARANr0Y5Z0FCJTNDWURlBByA24q4aypqc4ZG5uaTP58PXbstre8S8JBhNDXT0WlqKrR-a6Cp9mmrAwxbfWAeTOo31EufL2INh5oKtzu1RiYEVrvlgeOz5rY0WjfHN7NXRXuN3jE10pTOXpImkQ9Ln0AJuhIZaRKrhEguefHh30DwChDbVVBeXkKoC8HwbujqviE3M7R3KOC26ag2vOByaSAW3Wr95sxZaxHqWStVU5mVsdBOu3cLGaPM-JJPCY4Ai830TUQhGn1aTRlbTKh-7NRuhHc2_WEKcXWHwhL3Vh2RhylxwwsDfFZRozv7nahbvbJXkC3lqF7DHZ3-sVlnckKBsneQUP7W9CxK-LJ270XSoNzFgUIjmX-uvang2NRD8bKDoQ_S2zJpwZDQltpVZJmYkGYbezIzyLnumcWVFGfse7sVS6FXEYjxJAfCFpN1UcNbRAxJK-qpydzanQsxXxCu6a3zB3IoYKeYAcNEyP0GGcbZJgLvQoZvcf08J1-tkEFH3_F_Lx2NmOzVFB7YiRFqH4K8uKTYC-inKcuR3JSGk0AWJyntVOd4l-TRtoBqk1izokDy8FvVEGBBfLF84NqGnL1hILgp9uFsbAVe8tr7Der4vLTzszKDNGvXbVUpEsF4tIC0eu3cy5qqpRM3fNJVvFOiO58ED5qT7EPQ-0F_JPeoY5Ehp8Vg3KuD9qfloaxacGxSZgiMSj4lC7SHjNP3GxaqaJlFGrZ-OaVVScazcCLESrAF1XH-e8cRlBSaEvyiMqT1Za3GZQVJkC0A-56X8bzaDNVIWkJZoq1X03iVK9XX1H_aUnXKmgFzIGqgeL7a_wU2E3yL3ZfIXyXMCwUTzpHpUFTMR4tLLLqBQY-qEe9aUTu8WOVkYvYSjd1bGjq-rdHfW757YaRlGOByoJjUSHaO33HAtxa7Nlyjc10kmOwKuA1Bs3JNlLn8t0Z-zxNoEXGfnNzAYmvSk2iQZ9LlrCjyrUjYXo1g-JisFAw4f-squWLfE3h6qZd3ErfWMiMO81wzdeDlHTZjfUG8BjNcWyhT1Z4gE_bAS0yzuBhUCyfQQcaEMZo4jGrvhiW6Q5LKzdqGXOJRQTKZaw4-tIW37DvGXrHuszrm6eohv-YxCLblegF2otD5TvXBQ8hD6dkCL031IpcUIy3J9D7pc3dVoZZyMncuih4GhQ-4HI7QPZ3Zfsjqkp8NQZnaBUXF-nVuEhvruPSyJkAVJYhQNmjGdEA2dRV3H4x2NqShBz1IMcjLFtvQqarW0CF4JMW_TfW9LH3y7s93z_46JHxx2lYqYret_irzLlGEWRyCpsmSZYkN_WwBrEgDQeQmUf7Orfsq3BEu5XoOLDuS7LyCDqDsRfmue6Hay7fmtB7joDPL8UCKAV59Qng3zBGKVPkfrkqZe3nFvpIrn89og5HdaOvzX98zh1cwb1QZzwEuiJihCk17M04-w0l9iJuEkXsTCT6kC3aYX-hWQZZkGYzoZwp8WFBSnLNZ_gq17QvNNqhT_umi0XFf-StZvg2j_pLORxCITam8L7ztaooap6SBLgVAy_IR7YbWJWKAOROq-mByxA_b2NrTiWKXnoIORFNNpvXASDcouoxTk8GfqHCq12lmQ1GaqJUvZb0-fJbeXTHpoJx2yUzSV91KIG_Y7bMvsNEnS-rEb5hYL_-MN34KZxtY9BCjvpGeie8xKmbYvF6C1_yrJ4_RwtL1UV6htxodroUGpGdAv4y5YAxP9WuuMLlhaucG7YSE0v41sN4mOw346DH7IaqWECWtDfzNUmRLgpL8dctpFwksvOfo1BGHFT1cnrhXaSibXBWU-00d3NVAqHK3wl2c3b8XAeOoQEt6Df40EHR2T9ezjBJDgXoOdD0LbrVrBR1ceIg73PsA2q97uA6rA7CtHkig6daAyGT_rYDZKKm1eG3-7mk4HZ12_10gYwpoCxOywUd3rvkXH4DsaccYWClfqht8k6o38qhNOqD6hG0dc3mQipG-ifsOeXW95BlHlJbAbC9HUwF-NlR9v3PWuIJxXzFTrtXr7F5jHVsD5B2Is4iSQUGgKO7kqJ4EkAAEEucx9CL9QZgptVuA0y9lCjytbVC2noNpXZznpREeu6bK8oneEUF5Vsx4-RkDAD31Iol3pAT96HbCbGPqSZeU_mjdtFpS3MbYv9R5GCKW9QsgyvGrMuRbMaw4yiI8e3O9w-oEZ4zfmVJirNGahk5VhnBj-H5jbFchvtmyFVZAlHIcCyQdnd9XWNZ-k0BVfgWAmMoQlWmC22kG38C-V6ZUO41qGHUXF_M-ja2ddKdrdFXn3zW-mWTjgaSYjNXygtMbjanu9hctMf_3UZXHpDYFf2EpblEFKk8mAsCoWJbuOLmk2u5CcpJ4kY1ybWUgnGdqBSEPf50fDLapFDLhBEDwcsvXV6IU0GA9oc2Z4bGoy-3uRd2bgA3FgsOX29Y1kTEUsH_6_f-anj8B8mnaFZrvZOb3fRDzgd6NHb3UU7cWwtIBbwpp6T-8xN6hFhRCdOXXn2rGyrQMGZcXBQkKjI0QPeZI0-yxDnCnJwn6eNLsZirfGfPONJu9K37t6knfDsf4f_QIc2o9deNTJVn-rn-t9M4QVbQhpq5RoKzveZyZo71GSvwB3Aqf0zGiPTDlUJGxddLOheBVmY9ogLiTx-OxxiQnLdKIKkDygoOC8HT0QA_mN9sWFQhcoDaiEKbrqxb8jRD6z8rINUdHTAcrz6h6nHyxrMEqsud9wLdviPK7X28TQaoFUWuYg37GiHzRMLX5waTzXA5J48-T70qg63RILLdVfwwBi9DV83QfGUix-qZ8X8tq5THH6e7QtZYBXlE1Os_yMydCrZtpXeM-vtNGi7RNaltQviFQYGtdCCk5Dd9wIqxBWSro1mMlQO5exZktcQiyoB79zd7ryu_ZE4U-ZpWqRGe1orynIPTMRwwHlgEs55GH-h4doWXUrfDVUFaNCVdQU7IbnQgrxhn-5neZdqOAxmlzb6ry5Wdb9jr6o46THPXdcnBNMrQBm_n0ZNbc5YmK5xH2wHQrdrUW53bq2IJt3RD_pYEgV4x7WYTfIeUp6XX0oO2hv4oZkQF3rOYk-46j9W7BpFCTTjBK-7bx3gSyePSECP46aiNjsoAGt35PbldnOpuimEZAETFNg8lVwIaVnkChMPDCvjZcCxpVgwFVu2pE1xR0JDgGj5Tmoi5Alon0IaBh3EhXAOFSZVGfaPRXFE_o2q3zh3a6ObgWRPT1Wf7eDEvUTQFc2tIgvD6sBF-XTdDckYT_jffRJ0toVx3PfU-KxMeb94mX_nGMi11Emi-vrJ20kUNFB4K-pt4g7C2OZk3H49DD5o2GLtzemnBOkiOdT5TyGQptuqFZPqA94WLbIsJhUK8klpaeEZCcZncE-EaOr6ooMUqx0ohQc_li4HBB_ppXZURaVidjg1Z7AIwKGKc_GWiXcXVGTwTLkGvFjnYN7IRvCyKN_wNyIRn7yLmAm1vRHbjP4p7OsdpGkIzsZTYFCGcqFrtmpB3ccGYhRsQWJWnksdscZ0ZabI2mhbpTkAGUZSoIgfqhdwvvEecgkB1G04or8SlI3KDHvY6ynsHznT8dycFtJytJizgg_h8TotSQVwp1nFFeUj9_56UYbsAZW8JtqRGxjL1xlUGk91c884ZikEECmZyA57m9Sz6agiYas8R4sjh1ai6trB_b5qRjOknaiy2aOUmL2vN7uxelluvRMC0ZydWtXM89GzHyObaLyNf0CCvlm5lgmPzIYDAoQlApn0mg7cgO72vRrgmOvTw7cD9XJ027BlUITJdQ5duyuo8HyE72_WeViM1_Bm-69EoKloLOygklJQDMJUzPZwWT5D2hTpjTcQbraikLRqi4rxqjZXXolaL78HqjYiSgM017etLCd5JLeAN4xTYED2uc4jpQCJpnGHbZ4A0VdavEGs9I4oVGuSQNHRsYHYOjOipaqUeLJzYxaIyp8DdvFYQYD6D6OAyG7rIATq9d124j29yYvZd2pIdhZ9KI6V3uhonzY4uFJHefoRM4o7L11Cg5077xIFLHeawqW_ECDaOh-3gJL7S_zhdxFD_64Dq--5VHMZkqBgheh7K4Uauo817bHuoKeAn3ff701n6HCIAO7kBOuWIF5Xiv7CkubFveqkBbj5o6qtmWkdJiCbb8n9S7kyOdvy4PuocubuJVaY7piHHTfsJigKRhJG_ovRDjv-y0WvBDfS98YVXHWjcaGWO8U61g9sOeAtSeahR5Ng7Iet_UUmi5mRn_YUvsuiZxw-BZ3ANTLUmImqlJ7ZC1esEFvaQOWgPIoS4UkxjLJ-iAZ7DjE9SLfqWzV7EwhhudmAHhcaRDmkfBvJP_NTjVBKcP8qve6PEEch94qooK_RWNqykTcn-qld7ejd6GwGo7znie3MAsO-eMeZ3HEhhWvopv6iRFd-Bx2O9qglJzhntQ5yHCdrIq4olY9ky4qG_TUXkgHOLs3iciNhxOaQDk-wbJtx1LpOpinPjlEB3voxSCH_C_Ze2QAzvSmdogYJ_9AhdNYE5x5-LLdShy70UL4_091Kp8z5EX9ohlf3AR78ct18ogO3kiyeVEfQbsbZP4zdYReCTrsyqqsBiNj08twlUew8Q9xjuB-tvkm0ZISpW3N2btKHZBPAt86g8VeYguSmMh0u5o7dA1-BIii6LbGn8_OoUDKczeAS9JuUB1Xxmspy8n2w-zgqRtdog7NuaGI5HgrMYOi0XZzO8rrbTpxFZrxj0tbb2Zq9VT2J01JVs5gVH6cZTG2gVKVwcqFSfF0sZDEiRE-ayyxkOuf2rMx1i5_w-VS12oDnjP2B15tUm4Xrxz8MjXimYIKSBVOCksfb8UsVytBDsZ2WSNRoyZp0TCvs7VNfloYsQ5DvTU7yxdbYQ344WaD0zFipqK4mWspxPawiBpn75aiFua-6uoy7J_voPD4iDTRjyrzuwkoErR8hNfwdqoHf6zdxvfv9r0RSGHkeo37Qf0u642nUvcXTvDz9Y3RY3xTFxrB3ChsGhKKyC60j1sjqMZM59hJ9YYc2Urj3uP-6YneIBBP6tF_g2TVkI1O8_HtJm1OWMhCZBFsxn6MC1-PiFo6A2w15fzLS8mRFbYMwrovO5hYMzb0IGdwEb1fybystNSD0Z9oz2tTVHGp31Cd0Z-HGAhMS85v7m62U9ZEq8gfSNW3eeb7FXrQM1cKNCYBUJAPOx_IpdDLFr7HmyK6O58m2AAWeA7OGnDDsfp4ITGvnJRrSuVfBKRMGHuq7GNRhDKntXFvVYuZ_0qW33XJFdxtv-PK6eX3b_tfBi7ndy0EsGJ7Jh7roPzjoEOifJJjk07a-ac8vm3wisR0J0EpnUtQlwcdhg9WcXOYPu9ltxztJI19k4SjYf6Po-6bEiyL_x-zWOtZHR3rkimBWdp1XJDd6ariKs2vqiEuLpMtK8U48MysQgur3DIkVDGZsczOTJ_I6KwreGV3ISGbci3_5Zufh-r75CvZ_QlbLzrPckgh-AG7UAHn0iSmxt6iWrZOZL0XoM8QgtZ9HcjCK17wA8mfI2zjfN80tyJGcR40yWP7HfA1IdjqCxF1SZwSMQabQX031hb9QCgoCzxXIxfHHdYAxvcTcqWHUl188itvq09pc5OOaDyb4CSdRGWwej_dG7LueMAPGzPP21ne_MXGUcMdTB1c3-Kmh-a9szTzzKSrtM5sS8MuZzPH1nG9d8qOYDeZTPQXiJwjghu35u9WQT5QoaAPIcJGECtlObWSzsNm42S-7n1xO4Vhe8nY3Ux7gO7cwOornZ8ctXfus4or1Ph_4tb2wLWC_hywIns5mueGfcdpuQR5mw-QD3Hy4JKRVq55taPQC-w1KGxiIF4jFeAs-b-X8blWtkODGGgNapcHWarAMrfDgLcoHo6MswOTOyOticFRlSGdzTPyRKAKX4-GloekWH3uDE31w810AkDlZTAKQd_CXYL-39wn0Ii3sLtWKrllEvKRGZIYcJdNPyHS2FiIbl4lSW2DToSvwbNQnbk76Y0E8aCICcTn-eJ6aWsolV6DGP3DUEY0_VQsDUDwaQ4BbzEM6s7qW-FYosRWfIPsasahL53oGHhhEDV-pmsBhP6DIjwUholN303pA2zlHKuh8kAdWkI-aTQ7-qc914BOtrBWuahROY8U4nv_-abk5uArCbtLprmPeVUqkvUySU4dmR_s3bs8wT4E81G3hFuQoW4y05CaSErZP5MNUIPIA9_2xTLNm98sRnSu2MjSoDwOf2Fl5fiFSNLOYfbd0Ew_zTdcw1hR245O7-zJsYhglfBtpNwdknC2wgNlko5SFBnwXJU-BVL1ERckOm0ZRZFMLepbF19T9OBg6uidnNkKDdOTDFnuGUImRQfEUQ4e51TcSmfPPqu4FFy2cMdcDnZec6NR68_nkAFdhIR6czXqqSaPyQ7DAcGelcQm48Ht4f_cCgLJs9-x5i_XiK789j7pnzYCEGM0NQwTedzcLa0oh8IugYd3IY_8aCFILXRWSG9ecsPcNIng1hKizKdxozxtgx8qga4AMIhWGEUrEd7nqFyM3uU2evkb8FLR3jyHRzqYaVK0iMIdcr5aLM5YSBp1gOhOiN-SkshSIlSSdK5NQeLS6SSutZ8b_IkYmTwQeNCquYQM_mq6vSth4ejofLF3lauCR-TRBeLFTCg3A9pfKZafVEk0UrVqZVqtIvXZ40O6KG8oD6N0PTJJCGIhTorq1IP5llebrvaHIezecVeb2dxR_S4RgS3KuVgJHHvWQgnI-SDWOOcra62Y2buIUYE1bdP0j_2twS3ud-1C83V7kra9x-MKkiEeR4Bu9dPfOf9KgD67thaYtBTOxYJ2r2SYHU7FaPcdZVjrDOZ6oWDQ0Sh1M02AQ5IJttl4A7zSDyUpTuU_nfTJ5szjf6cKcGEJu9c5kZREebXhVemH_zX1AZakPuMRXMakrEqSMQDBvRUuXNksMre6N9TGiYB9almoGdLpLDvakTOZ5j1qzzBRXRr1_MZ4uGNqnr6CKTK6CSVSMGGXubaeD0p_8WqnxZy4DvkElOevHI1KcUlo-hggpx_EKDPe9MzlTQrEsPL5JeB3BrAiKJRhOZRNZU_P9Jj3PTfeQbG8osojlNXQoTyy8oJ2pZsD48QjqzKDJkvaIvdtZAW2g3KqKpsJ8VQb-TkQhi59u0EJ2rYImdg6ScRhgFx3LkyKVc5hp2SpZyTEKjNr7NllsTI2X8FRG7iIsaDRWDeUZj1o3jwB3SVtpe_GK9qZnWQqCopYgnz4M1kDWXiAlaFLJciNbJEJ4Z5A72Ed8EpNJQ2EDjoVkimKcxatln2aD51YU-VSJo__0k5jxY1VUFBcRou7DBXsN0TLOxqXOOGQ6GW_F0aNGV0gUgfScFq-Hzhf-CJFScnkHhstK1wRHWa7vzex_WJODfKg5aJHrlZJeOKpC_GA6wLMrfkF3wb-4oSNLw3kXfdxyCwK_pZY84Cm05_4-e5sde6G4t667ayhowva5aIENcdWxOnw2y7gEV9LayUD0-dWwNIpL9kj3C7fBlHnAjYhld5eeNtc2vq7lFj7NW2GMIC-pgao0hwi8Fw2_t6wmk41URDHs42kizG4j2A-Y-w0BHCcqnfUBkGq_w7M0-tQSa2L1smeQ8AljNLb8rZyjiEPO8DkyioIp6lZ0iqmiiz8n9olcTCC7W1gL1H360ApXYkJRwDm9RrBUVTEQGXI9KLHySWdtqCVdbc3MC7jStKyw_Hg4T_8NGi4JX59-g87fQnKY3IAV6PJ81E0JsDOlaIlI1zRXaRJ3-EKovllq_ps4pFU0zHtVSYOwnPBlE7jVsVbXXLhCfaAk-b4Uiia2jeNhb8Hj2dH8r9I5_nXVwSp6801cAe_nQReCGKW8tr76pbG4uU5UwC-AGRW9aiV8NZkLs4HiuJFzSx8R99Z9u5Ue8SIocPoY9dkkIy-BaimgoOYgWIwDF3aQmYb8TA3Hj5HTAbbbvXrH65xyMGS80BmA2NyY5gOL1N1k3Gdc5UBCxt_IH8ImBf-WYq7r-ITYEy9Eb-pDCwqA9r1J5H3BD5ALjKfp9yIU0uqKsqbA5DMF1ttlrzujAuw907d2L8hwutDUGRNdLl2DEEpqnwW9IziUS68yDbjhHUCGutGAsXPg262ez-uwHHAgxzleIb420Ciev3bsaWFc1tcKH9WgQHayKGBOOsH-MbfNxJNzLfXcNHubKgDY-YFnymkm6zka1JDUKWK6U0zEt25vzOwOlPPzS_7mZeXwE9iebaO4f-hb6xwVBeg49fuDh9N0Q85dQooqZj-rKAUn_ZHTpLDW-bwEgy-ARFr2V8wEEYYVPHG4VRQKrcICxE-w0-stq0Pyc8wEqowAwmHWNtV7LM-Ifqp4Bf4dnOnH1Mo17WT6TYmdRwpcux-R1AVyQlz7bGaFjvS01eObV1K5FXQSZlaNNs0I6vDy8zpaZHJx6OzHQQip78w5zNijqttBVfSTpnSEJFmH6RYYG5iukkcpyZHo6M_TYfIGiQcbv4-yXyWUU-0YfCt2d2WIVMzIvfyFN1z5h_ww8YKtIxPLKzJOhgXtCQ798C94KHBD3Ewe-_qBICenWDohMcsFlxoOVg0XVvmU_TeqbHkvLF8HP74Rulm9hqi9QU8qKhAqNrXDtsuTSwkluYFDaQJxCWQTOHk7ybFcUGi_2sL2Ecw-Q55WhmB1bFO8mWVL_8frtgCufa92oEkNuYHetLGf8ZCA5DvgyXkJI-LboEsLXAAoY30cBczRu9PvNGWXHTKw7f_RabpQ0A8jMDgGO-GiCJJ8fRYPJxbNDry_Q-NSMSsKbGc-Fgu0DZ2qsx2kSwI9M1g9pMga9koZvQS29W98rgR145BZKHGFRsrkW0qlPWkdxZgpixuu9srJUlrJKibrvbu4415TCGGA5Ac1AN0J78EJIBA9TuHTMG-yuWcOSP9nRJaGFuJqIAH8wG92joVR3W1FaB-T_f8yD4TXwRQzNgGu8hHprUXZ8XOX9fAjTTN_TuQZCZf-PM75hzPSnSyXEzdFvoksLX6b4L5-6Xtezy0iF8mHVG9aCKvySXv5Q4vQbcN0SrLEzEOWvXYEv1rvhQtzT4vJJM5V1psgtxmqNQMIGKKIq0298I9gdFo2cN4xhI_U-SZoU0L16n-Fzgx7Y1WhIRU2ISErypDGYQ_FqdRNaDbGeN5iqNiQemtxOWRygjDuGU_ZyT-kwS3cKr6o2_vZyMx0dyfrYliANtua6ITZc8PC6FhWWMig2t3T3s-l020kd7EgUCGlbG3e9cS2qaCeG4lJ-3z4PBvLYX9uWP0WWrRHCNwZqJEs5f1tWCCEuUoG5wMucWXcuPL3C5B0jxanNGIfAIbSFPtiL1CCAhpFpwsQhvcRC8pV13pQd67hlcVquDlW26FJWkTQ5fYC-ZIUKXzahzAPXek_xRjTdl9LgsM9VDA9Kb3UrNi4_TS6xzGMlin2uauR63CfJkNVQmoULphMymNFBbjSf8HKMf7Y_C24Meh50p_QDytwNxCwOFuhzbgcLtS_h90eBCrTU3cWo5fKhDEJyZMuVOhwxE4TeMrt3mxXNIUKB2BFikuh_AHCZsbF1v1KKjIEZF-o8RCJtM099qp6wn5quSU4NsoTsWab_ncsxahXGPPHU-nF9D8_7V9-osjQY5OX1pLCdKJmCqipiYuYRpJ4FQJFfg8NuFSdyZA9NnFuR3erRDIjOEVMtIT8jnUYPGZeN7gSyYA0rxBXQQtQ6DrNXEKGVn_vVredWUQcGpTI1a8IxRvWGC5LSri2r_1OuQ4hNKcvgMXbmFgOAo0Dl8wbwqHQQFi38ECP3EahENVm22C5jhV2uw7BLbuGG4UifkeFD5Jlc_KbiND0J4hiJJYRfImc4byFOzyaLGNmMeqw3IAJ8PykzfW3TA9_pk85Y9LOyO8lCRiyQpZ48d0UePoCsAiY0NjcREso8VEArd1Zjph0kU0XWBMEdlD3uJCGWnmvGnn945HOAT9b9RDbqq0aoy1uwNgUkqxJSwOrAHYsyeqvnBHd1qtaGlawKpUt_HBnOtypLVn1RDopciinyYl6hSMJ6oC7mQ3PT29nr6FJDcd80jfYwvx_jG20EDpxBFNcuZrg5vJrPajpEvlug0dEW0ZFkdJ-XP2TmLI1RdipWKj2Ig2LSevkBKO2wjubMoblvroK2xBU4ldLzjQ-r1A_Vb6ZZkQk5W3M6vJqQkzvefk-_fAc7EFYWY5U-ONYK1BXQr2CW9-rhw-sUD5okDQ_KS61_ctD3lTiu9gIme0xrCZh3zDfVNm9dPzqFtrsFUBZzm51GGT845HvuZ9GgZ28yNCjOyABypzwAO8Y-toi935-hE9XexE-7oUJ4Yn4GEuyJSHhJWlzAMr5uVV7fYXQBXRQjQH-iawy6qzXC4McN_1kNnfRWva4qZHB6OA_YXbIgUghD-fm6XUcI3Virh8iOcsbwaGBvbYs5_kVcRdFhbx04JtQQp2o0tCbYGQXwqzCF6nVKW2BbcA-mKMVq0DT93qCIfDSPRHbLXbNrJgMpYjakKL_lCo_fj8leYW3A1StvlDDjf-8UAMM2QpDcY0Z0VuUfCy1NUQlHKQpN2SjUEk5AGbeHHkxVulMwcO8CvbOyfeWXDR9e32cbC1LiLLODkpn8zrHE83CDgSPNxiY9b2mirZJ-HSdff6TbyGNbJnUKYUEmTLEpYTeLeiTYvqzOGS70sZw7B369XY91T9DLcHvcEzkUsStlcT-r7U-sfa6Rv5g_B3YaQtKFcMoNqwQjM-JM_9ffn2ll6PJpgjrfqg0-IjY2tT5OTNQTLTx5DoZMrJjUdvbyoYM7AtFwW_g3UINu6OJsMYy5qBF_NNFU56BCOa2hg3vUxHFwzu41wqqOLJ2DqOanTvuouuYrefEoI0Zru5MzyzYhQkQHzRaMH_bFYv21pnoenSdCCa1C7imS6LL4J-loVIHsttY0FPcAA4KHdYgXfZWGBqTD0dB9tH-1K0-LqH8AWXslkbnYQaUlwysSF0ltw6BCCLPIuhUFGRlpYB4MberQ9ae0Tnr9BrkhSA48Ai71qgMlmt4X1-GRmlBNLGf-FbovwRU0i_KnhlDgPLMxSxv2eMChY7DAuA2C2yqR3nmMIMdpSePNdfKuN1qaZWIXtm-jiPd9H9HZ1yAAfeV2MWpmttFmsDXEhCoWw2eb_x5SKna5DPYTD7VLBQgtJBtgf16vgEz2FVR-DMR1rc1xkfLzcqu9SEBNgQgQffAZBcLutYf2Mf5Cj-tHKaI5_cw5WT3hLZoFsamc6U-U_sw5vL7HYYU65Gllq8gylk9xqOgABmz3Nj6fO_ugoAY2RMj980UYp48dzmFSxXMxDgO9SLZoiBOtBu5Yd-R7P-XCm-u16ircTUMdMGfVVMdryC5TEcdEQIeHFczNTLxhN5mYbfXLYVyJ1h-zFWUSIhbH6ualdN4VU3pCnUc3e_43Vc-x6mnrKjG4b3uzndXpWj4OxjZEBjiu45eztvemBwDhh2QrujMdPpFgVSPJWBRbWih2NRSRBgrj4lxImiRUDyIQ8jHXoIY5qjMg61NFoJRzGPD-JWJthlyyEXJiXfDUZ7TOiNZXpKnNvkwPVU1ZDzX-Zpr35sC8L3ykavj-P1Vg_sGIxjcnwiH_V5SO0ZaXmV28xgI3LUjKwtxWnn-p3DjkMm-GlFsWYRDVhhu0xMHH_XNw6kd26kGqg-wkPHq4lYIxJq6Bn5m5daSvxXThOJpqSNiRQjjWzrfl_tprFKoOXE4ti7BHaM9bKWFfcNLr5zDMwVU4cY5bhbJffSE9qhoT-ykqC85Sl1DfTVDkco0WOIhw1Vh-pU3wZ0-4waHk2BG-GpJ5CsawqZC34DKgefU6eAn1PahKWFNgETmrTKZ6TBIRoAiXJm4SFx3djU2gD3te7HluX-BgMq3kYLnDlGPJNHhexci17sd72psgRbArqzGik5kaTsTtAl0JbChsC81dRhsER8yUJqthrydtPidXqSwjm0JEP-ABnAh5HdDz1D_EFGX5DsJ30fNshCRClyR8vX_2OYKL7VxRpC7KJKhN4Qz76YFPZlir62CVdvx40cIl9KSrSWi2R56mGB_wlwrRCSUEnlCiEOqvuOjC0xiF9yl06mwnTQDlb3jtKn_FEYAm1HozQ2wrLlbXju8STnmD-giHPNwAn6UEkClq7F_Bl7t1uycCjgqiObsbuZ8Cw3NpTIgfIdqUCR151q09uaoTnumNHDvCmMQprpP1mi3jP_W1RtLUDkGOwhRmR6xNoxKQavGl_ZH80eN6whblJDa_vyIveqhRVHfpbvCM5pnqxZyRUOvfoYwsTtRSmp8knNEFAm33RCzXIu3t6VSUkQgBENhq72lbHuxbzKRQ1RBqnmlsRja6aQW1_vJ7cIbxvzsc9gqS70Bjys5dqHu9fHbeOPl7xvGBoM2U1gp5YnV8tSyOtXKl0I-Vh47uKSwmKQUTGMnFoR9aWajJK1N7fusCnL0WNcpSnsL8l_EgapRrqCDgDKv0rcrpkcppHp-D7X2l4E0Lt2yUkNtjcycsnV0JiXHMRLvt_EUUCUg_js13syJgFugDDJrEyTx0lfQUn1pdDpesVNgQ1bw2_ej6vcvM8vg8jGpjqvnfR0KBfYq4xoYojDyJ64hmuFiYBuXQYEhnVoB7QLACn7-AgqwE0F8FfnfewFzBLvk12TwmR49jETPGdM0ICleZ7wTMGyfZKIkMBY9FuvzHdCQp3onDntTnnk0o3rOprnt2Afj6_sv44Sk7HBeg87D52dhev42JZNSyazTWmKpC7aT801H223Q0Y5P1CkaRqDrCUYiZBVmEd7d5P_g-HGmNOPqLtRjv08L4ezYxVU3Dqb-yxkJDI_e_VQkDy_8U7yZbtl7IPZdDVVHNan0TvrGoqrNbJfjcU55ja68TTvcRyGmLLzpDN_mqxSMuBMpSocwbIw7vF9xwqoMt8n27DguC4fmOt8lxGO83SDkKg4w2P40DTuqS4QhYgeY18qeB7EJYarkmIAT5EZS0ND8k3_rlEKFXMJ6SDVmgCyyKgdTWtOeH_BD7q0EFT8ICaEKDan-UpxUkpKjLVRpXyGP_KKHdIhjZstVx8Jbog6tG3l7kf_aiI6prksuhMFDyEAgZwTioopkiCwGoU1OXcFyCfRfoC2fVfCrx1zvt9dI0eNyeLRsGgplWhmphDMdYwySZ4ZLlmt5VFslz1Zr_Cr-2Yr_RFIbwrGpHS0XYdSp3S2z5j3L97I-o7wtfpwDO3xFI3LQuQ8qYRoX-YhKlORkt1Z9FCYhiI3ggeth-cUX-9UmCHjdsEdbe52h5H0pcYwUpCzso7KHC4paV5vPTaxNj10nJ-rqqB4dfuPpj62QpE2s2M14lK5-tacVLuRn2g_6y_DJfc5wjPFOFpEBIPxp65dXSP9XjS54OPrDv3oJdTbvi5X8FxVeiJKthw66VnktQfuO4Qvu94j19LMev7JHNpOOkuoTvZNwtKztj5GPEkfzStNW2kGsNnB2A6jFtKLq3EH-OidYFehAdwtNfVCdOw2MCPNcH8yp-vvZW1YTROewts2bcOmz4tp7lQ7qzmFSNOcP3Keh75YDZatbBH3YYMafSul6R8xlylMumT6hQeyB0UxdORpXBf_mgjko_WoCYgDs08amsjrXsCN8dai75igLFmnehqqu9O6-PEFaJYDbmGOdg5Mo8wO-hNsxWJpeR97ytkEyi5AWbkd2V0YraluxWlNM1FE5TiBybbBApSVPPernHJHcwjM-4q6AgCSK3KBpg1KN7HPAixOTNYh9PlgjPJD0-xKwx6sIeTp-6HSruqDhPFmBLmfoM_kCwavPaQ21-MOWEkLawl_d-cpr7byq5NsASqKpbRLdO1QL3LUEvMDeh3y9ytGKswrkicag3emQOlqej7_Qx28xNh6-Xi4P_1kRO6a0z7r5gsZoDhJtKGT9tz90B74SAyNgteWUihDM2ZSuxgXjMb304-Ryrr5AqeOnTTBFst29dvdNeo41996bM6rycbz_vQtBl4sBTnXJLZ6RuHw6CYHNLgDhTqjQHrgt3dthkfzBZ3SsttluihW5NG6YnP062DCLPCl14a1eI53eRFvmrFRJNz51omdhwUHGhlFLgpT-RinNHd2weIow0T_-TMZsmG4-g3Wc1cDjHf_RLqstRoQpDi-N0qbZxxpxog4vN_3i2FP11Nr_uVC_aKeC-wu0gyZbWANtpvAWT2XBqnldvgzCgl8isg28KhessLuymQh6X8OVTmnI5A8oDHf5XzGEtY8UEON9VtXRhXy3puLUTlG4S4bZP088kVCau30hhn5QfGS1EpNqrUXBBMetH1paWkkU6Q5T83GBjDz-6XgH6hHmEwKJliUa9ZzAJ3LtMSsImW6a3_9e3nBXQdLo9jgXX3jAb9a9Jwl02xe3-gPey2a9CaxH8MzCbInxj2Lcjml--271wVsOp7oFVplhCTYwyzG1RGIwthy-D17j6MoUESVJqPWQj1mAvmtadDOYo91evifh5QGi2NOkxOHw0xQGJxMJcDnchUulM90hO7dTNt57J4LwwAkSpQNa8kDO3Pm25zbOzw4FItIU0PwxtB6czKSKAWLk0kczOCLz9hdWhU3zSbu6rbAXf9DzKxSaFGwvI6Dt3pwdkt2VS-RG8fs9Mdnhu6Ekj4LtZWRCpu1lpTUJ1-nzl8u1kLvovDje3Otdsz8lvguV2VL42THrP0Gm04oWrAd3H_hhK1wiBPtY1OgGnys43DD6Fp30jSa_AvfCxutBn_QilMHBY6w1vlOgqylJTVTg6fKF4sYlg-WseLELjOZk5BNCPDBPIMWsp-6kXee_FkbmpWUnJoSOkx4PaBkbttMV5r_lnC6hDXLKlmij45xAcToKNRVJOjkIWcaqccao13SAXYKiIMSriqu7Uw0QfSz78LLntFV9N0aoLhWIssGW7xjIMVDqPETlpayV-ZHkRknnpXQ-kVJwFxeK4KzASO54EcPZqYNuEc7PkR8gvbZ-eomFTChDFwiWJl8Eb572foIMcNoM48NcvR88wW52hNkRLFikPtA10P-6CZFvUjY2TkJdVEW-7JG7EQPnQ1N2wjn7WjbqLFiEVQnOfMhV3GtrUHw0_Hgs-532ZyuB5Nr9ZWhBG-Mux6mLQ6bPUUXrKTefLaOj4nrLyYvi7ClFhF5Yj57s7MI5qieUgaHsHEWDdBnOiZQSdwffNbkr8uoWgKzQN3o8oAjY8EC0dEQjphvu70uokAw_4YIKMZ1fNCbUlYu8ytva8B_a3qsXSjW0IpmYQz2jSqcBb5_ssFi2em98y2jqD8o84KpgcIUGFTQ2qk9Alver_qbxqQFNpgjbFINOAAqIe0oHfxeUTe3KV-856iyZ0IIl-Uk7OLG0JQXh-CxaAOKh_3jPLZSD1EaMpfFVBkDJ9GT1796ySODsIM5gQOxQSCCLn3FjPB5GFHsYsaLg8w3v6xN1bWUlTFpcsxS388D1vHl28Q9BOx8GG2iotzsMZ-drAkJULRyZEcfrLh5rIEdt0cxP5BNw7uG4dvmZJUfz1vZuwmu8h5Xoh1wUIvhE0leyOYBWeYwmaX-MmbXVoNXKWFgfaxa8H958yESjGJ036lLmkZnnG1eSreiQ7-eghaTF46FSMA-qh6VuYLLqnQQ8u6Ir7ElCt2MJbxW8uNxj1gBqqEEKsVGnT5o0GYyQeKAZ4G6yefR_CcxNcViDqUcberXuCM_AV2od5GgYngcnfAQbUDn8Auiu_A8W-pqqNskobyhCrO_xVRnqa6kKFgvFP-OOwlkE5zJqb6GssJgwF5KB9O098816fpOQqqNHSieSFeizYAzD0zNCddwGnMwlB0_7HYtz1c2rROOW2bD5wwpeTG9XKlJtx9GEBKeVQAxQLFZowdUkOa_Yb6D5V0_34x8UC1Nd08VyVo2LlwGT8HPj0G6H-UOeL68pdlo7KYKY-CnN-sg6P8RfNltOQbsJjDkNxGvlgKqPQlQeLfinjQCN_ai8_KSM6_nCGuTLVPhmGHRUC8rE1PtrMPu9ByY8TGcX-xwDcytirHvP53io3Yx53E_g4NOgBIRR8FymzpnIZ8zpAfYI2rxTSBx_lL8AeUwwJZUx72gowWXlrmf1LTWX6rAVPLgBkMq143QqjQQW13Se6y5ODFejOlM8oEH0POMlhRIsL7WlDfcT8Ar0glRM1skvkKhe5YaJ8wB4sIAEw--xjVUNxPjFa3MfRSmTJyhacEs-opDtpWjPm_89uDR-NAAHvA_7LAvyoWMFSrmcS8qjaIcHMszs1Rcvm1Y4aKRv9jV8c7FwgX4vN_yDq7ABZc1tb8N7t3cEIokK2ZPvddfdYFNgfb8p26UuKgHznCd4TKauHGh2HaYyxR_DEMla39ELJY0R2nh-AYtIGAZUWSe8V-pOymhQpCfZZM7Re-1lWJyPDgE4G0i-y7m6bzhRxhxYLnQf5jMTnN5YPgVJ3N34Bwg1R616SzZhXV2km3r1hRp9GqEEnjH_D4SXSMLmAXqkTr9kYc46RWROGIJZ-hQc8S0RJmpgYEjTe4P5qjHt3l4FYW1x51bluknPJh3BABc6l7tUuLPNofZDdAsHTOeTYT_3F5WfE9JMsr9d6ex8ylGiL8i7JarKca_oOLBQRH2BuqIfwooS8uq5dXTdF8caTvIp0gQtmrPE-wgf0heIBGV0Ziu5VmWBqr8Wa1otuGa5V0MNSnU5jHLdVw9eBj8G5TybbdZ4RSzI1afOpsqYrGF5YtOY5RjFIncOjaZH1shVqCdhj07i8ic9KuP7Bma_k1JyyGG0PINQ0UU48-5rHxnZ1t1Td3iH7C8KZCAMlqGCRQ_el8H7RLaQdSZCgXjxoE2F4Bh2bgifj3DOwRR1hjqopRIVw1Nl2GFGZenWBHU9LzpQRjD5CmQfP7hCwZMLPlIi-LzN-ylkK2JvGhjD80Mn4L8oV6l9k8dhDYUh-znaljlhuPFzJeaKfOyO4niMF55pmhTaJYdraEl_mKJ9HpeLMBNlo8XXfzAeQZxrqrSD0g00m8BR4k6qpDBFq2f8YN7lgNUWdewq9UHRP0C-VASO_hGbPaZtnebZk5YXZ7OpcIWBrx3BPIrobkpS2N7fLeS9KCvmFGjIr3n_x0ZE7jOCGoWGFqVw_e4IH-Rft7dObqc313qHxa5hc-q39vj-UEXvKrFsLbF_1FCWRyIoe7QZz0lllhWatdW_WGvpyCqrA6PFVsBRrt_lKijm4LVlC-8WhSpQkb0q5snrXn_1PZyT5PoZd2z7CzAyMA83NU3F9HgK_oBbEVD2BME7TsannpZqLF5amvhNTfgfT4UkeSBbkQLvcD0rPsICXVoXHg1oCYAEUOMPRcSk9IVMRAH_ZLWsi5AMLIx5qowKDP4kKONiq96mA3SDMeutLbpbz0epVyGeqBMbm6F6vBkBMD75vrzMwxfb9hXqhthYIWs8cSmLNSEVCgsnztqpFbT2gax0ikjC1nU5S7xrFvLAn7X2gekI7hrky8DQ1JDhNWH5rGmkgsW4H1CNC5pmR3iK6Tair_30qxq3ukFA-u7HuCVt7riS-ee2LXK6V-OePIfu9qjdyeE2JNvH4Z7ZK32rkNDv5X7Z1BvHzYFhXEPeTgwTpPTLhOBrw2o-Tg7ADHRkzOG_O9nq2K21zBVwreJ2MFiMKMtoGMFsxnsOGUpGNGJagF5iqeaacEU1YsRICNQBAxV__KI3QEqGMr1i9mMw4Azr5hgHkV6fNCV-B0leLwEK6iPRyW55YXrYed9ysFqa_y50as7bMCNaOVNUs0mfC1LAxY1vV-PTBSzyYg49JWnUWozDJY-YefYVackQdlwderN-FI2oSpgcX5msGLfA6TtMjHPLI9mSHGbvi-W1BMT5Ho2DF5BlqS37CfEwSaS48zqaRo9JuaPA9tb9hbS2FHf0dzICx7MyHJQC6exdKO9gEdZkf7gNSmLhf7A2luKOBUvm0M_VO5EsNbjfUO5Yqp50RT41nufMFD3lnpytS_Pk5Fb-6eiHta3nbW029WUTNndovjASxJrsVAzN2eu7AMq5vxnM2GFcWwoAVpy5yBcY8sAq0P79_p9cjrWvpeInGI3PtpdAXXVoNyaqxAvcZPH8TmJhZNn2A62w5m3Gv2BAFrcvvkzPGJ2-0bea_i8GTiHzxVyOPDHf5_ewt_3vzwAl0bW55q2Q4Bw1HM4ugO-XeBPxy5wOrc__2OojYUb9LWHNSNUWCU4d06SK76QCHf0llvYXQ1LiNSpFG2U9NFez5ouwUc6VNp4ed8KZDZ_Hp4_x40W7pcKVaiH8LP57tALwfwD-zRx6tnRAjq6a4rw-glm6fbV8i4xsQVtTLdql4Hxt_PwcpqEIInSYaIZY-XgO8Y0D3Fx44FmFrj6luJCO3yE9aaGQLdSmam8t_6BW-J7yZO0FAKAMUBajwFWMpLv0Z5P-1QvvstsHv3np3aYmGAIk9ZJ9gIh0EvAzo_VXuZ1y0Galf6xLQOXbsK_9hmGCXg_rlNQwsG1h15kvnn4ZfSg9MtHCQmGjQ8myNjQjOgJvKEfQwc6na66zNAhFy9KTyipN9Uf5emoHH3blni9FLXgjXun-m_nbvHTApImPVQC3nhtwRvkcttByNR7f-zLcSYoqHz1eLd2-4weIB44YGF8aq2gar5Lz2EIaMzE2xK9pRBns7Vl0q08772Kp24-Zhuks1C3n9fykTgb3z0VFJufZqmUwjvsKBQ2O78sYP_jugn5ELNvM79LgMxvFwJbLTY_WiVuq5rsxnZMh_pW1n5LKBhSHgNTqnYLtPEkF5dyhtuP7La40hCn9SX-yIXcF6mkaNL4Y3BXQLnwWC-0aqWdiqmqEFTwZMTJA3v23Eir2n91TBGBIqJFRtH2CqB7zMWCkCIhYao08Z-cfNzx4aRaFQbM1t9c2w3xD7-1eo36uYR1-CwOMBSN1GYOf3HqNchsn1AVnwp7ss0NEZHJwyCuJoDFPoDfUUh66oFZEh4R-KV63Po88iE6BZIQ2vdBSBuHcL8izo6b3oMz6taMWYYn67kaGt_o1qMjjg3ZnnibM_ww9GTaJUqTMymY5w5aKfUef7-c4jEMF9uAjW1EZ2mpqQbHwswXA_uM45HXoDTz_bMiZR7yXCCAKTJ2jKWtZ8zS1nXcFYN2qnqufiWS_xNINSFXkCO8bT_Q1dOl25UQOIRZ11Fa5xvNj2WmfD4SbvD1rlO2Lln2yBLIxpJaMEchc3Wum2n7UPnSgn7ipE8qOSLRX8JmzorjWCicnWoAmh2l4OcfT1yqeJn-8fAj3W6JTfhDIA7mABRDxRWDjPb0FPvIk7Cay1t3BEedyWl1r2r7ostz544rvc5JU529qV7WBOfRob01O9stU5p9kofrWTVnZZxGbjHvjvbT1uXJ_3hoyWO48wwWakbAbCOeUZ3Csz3_Be-qg0cDOMxcfi0v9fBqbU-L3uHwVnDVK4_g_pTEVEG28E97nfiGW3wx49U9Ta8XV7yE4hUy5G8xv0PfZJdSQVMf8B-VQnGaDaUsYec21K5f3MlLKq-FtGHnVcRzCyra3xwFn9qJA1OkGAqws1Xw0cypb4viXbUTaVXopPMOSe71IiRoQfRiApQj4MYTl3Y3hZYO9BIpsO6ocyVe4YnYkYanumrmbiva55Ba_-8Q7F7gX93TVsbBatoHLbJ7onHVZWlbeUeMDw0KJCGYHCrvKgHYTwy6Ks9GvS3J_rcuJiPqMlEIID6K2_gur8G5mDRJMIe_BuxxxIC4XN-7PBEUw5zWfY_yQeMzVJ6T5VogoVmBf_-kKuYgN2cmoNZbJR_onQcIlJhnMbLlZQe9k8IP4xjaah82lUCeElD_WAL_615Q45dU99AQlwSkPal58nLCWtAp59nNoTDYQ4ZemHTkmVdfWkH75z0o4Q-rc3H0OHxNd64U_ouhrUEtA2eJEzWi1nPRElcP3tq0yzJXWtsKrC7aydHidMiKbaAd13kWdB2eIsI7rMA1OE-oHeFL2aLA3vb7vdPJZlUXOkUGIsBsu_rg4Mwp-ClzBClLs79-b7g27_rIYXv8OmLbQ7EpbMluDGk4lsXI2SLVyyh80pNTGgltmZWaNSkPxOiOpF74UcUl-Kmgk-I6SsP1SVQdPRboJtw0bCgyNIr8OzhkktbAd40wb3m94j1R3fENxkdl9E6Xh6gNuoBrPBAChrqGMlOGW8kAaBr0nX9nQDOV3IbGFO9b3CKeZHxWPAltGOkIssFKN8AwtY3Cy88dNFmdyTdDn-q9djJvSqIBwN7PcY125vBBkpA40Sp3l_M5ert-Epf8zq1FVdDPUuoAvmkqOThV7RhbVm3NdcaznS9Gzlqaunf1BVEQZlm--vhi4gk5pfVPVMKcx21grGZipLfubG5saCmkiD3m6i7iV7Fm2LnfCH-fZxytlEX7e4FNv3Be5mfZJE_GyC68aAp6XoR8-19-Jn9-zdTT8f3_Ed98-7rb8-UZbss7tzposhjylQrnSvrBJS5eZfbL5yWcX7bi-eFgXN7MKkyCBGZT0DL2sm1v3NCQcdrUyennQE6QNrsAcRKH2nxqfYpIEH6dRSSB3bA35_mLjLKDXHDJoVa8lGAVFMuRbGcG0KSe6pk2itDy-yJ9yGVSywNlxTySB0avsE_hKghH1yxsOk2gXumQyHA4wM8N37Lhwx4XNIZJ5iKnXH0levdbN1_HnM327QFEMBOs4qeYYxrCVaHWcPp_JzZEVU1W5qQHUHOQd8CdjVPxgSeXpCzJAAa8FOwHwslaFFs9kCXZkpouncnU-8Z9mrSS4P9DQv-eg9ZSJqMQkblNPT_WQUIZXSpnurq1LaBSV_JHXigh6Jqhz1UpiPrfIO38qySmh_ZXghRU6Gcyn4k_GKdJAgBOwsyEuF61x3FBYUXwS5ccUGwxBDsFPsgetRmFe0-5zYiqWxTag1GqasG_ieEhrbSbpoRsyG5rdjmV57a81yjUIqLxfVamgYtPgkT65_al8bdWAxlhsRcH3V5xKb9n4QxI0DzzL-G5bPI_vPnrmoblMcstgqlYwSbBdg_ddIENOLOVQG969BR5OaY34VI-Hw44BMiKIFYUr_KVwxvL-J6ANbFqx0tgq-IXbIRTyYTiOpwjpm7szAV2pVdHIkcU0S3ZdXfNqfHGsuDFQNyGW5vDG2ZUdxHicp5GLc-LHZ9oMkJ86T1qx-tb-U_gTYxrCdqyAVJa7SaAX3eE7CEXqn5Ihyx4v8ZwdL0ZN5258x9xoC7YOnmK3XdZ12G9uZuuU3_k4iOlWuPb13il6-V8tqe7QRwoyXxfOFS8lSQGFF3awAEh9UthHNRU1utDjC6fd0S_T2T9GFY9AUEeoBVr-_egt73QfbpBk-nrEH9Nnj2g91mB3-L1s9Wr_pnBROaLlKfHqDpupfPk797wnNGHxZU3qy4_nD_eFvUqapgjdx1rSfwc6Kbr0SsE4_tbxTeqEqCDp1zoTqrjAdMuRCtSj9wDrhs9kQ49t9KSxE5QLxnFMjUVoy1Grvf-nFj2XBm3LVbnrW3xDJWOzdqz_UsSoKD-fxsZzuNKInXtxsWBgKC9pOX4CxJtSeUaG8rhLv3L1uVdLLZ8FtS_hoI8_OyXg5x8yCaUcbvVDbaKu9F1i_lTDQnnYJmS4BDiNj9Lq6GEGENI3B_Se7BWwsyWfVXq4N9ZUlbDiL4ffp-ws_RiJTdR83rUTUOasVyV-uo-Y5wUM8T50PJwnbFl2RFagJWCkGVtu4SUqHDa9J_qysHf5QikuC2M6UBbTamljHTgElaqYIv9AAObEbX7r8k-tFnvLe1xBCsQ46PajL--KMd4jTh3xTuMLipkLtqNla6r56r3dJYiIMsCPQLakR6tnEwIOMY8qqajHIr8rUoqwjWJEwYsnNPuvUwIYUKouy2eQarEbDx2bufeu9wrVJtpq-5o250oIoRfzMbn0QJO0uBoyGtwU0Xs2-ZUMGNlBMte5GZA6M4jkK84rDet3iel3LlamXbrL5FbaBgfWZoqXAIFZlBtIGmpiF-QmF21GY-EpTTuK11o6skxMHO4pHvHfarOOanMuUo2C0zbcjcOirnQsaur5waSfyVDAJagQaLBx2UWhfdhP2Umgq6-p1ZPO0k1VaKpUOW6Flyc3y1Gk1ZiHn14-eCZn5KJjZCfsjIPoz80scx9WpxGwOqPqS_n2V276V74cmL6gsVEVlJwWXK_7ro05vXPvMx1SCuWH1uVp7xoD6mxp-Mok_4qRtfct22HjkxlMcNrlBtVy_BYCq1dJJeufzh0JhXwVmN5L8m7t5DVAhmUaz-Joc0StuYR3JNAls_bcW3Udk0h88m5Iy7e__LNpj7WuzNRcaYzbdwtNNtXSKrbBDi2bNLMuUGiPaIBCXRpmUhkaWsfwCO8EX4V19eeqGPMs7RhZnxcdAi9nSQeI5Efi-BH4eKpux3WKBoECyL7zd8NkBNx-JmWKtS-CWSUjNu8E2Rk2peoGKHgZwYmEluV0b_DWo9BNJcHEHxwAUWN6khphLmoXMR4urtbQgVCKbXbxPXRgcYPowFYHOb8SICe3ADgFSlCacN8vEsp90uzdgRZAShRitp0Jm9FEoBdGjQYiZuSKrs6oil5b4tHn0nRnq2PEyJgvBbr4p2PQJZndd6UYKgxNeoSMyCDLGfXuqHf9ualLSWYycZGJQN56Rh7RPjrNCp90cB4U0hX-Hb2pjhYWCI3MpS8SDyXPtsEBBqIP-5AZAV7Kv7d_iXXOMNiJ25_hNtmKJJZPVITzhwGru3REeabRosSAvm_ijt_NTQCC3hzvOel1dtNeMzwiYoEoUFKspcDDPrjfYMtFzGvFpm6CTJN9xc5pQtrYENlYGDuiEWDB1fljQ9jC2QwKQrJ1u5xuqzTRZUDYGZ0pyyExzS-WyZrC_-X07T976my250gORa3w_JQAE0mjlo8sp4yp0qoGhJgXpB2I_sbs6x64CXoesU6ntUN3XYJR5B5GBtLTYk4TeVoQSZQM592yUWim4hmmPDv2i6bYWGEkWoYTDv3HyauIsZqtWP2_AaFPgblGtIZ0ji_j5SXciUnbsLgAUOmYB6lvgZXBspBWI92E035lTvFBUUYrsb_GMVRzMNoK22jJCDHdi1CA-yoWSd7aCXFG0lkLPjYqeVjTBGhu2uZYQzasJKjVV3ng80Debc1gvDE1ckKATV0cEBmuvi-fokEPKLOTws9Ilva0OLKbmQwb08MvcpJeEtf_H7WizvKat2DPN7xqUQmdkqysW3fG4fs_bhnoIEevK4WTBC3IEfhswouD2lkZN09X7EN7Eqq2PnUCoBZ4JaVrMSnq9vO7zZfazVwSkm4fCyftiff5sL_0Zujs2gSrOUdSimkZbMUQYQrbiR-a_pDVVIWT-n4whDTH1YZx1Bg1nTB93Rsj4arYU3JZ-bmq_PAUHJCD63SeCmbyBAkgRBX1kqQ4bwLm1nRVgK2UYicY2VYxkjFI6gbN38O9ybr-8EOg-2RM3GywBeYBuATWvx-ZeuMNU7Rf61k4_draO7hJdma38wFuxs_vuac7td7hE5Jy4dYCcPil95Fyx7u82gbS8KodYBsqjxVq3DMLnQ4w7q_K_iKxYc9kamEnZrk-BQq_VggYEt0kcWcg4PTV9_EFjwTOETNjBiiGtT9PHzl0-jsNaEi36UFlPbBsVyvS8p_mwrWnyR8CaZtXgZGMXp1wZFxWRPoW6bg8EwNdTv6-HsHxaxAvbaaEHVDidEKAVNW5NprQt7AfbL9g4ULRBPdd6VhCYGzst6gdWM2jPjXssKBwlHp64XEow1xF842ulVdtCs29JVPPU6gHjEOLhwfTFroi4aMM-PBe9lYUFcdxPoX49v0k7XEXmYoO2XoXwEuwZ3h_SdpqfNAnDA4xwrPZo_-xBOSQm2aUiPuIuJZF6dGzLk05hgWFEVpVHFs-CG0R1W1St8kiJOP54r85pZf4eI_mgUsDDSaZzxTG4jCVJKS84FA1HfscVixEkWnvxtL5i1vob7-amTu9PpblbsHbGnIF8T7StIv9TECVEhQFpypgMbWAOgaJFxr8E4-YbPvpTkSl2X-NPD6E6797QBxCImO-k5kwm6Cvm6qxsuNGeY7mZDPQ1U18Gc8cj69UxRTme4JR5J6LfzxMv8JTSTAGtVoZMrf0QfWDabUZbDa4FOYGULe3THFresYLrs8BkhOYcF77XIgLrorNeEo40ZMhD4mEQDzqp02OyBVz1-XPLuw70iDVy947V0JW836RdKn4g_UT1A0zzk-JMvYXurdmHaYRwUCbAHZZolFBlEerCj4LqPNVsNP8Qt7hBxgRKoxgsBbfUxFgKRn-usZIagPigoAbd88-jqr-M9ryQ6rgzmtWJ0NFI0tYQnt4nDtA1ZWCTFYj4MvMa-AGAnlV7d0rtKt-e6ajKJcp-bSktofmBausfhOh7g2fImRC7-XMDJmA8gsll5F7zSv3DpMRsemtljXvi4ji75lQ0yWOSD4wDluqnVUQ9_FMfwovyykTTT5cModQPEk0r0Vqua-__IN-LxZoUQJM401b4YSfLpH82-DuQ9QNDAF-HdigmNe78S7iqnG5GOZImQNlCCWV4XHzRmNBhjxcOj1kLk2Oe0yrRYtEtRw3KPcXNJU0b0-HpAaLhwN1bn8hBYS9seDq4l9WOHf1oiNe98GPmrDqWgal9aeL-3Ha87Emu4fZ2gz4iGOxZmnn2rB2CH4zVeTU22QzaaS1nwgyfGRLpPw-75wu0Fp9uaMsZl4ZAoXsWZzdAtG2O4VxV0D1mL46H0tRKqXF62FfUPFblwEcorKHZEPQmRCddKlSqGBxEevdGlhir8ujMNKV7ZptRqZK9Agp1-haix4MXj5Sc2Rujo0IcyXe_s6nHh1YQtu_DXK422Z7i6M67okTSz7qjLarqKXvLpIDPeLYucMlYHchanE9B7hUlFd_2fDoRc3jB06nOatyZDxJcMpggBYqeqYgU3l7FPLc3rzqJDOTvsBNJenlgPd4vwLeSnkTwuRvjJ-VFG06VON9uqJLSqV71pW7c8c9LRCN95BIyZOvz6u4v30b6VftQAEI9hs1W8wZqL3CvVoFZUVhqiQ2EwvIn_6OuBlFVVruEqmyGVA9Zj3LOnWCvlWWWd9D2E8vsU5xXGqpnSGsA66NS-fPdGawNkng7HSyilb745M2TaR3E-L8Gr2WsfCXH2U1th6wnJnwYgmf4ZnhiUl7DvbxatFv1bql9sW3TjJjOiNdPHClTW_fSdoTN9tlDbi6VcimQ1_jqlfPbnG4fwQqBQwUBcc4av59vI12DS35HWO_BgpK3wJzkKjNLfUX0ZLXTk_ZPlGg5qi5Na1l8u3Hx3e8Bbqc24VZAKPIgd_2ESVIbVyPye1c2QqyiKQZCwq_d6V6i1ex91FwbM04PxspdInr6HiQW9cWExbubrmcjFL_P3M_8leY0Yz_8JMkrPaUuJloKWg9zwHLL40RaviX235l3gOhIXUSVH3n2n9NkS4N9yiaLV2W4YIxDq5rPc8kAXdzKGj4JaOjTUiKcXw-HRAZVnzjj_vgKCERXQR1nCFTgqoGppcAvh9P9_5PoiOjHpFR4Up4VO7Uj9AJcK8RrC6d6Hund0BIYPoIxj4ujN0EnZUzNGMoPBmqfu-ijCgMOlL8RwelNKzeHSGGs9GaSyFFOgbqXULI8impRqty0cmzW_k5kFoPuLfKqJBwMRpP6VcKrH-jHW_urq17850FRDwg6SJFbbyPrnJIUiF-a4_MgQ8dQEFez1iGwsKWqD0GDLaLFnwbW4BAx2Nunpemy_HwwmOvTzi79aqEGqWRFHPY35bvFPJWxrWhItStfMt9z5ajQc2lg7cvTnmHytNlRlfoLZR1P6g8xV8nYjz1PgDU52C9aputDxuzRD0x4YIBxtM_kMHwajJWvL7ZDk9Z7Gvo0kyw0i13WUq470JoQZT_J-_VNRuPlswo53mFtpktlp062rqhi-8lMx0r5bt7DPfnsueVZFIOIrwX-KkpBtmbn9PXBvOzKzkNkXwPIcNFmBEaoe81BKz3YqQeZmzhA7DszMURPICie3okcVycWwdMFWbeMSTC9SZY0nHFKWOauRZdfpIGWnvAy-ScDEsGy_aAqlpnGFzXSjW6JBx7PQoFMlLOYgVvPjQgE8UfHGZR6F_mqffylb9IeC8s_66Yclmyy1tRtQzGgfUXCK4gv24Dyil5SBaPrJ2LoNKMAXhvSplA3Ktg_el7t6-dNbPIp0kvOUPxpVO2exinvEu0nKngyjMozjhKZjr1zMyR3ct5VfqxIOXIorhd2JFO8iOsc15uz_zKRCtRWOPPjJ8i6stNOrWNEXHjJKp3Pzo937QmbZ5TkWLZ0KODw7ZvASKqmqQNSX6lIsxueJ-Ap2Z5bz5zMEdC1v3HktvKPZgCkGdcv2i9LhJi6qPGQ_svqH8j4-yFjYWGJNuo--6slVqW-fRfe5RdQAdKHsf2XS2sQ8q--UZgEcQ8SApdsRu3uEMamtrMBUunF3ZfQCD4iB5fZzAHWc1JiGr9T3rNcoJ1KyZdRFIkB5ZADo_RcEVtge47VVAwmAUvIVgUmbJc9FoVbXqLoVybhPa39jGfCADyAc-R2T8oaxAYStEzZTvWyjVmw2xtEpDpJXMU1B4YSg7uPMHwl429d-v0ae7Es_wJMlAZiIDHDh-SnX4sN49VG5XnXev4JgnV6pcgwt5jfaFA41X1uX2umKP-wCPeZHEwdXQduNgCvGsNq1vkiyrvMI9ULdJkP4KP62_u_ypZch8FXEZMU-7GeVvu2m68j6Yai9jlYxWmHdMrIs6pgFngd2NR8O3GsYiB85hpSXh3uuMsqUdyJSYsIjUm4koCeI4kGf8TOm0zfcXevkHdtjLIlTGVLpI3a5E6cVBgsiWfIg8WI4xvgV_84yb3ZESu84QpOM55Z0PxDrvK8sclSDSiF5HypPjbGZrWl62vs_s2Gqhwk3TDQMh1OAP7KIFwq5GMIRaAGIA7gPMQRBHqTXwZ6E3Ai0v0_O7YCazuDUIbl-PH6XAci_qYTc198QPHknKTKq6NMrOKpE5p6hQjBLBTcUvHLUoY-kxmq7FIFCYG1sI6mk5BpsQBxFJPj5LALDneTshmh1lCiE3oN9C3xbJK0PWCj3aPjtikBXxCuwg1TeLM6Ye3TL2fYUdYg5-V_F2_gLDE5P153r1k0zbucwme_AJDXgYwjXTYlhofcOrYKPz4enco3GigrRjOTWwmaLGXJ8AEVHVScCeDV5n_WYYaCjbSpeutcs1-1cmngk5OuGnyP-iKc7uB7D1d2SxbCTgc9H_IPg0E20vocx2qGNKn09LBzGcjhdoJgtReYWXWCRjLpZDpwu_IXpadD3X7Np_AstvygjD6k1MiD9q81Sx0EFWevarh-Mn8xKprq4atHWOVyAoWhLVHue4tcLBHAF7XM9Ydx2SZPuOknL_3ZBlrzI79VLW_3duVcXMdLfzkxCnoY9BUWo_6iuoMbKF5LGvpDpfVKrNZeW_y5X7dRZM93N4SKVJhjsRs_G7uLo520YrabCbwiBGMVZ7lVvcj2trd2A5vF5IPquWCurfyn1qQOZVZ7aB_0tR89yIEpj9om1JNwLXJFxNlMpjauPIaM_6epZS84VbYVgZ48toTKbhTorTt9cAIX4Vsv44OafhH9p5P6is5XBiw1l-sarU-ws1_srtQPGP2N5mdwAxJ24alGBSJ6d51C8TO0mEWkMA9IXzYNKNnwALXqYnCdjk9dwYu39FTx33EZdjPedhfINsTPfeF-5LSvwMWwje-MYUIdNGnUOkL8IAllUcfyAk-iqU9qYW_WK5FFjAuXdml0dLcbTRdzmBoy-saBcCVyUYXYu64gVzPX79VSpegA3a6fo-bYXn_9oSyMkTeCghIleQQACP01-43L1waCK4LE3hh8y6cOj2B0yA-iTwHnjAcjJelZJmeWv9NqGWSaTwOuewajes3hubFzK9pwlYDFbESScwcws4eQ3ajD7PvUwdcJ-EGSoWhfX8vKoazEnq7m2ioC2E4vKYSOx9STK2jGOO4uePZ0kagAoEScJsMjsw9xhNUA6KPQ5LOzRy4u-Ou1kDtIWQMCCnFv4oFRw3w7bwzWPoiQfS7xKrn8OaFiDXEiQQOgkzq01CwOfBa4R4XbEYP1VOwZCLBcMfWKB2EM-d5khwViKKOlVeHzxslSJmZ_rb1FB5GECH1GrjpqoeJesb6RPQIjfKPiuaO-joo6Hf9gQF6V8uKrAQFssPIlqC55mb83J9Mh1F81Qcgd80vy2cJNy5qt0sBfJQMhSki3YoQDzWBBS2b28F57PooR1rqgFOhXFK4T7XuiPaB1kpOea9tHWfOXRtfd8I6VdmtzdSUbh8XM8J6o5gVFAZ2CQ9pPA2t3CaAtcivroFn6D5QWLA09zb5cUY6JnLk1y8N2wapk8l7S_PwfLmgW50_dEaXAcqutWm2kYavfKus78rpkEle2_Th4H19B_VOAWnpGxfx0M0qdK1Yyn0bBuvBwA9hv9y9LmaMplTz7aDnJbiIdbKCvWUdz8SBIjawJ8B6EkfFQQEqVmuFDHYeC2PgdVWGTIQRfyO9XaQVKowUDsk2yUhD-1UuNPdl4mo9Vq2S23OMts0P842jl0NgDNEDuvW2sHL5JTuTcMAKKoFGjCvJHH-50MOxZe41X3kmcKxYARKPXJdhIVlAesTMTwWL5Cm_Ygri2gm9mRzsU3IIV8SrkUlpsoNKVLA8rMdi2j7chABQiQaKpLVrtqQVa4GpJOOPamPBPjYdKxTaXNzgM0ilWy0vsivQDw-ap_2zsSoplAYMEkLfQp_hogWralWC4JY4u0szyZkLXrnh6XCDoNTz41A1ggz0-5898j6MIybf21yzRD2V08jgsamu5Ehe5UFpGjQCAlTxlWdKsBgyy9DYGfBxGdfiIPzckS-5astNdMKCCeBxufFDY7Zych1ZyeFnNHoNOZ-WbIMKYrtzqCuDPjndgUK_e8WEoovF0fofyMv5XtqL1aHVSrKCdEfSyieiNmxDAuxx5KUJFKCwVifDM_pwanCHzde5WBbCb02Jdpj5diWR09eYcDns8ua7jCx_3DCIdKFuR7ZJHIFT8IGUeyfQvJVZek5kYPfh08q5vDqfJm3MKMlDbBYmltsJgckwqQ-5fB3_wO1AT6sCQ9rqJldNOvjlZW4Ch9zBuzykBCgqhipHi-5VD7cImgUYTODreA0kWSylibdi63T8JXdzGVGbOVkpljGxnkyveZlfQksNdPDtvatTixtq6WQ5qFwAQ18oe2SRW5LpxmICju7DkigFZjJYVBz4v5L8juU8iL-sAZQHRRxiVbv2v2_jsgP0-g9NZpUYUSRp08t1mPux3JKaamukJPuOW_dGAT9wRsd5IsKWuf3V896I7uoTFRaTibG99e2qNKHzhTMB72ZfYLi9dLpb0C0wbq4ac0GZweVzHn8VCK13h4SQS8zZ522dQef_5uoGI_1HTnwjW9BMObXFz8Z4qBRrwB7poLNa5HJ9Q6a2sjln_adrabnAMHZGEZRvbmHTRAuAETDaHrVTi4Ne4Z8gbESeT3xtUysCfYPF8sG2Pg1nThZXLh8pzKSvVu7zcsYa0I0u-sSM7aftr8PVGbiUb4VV-ycINmYdHLvnp8-vxiAw8PvxM1XbqRYT82WoUGw3hvWXd0TF_R6Ie0xxWx75CIwKcTNPunkRkUIYg7xdB9Y1OU9AEe9k0cwPFMJI6jsyoMvUxzrTvpqPYFSQMrlZoofO_o7g7169oabS0OO44CDx96OfsIyoNlTyMb5TBQ0a_7_WvNONJkWrbTve0myFgrUTrAvuUKNc_sHitXy6w0ZiJoz_mUCxP2I1GQJor-P_m1JUcIBrP5Lmo_m7wtK5bjiPzE4ppMEGuXzzCQ6xMwZBHwKo_HzpXgQJeaIl_CVT63-aIEyFRoC3cEd95jtVG8TNuAL1zc5SZAnhxrCdNy_q9QV1vz_71joQ4GgGSXjv5kABD6lvQwtMqIHEbwA43DPyQaaINwgG4xCze5OibKw43UGnB3N-R1MmRbIOG8lzQbWAMB82uRM7tRuZ3DG77rib5Zaerg64FSfa_yu3otDM1zoQQ4H3U8hx16HmOWNu2M6XONcIM8m6XdGA5KOYJen3PG4g-QtlbPA4mxp_-fmjezRJjAWF5DezjfoSsCy67zBEtRfkl0QuWm8SAghr06RhUEcXlecJJ7YPipgaJmSiNBNSpE4MaqWtbj9OoF7hnqq6yPGv_WddOwJwh9VNPn3APZ84jmS7_eHkNnXIkwufuytFj_0-mNJ2qPi_43UrEYOON-IjLRKnoTWAKZN_z95jcUJ55YGwDHoQJWn9Xy-s9wlLRSXzk8uBpxqDTtqQ_KN2OnFUXLGo0o6lLvMfk40nxxTWpkVTD5mZFRgI4vaFt-iOPDA3IazSwaLcgbOi47m_kEHgQ1RzUMHBH5m05IzrI_8SOCeJU0wV9vtBsqH4rGSysEZ1Gg2DbyC9Xij83IfZz2Lx2-CHdhuAaTNxXmMJlP8CB8wi4-clLUj8NEAHVOcB90ZnAFm8TVCKDsGCPh51FeU5SAgcqPeK5-BGQ_hFSQm4L2kfJbNBUo27JFN4kshbPcSd9n8Z9PhagD9OhXf3mbOyFWlfwZYpyFdhq0g0vjHj7L35_ckqdnaGvzR9HmcYz31A6IMwprB_L7AfEuOi6hyiNBDiB-owwAoDkgWiWPDZ48F8XXdfDz2SH64FrUU1UooOHqxz9crtkBVEXSLfv-qn-PmAdMtGeJdIhpds-RmjWy7p5Gam7Qbmr6raj1JuCgbYFruUOrXOjXvL0eyKc_dtnW66IHvsJ_PbX-EouoXOLE4avh1pBiQkQE61Vtg-nU-nKqxAxzHe-2ajavQIwHoclYNyWuMG30yPO5rlagoklH6WqZSPhu3HIqCpUgETvCmh460sj8T8bdLNFLtsM2H2ilS43C7M5BvvITGRqYxb5WlAceBhQ3wVZAxcjZtLiGtJqxi6LSNWyD5EffEXC5tyquafFyW_vpkLLNQbq5ikImt8_xMjuTeXEgf06URlj5eOJCMvcEge2uiLXksUAC38iaXDRvF01JEW_JhXPw7495NEd3DCA5dd7fgLCxzldMqh1qxDdYySruHIbMKbg_6k5jT5a0Hf2MWsq7Yweq4m7H08RxuMwc7k8kd8HcrS2ifnoLAp3z0Z3sXQz0POgVvPTotrjgMxtQk0DNJmIQbOawsfs3Hnldp2gJg8ajpDV7TXT5VJeiHE5hd8ruqwABKLFQQqh3mta7aaYhmJDCJfHZm2GV0g1KJUcsj5zF3dy7EZFs-7gWewmPIw5m_APAJS8W_CbC9izwt4ZxzFJhcx8BJYcVuT_yrGB-sSFNwNtHYIA0REwcfgWXu0vd4cfuRS6pLrqfWRIGswpkZLeHVrWebuzALT9dsfFqtpyeDQMb88p50qu4ou0yJWObE_EZlsz2QJbnNMbP8o0JT0KV2YEFOiaWBOCXZqZlkK-ruIOT-81QG4KXVCEEJRF9Xw5HfMjWnaP5YWYHA5rg4qEV9Sjpok2sU4zGAegwflE6Q31K8nLcuA-mmDOJIlmZjE1zctaBwDeY5rt_x5aoiNe75pPj7RSSojZtG18Fk6OiLAT1Iqwl7YpyP8TFKcdFtWyFfme-Ac2q_nx6Ncelr1s3NnQLnmoLUDUPl8eGT0xWBPKxPpzNoHu3zfz6emaFoeFiRY21B_TgK3EWD4tAgrWik5kyvvgsO6Ns_sqUa4hIGPJ1ZLmLfpvct7pOYSz5kBHvBNpIgKYp_vbdeDJ6pkMvtT_lmDE02nT3x5_sJHoAAIIcXpjJj1AHuze7ENXtkRa6MFidUiX11ZRDp7gKSde8ajhw3ZuTn41rjEGAX_oKMxXK4sUoMLfhzGD1vMa1KTZZW99bo4TCOjGM6HXtM5vRTPUA2dCX78l00Cve10kZoUwb1zAxOLYOYtmr3yKc27AdSJiDKwzbW3bgqyMVKZZNlGyLbNnihfk7wFMmmpzlg7HyYtJod_YO_hl4WUQZElIQ8b-wGuhgR24s0BXN6Q-xihS9XgBDlp7pCUlU18zbyifR4bBAXONgRDg0KQPF2HODAUsHIzb_d4oEztsKvOcCvuO9s_-LwMuM04zP4MLGj7T7Kdfhw7JcUs1YD7LxJh_2aOTdEBRKE71xAapBDcnnqm-KVExTuqB5L2YQK8qiKiVNkTUNKVMqid465kya3-gmYCsfRJtTleAvBfX_eUDZFZTK57RPIpgF5poKuXbr4sjQ3T9XDmCZ9hi7btoIag3f4wyfx-YXqfeSHTADhY1xozrXfyuEiwK6uheMrdMzqMv6j5e3HMDZqJZLFPTXfOTof27W-JLE94Bl1rNXT7P0gCmy8uHy2gBLOrEsv4-O6zS8ELjOAlb6gAEgqg94ru94oaiZs_aDwkgH_MIIYdGzCefVcq4NI9v24CR0MFA62lV8rfqQWB5wpCjJgkDcD-lW_fMPLRUMd15eH-1tn2dupOCUHFCJrFB-4ecErHcj0MSEJN_8aQgCCKVZBBD1gjEYk7TqmtfSIAyCsQphruhlUDW2DFt5Q2qnPFuiVHI-FglOr2nQqEjJKMpDPefvZXXLoM-5I-MRYKIWQkFxVmsx9TTPDmc55V5jV1NRwRl4FoRxWa31G70PU37aIULkduBmb7FSKzsCriuva8hifweuVwPgmwWC1ZGiPYc1eRjnPbPNpTrHLcdC7-PnpwRfW2ExXRzC9HS3n8hszVIOPcv8Q5bh41bLr-yoZ7UH5esButJW6gjgSM0V3ylqV1150itLDKt3HHoxMSsoaK-zTf6tYDF9Kd19O1FNiGjO8bhMmsNWthUqTvm3QcAePnBggFpYd4P2Umibc3K0W80vGqKzUbksjU0a2FicmA0UiluVDvOUrNbMIau1o6hs5j19Rey0aHv3ILPOVdnjs7UE7gIw1U6gRD-5LYg0NcduQeg3N1msBAU-3DRQ4WlzNLkZM6z5zszxX7Gb2cZvWKxHNrogWQgI5RTdD2l5_99pThouuqolyT9tjyKSdg4KrK86zZZwvbVvNolssmdUf_OdQ1T7e-hdCBQbQfiva1TY_G_U3yl1lcb2YZMWYW51Ni4W1op18rUSwQA5PVlZ15QuQLERmXjgI_ZQcslMJ13hKctFmCDvPPPCAyIl0qRO-PjXub5MhKKWrg8AhmWyR1gsPUigqv5qB6do40GKmeVtbQ9sZxdzlerLu5pf-qv7PHXMjhAXz2omQW-B1ntLuJu8SN2keh8i6YYKQ-RLODbaHdKATq2FP_CzGZGxOFC55-Ki1a2b2U6bVXO8kR-Z7_mXah7HpfHWACumKqhfNBn62XN3k03IZBUSLSbaAJ05ug34hd5TvWXOmv3a6qKvul_G9Az9BWGgiq0Y-rhYoPXVHn0eL2IvPHz9Cz64AnmfhGtwgZP2z15_nweA4WApSiiNj2mFyj2G8o8sLs14-2SHNlPoa7fgvgakGr8GZ1WkYvt6TJofuprbF04rleSQWedQIRBuJxZgcS7L0NiDDWsT_BidoX93dvqqOEWFlSGU463nY4LHX4HnXjJNJGDVjwpDmGfXBHr7Nu4TsGPAffR4kFIQJEp7lx8RDFY8GQOL2Y0Q68xt0j30j7ySsKXGvCvwE6Meg5svtRKsFLy2O0Ea4ZhEeK9QKc9bWZu89ROEj4rAJQpbc8dXisxfdAMUwdLbnLZOyOXn440RGgs9bkgVJ8U0ANyrIgrARNWTSWasEYMNwu3SOl8kA7LaCDIDShXzblVj8ckUFP-LXsHKX4qWUQo08TKijxtgABQxtebb68rOJdw60PHUnulsUMeZom6cE1HtvKdKxXkPwv67e9tlWuNA7LDcb_bsQLPIJx4ttdD2JlkfjBKIlKN59sUEUCLoDQOP_i8ggvTVxsH7HndVZTFhoHSmxPEoeS1tv0wjX8DG_zp1ZXcLyScwyy5yZ20cWZqXm-5QiaYQYdxOnohq2O4cJ7ZT7sAErgWCwLH62Ue9zdEUd4KANxw37dtaU5J_h40ZpzPeVepIZrbgIBYm-Z1FCtFveLCn0wyj-IbG08Q9Dw1DCo7fnWIPMV1klfyysi2i6E5GhRGxsIQQoeZMbOcX_zdb62ffrGiRJHv6Hg29pSjYBqGA-7BnM1WzTAYSHvPCexf38jI9n2ZRplMPDzPK5VUQIym9111y2rBPLY0ZgJT2ewKbOCFVyYh7bnOJBS8ZI0E0hULtJHbYgvTLX-sf4Zrnje30xJ51Hs0UtbNW3OIchvyy-_t3MQj5kd8F7BiHVVXBaeyGw7ytMJt_96PdBDPdJ-Xn2muJ7uWG-kUKd3MARFFHxhIUXVuqgplHrMQafZqWIT_u7N37z1uM3jXuaUdsuylJaRdAp6S2G_P7Eo8QTpsvTQVoECQfwCY3n2Ob9LqhwVQWkmxFTVXeUnrAD60KK9pD8JX4tnZyGdVtp4x8RWhkfvWfncdpwulz_sft6y-iwDtjujGsfRtg6G7qHLYYNQqL22pM-UUz2onThyUFmocWpBfLNXGxqVuN8q4T0qqzD1vqQryzb3HTprAkJ6aYaPCQO8rujUjveHJmDKZ460nYq8JQqWQkBXv_ZtMwtSVtJuYGwbEjffZn1LtEsiMxCatICLXMncoHrQkUtgFAuaKqeqWkoRpMNKqyX3Goj-VXeO9UbPmxfnGd19OAnF_HOBvM2ThO3p6XIXtj0DN8nJTJ5snV4Iz7EUmRq32T2LmD0IwzPCwV4TEVETLXdO8nKBo2Kg-4odJpS22onrBoFifCpOxNezN6ksvqRtA8ukf7UbYEijw_En22Luqftq3tJWI9IUPA58UgmAEyxGl_uF-8nj644Fqw0xi2nS7TlCkTQbJr1KYBpQb2nEDmSDcym9PGxst9Gqv9_QXifEDFs8TOPY8XWpUMxfNA0Qh3QFaBFd_DhtRy2U3tnUdowcZ5hRIrKyQSIiUjoIWOtP9sSC4V8oNyxhF-l3ZVdJOwdzfKdjOwprswViPzo3I4LQ8l0k1mLvfQb2a_cJB2lycnsfnmEPcvkBXzEFGt0O6niAOn3cLDxG4D7jrHcHGBuEJcwB-XgMQ0O06o4aNJZhNaMKmYNgiTSVEiPqDL90DniycC7ir_OEzBJ3is0P00eBGy5T6cTtHTHUFSQeWuSd2z5zmlxy8YGeYKuVJpxiSL--gVoh6NqehkZmFOLegz081od3ByTd9WHQMhJmEbd5YWOB-qqNFywTIRRJIlTlOFQ5rp1opMldCfYObgI-vR_C1W4wjKuoOwJZSBxcjNDzoN94nyp6xQoK-ghwijM5TZzLzFWodKCeFgBkP2dFbOTiGIRGZHNN18wArKiSEAF1uXVSpd40gvBw6ZyCeav10SvG3LmMsxCVqpNPXWpflhq38IGic4WpFOR01wO4GhN3eT2eJX0hTo2vOcJSdwCEcxcP2VX1VPqFA8Qox-UwA9wcKrSg4UzdMs0Yp979Pkeg_0eiK7gKAhflkrO9C_NwYKg-Wpov4umliTTfSrGSj0Bq-_gyJXlgre4TrwWXdbnYl0kcEWR6ekdvcneoskZ0kWEKZpvRwTz4PXfzCYM8WdM0BY1_g_-idiPn00yS3Qygl1osA6U-YDrhkewiOQQ5HU2MKhW_nFDAjuEqiEcgds3SYhto8CvXMmDfPKjQdYgvd0wPz-S3T8uspq1wUGXWgl6b0-9qEbD6zBM2Uag1F0e5dH2b-yKD-2LT9zxuJHxRYHqj64QXA1KnHzQ2b84D9ADJb4oxccC09rAgmFB0kyGBGs4-ZMI0o5_RK-DbJIJePAD8JoOOZFrnpDgFeGARdwJwnK8SLZ4BAoYmuynbTOa1UMOIp3FvIMeO-k9TkViL0Hr452JnK5gnYmf-5X2dfTi4NZAtNcMBx__AUieKIIPNEb4_98sQ5OX5E9u1W9ex0TSLmmvUeNKp6Id2trHbYEjl-fowYuqrVOphkNyJt1vpqlGScWHLdUrkuoopZy4_tYBoZHcB_Ft50IX736VgEuCYzOGUAPaBxFX6Qx9F8CFNtomj_EhvmuopuCjVPuW4AKGnVG8XTFBv3z7_MBc0n9Kmgw2ZvvcbwfugUUoobvgFkp2pyAHHJQsLzW1RoCxF0Z_LE4Kv-vECW_MCC5Ihd14maPsb6sjedTgOBLCf58rd3VDgPoGqY7nxMXVAAmOL-eAEkHnX97zdfxX5Jb7W7CgNgFCM80KOqfpVgHN3-llcQMdr1THfq6C9K4xRJS2vXtDhNwVxdNbS4kp7J2juAsLmsSSsDf_Nti8prot67gLnKasMPYPj9v3IdmaPwTGxovue32trfAYYO2jpTo3KAkwol1IV2ClFM0aZoevUjPoI42jwytC8xfSHARnMQF01U0PJZag-jrXi6EE31vFLH9OuPcfqiD02kolo1lz7ZAajpNmbjmT5LCxeh6sJX14BkKGPFHGaPRETOa_wxyTOzQVyTlIRCT6j9Vjg1xBKuIGSmEllbRtUXHG7Qh9uvMnOiJHGR53oeqdKVT6DKvCMLN7-Rq-D42_7fp4RNqiNNb8uYlOZpkHIZm7FY78S3JkpUHrcKFGdjhSrNcKZI8-1yi4cNMNVJTzXtBeb7K_Zts0_qZFUZgRACnjwDOWgWYbVmsTXPy1yRxBsL6XEZJDdIEtWg8X2LMV1vHsKGWyRmxeoNZv2kIPckKeBJnpaAXOmsTMCQ86xkZnC6PzL5c-Wr4FOIziojri4_6-Mh80AOyxsvtjNcOmJ1Fu5v-NF8rW325ruMGiv_EmsKwWrGyWZKcaakhwGjMAJDc4l2I4nq61VEpEtVwBiK-6kb4dr07qYI5PZCJXw5AzJTQqyoWsXDzUYet34hf1jR29ZoBffFSNlHkNWl6-pwdVH6INdb-BRs2qxKXyv1QAss7WdMhYNR_uSxz_wDrskA6HUi4JA_bMdVwKVONgPJqT_XGpuSfAPyc5aQUa8sDdxlOC2AtySqt_dy7omKItCXrEgADvAIal3Pewx62MjFpJqG6nssBe5OCBTgXNE5ZZO-is8o_LPCv1Bc2sYB47sDCccd_iGQVyaMrFT2YWSoensPUrxXs_dbfa4X3yV1QQJc9ERNMwMbI2SEYwBszJimh7q65lh18Qu4vc76UPT72dnp3PjOup3z0KXGbXLbEmPkFe6NpqHreTYz6FTR7mPij7bsj_-jDRtbvo5tWHkAbriNpmLJdIrVeWWJpEMLxmA8DwetTaIVSxenbKNy-_L6kGndvDry1bYNRtCZuJy9hEaETy8mojOQxEMVBM18aZUOPZnGxpJ8xgiKQWHh_JirL4kSzug-CPPi2His7iYLZYwlT6HlNyKcNEa5md3tBhk9gGaaZfGzr-31TF9chhTXykz3xgobjb1jsNMKgQOjqUae6CtE8IDoQmuzRT3BJOd00H0-gNxth-CPmXXEK9LG6lAPTBDT7La2rakATtm6UvA07EMj391ujLvwHX23pQDmcPuh_77U5EMLDwVOm_AmB58hAH1XMkJP__ZlzeOFmB86CdDYfj09XWlC98AtoQjImRUt2g9ZOZReOiverI4aRoOzgZyIf3PzLylxp-y70WMtFzYT9LBEasGmIQ5Y-z2QRY8jI5hUuO5TeTD-Rf-Ty_LzhYbr1ydhAcsPyd-FDQSo2_APgk-T3PC3ZZme1ErGISA8DcUBmYm0ti5AJkS1SvkubiXUSdanL7fdUKCacFDdqWkdIm6vm7r76PkAocxQLLwgCLw9f6-WfFqY9puVdn89O19n-qcz79H7rvdPRlnsyVX6eLZyK96Q159E5-YU1nRDmmPtYdi-AU3zDhTQ_-4WbHAJkhbpAVOL6cSpzaTGVX7G6tjMuSpQv-BRUrSjorm_xrijZn9R91LxQR1zFI_w0BK_e6ivdzRHmNWDy2wsGdk6yjAHxR3G2958sUmoH5iqycHTkCFK6N6rOYYKhvBnjeCSLekezgZ5xugEd3F8lIos-o65z0lYA84oYJs2fphmyBnab7sXOVot6c201F3QAGF2E_WKqulLda_Mo8EMms1Rp-UtNpAhbIwDPB7wGRH74DHUmfGoEcsHbO-SfGvgYUii66yhul3PL-icHqCDx0N_4cRA4TtpoGbVRa1ryHz5Vtvntu0EjrvfuebK4T3jvK9nYx_62SD32YDrPNUVX9FjQcIKN4Ih00tMWfKqKOTmGFkLL1oROXorwMyW5yzjE-_wTScrAthSIPAxvmOFZv3Qtk8avCJMCvsTbBpHhMPCwARonbRLbAjLKL55BGZYU8ox9Y9WhWhKMEpIAz9zUgdNIAotxqp4YQzmaj7qhGHBc3oy-XikYYVf-m2INQNyRhOVKd0gVhCMSpzPC9tZ3seFZpSvr-tzk9wX3JOgEf8O7V5i7Qofje1coaWNHejzmDHmlBJQpPlOBWWF4QqO84E4Dy18K2HJx1TJ9v_CGPNP5VM2IUdIoairgcBFp_ZBZAV3F0zrw-C_xv-NUCD14jo8IXPMawMmRZS0MhX6BzMnOQQykajk-0DDanjzUwx9geyGtd00edYqd5bN-NbyizWRiw9laDv7FFixIbTQIc7xIaoJ-hu0YAYhHGoiLSe_zz0nVlmN6ZEB9StKi4CTXBEQQFhVyFumxYc3AG2u6MCcqyb2GFxqJQsAPP_apcapjJl4SsGxCd8JoqGQCN9uVDdS-CD8IXKXPGGAPGTUJEiu_88HQcqITwv31xMQS9iYGRLw7IsF3hWfmJoYdTh457b_pRcAXPjil4cxfo3ak3FUIsin2KGHHrLXg5EagT7v_oCHd5hevf_8yEc-YRBrcXa4WgxzCHzHvcss2lpH0cFw7NT18_HYO8lte5lRdu6nMl-vlaMgCQWQ0nLe2LoJEl0-izoVvOVbhMJZzduLKS6-W9Sg8tCNBi-QeghyD9qEiuquh2GsEdc5g16iKiwOxvu1ddUPIWxtEK_dQZxxUDkBQNCjbpLMKH4WP4P4dbbJQQZh9ED3z-GUHgZ79kReJYhhhJpymF5x3HXoVc7koD8c6_F2ABjtQ1bDRDfjcaDCQQm2YJjpSYLhaziF2Q6Q2lgKFnJkO12DtGvJp75sBHkd3de657OCQhe7x-SkIBhfKmxUtzxVnhAIMedMz023jL6UD1DGnVcWqWous10qG15hcScEES2oaJbvs3194gFwaHsiUMexFhp8fbvXqZOqIsO5C_EFmXptBYX7Sj-rucLmUcAjmcykX1r9OQt4Rg54vVHDh1ltfY1yp6AmKf_GTzcT2QHfJ-ivOaJJJSCOuM-38gP6cD5oCS23fV8Cv9nQI9VjM-33KSeMCb1Y5ehn3f4l8chM44EnoUkqW9P1nGU43Puis4xj4gIxLNnqcdS27du6oyJEHEe5drVasamFuOrlLG0_uZ9qAFN27xYEFac5MZk_QJernItxPLknROQdo-equycdwVvn-kMjQMwz0CtT3Qv_eq9S9F5ZEYYZR-eWkrqDlid6voBMNrDl4BLR55ftUemGNtoUlKMDLFi-3XRzX4PcVi9vINjROHqh6i95kXw3r3ch35yMb3l2fbi3hRINfDcFUEaeNF28rmWjBg7XqRmZBcc5JlNskCDQJ7rqd7ZJ3hz8LnWHy692kRZNyuFuhKDPklnt37aYWu5nEjICUDzyFIGfGgoNnXRi7t0Zd4H-3D4Ab3Ul1hyHhH7hYaMgoSVIoBnvc6jvIToqRvwkA2MvevgvfC3QMTD-2qZUFX0T6GZfRMqN3QBhpbd9eNL2EmlJL7hew3RqaOcmAvcaJLhjwa_gmgts7gc3UwO2NXOFWw9Y3nL_LZwvbxkEAl8K1_JRzXij7NOEFeIkzqA9tqfQxGc-zBHB-RFWJzlhdYPnb38ngkRMXXEWn1b01dxraW9IRmPJQ3Cx71m_i3MbK8_5hWG61Zcy6IvxDoTFALcuEgm8IXFsWYY-OKAodwcSxmceFNIIAQgy4UYz8f2G6zx5pddGY0UAHAYMSwycxnK1OGwlhoWJEeGKeat3jjE1Ko6eVusPSVFE6hNjLmw9zyt55wmAAuyjLawMFkuIXc0_1zWNcb8LY9LeFKqJ0bhizHqaNxibU4fbxWec-uwXu5sqWJkqAUD2AWkYXXCkumfrqy5YlVBFaxG3PW3wdqeWHmmBe4BTgXarGF6Z3kK1SCgz3hUhnCfgZ_ooF2SYNtcd17lGhC9i7qLP0l-Rbi6ZX-727jG-NcbGsg2rrw3B5y_7FCcW45rEWtej3tFq4H4czpTTeoC1eG5TF-bc23SCFfpenq0io1m-x92dCYgx5HZanTK7ZT93mX_cg-WHfkRfjk1ohCwkHL7sV2Xi63oKiKOW1xJaVkgqy9iyuNGN2OsdpapJ_vJRNBke5455_NYoPvf2x1BsZfPJUP-fWpa_ZIqlQT2viqizYaHbrIwHByaHR9O44loOI8uJiFiah7hIhdF-I6dgcELKiO7hy8kUhqXRV01OPm8FMpI3EETq7H3-ywQX3p0CckMIZQ0ojnfDCnTZbOCk4pIdKvoPnlsUExMYkmKlkpWOAXraxSIHjxaYPybHIVmxyzsOgAd-SpQndXEy2jufy_6DgFECL026wmTtAtGrdQfDaWpCweXD32Ds2VsnLPkA5yuapbyS4N_G6YBB4r0Gm1Yq3yUq3FRM-ZOhbi_M5i_2MT-NqmuPzAH_xhshc5T8kU4U1L9dtr1Pcp7x34k0TCblVCgvnHvvFwh_TFA8xTPqgtgmFIQuZ5hrJTXccGHva7a55saW4cvx5sx3Yd8udgv0CG6LUYsXUjWhwn9Yyzhjnuao31yGAF1iPjXsVx6cwQ5WxSu8Q7AfM1Ceo1e47FCyOVNlplfsGrRdrx_5uZRB1MtZkJl2D8NbytrOGa9S5X6Hn7-5KZ3EZU7BL-431COtFu1Zf5uuiyyTim5QZL3beqInNSK0bZVR73aEy50iGEM5TEtnoiCEEoHr4DDrlMSG7a7m72YApAmTzXwoHrd2xzPL7KgX2A4xB2EHUdp9MYRlfNqsEHp60Vbu99x0mJM19QE-r_4zidkZymOx--EPaVkR9QwCm7K8Ld3ql8y0nH71SKMEmVlAnooQ7JS-SYKlkuqgfosDB34KgTgsozeaSZ_vI-rnlPLzpF5JN4gB1ZUewfvfP8dK6mYTC9b-t6-K43utRmAVpcz0xt5EDHX05eIZb8TUzi9T7CuAhDXKcQ3S2QQPI3bqKLzoyjumhQ51SzXISY0UMXBw5m_mXsd0LAQ9bECnNX6msQxVLr1wO2gpQPpasYQ5qSHyCr1JYYe_uJEXCtYpxn1IitJAI7Zps1oe52SbyzI-sEHBUVpX9AIUEk60r39h5JaVJF0A34QXZjtlZj5ShWfZZ-qRICyw43cEBsW8kwLukrJFC_-l-JgdUKbSZdxGg43Zr7A-SlTpQqfvM9UusrDsS6uSGCqYTuK_bpKrHHFtoWA7HTS2KDy_o_klYTTwgsT9Y4RzOm3Sbvl20KuGUpbztbjSz8IVKHnfQiTv-_zrHpI8681vxHEoje_gGiR7tqtrjfyFDbTweyWlsE3DneSdKcoCdg73hop3GOgEcbd7q6rW17YG_nTgEa1PEkzRQ-Fs_2dL_fqVMHc72iIFYIc64t2515ia4SebHJUEPII2Tplfn0ctB0-L67Gts7-ieDezkA8zzn8SHhs2LjEsoM1lfsmgtc5uX8ZNimVAIrJPbdo4wHkoFXxH5dajUC2ZqFP442BUJQvHxtTdonYqryBCs-tvgRHGUjB254nD3Lefb3rtReQ2oqLNCOdb1wutybv8vlC8dLVAb8zXZRwxhDezF5MN7RBO6y_C_CXZn4muUxpdOde0zf1VSTS1pYTX9HsWagRtYVUSZQjzl2Spx5V6rTcyEiZQ4mmOMMZJJX6Se3UX2sD98IHlTM9ZWmKqLWYsMCeqCG2LRETYJP4DDYxT4wN5jrRJHz_83Z4KqYUJvi90r_PRY5Lo3Z_iaMDipYODZMQRr6OSpTH8bSNyH6TsVR1pdt-57NeNl3_6yQoEq3N208Elew6otb_m2l9nz38DpxuOlsCq8weKjqSiSo13q1Hac3ev7EvtYthBW3LGZg__1I8WH3FTBPnnL_tXjblu42vG91nuWOHKC4CnkQ8neAaf6T0mjlwlxRObL_qzVyomxMRjD9pF17RKyi7meCbOlqCEcSS-kYmHh8lfGa7-ceZgaDdi3efXaHPAljmRGY9ZBvBnMtQ7LN1TgdNJvU2j279vLRqq1-hyh2OY6wYpGeXwPG4CLwDt33oCR2Odk7CL05_tiukM8rwEqBi7lklpw6fLS9OGYRzAF5tAYX9R48sPpyOIlY80X6XBN4kBERRVSiaSHXAJo0eAx0j20lU0rGbygjVSzTPWbrlde8P4JRqCXLm_HE8uc6kDj_98tztvwHLG5swTmzuZNzr1-nM6d3MYIm57rD_892_ibuKWIOqagoHYgeeMo6iRoviKTZsXtyynGb1XTJkhjkp2OskSOyaqzgYQRtWvDicQabnhdskI7AxA1S6mNlgf6q41pwwBcJtZf_ijD1rTBAPgFn8vEdpO0yJBVp4f2nQOsMfUY0ebNPMtch9OXb7cq6YSB498JLJoJjew5EMSUIRugRzR6KEog9GGHbCuIwWveMsKma_1acLWdjpxIdYORAcyen9jjTb3W3usqUJsqRLoHAeyqgmQpmUYMheCihBHZgm0uoZtu7fv396waudCnVm32YrCfTugaEDZ0EKUVySr6Z7AVX9lYcy-Ppjf_N5mckurJQ8LFZY0TIf2459Dugl_xOsrOBM1nD_N4HoCz_cXpwMN2f2y1TJ2T5fqnc3FoNM3JUHbS-7_NACavChfKukUVD1VE7eyRWi-scgxdb032dLKVxPX3Wy0y8jnSnAr2RLIhJqu_dOHlLqVZHKM01gUXjyPfrkSPw6W8nY3ti2dxUvC6gY3HTgNbbpituXvEVGcQsToIeYWMN-WDkWKliTjFvohuylvbnODENtaDivmnFUUyCD3h16gUWK8-pnW7Gmd2QDOKOrU9doLny77a_OJkACEcruWewKv8RddT0_juC39C-i3hVwhmOnD_tPwsWnCjrovwo_pGlanGRzZKSqChrn89fRmiWkUUcASWQOTG66GtkmMUBNo7iDWoYm_akYmcu7Ea0Nt_V7D92giSEXtwNivBwnruB9hv6YOMxZJxZSoMVxuMbegN6ZhBEYW_EAh17U6Li12FsvXVJsgsr9H_O5gYD9V5lx-U-KBDwjwKgo7kEIpVtQCzVwobKxGL_wBV30Ir2-3cLQL68LKuBEDRUiecVIxIxTjq9_llkXbTbrAXQ-f00Wy6UH6sCUk9yGx3eBJiHyrXznpF1s8wxSrxfHZEjBj3vgBkY8okucWXuW7Ys-zDBlL275mmDV4keDnoOymI-G5oRJB1-ljOmEtOruLLWUpycEZO4754RmsJcV-74dDnNSYTh-adiv8CqC2IaJtGmkjj70zMbLkpjEdWcwn5riSGCDnnaSPlrD5W-BxMU_1oTZkGnyUG-S12xKWo3ESjGwgnLstlPMRYhCyjslMrUqajtWNFDq-Hk7UD9zXvLqzuE5FUOIY_claDrqpbtCKslLYP6MynLrBx_qPGLo_2pWuCFdyh_D8Y9fCBOEE3e_M-c7iuKeHorDgSM0f0fNTkizsuoG55hPp2K1c2cUFIPA58z4Wv8FD9d4rp0AoAPVemzSAGEUcfQ8nm1HKvZ7hBIZihDubl1sniiS1jhzwIURodkK-H9gPnH6WN_GofjIGnE5NQG0D3nZqXoDT7zqXIBxK9j8hlPU9739H3F4f0EnrR6uS6Ih1ghvDlyYjjTApV7zoWCKcEgYwLmUXYUTcgvhz2nrj50_8Oy5NlK10nJ3L12cCNcqY6msj2HEPgvBlLHWNJdxxnBomIIEzTPnq4qfGr0HU_EiAnS9w9Xc8m2zEuJgvgXncqQgDBssVIaPoJlK4YIx3yEcMw8ST5SHdAOybpMWVcXAHVXqf5S7X-6XTTTwf4WW_llLrcU16ftcTLl4qAIwQNKoI9bQcAJlu9fafqrvamQ3thVh4p9pBPe-e3-NXZX3GCrdbZ0z3fOrh2ECfbpr_4UsSRvDx30D0BDyFo6SR_LBsKHlrrR6Z5NgdNmuVJkQ7tM1BY1JxQFlAtZMQeowdOT4zQcxou6W_j0gVNShZt7CwVgasn_O0wpafrRUTZ_UDv30vzbWF5AnPyYv28fG-qk8E9QQa4yH8-kVLa9oABuOh_2p5u-zcpJeJVzK0NejV-_KA652rGerO-7lJNjjc7n40_XLOEBtWFfEO2r09kmQthwY1yWSirWN1vUZnRQSAb-i4LXMkWcLT6pBRGVQTDGiWr6kedUZTSvzv-JdhvjkUn2Y2oMr5XVM99yzYCzKy0i0QHdFCgSWt9pDgLweCQQEx3njrxYS_4RresWg1Kc0VhCW9QLElxeGwNwG9JIuzgq2nK70o0WWX5rnfmDtjfJsjZ5cyCbnR8AT8Alw3cuY7a8OWx1psFmbgeVd4Gkhr-tclQktQuE9aDRQ6TrzAxdkjezBnWidYqdBmzVpo8f5M5WB5ZeOiCFIylQPtJ8HoDEMDkojl5qoaCMRfIQZDRh-MP4F38j3NCqBmu_C1qz_9p3DlaZ_08Vxn-mq6HuLP_DzFl0PaZqdz-zz2MfU0GHlsDSH8OcBaurHM10oyqQUP87zwAZ496iLd6qwgZtSSmFjAW84lXdvVfL5ZsGur3TquFH8FURD9Hzrw2_zneoLCbJIy67DfxmuOQ3-LLl-REEXHVOlcZ9W_fmvBfNm30uHDgnbEbKvHt0FjSXQf-yVV7xJwIXRHKVyEAbClp5pySHeFvuIZ2dEQ2TR6X_HrSPP1_KFarA8Yx5ECOu4b3pLz2xsczbOhYEpZd2IjKZ9Mf50oa3wO08AR7lMiF_tqYbRnn7HVWx1i8QSW78fJAzP7Q9NBCUCqCboUzUmcP2KBV1qqu-URMEJwyFpSsX6rasWeOlYDBIUGs6Ocea_cg5GyDzaNVNsjP303zkvx2v0p2hSysjwyyVzi265OLD3Lc2_pohEIsN6tiaGEVKY_rHcDEx3jr3WLojfnns3-uTdecY4nrLA9IfpBrBuLRp_ASLAfkJQAqN2jq8GLytFXn081GhBFqV3CDAGmRgBgXMHKg8htZEABwXSlqJhthva96_j33ckuRhlyWAlV-uMMXF7mr7lfHooFrR7ewc9aW0ICX9TJ8S1wvBpKrap-mKHoB3_u3jksAV6JOwV-CisGTT8B827ZcTxqVDWGqg2x4Hj8Hlr6nFf6a1_nwyBtiDjOp7d6pAmK51-EUzc18YR7jtgndYMcIutqJpjF58wB1IILgBDDAsd7bRW5ROtYt8W8f6E3zP4jGWMJEf9St3rnFsfvb-3v8gRq8i8n5fMQnMcOspEcWJ_fcD5DZ7swsVvPqug9AGxaBFjNuKyX4zRXg5mkG7Ckqu_Y-llLjUOldtfJ4juWo1ogoMutdbWtPo1QAxtV6AF4bXXxDPSBQvD50O3YzF51sr4SPONT8pU_DgYYZpkKOYeYB-npfyeIAH9_ALvFbERhOgaIBPUPYFEAORVUrN5EABNMuGTiIxRi0rrDGIXsZEkxNAH6Xm52f7wwUkHcmMAz-HL_NUEqeZPlBoHe8H6RDHUWU37YF6KfYP51R_TRpRYV0msTSB5nvc6syEifEHdPrzDZUl7ooEl-cjhLf1PyYiveD4XFbr_-fTRZNqI3ldSYUDPjz5Taw8Ucf3Ryk6mPMzS3g1Rj1bgPqHFw_bN63TODI-mh5SvteytCaTzwVpGFCDeCMuIZdHjjLKIcYXLh_aXB1R0oIVl4KMCbX3o4Y0DgkFBzY85GHbvWT_2jfW2t8aNAiDq996RJ7crPtPQJcm3oIgQRAVZqv1Ekz4usNfzQidQB4bLh_JRp5IPmVz4CXauAtEsdbhsom7XWHFHbjUx1Y-jkY7rP3cZi0b9X-6n_52pvlXV-HHZ29aqzOmq_3kjX1mgJGa9e8EP5nswxJwUS4Gu6DxXr7EQYfXap4F7G-2c_SAiqIXw031eddzAaIGLcTtmrCmCkNMzvuCjsmoWFarpsSyX8tjHwNExYmZvtnoN7N-JO_l-wsbLDSziEjS49_cc1KCU-RbBsNERQ7NH1pz8XDCshGuhclwrbicw4a5EvuxFsVKtVujDo5B1-PGNUwCUK_3TFhiJwcMR5VtyDDMUEhnWqe9X4qqEAqt6lYdyowgGQabcC_SPKDPLc7efC2eplCCfjJvbO4YKG2lrjSvkro2sBPBvlfZQVH60I23KL7FFx9k_4bGCw2MSd5vndK7ZSSO--GjiNaaeFziAg4ixLHwoiqcsbuAEkjQrOBOz2xUOCe3nQfxB-08-QjuGumiYA7JWsDE6A5juEWSzcU7CdGmLyhY9dmMuTTWHkw-bmiykWwWEvmsb5rilkTyoq8cTg-ZmbPsESVwNg57Nbkhuw8peYYnLLHQ-JsZwkLo0tg6vO2iJ2ITRLr0Af0Yg0ANnpMHdbwzfxWYBUriBrL83h0JIc9ccwGxEkkPN9q2VzTsxGhch3sbB9v7YA5SNhb5JIyddnEvU93wwSsoDcKDyVqxfJhBO8l8_NVEZvnfbGM_SZTPIOzi7jC4-581y1eQHKqpSPlDVLSBO44_nM4dykhLWHOeiGj_a78vN8zibHE5KP9XowT1PR8IBHHBFNqAAlxW3QTOlNx-GGowf77qqXbOF54_zePHKd5K7YDatA8sOUGw9fKvTkHwwedJSv65S8exqVO0fi3GGafOHNtcI6aX2MTU9pNXtARh2ZoqCRwrRozzaxcW5LIPTAskv8E-Ll50ymH2y6LBu84Lp3wvun-1oSEjegUGxgIEqQE6k65a7-h0Ja6lRyWTeYd8nwRwUpPw8LijXHsEMWi41GliPhu6xpuMTTzWonsVAJSg-wj-wcMZmhbIeDtVqHjUQKYBXOU-drMCT7IS2_wf06U-Jr9WDrbMJfQYgcBCMmQwmnN_PZASmWK2m2qk0shyFyj7wFhOE3Ri7eBQzOph6RcBWZW_BYeZ8qY_spInNgbzBnyWK8LOx0BES3V9kRCqkyuz9sr6uF97qkjmPtYWOx-qG9_AeQezEAfbzfl11YuqFh5Hd2CifsF8WAA--PdxwUVkY_0C-A6Tc0Ohik9wzSf76-Jm1AF6crYjq7wT2EgUfOy9Iwap59szy9uQdS2YMogVsJBOvNXUAdMoSBvLjYO6lhxFaOPe6vgnyDJOFIHpAUVSK9WqoxliC90l2w8HgLarueqffzfGa-09RZTvUHPsYc2QM2KerhlSw-8dnCicvrp0vhI89H18GFU5HSbdLU8im83ZK-HTpXO7pwdzOVmy8jjqVCOpZt39oXew7lj1SXpjN-mnvTPfzi6udWZev67nHJLQR2dliOgckvEuplbkeMcXz2R-N79z5K3DkGJR_FqazYaMsTSJwIbTca8DvLT-4d5fPQNYhjkLCmVMDDIB1gHi8fyrGEWuPcnP4-hFyyA6V5UQKVufGXzrVl5xC7VKkkGhaGU6WNbOentSLabAab816btazDWTXWXZ-TEE4NqALnbCNrymXIAH2oG4kKl3A_PAWWI2pOEQbJHfngP6gxIkn2YB1yBb_gZWOL9nL8ymoCNdyoqASs3vz6MTrFAJSjq7QGIWx0TK7vGf22N5aH71Z7VaqoKOPy9IiVAmGo8a5fcPVxTZtV9f-NlYDDcYusNgMUCMqnngBNmEM6ym2RorZUoIkT9T-LcRLkJSULNYiQW_ZkzhQfiotYIdqIELb-9jv9Ozd4f1DG-h_30rRBVjl_UbC9YsF91yj29J0JIc3fzwsu0LkH_7psRFrqDN2_P4ED6uw4J2_lGS-faZVwzlYwRbP033OBV2dmTCcoGSrDmu51wvaDg8lFlEx1PZizSgkoSOwExzL-HixUMNzDe1zMBz2Y8qDQhPIKz1a8rWb6YwgnWkZJbFeU1txs8Fw2vPG11GWevTtWB-ORSmVevOlrbiEkEx4ATK4xNkbxyc5pXA9_DwOccrKDHcsQyjU_S9qcxqZBiCcfzqmDnhTikE62oqJ4trSif-6Ef4jyXhRf4etcFvsiVdYqVPLq_HgQzOyLC7SQvfJ-0dFpFrKdye7lxJNxsGNuC0u8emUfHTiApgKl0EsJ21Jl0eyW9XckHhtNE-GZj1GHdGK3-6bIMT1To8rlb47I0cwHsCwcmDJePdpPuqSUXGtAhPUv0-mn47IW7arfpGPJxWmyHM9mJbFMsv0tFrCOXEBGLqvgkf3tC_inDjPPrOr1Ra3VAASRYX5BwYEkY7rXfdq3mYN0851A-HKqKpB87KlWCI0gAKc2DhDZcug2mlR69YprmKWMd25zGmKyNAQp4erEBxmgfG3jBmqmtDh5Em-L7wcNzN02ullwbquT-S_vxNBzsx9BfbCzBchhha0KDo0vePMv_qvxVgRRHVvvsR3C-9dfD1MsRcXOBJEB5KbaEBX6OFNirj-5wfcusO8Tgy3u_xYn3GAToMYu7EktEg4NmQoW7QfpwvJFhp0VpahOCIz2HKbt-5yJl77Q7g8gHDRLRN6XjObO6fwPTVpiti0QOhWD5G19qfatHS8-6kGLe1848u8G6UFkb66Y6axvU_S0bFHPemzk2-M-2Vq_EQRRI97vIn2YWeaQ51_mD1QkqP7Zzn5AaO-69iKWLcXQAXxqO3lGhvRFImqVuPZzLbkO3kXYM0bX5lRI34kHNx5m1536nvz9C0cIaswGlN6O-DFFqGaYWgsmr6-tZ_8vIL1mblwx34DfXhrfJM72l0Tcw5qwn_MC3Sm_Y0wv9bw3Luj8pESoqZLk_6iMxdr4SV9orlxLZ9_sQiMhQmDAqh5lwrdKo_V8kkna4KJh-WBrazsKt-IQQGdvjJA13d1rP_Mr9V21xPoshQqK5dKZ1OV6rewkxIVHx15-UUIr7d5j1aCdCRWXT6ov8l9f7s2McOKXU-C3DcTJAHJFIhHkl6htmP9Vt6p5JczxBfDewi0oIrzHUGrB8JVGl0qz1so0BfEt87hTG42yDK7ibN2UkKNfM_rAHr1qX9z0eyVTKIzTbi9F_X9k89yfOZP8_YG-K9O38fS_kifCSkNpcgZl--qB4K3YokHyb0xd7PFvPXnLYxbNf7DsuLJckq1QHZyfP_a2gq3Hf0jZ7mH0v1rOxm7MVmr1hxNCzHrhBaQIeb2bmqGsL3KrhrhlsScHsgo0QXKu9MBtNECZudo_mnznbEo7-ih5gSzGNOVOJ-a0TU_mEOtLz0pTyxqLwIkHxTSaFPfOixEuCtspwUBD2M--smzYA-hqhawH8fpQgV8NBq-1CEuSMuk4KNtER9SvPU06F9y34-aDLepinMB_Sf3uuzl7bjjsiUMbKsmX9k1Un_yXOpC-DXM8F1JNjfHhbZKYfE2RtFtZSeXuCtraxzoml7yO-lRpXuNzgbxe9hxXWujphXb-6Y2HKnbM3vJjbshrdGOZAz10p_ij34Ta9oc1AqZ7VOlayEKOcXy6hn_gFoh2VSGkHQEzahp9biJHn5yEFanaW4k3J9TP0mfHFDsLHASEAbhH4L4BRrFdAEGlKhlZxBd4XR7C3dYGZ0c0nzQtxhGX7WMi4VinMHPAwlRvrzV_WUWda2mZMcpggt47FPvhN6jYKoUz4hu1ap9oeaFOcD_JQ2DYAa4jrDi5OBOn4zNATzLr2m9XXmOJ_Z8WQWWOceazrrzbIvFLzcLavSMQS2EXWjQxglCQlauIiHhI7wrNj7xcf6Uvy1uvDNcsW2fa4ilELyF81ZXlSYSimyYyQYnexHPlrVLtOx7S5c_ytlrDx0hkb0DzPrnSBajgh5TaazjDUzLTnb_kQnVOrCYeXjYQHidpLvWR7rIgEEy6pe7wPO4ygHjsTYn_5RcdB81MZmxmq8oAKU9Y11hGrjlZ8qbeIYy5cMSJc56M07nI2b5ySbI0WNHMxtzgcV8QC2uhM-8hY17FChtG27q5y88tjQxJOeTMkLa1ozOkY-BMttqXAI6qVA5V-OApBQ3g6weM_FyvtlfF7B3ACqpsEMduc-1XfjwhuOYHSt7-R0f34H6j9GrW2ueZDFQSHl6bxXaM6YuE4OinVlLlVQnWk5fHMNgaMUpTGOVsuM0ujFtR1Q0Zb10Au2dGQJyzeRLzWhVXxmwGb4CCRJ66kUXrUAkRko38SCyiTHRWnG3w-37bP0wgAiZt9q8MQyq9V8ph6yuGK6o4doJJQwwArHR42Hvs37PwXJxAbR8dYlmZ3dIpVKXN-AdcAogOcYx0y_O7eInff80yXbA-QIPTgnuHa4pb8oLwzfAurHWWhlQoQYdaR1W86lKfkPwHP_QlAZ3apsYyqoMBnI7nvu0SrjJ1vBZ7sD_S96z-ZVwfuqNcjE8uA1H5Vve6NGf3grjKX4u3OCHqmXG7n-nyF9NdbmgtxIOZAV9ifT-SVN89DXQmhBdqqfJpKEwPNopbIjOyVXeHqTGMmCowuwk58P7_BG4hVGgl7rQM3CMj4VAxOlcH0giGGtp5jhZEsZMa1QYPvwgnBveu8z5_3xmQsvHbrTFlRYn3KwO_vZeW18TNiG7DpxdtW6U7bHlo1h2shISzoA4qC7R3UYNWXlMeTNAHVYOR-VBUL-ZgUZLRa1TaIyAdnpagDkR511kDyTC_ckTEZjRwJvQeRx_ZzAZfcl3ZhrSoIFjR-aFmt6rvF71axXIpotI-v2olonC0MPBQFp59ChQ1s1w86_4ymRXy9gDjAmMcEohO3gJjsOjlpcl1h0QPYPSqbiDq1CNCPZSK4DJ1KVy-Tb0usOH2H4yvU6Ox9BwAo0GSLEX0BewKW7h2FUk17Bhx5Kg8xC2C5P1et7lEbxe7kH28BX36eu8lLEKSNzPhJ45-tmKjc_LRiCHclK7EFNqCQmI_QtUrdoH6PHUJhxNeIkQ3DCDOmuBleMHB_qPYo6AjZ2ToPndRyfQbKHm7oPxLufr5fQll9-k8jvvdF8mHhXG7nVufppxvQ2V7_69_2ewm6fMtxkKcic1XObbl3QKI1axwgu2161BSBqzKLhi7Wwj_-eDei4gsoWu_sTK5jA5pY5N9fivk7HLxSSyf4zbTL_-jkZ1K3-h1nUvqOaVrpubfPNWN_nvmloQfHE0Lk0INWsHEydOE2hgyKIgI77zAblmAiKK3C-S_afXDrGreXRJAhExbbYB-Jfn9tdHHBCCnL7I19cQw5KctL4Vaecd3NuhvZUm0XwohrASMvesOWGfA-OypDnuPbcer0IUSlphWsp9aKWQaGc_xUON3CujT-7d6TLPlHfanUdtcVfDZgKOmeHovl4Tf4QzWRMcUnlbsgeymANvjze6RjXm9swOfNOBElioVXG1ZcMqq-grMwKFMZAexRVjgDHZU8o3N3SAweZyr3KlvSZrhzYlwOpd5GjgShBJ7fLWbNUq10y5hRkkc5IbIUmJm6hrB0CHvVDQgXmUaMG-UweAx_k2XGsBC8X2T3ITPK_P9PYAcmveahu1boxUTeDZdsJwUb1oStCuANkM-XS2q0Wyk1Q7k8KpGbqx4mE1jyHbAInTJn8t0BVSr7Sf2he__BOkqv_9BU0huf-tVXu6mgmdMmEbwkmIdTi31VA-SSbCvKKaEDlB70Ck72_I---lcSAmqo6KeIfW3aYXDrBeBYtU0H7_8_FvX7zeO7f3ZNkus26McFsGlOeZyIOsOR0kwgWpqQrhJx7sqYGWYQRGdtPWWuaLVOguUhfuwaM2M4rw15DbkgVJG77EM1V5_mJp3jzenGEk0gBw3OjQSeuLRj8tnXp97ZLYMugaIwDhFtEJGeO_GgumTJ8fYLxXpGdMuxgLV2ecdRgmQOZqTBCjQwf0fwCH3b3bzWT2Sg-3rGDep_t4HUVWl3vbDHleYmHpkuvdlhwHtlSShgcxDb1JWcLZTNWORadfB-k0GuTMKEokHmlvYBfFTdjDxfY5CeaqtikRRiFB0XqyvMC4TJB2QGDKTkNVSfEWQbKSisUBd7ZKmnsgSrYY-Z80aZl1hd7IZPMh2oJKc6jytgrFR9agsY9552ZXWortyHfWNXJLmS1tsoqJkoWUSKGhkX9vHIG6PUTBNasRh7OKyfd-UVfXw6-W6YBgLPWqJ9FUwaCQRe0caUUKup9EMd0vseJNytI4216ehWvICTuxDbXWgaRpv1snIWPcCsUxc3jHvCO6GBpQc8BUSw2ki2O9ELeTIlma-YOzubtzkoMj3KgxoguzQB4tVIHt6G_MHUo21CX1UZft-onRVqB6StKZnFCzqCtazH9b0gJx3ohBEGpb6bFhnABx1-LCJlTJLbBOeWutzlLnUTcNzwqOdn8MTHw5XKb1K6GQF-nc7coTjwbcVYDyBg1NfiPP45FBF5WFN0EZtPqr8_G9pMLRdTFIlhHUJ3QZhmFts8SRjGcxnnBUpVMKBvBv-Ltl-9TEYM1ZIeAzoDdJW9rA6xtrWxk8XOpWGnwgvnlm1iq7SY_aSwJ0Pa9kkAHENuEutBx5Ji9d0v9WCGj5mgGw424aRTma05j9XSTVOXadf0VzovLtP3VQ-cGfhhq864ARxjwVfWcdidO7Zvv_CO4fLkKFptpSDXOg73fAci8-c0b8XtbuiXi-_UZd70Rl_czLQhpqQmuGxKWivxIrg3GpHoAv44LkE3kK-t2TzDyV67CFHDiBMjQuKfsGLIPUjeLNkuidJvgGLOAga4tBurlQbqFYiBqqOx97yHX0idzYG7Y8VLzkpOqVgtpJFlwyZSyGeDZVYfCbHV6G24T4C5g_nMFddvdGNhIfCGzd0dZNCBQyqNPT_EojmdfCmiUmEm_bqmqb015nTAhl1i29ycYWUFATYKiwX70ub7xoPyXxhT_JG6EdjnZlZ7FvsaOXiOjMu_dcMFv30uH-mina8KAOOLoI6WBo7K-3jSxdXmTkP0f3up4bXv88z5OVsp8ZdJayIApHVF5bVTltuIGAdwQilfqefMAZ3e0Qonh_KBo-zYtxS2Lu2s1PX1xSPWkHKwCzttRfWl8pU0lrFaE1UJOr3pitRvzS-U7fbiBlDNj3wuwBGApKAX0cTC1f6dnq7JEEZidkSBKVFIbFDeEVUTcIeOUL4BDtK1Gp-BZ2bvQU-1yqEN4VWhY6wotroPSD2_uutW-Ajxw9qWbabWTebN18zQFL5Wef4dSEDXbgnZVEEpSmJFkEWYcdniwlWjxFiqs-sX5bkQ02LSEGY3de1siFj3l5wZd3I48cE2i9vE8E6mhdb8z0gKY-Y5EAtyBafI-eId0zOhnK5M6l8k-Mj8QItHpAbyCxx70f71DFPnBroExiJnWFh7s38lrO9tSThypdh3feXyAuY3P7fGkncAPXAsfH2gVP03IFdMwqWpT7DPR99l2Gp0ehbpkImlbeFvne5RfOEZLICnIiEiypMT4DXza6_ktc_ShPsd8C___itVcC6DTZCc5I4dJwaMzXPumzcg_wpm90w27Xz4w-xGIhxWopT3GfrCSMsiYMsFF6wfaW6Nb2Q0gdJhh-M7ZIX722tBOdOYFfWyL1PnHE0mium-1K2yeLjK4re9rky9y6ZbOzdqsXmAe-KJdLxRthpTYixQmXbHkqVsMrtloo2psJmNbcRyKIZmu004TJhembRl3T2aaAVyMydkXI4eObdb7TbaFdIStljghAHRu2KlC6JxYav-5bZLSpwUTmiexEs2WgiynyII5BhGO8xABYTcoVGw-FvL6T1R10SAVMMztgW_6Efajjhd-6cVqL0DQ2m8FFhO5osBp5aGNGgblZf4utm3n86T3B-Wqb9y9w_BGFY6fIWbiz_sB3nDeaW-37fiPuaqyUR__8CEnWXNj0NrGBKXYHbuntlBsmIgXfI278BozFGz7K3qofbjNctKy2jSRkvMcNwQbac6kH0BqnRNcH9Q3K-ulmE1PpxdZNZw2MgnJbfEfl1u2uqr2OG9pBjf80rvK9Inf6mfZF7XdceBHDFv6bEFf6Nf08qKnfHAhCKm7lr5psoVbe2BCW5v3FgZ0idAT7grlnM34zU8cA5qyJx5uxkXyfQYL65RdrBbk3qpHRq_G_mGUtf942oDNm1rX78Akc79eqb9VTwDpU3lRtCUEtdBcqU2v-MC8U7j6Y5epr6Kh8B1P2cgwQ79-AfoTws3fNz8bAF1pKXUhPYYVoXRXKyRYVF-dxxuBwSv6zJc4YFSOMEbe2W9pukVv1AYSXIvx3hdstLunRIcR_bcqs_bsKUOvH-cw-ZD59jqjsYZFjIN6YdJ2Ozq5qnzinAbVLqXwY3lSwkBKdtbsy1iT9eshKCPJ3ZwcPPgSWdKVp9N0Xwsa9gOY87lBNd_uQ5KyyaCbe4abwHKwOQ_O2NYmmHHInB95CvBFQBbFJ5H5F7LOTMezAdJ_JrhCDIe-Ju2KDSiwdomsKBJeQRYAKbOezJKehiW8igsf4SGrdV2d3ufvKn0WGhyPTO3c8X9W7rRZj3jj4y_KxnHyXi9XjxjLhggIgX6VJqjP9546aXhbwE6aAXdxhIvJzLE4yRMuu7c1XMlJgrRh4YZltK3IvfwMqo0xQqmWNMSO1xXWfchDKmtaFoFheUhU6pgDkrzN2qtcs0fr4vTJWpvlLkJWGn-JfzLdyI--X9d2wlWu2LXfXUAvvSgc6FE2Z5zXYpWm7-l61YmTsEVu1xUJf3_xJNt0dnxldndV4vbAX97gjrHhF4b_Oy-W5Ueo56R8V9SBlZqx-Ozl2KBba2_UFTWbl99Mi_25Vf9E3KGIp_e75aidClEe_RW4FP-iSbCSXdW8ezjLA_rkOuu8CmPMMBdWw4TWeLCuIO6txMFcf4xFNXqqBYlmKhq-E0IRtvDF14KNHVi7jq3sdodAHUZcX5TzUHyDVAjzRdfvpArfVgZVD04YFOA_lRSLokfdicqmLpNPNwXrnxy0HhL4C8HHIdFHKZBoD92JySx-Hx_XM0lCj7gaMCPk5b0CMch0YXcCz-UoZfwTKVNjYiF9-C5iKc6hhOTp6kV19Z6TeC8RxmowI1tcmCAJhPrmt-Jdz49VH2eVmYw_wSPYV9F-aX4LTvTOWV261Nr2eVGCc80OF4p1Fo24ZpsSfLe_lCe0VbHXl-3RSKI3pjVZiqlbbsOZmh0E_5I4psGqPoEt0EDnpF2dZkIEm-sQ_aZZccePm46uZiZ0m_RRmiGPZ83iOuLOfhRsGdP-gckCwIHhxb17PQkRVg4TuCYH8Z4wQ_NXOulicY7eVjKay6usR7xM3Vuk27rmtG4IBVUx7TXfJdMNyfgIKqtcsoSySdW_yM1Yfn4_SetGgBF4iBHygGTbFpkiEBrOtxCuA8MS0SIGuSTRJjErJQQ38vVsyF0k_iY6tJ-AehyXvRvDbi_assrQkhS2u6akR7C60TSy-M58uhdsjVZufd98WDy4FvxzgJuH157gvBts84JfmaFxr7LzWqe6lu1IwfM12TvZtJLg7We1Pbp0_eGkWRQz19cX2x8znWliLKERztLxKFgDRTJMxn5LdvPFj8p2yTYd2l-aijuBOgyu4cSEgYm2zxcXv_KH_BZTQsw0JT2z--nXoJjQsBfIw69JrANdJrd9qjHPSl14L2y_zgqpMBZVCj9MTdwVPkli1IfS02q_s_83Ak5PB1rZzC4Rc6SrcBhwGaehj07Tc7k4p5SPNCh72FyFIeUqGsdOn00pG1laTIyK38XGwdQyDjALzBd16krDPPQiSSdvRHGWJeR9m_Fz7XyQ5QJLQUjpl78HpRDbjnkVKVkijHNMcFvURSnFV7mbu309GgUzRNrJL-KrkzTFe2JcatQNe1wgmnCgegN7kNKYGwFM4esBTpnVaWq6n210qaXCB1d7YH1vdaDsmUC54yjKETZaKLMDmo17l6uogdXSndO1-BFOIvz8UlpC3YivXH5PvOOyX_ktK7ZQam0g6NZr_BqVWCoYYUF7xSAFROHmR_HHNEhbR-oTnUo7nhNibwVD5MnMnTgkqjddQXCRIT9Q41hCccQjwGz0srIaBeOZUm7PTkx8-WyjD5oD8rABdXyAaEp91Fu2g-a1m8oyyBA5wJb-uFJSRswUtJ02B8WdPvz7gKjnhCyI6J0Q6TVDkUuH6vyODnE8SimatumtJ4Qm-qPKcOUWfJ-XBGCXGHS37TmrkadUouzQpHOOXd3hZYCkPGBNIXCgZdcq0PkvT6JKt85zy0obpZaAQu1qnHx3WXFKqQ46_Vj7e65bhESKjqRHSlY0QwrTxyJTNLK1M695i2e1dJO4mYcqGOVQHJdv0BCCxYE8P-Uax6f_w4oChFIxHXZmQC7MJp7H1tqmPlpv7ZGcpZj7Dw6-f-5dAAxmerv9LEqRCsYRzBIJCreQVoC68Hy9EVCerzlSMQcE4bzs7B9Dwm4VPBtZU02eTFJekQ4hrhSb3fX2JqpKuiN-1f8YnIejgycfla1CdY0qAmMa534LxhubJfI65HxyBBKj0a1PxpDl8Da8Za7IsWacF5r3p3HaFvSbSYlS7aEgSeVop8QmZ9w_DF6yuujSQnIp2jZ3d83Gc4_TnEVpwQQQww1bRZJNavPuANRkQfPg1jcDygKKE3tUdP9fJtK5e9bbPWowuQ2_Pcs5VU3RVRbCrz1EZs-eWbOLMEWb-LgNprNd8AWRrwHuVlPGExjGopacvDOFoQIgxanhnAFXBdYRgxX4sEkcQBywNJzgriWEG8ySOBG_1R1RSWRdcHmmcoIvReve1_McUfOr0qpMExe3mxlCkaD5ZH9XKHVWt32I4ra_9M3RuKZ0NNGSn-crgZe3u-CgYqrISxV20ynWXfg-5KmR6ZBwKJwj71oiE45fNc4sY8W0z-z_fvNoBGoBcfG3mIOuRZGpallFrrhQOUDUu2MHYO3Ezi5AK2Qr5iEaK2wzzpwipRkoc3xDQ0fL-i7ed3eCo1HKk5ZP3o12PYdGGvJIcbNe6GRLwGfaKMzc6-zJs2VTBlRdxag15Qjno3yJxbx4843pf6zFLoXBEKwXE0m08tykmDeDv2YpvIP55y7Dp4oJmhFQqkwJs4D_vemH4t6Rauccmu-eeQ6boSV9LeVK3zq0dHs22zfnRpgYDES_DgUIKipmsNf-QILHaQiWf5A8yCXCyBPN1ESphCRLU9dXrN8idXaDLmx1pkeN6tQudDq2JHuz9dhLZoa54I2knMsU0gYKZSW4sKto6R4GHyr2rKdkfjIvegYgQEQi_hHxBEg5SazgHSyy1yha27NLdcQ2MJcRdAZI4-EER8Ij8pUa9gxQBZr7HnR5XVJGcHR8iBkM2swnfLzAWooxa7TcljHrg2kvFxzjQdkcXeb878wJiZvZTV2UplzG9EbabKvQKRroFrJeNtZgOSlYz7yQuYfH2Xl1eAx-WO2lQMG-OU-zE4iZBLOGNLj6stMeThYb6evNaKpfVZeHzFtt3RQgyVcuXzLOyDqkajqeLghgDlRLmmxdmc2wxTQJPGgtpkZi0amRdMIRFUX8j-GG3qAcZ75_kPbHQoOfwtIBB_iAHQw3M8BD45P7FKbecXiI_hxzLhvCg8Zcs-BCImN9JWrUqr39sCeZDbDpa_Suw68tZ8xvV7fnATi_FBoRuzxlBDBmliBYo38R3xYg80t_jQ0ivTh2WUofSaUkDDs1Ghxeo_CCrnG2RZ-o9pNGpqCyY13AUCFKEXf2xTYLx3b37eVSJ341cSaG_B-_pwCpJiY_nZJ2gvy2tDLpoVcl_BL8GRb4HqZ_L8XAQI-X19IdX0WepCpQDyOzOiQrPCtBsJIdx8CMYEBN-_JHiyV7sNPZZgP713BXX8YNCkOnV4Jm6XjvHW6zCYyktu0D0S_CqVPH93KOrVACBgGaNF1Ouu79RiCcHBcBvb8Ibrq5aDT6alwFdsalAP44pypsWJOiNtae8eFF6d6dwgg0XK2Tt75IEuFkCZu9aPeJjrCUsEHQfIuG2A081-1Q3LBBVNaQ25dUH9tB5TxDXlQxvwMwdLjWIhnk8QR5PEIfQmp0geC3HQReFbIH6xvsC00Qw8EXIrnzi5if0IxKqGBs2sd0hit-feDz9b3oh95erlCyci-r4WuIgMJbbXHLUTP_v4DOZstkNWzBQ1onqMli6EiK_mkEolUPMFUawPlM9nMYFt8pcGC7q9ev-5qq7WLn1V-759rq261DhQBSmd5mDhPBVUmx6XiKHoJNYNC--HZ0s8eLkgdH6SQuabkxKKI4ySZYhX8bJEDc3-_3eTRK_JkZ_KTENOqarfNYWnTEimv8NafmGgppJaIn64JzzBhbk6bjvh-iZlRP9QhSNoYCH65mNLk13fE0HGbmA6SCbCKpMHasarE97DJ0wFjpwvwSAYi5Yr5IbX7qIJCkfNJOWOKodx3Pyl7LME9rlrywaHIUoI7OqJLQKaDL8Cdf0XdpDLqt3L09xAbYnmAFHwws29rXxBoilG7sWsy7xX6tQbRDcDWhdidtu9FSE2ZXRDYMZh95XeFZSiVz7Nb731uNSNDPIWLd8pucA8wVMTsS9EdONfOYwWznmPcG6LiKzR1zD5hOUHhnAfKDmbnTlirscszGUvNHbHXXYemu_PhTH7CXXBUv8JblFPE0GigbDJdrI5R9lM698lCoe905aUphcLWd5FWWebugk0gVKgndijOnvnQuwHNjfuGC0Q_iBWjjCIC9GV9vwcheLEh5fNFOqEE4ZhHmi3wZwxOaYcEuZHodNJ_g30SsiSaXimLE-yFy4L4zB0XbEQX3Jfso_zOg0SJQpNIl5F3qlJ8IQ3co8w1ND8UAEt4k_kP659qXGUf6gucv4rcl9R9LMGf6fHHi2MyXFHUlXsq1PgJwkt6gCB6gminJ5OYfpGBXGarzK817bm5aHroIe7Sa9tLDmf1zCRjLTC9bfQVA3hzJMlj8s2zU71WMXJKWZPH5OD3A8jp_bqrkTiVnZMTOfgdU7W6xrtp-p8tC1wI4g1o_lVDvbzZ5q0-INcb7-02WIsFPx1AUnRVlpiULLiOO3L8IPN_Uo09o_qmv1VdWaI8WvR0Dc1vIVHxe7iQPvOzc0roW4_S8doWoDfCXJ_oiNh9pTwmgYeDzuEkRrmnzMkCnwlZbx6wkxC4_mpAiwAssClA0tUBEzFe9KmhYeXAQVOkiRLkq5QN563ColnXbIENWa6irwFn72E2j0uqQnELChJxE_GU0-ZYmLFWanleWQ3aE5hfVIuIvQTC---gNfARQRLWM-OqeoQNBwcf6ue_tlcBDqmy0RxKNxfHVqPjOlLSKHb1fr95TAUFGEutdDOGRZXjVwUSIqKA-hIp2IblCQIw2gWDpix98HCKwh287q_BYynFML8T43dvQdkTpTaFP_nqhW_TU7YhkIwF4pGcmDnYCIEynlUas_DorEJ2uuaEGqJpZ6rfCANw6oVr8JjmlS4kmPJb0CGxRH71sOr7VLIT_aDUKzhElF4mmpN0hC4OL4qVJR_1HvAB6ki_YkdfWam6mPleS9AFhCFe_WpVPV0RBaOOUUflX6UhxghLGHpf3VHto4iTH39sebhmz0EEKLv3QGIbMy9EwBlSrdJDCdIVVXs7TZwuquL9Tb-Flu7-9fk_OfFcCQ3mFJAS6nbLJYX10rq4KTnyk1O3hDQWzswTrPNpaKBOMI4Jai92LNrN1QDij23qFMF3lb-3lIrZElbwiihtWu5qvGqZM7tzXwhMhvfihrWLURamrgAvd4ptzZA3yPVSj8_kH2XWqBfwYsyOIZ4XfVcuV5W4cRPdVsEpHJ9J_AeOyEXqcVlEWFZLQX6m-1uNeGHcgDiuWk5jJwHl6QwsU4NTK4_ilTNnwfAbeXS165WlgMvP4gnqAzr1gWxMarLh0JXOCYJrSHeRV_d19TV6iGtXVZ6UntIMa2QgjbtVgm7k2p-nfo8ccnpHcWcc6wP6mkGgJpiIp1QTQntNhcsD2c9hgkyFmuxI8YmbRyJjZbuiS1WWIDjhNN_y2qv4TE5WiOAm7TUZzM8LZvNWK9A1ftlY9Tj6sps1xWanWb-YvZPVKbYYMBR0IGLLwW9xQ3Dft-sbiNexwxeQJeRmVd4olmkH99xNXe22xG90mZrICI4o8PAV1Z2ZBbI7RTB4YPM7V4B0hYkcK4LpnbCtU288s1p-Q-d_-qEMqEWtvHySTDNBh8nc2dBo3C2ix6G5-lVR_Gey1M27qU196CiXtcVX211L0CKYKlXombVGfzMwfluoMh20GwkOvrNvPSvBBEYlG9bR5aLIRLvd3AAoSMdcVMDe1quPdjiYmjuGreGq8ZuuXGPUnCDhpYBQwsbeTAZ2Y933UmEXUvaFOEToZ9jjDlES5xOYUSbwByI0MmwQPJ7oGOTBEk1YBF91n3_qn6gF97JFRjF3RqOkM13XFSj47kVHeQL05AP13au2CgpZDILTfCj7Affou4Iq6nWGWXPspaa23yMKFLSmyQyVotKgoMpcmI_rqUrB9tudO5Y0jDHRh4hgB0_3QiyVMlqqv-Ro60p4u4sSKRIPL4sF3mPRctGIS7HbMJhr9c-JjxPhP5KZKKmS1UUBjk50YLx4Gh0x-g77SwJB31RuD7cEmMBnSlBpDg449OT28rv00v1Eq0IHDmvKIqCZMLTfDULTRgL-RVg35fqv2sAimwHAVMRBi8LHEubwHo5ysoBd6WjvGvHSpGrH7EfsfBl0cJLNlVnOPO_MhtBbvM_TyN2L1pQnxdKmZ1lIk4ta5MSPeQ-T2-skHrdIGHBCxyRCilsjLpk_RLaqdXR1yrd14hE0_dmBwFqPtTIeUZHNVcmWYE_IhIthSamI_8RNDvJqQGU08Q-oc6M8hdJaHRTSHvxFSakcn4LvqH0pmcZaE5pobvdxNN6YjHdR5RkgYgdsUGvX4Dh9UMet93B400yXQ2d31CAnU7VSbL-bjcPoISskx7qOL23RxTiSBbid6pOebhR1a7nA0ZHa-HkH-yDQKeauemj9yC0pR4GyCzC6--V5f8hQT3OUyiN_ecneKOx53VWQMkmFShvPNJHn-_vRtYMEwM7NsLQQFfmxhrL-81A0Qgq6AAKF2sCGWdDpgdIsDBKT7IxxQD1JfTPu3xcHnCULI8suKQu3jIAoVityzjRzs_M-06Nsg16nt44Q_7Aizr3KK2Ri37FqRePksvBI7dZtgqmqq329MxjJRWgnM3pYTUM8fkNIoRxCL9VON2qm7jIwiqOC6s34hMnAF3QUDeZ7gB6pD_yzkDaPJFdtyRIaH6jX3JSeZe2nQl0bki5f_KaUGZrJPH6dhMP_dz3GnxtSabifwyyWHaFPkMEEERm49iY-03bmkt2cI0phMroFarosYWwnMPELNiWipf-jCWMe-EKAuaXyNulJtAnDwreYdppZtCAPNNQp8Gm998TPjmXWO0Q4WMiNF4cSCJk0LArPfloCBPsXOYWr-0VVy9mM3JdPrcpYgBmLFt2jq8J11JdlXTNqkbG-14WPAWwgHPmqTo_lbaoE03eKvsYsBJN1rLv4Mqx9mtQiLZRWRfShlaZdcNyMpfu0cv2ZD2mXP-PbwHAXpmZYTw21PQgDrJOpTQH-WVZ-1WRnZ12EvearEsiuW4XsldcPkeH5OJ6-LgHJSAv7P-OFuBEPJHqzx4EWY9JBqVsZ9CeXiRG1uJvm2jfsCSYeuC_1kmxc1KWE_8wvwe6w1BHz9v6OOkS6x75INVvv5LCpidLB_id47dNUCJOvJzRChgBaNZhBqcs0aah2nlYP1j0bpbrCstXHRc7gXZTupEmqwNvvHJ34BlZSm-ZK8-ItH1DYgBFfM_YnkrvmjoFJTBbQBNopv0kp3SXlYSItx25yB_klusmtaTCJbXMQUUXRs6AEIaoZRUvnnelQ-BswkjRzTiKQ-9ewOEmqObpBBMcgJnVQZ9BhwD2L6xaw4WVDqoKNqy62ODNtn2CzkQzUmY1_431Tlkzvm4CHEqzB8iCObwCmMIMaLVMRtXYvQCLrryYwHQnQb3C1daq9NRUmeykY47_3F_1P7DI8j-C8-b_ID-guBrlEninEF6bAULgbpEGWfmA9eHOuVyalJ6vLY6nR4SbO5qsIz2wKaYEEuv-8xySdJ91Lq9XmUR7vxHxwHU0mdRD4wXJ7qRNWD7ZlUPwW-ifnK_fqxGoJZTy3i3wlWjfOAyMWWxTJe5XsnVTb04IFW8KmSQcFlIsZBMzvfBiLHLdcxIpReVtE6v2Lvh0VxRmZxNrchMMv7l5upyXoGyUf5xvMI1I6MCApEPivD14PYy0cpzpn9iqR2fdwmYL7nk5nMRusEyZ6hKjbdNBUey-E9MfAFn07jWZa5UcxA2uPIZiA9Fi_kWN0AyofLSt_27xN3mMtRIzpYvNTs52gXyePfsYXYS04TP1DWwW8_8B4hfFFlBeXq1QX8DzI6vhaBvlHCgan-USUOsijewy66wiTzuGERrUmx48FOiEkHsbkxznjHcKamjoSX-LbxwNjiT0UyspZNHQFIWSMkZjawm3hF1jLFmU8KD2MwgakSdBmu95l1hNW5N6shCfzQhxJcB-zcXqUR7tc6UGPyQ5Rq8sTPqRnYyMOrd2aygtHfxmr56TQLida0CbRs1Gkx-2DzK4FNcQCt_4VAUQb1XThTe1pVTIg54hgiIrkskd5viPlSp224c2LqxqbgHsYdbaN-fqi9556H4uKM9mza1C75uML4LywkBuCK33PFfgDp2Kav44rvrLgOS8wDHoyxOGg3yLvVvIlM-9oqLP6rdQ9_qqbxD3imzEJm2KH6loMNnapE6B-taUPKaH7SxPBrKetIllbiRJZ2qETgQ9HGXisFVo1Fyo6KmckWm1Fb5OAVyAop03sbWnZ_EM6NWjyJoODN-I4D-RRY6c_AgNhv0dXEuOLfcIv8WvLim2LMKCnOM28yaaAiO2J4XASQCNF9LVikYxf1kPDQ62wF--R5VMNHdaWsu1QYkJqJNB58B99KzM7WzsEUtrMCUQfE_CynkzPFyQVWra-x484XKxwoz4Yu9vq3TqxikW5sF6kml30leX4Wclhoj2kizXwYwLIGGBSs9ddM1if38Q4ErA8xX3FFCeUyKK0FUXwBeRyIGUf8VxlMQkE5A_rtBenGGq4iIZHalwzOw3aokHk2gSOihAOg2BJpDPIEc7W2Ga0RG6DBTww62w9zDqpgdI1hgMw_bZjN5o0MagqYWUwRklqBYtkgXsnkrxOki1QblmMTnJUiN7o5EaCcVUuI3x50HIIf2a5wIm6tSzo_04jkJFJ4gZAeoi9i8VuI4asL3BKj-X6VuQUZA7yZRHheOo-YXNUvQDEJUWRB356lsTiDJv_RFwN7SAICF_Aor6xJK6FC51u7qXaoMWhPgOhOEOFWt8OcUe3AvPq8291GSw5nt3Zhvu-EG6xKCj32QbwrKPB2X1ZmFwHW5YtkZHpcy27_MKjGR0bpdaysI3kM1y9JEbyBuwSzdWviQi5JGthUchjZgPR8r09tkByqfWD3XGULDprK-jqYo-RpiMN2uVhKL0G8T-dHnJ4X8i0CPOhDEJJBI5SR2IOlw4yPMDj1b3MR0qZqyqXPuC0RfKHYNA1Bjpop6DVAxnOo8GRfe6JWPRvtAprAjMr2qwOajWeYuMJ81Pmw-6cOqPu7vXywh63McyZPFvr612yN0dy_K5YjKc0NbQ3pPaQp5JNPxB_J9GIJvmyiQAjnvT0c3wk1nH3l1ze4R6iMNqSkIwMdfmXDA7pR2SCMX1isDuiLEuS40X1Mu9NAuvEi2-wn8nMyJmnTGrfguBVEazzQSWTehjiSJ2yvPcyB0ol3LhC1gFhB-UaJ4SGF7bzpdBefNtIk7Yer_xYkWLoRwWoZacu402oXxpUp9wjBSd9giWwFUsk_addu0OP5sFtZiNJAJNX_fgPf5HzKL-UkS-lxPAzSzwCaP5wwvews_gxZVEqEeldoCJTWvf5Z6xNF4rECMDSx5dVGU2g39p0KsZmw7rAJEhJqlLq_lTTo-mWomkJ5afz8Sny30pxJ702oL_AwCSlitIErRheQ9Ch1lQ-QGMT8aPciKdirhYN6zxMcnYPpAdQ-wrErYOSlSaccE8fv7oHXcX7TNKzLfa8XmMLUbCIVFeRwftH5NtRxrYGnufA5mBvqnDxJJxqBM-pLKbAZXbt9I9fOibkCw0nYF9p_W1LVxSR6T7GxHh2NcdA0YEJPIpDwqt80aKInVQ3af5UccPpYmTJAAnK8aNglL72aFDmTrKbiHgyq-GFEP9ctI3VvP1tpSnyb6DgTA-ynSutIryXFxSzO90kyzBl2NEJXW6NAqadVEDKvTQDKe3sUbdskeJslq5E9SsCcm-jtw1taqkSynglQke6YINGNCKx_WhG7EGHSVDSFH-H1UeP6laJq0DvmmB4vkjPRZuUp4vpl_fdEw4CWScG1SdVNn4My_Qiz2j1uxkLh80SRda7i3SABeADFeCvqE4w3gZXw-rZil-LDbV5G-4-91_nKZDXYvX2T76b1Kq71ImF_yV07qe-Tkqsynau5HcH7pMjr6ubd9kcJHzmMIpLNArMzgYUTLWSDXIrPunaIQrSqIiRy2isN8hrMDhj0pQRDdydR9NPaUyxsuRJT96W1TBDP6KLyUdFRVApBrRyQV5jEcAplJUW-nqaUDvkV5JfG6ZQ-qSiTxyJG5fdOM09mwRg5WESIwIFOaJTg-mHQS4qE_ir3dHlGvJzLFMMcKEqJeqr8lEn0M122s53l6zCT-zcQcwIPVzEXJzXxucguJ-KOq-k7bHxteEMKeKWlx_AJC_71rB8R88LUJgIhSf7DYuYsA_eQ0HQRg7Ea6nyeuqZNdimcHWqb9Nm9coE-upw8yHdQB4rkUeMYoPz-kLaXt4BYeeQrUD4EGsyinjkrELzkj2JRKM1noFgswFdy7vL5-5IfUJ7LRRSeuCwwN7DojD2n9FJLJpcq3P5RXtmeTVnZQ1AWQ7meMjMm0_DZCsQ3lWO1WMxSQSxbyBbxgX0zdsteun3vyICOufgGj-Bi3US7H9K-zWvD3CcgCaN5Vilv-Ochynq-ig8bxZyC7GVIqx3sO4C7b1JOG3dBq-4d5Spo9KFNW-qzFCswZ4DXZmeMUo0LIussZPh_VjBZAXAaoPItyfF2ecJiTWot6KJB0I-cmpkjOQuilMhsxJmqLF-5UG_rWTFoJ2dhUpKWEFx1eKePdeJqd5L4D41OXiBjYixD2TOBdm0-IanKiAuSy5lGQpvlacBFAOUeBIIHoMNBFxKsPCA8Ja0RBQNxX8N0mFSo5Syg08n_8k084BUZp2x7Z4h8Vc6tzMAdUCe6lpRhBBlo1Qu1tAXIBf6UkPHLc_z9P7TlyqUTHIX5tdVX8fptfIU01WstDRNUQL3H-YMZsR5oYneWah5ZJG1KAI37dUbRzuCO05Ccjp6vCeBG1EUI2_UTRvawYUC8K67wZM0r35bK7Gpta99rsEpG8X-ewf1guQ2JP9iyTeosCWenayOTV4DL1Obz1dYaVY3IqQ8V1V_9onjivdHueJoBCR-JUgVbPLMh_gEFDceOeFqZ-Vza_Iezt5XXOCl1WqNuij6k94v8sAgrjRIpurlLT2H70UGAbYNK-yY4Vs96YOnTd8sF3XqQsAnct-DngCdn8NqJEaVDYmbbVykNzi_LFGzhU8yAliRFUzyyaDa4c1mmRt3RUs83L7Ktzb6IfDFjufBGFyCBGtP33DXgaMGWJIdmAhXm96-uChSSg72eyaRlWSo5x29RP5vyVmNd_Z3QwGiFwjrmLwXFC8EhLsGQ-vd4Th5TkSpxY7EXCbIFFvN7fOokdyyYLOXXQBHwweqflTOO7yk-x9NSSsiq33bVFJoEjnpzkJHe4aI0dQuRmt9pe2AgOrRDe-e651t342tBKeoQaerxyAHW5eoiCJ9DWwKlzVf0Ys7PSIbAJ3TbuA4ZAK7NcmDNx9VjxskO7WGC0WYcXd9DVd0rAfAujeGC4eBCGt82iafa7_FbwhCZ8DbDcM7t32YuP3aOU_w3TYY2hCo7g1JRQjkBG63k6q1gqUc0CVdxQr5eDB8OXW_7anuY4QS8Ok0rEVuFyDGzwlGfzVGKvnAut19QwmxbfgP4n2SFnj5tK6y8pN1dVUVDb5Gp48FEQfLv_xDZ6qTY5bn0NH43vufAj5qJzMDv75vtmnaeeDAt6xwhtGj3Zgfa2YXgUYruemgDbOuR8-xrxG5iUPcxfjdCWQMT2ZY6m7P1MBhfIPuDQ4A_7qjRVLeLrxZK8vFVle8MiQMGgOxguGa0dILdgE5bQFGnpq1W8Ca6HIIA3J2cIExxAqsGAXSUQV07CvGnFZUICsGr0qbxdU5Uqfm7Zt0Pe3HdxcFSDA8kobsS_MzPFGJtEAUiUzGFJBG5OXFyZQiiQxROGEeK9Ig-PA3d8he8M23CBV1oT820KQuH_O6y5Qxr-_41siBpfM2VnPYC8HqJBGZTQK6R1gzctZraDMoKTm43juz38Q0uOHkI9NB8sEXJeSDB4tU52BugDvcPgaXWgtSuY8s-I7RtU4uBGrd1xOpkF3DujmUKahAYShOp6QcDStKIBCJY-jnV8raBisHKaYh-ISGUkBL1J52-Gm0fdhtHY3V-9sbWDI6b7BXIZ9FPvS6FhZaw-CpKtzZxltM_68tYgqBwMSgWsD7LDYDSJ0m5bdqjffYxUcbJcfggetYi0iLCqYMTWrxNeLdV2he-JJ1qu3n5SwlfOAoMbquewzt3zukyKv8oYHzIuoNefK8CVvItNlWACc6OWLC6Qrki-_iPAJE3A8i0_Dv55EOzELtPKOFI_7u5FyNpaYweIFsM2KQ5RiUtOzcm1fs_MidWL1DJKWTqLNSkLIV2f__ec1WuOPJVJiNFDWUFH7FLIT2-qFeqitpm6fFajPWqycRfNJ5XwR68u3ioU8DxQR3HDUVzEIsltYcKV_DpKXrTfTrzMIh2DwBof7DInht2FuJw2sgbt7uIhDBuinLqZz9a5mu-itEzhAd3kA0Vrm5Pgg4trrx4Oq0PBas1TZJtEPsNWMxk8PxCOxY6eXeibgXMO3Bl6utLVhMyLCoXVJMx6OMl8cp5t_etna-v_Ia8ZloVnuvDBDao7_ANiVqEkYUdgN2JloXJi7hK6AA1Zeaiope6ShPI5TjWJXYCMY9yMMf-mK6nTihoyzEKoylOTfdHgeaQAGNzzmP5j5CMspOpyIcLDvkPaIQ4sq3rvdzq0i94SRZK2Kujj5PbhRvuhHVWTUxOnXt4ciHu2SSo3tiK4_HAJoc6gXOiUbFv-3e1hZDyPZC9dzFGvuMUBDKXzS93f9yroQd9-EsTytZALmFVD6PFdVA_GXV9j1SHL_ZAVRyqwGnmz9bhR3MXYv_GL0mIVMvg4I-5bxz5Aoarr2lH4cQqYT0vsH1kSuM9I5L1Jxzf_tb52nZFML9Cd7KWCLMVB1doQg0tT-4GE-ayTZg6VeUGlQiKvBTLpWXYM8Jh4KE1gxu6EJjzc4Cys2yLcs2qqRRCbgffEBaj2oVKhZU6D6RcZeDtJr9TB5EeWGKZFwy5NfZ_5NX_tYMdeAkq3Q5zeQ0oVNe2MEpyjPmRhyAbu2J_43q94EdK13axHbvXbYBP1O44fybrLIFTueZlcSFNmtPl6Enbbu1mm_e9CPftph9RjGajg_vYGXTwtU0MzjggByiHh3y_m_z8qYdIc72FKUWaueEhxFaqXrPKFzVb4JrM6d10fqYE4rsKxjnSJGpT_FrRjsA9IR7qiF_OnPjcjW98aMx5MfDG8G-qfBl7XTiwtEww0UxKKCRraN9526eEGk6INDIZ7n616Vw3QGZQdiIULVTtUXw02gDZKC_xAVoE13SQaaW20nQb6yhGjiWiZSKdqpSk_DmqmL2bH5RA0nAOtTnVHbQAd2eWx9GvIUDpc1-iApxLGwl6j6BxMRfOHyK6pith31jEybdq1BTXg5j5wCzjEmNm9WbBB85D_GDa4KTaXHahLY-znMifw66GoVkp1KiWRrT8Op9YSKnIs77QV-si7qlGdz5LJAkX_t6ScEqFAPYFw2UbiJamBVdmvLbx0EpUZ1MBvzh8Jgc3kVbG0RBdGQuRj427u-Cl8S7F-Ti89OZlF5JjYpEOj1N0WS03T6xFYivcZ7-L2nDkiu4QzVxn2PAKutnN6Nmsce_k_AKI4yhtWL4KAv5s78NPkrpQz9XDu4l3B7ce1rgCXYShx_IQaqzTYA1k7rCMnChm_xGlGwbLQaLtdwRo9qZ97zW8OjAbyuglplh03YCMDbuO2vxV04U7kUwUn63l4g8SuFdxfr_dO3MJJHChNvyd4hA4LmNT5j27DMIuPzfP89yqefgl5Nx9dSpHmjWOCYk2V_chzrFfNbZ-LMYDvsbXU6v0_oyue9a3C-oflvqrSOuz89Ce4x-PM9wIgo1f9Ngq4vF84od_KhSIOoB1J8Yko2ogYM_wrPe2A6qJF8fDi-NC_gaGHToJBmzXcs6-OqmVPErx1MbvVsSpwtx8HENl1z-gEoGBGYZdv2oN7ST5SeJT8JdDPtHe4e8d8KNjS3OtKG8KLSmgVQBMoktaM8S3_zfk4wns2ToucrmqGd8GMA0K5uaCDMaQB8JOCdJ1ApxIhlIB9NI7_NeTmI33OhCZ9D1uo7pwF71u3n5QW3DPOGnJjKSHiOLNO9YxWDYKVx1nU9OnUVuaGqLkbgHcnprdUC9dbQYxkjr4zzftuXhxXS1T8ajJgmIMw1B_GirRy4BALCN1uSP3fv07xO5P9JlduQmuBatp_2u912nEDt81sJV4E1In3R5lRI2gtkSTn8VJN6owhBQgqFKtq6IXzBHxxYtipTqDSoG1bWnKLNnMv2bmSpL7l-qsUZN1r6nN6U_tmbik2SdOvW8-6flICUcgll_2qLGfG95o7AV1SPjSrlLXv6a6g97akaEYnbWtG10LpooG2kzeiAdZPa2UmYF8eFtab-TV3OQNk5YPmCMCZcWKjVOSu-BDEcwpdDOUnLYp08_6B5meYQVA5NWskrb82u0z9lRj3gKXSYk3XRzXbGbQaonVPWoracYN08QJCrQqIx1FS3lrq69llokXKOYICkLDmwTpr-78JcLVor9cQlpHU5Mudbw7aAdc0dfJvMJPPyoPIAfLm1RWBW7zQlvOeQAa6IFcj7uGyqmLoZSHCnuEn9hVPvVVvJUN9hDJkOwxEmKztdUXHq7665R-0pr1kQLponJxm7aa6ssgtMzvCMjXpPfAcKoWU32qwVt8tMGKyNBLXHsF6lyMS0XMGK-3vWWU5AeOJ4BcOTOhA2PGJ89nlQB3Xd9IYUKcrUCeQBL_mrRuQJxlZX-jla3M_cDsorK0qpJ-9Rsvy1Uqv5sLOmHME1T8-9EEV-40xUvSqwU-NudqjCMBPeaA3SieNQHI6dRXYP25BLtFYf2UqQHyztcmAAbYaBf83-WsEMf7cb_I-c5sjhAEotQRdPLmGO3QG9qklfOh3yjURHF1BNo7vC1lx1QcjhO0UfBih2ZqWMHi_uRolHziOxWHuoiyy1TZyYIoOi9plZEeEKZwR2LoleyWTW-q1ofedGVOQWPC7wY_PP8Us7AGFgimmuchuH9IpFa0__J53cHmQpoivKG7G48jl1WjbMu8czHimUuD47C1P_-TI94dVlKNIp-gwosXXeC69EfEy4OwsahsSMi4XVMun0ig3TvVSptNYU5SU7Pv2ZiPNx9w7yFMb8jYfYYIMm1Z3E6c80bDyeC1MsNutUKikpGKtDn4YJyEnhpBqymSTN8F9mQ4y7ywzSrZljQifU6ZNNJa49oJRT4vuNa51ih7yEMxJ6Oxj1qzxDmiwWB7OPwiaN8vXdaR9IaYxcFj-zDzqzo6vzDeZ12oysTZ3iqrLCW_dNW-XXGniatBFV8dFfFeoF1J3PODhbzm4yyu79Z7S-Rk0xYDb1Khr4AKxoJ-2QAzJ2IacfkqkA2PXBcwrs2oXj5JkdaU56-S8OQGfn5jJ0pdJ22ZW9rhbEdDBXADmoI2lYTlPjjAo_v3vk-pQSHcTTi3uhXuU-ooj__H9EstQO9MgASdCElR02NuxVDJsbysn4DFmqWPu0T8JiyNY9J9_USazBeUU_hGV72l6K_PG-cc--5D-5w21wtNvY6XhQ09HHT-rXB2GChYwhRo2snpIxOo2t5IDxI7UPxR7Nhl96vLySEc1IHDgwTA-PJpajyUCYrE2Y_6gKz3XkXzUCKqesRUAUBfOMpQZafjzMii7VVJlPSOICdT0HpBGp6wa48aTlccGbflMg1VXdt8AySIGpkXaWIPHKRKpBnJBA8wdFX-bpxtxGXlDKn-U1uZTm455x1FTP4SXt-bZPfUMqJ6TiCLIPaJwA2g65XjHdo9dtdh96P2YkplUtjU4XokXK423eEXhINf9StNX-FUpu-do9qk6UlXJmOUGcfAiBJsCQhc4ht6H6iTIRz0NGhZwP4KOfk89TZFhvmJTTcKUcxpl0BfMKqYSs0Z6PHok_OuG8Wk6cxxjIrd6MCIsxfkug6oHOvyujb1sIs-z6mrs9-pau09fXb3UHSz1nFprIThdY9j4SuTFOSqCB1txKAcA_sNI4nOqtXSNX4YZFn5GHWoa8ivDCOBY81GKUdOooH8FaauGcjhxPoNHfca4aDBLnCwTk1xCklb2hCeSXLbOi8zGSvg0gMNOqFatIF4RFQ65FTsZqUx7ItCSDHb5E73-POPh4jI299GSbGfJ4GKuRdKTBrRm1tGsgej9dibKUycqEGH5AHaEvVwrMMRmYfCKHR-sdKosO0F0B43smlAT9GBDd51RA6w-1_w78_KI-V0f91LhqMumPgO3wZo5IhlmjLEX9hKdX7r2h_qKq82qOO-clUk8foWV6naLvtRINyf_ZkQTj36FbHfZaoqFp4bccxPMwBRRk6x9tuSzBvSxNhvDvWDwx-NySbnjNLM-zLQ7VKmcFTcfm6vMWsFdNb4FOR5X4yndrKvDahNIQ2SToO5Wsrf9keUCmnOl64A_pWgOOk5v5ex62wz4KbMMT0fQ7WTql6S82Q-6Ci4WeNbqjfRgRsbCQCVuWAYdM-JBc6LBOHt0Smmp-c9CcoqBn6fRBAt6ZLXEuhUA5hOT-uhHqRxORyJHKdNXZZ-u1CnvzaEy8t-od2P7cspsp4GtMhLw5-6iCPD7rKzf0Tfq24kYK1bKNHiMuN2LILQkZWefvkFkkbNAU5BCdDBGtfDfT5VmkHgTvyp9-zPnKyAuTuFwf-Tu7pQV5MFMItd2LSu0NbvBi0pJ__zm8yDYbPD2JSgzoVKCLrB4d9YxNutsCFZpHDEV8kpW0d8sralXKcIY4QOrhdyx4oTEnE3IjX4Q2XFL8wrAaxfUUxvsYPq2zzNCx5zV1c13BFeu1fyWW3FC6KUnfkl_qb3Ams3hHnJqR5UEz6t7lkai7V2L889EfThuTTq1RcLCw4z_F5OgucgV4dJe7rVZ7Ta4EUAnADry5SkwyoTUBqs5tGUaslbdWMeL_wwOsEztukGJfH4_ShsBWy0OxHYCFV47kkf6Q37B88EwXBtlIGnmMkg_jDvf6BaQ_LC2CWQaIujlAqWOiaOUqAB1y4Co_ZqINfjuR_caA6-7SfgkcV5Hm8gdzI7IpmZnpuRvZ3itlAY0_2K61FP9zBr8pl2_rBIKdBWf2mw3oM1cJAqMA1n4y5Q-TLT990IReZCspiN-L78agN2lL-JqUvXNFb9o9hpZyi8Q_J3xId5pVyQtVhFkJknjTvz_tzAmDLYDk1CLT_Zusmzk7ESCjRRYD5q_ZSW6EKQqL0jLiV3OOFn1piB6ntJKqGbXa8RDWIKi8dsPcjzTF5NeGWQuJP9m8RWNhnN1xyGfhCDVfa1Pu15rHdfhBKfN0Vhy37tVjG2xW85ANk4v-jeFA5T4Sjt9bs1FCXNHQuJw1LuDjjFymSDa7hbAaCWr-zOkWXrh4ZW8Q__D7wwH_dA6cucH6Jnnk_CNZ7uP6vOK3doWQmKy1P2Go93at7tX0HvU7vzK8iLj7s2k-DoUo2o9IBRqQtMOGkQSn8oGy0RYgNJMdw2_NkHgeAXarA819EvTOBjbNb99fmBOwfs0GnIfAqO4ulx0Au5TTfp34lfL3jD8XIMR5z5RrNysM-GhTBOpptW6cqszM-W8GrvvuLM7l4IjFZGICwKPSNGavmMGdSV56DSmjV_-U1fJ7E9lc6iFWJC3zC1OM1w2krYwjzN1FjLOv0V69ygi-KutGOBPwiql177gaWb_-W_3MamazTzwvqARIUhYXcjiR00KelObkQfLVTP9AeQQEzBM2jOWCyCTVRTAsWlWst0Huomzz2x-RzA9ibnyZdqYowT1vAmKWZOhzgtrAyb4cUtyH-psclFun6g8rSh0sVM2O9Pp3ZRYUTdNJoULbREw-_7BeC9Q8ZVD_NVA26Iri1tPIONGipN2VTLEEenauM0a-CzVx4Z9skgIQNO2c3yPJp-PC7-5SIIgqNSIdvbv8v4oU7okG2Y7vVc3SB_GfkI0Ij1kFa99K5pnXBAd3crIIfV68UASqdszLpn0omLJS6pH8l3MPBFKp3xILcNwpEt0uSAoPI7wAZCboHyO3yGAP1lSD2czd2a0MSc9Ri_BnYha-z8ebwsl4wcD02QC1uGWNUadwoV1BTPSCs639hDYJ25U6XtieJsAFxLUCZiYjv8Col-0loN1V37DXtfELRQHm5v5egFueLc5XI5yQgW3XQ8gaJNmABQv-Tk0SxDK6Z_HY9KxCjvm3dm2ILSXhNPS11f6xEZM6YPZrmoR07i1EwYAcZoV_OZ1T1a8hLWkUR8WrS89ddAD8D9nsVuL0CN73xDjo-KYPtn4BArq5UXlSgDXYP_dbO6ET578IuLnHhMgf8sI6LuaC1gGDMlzZIwOnbrovazjCB787pYJdBqtPel7WfCYcb80te7eWvLteA1f8fK247Gi7hsphtsWoFaxGKS94m1zT7Cv8xfoQ2O4MSJnItdvsMRe25Uj9BM8teqUfB_2v4umHG5qt8xSB2ymY1507XD37IfI_H7sVhkTHXUvacW9zFCW1fcweLORl6-jsc8axD4hDJq9ZokUcFH0Z1wnzMSsB8otXDm_G9quUkrbRKt0MLSYxTAJz54Mu1q9x7m-_F25TPA2Z8B7btxaxKeA6Lj5ysW2yHC7V_zNAvWDgRZTSxvLTPXUcF8o5k8XEZJM7EN0j64Q3CvdEFLSurMHt_01GKADtZS6pmScbAsWnpPRQN9ait_Y8cdkoEa1xb8qCb5vatc-M_uQkWDTvvuI9P2YzqY0ZnaY8QlcVlmkqSaH-E_bD3AhHvhzT6qmfR0uYVe3Et_cq9bLNrYCXYVlE4hV1pTju-H3sqvt2R6hUG9IS7Hr71bJfwN8Nr3oU8cKOgd4kF34P3d9TClaMfAxuN8SeewhvFgOaEaC3FZtlha9yn6N7T5IbQYSRRvh1wA1dFtBrUjH7w4jLFi-7tVSPSlSau0lPsQc_qTjVX2BzMhgyQyU_uumXkLaDlHrrMfH4nmi6fEkVfMLUMRuz-Un-1tMQEoGLxt4f7pGBpgaRuA0CjfsAgnu9jAfdqouvyEJQ5nnDVAiI0gWBgPL5y3J7VGcx2x_-ZZeJgy5Oi38yaSQbh55SPiIe1n70eJjHiZAq5qDDkVE8JDsjXOoViFGovScRMTXSlG91CABM_nd7rDlrqkfUgOLGIAZM6VxbQ7N7dt6YYbOFKhLBtkqWv8Ic3_ET-KENC8azYmnOVRKknClXuEpwRp3_YyA8IgfDaxkFqizWTNKfWkT0chFphGRkO8WH5k_nta6p3xS2STWjeHawR7BspEHyfHFbTAd0SI0bjFQ_hdgxInDfy9A9U39gdZ-9dZnchRB-3j99S8GGDAs6bNUfUM2NfoNBl_lAt9BfPownEIhNxNpzD3wf3dAyyokPLq3V7PweLlBJj_7HZuV04hWKanWBGUHwgwLaiFHS1Z1TDdBmOaDftwn2jAFBfSaLJ8N8XcoNjj5m7RTy6VHUGUCX1dFme31sG0FeS8ZM3aX4eU9xsm_Osea0zCBEjcmEGU0hog5SUgVLXvWcbQTznOyMCKg5Gh86vI0S5_dFsWrOSJKeWdiINuOadW49p6TSPiyYQXGsTAW0CSostVsuobUKe8oNaUssYm7EYt1z5IYyx8vCqXLpyBPnMB58u2P3HDQTm4UprPxPc9I5p-9ks1ngvmPflwsUCJObQUeFtaP5CqT80Z5CzSYwYrtiKrf8tCEmED-TUvGNQ7OkYhSOT4aChw-Y5pSEYHSg3Padojt4ThCD7kvOPAhhGVTQ2lb8aO2fdqZSnTRv9tz4MWpKZBEd6k9uJwQdxO9OjKbRdWBzkMG-DcNjTfGW_Hk13atT1K9BwuLN-W8d9bCbhiQoNqghlm-zucDyJ7L-DIqyqkvg7ixhajAKrbDeV65cqsn2-O7Ll00LS03S84styA0Yvo9sS7knJ0cwG_LOPhQCfhd-nd4ghmiEmoExwuPAeLoW2p55Q-HiTif0b-vcSK6N9Dq4o3KR5EHIKH7V3e6SY9kDsN8M1doxeT6H6WwpdScYiXpPj0oQVWTdi1zWcq_cjIIzaSQ0xD7bHoei3C8D8ACixQ0N3uc0D1C_dMwnzFq-6dopSzuUX_TzYbRUFAUCrA6msH3UXcdBfQWvIeK5xd6FOK1a74LHN7cw18AONL0RqNeDvri-OaDlTwaiCygQR1Si5fF6FWdyg0TSBCRC1euwyXUp5IWf0Oi7PrsUywhSVFmxf8XTVE9eJQz44A1jFQqQWooYqnFeN3UKhI6PiyLB_PFfJnfwJ53tQmGqu9Z0fE4J1hhHAFkA2hQUG-FGpMyFDiW3ZCkBIMBvg3lMXZrKakMAJ-QrG0HqvYROAtGIOVyAzg1jeyJTHSOuIte_uC0FKZrZE7O-Qt3c_WIHxvBW1CWDjYzkZFKfZb786vGj7jxWxch7uMr2m1Z9xoU1CQoJXC2eoax9o502WWxszrUwqA8iWXjjRqK4wBFE-Wc37xISMgfNFXtBvhR99bmONY7bDSNmFDBjsx5P1kL-RfWzRWBkjexjF_11IkLM1q0gRY8qsU4G96Lj6TJkZ_enSCc4MqYu6003pkEp5RdIe86BgFdlt6_Am-fcGC0XLchKtTiw9QRRliB0KvBwN3WP0WO_PgnHEPPC5TM0930465XLk6rBpNw6ORVyxefZlhSdTuhGE4W9TGMIM3xXhCX4IBOFWZyL-i3GdiRHc55DIxyLVDoXrr5MdxMixBoflGM_8GGI9fCMym5tBb38Y2Dm0nj1Ud81ArqG6IAOcy3Iw5M2ewyJE5sB7lqZ8eBIKGiLeNxqb5ktkYBkaVTLN0ANELFADqCJbPdZDoXTXT8LjlCtyVFWPFqACeFP58Po2Mf55HqmDIHWpkh2C1WGt2t9rYJ_Mqo3uWHzmDM3HrmmQJ3kq1pXZmp6SpfQv5NMrsSkTHYgHNyeqbfO-kARm-oVzlBnf-PDoC3bS0Wm9o4sx1ussQ9hcUZc6dSYuDMNW7wwnjtcQcO8yRMd70CjNgI9gbcoUruLvdx7ZHuJCwRoy7jWjW3G-QHYfSo_u_QcX7B73RIEpuEQOEBx8SB9AwSdguAodieGVlscvtQ0JNOes3-_w0gsCzlqlUz3KFVNcWcdjaNxHtUOaa2Bh_0BL2NY7JWpZqeayk08n937Duae5I7mzybaVARqHT0RAmc7Mt2d8hC_r7UKihm_xWpkMPi05PkmdGmO4BAbsA-qfL0Mh6COy46452G7LGDPUdeEMbOHr_Jo2qp5boRObuRC6QUf1H-4p8nbHpT8SRKasTIUN_ApJgFKrZKyqdtW9Hjvi7iNaDdOC0PbV7drA1FU9OiulGkfZhSGtbn8-w2mf3ySDWSEKs1Hybes4o5jBbwN6X1k0dpj5AxCvJcF-_WUt43q6njcn_04P8uC4w9cEVw3TrTVfmHYTcV76DNo1R_rktxEK-94xFOqNv6t5jmEwJGqAEmOD_zpRMmJ0LJ_2Q7dnf-eydlhgGhAVBGYdm6iDGA5ojutyGdovx4pCNZdt1LW6fV6VjPGR5hNSKPB6Lr2MtIatlPTSTAJU9B2EQpz14wwnwNj_-Kqxt4kqVR4tXaAKb7Csg_kMoqG8nuZP8Lm5_qEsfJqNhr7uNq01U1XpHGP-2L1qF54kYS3UGJ9lgFXIBlLGk2YESlDN2_ALvz8HfQcKOmi3Lmkkmd3yJSJaeE_VXa9Cn07CtsURt8mN0CT9WOhLTVcR0RDwKscakOh2Cla7Awb0ttV59q2uV4XNotiaL3hAy8p1UU9A4MAyp3uEI16BNJiOEN3M0_o47VYtvDziPG_myw95rjG81ucKviZxH1r7Hbnco5UyvfdOphgU1sfst9-4cIpvWhsc6AOioDHrE5aihXqyiuhqs8wUyqBA9MreBG6L8zvubHAHvUeZ34PNKWrp2_atxP-KqXL_0bNrE33B26UT5XWzVha7lSykSnXGZKNmTFXD7CJbhKQ4hmtJLjhxRiOqVGEGTZ8bxUvuPGlNvL4g-53MUJsPm7LMkiflUftWAzEBzz8qOgqX-SolsITYnnBYByFnM4fP_tCuvr0P2lmENkbtWKD7Xk8xgTOvaN8Ky1MfHFdgvziEMC3OKXchk-1wkC5jbm66QI4CN6EngBoawUO07a5b3MCYB1j0FScVx7wyKgP3ZbYQJcULi76QGfLl51rYFG0bY91mUQHbsHgjpbmz2_YnsWD_9K2o9NmhqwdcF7Kh5c9D10xedtzN3Q9NTeUhm-RKNzgGsX_MMOW2R9yrA0-3iu2PaByyG2HK34w93oVj__usittEvGfUZkTj1wWOUygfySGhPem_95JjmJzzsmVk8iSf8yIT4hOiJXEZ_4bNzXtz-pesLS1otEqwYJBqXTjUhYfIIIwY4tzquYVBjETCgd7F1hI4_mQhWFmWNsYSHHkUiKeTNZ5fWedm5wgxc5fgzbPsd9_FMgBGdBsmQEKbniv7f3HwocwOckrXzkq7QNwhC4-mbSnxxrDE3iN4ekofbPo6yqElzZFI2T9m7pRbe-rU_uSz7r61VvMBauYQl40bvFEwnxI_emo_8g7wjHfUjYnACOTofVwISyZC1nVLvt460jDiaAi1gn1Ch6bmIyh8dKqaIkERbb9tm43w80CLjfn1TTUMms7QLPYNukgao5Cylr6TPZ0QbXkNaDEhTNSuKSTYOg8g2P9_pQra1Nx-9sfkhOYTHMibLgbvKy9RkePYZdx9qKJ-w1HScj49oEzcrI7Cjr8vKHwHoZXcSNkOH8hM0TcGUer-_4N6uxMFz6VYbDd5AEST6_Y3lZzT6Gv8BJiPP_wOdg6PTpq8AX7PVmlLy73hOcLnnFcMt-4nvPJYXpzFk4jrQRXjRJFvAGuCicgzyX7BeEr8kdlqXP6IYvssfQEmhPBxy8006_HBwZsH1AWZLUvmqC3H6L8UdkGrWWEqdsYsYQ7r1WK2IyU9n0a3VK2XhGDQMmGdGKI-_4A3Mhz6prAqWCVi9sdfPMDjuNimhz47qQu3ge90dAKeJvtddzAqt3bnU0sa_MhmtKl3yDEBg8lvtw1ITx2e-yUgnOolJd-nZRqd2Gqz4aiutaoPX2yMgn8Lc9KH9MmqncyAB23o3fg3-F-VkPQzyvinL1T_-35JHRHMzL9AwNAK6q8yWJ9UT5LW_IuIqItDvL3rBxl04EKNBNQOkOFMAj6JCEEyjLwVlJ15t8QApCzwMk8he65sT_OkBvne8fDjdlYtkwCCB9xmeThgW3a0srrUyJGP0HNS05fm7LTOE_SCMiKnd0gCmzw48ZxZ0upyBL5Ic_dQcWrV5cBY-FCzOBEWMKj7bU3I_QLbMO4-dk-Wv_Vvye0JGtZOys_13L_aTh6bnnOu9dzrys61fCiwQvsHtLVfvK8TSC_bI7bbV1vfSuVt8Is_LvLoSwPKtA1LLX5lsFo-Fsv3S3QcT9ROMTfDgbXt_21DRnK0CpzmNxdu-xo8017jerHg7elGBHcTRZfERFHXYhoX8oG2pMpNIKwTPnOSdya6Ib8KBV7J0zIukVNF0CRfhenLVX0ZCL9izEqiacp8rZvxpEfT3iJNbF7PSJLOkeZd1iK7pZ_WReQjQym4EoFdRhBF6scX7DLL3fGzSD5grN12ZMnVFxsKFVoge5WNz5sBQ1Tyu3JXR9NSW04xnJ2NS_YrrzJrzTUkXsXK81xBljnp0iC6t3fOztPl0-7uG_Fwaj4oQg571t_OC-2y1ltzqvN4gntztONbAXoJwUujjkTK4UwYauSMwEq7f0wcX_riVr9OrNM92SVjGtQMhm3RxfiuAyENEedf4WWde5ht-gHmmypGCdqd0ZyY629RYJAzTWBuDBPjTCLDH9lx-CQ__kjgr070Er_MazxvpilCfnUvJ8THpuJZb3uSHE2uQRNq8rVpPM9GcU7k3oa0csAJYJvAGsXa6k1ewF3pivuct0GGH4xrWpHMoSH-KKmaN71Iy3wKkkhHdEoKOJ34awAtNR9iG91M2hTqWjlQYPblJIgwRD-0s1SuBPsctCbaxPUoMJbcBuk5q9jasLVQceL9wpI4q5H1rchz68FnVGYFClWdCMJf1vrAB-LiGDThlzJZO-gvzBgPcrvVc-Ca9E3RbUX2wT5W0kJIppnqj1FQBD8Gr_UiOrIbMeHGDZl4rkkapIewhFoQixGxrOYyzV4E66cX1iRfU9v-shTTyWbRR-RmVDzJuoBwVxmSxQnDkHNhBoRAA56MXltNTh304pV0HyyBaw-MM-SABREYEiGrqtv4iRlQKz1p4cQgyAS15VhHwSq7thYul6wTtJ5VlqbgIOrHb0IZgtley0ILzvkOuW_FE_lvvW_vk__Gn9r5GNWQIfdvzYxwQMJfX7_fd-5G11Ab4SnJoT2CPWSOh5idR0IslbCiQOGNFqGOiLRDhaaQfJu_PeWf1O3LmWK0J7fbRv0DOjOAQN5U9Jba1z2SAjjiG27lZJpfprfUgtPNjUnW_jHd8IGbWsn6dG_Mrg0Murs4j-vvoWyM60UtvByfBCsCPSFlQ24qLJXi7WEnWpdXR4sO5PqzRJ7UDvPZNImveytTTAURYU2XlpM4pJiymtMA6loAE4U9n4MwF9Ij0lJEAHwrCOrlBd9-xt-vLNVZ3BBR37-tr6JrBsL8YrtKDHKv7_NXUbaLYxN-JPz_HHIbspq3QhLmHeFXpQz43hx-VRpmoh-6jHMTQ5uvm5nWz4pqli2JwT2qENjbiSAUgJS80fvnErRGa8ZZRrENgo6AXGno1YdMb4UEu-rQLebIVx9TblyNYSt2hpu8TNShYYx_zc1y8N7CrfHavvILkQAwktGKi_Glyj8jVer3QwrwVwXl86KkEE6Ms_mdEzEDTczIJZHerZPTFW1d9fIUA8cCjWLgSqxXfz-bukjyTPc7t6gDpY1QDhvHUHTZsBrssWPTvjpZly-Tiy6EBqQqfYtqakZYyUnahNN4hKAgWhy_QSOSw9XkqZB_jKpS_f9TPoL4UlLad3muR5I9YBk1UXUTGW2MNkKROaY6sj_KpuaEYE1QwH6KcKtyp7obne8v7mM6TVhH6nRBwK_rTviP_zg2lPLqY23pP2MJgnDWSsVb-XVDwi_erj3VL7lPSsUj9WQc-Rf0MFPWbW52wOSO-_vpyqho8hb9U72IiUEWwjwfveHuQkLXKhEmNzjvMemnCgXSdHt_hjzgLYlx2wIKwSYOjtHq_5J2U2mrjuEISbhhN7-Jrc_pL4Kdww-o3-prv86A0qZWSJEvmITPnJPO13w9v-F0j9IhrG8CAfo6KVS2iP6tvCrVgt5Vd0uMR4mOi-tfa9xJmbOdsx_ghH0Y31Nw2iS46rSe1gKYKkk3B5MMI4CeApno_pB4tLnnO2y5eIdohgCGbA1Ve7BymQ4jMzNmaDURje5OdyG6Jmrlb4PUQ1pbchwt5_LaQhFlUi-kP2nJks5eETrYOnRe6IQwLqI4CsAl8k2JxmXToxGhfV0fUHglqF_rjhNImA-fuQ1Iph9J_mRiLCy_7chIKWvGGKglTcJIUg-Cp3Uo84t2Lyl4GenmOAEyDhh5tQeqjw_cgQR8VhnbCrDL4mkCo8Med5COq3bMPXFRUBHIVKscSxSEf3gxavvZJAiN7Wg9iq4-ET1ttfvfXGDqnLx7HhrrCBmAM_SUlK6JLMglvDeHyK8gLmXXL0w910dzMB9q2RG5qxBvwJQJGdMDXMZzbCs9hjG-kQVyV_2RP0Cntc668LAE81mYbdj5ZHX42HqCDFErKsoEQiCGuhAkxaDG1vg3xp_O_ysVkg6ceDb0P7jlvLgX7H9gBk8PJM1lGstqdj-bep0ZzG7o__DZox5qn_qlTOT9eZKJkn5aM-JQfysJtpj1dypmNZnh7cN_Xo9tasUdg0I_4Ll2aBleTaJSQ47TfjDIMulDd_sVqdIFGDeM-vnFoqXPt1QXYeLb7Lm6FpP8C1JrIS5Iv44U_4TfD58q7gZjURWY32Q05wZp7JdTOgVZiAxoFNULbpB1HDDZcaPQliL4lzLbIhs_dhMg5r6pl2z6L3v6UboZ8M1zCZ1WmOwSrUde2V_Q62NbgGge4_dJDN9DW4U2syulByPANDlnp4mRFD-EKQ0LAwEdYFgmiCbVdjXws0zPEl5ujRdmqY1IFVH2Pl9PztN3aRcAuZZd8IDC5hK4IgbwuJJKQTDOAibtzJRk6N1GA3uftmxIFadgD8xM4Ff8s6JpC0czsWieMTPDKkmbpUstfPPHAKw76zxKlRdLp6ZaXEcpys1H4ZujpCo9KQppE4JhoimTJQQf1DIQustdE78O2dMn5p37QL1WpJdSMX3wwfVReCcz2c0Fa5nSM9kU0j8LK3TqebKPHkP2Rurh7J_WIGWxIj02Kzn4jasx4MW08OTktN_MqsfuPqswysa0BhHIuoycil8i8xBlUQiYvEMKetd8eC8YtSms5pecSw_deAlbuIhyPxPwvHNjlY_4fwsBIOKDZMnrTeYJN95po98TiXOzhXJG4nzQGaZjaq6Nyrp-JPhHSpGVjXhxeuySIA6LD0YJyFczmhyvHrI5garqrbti_1p1FJ6Uq2Ho26MS3hor5uPOeTyDRGJmsgyHC5sGpOwmUwXid-3fNM2AE9F2opPPVB5IvB3eaUjlubrSsxEJrjzfp4v0omYRVarEBvgn0KAeOtq_9XyCFBz15GSea0Yg27bpEv3HQEz5tf8Z1K5K_qTalyVnEzYBp5CPwFDcy6JhNqMAzZ5Jck5H7Owvwxl7OR1PAGOu4okLT55BwZ4bWiN0X9dKjKPQjzVRl_aBK1U9cTi0_4bB82vv4PHGNW5aoJTaZZ3hBxnFsGF9BMnWHkNCXToAvZyi4yZ6JHD8Gg9maYt9p3C-sWHGvqUQ-19wprWgqIPqHpYMFn1o5zR0kqOeA9cFtxXse7kg3HobyqN0XqlwNKWjaSVfvdEUUK0qctjKw4BN_5PI4c9H5urqc5Dc3gEyOZN5fHFh8d6WLJLuXysdyy6XwrBeWiZr3SHaonhsaAc4P1EvzGABvZvSjXW8I6PZzB7Nf5HL8UJzEppx_mTNm5MrCDxHVDHeo1dgKCnE6KzgIRhUYdHRXGJjsmK3G_haJsI0jCA3AmW2DCQO3Iu2othBj2ZsH2TGpkenNJd5G3Wx6CC49kaoVUJwLB7799EgJkpqIDxEyJwh4TJfNhoIkm_6XTMklcuglFO4kCZOR2cyBeI3X18rhMUEIErk-hrvILQ-j9vqoA5gw_53l6qo9c_ALRS1JtHNOfyqCBQPZTTg9ZLIG4OyrizL_gIADjglahQ0jlvycyiD3dfHnaLXAtLVoOE4MnO5nXKy83R_AIlOwZhvMHIRwv4gJKP1s87n3qvU634FoySOIqRh6tpUltLmk4rIeoe9mYsfdtXiKx3LUH9-xDd4Q4KSRgw1kURLJqGRn0K3Mnt7hBsm2FyQSW4CO3oknDlkzLs-aTMQq6LZGw0k4cXKPbRgFNTXpce7d4yXturLS4tTx2u3SNhNNRApSwQSymdy5V2Inj7jMiKym7EIZMHo1_lm10xTkMMIcsTRx7JRarIiBC1VMJhNafX4PPRmNXfA6ba-NPA5P7TsbWXVfXZ5yalCPome9jVxjte2UQVeYYv59huGQnBj20TUOXsu9twaz28un0iPkpLneYz2qPJ28GsatB61tgNUdE6-AK-6-kaWAhkBvbyvEhvwUBXG8eFrpZyutLHQ227rNbU-2LiVQqBIttMs1QIP2skqpmmA_sTvo7KXG6VE-irccX6uFM3y5CCTZqOf7mPtHXMaVGME6YVEX5_LnQ8HLl2mSvXBF9VXXMeq2KKlwwNnsUtx2PuGLgmUXr_NvFQCPWszJ1QjorvyCeT0y1jpRR3obU0RioyUwqSza9C1Y7zqnZtxXlABORLES3fd2uUSx33eQPhrLdNiXwfMPkxOD2jlFMCl-LxU-_t1aNLTwl7pkJYwXb4tR8Debjgx9REKRntM9dGFHzJn3xgxE-2seEH2WYMGaSJwRBEs8dKls1d-KMU6pWzu1owyvVReSA8zE1soFFeJmtsF0gonWP6O3LdWYkfX0s5GkLJNyY0VQAPOORoV4Eknfixl365GQZUjKh4Jd_vf_tcjdmS4GB6gdkTYVwdQotr0JzHstZ3oGDg6ofsk48jdCfraMR2IiREnHiDT_8OLTo2tPQ-25X0HzFz1Oa1kDAfyoK4mNjftaiHjLX3OFFn2GpcC_81o5tZWTKOBtrN_WnpRTxr70T_R6XaVDJQ-JmPNi1joNQSMKCtte4ZKTpZ_OKBkH1MNe4qUnTWUC7Qajj8VB3XVe4X_mK-WTiyvZkLLXaNjR51_RjzMxpEcS0gaTxGlffVyfnoBKY3-D5mMXtPy7HnPNLPAfJTZcpdmKmsGhFg7TJJ-w-hBatiVaRXB4kv_rsfiC3gn66DjrShQF6IVvCKtmjKrwaGhu2V-gh117ZtoU5aUrlu16_7VprUEdwRttx231F8pP04dIwgIVnR1czNsQQy-o4gAfpw81QT844-ojCVUFz2gN39Jo-hrJta0w-B9-uklNZqRJin0ZMpNu8QjexnKQutdWUVbTWMa6lreb1IT5sSymfP3_8kQiRIC7SAdr7MzmfCy26PFGqrPuA9EZukKimzo_Xp4BXNOmijY2zNX_nW0PS87dgrYRISgR5eySN-8-D-83nEblCcHZ-VBY_qhEtKvQrL31lC059B8-d4f7MRMl-VTnEJMtjJ-aDHPGaLts90nMI8zehr-UwOanXbjj04SBZXzfX-Mnfrk2g-aRVGE1YkjpTBF85XD2KWTJrs6IdP5x7uhpDUajJIMMiHZsiys0DkkvParn48yCbu-4W5ydPHh56Z4nbmlnjsRkkXZ2LvJGFyvPxPTRZ9ZhJmpjyuyGKa608weS86spOtmH3SQqjnpaWMuX-091tt3En6yPzgjFv3FjjpNMhcOcMhZFgDSVlqzw7YZd2EsKMMRLbLHGFsRVJDWOjrHZJUyZTHzx56wBT7YTyMROY7-2EzvLraeePI0XVf_DPPgA1oQ7yjNydg24-n6H9oZHwnnamOmi64enoSV-n8QlXOFHCTkjf-bOMzTUX9Q__LaGMjSSPa4nkUXobSwHPOYno7HxbOEDzPvyC8SjzAMi-MXLsweMkZ05RMGjxXjM6efbAJKryPJ76sQmPeGIicr2ws1rhK8ek5uer8u55v5cUCe6svzPv6iv-5xRZypE1k2IaSPiGIQcz_P_2-ipzLIEY7vsKuaaslpxbxE6XRtXBH5a4TueEEvX5MtAaCwGayf0eopNaZyMO-A3THCU6rJAKLGg9Td5vGYnEu3Vrbje32W2iUeQR0ZOX935-UXZo2pLRgTv6yBNMhidPvAlALa4t-EMo83BG78rhDR68-hOLyx4X_VKufjXmblmdaxPN9j6ZvZLqzaOt_iP2JoH6Eil82OE0MWzjZW8m12duy7cm6mGpCJFiSOq-kNU4FmD4OnSQxYAREHw9MfOpBiWPmHWhAXlilAzvPLrXOYH5chyty1KFJhGFxIvE9n7XEuoAIxqeL7CNgpi_5bCnGAYs9sFIMiq5Vca5i8E_8s9-wmweeZOs9_FWJxeHz_qNC3SKi5-SRpn61_rUS4kKWgY2SvVYG05Zsnw0dMoxUo0l1p5bctyayKZuXLaK8QZWJisY4k-Gm8FtORpMjRUusnvANNhGyCganrBBmhkIspZ7KgsQ4mrmS9YBy9_Bx2IuffpYSgJ11JjSD3J5Id_H3Wc-o5RjIGwJfxOcLvUlS1n_xkU0llHdFP4e3MiY4_-4bE-sq8sclDTI7ykWkn47Oy1pG7tUm1qjScnBygOjAvWa33tMOPspW95m-8vt41k2wneeMilSUTMNgb3vlgaV07kkaF01Lohc7G6BX5QPh1hmS1A67kGSu6wbQWrYf-MOeg1KXkSyxok3LKC_wMT5cj1JgVsApT4FhDaRLXRJJUMB9EQzeEL9QbqJIeQ3_bpGrkAX-YVz_2pSGiqO8KsSo5mU1ZpDp_r8hZNnnLtbCpPze-IR9Kvva8cpIOl6iDo0IDwcLuMqdkQFk4Fx407IOaa49EGrK3iR0ULv0Jre_tclcuWLI3DNhcWXhSHuR_SXsR9PcsUvorImtuzCKbL0egrXapxWSasclOZgq7lcMxDC1mJCIFjO2faHVNSGJEcvk1QASY8bN5sc_PIVEPqsr2p1O_uLQGFEQ8Wx8XIEpOpI7n2Tha2hUPtBZpAI6vjVMYyiqKWEVD4UYrjW-UzI87_Y2iPTKXQlAABa6jxEzDPyISCq5ADYYveLngSrSGZ-t0SmJbOJJshNbqBR964eNP3milrtmf3r4XGbzLFyefa-JaKfAjTLpdnJm2avREG53rs0kFobdaVov1UGaSx-zqrIHCqbuRsTUZCzYdRUYyc539986Os2PwWFV58Eu3Ni6ADG9JKpEIFs5zLyb9uE_FzBu0i46eaOwjxJD7aYZH9q8UOR1j_8KtIzWHnRC6j03Zo0_2KgjjSadBn_0KT8SISwSAv46kXqZSy71D543Xwb-6omFshXK7kS3yA4FTro_UJ6YivMzrvbP1v_Br3g7OtF7A_bbZk567tgq9nb_CAMBaZNuW8tCijA3wLlpfU09wCxlAHvW4P_qo66XAA2CeKfC5Hv4EOCq1_oCIhiix1TPh4jcCqK4ItHINBxXqXcEOnNT838TO0l61ukTMazJWbnb12oQvzBVVn7A-b2xof_gYeUbKkecO7gVJlmR9w674xrVUzjTJ1whCKX0xDAUNHhzxvUWI78aszV_5DURi4mhKfVvPXWOfeuXAQ8Ga_R_sfcrf3wG5wB1XuZMxSu3kFXXkf3o7DqXdLovj5kkPESY1dAOk4WvFbRHyY5cPB3ZG2F7cWmJh5OrnrsjPsu3j-oYn55IN2bg3YA-t-bqrCBhrS2tvPATHKAM7qpBLBRAGUtUCAwDPxxnUFL-FaNbN1gT16uJtGATsLr-DknJeSjzRjwtGcvY2PsZFlvAToEGn_x12iHo7hxthqlZVMJoNjeufbjM95mPSB7sXafbf3_cP_qcE0Klme1hzU030knRmrg4KHmr1cd7PYiXl2l3-QYiIFd9AoQ7k1DvyV3u21YwWHdhILQe_pcvpQ8aDrm7aCPaAv847xn_UJsiXPQRQJmE9-LJfruDT5_ai2X3mCg2XJcIMA_uKAOPUZfE_EPzNy6Hc4V39pzxQXPC2NK_P0qdLK9nsMmjWYm7Z88lTINiobEg6kJVtjarBKL6sDKXy98qMvcwW4NXcOKAOcbfugI726P6N8SC0BKRgzkV5JlvPtL-Pfmx-3XyW70Ewoa5lk_yEHwlrEWDwU-PYFUg5vvRn_NBEVkLKa6TIs3-6eA3kzaHFncvVshbeEhEzeUwvJvj7Y9WMUKy6ohgm38V_PQsdPm42C1ztEthgcGrbO0GtNMQNUVtTT6ONlF7KGcHWS2v0JxSmS9tOWYTB-iy8jgZ1dPi9lQKj-TFw4i9PyCtcNnT7AiiKTEoGcv3cqE03vyqa-fWQvr0rTHvSL1eOzuJJELtmg39u3NBiCwhqsbsqJ32T7fVE3hVTNjKMWkJhvEzR_YK3xw71wwRkFziQbdfmJxy5TJt5d8a5X5AMNnbsPNRIGOdcih9XEPtH6o2z9psQ97l4bwMk5iCFHoGTMM6VCw4o9Q-hYkVrS5scRojGVtlNod6lzp9PZO8vMY5pY8yb-2ULt-T90B5GawrwyMHNs-i9f4eHgKQbY0WYdXX6Z9jKKbAZIHVnPiSq-c44wdkmXPI5nncimzLdG_qBWRSI1v6hBZziCljL9El9o8ghEyHXSKvpR1xyQ5ObJdF1foVwvjYNYJGIDC35bQElXIfHRKpmIwdGhT8XPx_99ljW6jDltVSiec9SnLt0SPTTYbiPok2qXBaRdGynNG4WgvgRDpXoQVTOmS0_Sg5LNlgTm8swd9fW3UOYTony9lsJHGWNcoAvWDmulWfcTMQbx_3eAHd-KDFxmJUhmkv4vNUJMORUsSUiAVOIhqyyTPbwo5EBJ1QwUpHcKe-W6f7GYzg0ttcj9JbuSq0edGvlgajnP1LvOcjHjJZd_TYNm5bi3Plrf_Kz-h0KtZg2p44_I5tMUoM1Sv_sWzvbOxgkTnWg8LwFSCEO9sQP_VOd_56qGI5SVBlcQ4wsB_gltzAErWcTcyrWm66CjQXwUfq9c017jKkZiBUuvSFXia8ZO91569p2H56vCSiSa-E8t1f0TKLsa7KonIyiIUIcev6GIy4-WFTcrgWlghD8pcSIUbVnS4d4FIlBFtK9sa0EtpBXaYD67NdX0YSzoDs4jhj8oC1ZOOGgiKwB6DGKpfvRQZu4rVns6z8oBDKNA9eBTDYGD7gQvBKB5GZ2NjJehrDbaexB2dU-T3zzOjR0a4lnInEeh2Bbq6csgjHyTkTn3C99QxQ8yyFdz7295QdDLYY1m2N-2LvRfXUSuHxT2sycalfBMhZXBnpjpekMncGwU1z47ZL3WtQ6wWZ6Yh503a90qz0pjrx2NDcXvEgglWJDL0XPOkIiJ_dMpuSwXGy7uroSYZxm0vyT2WIqabr8nQqqyhv0rj-maL7-4Q50y60zbel2O6Yqgs6N57-J3VNCp2hFV8LBnydHiKAaOhd2ATs20-28ZFtFAzNwALHCW1pbKeRaEtENKwodFZ64qMs1vFR6BI-GldeRJVrTad8TBz44_d6x1fZ8JoMvbxBR3dNz6x3DDTAL2hSqiOGS1u04R1XZrJ1L0WM9LQM-8rxSZNWaqyNUWqFadGkiZL22gC4gmoqpJJn4urjmIUJfs460S-PfGriLU3Irn-f15Z0MSlI8Jz5Iw8ELMqOwZKw5YSMx2d0rFWbLhGMT4wj2DW4BOr-xZU17RdNJiv7OwldrC9QsrYXGcRy9upA2fyc-txFWkUAEC56LYU_BQ9LNnuuScKYbFyt2GGHAeXpflVpjf-GePPDbAz6VhV2bZ5--z31yvGyWWTublsej1mGjMR2hbAIi4YCjtuzjOnYj9SSIsWjRp_omK_6z28bBys0T3lZz2EI-ezxzA5WXccPB7_liM07ST80jVpzgkErFQvHg-CFfGQx7CVqKVh1xrJ6YEw7kSDy1o0BK6_Sck9hvRTDdTN1baOhA9JKLtwxEg19THJuoGdP5pbwmN4MfZNtBEw6lm17bnJ9-y-PHHjRXkRlS4itmh9WU5vncCZTP5nw0sSR8S5Lk1450YJ3GqB1omt1KSigdIZiMRWSjr4UAqZEt7sO0LiqtTrdr-4YNbsAIcbBf27dZxpZd_YGfL4gqdZawGnYXaHiPMV-9HxGYAe_VheVsnOIUPGOdWg9gQMGSClhOBFRGZf4sKQ7hDj11018tTxv4IJlu9BUZIOAEUZK9QrL2a2HRtGn39A8NLI9iFJqPtYvBlS78IQ_6M4OAf9WlG4K5Z8oYZrZrd2b__wUZaZ_NCaibRNsDOSotu1XpxhJjQRjvFC4DeJLoC-R5D6Ih-uMOGpvzgZ6vc9T9-on_-rROd1Xm2NmOu1Po_Ldw_sKZbxVBqWhrcGxpETYn8fUJ9RNfApEN83sNTWqk91C4DWZ-3wr1wq4TWz5K11wAC3xtzVNeNp-r8K1LQ0SXM87ZOVwGEg4a4C3z--0hYfXO7i9yPdlUTk6qdHEreggm7VJmsBejG3d1uGXC3DySJ-79JZuM4vB8VL8I6m5s5erWAgvqSN0Hd--lh7gr2ivExNQgD6bqgkKuN2dWBIHDnz9y49wSnAh3Cxiexu-W-Uh8Q58yyrh_Gg7GetP1EcAQmIt3NTTwPnhqIvBfZh8d_VyPZ2pHt7NBbTfJ0o7NI2s4zKhRgLkl9_4ssYhLvac7tMNCVbSHhGhp-Ah1IRNYkh3N-hdl1CEkgeOktJbl3YQbTb_Br4exEzPoFXTEM0whB-ulo6kPsfbezJRIs0CaQy3xvkR0WEXDnJ8i6ocv3VbRzMjEMh8yaPTIJSh7kcU85K02IOB8pw5MWjnWLqty3_gWwBM_g5ksY_fBDouTcXNUAunJ9_Zj9xLPVAxVAXrTQZMyg0i-GmFAsyVVulKbOrXkK60MZL30hZC3siA7ork7P9hs89fHCMD0SbL5hKTOrl7LPDwO7Z7NSRMnhOTfg2qriOcrk9uIcyazVJfcA-A6tbFvl8plXs_x-YP_EHjbnE8Ej8fEOm2b1gKOREekDRu5mGY9rbszX5uSBTHdYmcyvaaEWK7C5BPbO7O9LLPj4w0YQ1Da38ohPARpV4ZtSRBtbtal_29JIcAHKBO_IeJfrl40xJdJb9oY7Ax_6LJXw5joUZk51tGOpGkzJ_7U7DkKW5lBgTaHYycjkoISIB_x4lWwFeIyGBS6q_TvGWFURwty82RPYzlEy-lgDJpmYhx_maA1f2WBR6Yjaz74SzO_JgvbKoOIK7Rbnro-yKG-rXqghJdX5CVtNwOK8t6at6KxXHI-1OobjrOZyOk_0hL1zQS6aup60U8fm1nSw790Bho9jMKp8h0Tzl6CEntOu38Uy3OCJjYW9sCRRW0Tozse7hMgJhPdjrmGbyr-ZAVwdo_ZamyQLeBPjrBUhoNbEmiTQIQM3dGYGyUAE6B0dRIVckOnuf55GTMI97tPlNcNFF4TNc86S2RrLRy-WrbWldPS9w07QR4mUEzJ6belBzKSUYChJ7A6Af_2JssO2nuafu_8XAGhunPE-guzB9NyHKX3c1BUr9FbPhiy9eR_wPoEqbpLVW8ZHocOYal7Unqm3J4HmdTLI_IGqKc387vvPrWQGum7TFLZlXLN0sPFfW3QOZup7ZKGoxOhhvfF_3e6N8zecVOkbb0RUazKZgg-m0bkhodq_Ar3pqreMKqlTrSC-YU6UEhMUUAX0IHmVvpn9gE_hPs-_oAPB4ClbrtvtjuB9iOzdWhuwT-8__tjWQQ3l6jlNeTGGc3THmJcF4ERoXZ9-t8pDqXJEwisIgtZ06wRq7C2FeqDhkvwzsex6n37eHVtUF1Z_I3nd0eNbty-vPL5zYl95J1Xp0Ry-VB0tHns3NoxZjAPjiwI-YIvDRePaU7KBG-4eNjtZlg9BxW9ScBjh0EuUGBsSeZpvDl0Bzor9LZurys-xm-ixAhEnFBduwdPyDxggG5rDcLeRgpFkspXkxxQadDQU38SWi7fgR7dv_h9FZdpG5lfoW7sYWMwCT593BSf29HweIbbiX4NSqTBoHUvtSYQ0thfEVBjyym55u9tnrbd6h1EatqIyHa816z9TLKovjWTCOrqNFk0kIzJ9xBemK5RjOlLSc2JJX1uhcInh1GfIB7nORtEmYptmEZXW2HdcLzQbWJ8o8xvqIP5PfZpWcEiv1edbEKd48HSswQ2WbJJqm71be-ULOjf50HbShta1E1s0jwMhZQUGYE4eDNGFuZ0i0tBWzuWUReB__3QfP1pZDjhalHueQkbwsx4Hu69vtRNn2PkQ3GyNIRkJpiZ6sYEAxa9DSiJ3hvy5rTzf8k3igQFFUFklOVW6fEVOUb27VBz_W537sss7JcLnsrieoB0gIrSkxUeNGBAU-5jMlHgX3f38lPKd7sETwqM9encmkh_yql2oZH_MqT9UTKRKkkuFTqA1xodbSamXeDGrE1LdT6Eo6ZlOiIj0tSFBzRoVunjFErR15O3v_cb56Ysj97WBHN_k508rU4DOMLV-r-KNSvHzbegNDx0NoMFZ02JOpFeKM8mnMyrSDHe4w0N1UErZK_60LHUhoM3_kp54wdhKRzBF_GmUqqfue7uc6yfTV70UW4db5_aVyBWYzn1t2mho1VbfUoOeRCbQvOO8Rj3Hp63qgMpNt7awU_OYgsCIy60KPfWROkNlq7rMZDpRE23W6OqDu8VrYAr6pQtdpNLxdp6HGFH85_WdK_lWXe3VEOHUQGledMinYnnnhn19FAsP220CU_ZcMjlJRA4YHFZGdvvaL7FrqxwhUdqkE0mEOcEyuEuIusadYXivkQN2d27Da9e1JxbuYS0IJfDKPA00UFefaiAgbCNW1esAT8vER6ToZ5D-PnrCIKJlvaBUDgPlsvsGYnTo-_0K7tXQ3oERZRN3gtCGYKUh1fwT1VZTOlUJaKHD1FI_YDsvsqPE5jMFWUOLTIF9LTNhDhc68X2I4IC7xJZyncgyuGrDUrw0AoWP7XT9y6WbrQRylFk4S88Pk6UDiwtRaBISmY_RGQ6aXzbS5Gb9flgNjwI-9MQn8LaqrNr0ySMSKc_xXj3GQzma3pe34gi160ciPBjTa4tZXj-HtXqV-CiHlK07kd88zGLhUH2fi0suGgBzg9U4j70Nj_mj_rMjQeGUL_nT32noLLXA20hy_mTg9h4WP-P5wZkWc-a5ZavAYWglbIUhAL1XRKUwtL2BWCvgFm25bSqDeVVzPKw6RAOIV86S4h79m-r2cHWZxFvIzJkocVlXld4cz1aVTRe4H26ryxteARKzE3KTfvPHpulZTSRG_6y8w9fizNMrAClJmfIWlWWujj32Umjl8kSV4JnRfssixCGcNyXfIHR26QWHoOlANJXLpukSy76crzxm9ALLUllE96lt6vjto3t1l7WOUKbih4XQkWBXC2jpGvjvENn55WhtlxZZObvCjOJabfXOXuW9xU6mJSwsa_MlL48GtU88et_IOkK-moGMs6yZDQaJhf4t8kPFKBigqdjm3cj66qZFxBu-1dXd6w5Pm14hd-Ym9zxXPOhjXeIXQuWbB50yjdgdUY1eDxK895fvHNu8p2kWmU5NApQUZRTIRwR4NkkfX_um8J_CfqlNy6ATzCNAz8no8FbPh_Yy0cjk32SMeribLRkqoTcLjiY0Me-dYjKYDv2uPGJm7mPehsWUVRk5nqbUpkwqdTPFtDKUoeGCaDi6qLaYPN5Rkty5gkDBs6gBmSV6XYZHWGm3mZvGdBPvy1AQNFpZVMFbyobOVHskITtZn8agrUAzSgy0D4T4TeDYmdcsGfL0KT_nRMH4sdkorcJBpkwsafNxz1cxuSAh6Sw3I5wi_Pw3ViCq2-NhVNgkNec_2NBo4ILSApyqninTNa-O66TIAWdLUAYsjUyx6xiQFoFDakK8l6a39ZYItSPrlM_Mu5J0pnr7x8vfaf9bri1vKxzqtPkego2Gavtf_uKbBhsgeVKw7LQc9I_994F1azYvwHrhpoDraY_LrmiYpDDRdqMknNOvXTW36W2JHIPKjNqH0PD2YyqErtUU91d7w8WVCSLOB6SFNBjsmnypcBaKSR8gycU77Ir74OYcTrx7VNYQD-1HeF4RaVjSfAOpUd05YhwBxVjHbmd8_rNqswRgM-mWU-rdZ1VYF-ZNgDzPsDmsZBA5ebtmxjU2U84lWswVys9t-R65ijH5NngOywjTAehFyuLRrb_lf6hai1l-WCZLwG9-RS0WaoFIVv4nObhkamfaaBP8L96qhIw2gmNhf4RuaVqqdDiYaty8BHAdhVosL3wuGwtH8iXKRWEO92XOjnEe7R1xAZMERw_XeaMQNDOos_KmzO_uN99tjHis1B9aEN-GlpRkN6zY41GRuGCCc8DBcfG7dFVHxBoMgkhWCMXavaZ2Q664V1vyz8zbiNGanwjSV620uvjMGQlnR8bFYJRsALkEjacNNId20szmjR8ZJk_ommujGWW0VIT6_YYdKvDrhEh9rZNYbfAfEJRTRKrY2Dg06f5_kh0yh2a4uPo6N-_sCgZzI4sUNYzi9n35AX387zJ0G8B-kgj9NZUHCyXX-cEsysRBTKjDsLL_GwW7t0lFqw3BUKnhXxJYAgjLjywOIIPSS5jO7djb2Bz5XRwyLpX9NaEZNltkwaKltXEXcDRh4 \ No newline at end of file diff --git a/config/user.db b/config/user.db new file mode 100644 index 0000000000000000000000000000000000000000..540b509b63a202ce58a01c6109edf834f8d8aaa9 GIT binary patch literal 73728 zcmeI*U2oe|7{Kv(-SXCDX^|@5Ak|E(h}CH?9cU8Lre!72Ze2pt7Fr=@IkCH%CUF)! zqeViZo5q*nh7Z9dw+QW9aDl|lE;z?dTsvtexI@-IYS-iAa~_}bJCE&p>AJ1W4ac{& zeRt3`eeF(WE~6-!2bz}2Wah=^d*XBaniGYK;|=juiIvYQ&S!2I@0W7FX6CbRGUa}G z_R7zt-%GDcwab6b{y6)f_*da>{*U~tyq^0l`zH7LyfD-wfB*srAn-2*PV~8)y1cBs zEcj-tW1Ahj+j82*3wz)>Zf|09ezjSvZr8N!>cfqiHnCHy6bqwnMsL{FzN|J^*Q(9R zofTcHH@3C<&c?=dtyoxX)VH>q)%E)JWCWvs*w(&iu0N?Z_q4~gJ*^Uprx*2m^I3Is zS;;s(%Rcg+cf=jpFo(VyY#S59F>X&($a{2Ns(f9}s<#)FVbIMvGQ45SYY&{3ZFs)v z+tKFSXtwM1Piwo{bVIFC*P_N+CFrd0UdgIA7nSGJ!Fy)+G;%ITWV60t2?W>DW3r%b%(zSHsT#GssByEC*B zeeI*ED&O_Zj$!v5&lPP)3i7}r#|HjcJ340j@T~ftE52)u&qZeVxFW%qIPXMi6!k~N ztg0_4c9b0Qe6!rH>GV8NoSjOE)BQmnIdx${d3`TTBvCK>7Lw@`wEpjz6OM7LBAthW&UiC{)E_wUsp2tO9ELxz4lunRgyQG@d@fRZ)9YKPf3Wb!kaC`6fKyW5d5pLr`j-a+D@aE1qB2UKmY**5I_I{1Q0*~0R&Pj!2AEHU0NoF00IagfB*srAb> /etc/sysctl.conf \ + && echo 'fs.inotify.max_user_instances=5242880' >> /etc/sysctl.conf +EXPOSE 3001 +VOLUME ["/config"] +ENTRYPOINT [ "python", "app/main.py" ] diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 00000000..5082e468 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,32 @@ +pydantic~=1.10.8 +SQLAlchemy~=2.0.15 +uvicorn~=0.22.0 +fastapi~=0.96.0 +passlib~=1.7.4 +PyJWT~=2.7.0 +python-multipart~=0.0.6 +alembic~=1.11.1 +bcrypt~=4.0.1 +regex~=2023.6.3 +cn2an~=0.5.19 +dateparser~=1.1.8 +python-dateutil~=2.8.2 +zhconv~=1.4.3 +anitopy~=2.1.1 +requests~=2.31.0 +urllib3~=2.0.2 +lxml~=4.9.2 +tmdbv3api~=1.7.7 +pyquery~=2.0.0 +cython~=0.29.24 +fast-bencode~=1.1.3 +ruamel.yaml~=0.17.31 +APScheduler~=3.10.1 +cryptography~=41.0.1 +pytz~=2023.3 +pycryptodome~=3.18.0 +qbittorrent-api==2023.5.48 +plexapi~=4.14.0 +transmission-rpc~=4.3.0 +feapder~=1.8.5 +Jinja2~=3.1.2 \ No newline at end of file diff --git a/setup.py b/setup.py new file mode 100644 index 00000000..efd33dd2 --- /dev/null +++ b/setup.py @@ -0,0 +1,20 @@ + +from distutils.core import setup + +from Cython.Build import cythonize + + +module_list = ['app/helper/sites.py'] + +setup( + name="", + author="", + zip_safe=False, + include_package_data=True, + ext_modules=cythonize( + module_list=module_list, + nthreads=0, + compiler_directives={"language_level": "3"}, + ), + script_args=["build_ext", "-j", '2', "--inplace"], + ) diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/cases/__init__.py b/tests/cases/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/cases/meta.py b/tests/cases/meta.py new file mode 100644 index 00000000..6b2685b5 --- /dev/null +++ b/tests/cases/meta.py @@ -0,0 +1,945 @@ +meta_cases = [{ + "title": "The Long Season 2017 2160p WEB-DL H265 AAC-XXX", + "subtitle": "", + "target": { + "type": "电影", + "cn_name": "", + "en_name": "The Long Season", + "year": "2017", + "part": "", + "season": "", + "episode": "", + "restype": "WEB-DL", + "pix": "2160p", + "video_codec": "H265", + "audio_codec": "AAC" + } +}, { + "title": "Cherry Season S01 2014 2160p WEB-DL H265 AAC-XXX", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "", + "en_name": "Cherry Season", + "year": "2014", + "part": "", + "season": "S01", + "episode": "", + "restype": "WEB-DL", + "pix": "2160p", + "video_codec": "H265", + "audio_codec": "AAC" + } +}, { + "title": "【爪爪字幕组】★7月新番[欢迎来到实力至上主义的教室 第二季/Youkoso Jitsuryoku Shijou Shugi no Kyoushitsu e S2][11][1080p][HEVC][GB][MP4][招募翻译校对]", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "", + "en_name": "Youkoso Jitsuryoku Shijou Shugi No Kyoushitsu E", + "year": "", + "part": "", + "season": "S02", + "episode": "E11", + "restype": "", + "pix": "1080p", + "video_codec": "HEVC", + "audio_codec": "" + } +}, { + "title": "National.Parks.Adventure.AKA.America.Wild:.National.Parks.Adventure.3D.2016.1080p.Blu-ray.AVC.TrueHD.7.1", + "subtitle": "", + "target": { + "type": "电影", + "cn_name": "", + "en_name": "National Parks Adventure", + "year": "2016", + "part": "", + "season": "", + "episode": "", + "restype": "BluRay 3D", + "pix": "1080p", + "video_codec": "AVC", + "audio_codec": "TrueHD 7.1" + } +}, { + "title": "[秋叶原冥途战争][Akiba Maid Sensou][2022][WEB-DL][1080][TV Series][第01话][LeagueWEB]", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "", + "en_name": "Akiba Maid Sensou", + "year": "2022", + "part": "", + "season": "S01", + "episode": "E01", + "restype": "", + "pix": "1080p", + "video_codec": "", + "audio_codec": "" + } +}, { + "title": "哆啦A梦:大雄的宇宙小战争 2021 (2022) - 1080p.mp4", + "subtitle": "", + "target": { + "type": "电影", + "cn_name": "哆啦A梦:大雄的宇宙小战争 2021", + "en_name": "", + "year": "2022", + "part": "", + "season": "", + "episode": "", + "restype": "", + "pix": "1080p", + "video_codec": "", + "audio_codec": "" + } +}, { + "title": "新精武门1991 (1991).mkv", + "subtitle": "", + "target": { + "type": "电影", + "cn_name": "新精武门1991", + "en_name": "", + "year": "1991", + "part": "", + "season": "", + "episode": "", + "restype": "", + "pix": "", + "video_codec": "", + "audio_codec": "" + } +}, { + "title": "24 S01 1080p WEB-DL AAC2.0 H.264-BTN", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "", + "en_name": "24", + "year": "", + "part": "", + "season": "S01", + "episode": "", + "restype": "WEB-DL", + "pix": "1080p", + "video_codec": "H264", + "audio_codec": "AAC 2.0" + } +}, { + "title": "Qi Refining for 3000 Years S01E06 2022 1080p B-Blobal WEB-DL X264 AAC-AnimeS@AdWeb", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "", + "en_name": "Qi Refining For 3000 Years", + "year": "2022", + "part": "", + "season": "S01", + "episode": "E06", + "restype": "WEB-DL", + "pix": "1080p", + "video_codec": "X264", + "audio_codec": "AAC" + } +}, { + "title": "Noumin Kanren no Skill Bakka Agetetara Naze ka Tsuyoku Natta S01E02 2022 1080p B-Global WEB-DL X264 AAC-AnimeS@ADWeb[2022年10月新番]", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "", + "en_name": "Noumin Kanren No Skill Bakka Agetetara Naze Ka Tsuyoku Natta", + "year": "2022", + "part": "", + "season": "S01", + "episode": "E02", + "restype": "WEB-DL", + "pix": "1080p", + "video_codec": "X264", + "audio_codec": "AAC" + } +}, { + "title": "dou luo da lu S01E229 2018 2160p WEB-DL H265 AAC-ADWeb[[国漫连载] 斗罗大陆 第229集 4k | 国语中字]", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "", + "en_name": "Dou Luo Da Lu", + "year": "2018", + "part": "", + "season": "S01", + "episode": "E229", + "restype": "WEB-DL", + "pix": "2160p", + "video_codec": "H265", + "audio_codec": "AAC" + } +}, { + "title": "Thor Love and Thunder (2022) [1080p] [WEBRip] [5.1]", + "subtitle": "", + "target": { + "type": "电影", + "cn_name": "", + "en_name": "Thor Love And Thunder", + "year": "2022", + "part": "", + "season": "", + "episode": "", + "restype": "", + "pix": "1080p", + "video_codec": "", + "audio_codec": "5.1" + } +}, { + "title": "[Animations(动画片)][[诛仙][Jade Dynasty][2022][WEB-DL][2160][TV Series][TV 08][LeagueWEB]][诛仙/诛仙动画 第一季 第08集 | 类型:动画 [国语中字]][680.12 MB]", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "", + "en_name": "Jade Dynasty", + "year": "2022", + "part": "", + "season": "S01", + "episode": "E08", + "restype": "", + "pix": "", + "video_codec": "", + "audio_codec": "" + } +}, { + "title": "钢铁侠2 (2010) 1080p AC3.mp4", + "subtitle": "", + "target": { + "type": "电影", + "cn_name": "钢铁侠2", + "en_name": "", + "year": "2010", + "part": "", + "season": "", + "episode": "", + "restype": "", + "pix": "1080p", + "video_codec": "", + "audio_codec": "AC3" + } +}, { + "title": "Wonder Woman 1984 2020 BluRay 1080p Atmos TrueHD 7.1 X264-EPiC", + "subtitle": "", + "target": { + "type": "电影", + "cn_name": "", + "en_name": "Wonder Woman 1984", + "year": "2020", + "part": "", + "season": "", + "episode": "", + "restype": "BluRay", + "pix": "1080p", + "video_codec": "X264", + "audio_codec": "Atmos TrueHD 7.1" + } +}, { + "title": "9-1-1 - S04E03 - Future Tense WEBDL-1080p.mp4", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "", + "en_name": "9 1 1", + "year": "", + "part": "", + "season": "S04", + "episode": "E03", + "restype": "WEB-DL", + "pix": "1080p", + "video_codec": "", + "audio_codec": "" + } +}, { + "title": "【幻月字幕组】【22年日剧】【据幸存的六人所说】【04】【1080P】【中日双语】", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "据幸存的六人所说", + "en_name": "", + "year": "", + "part": "", + "season": "S01", + "episode": "E04", + "restype": "", + "pix": "1080p", + "video_codec": "", + "audio_codec": "" + } +}, { + "title": "【爪爪字幕组】★7月新番[即使如此依旧步步进逼/Soredemo Ayumu wa Yosetekuru][09][1080p][HEVC][GB][MP4][招募翻译校对]", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "", + "en_name": "Soredemo Ayumu Wa Yosetekuru", + "year": "", + "part": "", + "season": "S01", + "episode": "E09", + "restype": "", + "pix": "1080p", + "video_codec": "HEVC", + "audio_codec": "" + } +}, { + "title": "[猎户不鸽发布组] 不死者之王 第四季 OVERLORD Ⅳ [02] [1080p] [简中内封] [2022年7月番]", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "不死者之王", + "en_name": "Overlord Ⅳ", + "year": "", + "part": "", + "season": "S04", + "episode": "E02", + "restype": "", + "pix": "1080p", + "video_codec": "", + "audio_codec": "" + } +}, { + "title": "[GM-Team][国漫][寻剑 第1季][Sword Quest Season 1][2002][02][AVC][GB][1080P]", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "", + "en_name": "Sword Quest", + "year": "2002", + "part": "", + "season": "S01", + "episode": "E02", + "restype": "", + "pix": "1080p", + "video_codec": "AVC", + "audio_codec": "" + } +}, { + "title": " [猎户不鸽发布组] 组长女儿与照料专员 / 组长女儿与保姆 Kumichou Musume to Sewagakari [09] [1080p+] [简中内嵌] [2022年7月番]", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "组长女儿与保姆", + "en_name": "Kumichou Musume To Sewagakari", + "year": "", + "part": "", + "season": "S01", + "episode": "E09", + "restype": "", + "pix": "1080p", + "video_codec": "", + "audio_codec": "" + } +}, { + "title": "Nande Koko ni Sensei ga!? 2019 Blu-ray Remux 1080p AVC LPCM-7³ ACG", + "subtitle": "", + "target": { + "type": "电影", + "cn_name": "", + "en_name": "Nande Koko Ni Sensei Ga!?", + "year": "2019", + "part": "", + "season": "", + "episode": "", + "restype": "BluRay Remux", + "pix": "1080p", + "video_codec": "AVC", + "audio_codec": "LPCM 7³" + } +}, { + "title": "30.Rock.S02E01.1080p.BluRay.X264-BORDURE.mkv", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "", + "en_name": "30 Rock", + "year": "", + "part": "", + "season": "S02", + "episode": "E01", + "restype": "BluRay", + "pix": "1080p", + "video_codec": "X264", + "audio_codec": "" + } +}, { + "title": "[Gal to Kyouryuu][02][BDRIP][1080P][H264_FLAC].mkv", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "", + "en_name": "Gal To Kyouryuu", + "year": "", + "part": "", + "season": "S01", + "episode": "E02", + "restype": "", + "pix": "1080p", + "video_codec": "H264", + "audio_codec": "FLAC" + } +}, { + "title": "[AI-Raws] 逆境無頼カイジ #13 (BD HEVC 1920x1080 yuv444p10le FLAC)[7CFEE642].mkv", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "逆境無頼カイジ", + "en_name": "", + "year": "", + "part": "", + "season": "S01", + "episode": "E13", + "restype": "BD", + "pix": "1080p", + "video_codec": "HEVC", + "audio_codec": "FLAC" + } +}, { + "title": "Mr. Robot - S02E06 - eps2.4_m4ster-s1ave.aes SDTV.mp4", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "", + "en_name": "Mr Robot", + "year": "", + "part": "", + "season": "S02", + "episode": "E06", + "restype": "", + "pix": "", + "video_codec": "", + "audio_codec": "" + } +}, { + "title": "[神印王座][Throne of Seal][2022][WEB-DL][2160][TV Series][TV 22][LeagueWEB] 神印王座 第一季 第22集 | 类型:动画 [国语中字][967.44 MB]", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "", + "en_name": "Throne Of Seal", + "year": "2022", + "part": "", + "season": "S01", + "episode": "E22", + "restype": "", + "pix": "", + "video_codec": "", + "audio_codec": "" + } +}, { + "title": "S02E1000.mkv", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "", + "en_name": "", + "year": "", + "part": "", + "season": "S02", + "episode": "E1000", + "restype": "", + "pix": "", + "video_codec": "", + "audio_codec": "" + } +}, { + "title": "西部世界 12.mkv", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "西部世界", + "en_name": "", + "year": "", + "part": "", + "season": "S01", + "episode": "E12", + "restype": "", + "pix": "", + "video_codec": "", + "audio_codec": "" + } +}, { + "title": "[ANi] OVERLORD 第四季 - 04 [1080P][Baha][WEB-DL][AAC AVC][CHT].mp4", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "", + "en_name": "Overlord", + "year": "", + "part": "", + "season": "S04", + "episode": "E04", + "restype": "", + "pix": "1080p", + "video_codec": "AVC", + "audio_codec": "AAC" + } +}, { + "title": "[SweetSub&LoliHouse] Made in Abyss S2 - 03v2 [WebRip 1080p HEVC-10bit AAC ASSx2].mkv", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "", + "en_name": "Made In Abyss", + "year": "", + "part": "", + "season": "S02", + "episode": "E03", + "restype": "", + "pix": "1080p", + "video_codec": "", + "audio_codec": "AAC" + } +}, { + "title": "[GM-Team][国漫][斗破苍穹 第5季][Fights Break Sphere V][2022][05][HEVC][GB][4K]", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "", + "en_name": "Fights Break Sphere V", + "year": "2022", + "part": "", + "season": "S05", + "episode": "E05", + "restype": "", + "pix": "2160p", + "video_codec": "HEVC", + "audio_codec": "" + } +}, { + "title": "Ousama Ranking S01E02-[1080p][BDRIP][X265.FLAC].mkv", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "", + "en_name": "Ousama Ranking", + "year": "", + "part": "", + "season": "S01", + "episode": "E02", + "restype": "BDRIP", + "pix": "1080p", + "video_codec": "X265", + "audio_codec": "FLAC" + } +}, { + "title": "[Nekomoe kissaten&LoliHouse] Soredemo Ayumu wa Yosetekuru - 01v2 [WebRip 1080p HEVC-10bit EAC3 ASSx2].mkv", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "", + "en_name": "Soredemo Ayumu Wa Yosetekuru", + "year": "", + "part": "", + "season": "S01", + "episode": "E01", + "restype": "", + "pix": "1080p", + "video_codec": "", + "audio_codec": "EAC3" + } +}, { + "title": "[喵萌奶茶屋&LoliHouse] 金装的薇尔梅 / Kinsou no Vermeil - 01 [WebRip 1080p HEVC-10bit AAC][简繁内封字幕]", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "", + "en_name": "Kinsou No Vermeil", + "year": "", + "part": "", + "season": "S01", + "episode": "E01", + "restype": "", + "pix": "1080p", + "video_codec": "", + "audio_codec": "AAC" + } +}, { + "title": "Hataraku.Maou-sama.S02E05.2022.1080p.CR.WEB-DL.X264.AAC-ADWeb.mkv", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "", + "en_name": "Hataraku Maou Sama", + "year": "2022", + "part": "", + "season": "S02", + "episode": "E05", + "restype": "WEB-DL", + "pix": "1080p", + "video_codec": "X264", + "audio_codec": "AAC" + } +}, { + "title": "The Witch Part 2:The Other One 2022 1080p WEB-DL AAC5.1 H264-tG1R0", + "subtitle": "", + "target": { + "type": "电影", + "cn_name": "", + "en_name": "The Witch Part 2:The Other One", + "year": "2022", + "part": "", + "season": "", + "episode": "", + "restype": "WEB-DL", + "pix": "1080p", + "video_codec": "H264", + "audio_codec": "AAC 5.1" + } +}, { + "title": "一夜新娘 - S02E07 - 第 7 集.mp4", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "一夜新娘", + "en_name": "", + "year": "", + "part": "", + "season": "S02", + "episode": "E07", + "restype": "", + "pix": "", + "video_codec": "", + "audio_codec": "" + } +}, { + "title": "[ANi] 處刑少女的生存之道 - 07 [1080P][Baha][WEB-DL][AAC AVC][CHT].mp4", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "处刑少女的生存之道", + "en_name": "", + "year": "", + "part": "", + "season": "S01", + "episode": "E07", + "restype": "", + "pix": "1080p", + "video_codec": "AVC", + "audio_codec": "AAC" + } +}, { + "title": "Stand-up.Comedy.S01E01.PartA.2022.1080p.WEB-DL.H264.AAC-TJUPT.mp4", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "", + "en_name": "Stand Up Comedy", + "year": "2022", + "part": "PartA", + "season": "S01", + "episode": "E01", + "restype": "WEB-DL", + "pix": "1080p", + "video_codec": "H264", + "audio_codec": "AAC" + } +}, { + "title": "教父3.The.Godfather.Part.III.1990.1080p.NF.WEBRip.H264.DDP5.1-PTerWEB.mkv", + "subtitle": "", + "target": { + "type": "电影", + "cn_name": "教父3", + "en_name": "The Godfather Part Iii", + "year": "1990", + "part": "", + "season": "", + "episode": "", + "restype": "WEBRip", + "pix": "1080p", + "video_codec": "H264", + "audio_codec": "DDP 5.1" + } +}, { + "title": "A.Quiet.Place.Part.II.2020.1080p.UHD.BluRay.DD+7.1.DoVi.X265-PuTao", + "subtitle": "", + "target": { + "type": "电影", + "cn_name": "", + "en_name": "A Quiet Place Part Ii", + "year": "2020", + "part": "", + "season": "", + "episode": "", + "restype": "BluRay DoVi UHD", + "pix": "1080p", + "video_codec": "X265", + "audio_codec": "DD 7.1" + } +}, { + "title": "Childhood.In.A.Capsule.S01E16.2022.1080p.KKTV.WEB-DL.X264.AAC-ADWeb.mkv", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "", + "en_name": "Childhood In A Capsule", + "year": "2022", + "part": "", + "season": "S01", + "episode": "E16", + "restype": "WEB-DL", + "pix": "1080p", + "video_codec": "X264", + "audio_codec": "AAC" + } +}, { + "title": "[桜都字幕组] 异世界归来的舅舅 / Isekai Ojisan [01][1080p][简体内嵌]", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "", + "en_name": "Isekai Ojisan", + "year": "", + "part": "", + "season": "S01", + "episode": "E01", + "restype": "", + "pix": "1080p", + "video_codec": "", + "audio_codec": "" + } +}, { + "title": "【喵萌奶茶屋】★04月新番★[夏日重現/Summer Time Rendering][15][720p][繁日雙語][招募翻譯片源]", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "", + "en_name": "Summer Time Rendering", + "year": "", + "part": "", + "season": "S01", + "episode": "E15", + "restype": "", + "pix": "720p", + "video_codec": "", + "audio_codec": "" + } +}, { + "title": "[NC-Raws] 打工吧!魔王大人 第二季 / Hataraku Maou-sama!! - 02 (B-Global 1920x1080 HEVC AAC MKV)", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "", + "en_name": "Hataraku Maou-Sama!!", + "year": "", + "part": "", + "season": "S02", + "episode": "E02", + "restype": "", + "pix": "1080p", + "video_codec": "HEVC", + "audio_codec": "AAC" + } +}, { + "title": "The Witch Part 2 The Other One 2022 1080p WEB-DL AAC5.1 H.264-tG1R0", + "subtitle": "", + "target": { + "type": "电影", + "cn_name": "", + "en_name": "The Witch Part 2 The Other One", + "year": "2022", + "part": "", + "season": "", + "episode": "", + "restype": "WEB-DL", + "pix": "1080p", + "video_codec": "H264", + "audio_codec": "AAC 5.1" + } +}, { + "title": "The 355 2022 BluRay 1080p DTS-HD MA5.1 X265.10bit-BeiTai", + "subtitle": "", + "target": { + "type": "电影", + "cn_name": "", + "en_name": "The 355", + "year": "2022", + "part": "", + "season": "", + "episode": "", + "restype": "BluRay", + "pix": "1080p", + "video_codec": "X265 10bit", + "audio_codec": "DTS-HD MA 5.1" + } +}, { + "title": "Sense8 s01-s02 2015-2017 1080P WEB-DL X265 AC3£cXcY@FRDS", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "", + "en_name": "Sense8", + "year": "2015", + "part": "", + "season": "S01-S02", + "episode": "", + "restype": "WEB-DL", + "pix": "1080p", + "video_codec": "X265", + "audio_codec": "" + } +}, { + "title": "The Heart of Genius S01 13-14 2022 1080p WEB-DL H264 AAC", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "", + "en_name": "The Heart Of Genius", + "year": "2022", + "part": "", + "season": "S01", + "episode": "E13-E14", + "restype": "WEB-DL", + "pix": "1080p", + "video_codec": "H264", + "audio_codec": "AAC" + } +}, { + "title": "The Heart of Genius E13-14 2022 1080p WEB-DL H264 AAC", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "", + "en_name": "The Heart Of Genius", + "year": "2022", + "part": "", + "season": "S01", + "episode": "E13-E14", + "restype": "WEB-DL", + "pix": "1080p", + "video_codec": "H264", + "audio_codec": "AAC" + } +}, { + "title": "2022.8.2.Twelve.Monkeys.1995.GBR.4K.REMASTERED.BluRay.1080p.X264.DTS [3.4 GB]", + "subtitle": "", + "target": { + "type": "电影", + "cn_name": "", + "en_name": "Twelve Monkeys", + "year": "1995", + "part": "", + "season": "", + "episode": "", + "restype": "BluRay", + "pix": "4k", + "video_codec": "X264", + "audio_codec": "DTS" + } +}, { + "title": "[NC-Raws] 王者天下 第四季 - 17 (Baha 1920x1080 AVC AAC MP4) [3B1AA7BB].mp4", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "王者天下", + "en_name": "", + "year": "", + "part": "", + "season": "S04", + "episode": "E17", + "restype": "", + "pix": "1080p", + "video_codec": "AVC", + "audio_codec": "AAC" + } +}, { + "title": "Sense8 S2E1 2015-2017 1080P WEB-DL X265 AC3£cXcY@FRDS", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "", + "en_name": "Sense8", + "year": "2015", + "part": "", + "season": "S02", + "episode": "E01", + "restype": "WEB-DL", + "pix": "1080p", + "video_codec": "X265", + "audio_codec": "" + } +}, { + "title": "[xyx98]传颂之物/Utawarerumono/うたわれるもの[BDrip][1920x1080][TV 01-26 Fin][hevc-yuv420p10 flac_ac3][ENG PGS]", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "", + "en_name": "うたわれるもの", + "year": "", + "part": "", + "season": "S01", + "episode": "E01-E26", + "restype": "", + "pix": "1080p", + "video_codec": "", + "audio_codec": "flac" + } +}, { + "title": "[云歌字幕组][7月新番][欢迎来到实力至上主义的教室 第二季][01][X264 10bit][1080p][简体中文].mp4", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "欢迎来到实力至上主义的教室", + "en_name": "", + "year": "", + "part": "", + "season": "S02", + "episode": "E01", + "restype": "", + "pix": "1080p", + "video_codec": "X264", + "audio_codec": "" + } +}, { + "title": "[诛仙][Jade Dynasty][2022][WEB-DL][2160][TV Series][TV 04][LeagueWEB]", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "", + "en_name": "Jade Dynasty", + "year": "2022", + "part": "", + "season": "S01", + "episode": "E04", + "restype": "", + "pix": "", + "video_codec": "", + "audio_codec": "" + } +}, { + "title": "Rick and Morty.S06E06.JuRicksic.Mort.1080p.HMAX.WEBRip.DD5.1.X264-NTb[rartv]", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "", + "en_name": "Rick And Morty", + "year": "", + "part": "", + "season": "S06", + "episode": "E06", + "restype": "WEBRip", + "pix": "1080p", + "video_codec": "X264", + "audio_codec": "DD 5.1" + } +}, { + "title": "rick and Morty.S06E05.JuRicksic.Mort.1080p.HMAX.WEBRip.DD5.1.X264-NTb[rartv]", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "", + "en_name": "Rick And Morty", + "year": "", + "part": "", + "season": "S06", + "episode": "E05", + "restype": "WEBRip", + "pix": "1080p", + "video_codec": "X264", + "audio_codec": "DD 5.1" + } +}] diff --git a/tests/run.py b/tests/run.py new file mode 100644 index 00000000..4e0d2ef1 --- /dev/null +++ b/tests/run.py @@ -0,0 +1,12 @@ +import unittest + +from tests.test_metainfo import MetaInfoTest + +if __name__ == '__main__': + suite = unittest.TestSuite() + # 测试名称识别 + suite.addTest(MetaInfoTest('test_metainfo')) + + # 运行测试 + runner = unittest.TextTestRunner() + runner.run(suite) diff --git a/tests/test_metainfo.py b/tests/test_metainfo.py new file mode 100644 index 00000000..5c198648 --- /dev/null +++ b/tests/test_metainfo.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- + +from unittest import TestCase + +from app.core import MetaInfo +from tests.cases.meta import meta_cases + + +class MetaInfoTest(TestCase): + def setUp(self) -> None: + pass + + def tearDown(self) -> None: + pass + + def test_metainfo(self): + for info in meta_cases: + if not info.get("title"): + continue + meta_info = MetaInfo(title=info.get("title"), subtitle=info.get("subtitle")) + target = { + "type": meta_info.type.value, + "cn_name": meta_info.cn_name or "", + "en_name": meta_info.en_name or "", + "year": meta_info.year or "", + "part": meta_info.part or "", + "season": meta_info.get_season_string(), + "episode": meta_info.get_episode_string(), + "restype": meta_info.get_edtion_string(), + "pix": meta_info.resource_pix or "", + "video_codec": meta_info.video_encode or "", + "audio_codec": meta_info.audio_encode or "" + } + self.assertEqual(target, info.get("target")) diff --git a/version.py b/version.py new file mode 100644 index 00000000..17eff8e0 --- /dev/null +++ b/version.py @@ -0,0 +1 @@ +APP_VERSION = "1.0.0"